commit 59cd2c19d1333fda8035f3ccfee8b765996a430e Author: maticarmy Date: Mon Feb 10 10:39:00 2025 +0800 初始化提交 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2a609e1 --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +# 数据配置 +DB_TYPE=sqlite +DB_MYSQL_HOST=thinkadmin.top +DB_MYSQL_PORT=3306 +DB_MYSQL_PREFIX= +DB_MYSQL_USERNAME=root +DB_MYSQL_DATABASE=admin +DB_MYSQL_CHARSET=utf8mb4 +DB_MYSQL_PASSWORD= + +# 缓存配置 +CACHE_TYPE=file +CACHE_REDIS_HOST=127.0.0.1 +CACHE_REDIS_PORT=6379 +CACHE_REDIS_SELECT= +CACHE_REDIS_PASSWORD= + +# 会话配置 +SESSION_TYPE=file +SESSION_NAME=ssid +SESSION_STORE= +SESSION_EXPIRE=7200 +SESSION_PREFIX= \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fc8b101 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.js linguist-language=php +*.css linguist-language=php +*.html linguist-language=php \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8369816 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +.env +.git +.svn +.idea +.fleet +.vscode +.DS_Store + +/vendor +/runtime +/safefile +/nbproject +/composer.lock +!composer.json + +/404.html +/.user.ini +/index.html +/public/upload +/public/404.html +/public/.user.ini +/public/index.html +/public/favicon.ico +/database/sqlite.db + +/public/static/theme/css/_*.css* +/public/static/theme/css/node_modules +/public/static/theme/css/package-lock.json + +### 屏蔽数据库脚本 +/database/migrations/*_install_*.php +/database/migrations/*_upgrade_*.php +!database/migrations/*_install*_table.php +!database/migrations/*_install_package.php diff --git a/003cursorapiadmin.zip b/003cursorapiadmin.zip new file mode 100644 index 0000000..5b5ea96 Binary files /dev/null and b/003cursorapiadmin.zip differ diff --git a/app/admin/Service.php b/app/admin/Service.php new file mode 100644 index 0000000..9004bee --- /dev/null +++ b/app/admin/Service.php @@ -0,0 +1,69 @@ + '系统配置', + 'subs' => [ + ['name' => '系统参数配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'admin/config/index'], + ['name' => '系统任务管理', 'icon' => 'layui-icon layui-icon-log', 'node' => 'admin/queue/index'], + ['name' => '系统日志管理', 'icon' => 'layui-icon layui-icon-form', 'node' => 'admin/oplog/index'], + ['name' => '数据字典管理', 'icon' => 'layui-icon layui-icon-code-circle', 'node' => 'admin/base/index'], + ['name' => '系统文件管理', 'icon' => 'layui-icon layui-icon-carousel', 'node' => 'admin/file/index'], + ['name' => '系统菜单管理', 'icon' => 'layui-icon layui-icon-layouts', 'node' => 'admin/menu/index'], + ], + ], + [ + 'name' => '权限管理', + 'subs' => [ + ['name' => '系统权限管理', 'icon' => 'layui-icon layui-icon-vercode', 'node' => 'admin/auth/index'], + ['name' => '系统用户管理', 'icon' => 'layui-icon layui-icon-username', 'node' => 'admin/user/index'], + ], + ], + ]; + } +} \ No newline at end of file diff --git a/app/admin/controller/Auth.php b/app/admin/controller/Auth.php new file mode 100644 index 0000000..9032b42 --- /dev/null +++ b/app/admin/controller/Auth.php @@ -0,0 +1,134 @@ +layTable(function () { + $this->title = '系统权限管理'; + }, static function (QueryHelper $query) { + $query->like('title,desc')->equal('status,utype')->dateBetween('create_at'); + }); + } + + /** + * 修改权限状态 + * @auth true + */ + public function state() + { + SystemAuth::mSave($this->_vali([ + 'status.in:0,1' => '状态值范围异常!', + 'status.require' => '状态值不能为空!', + ])); + } + + /** + * 删除系统权限 + * @auth true + */ + public function remove() + { + SystemAuth::mDelete(); + } + + + /** + * 添加系统权限 + * @auth true + */ + public function add() + { + SystemAuth::mForm('form'); + } + + /** + * 编辑系统权限 + * @auth true + */ + public function edit() + { + SystemAuth::mForm('form'); + } + + /** + * 表单后置数据处理 + * @param array $data + */ + protected function _form_filter(array $data) + { + if ($this->request->isGet()) { + $this->title = empty($data['title']) ? "添加访问授权" : "编辑【{$data['title']}】授权"; + } elseif ($this->request->post('action') === 'json') { + if ($this->app->isDebug()) AdminService::clear(); + $ztree = AdminService::getTree(empty($data['id']) ? [] : SystemNode::mk()->where(['auth' => $data['id']])->column('node')); + usort($ztree, static function ($a, $b) { + if (explode('-', $a['node'])[0] !== explode('-', $b['node'])[0]) { + if (stripos($a['node'], 'plugin-') === 0) return 1; + } + return $a['node'] === $b['node'] ? 0 : ($a['node'] > $b['node'] ? 1 : -1); + }); + [$ps, $cs] = [Plugin::get(), (array)$this->app->config->get('app.app_names', [])]; + foreach ($ztree as &$n) $n['title'] = lang($cs[$n['node']] ?? (($ps[$n['node']] ?? [])['name'] ?? $n['title'])); + $this->success('获取权限节点成功!', $ztree); + } elseif (empty($data['nodes'])) { + $this->error('未配置功能节点!'); + } + } + + /** + * 节点更新处理 + * @param boolean $state + * @param array $post + * @return void + */ + protected function _form_result(bool $state, array $post) + { + if ($state && $this->request->post('action') === 'save') { + [$map, $data] = [['auth' => $post['id']], []]; + foreach ($post['nodes'] ?? [] as $node) $data[] = $map + ['node' => $node]; + SystemNode::mk()->where($map)->delete(); + count($data) > 0 && SystemNode::mk()->insertAll($data); + sysoplog('系统权限管理', "配置系统权限[{$map['auth']}]授权成功"); + $this->success('权限修改成功!', 'javascript:history.back()'); + } + } +} diff --git a/app/admin/controller/Base.php b/app/admin/controller/Base.php new file mode 100644 index 0000000..1a4a528 --- /dev/null +++ b/app/admin/controller/Base.php @@ -0,0 +1,113 @@ +layTable(function () { + $this->title = '数据字典管理'; + $this->types = SystemBase::types(); + $this->type = $this->get['type'] ?? ($this->types[0] ?? '-'); + }, static function (QueryHelper $query) { + $query->where(['deleted' => 0])->equal('type'); + $query->like('code,name,status')->dateBetween('create_at'); + }); + } + + /** + * 添加数据字典 + * @auth true + */ + public function add() + { + SystemBase::mForm('form'); + } + + /** + * 编辑数据字典 + * @auth true + */ + public function edit() + { + SystemBase::mForm('form'); + } + + /** + * 表单数据处理 + * @param array $data + * @throws \think\db\exception\DbException + */ + protected function _form_filter(array &$data) + { + if ($this->request->isGet()) { + $this->types = SystemBase::types(); + $this->types[] = '--- ' . lang('新增类型') . ' ---'; + $this->type = $this->get['type'] ?? ($this->types[0] ?? '-'); + } else { + $map = []; + $map[] = ['deleted', '=', 0]; + $map[] = ['code', '=', $data['code']]; + $map[] = ['type', '=', $data['type']]; + $map[] = ['id', '<>', $data['id'] ?? 0]; + if (SystemBase::mk()->where($map)->count() > 0) { + $this->error("数据编码已经存在!"); + } + } + } + + /** + * 修改数据状态 + * @auth true + */ + public function state() + { + SystemBase::mSave($this->_vali([ + 'status.in:0,1' => '状态值范围异常!', + 'status.require' => '状态值不能为空!', + ])); + } + + /** + * 删除数据记录 + * @auth true + */ + public function remove() + { + SystemBase::mDelete(); + } +} \ No newline at end of file diff --git a/app/admin/controller/Config.php b/app/admin/controller/Config.php new file mode 100644 index 0000000..6e16967 --- /dev/null +++ b/app/admin/controller/Config.php @@ -0,0 +1,146 @@ + '默认色0', + 'white' => '简约白0', + 'red-1' => '玫瑰红1', + 'blue-1' => '深空蓝1', + 'green-1' => '小草绿1', + 'black-1' => '经典黑1', + 'red-2' => '玫瑰红2', + 'blue-2' => '深空蓝2', + 'green-2' => '小草绿2', + 'black-2' => '经典黑2', + ]; + + /** + * 系统参数配置 + * @auth true + * @menu true + */ + public function index() + { + $this->title = '系统参数配置'; + $this->files = Storage::types(); + $this->plugins = Plugin::get(null, true); + $this->issuper = AdminService::isSuper(); + $this->systemid = ModuleService::getRunVar('uni'); + $this->framework = ModuleService::getLibrarys('topthink/framework'); + $this->thinkadmin = ModuleService::getLibrarys('zoujingli/think-library'); + if (AdminService::isSuper() && $this->app->session->get('user.password') === md5('admin')) { + $url = url('admin/index/pass', ['id' => AdminService::getUserId()]); + $this->showErrorMessage = lang("超级管理员账号的密码未修改,建议立即修改密码!", [$url]); + } + uasort($this->plugins, static function ($a, $b) { + if ($a['space'] === $b['space']) return 0; + return $a['space'] > $b['space'] ? 1 : -1; + }); + $this->fetch(); + } + + /** + * 修改系统参数 + * @auth true + * @throws \think\admin\Exception + */ + public function system() + { + if ($this->request->isGet()) { + $this->title = '修改系统参数'; + $this->themes = static::themes; + $this->fetch(); + } else { + $post = $this->request->post(); + // 修改网站后台入口路径 + if (!empty($post['xpath'])) { + if (!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $post['xpath'])) { + $this->error('后台入口格式错误!'); + } + if ($post['xpath'] !== 'admin') { + if (is_dir(syspath("app/{$post['xpath']}")) || !empty(Plugin::get($post['xpath']))) { + $this->error(lang('已存在 %s 应用!', [$post['xpath']])); + } + } + RuntimeService::set(null, [$post['xpath'] => 'admin']); + } + // 修改网站 ICON 图标,替换 public/favicon.ico + if (preg_match('#^https?://#', $post['site_icon'] ?? '')) try { + SystemService::setFavicon($post['site_icon'] ?? ''); + } catch (\Exception $exception) { + trace_file($exception); + } + // 数据数据到系统配置表 + foreach ($post as $k => $v) sysconf($k, $v); + sysoplog('系统配置管理', "修改系统参数成功"); + $this->success('数据保存成功!', admuri('admin/config/index')); + } + } + + /** + * 修改文件存储 + * @auth true + * @throws \think\admin\Exception + */ + public function storage() + { + $this->_applyFormToken(); + if ($this->request->isGet()) { + $this->type = input('type', 'local'); + if ($this->type === 'alioss') { + $this->points = AliossStorage::region(); + } elseif ($this->type === 'qiniu') { + $this->points = QiniuStorage::region(); + } elseif ($this->type === 'txcos') { + $this->points = TxcosStorage::region(); + } + $this->fetch("storage-{$this->type}"); + } else { + $post = $this->request->post(); + if (!empty($post['storage']['allow_exts'])) { + $deny = ['sh', 'asp', 'bat', 'cmd', 'exe', 'php']; + $exts = array_unique(str2arr(strtolower($post['storage']['allow_exts']))); + if (count(array_intersect($deny, $exts)) > 0) $this->error('禁止上传可执行的文件!'); + $post['storage']['allow_exts'] = join(',', $exts); + } + foreach ($post as $name => $value) sysconf($name, $value); + sysoplog('系统配置管理', "修改系统存储参数"); + $this->success('修改文件存储成功!'); + } + } +} \ No newline at end of file diff --git a/app/admin/controller/File.php b/app/admin/controller/File.php new file mode 100644 index 0000000..30331ef --- /dev/null +++ b/app/admin/controller/File.php @@ -0,0 +1,118 @@ +types = Storage::types(); + } + + /** + * 系统文件管理 + * @auth true + * @menu true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function index() + { + SystemFile::mQuery()->layTable(function () { + $this->title = '系统文件管理'; + $this->xexts = SystemFile::mk()->distinct()->column('xext'); + }, static function (QueryHelper $query) { + $query->like('name,hash,xext')->equal('type')->dateBetween('create_at'); + $query->where(['issafe' => 0, 'status' => 2, 'uuid' => AdminService::getUserId()]); + }); + } + + /** + * 数据列表处理 + * @param array $data + * @return void + */ + protected function _page_filter(array &$data) + { + foreach ($data as &$vo) { + $vo['ctype'] = $this->types[$vo['type']] ?? $vo['type']; + } + } + + /** + * 编辑系统文件 + * @auth true + * @return void + */ + public function edit() + { + SystemFile::mForm('form'); + } + + /** + * 删除系统文件 + * @auth true + * @return void + */ + public function remove() + { + if (!AdminService::isSuper()) { + $where = ['uuid' => AdminService::getUserId()]; + } + SystemFile::mDelete('', $where ?? []); + } + + /** + * 清理重复文件 + * @auth true + * @return void + * @throws \think\db\exception\DbException + */ + public function distinct() + { + $map = ['uuid' => AdminService::getUserId()]; + $db1 = SystemFile::mk()->fieldRaw('max(id) id')->where($map)->group('type,xkey'); + $db2 = $this->app->db->table($db1->buildSql())->alias('dt')->field('id'); + SystemFile::mk()->whereRaw("id not in {$db2->buildSql()}")->delete(); + SystemFile::mk()->where($map)->where(['status' => 1])->delete(); + $this->success('清理重复文件成功!'); + } +} \ No newline at end of file diff --git a/app/admin/controller/Index.php b/app/admin/controller/Index.php new file mode 100644 index 0000000..f512789 --- /dev/null +++ b/app/admin/controller/Index.php @@ -0,0 +1,157 @@ +app->isDebug()); + /*! 读取当前用户权限菜单树 */ + $this->menus = MenuService::getTree(); + /*! 判断当前用户的登录状态 */ + $this->login = AdminService::isLogin(); + /*! 菜单为空且未登录跳转到登录页 */ + if (empty($this->menus) && empty($this->login)) { + $this->redirect(sysuri('admin/login/index')); + } else { + $this->title = '系统管理后台'; + $this->super = AdminService::isSuper(); + $this->theme = AdminService::getUserTheme(); + $this->fetch(); + } + } + + /** + * 后台主题切换 + * @login true + * @return void + * @throws \think\admin\Exception + */ + public function theme() + { + if ($this->request->isGet()) { + $this->theme = AdminService::getUserTheme(); + $this->themes = Config::themes; + $this->fetch(); + } else { + $data = $this->_vali(['site_theme.require' => '主题名称不能为空!']); + if (AdminService::setUserTheme($data['site_theme'])) { + $this->success('主题配置保存成功!'); + } else { + $this->error('主题配置保存失败!'); + } + } + } + + /** + * 修改用户资料 + * @login true + * @param mixed $id 用户ID + */ + public function info($id = 0) + { + $this->_applyFormToken(); + if (AdminService::getUserId() === intval($id)) { + SystemUser::mForm('user/form', 'id', [], ['id' => $id]); + } else { + $this->error('只能修改自己的资料!'); + } + } + + /** + * 资料修改表单处理 + * @param array $data + */ + protected function _info_form_filter(array &$data) + { + if ($this->request->isPost()) { + unset($data['username'], $data['authorize']); + } + } + + /** + * 资料修改结果处理 + * @param bool $status + */ + protected function _info_form_result(bool $status) + { + if ($status) { + $this->success('用户资料修改成功!', 'javascript:location.reload()'); + } + } + + /** + * 修改当前用户密码 + * @login true + * @param mixed $id + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function pass($id = 0) + { + $this->_applyFormToken(); + if (AdminService::getUserId() !== intval($id)) { + $this->error('禁止修改他人密码!'); + } + if ($this->app->request->isGet()) { + $this->verify = true; + SystemUser::mForm('user/pass', 'id', [], ['id' => $id]); + } else { + $data = $this->_vali([ + 'password.require' => '登录密码不能为空!', + 'repassword.require' => '重复密码不能为空!', + 'oldpassword.require' => '旧的密码不能为空!', + 'password.confirm:repassword' => '两次输入的密码不一致!', + ]); + $user = SystemUser::mk()->find($id); + if (empty($user)) $this->error('用户不存在!'); + if (md5($data['oldpassword']) !== $user['password']) { + $this->error('旧密码验证失败,请重新输入!'); + } + if ($user->save(['password' => md5($data['password'])])) { + sysoplog('系统用户管理', "修改用户[{$user['id']}]密码成功"); + // 修改密码同步事件处理 + $this->app->event->trigger('PluginAdminChangePassword', [ + 'uuid' => intval($user['id']), 'pass' => $data['password'] + ]); + $this->success('密码修改成功,下次请使用新密码登录!', ''); + } else { + $this->error('密码修改失败,请稍候再试!'); + } + } + } +} diff --git a/app/admin/controller/Login.php b/app/admin/controller/Login.php new file mode 100644 index 0000000..22de348 --- /dev/null +++ b/app/admin/controller/Login.php @@ -0,0 +1,137 @@ +app->request->isGet()) { + if (AdminService::isLogin()) { + $this->redirect(sysuri('admin/index/index')); + } else { + // 加载登录模板 + $this->title = '系统登录'; + // 登录验证令牌 + $this->captchaType = 'LoginCaptcha'; + $this->captchaToken = CodeExtend::uuid(); + // 当前运行模式 + $this->runtimeMode = RuntimeService::check(); + // 后台背景处理 + $images = str2arr(sysconf('login_image|raw') ?: '', '|'); + if (empty($images)) $images = [ + SystemService::uri('/static/theme/img/login/bg1.jpg'), + SystemService::uri('/static/theme/img/login/bg2.jpg'), + ]; + $this->loginStyle = sprintf('style="background-image:url(%s)" data-bg-transition="%s"', $images[0], join(',', $images)); + // 更新后台主域名,用于部分无法获取域名的场景调用 + if ($this->request->domain() !== sysconf('base.site_host|raw')) { + sysconf('base.site_host', $this->request->domain()); + } + $this->fetch(); + } + } else { + $data = $this->_vali([ + 'username.require' => '登录账号不能为空!', + 'username.min:4' => '账号不能少于4位字符!', + 'password.require' => '登录密码不能为空!', + 'password.min:4' => '密码不能少于4位字符!', + 'verify.require' => '图形验证码不能为空!', + 'uniqid.require' => '图形验证标识不能为空!', + ]); + if (!CaptchaService::instance()->check($data['verify'], $data['uniqid'])) { + $this->error('图形验证码验证失败,请重新输入!'); + } + /*! 用户信息验证 */ + $map = ['username' => $data['username'], 'is_deleted' => 0]; + $user = SystemUser::mk()->where($map)->findOrEmpty(); + if ($user->isEmpty()) { + $this->app->session->set('LoginInputSessionError', true); + $this->error('登录账号或密码错误,请重新输入!'); + } + if (empty($user['status'])) { + $this->app->session->set('LoginInputSessionError', true); + $this->error('账号已经被禁用,请联系管理员!'); + } + if (md5("{$user['password']}{$data['uniqid']}") !== $data['password']) { + $this->app->session->set('LoginInputSessionError', true); + $this->error('登录账号或密码错误,请重新输入!'); + } + $user->hidden(['sort', 'status', 'password', 'is_deleted']); + $this->app->session->set('user', $user->toArray()); + $this->app->session->delete('LoginInputSessionError'); + // 更新登录次数 + $user->where(['id' => $user->getAttr('id')])->inc('login_num')->update([ + 'login_at' => date('Y-m-d H:i:s'), 'login_ip' => $this->app->request->ip(), + ]); + // 刷新用户权限 + AdminService::apply(true); + sysoplog('系统用户登录', '登录系统后台成功'); + $this->success('登录成功', sysuri('admin/index/index')); + } + } + + /** + * 生成验证码 + * @return void + */ + public function captcha() + { + $input = $this->_vali([ + 'type.require' => '类型不能为空!', + 'token.require' => '标识不能为空!', + ]); + $image = CaptchaService::instance()->initialize(); + $captcha = ['image' => $image->getData(), 'uniqid' => $image->getUniqid()]; + // 未发生异常时,直接返回验证码内容 + if (!$this->app->session->get('LoginInputSessionError')) { + $captcha['code'] = $image->getCode(); + } + $this->success('生成验证码成功', $captcha); + } + + /** + * 退出登录 + * @return void + */ + public function out() + { + $this->app->session->destroy(); + $this->success('退出登录成功!', sysuri('admin/login/index')); + } +} diff --git a/app/admin/controller/Menu.php b/app/admin/controller/Menu.php new file mode 100644 index 0000000..90ba46c --- /dev/null +++ b/app/admin/controller/Menu.php @@ -0,0 +1,147 @@ +title = '系统菜单管理'; + $this->type = $this->get['type'] ?? 'index'; + SystemMenu::mQuery()->layTable(); + } + + /** + * 列表数据处理 + * @param array $data + */ + protected function _index_page_filter(array &$data) + { + $data = DataExtend::arr2tree($data); + // 回收站过滤有效菜单 + if ($this->type === 'recycle') foreach ($data as $k1 => &$p1) { + if (!empty($p1['sub'])) foreach ($p1['sub'] as $k2 => &$p2) { + if (!empty($p2['sub'])) foreach ($p2['sub'] as $k3 => $p3) { + if ($p3['status'] > 0) unset($p2['sub'][$k3]); + } + if (empty($p2['sub']) && ($p2['url'] === '#' or $p2['status'] > 0)) unset($p1['sub'][$k2]); + } + if (empty($p1['sub']) && ($p1['url'] === '#' or $p1['status'] > 0)) unset($data[$k1]); + } + // 菜单数据树数据变平化 + $data = DataExtend::arr2table($data); + foreach ($data as &$vo) { + if ($vo['url'] !== '#' && !preg_match('/^(https?:)?(\/\/|\\\\)/i', $vo['url'])) { + $vo['url'] = trim(url($vo['url']) . ($vo['params'] ? "?{$vo['params']}" : ''), '\\/'); + } + } + } + + /** + * 添加系统菜单 + * @auth true + */ + public function add() + { + $this->_applyFormToken(); + SystemMenu::mForm('form'); + } + + /** + * 编辑系统菜单 + * @auth true + */ + public function edit() + { + $this->_applyFormToken(); + SystemMenu::mForm('form'); + } + + /** + * 表单数据处理 + * @param array $vo + */ + protected function _form_filter(array &$vo) + { + if ($this->request->isGet()) { + $debug = $this->app->isDebug(); + /* 清理权限节点 */ + $debug && AdminService::clear(); + /* 读取系统功能节点 */ + $this->auths = []; + $this->nodes = MenuService::getList($debug); + foreach (NodeService::getMethods($debug) as $node => $item) { + if ($item['isauth'] && substr_count($node, '/') >= 2) { + $this->auths[] = ['node' => $node, 'title' => $item['title']]; + } + } + /* 选择自己上级菜单 */ + $vo['pid'] = $vo['pid'] ?? input('pid', '0'); + /* 列出可选上级菜单 */ + $menus = SystemMenu::mk()->order('sort desc,id asc')->column('id,pid,icon,url,node,title,params', 'id'); + $this->menus = DataExtend::arr2table(array_merge($menus, [['id' => '0', 'pid' => '-1', 'url' => '#', 'title' => '顶部菜单']])); + if (isset($vo['id'])) foreach ($this->menus as $menu) if ($menu['id'] === $vo['id']) $vo = $menu; + foreach ($this->menus as $key => $menu) if ($menu['spt'] >= 3 || $menu['url'] !== '#') unset($this->menus[$key]); + if (isset($vo['spt']) && isset($vo['spc']) && in_array($vo['spt'], [1, 2]) && $vo['spc'] > 0) { + foreach ($this->menus as $key => $menu) if ($vo['spt'] <= $menu['spt']) unset($this->menus[$key]); + } + } + } + + /** + * 修改菜单状态 + * @auth true + */ + public function state() + { + SystemMenu::mSave($this->_vali([ + 'status.in:0,1' => '状态值范围异常!', + 'status.require' => '状态值不能为空!', + ])); + } + + /** + * 删除系统菜单 + * @auth true + */ + public function remove() + { + SystemMenu::mDelete(); + } +} diff --git a/app/admin/controller/Oplog.php b/app/admin/controller/Oplog.php new file mode 100644 index 0000000..60f74d2 --- /dev/null +++ b/app/admin/controller/Oplog.php @@ -0,0 +1,95 @@ +layTable(function () { + $this->title = '系统日志管理'; + $columns = SystemOplog::mk()->column('action,username', 'id'); + $this->users = array_unique(array_column($columns, 'username')); + $this->actions = array_unique(array_column($columns, 'action')); + }, static function (QueryHelper $query) { + $query->dateBetween('create_at')->equal('username,action')->like('content,geoip,node'); + }); + } + + /** + * 列表数据处理 + * @param array $data + * @throws \Exception + */ + protected function _index_page_filter(array &$data) + { + $region = new Ip2Region(); + foreach ($data as &$vo) try { + $vo['geoisp'] = $region->simple($vo['geoip']); + } catch (\Exception $exception) { + $vo['geoip'] = $exception->getMessage(); + } + } + + /** + * 清理系统日志 + * @auth true + */ + public function clear() + { + try { + SystemOplog::mQuery()->empty(); + sysoplog('系统运维管理', '成功清理所有日志'); + $this->success('日志清理成功!'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error(lang("日志清理失败,%s", [$exception->getMessage()])); + } + } + + /** + * 删除系统日志 + * @auth true + */ + public function remove() + { + SystemOplog::mDelete(); + } +} diff --git a/app/admin/controller/Queue.php b/app/admin/controller/Queue.php new file mode 100644 index 0000000..59dab18 --- /dev/null +++ b/app/admin/controller/Queue.php @@ -0,0 +1,117 @@ +layTable(function () { + $this->title = '系统任务管理'; + $this->iswin = ProcessService::iswin(); + if ($this->super = AdminService::isSuper()) { + $this->command = ProcessService::think('xadmin:queue start'); + if (!$this->iswin && !empty($_SERVER['USER'])) { + $this->command = "sudo -u {$_SERVER['USER']} {$this->command}"; + } + } + }, static function (QueryHelper $query) { + $query->equal('status')->like('code|title#title,command'); + $query->timeBetween('enter_time,exec_time')->dateBetween('create_at'); + }); + } + + /** + * 分页数据回调处理 + * @param array $data + * @param array $result + * @return void + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + protected function _index_page_filter(array $data, array &$result) + { + $result['extra'] = ['dos' => 0, 'pre' => 0, 'oks' => 0, 'ers' => 0]; + SystemQueue::mk()->field('status,count(1) count')->group('status')->select()->map(static function ($item) use (&$result) { + if (intval($item['status']) === 1) $result['extra']['pre'] = $item['count']; + if (intval($item['status']) === 2) $result['extra']['dos'] = $item['count']; + if (intval($item['status']) === 3) $result['extra']['oks'] = $item['count']; + if (intval($item['status']) === 4) $result['extra']['ers'] = $item['count']; + }); + } + + /** + * 重启系统任务 + * @auth true + */ + public function redo() + { + try { + $data = $this->_vali(['code.require' => '任务编号不能为空!']); + $queue = QueueService::instance()->initialize($data['code'])->reset(); + $queue->progress(1, '>>> 任务重置成功 <<<', '0.00'); + $this->success('任务重置成功!', $queue->code); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } + } + + /** + * 清理运行数据 + * @auth true + */ + public function clean() + { + $this->_queue('定时清理系统运行数据', "xadmin:queue clean", 0, [], 0, 3600); + } + + /** + * 删除系统任务 + * @auth true + */ + public function remove() + { + SystemQueue::mDelete(); + } +} diff --git a/app/admin/controller/User.php b/app/admin/controller/User.php new file mode 100644 index 0000000..527ec06 --- /dev/null +++ b/app/admin/controller/User.php @@ -0,0 +1,182 @@ +type = $this->get['type'] ?? 'index'; + SystemUser::mQuery()->layTable(function () { + $this->title = '系统用户管理'; + $this->bases = SystemBase::items('身份权限'); + }, function (QueryHelper $query) { + + // 加载对应数据列表 + $query->where(['is_deleted' => 0, 'status' => intval($this->type === 'index')]); + + // 关联用户身份资料 + /** @var \think\model\Relation|\think\db\Query $query */ + $query->with(['userinfo' => static function ($query) { + $query->field('code,name,content'); + }]); + + // 数据列表搜索过滤 + $query->equal('status,usertype')->dateBetween('login_at,create_at'); + $query->like('username|nickname#username,contact_phone#phone,contact_mail#mail'); + }); + } + + /** + * 添加系统用户 + * @auth true + */ + public function add() + { + SystemUser::mForm('form'); + } + + /** + * 编辑系统用户 + * @auth true + */ + public function edit() + { + SystemUser::mForm('form'); + } + + /** + * 修改用户密码 + * @auth true + */ + public function pass() + { + $this->_applyFormToken(); + if ($this->request->isGet()) { + $this->verify = false; + SystemUser::mForm('pass'); + } else { + $data = $this->_vali([ + 'id.require' => '用户ID不能为空!', + 'password.require' => '登录密码不能为空!', + 'repassword.require' => '重复密码不能为空!', + 'repassword.confirm:password' => '两次输入的密码不一致!', + ]); + $user = SystemUser::mk()->findOrEmpty($data['id']); + if ($user->isExists() && $user->save(['password' => md5($data['password'])])) { + // 修改密码同步事件处理 + $this->app->event->trigger('PluginAdminChangePassword', [ + 'uuid' => $data['id'], 'pass' => $data['password'] + ]); + sysoplog('系统用户管理', "修改用户[{$data['id']}]密码成功"); + $this->success('密码修改成功,请使用新密码登录!', ''); + } else { + $this->error('密码修改失败,请稍候再试!'); + } + } + } + + /** + * 表单数据处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + protected function _form_filter(array &$data) + { + if ($this->request->isPost()) { + // 检查资料是否完整 + empty($data['username']) && $this->error('登录账号不能为空!'); + if ($data['username'] !== AdminService::getSuperName()) { + empty($data['authorize']) && $this->error('未配置权限!'); + } + // 处理上传的权限格式 + $data['authorize'] = arr2str($data['authorize'] ?? []); + if (empty($data['id'])) { + // 检查账号是否重复 + $map = ['username' => $data['username'], 'is_deleted' => 0]; + if (SystemUser::mk()->where($map)->count() > 0) { + $this->error("账号已经存在,请使用其它账号!"); + } + // 新添加的用户密码与账号相同 + $data['password'] = md5($data['username']); + } else { + unset($data['username']); + } + } else { + // 权限绑定处理 + $data['authorize'] = str2arr($data['authorize'] ?? ''); + $this->auths = SystemAuth::items(); + $this->bases = SystemBase::items('身份权限'); + $this->super = AdminService::getSuperName(); + } + } + + /** + * 修改用户状态 + * @auth true + */ + public function state() + { + $this->_checkInput(); + SystemUser::mSave($this->_vali([ + 'status.in:0,1' => '状态值范围异常!', + 'status.require' => '状态值不能为空!', + ])); + } + + /** + * 删除系统用户 + * @auth true + */ + public function remove() + { + $this->_checkInput(); + SystemUser::mDelete(); + } + + /** + * 检查输入变量 + */ + private function _checkInput() + { + if (in_array('10000', str2arr(input('id', '')))) { + $this->error('系统超级账号禁止删除!'); + } + } +} diff --git a/app/admin/controller/api/Mail.php b/app/admin/controller/api/Mail.php new file mode 100644 index 0000000..e503b9a --- /dev/null +++ b/app/admin/controller/api/Mail.php @@ -0,0 +1,114 @@ + '默认配置1', + 'config' => [ + 'DOMAIN' => '586vip.cn', + 'TEMP_MAIL' => 'ademyyk', + 'TEMP_MAIL_EXT' => '@mailto.plus', + 'BROWSER_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.92 Safari/537.36', + // 'BROWSER_PROXY' => 'http://127.0.0.1:2080', + // 'BROWSER_HEADLESS' => 'True', + 'MAIL_SERVER' => 'https://tempmail.plus' + ] + ], + [ + 'name' => '备用配置1', + 'config' => [ + 'DOMAIN' => 'nosqli.com', + 'TEMP_MAIL' => 'ademyyk', + 'TEMP_MAIL_EXT' => '@mailto.plus', + 'BROWSER_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.92 Safari/537.36', + 'MAIL_SERVER' => 'https://tempmail.plus' + ] + ] + // , + // [ + // 'name' => 'IMAP配置', + // 'config' => [ + // 'DOMAIN' => 'wuen.site', + // 'TEMP_MAIL' => null, + // 'IMAP_SERVER' => 'imap.163.com', + // 'IMAP_PORT' => 993, + // 'IMAP_USER' => 'maticarmy@163.com', + // 'IMAP_PASS' => 'LQer6rsSWan6vtuz', + // 'BROWSER_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.92 Safari/537.36', + // 'MAIL_SERVER' => 'https://tempmail.plus' + // ] + // ] + ]; + + /** + * 获取所有配置 + */ + public function getAll() + { + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => $this->mailConfigs + ]); + } + + /** + * 获取随机配置 + */ + public function getRandom() + { + // 随机获取一个配置 + $config = $this->mailConfigs[array_rand($this->mailConfigs)]; + + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => [ + 'name' => $config['name'], + 'env' => $config['config'] + ] + ]); + } + + /** + * 获取指定配置 + */ + public function getConfig() + { + $name = input('name', ''); + + // 如果未指定名称,返回随机配置 + if (empty($name)) { + return $this->getRandom(); + } + + // 查找指定配置 + foreach ($this->mailConfigs as $config) { + if ($config['name'] === $name) { + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => [ + 'name' => $config['name'], + 'env' => $config['config'] + ] + ]); + } + } + + // 未找到指定配置,返回随机配置 + return $this->getRandom(); + } +} \ No newline at end of file diff --git a/app/admin/controller/api/Member.php b/app/admin/controller/api/Member.php new file mode 100644 index 0000000..268171b --- /dev/null +++ b/app/admin/controller/api/Member.php @@ -0,0 +1,85 @@ + 1, + 'msg' => '请输入查询关键字' + ]); + } + + // 查询会员信息 (email = xxx OR order_id = xxx) + $member = MemberModel::whereOr('email', '=', $keyword) + ->whereOr('order_id', '=', $keyword) + ->find(); + + if (empty($member)) { + return json([ + 'code' => 1, + 'msg' => '会员不存在' + ]); + } + + // 检查会员状态 + if ($member['status'] != 1) { + return json([ + 'code' => 1, + 'msg' => '会员已被禁用' + ]); + } + + // 检查有效期 + if (strtotime($member['expire_time']) < time()) { + return json([ + 'code' => 1, + 'msg' => '会员已过期' + ]); + } + + // 检查使用次数 + if ($member['usage_limit'] > 0 && $member['used_count'] >= $member['usage_limit']) { + return json([ + 'code' => 1, + 'msg' => '使用次数已达上限' + ]); + } + + // 更新使用次数和最后登录信息 + $member->used_count = $member->used_count + 1; + $member->last_login_time = date('Y-m-d H:i:s'); + $member->last_login_ip = $this->request->ip(); + $member->save(); + + // 返回成功 + return json([ + 'code' => 0, + 'msg' => '验证通过', + 'data' => [ + 'email' => $member['email'], + 'order_id' => $member['order_id'], + 'expire_time' => $member['expire_time'], + 'usage_limit' => $member['usage_limit'], + 'used_count' => $member['used_count'], + 'last_login_time' => $member['last_login_time'] + ] + ]); + } +} \ No newline at end of file diff --git a/app/admin/controller/api/Plugs.php b/app/admin/controller/api/Plugs.php new file mode 100644 index 0000000..aabb791 --- /dev/null +++ b/app/admin/controller/api/Plugs.php @@ -0,0 +1,91 @@ +title = '图标选择器'; + // 读取 layui 字体图标 + if (empty($this->layuiIcons = $this->app->cache->get('LayuiIcons', []))) { + $style = file_get_contents(syspath('public/static/plugs/layui/css/layui.css')); + if (preg_match_all('#\.(layui-icon-[\w-]+):#', $style, $matches)) { + if (count($this->layuiIcons = $matches[1]) > 0) { + $this->app->cache->set('LayuiIcons', $this->layuiIcons, 60); + } + } + } + // 读取自定义字体图标 + if (empty($this->thinkIcons = $this->app->cache->get('ThinkAdminSelfIcons', []))) { + $style = file_get_contents(syspath('public/static/theme/css/iconfont.css')); + if (preg_match_all('#\.(iconfont-[\w-]+):#', $style, $matches)) { + if (count($this->thinkIcons = $matches[1]) > 0) { + $this->app->cache->set('ThinkAdminSelfIcons', $this->thinkIcons, 60); + } + } + } + $this->field = $this->app->request->get('field', 'icon'); + $this->fetch(dirname(__DIR__, 2) . '/view/api/icon.html'); + } + + /** + * 前端脚本变量 + * @return \think\Response + * @throws \think\admin\Exception + */ + public function script(): Response + { + $token = $this->request->get('uptoken', ''); + $domain = boolval(AdminService::withUploadUnid($token)); + return response(join("\r\n", [ + sprintf("window.taDebug = %s;", $this->app->isDebug() ? 'true' : 'false'), + sprintf("window.taAdmin = '%s';", sysuri('admin/index/index', [], false, $domain)), + sprintf("window.taEditor = '%s';", sysconf('base.editor|raw') ?: 'ckeditor4'), + ]))->contentType('application/javascript'); + } + + /** + * 优化数据库 + * @login true + */ + public function optimize() + { + if (AdminService::isSuper()) { + sysoplog('系统运维管理', '创建数据库优化任务'); + $this->_queue('优化数据库所有数据表', 'xadmin:database optimize'); + } else { + $this->error('请使用超管账号操作!'); + } + } +} \ No newline at end of file diff --git a/app/admin/controller/api/Program.php b/app/admin/controller/api/Program.php new file mode 100644 index 0000000..8b210b4 --- /dev/null +++ b/app/admin/controller/api/Program.php @@ -0,0 +1,91 @@ +programPath; + if (!is_dir($path)) { + return json([ + 'code' => 1, + 'msg' => '程序目录不存在' + ]); + } + + // 获取目录中最新的文件 + $files = glob($path . '*'); + if (empty($files)) { + return json([ + 'code' => 1, + 'msg' => '暂无可用程序' + ]); + } + + // 获取最新文件 + $latest = array_reduce($files, function($carry, $file) { + return (!$carry || filemtime($file) > filemtime($carry)) ? $file : $carry; + }); + + $name = basename($latest); + $size = filesize($latest); + $md5 = md5_file($latest); + + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'data' => [ + 'name' => $name, + 'size' => $size, + 'md5' => $md5, + 'url' => request()->domain() . '/' . $this->programPath . $name, + 'time' => date('Y-m-d H:i:s', filemtime($latest)) + ] + ]); + } + + /** + * 下载程序 + */ + public function down() + { + $path = public_path() . $this->programPath; + if (!is_dir($path)) { + return json([ + 'code' => 1, + 'msg' => '程序目录不存在' + ]); + } + + // 获取目录中最新的文件 + $files = glob($path . '*'); + if (empty($files)) { + return json([ + 'code' => 1, + 'msg' => '暂无可用程序' + ]); + } + + // 获取最新文件 + $latest = array_reduce($files, function($carry, $file) { + return (!$carry || filemtime($file) > filemtime($carry)) ? $file : $carry; + }); + + return download($latest, basename($latest)); + } +} \ No newline at end of file diff --git a/app/admin/controller/api/Queue.php b/app/admin/controller/api/Queue.php new file mode 100644 index 0000000..ee757c4 --- /dev/null +++ b/app/admin/controller/api/Queue.php @@ -0,0 +1,118 @@ +app->console->call('xadmin:queue', ['stop'])->fetch(); + if (stripos($message, 'sent end signal to process')) { + sysoplog('系统运维管理', '尝试停止任务监听服务'); + $this->success('停止任务监听服务成功!'); + } elseif (stripos($message, 'processes to stop')) { + $this->success('没有找到需要停止的服务!'); + } else { + $this->error(nl2br($message)); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 启动监听服务 + * @login true + */ + public function start() + { + if (AdminService::isSuper()) try { + $message = $this->app->console->call('xadmin:queue', ['start'])->fetch(); + if (stripos($message, 'daemons started successfully for pid')) { + sysoplog('系统运维管理', '尝试启动任务监听服务'); + $this->success('任务监听服务启动成功!'); + } elseif (stripos($message, 'daemons already exist for pid')) { + $this->success('任务监听服务已经启动!'); + } else { + $this->error(nl2br($message)); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 检查监听服务 + * @login true + */ + public function status() + { + if (AdminService::isSuper()) try { + $message = $this->app->console->call('xadmin:queue', ['status'])->fetch(); + if (preg_match('/process.*?\d+.*?running/', $message)) { + echo "{$this->app->lang->get('已启动')}"; + } else { + echo "{$this->app->lang->get('未启动')}"; + } + } catch (\Error|\Exception $exception) { + echo "{$this->app->lang->get('异 常')}"; + } else { + $message = lang('只有超级管理员才能操作!'); + echo "{$this->app->lang->get('无权限')}"; + } + } + + /** + * 查询任务进度 + * @login true + */ + public function progress() + { + $input = $this->_vali(['code.require' => '任务编号不能为空!']); + $this->app->db->setLog(new NullLogger()); /* 关闭数据库请求日志 */ + $message = SystemQueue::mk()->where($input)->value('message', ''); + $this->success('获取任务进度成功d!', json_decode($message, true)); + } +} \ No newline at end of file diff --git a/app/admin/controller/api/System.php b/app/admin/controller/api/System.php new file mode 100644 index 0000000..c9b8002 --- /dev/null +++ b/app/admin/controller/api/System.php @@ -0,0 +1,138 @@ +success('网站缓存加速成功!', 'javascript:location.reload()'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 清理运行缓存 + * @login true + */ + public function clear() + { + if (AdminService::isSuper()) try { + RuntimeService::clear() && sysoplog('系统运维管理', '清理网站日志缓存'); + $this->success('清空日志缓存成功!', 'javascript:location.reload()'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 当前运行模式 + * @login true + */ + public function debug() + { + if (AdminService::isSuper()) if (input('state')) { + RuntimeService::set('product'); + sysoplog('系统运维管理', '开发模式切换为生产模式'); + $this->success('已切换为生产模式!', 'javascript:location.reload()'); + } else { + RuntimeService::set('debug'); + sysoplog('系统运维管理', '生产模式切换为开发模式'); + $this->success('已切换为开发模式!', 'javascript:location.reload()'); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 修改富文本编辑器 + * @return void + * @throws \think\admin\Exception + */ + public function editor() + { + if (AdminService::isSuper()) { + $editor = input('editor', 'auto'); + sysconf('base.editor', $editor); + sysoplog('系统运维管理', "切换编辑器为{$editor}"); + $this->success('已切换后台编辑器!', 'javascript:location.reload()'); + } else { + $this->error('请使用超管账号操作!'); + } + } + + /** + * 清理系统配置 + * @login true + */ + public function config() + { + if (AdminService::isSuper()) try { + [$tmpdata, $newdata] = [[], []]; + foreach (SystemConfig::mk()->order('type,name asc')->cursor() as $item) { + $tmpdata[$item['type']][$item['name']] = $item['value']; + } + foreach ($tmpdata as $type => $items) foreach ($items as $name => $value) { + $newdata[] = ['type' => $type, 'name' => $name, 'value' => $value]; + } + $this->app->db->transaction(static function () use ($newdata) { + SystemConfig::mQuery()->empty()->insertAll($newdata); + }); + $this->app->cache->delete('SystemConfig'); + sysoplog('系统运维管理', '清理系统配置参数'); + $this->success('清理系统配置成功!', 'javascript:location.reload()'); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } else { + $this->error('请使用超管账号操作!'); + } + } +} \ No newline at end of file diff --git a/app/admin/controller/api/Upload.php b/app/admin/controller/api/Upload.php new file mode 100644 index 0000000..0976463 --- /dev/null +++ b/app/admin/controller/api/Upload.php @@ -0,0 +1,336 @@ + []]; + [$uuid, $unid, $exts] = $this->initUnid(false); + $allows = str2arr(sysconf('storage.allow_exts|raw')); + if (empty($uuid) && $unid > 0) $allows = array_intersect($exts, $allows); + foreach ($allows as $ext) $data['exts'][$ext] = Storage::mime($ext); + $data['exts'] = json_encode($data['exts'], JSON_UNESCAPED_UNICODE); + $data['nameType'] = sysconf('storage.name_type|raw') ?: 'xmd5'; + return view(dirname(__DIR__, 2) . '/view/api/upload.js', $data)->contentType('application/x-javascript'); + } + + /** + * 文件选择器 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function image() + { + [$uuid, $unid] = $this->initUnid(); + SystemFile::mQuery()->layTable(function () { + $this->title = '文件选择器'; + }, function (QueryHelper $query) use ($unid, $uuid) { + if ($unid && $uuid) $query->where(function ($query) use ($uuid, $unid) { + /** @var \think\db\Query $query */ + $query->whereOr([['uuid', '=', $uuid], ['unid', '=', $unid]]); + }); else { + $query->where($unid ? ['unid' => $unid] : ['uuid' => $uuid]); + } + $query->where(['status' => 2, 'issafe' => 0])->in('xext#type'); + $query->like('name,hash')->dateBetween('create_at')->order('id desc'); + }); + } + + /** + * 文件上传检查 + */ + public function state() + { + try { + [$uuid, $unid] = $this->initUnid(); + [$name, $safe] = [input('name'), $this->getSafe()]; + $data = ['uptype' => $this->getType(), 'safe' => intval($safe), 'key' => input('key')]; + $file = SystemFile::mk()->data($this->_vali([ + 'xkey.value' => $data['key'], + 'type.value' => $this->getType(), + 'uuid.value' => $uuid, + 'unid.value' => $unid, + 'name.require' => '名称不能为空!', + 'hash.require' => '哈希不能为空!', + 'xext.require' => '后缀不能为空!', + 'size.require' => '大小不能为空!', + 'mime.default' => '', + 'status.value' => 1, + ])); + $mime = $file->getAttr('mime'); + if (empty($mime)) $file->setAttr('mime', Storage::mime($file->getAttr('xext'))); + $info = Storage::instance($data['uptype'])->info($data['key'], $safe, $name); + if (isset($info['url']) && isset($info['key'])) { + $file->save(['xurl' => $info['url'], 'isfast' => 1, 'issafe' => $data['safe']]); + $extr = ['id' => $file->id ?? 0, 'url' => $info['url'], 'key' => $info['key']]; + $this->success('文件已经上传', array_merge($data, $extr), 200); + } elseif ('local' === $data['uptype']) { + $local = LocalStorage::instance(); + $data['url'] = $local->url($data['key'], $safe, $name); + $data['server'] = $local->upload(); + } elseif ('qiniu' === $data['uptype']) { + $qiniu = QiniuStorage::instance(); + $data['url'] = $qiniu->url($data['key'], $safe, $name); + $data['token'] = $qiniu->token($data['key'], 3600, $name); + $data['server'] = $qiniu->upload(); + } elseif ('alioss' === $data['uptype']) { + $alioss = AliossStorage::instance(); + $token = $alioss->token($data['key'], 3600, $name); + $data['url'] = $token['siteurl']; + $data['policy'] = $token['policy']; + $data['signature'] = $token['signature']; + $data['OSSAccessKeyId'] = $token['keyid']; + $data['server'] = $alioss->upload(); + } elseif ('txcos' === $data['uptype']) { + $txcos = TxcosStorage::instance(); + $token = $txcos->token($data['key'], 3600, $name); + $data['url'] = $token['siteurl']; + $data['q-ak'] = $token['q-ak']; + $data['policy'] = $token['policy']; + $data['q-key-time'] = $token['q-key-time']; + $data['q-signature'] = $token['q-signature']; + $data['q-sign-algorithm'] = $token['q-sign-algorithm']; + $data['server'] = $txcos->upload(); + } elseif ('upyun' === $data['uptype']) { + $upyun = UpyunStorage::instance(); + $token = $upyun->token($data['key'], 3600, $name, input('hash', '')); + $data['url'] = $token['siteurl']; + $data['policy'] = $token['policy']; + $data['server'] = $upyun->upload(); + $data['authorization'] = $token['authorization']; + } elseif ('alist' === $data['uptype']) { + $alist = AlistStorage::instance(); + $data['url'] = $alist->url($data['key']); + $data['server'] = $alist->upload(); + $data['filepath'] = $alist->real($data['key']); + $data['authorization'] = $alist->token(); + } else { + $this->error('未知的存储引擎!'); + } + $file->save(['xurl' => $data['url'], 'isfast' => 0, 'issafe' => $data['safe']]); + $this->success('获取上传授权参数', array_merge($data, ['id' => $file->id ?? 0]), 404); + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + $this->error($exception->getMessage()); + } + } + + /** + * 更新文件状态 + * @return void + */ + public function done() + { + [$uuid, $unid] = $this->initUnid(); + $data = $this->_vali([ + 'id.require' => '编号不能为空!', + 'hash.require' => '哈希不能为空!', + 'uuid.value' => $uuid, + 'unid.value' => $unid, + ]); + $file = SystemFile::mk()->where($data)->findOrEmpty(); + if ($file->isEmpty()) $this->error('文件不存在!'); + if ($file->save(['status' => 2])) { + $this->success('更新成功!'); + } else { + $this->error('更新失败!'); + } + } + + /** + * 文件上传入口 + * @throws \think\admin\Exception + */ + public function file() + { + [$uuid, $unid, $unexts] = $this->initUnid(); + // 开始处理文件上传 + $file = $this->getFile(); + $extension = strtolower($file->getOriginalExtension()); + $saveFileName = input('key') ?: Storage::name($file->getPathname(), $extension, '', 'md5_file'); + // 检查文件名称是否合法 + if (strpos($saveFileName, '..') !== false) { + $this->error('文件路径不能出现跳级操作!'); + } + // 检查文件后缀是否被恶意修改 + if (strtolower(pathinfo(parse_url($saveFileName, PHP_URL_PATH), PATHINFO_EXTENSION)) !== $extension) { + $this->error('文件后缀异常,请重新上传文件!'); + } + // 屏蔽禁止上传指定后缀的文件 + if (!in_array($extension, str2arr(sysconf('storage.allow_exts|raw')))) { + $this->error('文件类型受限,请在后台配置规则!'); + } + // 前端用户上传后缀检查处理 + if (empty($uuid) && $unid > 0 && !in_array($extension, $unexts)) { + $this->error('文件类型受限,请上传允许的文件类型!'); + } + if (in_array($extension, ['sh', 'asp', 'bat', 'cmd', 'exe', 'php'])) { + $this->error('文件安全保护,禁止上传可执行文件!'); + } + try { + $safeMode = $this->getSafe(); + if (($type = $this->getType()) === 'local') { + $local = LocalStorage::instance(); + $distName = $local->path($saveFileName, $safeMode); + if (PHP_SAPI === 'cli') { + is_dir(dirname($distName)) || mkdir(dirname($distName), 0777, true); + rename($file->getPathname(), $distName); + } else { + $file->move(dirname($distName), basename($distName)); + } + $info = $local->info($saveFileName, $safeMode, $file->getOriginalName()); + if (in_array($extension, ['jpg', 'gif', 'png', 'bmp', 'jpeg', 'wbmp'])) { + if ($this->imgNotSafe($distName) && $local->del($saveFileName)) { + $this->error('图片未通过安全检查!'); + } + [$width, $height] = getimagesize($distName); + if (($width < 1 || $height < 1) && $local->del($saveFileName)) { + $this->error('读取图片的尺寸失败!'); + } + } + } else { + $bina = file_get_contents($file->getPathname()); + $info = Storage::instance($type)->set($saveFileName, $bina, $safeMode, $file->getOriginalName()); + } + if (isset($info['url'])) { + $this->success('文件上传成功!', ['url' => $safeMode ? $saveFileName : $info['url']]); + } else { + $this->error('文件处理失败,请稍候再试!'); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error($exception->getMessage()); + } + } + + /** + * 获取上传类型 + * @return boolean + */ + private function getSafe(): bool + { + return boolval(input('safe', '0')); + } + + /** + * 获取上传方式 + * @return string + * @throws \think\admin\Exception + */ + private function getType(): string + { + $type = strtolower(input('uptype', '')); + if (in_array($type, array_keys(Storage::types()))) { + return $type; + } else { + return strtolower(sysconf('storage.type|raw')); + } + } + + /** + * 获取文件对象 + * @return UploadedFile|void + */ + private function getFile(): UploadedFile + { + try { + $file = $this->request->file('file'); + if ($file instanceof UploadedFile) { + return $file; + } else { + $this->error('读取临时文件失败!'); + } + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + trace_file($exception); + $this->error(lang($exception->getMessage())); + } + } + + /** + * 初始化用户状态 + * @param boolean $check + * @return array + */ + private function initUnid(bool $check = true): array + { + $uuid = AdminService::getUserId(); + [$unid, $exts] = AdminService::withUploadUnid(); + if ($check && empty($uuid) && empty($unid)) { + $this->error('未登录,禁止使用文件上传!'); + } else { + return [$uuid, $unid, $exts]; + } + } + + /** + * 检查图片是否安全 + * @param string $filename + * @return boolean + */ + private function imgNotSafe(string $filename): bool + { + $source = fopen($filename, 'rb'); + if (($size = filesize($filename)) > 512) { + $hexs = bin2hex(fread($source, 512)); + fseek($source, $size - 512); + $hexs .= bin2hex(fread($source, 512)); + } else { + $hexs = bin2hex(fread($source, $size)); + } + if (is_resource($source)) fclose($source); + $bins = hex2bin($hexs); + /* 匹配十六进制中的 <% ( ) %> 或 + + + \ No newline at end of file diff --git a/app/admin/view/api/upload.js b/app/admin/view/api/upload.js new file mode 100644 index 0000000..edf247b --- /dev/null +++ b/app/admin/view/api/upload.js @@ -0,0 +1,327 @@ +define(['md5', 'notify'], function (SparkMD5, Notify, allowMime) { + allowMime = JSON.parse('{$exts|raw}'); + + function UploadAdapter(elem, done) { + return new (function (elem, done) { + let that = this; + + /*! 初始化变量 */ + this.option = {elem: $(elem), exts: [], mimes: []}; + this.option.size = this.option.elem.data('size') || 0; + this.option.safe = this.option.elem.data('safe') ? 1 : 0; + this.option.hide = this.option.elem.data('hload') ? 1 : 0; + this.option.mult = this.option.elem.data('multiple') > 0; + this.option.path = (this.option.elem.data('path') || '').replace(/\W/g, ''); + this.option.type = this.option.safe ? 'local' : this.option.elem.attr('data-uptype') || ''; + this.option.quality = parseFloat(this.option.elem.data('quality') || '1.0'); + this.option.maxWidth = parseInt(this.option.elem.data('max-width') || '0'); + this.option.maxHeight = parseInt(this.option.elem.data('max-height') || '0'); + this.option.cutWidth = parseInt(this.option.elem.data('cut-width') || '0'); + this.option.cutHeight = parseInt(this.option.elem.data('cut-height') || '0'); + + /*! 查找表单元素, 如果没有找到将不会自动写值 */ + if (this.option.elem.data('input')) { + this.option.input = $(this.option.elem.data('input')) + } else if (this.option.elem.data('field')) { + this.option.input = $('input[name="' + this.option.elem.data('field') + '"]:not([type=file])'); + this.option.elem.data('input', this.option.input.size() > 0 ? this.option.input.get(0) : null); + } + + /*! 文件选择筛选,使用 MIME 规则过滤文件列表 */ + $((this.option.elem.data('type') || '').split(',')).map(function (i, e) { + if (allowMime[e]) that.option.exts.push(e), that.option.mimes.push(allowMime[e]); + }); + + /*! 初始化上传组件 */ + this.adapter = new Adapter(this.option, layui.upload.render({ + url: '{:url("admin/api.upload/file",[],false,true)}', auto: false, elem: elem, accept: 'file', multiple: this.option.mult, exts: this.option.exts.join('|'), acceptMime: this.option.mimes.join(','), choose: function (obj) { + obj.items = [], obj.files = obj.pushFile(); + layui.each(obj.files, function (idx, file) { + obj.items.push(file); + file.path = that.option.path; + file.quality = that.option.quality; + file.maxWidth = that.option.maxWidth; + file.maxHeight = that.option.maxHeight; + file.cutWidth = that.option.cutWidth; + file.cutHeight = that.option.cutHeight; + }); + that.adapter.event('upload.choose', obj.items); + that.adapter.upload(obj.items, done); + layui.each(obj.files, function (idx) { + delete obj.files[idx]; + }); + } + })); + })(elem, done) + } + + // 创建对象 + UploadAdapter.adapter = window.AdminUploadAdapter = Adapter; + + // 上传文件 + function Adapter(option, uploader) { + this.uploader = uploader, this.config = function (option) { + return (this.option = Object.assign({}, this.option || {}, option || {})), this; + }, this.init = function (option) { + this.uploader && this.uploader.config.elem.next().val(''); + this.files = {}, this.loader = 0, this.count = {total: 0, error: 0, success: 0}; + return this.config(option).config({safe: this.option.safe || 0, type: this.option.type || ''}); + }, this.init(option); + } + + // 文件推送 + Adapter.prototype.upload = function (files, done) { + let that = this.init(); + layui.each(files, function (index, file) { + that.count.total++, file.index = index, that.files[index] = file; + if (!that.option.hide && !file.notify) { + file.notify = new NotifyExtend(file); + } + if (that.option.size && file.size > that.option.size) { + that.event('upload.error', {file: file}, file, '{:lang("大小超出限制!")}'); + } + }); + layui.each(files, function (index, file) { + // 禁传异常状态文件 + if (typeof file.xstate === 'number' && file.xstate === -1) return; + // 图片限宽限高压缩 + let isGif = /^image\/gif/.test(file.type); + if (!isGif && /^image\//.test(file.type) && (file.maxWidth + file.maxHeight + file.cutWidth + file.cutHeight > 0 || file.quality !== 1)) { + require(['compressor'], function (Compressor) { + let options = {quality: file.quality, resize: 'cover'}; + if (file.cutWidth) options.width = file.cutWidth; + if (file.cutHeight) options.height = file.cutHeight; + if (file.maxWidth) options.maxWidth = file.maxWidth; + if (file.maxHeight) options.maxHeight = file.maxHeight; + new Compressor(file, Object.assign(options, { + success(blob) { + blob.index = file.index, blob.notify = file.notify, blob.path = file.path, files[index] = blob; + that.hash(files[index]).then(function (file) { + that.event('upload.hash', file).request(file, done); + }); + }, error: function () { + that.event('upload.error', {file: file}, file, '{:lang("图片压缩失败!")}'); + } + })); + }); + } else { + that.hash(file).then(function (file) { + that.event('upload.hash', file).request(file, done); + }); + } + }); + }; + + // 文件上传 + Adapter.prototype.request = function (file, done) { + let that = this, data = {key: file.xkey, safe: that.option.safe, uptype: that.option.type}; + data.size = file.size, data.name = file.name, data.hash = file.xmd5, data.mime = file.type, data.xext = file.xext; + jQuery.ajax("{:url('admin/api.upload/state',[],false,true)}", { + data: data, method: 'post', success: function (ret) { + file.id = ret.data.id || 0, file.xurl = ret.data.url; + file.xsafe = ret.data.safe, file.xpath = ret.data.key, file.xtype = ret.data.uptype; + if (parseInt(ret.code) === 404) { + let uploader = {}; + uploader.uptype = ret.data.uptype; + uploader.url = ret.data.server; + uploader.head = {}; + uploader.form = new FormData(); + uploader.form.append('key', ret.data.key); + uploader.form.append('safe', ret.data.safe); + uploader.form.append('uptype', ret.data.uptype); + if (ret.data.uptype === 'qiniu') { + uploader.form.append('token', ret.data.token); + } else if (ret.data.uptype === 'alist') { + uploader.type = 'put'; + uploader.head['file-path'] = ret.data['filepath']; + uploader.head['authorization'] = ret.data['authorization']; + uploader.form = new FormData(); + } else if (ret.data.uptype === 'alioss') { + uploader.form.append('policy', ret.data['policy']); + uploader.form.append('signature', ret.data['signature']); + uploader.form.append('OSSAccessKeyId', ret.data['OSSAccessKeyId']); + uploader.form.append('success_action_status', '200'); + uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); + } else if (ret.data.uptype === 'txcos') { + uploader.form.append('q-ak', ret.data['q-ak']); + uploader.form.append('policy', ret.data['policy']); + uploader.form.append('q-key-time', ret.data['q-key-time']); + uploader.form.append('q-signature', ret.data['q-signature']); + uploader.form.append('q-sign-algorithm', ret.data['q-sign-algorithm']); + uploader.form.append('success_action_status', '200'); + uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); + } else if (ret.data.uptype === 'upyun') { + uploader.form.delete('key'); + uploader.form.delete('safe'); + uploader.form.delete('uptype'); + uploader.form.append('save-key', ret.data['key']); + uploader.form.append('policy', ret.data['policy']); + uploader.form.append('authorization', ret.data['authorization']); + uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); + } + uploader.form.append('file', file, file.name), jQuery.ajax({ + xhrFields: {withCredentials: ret.data.uptype === 'local'}, headers: uploader.head, url: uploader.url, data: uploader.form, type: uploader.type || 'post', xhr: function (xhr) { + xhr = new XMLHttpRequest(); + return xhr.upload.addEventListener('progress', function (event) { + file.xtotal = event.total, file.xloaded = event.loaded || 0; + that.progress((file.xloaded / file.xtotal * 100).toFixed(2), file) + }), xhr; + }, contentType: false, error: function () { + that.event('upload.error', {file: file}, file, '{:lang("上传接口异常!")}'); + }, processData: false, success: function (ret) { + // 兼容数据格式 + if (typeof ret === 'string' && ret.length > 0) try { + ret = JSON.parse(ret) || ret; + } catch (e) { + console.log(e) + } + if (typeof ret !== 'object') { + ret = {code: 1, url: file.xurl, info: '{:lang("文件上传成功!")}'}; + } + /*! 检查单个文件上传返回的结果 */ + if (typeof ret === 'object' && ret.code < 1) { + that.event('upload.error', {file: file}, file, ret.info || '{:lang("文件上传失败!")}'); + } else if (uploader.uptype === 'alist' && parseInt(ret.code) !== 200) { + that.event('upload.error', {file: file}, file, ret.message || '{:lang("文件上传失败!")}'); + } else { + that.done(ret, file.index, file, done, '{:lang("文件上传成功!")}'); + } + } + }); + } else if (parseInt(ret.code) === 200) { + (file.xurl = ret.data.url), that.progress('100.00', file); + that.done({code: 1, url: file.xurl, info: file.xstats, data: {code: 200, url: file.xurl}}, file.index, file, done, '{:lang("文件秒传成功!")}'); + } else { + that.event('upload.error', {file: file}, file, ret.info || ret.error.message || '{:lang("文件上传出错!")}'); + } + } + }); + }; + + // 上传进度 + Adapter.prototype.progress = function (number, file) { + this.event('upload.progress', {number: number, file: file}); + if (file.notify) file.notify.setProgress(number); + }; + + // 上传结果 + Adapter.prototype.done = function (ret, idx, file, done, message) { + /*! 检查单个文件上传返回的结果 */ + if (ret.code < 1) return $.msg.tips(ret.info || '{:lang("文件上传失败!")}'); + if (typeof file.xurl !== 'string') return $.msg.tips('{:lang("无效的文件上传对象!")}'); + jQuery.post("{:url('admin/api.upload/done',[],false,true)}", {id: file.id, hash: file.xmd5}); + /*! 单个文件上传成功结果处理 */ + if (typeof done === 'function') { + done.call(this.option.elem, file.xurl, this.files['id']); + } else if (this.option.mult < 1 && this.option.elem.data('input')) { + $(this.option.elem.data('input')).val(file.xurl).trigger('change', file); + } + // 文件上传成功事件 + this.event('push', file.xurl).event('upload.done', {file: file, data: ret}, file, message); + /*! 所有文件上传完成后结果处理 */ + if (this.count.success + this.count.error >= this.count.total) { + this.option.hide || $.msg.close(this.loader); + if (this.option.mult > 0 && this.option.elem.data('input')) { + let urls = this.option.elem.data('input').value || []; + if (typeof urls === 'string') urls = urls.split('|'); + for (let i in this.files) urls.push(this.files[i].xurl); + $(this.option.elem.data('input')).val(urls.join('|')).trigger('change', this.files); + } + this.event('upload.complete', {file: this.files}, file).init().uploader && this.uploader.reload(); + } + }; + + /*! 触发事件过程 */ + Adapter.prototype.event = function (name, data, file, message) { + if (name === 'upload.error') { + this.count.error++, file.xstate = -1, file.xstats = message; + if (file.notify) file.notify.setError(message || file.xstats || ''); + } else if (name === 'upload.done') { + this.count.success++, file.xstate = 1, file.xstats = message; + if (file.notify) file.notify.setSuccess(message || file.xstats || '') + } + if (this.option.elem) { + this.option.elem.triggerHandler(name, data); + if (this.option.input) this.option.input.triggerHandler(name, data); + } + return this; + }; + + /** + * 计算文件 HASH 值 + * @param {File} file 文件对象 + * @return {Promise} + */ + Adapter.prototype.hash = function (file) { + let defer = jQuery.Deferred(); + file.xext = file.name.indexOf('.') > -1 ? file.name.split('.').pop() : 'tmp'; + + /*! 兼容不能计算文件 HASH 的情况 */ + let IsDate = '{$nameType|default=""}'.indexOf('date') > -1; + if (!window.FileReader || IsDate) return jQuery.when((function (xmd5, chars) { + while (xmd5.length < 32) xmd5 += chars.charAt(Math.floor(Math.random() * chars.length)); + return SetFileXdata(file, xmd5, 6), defer.promise(); + })(layui.util.toDateString(Date.now(), 'yyyyMMddHHmmss-'), '0123456789')); + + /*! 读取文件并计算 HASH 值 */ + return new LoadNextChunk(file).ReadAsChunk(); + + function SetFileXdata(file, xmd5, slice) { + file.xmd5 = xmd5, file.xstate = 0, file.xstats = ''; + file.xkey = file.xmd5.substring(0, slice || 2) + '/' + file.xmd5.substring(slice || 2) + '.' + file.xext; + if (file.path) file.xkey = file.path + '/' + file.xkey; + return defer.resolve(file, file.xmd5, file.xkey), file; + } + + function LoadNextChunk(file) { + let that = this, reader = new FileReader(), spark = new SparkMD5.ArrayBuffer(); + let slice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; + this.chunkIdx = 0, this.chunkSize = 2097152, this.chunkTotal = Math.ceil(file.size / this.chunkSize); + reader.onload = function (event) { + spark.append(event.target.result); + ++that.chunkIdx < that.chunkTotal ? that.ReadAsChunk() : SetFileXdata(file, spark.end()); + }, reader.onerror = function () { + defer.reject(); + }, this.ReadAsChunk = function () { + this.start = that.chunkIdx * that.chunkSize; + this.loaded = this.start + that.chunkSize >= file.size ? file.size : this.start + that.chunkSize; + reader.readAsArrayBuffer(slice.call(file, this.start, this.loaded)); + defer.notify(file, (this.loaded / file.size * 100).toFixed(2)); + return defer.promise(); + }; + } + }; + + return UploadAdapter; + + /** + * 上传状态提示扩展插件 + * @param {File} file 文件对象 + * @constructor + */ + function NotifyExtend(file) { + let that = this, message = "{:lang('上传进度 %s', ['0%'])}"; + this.notify = Notify.notify({width: 260, title: file.name, showProgress: true, description: message, type: 'default', position: 'top-right', closeTimeout: 0}); + this.$elem = $(this.notify.notification.nodes); + this.$elem.find('.growl-notification__progress').addClass('is-visible'); + this.$elem.find('.growl-notification__progress-bar').addClass('transition'); + this.setProgress = function (number) { + this.$elem.find('[data-upload-progress]').html(number + '%'); + this.$elem.find('.growl-notification__progress-bar').css({width: number + '%'}); + return this; + }, this.setError = function (message) { + this.$elem.find('.growl-notification__desc').html(message || '{:lang("文件上传失败!")}'); + this.$elem.removeClass('growl-notification--default').addClass('growl-notification--error') + return this.close(); + }, this.setSuccess = function (message) { + this.setProgress('100.00'); + this.$elem.find('.growl-notification__desc').html(message || '{:lang("文件上传成功!")}'); + this.$elem.removeClass('growl-notification--default').addClass('growl-notification--success'); + return this.close(); + }, this.close = function (timeout) { + return setTimeout(function () { + that.notify.close(); + }, timeout || 2000), this; + }; + } +}); \ No newline at end of file diff --git a/app/admin/view/api/upload/image.html b/app/admin/view/api/upload/image.html new file mode 100644 index 0000000..9bc6456 --- /dev/null +++ b/app/admin/view/api/upload/image.html @@ -0,0 +1,161 @@ +
+ +
+ +
+
+
+
+ {php} $tag = '{{data.length}}'; {/php} + {:lang('已选 %s 张,确认', [$tag])} +
+
+
+ + + + \ No newline at end of file diff --git a/app/admin/view/auth/form.html b/app/admin/view/auth/form.html new file mode 100644 index 0000000..b1961ba --- /dev/null +++ b/app/admin/view/auth/form.html @@ -0,0 +1,143 @@ +{extend name='main'} + +{block name="button"} + + +{/block} + +{block name="content"} +
+
+
+ + +
+ {:lang('功能节点')}Auth Nodes +
    +
    +
    + {notempty name='vo.id'}{/notempty} +
    + + +
    +
    +
    +
    +{/block} + +{block name="script"} + +{/block} + +{block name="style"} + +{/block} \ No newline at end of file diff --git a/app/admin/view/auth/index.html b/app/admin/view/auth/index.html new file mode 100644 index 0000000..ee0995c --- /dev/null +++ b/app/admin/view/auth/index.html @@ -0,0 +1,76 @@ +{extend name='table'} + +{block name="button"} + + + + + + + +{/block} + +{block name="content"} +
    + {include file='auth/index_search'} +
    +
    +{/block} + +{block name='script'} + + + + + + + + + + +{/block} \ No newline at end of file diff --git a/app/admin/view/auth/index_search.html b/app/admin/view/auth/index_search.html new file mode 100644 index 0000000..a0f333d --- /dev/null +++ b/app/admin/view/auth/index_search.html @@ -0,0 +1,45 @@ +
    + {:lang('条件搜索')} + +
    \ No newline at end of file diff --git a/app/admin/view/base/form.html b/app/admin/view/base/form.html new file mode 100644 index 0000000..3c4f6c5 --- /dev/null +++ b/app/admin/view/base/form.html @@ -0,0 +1,68 @@ +
    + +
    + +
    +
    数据类型Data Type
    + {if isset($vo.type)} + + {else} + + + {/if} +

    请选择数据类型,数据创建后不能再次修改哦 ~

    +
    + +

    请输入新的数据类型,数据创建后不能再次修改哦 ~

    +
    +
    + + + + + + + +
    + +
    + {notempty name='vo.id'}{/notempty} + +
    + + +
    + +
    \ No newline at end of file diff --git a/app/admin/view/base/index.html b/app/admin/view/base/index.html new file mode 100644 index 0000000..a96c33a --- /dev/null +++ b/app/admin/view/base/index.html @@ -0,0 +1,86 @@ +{extend name='table'} + +{block name="button"} + + + + + + + +{/block} + +{block name="content"} +
    + +
    + {include file='base/index_search'} +
    +
    +
    +{/block} + +{block name='script'} + + + + + + + + + + +{/block} \ No newline at end of file diff --git a/app/admin/view/base/index_search.html b/app/admin/view/base/index_search.html new file mode 100644 index 0000000..9ea566e --- /dev/null +++ b/app/admin/view/base/index_search.html @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/app/admin/view/config/index.html b/app/admin/view/config/index.html new file mode 100644 index 0000000..aaa6f72 --- /dev/null +++ b/app/admin/view/config/index.html @@ -0,0 +1,234 @@ +{extend name="main"} + +{block name="button"} + +{:lang('清理无效配置')} + + + +{:lang('修改系统参数')} + +{/block} + +{block name="content"} + +
    +
    + + {:lang('运行模式')}( {:lang('仅超级管理员可配置')} ) + +
    +
    + +
    +

    {:lang('开发模式')}:{:lang('开发人员或在功能调试时使用,系统异常时会显示详细的错误信息,同时还会记录操作日志及数据库 SQL 语句信息。')}

    +

    {:lang('生产模式')}:{:lang('项目正式部署上线后使用,系统异常时统一显示 “%s”,只记录重要的异常日志信息,强烈推荐上线后使用此模式。',[config('app.error_message')])}

    +
    +
    +
    + +
    +
    + + {:lang('富编辑器')}( {:lang('仅超级管理员可配置')} ) + +
    +
    +
    + {if !in_array(sysconf('base.editor'),['ckeditor4','ckeditor5','wangEditor','auto'])}{php}sysconf('base.editor','ckeditor4');{/php}{/if} + {foreach ['ckeditor4'=>'CKEditor4','ckeditor5'=>'CKEditor5','wangEditor'=>'wangEditor','auto'=>lang('自适应模式')] as $k => $v}{if sysconf('base.editor') eq $k} + {if auth('storage')}{$v}{else}{$v}{/if} + {else} + {if auth('storage')}{$v}{else}{$v}{/if} + {/if}{/foreach} +
    +
    +

    CKEditor4:{:lang('旧版本编辑器,对浏览器兼容较好,但内容编辑体验稍有不足。')}

    +

    CKEditor5:{:lang('新版本编辑器,只支持新特性浏览器,对内容编辑体验较好,推荐使用。')}

    +

    wangEditor:{:lang('国产优质富文本编辑器,对于小程序及App内容支持会更友好,推荐使用。')}

    +

    {:lang('自适应模式')}:{:lang('优先使用新版本编辑器,若浏览器不支持新版本时自动降级为旧版本编辑器。')}

    +
    +
    +
    + + +
    +
    + + {:lang('存储引擎')}( {:lang('文件默认存储方式')} ) + +
    + + {if !sysconf('storage.type')}{php}sysconf('storage.type','local');{/php}{/if} + {if !sysconf('storage.link_type')}{php}sysconf('storage.link_type','none');{/php}{/if} + {if !sysconf('storage.name_type')}{php}sysconf('storage.name_type','xmd5');{/php}{/if} + {if !sysconf('storage.allow_exts')}{php}sysconf('storage.allow_exts','doc,gif,ico,jpg,mp3,mp4,p12,pem,png,rar,xls,xlsx');{/php}{/if} + {if !sysconf('storage.local_http_protocol')}{php}sysconf('storage.local_http_protocol','follow');{/php}{/if} +
    +
    + {foreach $files as $k => $v}{if sysconf('storage.type') eq $k} + {if auth('storage')}{$v}{else}{$v}{/if} + {else} + {if auth('storage')}{$v}{else}{$v}{/if} + {/if}{/foreach} +
    +
    +

    {:lang('本地服务器存储')}:{:lang('文件上传到本地服务器的 `static/upload` 目录,不支持大文件上传,占用服务器磁盘空间,访问时消耗服务器带宽流量。')}

    +

    {:lang('自建Alist存储')}:{:lang('文件上传到 Alist 存储的服务器或云存储空间,根据服务配置可支持大文件上传,不占用本身服务器空间及服务器带宽流量。')}

    +

    {:lang('七牛云对象存储')}:{:lang('文件上传到七牛云存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。')}

    +

    {:lang('又拍云USS存储')}:{:lang('文件上传到又拍云 USS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。')}

    +

    {:lang('阿里云OSS存储')}:{:lang('文件上传到阿里云 OSS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。')}

    +

    {:lang('腾讯云COS存储')}:{:lang('文件上传到腾讯云 COS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。')}

    +
    +
    +
    + +
    +
    + + {:lang('系统参数')}( {:lang('当前系统配置参数')} ) + +
    +
    +
    +
    {:lang('网站名称')}Website
    + +
    {:lang('网站名称及网站图标,将显示在浏览器的标签上。')}
    +
    +
    +
    {:lang('管理程序名称')}Name
    + +
    {:lang('管理程序名称,将显示在后台左上角标题。')}
    +
    +
    +
    {:lang('管理程序版本')}Version
    + +
    {:lang('管理程序版本,将显示在后台左上角标题。')}
    +
    +
    +
    {:lang('公安备案号')}Beian
    + +

    + {:lang('公安备案号,可以在 %s 查询获取,将在登录页面下面显示。',['www.beian.gov.cn'])} +

    +
    +
    +
    {:lang('网站备案号')}Miitbeian
    + +
    + {:lang('网站备案号,可以在 %s 查询获取,将显示在登录页面下面。',['beian.miit.gov.cn'])} +
    +
    +
    +
    {:lang('网站版权信息')}Copyright
    + +
    {:lang('网站版权信息,在后台登录页面显示版本信息并链接到备案到信息备案管理系统。')}
    +
    +
    +
    + + +
    +
    + + {:lang('系统信息')}( {:lang('仅开发模式可见')} ) + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {:lang('核心框架')}ThinkPHP Version {$framework.version|default='None'}
    {:lang('平台框架')}ThinkAdmin Version {$thinkadmin.version|default='6.0.0'}
    {:lang('操作系统')}{:php_uname()}
    {:lang('运行环境')}{:ucfirst($request->server('SERVER_SOFTWARE',php_sapi_name()))} & PHP {$Think.const.PHP_VERSION} & {:ucfirst(app()->db->connect()->getConfig('type'))}
    {:lang('系统序号')}{$systemid|default=''}
    +
    +
    + +{notempty name='plugins'} +
    +
    + + {:lang('应用插件')}( {:lang('仅开发模式可见')} ) + +
    +
    + + + + + + + + + + + + {foreach $plugins as $key=>$plugin} + + + + + + + + {/foreach} + +
    {:lang('应用名称')}{:lang('插件名称')}{:lang('插件包名')}{:lang('插件版本')}{:lang('授权协议')}
    {$key}{$plugin.name|lang} + {if empty($plugin.install.document)}{$plugin.package} + {else}{$plugin.package}{/if} + {$plugin.install.version|default='unknow'} + {if empty($plugin.install.license)} - + {elseif is_array($plugin.install.license)}{$plugin.install.license|join='、',###} + {else}{$plugin.install.license|default='-'}{/if} +
    +
    +
    +{/notempty} + +{/block} \ No newline at end of file diff --git a/app/admin/view/config/storage-0.html b/app/admin/view/config/storage-0.html new file mode 100644 index 0000000..b74b121 --- /dev/null +++ b/app/admin/view/config/storage-0.html @@ -0,0 +1,49 @@ +
    + +
    +
    + {foreach ['xmd5'=>'文件哈希值 ( 支持秒传 )','date'=>'日期+随机 ( 普通上传 )'] as $k=>$v} + + {/foreach} +
    +

    类型为“文件哈希”时可以实现文件秒传功能,同一个文件只需上传一次节省存储空间,推荐使用。

    +
    +
    + +
    + +
    +
    + {foreach ['none'=>'简洁链接','full'=>'完整链接','none+compress'=>'简洁并压缩图片','full+compress'=>'完整并压缩图片'] as $k=>$v} + + {/foreach} +
    +

    类型为“简洁链接”时链接将只返回 hash 地址,而“完整链接”将携带参数保留文件名,图片压缩功能云平台会单独收费。

    +
    +
    + +
    + +
    + +

    设置系统允许上传的文件后缀,多个以英文逗号隔开如:png,jpg,rar,doc,未包含在设置内的文件后缀将不被允许上传。

    +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-alioss.html b/app/admin/view/config/storage-alioss.html new file mode 100644 index 0000000..63b7efa --- /dev/null +++ b/app/admin/view/config/storage-alioss.html @@ -0,0 +1,98 @@ +
    +
    + +
    +

    文件将上传到 阿里云 OSS 存储,需要配置 OSS 公开访问及跨域策略

    +

    配置跨域访问 CORS 规则,设置:来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

    +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.alioss_http_protocol')}{php}sysconf('storage.alioss_http_protocol','http');{/php}{/if} +
    + {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} + + {/foreach} +
    +

    阿里云OSS存储访问协议,其中 HTTPS 需要配置证书才能使用(AUTO 为相对协议)

    +
    +
    + +
    + +
    + +

    阿里云OSS存储空间所在区域,需要严格对应储存所在区域才能上传文件

    +
    +
    + +
    + +
    + +

    填写阿里云OSS存储空间名称,如:think-admin-oss(需要是全区唯一的值,不存在时会自动创建)

    +
    +
    + +
    + +
    + +

    填写阿里云OSS存储外部访问域名,不需要填写访问协议,如:static.alioss.thinkadmin.top

    +
    +
    + +
    + +
    + +

    可以在 [ 阿里云 > 个人中心 ] 设置并获取到访问密钥

    +
    +
    + +
    + +
    + +

    可以在 [ 阿里云 > 个人中心 ] 设置并获取到安全密钥

    +
    +
    + +
    + + +
    + + +
    + +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-alist.html b/app/admin/view/config/storage-alist.html new file mode 100644 index 0000000..33982d2 --- /dev/null +++ b/app/admin/view/config/storage-alist.html @@ -0,0 +1,81 @@ +
    +
    + +
    +

    文件将上传到 Alist 自建存储,需要自行搭建 Alist 存储服务器。

    +

    Alist 是一个支持多种存储的文件列表程序,可将各种云盘及本地磁盘资源进行整合。

    +

    建议不要开放匿名用户访问,尽量使用独立账号管理,需要关闭 “签名所有” 让文件可以直接访问。

    +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.alist_http_protocol')}{php}sysconf('storage.alist_http_protocol','http');{/php}{/if} +
    + {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} + + {/foreach} +
    +

    请选择 Alist 存储访问协议,其中 HTTPS 需要配置证书才能使用( AUTO 为相对协议 )

    +
    +
    + +
    + +
    + +

    请填写 Alist 存储访问域名,不需要填写访问协议,如:storage.thinkadmin.top

    +
    +
    + +
    + +
    + +

    请填写 Alist 用户基本目录的相对存储位置,填写 / 表示用户基本目录( 需要拥有读写权限 )

    +
    +
    + +
    + +
    + +

    请填写 Alist 用户账号,注意此账号需要拥有上面存储目录的访问权限。

    +
    +
    + +
    + +
    + +

    请填写 Alist 用户登录密码,用于生成文件上传的接口认证令牌,如果填写错误将无法上传文件。

    +
    +
    + +
    + + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-local.html b/app/admin/view/config/storage-local.html new file mode 100644 index 0000000..1b1386f --- /dev/null +++ b/app/admin/view/config/storage-local.html @@ -0,0 +1,51 @@ +
    +
    + +
    +

    文件将存储在本地服务器,默认保存在 public/upload 目录,文件以 HASH 命名。

    +

    文件存储的目录需要有读写权限,有足够的存储空间。特别注意,本地存储暂不支持图片压缩!

    +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.local_http_protocol')}{php}sysconf('storage.local_http_protocol','follow');{/php}{/if} +
    + {foreach ['follow'=>'FOLLOW','http'=>'HTTP','https'=>'HTTPS','path'=>'PATH','auto'=>'AUTO'] as $protocol=>$remark} + + {/foreach} +
    +

    本地存储访问协议,其中 HTTPS 需要配置证书才能使用( FOLLOW 跟随系统,PATH 文件路径,AUTO 相对协议 )

    +
    +
    + +
    + +
    + +

    填写上传后的访问域名(不指定时根据当前访问地址自动计算),不需要填写访问协议,如:static.thinkadmin.top

    +
    +
    + +
    + + +
    + + +
    + +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-qiniu.html b/app/admin/view/config/storage-qiniu.html new file mode 100644 index 0000000..9bc4aaf --- /dev/null +++ b/app/admin/view/config/storage-qiniu.html @@ -0,0 +1,97 @@ +
    +
    + +
    +

    文件将上传到 七牛云 存储,对象存储需要配置为公开访问的 Bucket 空间

    + 完成实名认证后可获得 10G 免费存储空间哦!我要免费申请 +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.qiniu_http_protocol')}{php}sysconf('storage.qiniu_http_protocol','http');{/php}{/if} +
    + {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} + + {/foreach} +
    +

    七牛云存储访问协议,其中 HTTPS 需要配置证书才能使用( AUTO 为相对协议 )

    +
    +
    + +
    + +
    + +

    七牛云存储空间所在区域,需要严格对应储存所在区域才能上传文件

    +
    +
    + +
    + +
    + +

    填写七牛云存储空间名称,如:static

    +
    +
    + +
    + +
    + +

    填写七牛云存储访问域名,不需要填写访问协议,如:static.qiniu.thinkadmin.top

    +
    +
    + +
    + +
    + +

    可以在 [ 七牛云 > 个人中心 ] 设置并获取到访问密钥

    +
    +
    + +
    + +
    + +

    可以在 [ 七牛云 > 个人中心 ] 设置并获取到安全密钥

    +
    +
    + +
    + + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-txcos.html b/app/admin/view/config/storage-txcos.html new file mode 100644 index 0000000..06d8d72 --- /dev/null +++ b/app/admin/view/config/storage-txcos.html @@ -0,0 +1,96 @@ +
    +
    + +
    +

    文件将上传到 腾讯云 COS 存储,需要配置 COS 公有读私有写访问权限及跨域策略

    +

    配置跨域访问 CORS 规则,设置来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

    +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.txcos_http_protocol')}{php}sysconf('storage.txcos_http_protocol','http');{/php}{/if} + {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} + + {/foreach} +

    腾讯云COS存储访问协议,其中 HTTPS 需要配置证书才能使用( AUTO 为相对协议 )

    +
    +
    + +
    + +
    + +

    腾讯云COS存储空间所在区域,需要严格对应储存所在区域才能上传文件

    +
    +
    + +
    + +
    + +

    填写腾讯云COS存储空间名称,如:thinkadmin-1251143395

    +
    +
    + +
    + +
    + +

    填写腾讯云COS存储外部访问域名,不需要填写访问协议,如:static.txcos.thinkadmin.top

    +
    +
    + +
    + +
    + +

    可以在 [ 腾讯云 > 个人中心 ] 设置并获取到访问密钥

    +
    +
    + +
    + +
    + +

    可以在 [ 腾讯云 > 个人中心 ] 设置并获取到安全密钥

    +
    +
    + +
    + + +
    + + +
    + +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/storage-upyun.html b/app/admin/view/config/storage-upyun.html new file mode 100644 index 0000000..71043fe --- /dev/null +++ b/app/admin/view/config/storage-upyun.html @@ -0,0 +1,81 @@ +
    +
    + +
    +

    文件将上传到 又拍云 USS 存储,需要配置 USS 公开访问及跨域策略

    +

    配置跨域访问 CORS 规则,设置来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

    +
    + + {include file='config/storage-0'} + +
    + +
    + {if !sysconf('storage.upyun_http_protocol')}{php}sysconf('storage.upyun_http_protocol','http');{/php}{/if} +
    + {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} + + {/foreach} +
    +

    又拍云存储访问协议,其中 HTTPS 需要配置证书才能使用(AUTO 为相对协议)

    +
    +
    + +
    + +
    + +

    填写又拍云存储空间名称,如:think-admin-uss(需要是全区唯一的值,不存在时会自动创建)

    +
    +
    + +
    + +
    + +

    填写又拍云存储外部访问域名,不需要填写访问协议,如:static.uss.thinkadmin.top

    +
    +
    + +
    + +
    + +

    可以在 [ 账户管理 > 操作员 ] 设置操作员账号并将空间给予授权。

    +
    +
    + +
    + +
    + +

    可以在 [ 账户管理 > 操作员 ] 设置操作员密码并将空间给予授权

    +
    +
    + +
    + + +
    + + +
    + +
    +
    \ No newline at end of file diff --git a/app/admin/view/config/system.html b/app/admin/view/config/system.html new file mode 100644 index 0000000..1b7c7c5 --- /dev/null +++ b/app/admin/view/config/system.html @@ -0,0 +1,129 @@ +
    +
    + +
    +
    + +
    +
    +
    后台登录入口Login Entry
    + +
    +
    +
    后台默认配色Theme Style
    + +
    +
    + 后台登录入口是由英文字母开头,且不能有相同名称的模块,设置之后原地址不能继续访问,请谨慎配置 ~ +
    +
    + +
    +
    登录背景图片Background Image
    +
    + +
    +
    + +
    +
    JWT 接口密钥Jwt Key
    + +
    + 请输入 32JWT 接口密钥,在使用 JWT 接口时需要使用此密钥进行加密及签名! +
    +
    + +
    +
    浏览器小图标Browser Icon
    +
    + + +
    +
    + 建议上传 128x128256x256JPG,PNG,JPEG 图片,保存后会自动生成 48x48ICO 文件 ~ +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + 网站备案号和公安备案号可以在备案管理中心查询并获取,网站上线时必需配置备案号,备案号会链接到信息备案管理系统 ~ +
    +
    +
    + +
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/app/admin/view/error.php b/app/admin/view/error.php new file mode 100644 index 0000000..c8504db --- /dev/null +++ b/app/admin/view/error.php @@ -0,0 +1,568 @@ +' . end($names) . ''; + } +} + +if (!function_exists('parse_file')) { + function parse_file($file, $line): string + { + return '' . basename($file) . " line {$line}" . ''; + } +} + +if (!function_exists('parse_args')) { + function parse_args($args): string + { + $result = []; + foreach ($args as $key => $item) { + switch (true) { + case is_object($item): + $value = sprintf('object(%s)', parse_class(get_class($item))); + break; + case is_array($item): + if (count($item) > 3) { + $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); + } else { + $value = sprintf('[%s]', parse_args($item)); + } + break; + case is_string($item): + if (strlen($item) > 20) { + $value = sprintf( + '\'%s...\'', + htmlentities($item), + htmlentities(substr($item, 0, 20)) + ); + } else { + $value = sprintf("'%s'", htmlentities($item)); + } + break; + case is_int($item): + case is_float($item): + $value = $item; + break; + case is_null($item): + $value = 'null'; + break; + case is_bool($item): + $value = '' . ($item ? 'true' : 'false') . ''; + break; + case is_resource($item): + $value = 'resource'; + break; + default: + $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); + break; + } + + $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; + } + + return implode(', ', $result); + } +} +if (!function_exists('echo_value')) { + function echo_value($val) + { + if (is_array($val) || is_object($val)) { + echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); + } elseif (is_bool($val)) { + echo $val ? 'true' : 'false'; + } elseif (is_scalar($val)) { + echo htmlentities($val); + } else { + echo 'Resource'; + } + } +} +?> + + + + + 系统发生错误 + + + + + + $trace) { ?> +
    +
    +
    +
    +

    +
    +

    +
    +
    + +
    +
    +
    1. ">
    +
    +
    + +
    +

    Call Stack

    +
      +
    1. + +
    2. + +
    3. + +
    +
    +
    + + +
    +

    +
    + + + +
    +

    Exception Datas

    + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
    empty
    + +
    + + + +
    +

    Environment Variables

    + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
    empty
    + +
    + + + + + + + diff --git a/app/admin/view/file/form.html b/app/admin/view/file/form.html new file mode 100644 index 0000000..afdcecb --- /dev/null +++ b/app/admin/view/file/form.html @@ -0,0 +1,40 @@ +
    + +
    + + + + + + + + + + + + +
    + +
    + {notempty name='vo.id'}{/notempty} + +
    + + +
    +
    \ No newline at end of file diff --git a/app/admin/view/file/index.html b/app/admin/view/file/index.html new file mode 100644 index 0000000..349c35a --- /dev/null +++ b/app/admin/view/file/index.html @@ -0,0 +1,64 @@ +{extend name='table'} + +{block name="button"} + +{:lang('清理重复')} + + +{:lang('批量删除')} + +{/block} + +{block name="content"} +
    + {include file='file/index_search'} +
    +
    + + + +{/block} diff --git a/app/admin/view/file/index_search.html b/app/admin/view/file/index_search.html new file mode 100644 index 0000000..9cf0a9e --- /dev/null +++ b/app/admin/view/file/index_search.html @@ -0,0 +1,58 @@ +
    + {:lang('条件搜索')} + +
    \ No newline at end of file diff --git a/app/admin/view/full.html b/app/admin/view/full.html new file mode 100644 index 0000000..c76f00e --- /dev/null +++ b/app/admin/view/full.html @@ -0,0 +1,32 @@ + + + + {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} + + + + + + + + + + + + {block name="style"}{/block} + + + + +{block name='body'} +
    +
    {block name='content'}{/block}
    +
    +{/block} + + + + +{block name='script'}{/block} + + \ No newline at end of file diff --git a/app/admin/view/index/index-left.html b/app/admin/view/index/index-left.html new file mode 100644 index 0000000..bea9c37 --- /dev/null +++ b/app/admin/view/index/index-left.html @@ -0,0 +1,50 @@ +
    + + +
    +
    + {foreach $menus as $one} +
    + + {notempty name='one.icon'}{/notempty} + {$one.title|default=''} + +
    + {/foreach} +
    +
    + {foreach $menus as $one}{notempty name='one.sub'} + + {/notempty}{/foreach} +
    +
    +
    diff --git a/app/admin/view/index/index-top.html b/app/admin/view/index/index-top.html new file mode 100644 index 0000000..e1f9505 --- /dev/null +++ b/app/admin/view/index/index-top.html @@ -0,0 +1,49 @@ +
    + + +
    \ No newline at end of file diff --git a/app/admin/view/index/index.html b/app/admin/view/index/index.html new file mode 100644 index 0000000..f2bc08a --- /dev/null +++ b/app/admin/view/index/index.html @@ -0,0 +1,62 @@ + + + + + {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} + + + + + + + + + + + + {block name="style"}{/block} + + + + + + +{block name='body'} +
    + + + {include file="index/index-left"} + + + + {include file='index/index-top'} + + + +
    +
    + {block name='content'}{/block} +
    + +
    +
    +
    +
    + +
    + + +
    +
    +
    + + +{/block} + + + + +{block name='script'}{/block} + + + \ No newline at end of file diff --git a/app/admin/view/index/theme.html b/app/admin/view/index/theme.html new file mode 100644 index 0000000..870d7ca --- /dev/null +++ b/app/admin/view/index/theme.html @@ -0,0 +1,36 @@ +
    +
    + +
    +
    后台配色方案Theme Style
    +
    + {foreach $themes as $k=>$v} + + {/foreach} +
    +

    切换配色方案,需要保存成功后配色方案才会永久生效,下次登录也会有效哦 ~

    +
    +
    + +
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/app/admin/view/login/index.html b/app/admin/view/login/index.html new file mode 100644 index 0000000..c78dc64 --- /dev/null +++ b/app/admin/view/login/index.html @@ -0,0 +1,57 @@ +{extend name="index/index"} + +{block name='style'} + + + +{/block} + +{block name="body"} +
    +
    + {:sysconf('app_name')}{:sysconf('app_version')} + {notempty name='runtimeMode'} + + Fork me on Gitee + + {/notempty} +
    +
    +

    {:sysconf('login_name')?:'系统管理'}

    +
      +
    • + +
    • +
    • + +
    • +
    • + + +
    • +
    • + +
    • +
    +
    + +
    +{/block} + +{block name='script'} + +{/block} \ No newline at end of file diff --git a/app/admin/view/main.html b/app/admin/view/main.html new file mode 100644 index 0000000..a698dd7 --- /dev/null +++ b/app/admin/view/main.html @@ -0,0 +1,23 @@ +
    + {block name='style'}{/block} + {block name='header'} + {notempty name='title'} +
    + {$title|lang} +
    {block name='button'}{/block}
    +
    + {/notempty} + {/block} +
    +
    +
    + {notempty name='showErrorMessage'} +
    + {:lang('系统提示:')}{$showErrorMessage|raw} +
    + {/notempty} + {block name='content'}{/block} +
    +
    + {block name='script'}{/block} +
    \ No newline at end of file diff --git a/app/admin/view/menu/form.html b/app/admin/view/menu/form.html new file mode 100644 index 0000000..609b34a --- /dev/null +++ b/app/admin/view/menu/form.html @@ -0,0 +1,97 @@ +
    + +
    + +
    + +
    + +

    必选,请选择上级菜单或顶级菜单 ( 目前最多支持三级菜单 )

    +
    +
    + +
    + +
    + +

    必选,请填写菜单名称 ( 如:系统管理 ),建议字符不要太长,一般 4-6 个汉字

    +
    +
    + +
    + +
    + +

    + 必选,请填写链接地址或选择系统节点 ( 如:https://domain.com/admin/user/index.html 或 admin/user/index ) +
    当填写链接地址时,以下面的 “权限节点” 来判断菜单自动隐藏或显示,注意未填写 “权限节点” 时将不会隐藏该菜单哦 +

    +
    +
    + +
    + +
    + +

    可选,设置菜单链接的 GET 访问参数 ( 如:name=1&age=3 )

    +
    +
    + +
    + +
    + +

    可选,请填写系统权限节点 ( 如:admin/user/index ),未填写时默认解释"菜单链接"判断是否拥有访问权限;

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

    可选,设置菜单选项前置图标,目前支持 layui 字体图标及 iconfont 定制字体图标。

    +
    +
    + +
    + +
    + {notempty name='vo.id'}{/notempty} + +
    + + +
    +
    + + \ No newline at end of file diff --git a/app/admin/view/menu/index.html b/app/admin/view/menu/index.html new file mode 100644 index 0000000..787ffc6 --- /dev/null +++ b/app/admin/view/menu/index.html @@ -0,0 +1,114 @@ +{extend name='table'} + +{block name="button"} + + + + + + + + + + + +{/block} + +{block name="content"} +
    + +
    + +
    +
    + + + + + + + + + + + +{/block} \ No newline at end of file diff --git a/app/admin/view/oplog/index.html b/app/admin/view/oplog/index.html new file mode 100644 index 0000000..d4277e1 --- /dev/null +++ b/app/admin/view/oplog/index.html @@ -0,0 +1,48 @@ +{extend name='table'} + +{block name="button"} + + + + + + + +{/block} + +{block name="content"} +
    + {include file='oplog/index_search'} +
    +
    +{/block} + +{block name='script'} + + + +{/block} \ No newline at end of file diff --git a/app/admin/view/oplog/index_search.html b/app/admin/view/oplog/index_search.html new file mode 100644 index 0000000..c955ed8 --- /dev/null +++ b/app/admin/view/oplog/index_search.html @@ -0,0 +1,87 @@ +
    + {:lang('条件搜索')} + +
    + + \ No newline at end of file diff --git a/app/admin/view/queue/index.html b/app/admin/view/queue/index.html new file mode 100644 index 0000000..bd1c0f5 --- /dev/null +++ b/app/admin/view/queue/index.html @@ -0,0 +1,131 @@ +{extend name='table'} + +{block name="button"} + +{if isset($super) and $super} + +{:lang('优化数据库')} + +{if isset($iswin) and ($iswin or php_sapi_name() eq 'cli')} + + +{/if} + +{if auth("clean")} + +{/if} + +{/if} + +{if auth("remove")} + +{/if} + +{/block} + +{block name="content"} +
    + + + {:lang('服务状态')}:{:lang('检查中')} + + + + + {:lang('任务统计')}:{:lang('待处理 %s 个任务,处理中 %s 个任务,已完成 %s 个任务,已失败 %s 个任务。', [ + '..', + '..', + '..', + '..' + ])} + +
    + +
    + {include file='queue/index_search'} +
    +
    +{/block} + +{block name='script'} + + + +{/block} diff --git a/app/admin/view/queue/index_search.html b/app/admin/view/queue/index_search.html new file mode 100644 index 0000000..bd79d6b --- /dev/null +++ b/app/admin/view/queue/index_search.html @@ -0,0 +1,45 @@ +
    + {:lang('条件搜索')} + +
    \ No newline at end of file diff --git a/app/admin/view/table.html b/app/admin/view/table.html new file mode 100644 index 0000000..fef73fe --- /dev/null +++ b/app/admin/view/table.html @@ -0,0 +1,23 @@ +
    + {block name='style'}{/block} + {block name='header'} + {notempty name='title'} +
    + {$title|lang} +
    {block name='button'}{/block}
    +
    + {/notempty} + {/block} +
    +
    +
    + {notempty name='showErrorMessage'} +
    + {:lang('系统提示:')}{$showErrorMessage|raw} +
    + {/notempty} + {block name='content'}{/block} +
    +
    + {block name='script'}{/block} +
    \ No newline at end of file diff --git a/app/admin/view/user/form.html b/app/admin/view/user/form.html new file mode 100644 index 0000000..d7eadce --- /dev/null +++ b/app/admin/view/user/form.html @@ -0,0 +1,114 @@ +
    +
    + +
    + 用户账号 + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    + + {if !empty($bases) || !empty($auths)} +
    + 用户权限 + {if !empty($bases)} +
    +
    角色身份Role Identity
    +
    + {foreach $bases as $base} + + {/foreach} +
    +
    + {/if} + {if !empty($auths)} +
    +
    访问权限Role Permission
    +
    + {if isset($vo.username) and $vo.username eq $super} + 超级用户拥所有访问权限,不需要配置权限。 + {else}{foreach $auths as $authorize} + + {/foreach}{/if} +
    +
    + {/if} +
    + {/if} + +
    + 用户资料 +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + {notempty name='vo.id'}{/notempty} + +
    + + +
    +
    \ No newline at end of file diff --git a/app/admin/view/user/index.html b/app/admin/view/user/index.html new file mode 100644 index 0000000..1182d2b --- /dev/null +++ b/app/admin/view/user/index.html @@ -0,0 +1,116 @@ +{extend name='table'} + +{block name="button"} +{if isset($type) and $type eq 'index'} + + + + +{:lang('批量禁用')} + +{else} + +{:lang('批量恢复')} + + +{:lang('批量删除')} + +{/if} +{/block} + +{block name="content"} +
    + +
    + {include file='user/index_search'} +
    +
    +
    + + + + + + + + + +{/block} diff --git a/app/admin/view/user/index_search.html b/app/admin/view/user/index_search.html new file mode 100644 index 0000000..793f1e0 --- /dev/null +++ b/app/admin/view/user/index_search.html @@ -0,0 +1,44 @@ + \ No newline at end of file diff --git a/app/admin/view/user/pass.html b/app/admin/view/user/pass.html new file mode 100644 index 0000000..f281523 --- /dev/null +++ b/app/admin/view/user/pass.html @@ -0,0 +1,40 @@ +
    +
    + + + + + + + + + + + + +
    + +
    + {notempty name='vo.id'}{/notempty} + +
    + + +
    +
    \ No newline at end of file diff --git a/app/index/controller/Index.php b/app/index/controller/Index.php new file mode 100644 index 0000000..dea445d --- /dev/null +++ b/app/index/controller/Index.php @@ -0,0 +1,27 @@ +redirect(sysuri('admin/login/index')); + } +} diff --git a/app/manager/controller/Base.php b/app/manager/controller/Base.php new file mode 100644 index 0000000..b230891 --- /dev/null +++ b/app/manager/controller/Base.php @@ -0,0 +1,21 @@ +fetch(); + } +} \ No newline at end of file diff --git a/app/manager/controller/Index.php b/app/manager/controller/Index.php new file mode 100644 index 0000000..81fd7f4 --- /dev/null +++ b/app/manager/controller/Index.php @@ -0,0 +1,35 @@ +assign("userid", $userid); + + + $this->fetch(); + + + } +} diff --git a/app/manager/controller/Member.php b/app/manager/controller/Member.php new file mode 100644 index 0000000..d2843c0 --- /dev/null +++ b/app/manager/controller/Member.php @@ -0,0 +1,216 @@ +title = '会员管理'; + if ($this->request->isGet() && $this->request->get('output') === 'layui.table') { + $where = []; + // 搜索条件 + $keyword = input('keyword', '', 'trim'); + if (!empty($keyword)) { + $where[] = ['email|order_id', 'like', "%{$keyword}%"]; + } + // 状态筛选 + $status = input('status', '', 'trim'); + if ($status !== '') { + $where[] = ['status', '=', intval($status)]; + } + + // 查询数据 + $query = MemberModel::where($where)->order('id desc'); + $result = $query->paginate([ + 'list_rows' => input('limit', 20), + 'page' => input('page', 1), + ]); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $result->total(), + 'data' => $result->items() + ]); + } + + return $this->fetch(); + } + + /** + * 添加会员 + * @auth true + */ + public function add() + { + if ($this->request->isPost()) { + $data = $this->_vali([ + 'email.require' => '邮箱不能为空!', + 'email.email' => '邮箱格式错误!', + 'order_id.require' => '闲鱼订单号不能为空!', + 'expire_time.require' => '有效期不能为空!', + 'usage_limit.require' => '可用次数不能为空!', + 'usage_limit.number' => '可用次数必须为数字!', + ]); + + // 检查唯一性 + $map = [ + ['email', '=', $data['email']] + ]; + if (MemberModel::where($map)->count() > 0) { + $this->error('邮箱已存在!'); + } + + $map = [ + ['order_id', '=', $data['order_id']] + ]; + if (MemberModel::where($map)->count() > 0) { + $this->error('闲鱼订单号已存在!'); + } + + // 设置默认值 + $data['status'] = isset($data['status']) ? 1 : 0; + $data['used_count'] = 0; + + // 保存数据 + if (MemberModel::create($data) !== false) { + $this->success('添加成功!'); + } else { + $this->error('添加失败!'); + } + } + + $this->title = '添加会员'; + return $this->fetch('form'); + } + + /** + * 编辑会员 + * @auth true + */ + public function edit() + { + $id = input('id'); + if (empty($id)) $this->error('参数错误!'); + + if ($this->request->isPost()) { + $data = $this->_vali([ + 'id.require' => 'ID不能为空!', + 'email.require' => '邮箱不能为空!', + 'email.email' => '邮箱格式错误!', + 'order_id.require' => '闲鱼订单号不能为空!', + 'expire_time.require' => '有效期不能为空!', + 'usage_limit.require' => '可用次数不能为空!', + 'usage_limit.number' => '可用次数必须为数字!', + ]); + + // 检查唯一性 + $map = [ + ['email', '=', $data['email']], + ['id', '<>', $id] + ]; + if (MemberModel::where($map)->count() > 0) { + $this->error('邮箱已存在!'); + } + + $map = [ + ['order_id', '=', $data['order_id']], + ['id', '<>', $id] + ]; + if (MemberModel::where($map)->count() > 0) { + $this->error('闲鱼订单号已存在!'); + } + + // 设置默认值 + $data['status'] = isset($data['status']) ? 1 : 0; + $data['used_count'] = isset($data['used_count']) ? intval($data['used_count']) : 0; + + // 保存数据 + if (MemberModel::update($data) !== false) { + $this->success('编辑成功!'); + } else { + $this->error('编辑失败!'); + } + } + + $this->title = '编辑会员'; + $this->member = MemberModel::find($id); + return $this->fetch('form'); + } + + /** + * 修改状态 + * @auth true + */ + public function state() + { + MemberModel::mSave($this->_vali([ + 'status.in:0,1' => '状态值范围异常!', + 'status.require' => '状态值不能为空!', + ])); + } + + /** + * 删除会员 + * @auth true + */ + public function remove() + { + MemberModel::mDelete(); + } + + /** + * 表单数据处理 + * @param array $data + */ + protected function _form_filter(array &$data) + { + if ($this->request->isPost()) { + // 检查数据完整性 + empty($data['username']) && $this->error('用户名不能为空!'); + empty($data['order_id']) && $this->error('闲鱼订单号不能为空!'); + empty($data['expire_time']) && $this->error('有效期不能为空!'); + + // 检查唯一性 + $map = []; + if (empty($data['id'])) { + $map[] = ['username', '=', $data['username']]; + $map[] = ['order_id', '=', $data['order_id']]; + if (MemberModel::where($map)->count() > 0) { + $this->error('用户名或闲鱼订单号已存在!'); + } + } else { + $map[] = ['id', '<>', $data['id']]; + $map[] = ['username|order_id', '=', $data['username']]; + if (MemberModel::where($map)->count() > 0) { + $this->error('用户名或闲鱼订单号已存在!'); + } + } + + // 设置默认值 + $data['status'] = isset($data['status']) ? 1 : 0; + $data['used_count'] = isset($data['used_count']) ? intval($data['used_count']) : 0; + $data['balance'] = isset($data['balance']) ? floatval($data['balance']) : 0; + $data['points'] = isset($data['points']) ? intval($data['points']) : 0; + $data['level'] = isset($data['level']) ? intval($data['level']) : 1; + } + } +} \ No newline at end of file diff --git a/app/manager/controller/Package.php b/app/manager/controller/Package.php new file mode 100644 index 0000000..925dde2 --- /dev/null +++ b/app/manager/controller/Package.php @@ -0,0 +1,503 @@ +isSuper()) { + return true; + } + + // 检查用户是否有包名管理模块的权限 + if (!AdminService::instance()->check('package/index')) { + return false; + } + + // 检查具体包名权限 + $userId = AdminService::instance()->getUserId(); + $exists = $this->app->db->name('offer_package_auth') + ->where(['package_id' => $packageId, 'user_id' => $userId]) + ->find(); + + return !empty($exists); + } + + /** + * 获取当前用户可访问的包名ID列表 + */ + protected function getAuthPackageIds() + { + // 超级管理员可以访问所有 + if (AdminService::instance()->isSuper()) { + return []; + } + + // 如果没有包名管理模块权限,则不能访问任何包名 + if (!AdminService::instance()->check('package/index')) { + return [-1]; + } + + // 获取用户被授权的包名列表 + $userId = AdminService::instance()->getUserId(); + $packageIds = $this->app->db->name('offer_package_auth') + ->where(['user_id' => $userId]) + ->column('package_id'); + + return $packageIds ?: [-1]; + } + + /** + * 包名列表 + * @auth true # 需要验证权限 + * @menu true # 菜单可见 + */ + public function index() + { + + if ($this->request->isPost()) { + + try { + // 获取请求参数 + $page = $this->request->post('page/d', 1); + $limit = $this->request->post('limit/d', 15); + $where = []; + + // 包名搜索 + if ($package_name = $this->request->post('package_name/s', '')) { + $where[] = ['package_name', 'like', "%{$package_name}%"]; + } + + // 应用名称搜索 + if ($name = $this->request->post('name/s', '')) { + $where[] = ['name', 'like', "%{$name}%"]; + } + + // 状态筛选 + if ($status = $this->request->post('status/s', '')) { + $where[] = ['status', '=', $status]; + } + + // 创建人搜索 + if ($username = $this->request->post('username/s', '')) { + $where[] = ['username', 'like', "%{$username}%"]; + } + + // 时间范围处理 + if ($add_time = $this->request->post('add_time/s', '')) { + $times = explode(' - ', $add_time); + if (count($times) == 2) { + $start_time = strtotime($times[0] . ' 00:00:00'); + $end_time = strtotime($times[1] . ' 23:59:59'); + $where[] = ['add_time', 'between', [$start_time, $end_time]]; + } + } + + // 查询数据 + $query = $this->app->db->name('offer_package')->alias('p'); + + // 非超级管理员需要进行权限过滤 + if (!AdminService::instance()->isSuper()) { + // 检查包名管理模块权限 + if (!AdminService::instance()->check('package/index')) { + return json([ + 'code' => 0, + 'msg' => '', + 'count' => 0, + 'data' => [] + ]); + } + + $userId = AdminService::instance()->getUserId(); + // 通过左连接查询有权限的包名 + $query->leftJoin('offer_package_auth pa', 'p.id = pa.package_id') + ->where('pa.user_id', $userId); + } + + // 先获取总数 + $total = $query->where($where)->count(); + + // 分页查询数据 + $list = $query->where($where) + ->field('p.*') // 只查询包名表的字段 + ->order('p.id desc') + ->group('p.id') // 防止重复数据 + ->page($page, $limit) + ->select() + ->toArray(); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + + } catch (\Exception $e) { + trace("获取包名列表异常:" . $e->getMessage()); + return json([ + 'code' => 1, + 'msg' => '获取数据失败,请稍后重试', + 'count' => 0, + 'data' => [] + ]); + } + } + + $this->fetch(); + } + + /** + * 添加包名 + * @auth true + * @menu true + */ + public function add() + { + + if ($this->request->isPost()) { + // 开启事务 + $this->app->db->startTrans(); + try { + $data = $this->_vali([ + 'package_name.require' => '包名不能为空!', + 'name.require' => '应用名称不能为空!', + 'status.require' => '状态不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 检查包名是否已存在 + $exists = $this->app->db->name('offer_package') + ->where(['package_name' => $data['package_name']]) + ->find(); + if ($exists) { + $this->app->db->rollback(); + return json(['code' => 0, 'info' => '包名已存在,请更换!']); + } + + // 添加时间字段 + $now = time(); + $data['add_time'] = $now; + $data['update_time'] = $now; + $data['username'] = session('user.username') ?? ''; + + // 插入包名数据 + $result = $this->app->db->name('offer_package')->insertGetId($data); + if ($result === false) { + $this->app->db->rollback(); + return json(['code' => 0, 'info' => '添加失败,请重试!']); + } + + // 非超级管理员需要添加权限记录 + if (!AdminService::instance()->isSuper()) { + $authData = [ + 'package_id' => $result, + 'user_id' => AdminService::instance()->getUserId(), + 'create_at' => date('Y-m-d H:i:s') + ]; + $authResult = $this->app->db->name('offer_package_auth')->insert($authData); + if ($authResult === false) { + $this->app->db->rollback(); + return json(['code' => 0, 'info' => '添加权限记录失败!']); + } + } + + $this->app->db->commit(); + sysoplog('积分墙列表', '添加成功'); + + return json(['code' => 1, 'info' => '添加成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + trace("添加包名异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 编辑包名 + * @auth true + * @menu true + */ + public function edit() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'id.require' => '记录ID不能为空!', + 'package_name.require' => '包名不能为空!', + 'name.require' => '应用名称不能为空!', + 'status.require' => '状态不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 检查权限 + if (!$this->checkPackageAuth($data['id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 检查包名是否已存在(排除当前记录) + $exists = $this->app->db->name('offer_package') + ->where('package_name', $data['package_name']) + ->where('id', '<>', $data['id']) + ->find(); + if ($exists) { + return json(['code' => 0, 'info' => '包名已存在,请更换!']); + } + + // 更新时间 + $data['update_time'] = time(); + $data['username'] = session('user.username') ?? ''; + + $result = $this->app->db->name('offer_package') + ->where(['id' => $data['id']]) + ->update($data); + if ($result === false) { + return json(['code' => 0, 'info' => '更新失败,请重试!']); + } + sysoplog('积分墙列表', '更新成功'); + + return json(['code' => 1, 'info' => '更新成功!']); + } catch (\Exception $e) { + trace("编辑包名异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 删除包名 + * @auth true + * @menu true + */ + public function remove() + { + if ($this->request->isPost()) { + // 开启事务 + $this->app->db->startTrans(); + try { + $id = $this->request->param('id'); + if (empty($id)) { + return json(['code' => 0, 'info' => '参数错误,请刷新重试!']); + } + + // 检查权限 + if (!$this->checkPackageAuth($id)) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 删除包名记录 + $result = $this->app->db->name('offer_package') + ->where(['id' => $id]) + ->delete(); + if ($result === false) { + $this->app->db->rollback(); + return json(['code' => 0, 'info' => '删除失败,请重试!']); + } + + // 同步删除权限表中的相关记录 + $this->app->db->name('offer_package_auth') + ->where(['package_id' => $id]) + ->delete(); + + $this->app->db->commit(); + sysoplog('积分墙列表', '删除成功'); + + return json(['code' => 1, 'info' => '删除成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + trace("删除包名异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 切换状态 + * @auth true + * @menu true + */ + public function state() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'id.require' => '记录ID不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 检查权限 + if (!$this->checkPackageAuth($data['id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 检查记录是否存在 + $exists = $this->app->db->name('offer_package') + ->where(['id' => $data['id']]) + ->find(); + + if (empty($exists)) { + return json(['code' => 0, 'info' => '记录不存在!']); + } + + // 更新状态 + $updateData = [ + 'status' => $data['status'], + 'update_time' => time(), + 'username' => session('user.username') ?? '' + ]; + + $result = $this->app->db->name('offer_package') + ->where(['id' => $data['id']]) + ->update($updateData); + + if ($result === false) { + return json(['code' => 0, 'info' => '状态更新失败,请重试!']); + } + sysoplog('积分墙列表', '状态更新成功'); + + return json(['code' => 1, 'info' => '状态更新成功!']); + + } catch (\Exception $e) { + trace("状态切换异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 生成测试数据 + * @auth true + */ + public function generateTestData() + { + try { + // 设置执行时间为无限制 + set_time_limit(0); + ini_set('memory_limit', '1024M'); + + // 开启事务 + $this->app->db->startTrans(); + try { + $insertData = []; + $existPackages = []; + $total = 8000; // 总记录数 + $batchSize = 500; // 每批插入数量 + $startTime = time(); + + // 获取已存在的包名,避免重复 + $exists = $this->app->db->name($this->table) + ->column('package_name'); + $existPackages = array_flip($exists); + + // 预生成一些常用词,提高应用名称的真实性 + $prefixes = ['Super', 'My', 'Fast', 'Smart', 'Easy', 'Pro', 'Best', 'Quick']; + $suffixes = ['Browser', 'Player', 'Cleaner', 'Manager', 'Tool', 'Helper', 'App', 'Game']; + $domains = ['com', 'net', 'org', 'app', 'tech', 'io']; + + // 生成记录 + for ($i = 0; $i < $total; $i++) { + // 生成唯一包名 + do { + // 生成更真实的包名 xxx.xxx.xxx.xxx + $domain = $domains[array_rand($domains)]; + $company = $this->generateRandomString(rand(3, 8)); + $product = $this->generateRandomString(rand(3, 8)); + $module = $this->generateRandomString(rand(3, 8)); + $packageName = "{$domain}.{$company}.{$product}.{$module}"; + } while (isset($existPackages[$packageName])); + + $existPackages[$packageName] = 1; + + // 生成更真实的应用名称 + $prefix = $prefixes[array_rand($prefixes)]; + $suffix = $suffixes[array_rand($suffixes)]; + $appName = $prefix . ' ' . $suffix . ' ' . ($i + 1); + + // 生成数据 + $insertData[] = [ + 'package_name' => $packageName, + 'name' => $appName, + 'status' => rand(0, 1), // 随机状态 + 'add_time' => time() - rand(0, 86400 * 30), // 随机时间,最近30天内 + 'update_time' => time(), + 'username' => session('user.username') ?? 'system' + ]; + + // 批量插入 + if (count($insertData) >= $batchSize) { + $this->app->db->name($this->table)->insertAll($insertData); + $insertData = []; + + // 输出进度 + $progress = round(($i + 1) / $total * 100, 2); + trace("数据生成进度:{$progress}%"); + } + } + + // 插入剩余数据 + if (!empty($insertData)) { + $this->app->db->name($this->table)->insertAll($insertData); + } + + $endTime = time(); + $timeUsed = $endTime - $startTime; + + $this->app->db->commit(); + return json([ + 'code' => 1, + 'info' => "测试数据生成成功!共生成 {$total} 条记录,耗时 {$timeUsed} 秒" + ]); + } catch (\Exception $e) { + $this->app->db->rollback(); + throw $e; + } + } catch (\Exception $e) { + trace("生成测试数据异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 0, 'info' => '系统异常:' . $e->getMessage()]); + } + } + + /** + * 生成随机字符串 + * @param int $length 长度 + * @return string + */ + private function generateRandomString($length = 5) + { + // 添加数字,使包名更真实 + $characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; + $result = ''; + + // 第一个字符必须是字母 + $result .= $characters[rand(0, 25)]; + + // 生成剩余字符 + for ($i = 1; $i < $length; $i++) { + $result .= $characters[rand(0, strlen($characters) - 1)]; + } + return $result; + } +} \ No newline at end of file diff --git a/app/manager/controller/PackageAuth.php b/app/manager/controller/PackageAuth.php new file mode 100644 index 0000000..143e946 --- /dev/null +++ b/app/manager/controller/PackageAuth.php @@ -0,0 +1,918 @@ +request->isGet()) { + // 获取所有管理员(排除超级管理员) + $users = $this->app->db->name('system_user') + ->where([ + ['status', '=', 1], // 状态正常的用户 + ['authorize', 'not like', '%admin%'], // 排除admin权限组的用户 + ['id', '<>', '10000'] // 排除系统超管账号 + ]) + ->field('id,username,authorize') + ->order('id asc') + ->select() + ->filter(function($user) { + // 只显示有包名管理权限的用户 + return AdminService::instance()->check('package/index', $user['id']); + }) + ->toArray(); + + // 获取现有权限配置 + $auths = $this->app->db->name($this->table) + ->select() + ->toArray(); + + // 整理权限数据 + $authMap = []; + foreach ($auths as $auth) { + $authMap[$auth['user_id']][] = $auth['package_id']; + } + + $this->assign([ + 'users' => $users, + 'authMap' => $authMap + ]); + + $this->fetch(); + } + } + + /** + * 获取包名列表(分页) + * @auth true + */ + public function getPackageList() + { + if ($this->request->isPost()) { + try { + $page = $this->request->post('page/d', 1); + $limit = $this->request->post('limit/d', 20); + $keyword = $this->request->post('keyword/s', ''); + $startTime = $this->request->post('start_time/s', ''); + $endTime = $this->request->post('end_time/s', ''); + + $where = []; + // 只显示启用的包名 + $where[] = ['status', '=', 1]; + + if ($keyword !== '') { + $where[] = ['package_name|name', 'like', "%{$keyword}%"]; + } + + // 修改时间筛选条件处理方式 + if ($startTime && $endTime) { + $where[] = ['add_time', 'between', [ + strtotime($startTime), + strtotime($endTime) + ]]; + } + + // 使用正确的表名 + $query = $this->app->db->name('offer_package'); + + // 先获取总数 + $total = $query->where($where)->count(); + + // 获取列表数据 + $list = $query->where($where) + ->field('id,package_name,name,add_time,update_time,status') // 修改字段名 + ->order('id desc') + ->page($page, $limit) + ->select() + ->toArray(); + + // 格式化时间戳 + foreach ($list as &$item) { + $item['add_time'] = date('Y-m-d H:i:s', intval($item['add_time'])); + $item['update_time'] = date('Y-m-d H:i:s', intval($item['update_time'])); + } + + // 记录调试信息 + trace("包名列表查询:" . json_encode([ + 'where' => $where, + 'page' => $page, + 'limit' => $limit, + 'total' => $total, + 'list_count' => count($list), + 'sql' => $query->getLastSql() + ], JSON_UNESCAPED_UNICODE)); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + } catch (\Exception $e) { + // 详细记录异常信息 + trace("获取包名列表异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 获取用户包名权限 + * @auth true + * @api true + */ + public function getUserAuth() + { + if ($this->request->isPost()) { + try { + $userId = $this->request->post('user_id/d', 0); + + if (empty($userId)) { + return json(['code' => 0, 'info' => '请选择管理员!']); + } + + // 只获取包名ID列表 + $packageIds = $this->app->db->name($this->table) + ->where('user_id', $userId) + ->column('package_id'); // 直接返回ID数组 + + return json([ + 'code' => 1, + 'info' => '获取成功!', + 'data' => $packageIds // 直接返回ID数组,供 getPackageDetails 使用 + ]); + + } catch (\Exception $e) { + trace("获取用户权限异常:{$e->getMessage()}\n" . $e->getTraceAsString()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 批量授权 + * @auth true + */ + public function batchAuth() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'user_ids.require' => '请选择管理员!', + 'package_ids.require' => '请选择包名!' + ]); + + // 验证所选用户是否都有包名管理权限 + foreach ($data['user_ids'] as $userId) { + if (!AdminService::instance()->check('package/index', $userId)) { + return json(['code' => 0, 'info' => '选中的用户中有人没有包名管理权限!']); + } + } + + // 开启事务 + $this->app->db->startTrans(); + try { + foreach ($data['user_ids'] as $userId) { + // 删除原有权限 + $this->app->db->name($this->table) + ->where('user_id', $userId) + ->delete(); + + // 添加新权限 + $insertData = []; + foreach ($data['package_ids'] as $packageId) { + $insertData[] = [ + 'user_id' => $userId, + 'package_id' => $packageId, + 'create_at' => date('Y-m-d H:i:s') + ]; + } + + if (!empty($insertData)) { + $this->app->db->name($this->table)->insertAll($insertData); + } + } + + $this->app->db->commit(); + sysoplog('积分墙权限', '批量授权成功'); + + return json(['code' => 1, 'info' => '批量授权成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + throw $e; + } + } catch (\Exception $e) { + trace("批量授权异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重���!']); + } + } + } + + /** + * 清空 + * @auth true + */ + public function clearAuth() + { + if ($this->request->isPost()) { + try { + $post = $this->request->post(); + + // 验证用户ID + if (empty($post['user_ids']) || !is_array($post['user_ids'])) { + return json(['code' => 0, 'info' => '选择管理员!']); + } + + // 开启事务 + $this->app->db->startTrans(); + try { + foreach ($post['user_ids'] as $userId) { + // 删除用户的所有权限 + $this->app->db->name($this->table) + ->where('user_id', $userId) + ->delete(); + } + + $this->app->db->commit(); + sysoplog('积分墙权限', '权限清空成功'); + + return json(['code' => 1, 'info' => '权限清空成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + trace('清空权限事务异常:' . $e->getMessage()); + throw $e; + } + } catch (\Exception $e) { + trace("清空权限异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 获取包名详情 + */ + public function getPackageDetails() + { + if ($this->request->isPost()) { + try { + $packageIds = $this->request->post('package_ids/a', []); + + // 记录请求参数 + trace("getPackageDetails 请求参数:" . json_encode([ + 'package_ids' => $packageIds + ], JSON_UNESCAPED_UNICODE)); + + // 如果没有包名ID,返回空数组 + if (empty($packageIds)) { + trace("getPackageDetails:包名ID为空"); + return json([ + 'code' => 1, + 'info' => '获取成功!', + 'data' => [] + ]); + } + + // 获取包名详情 + $packages = $this->app->db->name('offer_package') + ->whereIn('id', $packageIds) + ->field('id,package_name,name,status') + ->select() + ->toArray(); + + return json([ + 'code' => 1, + 'info' => '获取成功!', + 'data' => $packages + ]); + + } catch (\Exception $e) { + trace("getPackageDetails 异常:" . $e->getMessage()); + trace("getPackageDetails 异常堆栈:" . $e->getTraceAsString()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!#3']); + } + } + } + + /** + * 获取未授权的包名列表 + * @auth true + */ + public function getUnauthorizedPackages() + { + // 同时支持 GET 和 POST 请求 + $userId = $this->request->param('user_id/d', 0); + $keyword = $this->request->param('keyword/s', ''); + $page = $this->request->param('page/d', 1); + $limit = $this->request->param('limit/d', 10); + + try { + if (empty($userId)) { + return json(['code' => 0, 'info' => '参数错误!']); + } + + // 获取已授权的包名ID + $authorizedIds = $this->app->db->name($this->table) + ->where('user_id', $userId) + ->column('package_id'); + + // 构建查询条件 + $where = []; + // 排除已授权的包名 + if (!empty($authorizedIds)) { + $where[] = ['id', 'not in', $authorizedIds]; + } + // 搜索条件 + if ($keyword !== '') { + $where[] = ['package_name|name', 'like', "%{$keyword}%"]; + } + // 只显示启用的包名 + $where[] = ['status', '=', 1]; + + // 查询数据 + $query = $this->app->db->name('offer_package'); + + // 获取总数 + $total = $query->where($where)->count(); + + // 获取列表 + $list = $query->where($where) + ->field('id,package_name,name,status') + ->order('status desc,id desc') + ->limit(($page - 1) * $limit, $limit) + ->select() + ->toArray(); + + // 记录调试信息 + trace('未授权包名查询:' . json_encode([ + 'user_id' => $userId, + 'keyword' => $keyword, + 'where' => $where, + 'sql' => $query->getLastSql(), + 'total' => $total, + 'list_count' => count($list) + ], JSON_UNESCAPED_UNICODE)); + + return json([ + 'code' => 0, // layui table 要求成功码为 0 + 'msg' => '', // layui table 使用 msg 而不是 info + 'count' => $total, + 'data' => $list + ]); + } catch (\Exception $e) { + trace("获取未授权包名异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']); // layui table 要求失败码为非 0 + } + } + + /** + * 批量添加授权 + * @auth true + */ + public function addAuth() + { + if ($this->request->isPost()) { + try { + $userId = $this->request->post('user_id/d', 0); + $packageIds = $this->request->post('package_ids/a'); + $isAll = $this->request->post('is_all/d', 0); // 是否全部授权 + + if (empty($userId)) { + return json(['code' => 0, 'info' => '参数错误!']); + } + + // 开启事务 + $this->app->db->startTrans(); + try { + if ($isAll) { + // 优化: 使用INSERT INTO SELECT语法直接插入 + $sql = "INSERT INTO {$this->table} (user_id, package_id, create_at) + SELECT :user_id, id, :create_at + FROM offer_package + WHERE status = 1 + AND id NOT IN ( + SELECT package_id + FROM {$this->table} + WHERE user_id = :user_id2 + )"; + + $this->app->db->execute($sql, [ + 'user_id' => $userId, + 'user_id2' => $userId, + 'create_at' => date('Y-m-d H:i:s') + ]); + } else { + if (empty($packageIds)) { + return json(['code' => 0, 'info' => '请选择要授权的包名!']); + } + + // 过滤掉已授权的包名 + $existIds = $this->app->db->name($this->table) + ->where('user_id', $userId) + ->whereIn('package_id', $packageIds) + ->column('package_id'); + + $newPackageIds = array_diff($packageIds, $existIds); + + if (!empty($newPackageIds)) { + $insertData = array_map(function($packageId) use ($userId) { + return [ + 'user_id' => $userId, + 'package_id' => $packageId, + 'create_at' => date('Y-m-d H:i:s') + ]; + }, $newPackageIds); + + $this->app->db->name($this->table)->insertAll($insertData); + } + } + + $this->app->db->commit(); + sysoplog('积分墙权限', '授权添加成功!'); + + return json(['code' => 1, 'info' => '授权添加成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + throw $e; + } + } catch (\Exception $e) { + trace("添加授权异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 移除单个包名权限 + * @auth true + */ + public function removeAuth() + { + if ($this->request->isPost()) { + try { + $userId = $this->request->post('user_id/d', 0); + $packageId = $this->request->post('package_id/d', 0); + + if (empty($userId) || empty($packageId)) { + return json(['code' => 0, 'info' => '参数错误!']); + } + + $result = $this->app->db->name($this->table) + ->where([ + 'user_id' => $userId, + 'package_id' => $packageId + ]) + ->delete(); + + if ($result !== false) { + sysoplog('积分墙权限', '权限移除成功!'); + + return json(['code' => 1, 'info' => '权限移除成功!']); + } else { + return json(['code' => 0, 'info' => '权限移除失败!']); + } + } catch (\Exception $e) { + trace("移除权限异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 首页批量授权保存 + * @auth true + */ + public function batchSaveAuth() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'user_ids.require' => '请选择管理员!', + 'package_ids.require' => '请选择包名!' + ]); + + // 开启事务 + $this->app->db->startTrans(); + try { + foreach ($data['user_ids'] as $userId) { + // 删除原有权限 + $this->app->db->name($this->table) + ->where('user_id', $userId) + ->delete(); + + // 添加新权限 + $insertData = []; + foreach ($data['package_ids'] as $packageId) { + $insertData[] = [ + 'user_id' => $userId, + 'package_id' => $packageId, + 'create_at' => date('Y-m-d H:i:s') + ]; + } + + if (!empty($insertData)) { + $this->app->db->name($this->table)->insertAll($insertData); + } + } + + $this->app->db->commit(); + sysoplog('积分墙权限', '批量授权成功!'); + + return json(['code' => 1, 'info' => '批量授权成功!']); + } catch (\Exception $e) { + $this->app->db->rollback(); + throw $e; + } + } catch (\Exception $e) { + trace("首页批量授权异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 批量移除包名权限 + * @auth true + */ + public function batchRemoveAuth() + { + if ($this->request->isPost()) { + try { + $userId = $this->request->post('user_id/d', 0); + $packageIds = $this->request->post('package_ids/a'); + + if (empty($userId) || empty($packageIds)) { + return json(['code' => 0, 'info' => '参数错误!']); + } + + // 开启事务 + $this->app->db->startTrans(); + try { + // 批量删除权限 + $result = $this->app->db->name($this->table) + ->where('user_id', $userId) + ->whereIn('package_id', $packageIds) + ->delete(); + + if ($result !== false) { + $this->app->db->commit(); + sysoplog('积分墙权限', '批量移除成功!'); + + return json(['code' => 1, 'info' => '批量移除成功!']); + } else { + $this->app->db->rollback(); + return json(['code' => 0, 'info' => '批量移除失败!']); + } + } catch (\Exception $e) { + $this->app->db->rollback(); + throw $e; + } + } catch (\Exception $e) { + trace("批移除权限异:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 显示权限详情页面 + * @auth true + */ + public function authDetail() + { + try { + $userId = input('user_id/d'); + if (!$userId) { + $this->error('参数错误'); + } + + // 获取用户基本信息 + $user = $this->app->db->name('system_user') + ->where('id', $userId) + ->field('id,username,status,create_at') + ->find(); + + if (!$user) { + $this->error('用户不存在'); + } + + // 获取用户权限统计 + $stats = [ + 'total' => $this->app->db->name($this->table) + ->where('user_id', $userId) + ->count(), + 'active' => $this->app->db->name('offer_package') + ->alias('p') + ->join("{$this->table} a", 'p.id = a.package_id') + ->where([ + 'a.user_id' => $userId, + 'p.status' => 1 + ]) + ->count() + ]; + + $this->assign([ + 'user' => $user, + 'stats' => $stats, + 'title' => '授权包名管理' + ]); + + return $this->fetch(); + } catch (\Exception $e) { + $this->app->log->error("显示权限详情页面异常:{$e->getMessage()}"); + $this->error('系统异常,请稍后重试!'); + } + } + + /** + * 获取权限详情数据 + * @auth true + * @api true + */ + public function getAuthDetailData() + { + try { + $get = $this->_vali([ + 'user_id.require' => '用户ID不能为空', + 'type.require' => '类型不能为空', + 'page.default' => 1, + 'limit.default' => 20, + 'keyword.default' => '', + 'sort.default' => 'id', + 'order.default' => 'desc' + ]); + + // 确保分页参数为整数 + $page = intval($get['page']); + $limit = intval($get['limit']); + + // 构建基础查询 + $query = $this->app->db->name('offer_package') + ->alias('p'); + + if ($get['type'] === 'authorized') { + // 已授权包名查询 + $query->join("{$this->table} a", 'p.id = a.package_id') + ->where('a.user_id', $get['user_id']); + } else { + // 未授权包名查询 + $query->whereNotExists(function($query) use ($get) { + $query->table($this->table) + ->where('package_id=p.id') + ->where('user_id', $get['user_id']); + }) + ->where('p.status', 1); + } + + // 关键词搜索 + if ($get['keyword'] !== '') { + $query->whereLike('p.package_name|p.name', "%{$get['keyword']}%"); + } + + // 获取总数 + $total = $query->count(); + + // 获取列表数据 + $list = $query->field([ + 'p.id', + 'p.package_name', + 'p.name', + 'p.status', + $get['type'] === 'authorized' ? 'a.create_at' : 'p.add_time as create_at' + ]) + ->order("{$get['sort']} {$get['order']}") + ->page($page, $limit) // 使用转换后的整数值 + ->select() + ->toArray(); + + // 格式化时间 + foreach ($list as &$item) { + $item['create_at'] = format_datetime($item['create_at']); + $item['status_text'] = $item['status'] ? '启用' : '停用'; + } + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + + } catch (\Exception $e) { + trace("获取权限详情数据异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']); + } + } + + /** + * 获取已授权的包名列表 + * @auth true + */ + public function getAuthorizedPackages() + { + try { + $userId = $this->request->param('user_id/d', 0); + $keyword = $this->request->param('keyword/s', ''); + $page = $this->request->param('page/d', 1); + $limit = $this->request->param('limit/d', 10); + + if (empty($userId)) { + return json(['code' => 1, 'msg' => '参数错误']); + } + + // 优化1: 使用子查询优化 JOIN + $query = $this->app->db->name('offer_package') + ->whereExists(function($query) use ($userId) { + $query->table($this->table) + ->where('package_id=offer_package.id') + ->where('user_id', $userId); + }) + ->where('status', 1); + + // 优化2: 添加索引字段的索条件 + if ($keyword !== '') { + $query->where(function($query) use ($keyword) { + $query->whereOr([ + ['package_name', 'like', "%{$keyword}%"], + ['name', 'like', "%{$keyword}%"] + ]); + }); + } + + // 优化3: 使用子查询获取总数,避免重复JOIN + $total = $query->count(); + + // 优化4: 只查询需要的字段 + $list = $query->field([ + 'id', + 'package_name', + 'name', + 'status', + "(SELECT create_at FROM {$this->table} WHERE package_id=offer_package.id AND user_id={$userId} LIMIT 1) as create_at" + ]) + ->order('id desc') + ->page($page, $limit) + ->select() + ->toArray(); + + // 优化5: 添加缓存 + $cacheKey = "auth_packages_{$userId}_{$page}_{$limit}_" . md5($keyword); + cache($cacheKey, $list, 300); // 缓存5分钟 + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + } catch (\Exception $e) { + trace("获取已授权包名列表异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 1, 'msg' => '系统异常,请稍后重试!']); + } + } + + /** + * 获取授权包名列表(分页) + * @auth true + * @api true + */ + public function getAuthPackageList() + { + try { + $get = $this->_vali([ + 'user_id.require' => '用户ID不能为空', + 'page.default' => 1, + 'limit.default' => 10, + 'keyword.default' => '', + 'status.default' => 1, + 'sort.default' => 'id', + 'order.default' => 'desc' + ]); + + // 构建基础查询 + $query = $this->app->db->name('offer_package') + ->alias('p') + ->join("{$this->table} a", 'p.id = a.package_id') + ->where([ + 'a.user_id' => $get['user_id'], + 'p.status' => $get['status'] + ]); + + // 关键词搜索 + if ($get['keyword'] !== '') { + $query->whereLike('p.package_name|p.name', "%{$get['keyword']}%"); + } + + // 获取总数 + $total = $query->count(); + + // 获取分页数据 + $list = $query->field([ + 'p.id', + 'p.package_name', + 'p.name', + 'p.status', + 'a.create_at', + 'p.update_time' + ]) + ->order("{$get['sort']} {$get['order']}") + ->limit(($get['page'] - 1) * $get['limit'], $get['limit']) + ->select() + ->toArray(); + + // 格式化时间 + foreach ($list as &$item) { + $item['create_at'] = format_datetime($item['create_at']); + $item['update_time'] = format_datetime($item['update_time']); + } + + // 使用缓存 + $cacheKey = "auth_package_list_{$get['user_id']}_{$get['page']}_{$get['limit']}_" . md5($get['keyword']); + cache($cacheKey, [ + 'total' => $total, + 'list' => $list + ], 300); // 缓存5分钟 + + return json([ + 'code' => 0, + 'msg' => 'success', + 'total' => $total, + 'list' => $list, + 'page' => $get['page'], + 'limit' => $get['limit'] + ]); + } catch (\Exception $e) { + $this->app->log->error("获取授权包名列表异常:{$e->getMessage()}"); + return json([ + 'code' => 1, + 'msg' => '获取数据失败:' . $e->getMessage() + ]); + } + } + + /** + * 获取授权包名统计 + * @auth true + * @api true + */ + public function getAuthPackageStats() + { + try { + $userId = input('user_id/d', 0); + if (empty($userId)) { + return json(['code' => 1, 'msg' => '用户ID不能为空']); + } + + // 获取统计数据 + $stats = [ + 'total' => $this->app->db->name($this->table) + ->where('user_id', $userId) + ->count(), + 'active' => $this->app->db->name('offer_package') + ->alias('p') + ->join("{$this->table} a", 'p.id = a.package_id') + ->where([ + 'a.user_id' => $userId, + 'p.status' => 1 + ]) + ->count(), + 'latest' => $this->app->db->name($this->table) + ->where('user_id', $userId) + ->order('create_at desc') + ->value('create_at') + ]; + + $stats['latest'] = $stats['latest'] ? format_datetime($stats['latest']) : ''; + + return json([ + 'code' => 0, + 'msg' => 'success', + 'data' => $stats + ]); + } catch (\Exception $e) { + $this->app->log->error("获取授权包名统计异常:{$e->getMessage()}"); + return json([ + 'code' => 1, + 'msg' => '获取统计失败:' . $e->getMessage() + ]); + } + } + +} \ No newline at end of file diff --git a/app/manager/controller/PackageCallback.php b/app/manager/controller/PackageCallback.php new file mode 100644 index 0000000..605e54b --- /dev/null +++ b/app/manager/controller/PackageCallback.php @@ -0,0 +1,495 @@ +title = '回传配置管理'; + $this->fetch(); + } + + /** + * 获取回传配置列表数据 + * @auth true + */ + public function get_list() + { + try { + // 获取请求参数 + $page = input('page/d', 1); + $limit = input('limit/d', 15); + $where = []; + + // 包名搜索 + if ($package_name = input('package_name/s', '')) { + $where[] = ['package_name', 'like', "%{$package_name}%"]; + } + + // 事件名称搜索 + if ($event_name = input('event_name/s', '')) { + $where[] = ['event_name', 'like', "%{$event_name}%"]; + } + + // 状态筛选 + if ($status = input('status/s', '')) { + $where[] = ['status', '=', $status]; + } + + // 非超级管理员需要进行权限过滤 + if (!AdminService::instance()->isSuper()) { + // 检查包名管理模块权限 + if (!AdminService::instance()->check('package/index')) { + return json([ + 'code' => 0, + 'msg' => '', + 'count' => 0, + 'data' => [] + ]); + } + + $userId = AdminService::instance()->getUserId(); + // 获取有权限的包名ID列表 + $packageIds = $this->app->db->name('offer_package_auth') + ->where('user_id', $userId) + ->column('package_id'); + + if (empty($packageIds)) { + return json([ + 'code' => 0, + 'msg' => '', + 'count' => 0, + 'data' => [] + ]); + } + + $where[] = ['package_id', 'in', $packageIds]; + } + + // 查询数据 + $query = $this->app->db->name($this->table); + + // 先获取总数 + $total = $query->where($where)->count(); + + // 分页查询数据 + $list = $query->where($where) + ->field('*') + ->order('id desc') + ->limit(($page - 1) * $limit, $limit) + ->select() + ->toArray(); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + + } catch (\Exception $e) { + trace("获取回传配置列表异常:" . $e->getMessage()); + return json([ + 'code' => 1, + 'msg' => '获取数据失败,请稍后重试', + 'count' => 0, + 'data' => [] + ]); + } + } + + /** + * 添加回传配置 + * @auth true + */ + public function add() + { + if ($this->request->isGet()) { + // 设置页面标题 + $this->title = '添加回传配置'; + $this->fetch('add'); // 明确指定渲染 add.html + } + + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'package_id.require' => '包名ID不能为空!', + 'package_name.require' => '包名不能为空!', + 'event_name.require' => '事件名称不能为空!', + 'callback_url.require' => '回传地址不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 检查权限 + if (!$this->checkPackageAuth($data['package_id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 检查是否已存在相同配置 + $exists = $this->app->db->name($this->table) + ->where([ + 'package_id' => $data['package_id'], + 'event_name' => $data['event_name'] + ]) + ->find(); + + if ($exists) { + return json(['code' => 0, 'info' => '该包名下已存在相同事件名称的配置!']); + } + + // 添加创建信息 + $data['create_by'] = AdminService::instance()->getUserId(); + $data['create_at'] = date('Y-m-d H:i:s'); + $data['update_at'] = date('Y-m-d H:i:s'); + + $result = $this->app->db->name($this->table)->insert($data); + if ($result === false) { + return json(['code' => 0, 'info' => '添加失败,请重试!']); + } + sysoplog('积分墙包名回传', '添加成功!'); + + return json(['code' => 1, 'info' => '添加成功!']); + } catch (\Exception $e) { + trace("添加回传配置异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 编辑回传配置 + * @auth true + */ + public function edit() + { + if ($this->request->isGet()) { + $id = $this->request->get('id/d', 0); + if (empty($id)) { + $this->error('参数错误'); + } + + // 获取配置信息 + $vo = $this->app->db->name($this->table)->where('id', $id)->find(); + if (empty($vo)) { + $this->error('配置不存在'); + } + + // 检查权限 + if (!$this->checkPackageAuth($vo['package_id'])) { + $this->error('您没有操作此包名的权限!'); + } + + $this->assign('vo', $vo); + $this->fetch(); // 直接渲染 edit.html + } + + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'id.require' => '配置ID不能为空!', + 'package_id.require' => '包名ID不能为空!', + 'package_name.require' => '包名不能为空!', + 'event_name.require' => '事件名称不能为空!', + 'callback_url.require' => '回传地址不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 检查权限 + if (!$this->checkPackageAuth($data['package_id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 检查是否已存在相同配置(排除自身) + $exists = $this->app->db->name($this->table) + ->where([ + ['package_id', '=', $data['package_id']], + ['event_name', '=', $data['event_name']], + ['id', '<>', $data['id']] + ]) + ->find(); + + if ($exists) { + return json(['code' => 0, 'info' => '该包名下已存在相同事件名称的配置!']); + } + + // 更新时间 + $data['update_at'] = date('Y-m-d H:i:s'); + + $result = $this->app->db->name($this->table) + ->where(['id' => $data['id']]) + ->update($data); + + if ($result === false) { + return json(['code' => 0, 'info' => '更新失败,请重试!']); + } + sysoplog('积分墙包名回传', '更新成功!'); + + return json(['code' => 1, 'info' => '更新成功!']); + } catch (\Exception $e) { + trace("编辑回传配置异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 删除回传配置 + * @auth true + */ + public function remove() + { + if ($this->request->isPost()) { + try { + $id = $this->request->param('id/d'); + if (empty($id)) { + return json(['code' => 0, 'info' => '参数错误!']); + } + + // 获取配置信息 + $config = $this->app->db->name($this->table)->where('id', $id)->find(); + if (empty($config)) { + return json(['code' => 0, 'info' => '配置不存在!']); + } + + // 检查权限 + if (!$this->checkPackageAuth($config['package_id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + $result = $this->app->db->name($this->table)->where('id', $id)->delete(); + if ($result === false) { + return json(['code' => 0, 'info' => '删除失败,请重试!']); + } + sysoplog('积分墙包名回传', '删除成功!'); + + return json(['code' => 1, 'info' => '删除成功!']); + } catch (\Exception $e) { + trace("删除回传配置异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 检查包名权限 + * @param int $packageId 包名ID + * @return bool + */ + protected function checkPackageAuth($packageId) + { + // 超级管理员直接放行 + if (AdminService::instance()->isSuper()) { + return true; + } + + // 检查用户是否有包名管理模块的权限 + if (!AdminService::instance()->check('package/index')) { + return false; + } + + // 检查具体包名权限 + $userId = AdminService::instance()->getUserId(); + $exists = $this->app->db->name('offer_package_auth') + ->where(['package_id' => $packageId, 'user_id' => $userId]) + ->find(); + + return !empty($exists); + } + + /** + * 修改状态 + * @auth true + */ + public function state() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'id.require' => '配置ID不能为空!', + 'status.in:0,1' => '状态值不正确!' + ]); + + // 获取配置信息 + $config = $this->app->db->name($this->table)->where('id', $data['id'])->find(); + if (empty($config)) { + return json(['code' => 0, 'info' => '配置不存在!']); + } + + // 检查权限 + if (!$this->checkPackageAuth($config['package_id'])) { + return json(['code' => 0, 'info' => '您没有操作此包名的权限!']); + } + + // 更新状态 + $result = $this->app->db->name($this->table) + ->where(['id' => $data['id']]) + ->update([ + 'status' => $data['status'], + 'update_at' => date('Y-m-d H:i:s') + ]); + + if ($result === false) { + return json(['code' => 0, 'info' => '状态更新失败!']); + } + sysoplog('积分墙包名回传', '状态更新成功!'); + + return json(['code' => 1, 'info' => '状态更新成功!']); + } catch (\Exception $e) { + trace("修改状态异常:" . $e->getMessage()); + return json(['code' => 0, 'info' => '系统异常,请稍后重试!']); + } + } + } + + /** + * 搜索包名 + * @auth true + */ + public function searchPackages() + { + try { + $keyword = input('keyword/s', ''); + $init = input('init/d', 0); // 是否是初始化加载 + $event_name = input('event_name/s', ''); // 事件名称,用于排除已配置的包名 + $edit_id = input('edit_id/d', 0); // 编辑时的ID,用于排除自身 + + // 构建查询 + $query = $this->app->db->name('offer_package') + ->alias('p') + ->where('p.status', 1); + + // 非超级管理员需要进行权限过滤 + if (!AdminService::instance()->isSuper()) { + $userId = AdminService::instance()->getUserId(); + $query->join('offer_package_auth a', 'p.id = a.package_id') + ->where('a.user_id', $userId); + } + + // 排除已经配置过此事件的包名 + if (!empty($event_name)) { + $existsQuery = $this->app->db->name($this->table) + ->where('event_name', $event_name); + + // 编辑时排除自身 + if ($edit_id > 0) { + $existsQuery->where('id', '<>', $edit_id); + } + + $existsPackageIds = $existsQuery->column('package_id'); + + if (!empty($existsPackageIds)) { + $query->whereNotIn('p.id', $existsPackageIds); + } + } + + // 如果是搜索则添加搜索条件 + if (!$init && !empty($keyword)) { + $query->where(function($query) use ($keyword) { + $query->whereOr([ + ['p.package_name', 'like', "%{$keyword}%"], + ['p.name', 'like', "%{$keyword}%"] + ]); + }); + } + + // 限制返回数量 + $list = $query->field(['p.id', 'p.package_name', 'p.name']) // 明确指定字段 + ->group('p.id') // 防止重复 + ->order('p.id desc') // 按ID倒序 + ->limit(20) + ->select() + ->toArray(); + + return json(['code' => 1, 'msg' => '获取成功', 'data' => $list]); + } catch (\Exception $e) { + trace("搜索包名异常:" . $e->getMessage() . "\n" . $e->getTraceAsString()); + return json(['code' => 0, 'msg' => '系统异常,请稍后重试']); + } + } + + /** + * 检查配置是否存在 + * @auth true + */ + public function checkExists() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'package_id.require' => '包名ID不能为空!', + 'event_name.require' => '事件名称不能为空!' + ]); + + // 检查是否已存在相同配置 + $exists = $this->app->db->name($this->table) + ->where([ + 'package_id' => $data['package_id'], + 'event_name' => $data['event_name'] + ]) + ->find(); + + return json([ + 'code' => 1, + 'msg' => '检查成功', + 'data' => !empty($exists) + ]); + } catch (\Exception $e) { + return json(['code' => 0, 'msg' => '检查失败']); + } + } + } + + /** + * 获取已存在的配置详情 + * @auth true + */ + public function getExistingConfig() + { + if ($this->request->isPost()) { + try { + $data = $this->_vali([ + 'package_id.require' => '包名ID不能为空!', + 'event_name.require' => '事件名称不能为空!' + ]); + + // 获取已存在的配置 + $config = $this->app->db->name($this->table) + ->where([ + 'package_id' => $data['package_id'], + 'event_name' => $data['event_name'] + ]) + ->find(); + + return json([ + 'code' => 1, + 'msg' => '获取成功', + 'data' => $config + ]); + } catch (\Exception $e) { + return json(['code' => 0, 'msg' => '获取失败']); + } + } + } +} \ No newline at end of file diff --git a/app/manager/controller/PackageCallbackRecords.php b/app/manager/controller/PackageCallbackRecords.php new file mode 100644 index 0000000..1b1e431 --- /dev/null +++ b/app/manager/controller/PackageCallbackRecords.php @@ -0,0 +1,125 @@ +title = '回传记录列表'; + $this->fetch(); + } + + /** + * 获取回传记录列表 + * @auth true + */ + public function get_list() + { + try { + $page = input('page/d', 1); + $limit = input('limit/d', 15); + $where = []; + + // 包名搜索 + if ($package_name = input('package_name/s', '')) { + $where[] = ['package_name', 'like', "%{$package_name}%"]; + } + + // 事件名称搜索 + if ($event_name = input('event_name/s', '')) { + $where[] = ['event_name', 'like', "%{$event_name}%"]; + } + + // 推送ID搜索 + if ($push_record_id = input('push_record_id/d', '')) { + $where[] = ['push_record_id', '=', $push_record_id]; + } + + // 状态筛选 + if ($status = input('status/s', '')) { + $where[] = ['status', '=', $status]; + } + + // 时间范围筛选 + if ($start_time = input('start_time/s', '')) { + $where[] = ['callback_time', '>=', $start_time]; + } + if ($end_time = input('end_time/s', '')) { + $where[] = ['callback_time', '<=', $end_time]; + } + + // 查询数据 + $query = $this->app->db->name($this->table) + ->alias('a') + ->join('offer_package_push_records b', 'a.push_record_id = b.id', 'left') + ->field('a.*, b.source_type'); + + // 获取总数 + $total = $query->where($where)->count(); + + // 分页查询数据 + $list = $query->where($where) + ->order('a.id desc') + ->limit(($page - 1) * $limit, $limit) + ->select() + ->toArray(); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + + } catch (\Exception $e) { + trace("获取回传记录列表异常:" . $e->getMessage()); + return json([ + 'code' => 1, + 'msg' => '获取数据失败,请稍后重试', + 'count' => 0, + 'data' => [] + ]); + } + } + + /** + * 查看详情 + * @auth true + */ + public function detail() + { + $id = input('id/d', 0); + if (empty($id)) { + $this->error('参数错误'); + } + + $vo = $this->app->db->name($this->table)->where('id', $id)->find(); + if (empty($vo)) { + $this->error('记录不存在'); + } + + $this->vo = $vo; + $this->fetch(); + } +} \ No newline at end of file diff --git a/app/manager/controller/PackagePushRecords.php b/app/manager/controller/PackagePushRecords.php new file mode 100644 index 0000000..fb69f28 --- /dev/null +++ b/app/manager/controller/PackagePushRecords.php @@ -0,0 +1,118 @@ +title = '推送记录列表'; + $this->fetch(); + } + + /** + * 获取推送记录列表 + * @auth true + */ + public function get_list() + { + try { + $page = input('page/d', 1); + $limit = input('limit/d', 15); + $where = []; + + // 包名搜索 + if ($package_name = input('package_name/s', '')) { + $where[] = ['package_name', 'like', "%{$package_name}%"]; + } + + // 事件名称搜索 + if ($event_name = input('event_name/s', '')) { + $where[] = ['event_name', 'like', "%{$event_name}%"]; + } + + // 来源筛选 + if ($source_type = input('source_type/s', '')) { + $where[] = ['source_type', '=', $source_type]; + } + + // 时间范围筛选 + if ($start_time = input('start_time/s', '')) { + $where[] = ['receive_time', '>=', $start_time]; + } + if ($end_time = input('end_time/s', '')) { + $where[] = ['receive_time', '<=', $end_time]; + } + + // 查询数据 + $query = $this->app->db->name($this->table); + + // 获取总数 + $total = $query->where($where)->count(); + + // 分页查询数据 + $list = $query->where($where) + ->field('*') + ->order('id desc') + ->limit(($page - 1) * $limit, $limit) + ->select() + ->toArray(); + + return json([ + 'code' => 0, + 'msg' => '', + 'count' => $total, + 'data' => $list + ]); + + } catch (\Exception $e) { + trace("获取推送记录列表异常:" . $e->getMessage()); + return json([ + 'code' => 1, + 'msg' => '获取数据失败,请稍后重试', + 'count' => 0, + 'data' => [] + ]); + } + } + + /** + * 查看详情 + * @auth true + */ + public function detail() + { + $id = input('id/d', 0); + if (empty($id)) { + $this->error('参数错误'); + } + + $vo = $this->app->db->name($this->table)->where('id', $id)->find(); + if (empty($vo)) { + $this->error('记录不存在'); + } + + $this->vo = $vo; + $this->fetch(); + } +} \ No newline at end of file diff --git a/app/manager/model/Member.php b/app/manager/model/Member.php new file mode 100644 index 0000000..eef2ee6 --- /dev/null +++ b/app/manager/model/Member.php @@ -0,0 +1,194 @@ + 'integer', + 'status' => 'integer', + 'usage_limit' => 'integer', + 'used_count' => 'integer', + 'points' => 'integer', + 'level' => 'integer', + 'balance' => 'float', + 'expire_time' => 'datetime', + 'last_login_time' => 'datetime', + 'create_time' => 'datetime', + 'update_time' => 'datetime' + ]; + + /** + * 状态获取器 + */ + public function getStatusTextAttr($value, $data) + { + return $data['status'] == 1 ? '正常' : '禁用'; + } + + /** + * 获取分页列表 + * @param array $map 查询条件 + * @param string $sort 排序规则 + * @return \think\db\Query + */ + public static function mQuery($map = [], $sort = 'id desc') + { + $query = static::where($map); + // 会员搜索器 + $query->withSearch(['username', 'nickname', 'mobile', 'email', 'status', 'order_id'], [ + 'username' => function ($query, $value) { + $query->whereLike('username|nickname', "%{$value}%"); + }, + 'nickname' => function ($query, $value) { + $query->whereLike('nickname', "%{$value}%"); + }, + 'mobile' => function ($query, $value) { + $query->whereLike('mobile', "%{$value}%"); + }, + 'email' => function ($query, $value) { + $query->whereLike('email', "%{$value}%"); + }, + 'order_id' => function ($query, $value) { + $query->whereLike('order_id', "%{$value}%"); + }, + 'status' => function ($query, $value) { + $query->where(['status' => $value]); + } + ]); + return $query->order($sort); + } + + /** + * 表单处理 + * @param string $template 模板名称 + * @param array $data 表单数据 + * @param bool $isUpdate 是否更新 + * @return array|mixed + */ + public static function mForm($template = '', $data = [], $isUpdate = false) + { + if (request()->isPost()) { + $data = request()->post(); + // 密码处理 + if (isset($data['password']) && empty($data['password'])) { + unset($data['password']); + } elseif (isset($data['password'])) { + $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT); + } + // 保存数据 + if (isset($data['id']) && $data['id'] > 0) { + return static::update($data) !== false; + } else { + return static::create($data) !== false; + } + } + return $template; + } + + /** + * 修改状态 + * @return bool + */ + public static function mSave() + { + $data = input('post.'); + return static::update($data) !== false; + } + + /** + * 删除记录 + * @return bool + */ + public static function mDelete() + { + $id = input('post.id'); + return static::destroy($id) !== false; + } + + /** + * 检查会员是否有效 + * @return array + */ + public function isValid() + { + // 检查状态 + if (!$this->status) { + return ['valid' => false, 'reason' => '账号已被禁用']; + } + + // 检查有效期 + if ($this->expire_time && $this->expire_time < date('Y-m-d H:i:s')) { + return ['valid' => false, 'reason' => '账号已过期']; + } + + // 检查使用次数 + if ($this->usage_limit > 0 && $this->used_count >= $this->usage_limit) { + return ['valid' => false, 'reason' => '使用次数已达上限']; + } + + return ['valid' => true, 'reason' => '']; + } + + /** + * 更新登录信息 + * @param string $ip + * @return bool + */ + public function updateLoginInfo($ip = '') + { + $this->last_login_time = date('Y-m-d H:i:s'); + $this->last_login_ip = $ip ?: request()->ip(); + $this->used_count += 1; + return $this->save(); + } +} \ No newline at end of file diff --git a/app/manager/sys/RedisManager.php b/app/manager/sys/RedisManager.php new file mode 100644 index 0000000..7691009 --- /dev/null +++ b/app/manager/sys/RedisManager.php @@ -0,0 +1,265 @@ +initializeConnection($config); + $this->prefix = Config::get('database.connections.redis.prefix', ''); + } + + /** + * 初始化Redis连接 + */ + private function initializeConnection(?array $config = null): void + { + $config ??= Config::get('database.connections.redis', []); + $hostName = config("app.host_name"); + + try { + match($hostName) { + 'HHKK' => $this->initCluster([ + '192.168.1.3:7000', + '192.168.1.2:7001', + '192.168.1.31:7002' + ]), + 'H36HK' => $this->initCluster([ + '192.168.1.3:7000', + '192.168.1.2:7001', + '192.168.1.5:7002', + '192.168.1.41:7003', + '192.168.1.51:7004' + ]), + default => $this->initSingle($config) + }; + } catch (\Throwable $e) { + throw new RedisException("Redis连接失败: " . $e->getMessage()); + } + } + + /** + * 初始化单机Redis + */ + private function initSingle(array $config): void + { + $this->redis = new Redis(); + $this->redis->connect( + $config['host'] ?? '127.0.0.1', + $config['port'] ?? 6379, + $config['timeout'] ?? 10 + ); + + if (!empty($config['password'])) { + $this->redis->auth($config['password']); + } + + if (isset($config['db']) && is_numeric($config['db'])) { + $this->redis->select((int)$config['db']); + } + } + + /** + * 初始化Redis集群 + */ + private function initCluster(array $nodes): void + { + $this->redis = new RedisCluster(null, $nodes, 5); + } + + /** + * 获取Redis实例 + */ + public function getRedis(): Redis|RedisCluster + { + return $this->redis; + } + + /** + * String 操作 + */ + public function get(string $key): mixed + { + try { + $value = $this->redis?->get($this->prefix . $key); + return $this->unserialize($value); + } catch (\Throwable) { + return null; + } + } + + public function set(string $key, mixed $value, int $expire = 0): bool + { + try { + $value = $this->serialize($value); + if ($expire > 0) { + return (bool)$this->redis?->setex($this->prefix . $key, $expire, $value); + } + return (bool)$this->redis?->set($this->prefix . $key, $value); + } catch (\Throwable) { + return false; + } + } + + /** + * List 操作 + */ + public function lPush(string $key, mixed $value): int + { + try { + return $this->redis?->lPush($this->prefix . $key, $this->serialize($value)) ?? 0; + } catch (\Throwable) { + return 0; + } + } + + public function lRange(string $key, int $start = 0, int $end = -1): array + { + try { + $data = $this->redis?->lRange($this->prefix . $key, $start, $end) ?? []; + return array_map(fn($item) => $this->unserialize($item), $data); + } catch (\Throwable) { + return []; + } + } + + /** + * Hash 操作 + */ + public function hSet(string $key, string $field, mixed $value): bool + { + try { + return (bool)$this->redis?->hSet( + $this->prefix . $key, + $field, + $this->serialize($value) + ); + } catch (\Throwable) { + return false; + } + } + + public function hGet(string $key, string|array|null $field = null): mixed + { + try { + if ($field === null) { + $data = $this->redis?->hGetAll($this->prefix . $key) ?? []; + return array_map(fn($item) => $this->unserialize($item), $data); + } + + if (is_array($field)) { + $data = $this->redis?->hMGet($this->prefix . $key, $field) ?? []; + return array_map(fn($item) => $this->unserialize($item), $data); + } + + $value = $this->redis?->hGet($this->prefix . $key, $field); + return $this->unserialize($value); + } catch (\Throwable) { + return null; + } + } + + /** + * Set 操作 + */ + public function sAdd(string $key, mixed $value): int + { + try { + if (is_array($value)) { + $count = 0; + foreach ($value as $v) { + $count += $this->redis?->sAdd( + $this->prefix . $key, + $this->serialize($v) + ) ?? 0; + } + return $count; + } + return $this->redis?->sAdd($this->prefix . $key, $this->serialize($value)) ?? 0; + } catch (\Throwable) { + return 0; + } + } + + public function sMembers(string $key): array + { + try { + $members = $this->redis?->sMembers($this->prefix . $key) ?? []; + return array_map(fn($item) => $this->unserialize($item), $members); + } catch (\Throwable) { + return []; + } + } + + /** + * 通用操作 + */ + public function delete(string|array $key): bool + { + try { + $keys = is_array($key) + ? array_map(fn($k) => $this->prefix . $k, $key) + : $this->prefix . $key; + return (bool)$this->redis?->del($keys); + } catch (\Throwable) { + return false; + } + } + + public function exists(string $key): bool + { + try { + return (bool)$this->redis?->exists($this->prefix . $key); + } catch (\Throwable) { + return false; + } + } + + /** + * 序列化处理 + */ + private function serialize(mixed $data): string + { + if (is_array($data)) { + return json_encode($data, JSON_UNESCAPED_UNICODE) ?: ''; + } + return (string)$data; + } + + private function unserialize(mixed $data): mixed + { + if (!is_string($data)) { + return $data; + } + + $decoded = json_decode($data, true); + return json_last_error() === JSON_ERROR_NONE ? $decoded : $data; + } + + private function __clone() {} +} \ No newline at end of file diff --git a/app/manager/view/error.php b/app/manager/view/error.php new file mode 100644 index 0000000..c8504db --- /dev/null +++ b/app/manager/view/error.php @@ -0,0 +1,568 @@ +' . end($names) . ''; + } +} + +if (!function_exists('parse_file')) { + function parse_file($file, $line): string + { + return '' . basename($file) . " line {$line}" . ''; + } +} + +if (!function_exists('parse_args')) { + function parse_args($args): string + { + $result = []; + foreach ($args as $key => $item) { + switch (true) { + case is_object($item): + $value = sprintf('object(%s)', parse_class(get_class($item))); + break; + case is_array($item): + if (count($item) > 3) { + $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); + } else { + $value = sprintf('[%s]', parse_args($item)); + } + break; + case is_string($item): + if (strlen($item) > 20) { + $value = sprintf( + '\'%s...\'', + htmlentities($item), + htmlentities(substr($item, 0, 20)) + ); + } else { + $value = sprintf("'%s'", htmlentities($item)); + } + break; + case is_int($item): + case is_float($item): + $value = $item; + break; + case is_null($item): + $value = 'null'; + break; + case is_bool($item): + $value = '' . ($item ? 'true' : 'false') . ''; + break; + case is_resource($item): + $value = 'resource'; + break; + default: + $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); + break; + } + + $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; + } + + return implode(', ', $result); + } +} +if (!function_exists('echo_value')) { + function echo_value($val) + { + if (is_array($val) || is_object($val)) { + echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); + } elseif (is_bool($val)) { + echo $val ? 'true' : 'false'; + } elseif (is_scalar($val)) { + echo htmlentities($val); + } else { + echo 'Resource'; + } + } +} +?> + + + + + 系统发生错误 + + + + + + $trace) { ?> +
    +
    +
    +
    +

    +
    +

    +
    +
    + +
    +
    +
    1. ">
    +
    +
    + +
    +

    Call Stack

    +
      +
    1. + +
    2. + +
    3. + +
    +
    +
    + + +
    +

    +
    + + + +
    +

    Exception Datas

    + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
    empty
    + +
    + + + +
    +

    Environment Variables

    + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
    empty
    + +
    + + + + + + + diff --git a/app/manager/view/full.html b/app/manager/view/full.html new file mode 100644 index 0000000..c76f00e --- /dev/null +++ b/app/manager/view/full.html @@ -0,0 +1,32 @@ + + + + {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} + + + + + + + + + + + + {block name="style"}{/block} + + + + +{block name='body'} +
    +
    {block name='content'}{/block}
    +
    +{/block} + + + + +{block name='script'}{/block} + + \ No newline at end of file diff --git a/app/manager/view/index/index.html b/app/manager/view/index/index.html new file mode 100644 index 0000000..c30a20a --- /dev/null +++ b/app/manager/view/index/index.html @@ -0,0 +1,16 @@ +{extend name="main"} + +{block name="content"} +
    +
    +
    +
    +
    欢迎页面
    +
    + 欢迎使用管理系统{$userid} +
    +
    +
    +
    +
    +{/block} \ No newline at end of file diff --git a/app/manager/view/main.html b/app/manager/view/main.html new file mode 100644 index 0000000..a698dd7 --- /dev/null +++ b/app/manager/view/main.html @@ -0,0 +1,23 @@ +
    + {block name='style'}{/block} + {block name='header'} + {notempty name='title'} +
    + {$title|lang} +
    {block name='button'}{/block}
    +
    + {/notempty} + {/block} +
    +
    +
    + {notempty name='showErrorMessage'} +
    + {:lang('系统提示:')}{$showErrorMessage|raw} +
    + {/notempty} + {block name='content'}{/block} +
    +
    + {block name='script'}{/block} +
    \ No newline at end of file diff --git a/app/manager/view/member/form.html b/app/manager/view/member/form.html new file mode 100644 index 0000000..909808b --- /dev/null +++ b/app/manager/view/member/form.html @@ -0,0 +1,74 @@ +{extend name='../../admin/view/main'} + +{block name='content'} +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    +
    + +
    + +
    + {notempty name='member.id'}{/notempty} + + +
    +
    +
    +{/block} + +{block name='script'} + +{/block} \ No newline at end of file diff --git a/app/manager/view/member/index.html b/app/manager/view/member/index.html new file mode 100644 index 0000000..c51453a --- /dev/null +++ b/app/manager/view/member/index.html @@ -0,0 +1,92 @@ +{extend name='../../admin/view/main'} + +{block name='button'} + +
    + +
    +{/block} + +{block name='content'} +
    + + +
    +
    +{/block} + +{block name='script'} + + + +{/block} \ No newline at end of file diff --git a/app/manager/view/member/index_search.html b/app/manager/view/member/index_search.html new file mode 100644 index 0000000..af728d3 --- /dev/null +++ b/app/manager/view/member/index_search.html @@ -0,0 +1,32 @@ +{if isset($list)} +
    + 条件搜索 + +
    +{/if} \ No newline at end of file diff --git a/app/manager/view/package/index.html b/app/manager/view/package/index.html new file mode 100644 index 0000000..524d4c7 --- /dev/null +++ b/app/manager/view/package/index.html @@ -0,0 +1,294 @@ +{extend name="../../admin/view/main"} + +{block name='content'} +
    + + + + +
    +
    + + + +{/block} + +{block name='script'} + + + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_auth/auth_detail.html b/app/manager/view/package_auth/auth_detail.html new file mode 100644 index 0000000..34879df --- /dev/null +++ b/app/manager/view/package_auth/auth_detail.html @@ -0,0 +1,451 @@ + +
    +
    + +
    +
    +
    + 授权的包名列表 +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + 可授权的包名列表 + 仅显示启用状态的包名 +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/manager/view/package_auth/index.html b/app/manager/view/package_auth/index.html new file mode 100644 index 0000000..d0a5b10 --- /dev/null +++ b/app/manager/view/package_auth/index.html @@ -0,0 +1,786 @@ +{extend name="../../admin/view/main"} + +{block name='content'} + + + +
    +

    操作指南

    + +
    +
    +
    +
    +

    基本说明:

    +

    本页面用于管理不同管理员的包名权限,可以进行查看、添加、移除等操作。

    +
    + +
    +

    操作步骤:

    +
      +
    1. 左侧列表显示所有可配置权限的管理员
    2. +
    3. 绿色标签表示已授权包名数量,灰色表示未授权
    4. +
    5. 点击【查看权限】可以查看和修改该管理员的包名权限
    6. +
    7. 击【批量授权】可以同时给多个管理员授权相同的包名
    8. +
    9. 点击【清空权限】可以清除选中管理员的所有包名权限
    10. +
    +
    + +
    +

    权限配置窗口说明:

    +
      +
    1. 左侧显示已授权的包名列表,可以搜索和移除
    2. +
    3. 右侧显示可授权的包名列表,仅显示启用状态的包名
    4. +
    5. 在右侧勾选包名后点击【保存配置】即可添加授权
    6. +
    7. 两侧都支持搜索功能,可以快速查找包名
    8. +
    9. 所有操作都会实时更新显示结果
    10. +
    +
    + +
    +

    注意事项:

    +
      +
    1. 批量授权会覆盖已有的权限配置,请谨慎操作
    2. +
    3. 清空权限操作不可恢复,请确认后再操作
    4. +
    5. 建议先使用搜索功能查找包名,再进行授权作
    6. +
    7. 可以使用全选功能快速选择多个管理员或包名
    8. +
    9. 如有疑问请联系技术支持
    10. +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + 管理员列表 +
    + 共 {$users|count} 人 +
    +
    +
    +
    + + + + +
    + +
    + + +
    + {foreach $users as $user} +
    + + {if isset($authMap[$user.id])} + 已授权 {$authMap[$user.id]|count} 个包名 + + 查看权限 + + {else} + 未授权 + + 添加权限 + + {/if} +
    + {/foreach} +
    +
    +
    +
    +
    + + +
    +
    +
    + 包名权限配置 +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_callback/add.html b/app/manager/view/package_callback/add.html new file mode 100644 index 0000000..7c6aac2 --- /dev/null +++ b/app/manager/view/package_callback/add.html @@ -0,0 +1,258 @@ +{extend name="../../admin/view/main"} + +{block name="content"} +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    + + 例如:install, register, purchase 等 +
    +
    + +
    + +
    + + + 完整的回传接口地址,例如:http://api.example.com/callback
    + 支持变量替换,如 {package_name}, {event_name} 等
    + 详细说明请查看完整回传指南 +
    +
    +
    + +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    +
    +{/block} + +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_callback/edit.html b/app/manager/view/package_callback/edit.html new file mode 100644 index 0000000..b8dc4a3 --- /dev/null +++ b/app/manager/view/package_callback/edit.html @@ -0,0 +1,160 @@ +{extend name="../../admin/view/main"} + +{block name="content"} +
    +
    + + +
    + +
    +
    + + +
    +
    + +
    + +
    + + 例如:install, register, purchase 等 +
    +
    + +
    + +
    + + + 完整的回传接口地址,例如:http://api.example.com/callback
    + 支持变量替换,如 {package_name}, {event_name} 等
    + 详细说明请查看完整回传指南 +
    +
    +
    + +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    +
    +{/block} + +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_callback/index.html b/app/manager/view/package_callback/index.html new file mode 100644 index 0000000..5706095 --- /dev/null +++ b/app/manager/view/package_callback/index.html @@ -0,0 +1,232 @@ +{extend name="../../admin/view/main"} + + +{block name="content"} + +
    +

    回传配置指南

    + +
    +
    +
    +
    +

    基本说明:

    +

    本页面用于管理事件回传配置,支持变量替换功能,可以灵活配置回传地址。

    +
    + +
    +

    支持的变量:

    +
      +
    1. {package_name} - 应用包名,如:com.example.app
    2. +
    3. {event_name} - 事件名称,如:install, register
    4. +
    5. {event_time} - 事件发生时间,格式:YYYY-MM-DD HH:mm:ss
    6. +
    7. {gaid} - 广告ID
    8. +
    9. {network_name} - 网络名称,如:AppsFlyer, Kochava
    10. +
    +
    + +
    +

    配置示例:

    +
      +
    1. 基础URL:http://api.example.com/callback
    2. +
    3. + 完整示例:http://api.example.com/callback?package={package_name}&event={event_name}&time={event_time}&gaid={gaid}&network={network_name} +
    4. +
    5. 实际回传时,花括号中的变量会被替换为实际值
    6. +
    7. 所有特殊字符会自动进行URL编码
    8. +
    +
    + +
    +

    注意事项:

    +
      +
    1. 变量名称必须使用大括号{}包裹,且区分大小写
    2. +
    3. 同一个包名下不能配置重复的事件名称
    4. +
    5. 回传地址必须以http://或https://开头
    6. +
    7. 建议在测试环境验证回传地址的正确性
    8. +
    9. 可以通过状态开关临时停用某个回传配置
    10. +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    + +
    + +
    + + + +
    +
    +
    + + +
    +
    +
    + + + + + + +{/block} + +{block name="script"} + + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_callback_records/detail.html b/app/manager/view/package_callback_records/detail.html new file mode 100644 index 0000000..e246446 --- /dev/null +++ b/app/manager/view/package_callback_records/detail.html @@ -0,0 +1,58 @@ +{extend name="../../admin/view/main"} + +{block name="content"} +
    +
    +
    + +
    +
    {$vo.package_name|default=''}
    +
    +
    +
    + +
    +
    {$vo.event_name|default=''}
    +
    +
    +
    + +
    +
    {$vo.callback_url|default=''}
    +
    +
    +
    + +
    +
    {$vo.final_url|default=''}
    +
    +
    +
    + +
    +
    {$vo.response_code|default=''}
    +
    +
    +
    + +
    +
    {$vo.response_body|default=''}
    +
    +
    +
    + +
    +
    + {if $vo.status==1}成功{else}失败{/if} +
    +
    +
    +
    + +
    +
    {$vo.callback_time|default=''}
    +
    +
    +
    +
    +{/block} \ No newline at end of file diff --git a/app/manager/view/package_callback_records/index.html b/app/manager/view/package_callback_records/index.html new file mode 100644 index 0000000..3f8363b --- /dev/null +++ b/app/manager/view/package_callback_records/index.html @@ -0,0 +1,87 @@ +{extend name="../../admin/view/main"} + +{block name="button"} +{/block} + +{block name="content"} +
    +
    + 条件搜索 + +
    +
    +
    +{/block} + +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/app/manager/view/package_push_records/detail.html b/app/manager/view/package_push_records/detail.html new file mode 100644 index 0000000..d53380a --- /dev/null +++ b/app/manager/view/package_push_records/detail.html @@ -0,0 +1,44 @@ +{extend name="../../admin/view/main"} + +{block name="content"} +
    +
    +
    + +
    +
    {$vo.source_type|default=''}
    +
    +
    +
    + +
    +
    {$vo.package_name|default=''}
    +
    +
    +
    + +
    +
    {$vo.event_name|default=''}
    +
    +
    +
    + +
    +
    {$vo.original_url|default=''}
    +
    +
    +
    + +
    +
    {$vo.receive_time|default=''}
    +
    +
    +
    + +
    +
    {$vo.created_at|default=''}
    +
    +
    +
    +
    +{/block} \ No newline at end of file diff --git a/app/manager/view/package_push_records/index.html b/app/manager/view/package_push_records/index.html new file mode 100644 index 0000000..bc8bed1 --- /dev/null +++ b/app/manager/view/package_push_records/index.html @@ -0,0 +1,72 @@ +{extend name="../../admin/view/main"} + +{block name="button"} +{/block} + +{block name="content"} +
    +
    + 条件搜索 + +
    +
    +
    +{/block} + +{block name="script"} + + +{/block} \ No newline at end of file diff --git a/app/manager/view/table.html b/app/manager/view/table.html new file mode 100644 index 0000000..fef73fe --- /dev/null +++ b/app/manager/view/table.html @@ -0,0 +1,23 @@ +
    + {block name='style'}{/block} + {block name='header'} + {notempty name='title'} +
    + {$title|lang} +
    {block name='button'}{/block}
    +
    + {/notempty} + {/block} +
    +
    +
    + {notempty name='showErrorMessage'} +
    + {:lang('系统提示:')}{$showErrorMessage|raw} +
    + {/notempty} + {block name='content'}{/block} +
    +
    + {block name='script'}{/block} +
    \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..c7d15da --- /dev/null +++ b/build.cmd @@ -0,0 +1 @@ +composer update --profile --prefer-dist --no-dev --optimize-autoloader \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..b3a6ca5 --- /dev/null +++ b/composer.json @@ -0,0 +1,38 @@ +{ + "type": "project", + "name": "zoujingli/thinkadmin", + "license": "MIT", + "homepage": "https://thinkadmin.top", + "description": "Application Development Framework", + "keywords": [ + "ThinkAdmin", + "ThinkLibrary" + ], + "authors": [ + { + "name": "Anyon", + "email": "zoujingli@qq.com" + } + ], + "require": { + "php": ">=7.1", + "ext-json": "*", + "zoujingli/think-library": "^6.1", + "zoujingli/think-plugs-admin": "^1.0", + "zoujingli/think-plugs-wechat": "^1.0" + }, + "autoload": { + "psr-0": { + "": "extend" + }, + "psr-4": { + "app\\": "app" + } + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "zoujingli/think-install": true + } + } +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..cc00de6 --- /dev/null +++ b/config/app.php @@ -0,0 +1,58 @@ + '', + // 应用快速访问 + 'app_express' => true, + // 是否启用路由 + 'with_route' => true, + // 超级用户账号 + 'super_user' => 'admin', + // 默认时区 + 'default_timezone' => 'Asia/Shanghai', + // 应用映射(多应用模式有效) + 'app_map' => [], + // 域名绑定(多应用模式有效) + 'domain_bind' => [], + // 禁止访问(多应用模式有效) + 'deny_app_list' => [], + // CORS 启用状态(默认开启跨域) + 'cors_on' => true, + // CORS 配置跨域域名(仅需填域名,留空则自动域名) + 'cors_host' => [], + // CORS 授权请求方法 + 'cors_methods' => 'GET,PUT,POST,PATCH,DELETE', + // CORS 跨域头部字段 + 'cors_headers' => 'Api-Type,Api-Name,Api-Uuid,Jwt-Token,Api-Token,User-Form-Token,User-Token,Token', + // 应用名称 + 'app_names' =>[ + 'admin' => '系统管理', + 'manager' => '后台管理' + ], + // RBAC 登录页面(填写登录地址) + 'rbac_login' => '', + // RBAC 忽略应用(填写应用名称) + 'rbac_ignore' => ['index'], + // 显示错误消息内容,仅生产模式有效 + 'error_message' => '页面错误!请稍后再试~', + // 异常状态模板配置,仅生产模式有效 + 'http_exception_template' => [ + 404 => syspath('public/static/theme/err/404.html'), + 500 => syspath('public/static/theme/err/500.html'), + ], +]; \ No newline at end of file diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..25d927a --- /dev/null +++ b/config/cache.php @@ -0,0 +1,51 @@ + 'file', + // 缓存连接配置 + 'stores' => [ + 'file' => [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => '', + // 缓存名称前缀 + 'prefix' => '', + // 缓存有效期 0 表示永久缓存 + 'expire' => 0, + // 缓存标签前缀 + 'tag_prefix' => 'tag:', + // 序列化机制 + 'serialize' => [], + ], + 'safe' => [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => syspath('safefile/cache/'), + // 缓存名称前缀 + 'prefix' => '', + // 缓存有效期 0 表示永久缓存 + 'expire' => 0, + // 缓存标签前缀 + 'tag_prefix' => 'tag:', + // 序列化机制 + 'serialize' => [], + ], + ], +]; \ No newline at end of file diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..de985c0 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,32 @@ + 0, + // cookie 保存路径 + 'path' => '/', + // cookie 有效域名 + 'domain' => '', + // httponly 访问设置 + 'httponly' => true, + // 是否使用 setcookie + 'setcookie' => true, + // cookie 安全传输,只支持 https 协议 + 'secure' => request()->isSsl(), + // samesite 安全设置,支持 'strict' 'lax' 'none' + 'samesite' => request()->isSsl() ? 'none' : 'lax', +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..13a368e --- /dev/null +++ b/config/database.php @@ -0,0 +1,86 @@ + 'mysql', + // 自定义时间查询规则 + 'time_query_rule' => [], + // 自动写入时间戳字段 + 'auto_timestamp' => true, + // 时间字段取出后的默认时间格式 + 'datetime_format' => 'Y-m-d H:i:s', + // 数据库连接配置信息 + 'connections' => [ + 'mysql' => [ + // 数据库类型 + 'type' => 'mysql', + // 服务器地址 + 'hostname' => '127.0.0.1', + // 数据库名 + 'database' => 'cursortools', + /* // 用户名 + 'username' => 'root', + // 密码 + 'password' => 'root', */ + // 用户名 + 'username' => 'root', + // 密码 + 'password' => 'root', + // 端口 + 'hostport' => '3306', + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用 utf8 + 'charset' => 'utf8mb4', + // 数据库表前缀 + 'prefix' => '', + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 检查字段是否存在 + 'fields_strict' => true, + // 是否需要断线重连 + 'break_reconnect' => false, + // 监听SQL执行日志 + 'trigger_sql' => true, + // 开启字段类型缓存 + 'fields_cache' => isOnline(), + ], + 'sqlite' => [ + 'charset' => 'utf8', + // 数据库类型 + 'type' => 'sqlite', + // 数据库文件 + 'database' => syspath('database/sqlite.db'), + // 监听执行日志 + 'trigger_sql' => true, + // 其他参数字段 + 'deploy' => 0, + 'suffix' => '', + 'prefix' => '', + 'hostname' => '', + 'hostport' => '', + 'username' => '', + 'password' => '', + ], + ], +]; diff --git a/config/lang.php b/config/lang.php new file mode 100644 index 0000000..fedfb2d --- /dev/null +++ b/config/lang.php @@ -0,0 +1,39 @@ + 'zh-cn', + // 允许的语言列表 + 'allow_lang_list' => ['zh-cn'], + // 转义为对应语言包名称 + 'accept_language' => [ + 'en' => 'en-us', + 'zh-hans-cn' => 'zh-cn', + ], + // 多语言自动侦测变量名 + 'detect_var' => 'lang', + // 多语言 Cookie 变量 + 'cookie_var' => 'lang', + // 多语言 Header 变量 + 'header_var' => 'lang', + // 使用 Cookie 记录 + 'use_cookie' => true, + // 是否支持语言分组 + 'allow_group' => false, + // 扩展语言包 + 'extend_list' => [], +]; \ No newline at end of file diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..179bfa2 --- /dev/null +++ b/config/log.php @@ -0,0 +1,57 @@ + 'file', + // 日志记录级别 + 'level' => [], + // 日志类型记录的通道 + 'type_channel' => [], + // 关闭全局日志写入 + 'close' => false, + // 全局日志处理 支持闭包 + 'processor' => null, + // 日志通道列表 + 'channels' => [ + 'file' => [ + // 日志记录方式 + 'type' => 'File', + // 日志保存目录 + 'path' => '', + // 单文件日志写入 + 'single' => true, + // 独立日志级别 + 'apart_level' => true, + // 每个文件大小 ( 10兆 ) + 'file_size' => 10485760, + // 日志日期格式 + 'time_format' => 'Y-m-d H:i:s', + // 最大日志文件数量 + 'max_files' => 100, + // 使用JSON格式记录 + 'json' => false, + // 日志处理 + 'processor' => null, + // 关闭通道日志写入 + 'close' => false, + // 日志输出格式化 + 'format' => '[%s][%s] %s', + // 是否实时写入 + 'realtime_write' => false, + ], + ], +]; \ No newline at end of file diff --git a/config/phinx.php b/config/phinx.php new file mode 100644 index 0000000..a9ee866 --- /dev/null +++ b/config/phinx.php @@ -0,0 +1,24 @@ + [], + // 创建数据表,填写表名 + 'tables' => [], + // 备份数据表,填写表名 + 'backup' => [], +]; \ No newline at end of file diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..8672719 --- /dev/null +++ b/config/route.php @@ -0,0 +1,58 @@ + '/', + // URL伪静态后缀 + 'url_html_suffix' => 'html', + // URL普通方式参数 用于自动生成 + 'url_common_param' => true, + // 是否开启路由延迟解析 + 'url_lazy_route' => false, + // 是否强制使用路由 + 'url_route_must' => false, + // 合并路由规则 + 'route_rule_merge' => true, + // 路由是否完全匹配 + 'route_complete_match' => true, + // 访问控制器层名称 + 'controller_layer' => 'controller', + // 空控制器名 + 'empty_controller' => 'Error', + // 是否使用控制器后缀 + 'controller_suffix' => false, + // 默认的路由变量规则 + 'default_route_pattern' => '[\w\.]+', + // 是否开启请求缓存 true 自动缓存 支持设置请求缓存规则 + 'request_cache' => false, + // 请求缓存有效期 + 'request_cache_expire' => null, + // 全局请求缓存排除规则 + 'request_cache_except' => [], + // 默认应用 + 'default_app' => 'index', + // 默认控制器名 + 'default_controller' => 'Index', + // 默认操作名 + 'default_action' => 'index', + // 操作方法后缀 + 'action_suffix' => '', + // 默认JSONP格式返回的处理方法 + 'default_jsonp_handler' => 'jsonpReturn', + // 默认JSONP处理方法 + 'var_jsonp_handler' => 'callback', +]; \ No newline at end of file diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..1dd6c59 --- /dev/null +++ b/config/session.php @@ -0,0 +1,28 @@ + 'ssid', + // 驱动方式 + 'type' => 'file', + // 存储连接 + 'store' => null, + // 过期时间 + 'expire' => 7200, + // 文件前缀 + 'prefix' => '', +]; \ No newline at end of file diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..1de5e3e --- /dev/null +++ b/config/view.php @@ -0,0 +1,42 @@ + 'Think', + // 默认模板渲染规则 1.解析为小写+下划线 2.全部转换小写 3.保持操作方法 + 'auto_rule' => 1, + // 模板目录名 + 'view_dir_name' => 'view', + // 模板文件后缀 + 'view_suffix' => 'html', + // 模板文件名分隔符 + 'view_depr' => DIRECTORY_SEPARATOR, + // 模板缓存配置 + 'tpl_cache' => isOnline(), + // 模板引擎标签开始标记 + 'tpl_begin' => '{', + // 模板引擎标签结束标记 + 'tpl_end' => '}', + // 标签库标签开始标记 + 'taglib_begin' => '{', + // 标签库标签结束标记 + 'taglib_end' => '}', + // 去除HTML空格换行 + 'strip_space' => true, + // 标签默认过滤输出方法 + 'default_filter' => 'htmlentities=###,ENT_QUOTES', +]; \ No newline at end of file diff --git a/license b/license new file mode 100644 index 0000000..ba3f080 --- /dev/null +++ b/license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2014~2024 Anyon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..fb18cf5 --- /dev/null +++ b/public/index.php @@ -0,0 +1,25 @@ + 0 ? rule.replace('{key}', array.join(',')) : ''; + })(elem.dataset.rule || '', []) || ''; + if (value.length < 1) return $.msg.tips('请选择需要更改的数据!'), false; + value.split(';').forEach(function (item) { + data[item.split('#')[0]] = item.split('#')[1]; + }); + return $.base.onConfirm(elem.dataset.confirm, function () { + return callabel.call(elem, data, elem, elem.dataset || {}); + }); + } else { + return $.base.onConfirm(elem.dataset.confirm, function () { + return callabel.call(elem, data, elem, elem.dataset || {}); + }); + } + } + }; + + /*! 消息组件实例 */ + $.msg = new function () { + this.idx = []; + this.mdx = []; + this.shade = [0.02, '#000000']; + /*! 关闭元素所在窗口 */ + this.closeThisModal = function (element) { + layer.close($(element).parents('div.layui-layer-page').attr('times')); + }; + /*! 关闭顶层最新窗口 */ + this.closeLastModal = function () { + while ($.msg.mdx.length > 0 && (this.tdx = $.msg.mdx.pop()) > 0) { + if ($('#layui-layer' + this.tdx).size()) return layer.close(this.tdx); + } + }; + /*! 关闭消息框 */ + this.close = function (idx) { + if (idx !== null) return layer.close(idx); + for (let i in this.idx) $.msg.close(this.idx[i]); + return (this.idx = []) !== false; + }; + /*! 弹出警告框 */ + this.alert = function (msg, call) { + let idx = layer.alert(msg, {end: call, scrollbar: false}); + return $.msg.idx.push(idx), idx; + }; + /*! 显示成功类型的消息 */ + this.success = function (msg, time, call) { + let idx = layer.msg(msg, {icon: 1, shade: this.shade, scrollbar: false, end: call, time: (time || 2) * 1000, shadeClose: true}); + return $.msg.idx.push(idx), idx; + }; + /*! 显示失败类型的消息 */ + this.error = function (msg, time, call) { + let idx = layer.msg(msg, {icon: 2, shade: this.shade, scrollbar: false, time: (time || 3) * 1000, end: call, shadeClose: true}); + return $.msg.idx.push(idx), idx; + }; + /*! 状态消息提示 */ + this.tips = function (msg, time, call) { + let idx = layer.msg(msg, {time: (time || 3) * 1000, shade: this.shade, end: call, shadeClose: true}); + return $.msg.idx.push(idx), idx; + }; + /*! 显示加载提示 */ + this.loading = function (msg, call) { + let idx = msg ? layer.msg(msg, {icon: 16, scrollbar: false, shade: this.shade, time: 0, end: call}) : layer.load(0, {time: 0, scrollbar: false, shade: this.shade, end: call}); + return $.msg.idx.push(idx), idx; + }; + /*! Notify 调用入口 */ + // https://www.jq22.com/demo/jquerygrowl-notification202104021049 + this.notify = function (title, message, time, option) { + require(['notify'], function (Notify) { + Notify.notify(Object.assign({title: title || '', description: message || '', position: 'top-right', closeTimeout: time || 3000, width: '400px'}, option || {})); + }); + }; + /*! 页面加载层 */ + this.page = new function () { + this.$body = $('body>.think-page-loader'); + this.$main = $('.think-page-body+.think-page-loader'); + this.stat = function () { + return this.$body.is(':visible'); + }, this.done = function () { + return $.msg.page.$body.fadeOut(); + }, this.show = function () { + this.stat() || this.$main.removeClass('layui-hide').show(); + }, this.hide = function () { + if (this.time) clearTimeout(this.time); + this.time = setTimeout(function () { + ($.msg.page.time = 0) || $.msg.page.$main.fadeOut(); + }, 200); + }; + }; + /*! 确认对话框 */ + this.confirm = function (msg, ok, no) { + return layer.confirm(msg, {title: '操作确认', btn: ['确认', '取消']}, function (idx) { + (typeof ok === 'function' && ok.call(this, idx)), $.msg.close(idx); + }, function (idx) { + (typeof no === 'function' && no.call(this, idx)), $.msg.close(idx); + }); + }; + /*! 自动处理JSON数据 */ + this.auto = function (ret, time) { + let url = ret.url || (typeof ret.data === 'string' ? ret.data : ''); + let msg = ret.msg || (typeof ret.info === 'string' ? ret.info : ''); + if (parseInt(ret.code) === 1 && time === 'false') { + return url ? $.form.goto(url) : $.form.reload(); + } else return (parseInt(ret.code) === 1) ? this.success(msg, time, function () { + $.msg.closeLastModal(url ? $.form.goto(url) : $.form.reload()); + }) : this.error(msg, 3, function () { + $.form.goto(url); + }); + }; + }; + + /*! 表单自动化组件 */ + $.form = new function () { + /*! 内容区选择器 */ + this.selecter = '.layui-layout-admin>.layui-body>.think-page-body'; + /*! 刷新当前页面 */ + this.reload = function (force) { + if (force) return top.location.reload(); + if (self !== top) return location.reload(); + return $.menu.href(location.hash); + }; + /*! 内容区域动态加载后初始化 */ + this.reInit = function ($dom) { + layui.form.render() && layui.element.render() && $(window).trigger('scroll'); + $.vali.listen($dom = $dom || $(this.selecter)) && $body.trigger('reInit', $dom); + return $dom.find('[required]').map(function () { + this.$parent = $(this).parent(); + if (this.$parent.is('label')) this.$parent.addClass('label-required-prev'); else this.$parent.prevAll('label.layui-form-label').addClass('label-required-next'); + }), $dom.find('[data-lazy-src]:not([data-lazy-loaded])').map(function () { + if (this.dataset.lazyLoaded === 'true') return; else this.dataset.lazyLoaded = 'true'; + if (this.nodeName === 'IMG') this.src = this.dataset.lazySrc; else this.style.backgroundImage = 'url(' + this.dataset.lazySrc + ')'; + }), $dom.find('input[data-date-range]').map(function () { + this.setAttribute('autocomplete', 'off'), laydate.render({ + type: this.dataset.dateRange || 'date', range: true, elem: this, done: function (value) { + $(this.elem).val(value).trigger('change'); + } + }); + }), $dom.find('input[data-date-input]').map(function () { + this.setAttribute('autocomplete', 'off'), laydate.render({ + type: this.dataset.dateInput || 'date', range: false, elem: this, done: function (value) { + $(this.elem).val(value).trigger('change'); + } + }); + }), $dom; + }; + /*! 在内容区显示视图 */ + this.show = function (html) { + $.form.reInit($(this.selecter).html(html)); + }; + /*! 异步加载的数据 */ + this.load = function (url, data, method, callable, loading, tips, time, headers) { + // 如果主页面 loader 显示中,绝对不显示 loading 图标 + loading = $('.layui-page-loader').is(':visible') ? false : loading; + let defer = jQuery.Deferred(), loadidx = loading !== false ? $.msg.loading(tips) : 0; + if (typeof data === 'object' && typeof data['_token_'] === 'string') { + headers = headers || {}, headers['User-Form-Token'] = data['_token_'], delete data['_token_']; + } + $.ajax({ + data: data || {}, type: method || 'GET', url: $.menu.parseUri(url), beforeSend: function (xhr, i) { + if (typeof Pace === 'object' && loading !== false) Pace.restart(); + if (typeof headers === 'object') for (i in headers) xhr.setRequestHeader(i, headers[i]); + }, error: function (XMLHttpRequest, $dialog, layIdx, iframe) { + // 异常消息显示处理 + if (defer.notify('load.error') && parseInt(XMLHttpRequest.status) !== 200 && XMLHttpRequest.responseText.indexOf('Call Stack') > -1) try { + layIdx = layer.open({title: XMLHttpRequest.status + ' - ' + XMLHttpRequest.statusText, type: 2, move: false, content: 'javascript:;'}); + layer.full(layIdx), $dialog = $('#layui-layer' + layIdx), iframe = $dialog.find('iframe').get(0); + (iframe.contentDocument || iframe.contentWindow.document).write(XMLHttpRequest.responseText); + iframe.winClose = {width: '30px', height: '30px', lineHeight: '30px', fontSize: '30px', marginLeft: 0}; + iframe.winTitle = {color: 'red', height: '60px', lineHeight: '60px', fontSize: '20px', textAlign: 'center', fontWeight: 700}; + $dialog.find('.layui-layer-title').css(iframe.winTitle) && $dialog.find('.layui-layer-setwin').css(iframe.winClose).find('span').css(iframe.winClose); + setTimeout(function () { + $(iframe).height($dialog.height() - 60); + }, 100); + } catch (e) { + layer.close(layIdx); + } + layer.closeAll('loading'); + if (parseInt(XMLHttpRequest.status) !== 200) { + $.msg.tips('E' + XMLHttpRequest.status + ' - 服务器繁忙,请稍候再试!'); + } else { + this.success(XMLHttpRequest.responseText); + } + }, success: function (res) { + defer.notify('load.success', res) && (time = time || res.wait || undefined); + if (typeof callable === 'function' && callable.call($.form, res, time, defer) === false) return false; + return typeof res === 'object' ? $.msg.auto(res, time) : $.form.show(res); + }, complete: function () { + defer.notify('load.complete') && $.msg.page.done() && $.msg.close(loadidx); + } + }); + return defer; + }; + /*! 兼容跳转与执行 */ + this.goto = function (url) { + if (typeof url !== 'string' || url.length < 1) return; + if (url.toLowerCase().indexOf('javascript:') === 0) { + return eval($.trim(url.substring(11))); + } else { + return location.href = url; + } + }; + /*! 以 HASH 打开新网页 */ + this.href = function (url, elem, hash) { + this.isMenu = !!(elem && elem.dataset.menuNode); + if (this.isMenu) layui.sessionData('pages', null); + if (typeof url !== 'string' || url === '#' || url === '') { + return this.isMenu && $('[data-menu-node^="' + elem.dataset.menuNode + '-"]:first').trigger('click'); + } + hash = hash || $.menu.parseUri(url, elem); + this.isRedirect = url.indexOf('#') > -1 && url.split('#', 2)[0] !== location.pathname; + this.isRedirect ? location.href = url.split('#', 2)[0] + '#' + hash : location.hash = hash; + }; + /*! 加载 HTML 到 BODY 位置 */ + this.open = function (url, data, call, load, tips) { + this.load(url, data, 'get', function (ret) { + return (typeof ret === 'object' ? $.msg.auto(ret) : $.form.show(ret)), false; + }, load, tips); + }; + /*! 打开 IFRAME 窗口 */ + this.iframe = function (url, name, area, offset, destroy, success, isfull, maxmin) { + if (typeof area === 'string' && area.indexOf('[') === 0) area = eval('(' + area + ')'); + this.idx = layer.open({title: name || '窗口', type: 2, area: area || ['800px', '580px'], end: destroy || null, offset: offset, fixed: true, maxmin: maxmin || false, content: url, success: success}); + return isfull && layer.full(this.idx), this.idx; + }; + /*! 加载 HTML 到弹出层,返回 refer 对象 */ + this.modal = function (url, data, name, call, load, tips, area, offset, isfull, maxmin) { + return this.load(url, data, 'GET', function (res, time, defer) { + if (typeof area === 'string' && area.indexOf('[') === 0) area = eval('(' + area + ')'); + return typeof res === 'object' ? $.msg.auto(res) : $.msg.mdx.push(this.idx = layer.open({ + type: 1, btn: false, area: area || '800px', offset: offset || 'auto', resize: false, content: res, maxmin: maxmin, + title: name === 'false' ? '' : name, end: () => defer.notify('modal.close'), success: function ($dom, idx) { + defer.notify('modal.success', $dom) && typeof call === 'function' && call.call($.form, $dom); + $.form.reInit($dom.off('click', '[data-close]').on('click', '[data-close]', function () { + $.base.onConfirm(this.dataset.confirm, () => layer.close(idx)); + })); + } + })) && isfull && layer.full(this.idx), false; + }, load, tips); + }; + }; + + /*! 后台菜单辅助插件 */ + $.menu = new function () { + /*! 计算 URL 地址中有效的 URI */ + this.getUri = function (uri) { + uri = uri || location.href; + uri = uri.indexOf(location.host) > -1 ? uri.split(location.host)[1] : uri; + return (uri.indexOf('#') > -1 ? uri.split('#')[1] : uri).split('?')[0]; + }; + /*! 通过 URI 查询最佳菜单 NODE */ + this.queryNode = function (uri, node) { + // 如果该节点存在直接返回 Node 值 + if (/^m-/.test(node = node || location.href.replace(/.*spm=([\d\-m]+).*/ig, '$1'))) { + if ($('[data-menu-node="' + node + '"]').size()) return node; + } + let path = uri.replace(/\.html$/ig, ''); + // 尝试通过 URI 查询节点值 + let $menu = $('[data-menu-node][data-open*="' + path + '"]'); + if ($menu.size()) return $menu.get(0).dataset.menuNode; + // 尝试通过 URL 查询节点值 + $menu = $('[data-menu-node][data-open~="#' + path + '"]'); + return $menu.size() ? $menu.get(0).dataset.menuNode : (/^m-/.test(node || '') ? node : ''); + }; + /*! 完整 URL 转 URI 地址 */ + this.parseUri = function (uri, elem, vars, temp, attrs) { + vars = {}, attrs = [], elem = elem || document.createElement('a'); + if (uri.indexOf('?') > -1) uri.split('?')[1].split('&').forEach(function (item) { + if (item.indexOf('=') > -1 && (temp = item.split('=')) && typeof temp[0] === 'string' && temp[0].length > 0) { + vars[temp[0]] = encodeURIComponent(decodeURIComponent(temp[1].replace(/%2B/ig, '%20'))); + } + }); + uri = this.getUri(uri); + if (typeof vars.spm !== 'string') vars.spm = elem.dataset.menuNode || this.queryNode(uri) || ''; + if (typeof vars.spm !== 'string' || vars.spm.length < 1) delete vars.spm; + for (let i in vars) attrs.push(i + '=' + vars[i]); + return uri + (attrs.length > 0 ? '?' + attrs.join('&') : ''); + }; + /*! 后台菜单动作初始化 */ + this.listen = function () { + let layout = $('.layui-layout-admin'), mini = 'layui-layout-left-mini'; + /*! 菜单切及MiniTips处理 */ + $.base.onEvent('click', '[data-target-menu-type]', function () { + layui.data('AdminMenuType', {key: 'mini', value: layout.toggleClass(mini).hasClass(mini)}); + }).on('click', '[data-submenu-layout]>a', function () { + setTimeout("$.menu.sync(1)", 100); + }).on('mouseenter', '[data-target-tips]', function (evt) { + if (!layout.hasClass(mini) || !this.dataset.targetTips) return; + evt.idx = layer.tips(this.dataset.targetTips, this, {time: 0}); + $(this).mouseleave(() => layer.close(evt.idx)); + }); + /*! 监听窗口大小及HASH切换 */ + return $(window).on('resize', function () { + (layui.data('AdminMenuType')['mini'] || $body.width() < 1000) ? layout.addClass(mini) : layout.removeClass(mini); + }).trigger('resize').on('hashchange', function () { + if (/^#(https?:)?(\/\/|\\\\)/.test(location.hash)) return $.msg.tips('禁止访问外部链接!'); + return location.hash.length < 1 ? $body.find('[data-menu-node]:first').trigger('click') : $.menu.href(location.hash); + }).trigger('hashchange'); + }; + /*! 同步二级菜单展示状态(1同步缓存,2同步展示) */ + this.sync = function (mode) { + $('[data-submenu-layout]').map(function () { + let node = this.dataset.submenuLayout; + if (mode === 1) layui.data('AdminMenuState', {key: node, value: $(this).hasClass('layui-nav-itemed') ? 2 : 1}); + if (mode === 2) (layui.data('AdminMenuState')[node] || 0) === 2 && $(this).addClass('layui-nav-itemed'); + }); + }; + /*! 页面 LOCATION-HASH 跳转 */ + this.href = function (hash, node) { + if ((hash || '').length < 1) return $('[data-menu-node]:first').trigger('click'); + $.form.load(hash, {}, 'get', false, !$.msg.page.stat()), $.menu.sync(2); + // 菜单选择切换 + if (/^m-/.test(node = node || $.menu.queryNode($.menu.getUri()))) { + let arr = node.split('-'), tmp = arr.shift(), all = $('a[data-menu-node]').parent('.layui-this'); + while (arr.length > 0) { + tmp = tmp + '-' + arr.shift(); + all = all.not($('a[data-menu-node="' + tmp + '"]').parent().addClass('layui-this')); + } + all.removeClass('layui-this'); + // 菜单模式切换 + if (node.split('-').length > 2) { + let tmp = node.split('-'), pnode = tmp.slice(0, 2).join('-'), snode = tmp.slice(0, 3).join('-') + $('[data-menu-layout]').not($('[data-menu-layout="' + pnode + '"]').removeClass('layui-hide')).addClass('layui-hide'); + $('[data-submenu-layout="' + snode + '"]').addClass('layui-nav-itemed'); + $('.layui-layout-admin').removeClass('layui-layout-left-hide'); + } else { + $('.layui-layout-admin').addClass('layui-layout-left-hide'); + } + setTimeout("$.menu.sync(1);", 100); + } + }; + }; + + /*! 表单转JSON */ + $.fn.formToJson = function () { + let self = this, data = {}, push = {}; + let rules = {key: /\w+|(?=\[])/g, push: /^$/, fixed: /^\d+$/, named: /^\w+$/}; + this.build = function (base, key, value) { + return (base[key] = value), base; + }, this.pushCounter = function (name) { + if (push[name] === undefined) push[name] = 0; + return push[name]++; + }, $.each($(this).serializeArray(), function () { + let key, keys = this.name.match(rules.key), merge = this.value, name = this.name; + while ((key = keys.pop()) !== undefined) { + name = name.replace(new RegExp("\\[" + key + "\\]$"), ''); + if (key.match(rules.push)) merge = self.build([], self.pushCounter(name), merge); + else if (key.match(rules.fixed)) merge = self.build([], key, merge); + else if (key.match(rules.named)) merge = self.build({}, key, merge); + } + data = $.extend(true, data, merge); + }); + return data; + }; + + /*! 全局文件上传 */ + $.fn.uploadFile = function (callable, initialize) { + return this.each(function (idx, elem) { + if (elem.dataset.inited) return false; else elem.dataset.inited = 'true'; + elem.dataset.multiple = '|one|btn|'.indexOf(elem.dataset.file || 'one') > -1 ? '0' : '1'; + require(['upload'], function (apply) { + apply(elem, callable) && setTimeout(function () { + typeof initialize === 'function' && initialize.call(elem, elem); + }, 100); + }); + }); + }; + + /*! 上传单个视频 */ + $.fn.uploadOneVideo = function () { + return this.each(function () { + if (this.dataset.inited) return; else this.dataset.inited = 'true'; + let $bt = $('
    '); + let $in = $(this).on('change', function () { + if (this.value) $bt.css('backgroundImage', 'url("")').find('span[data-file]').html(''); + }).after($bt).trigger('change'); + $bt.on('click', 'i.layui-icon-search', function (event) { + event.stopPropagation(), $in.val() && $.form.iframe(encodeURI($in.val()), '视频预览'); + }).on('click', 'i.layui-icon-close', function (event) { + event.stopPropagation(), $bt.attr('style', '').find('span[data-file]').html('') && $in.val('').trigger('change'); + }).find('[data-file]').data('input', this).attr({ + 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'mp4', + }); + }); + }; + + /*! 上传单张图片 */ + $.fn.uploadOneImage = function () { + return this.each(function () { + if (this.dataset.inited) return; else this.dataset.inited = 'true'; + let $bt = $('
    '); + let $in = $(this).on('change', function () { + if (this.value) $bt.css('backgroundImage', 'url(' + encodeURI(this.value) + ')'); + }).after($bt).trigger('change'); + $bt.on('click', 'i.layui-icon-search', function (event) { + event.stopPropagation(), $in.val() && $.previewImage(encodeURI($in.val())); + }).on('click', 'i.layui-icon-close', function (event) { + event.stopPropagation(), $bt.attr('style', '') && $in.val('').trigger('change'); + }).find('[data-file]').data('input', this).attr({ + 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'gif,png,jpg,jpeg', + 'data-max-width': $in.data('max-width') || 0, 'data-max-height': $in.data('max-height') || 0, + 'data-cut-width': $in.data('cut-width') || 0, 'data-cut-height': $in.data('cut-height') || 0, + }); + }); + }; + + /*! 上传多张图片 */ + $.fn.uploadMultipleImage = function () { + return this.each(function () { + if (this.dataset.inited) return; else this.dataset.inited = 'true'; + let $bt = $('
    '); + let ims = this.value ? this.value.split('|') : [], $in = $(this).after($bt); + $bt.find('[data-file]').attr({ + 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'gif,png,jpg,jpeg', + 'data-max-width': $in.data('max-width') || 0, 'data-max-height': $in.data('max-height') || 0, + 'data-cut-width': $in.data('cut-width') || 0, 'data-cut-height': $in.data('cut-height') || 0, + }).on('push', function (evt, src) { + ims.push(src), $in.val(ims.join('|')).trigger('change'), showImageContainer([src]); + }) && (ims.length > 0 && showImageContainer(ims)); + + function showImageContainer(srcs) { + $(srcs).each(function (idx, src, $img) { + $img = $(''); + $img.attr('data-tips-image', encodeURI(src)).css('backgroundImage', 'url(' + encodeURI(src) + ')').on('click', 'a', function (event, index, prevs, $item) { + event.stopPropagation(), $item = $(this).parent().parent(), index = $(this).index(); + if (index === 2 && $item.index() !== $bt.prevAll('div.uploadimage').length) $item.next().after($item); + else if (index === 0 && $item.index() > 1) $item.prev().before($item); else if (index === 1) $item.remove(); + ims = [], $bt.prevAll('.uploadimage').map(function () { + ims.push($(this).attr('data-tips-image')); + }); + ims.reverse(), $in.val(ims.join('|')).trigger('change'); + }), $bt.before($img); + }); + } + }); + }; + + /*! 标签输入插件 */ + $.fn.initTagInput = function () { + return this.each(function () { + let $this = $(this), tags = this.value ? this.value.split(',') : []; + let $text = $(''); + let $tags = $('
    ').append($text); + $this.parent().append($tags) && $text.off('keydown blur') && (tags.length > 0 && showTags(tags)); + $text.on('blur keydown', function (event, value) { + if (event.keyCode === 13 || event.type === 'blur') { + event.preventDefault(), (value = $text.val().replace(/^\s*|\s*$/g, '')); + if (tags.indexOf($(this).val()) > -1) return $.msg.notify('温馨提示', '该标签已经存在!', 3000, {type: 'error', width: 280}); + else if (value.length > 0) tags.push(value), $this.val(tags.join(',')), showTags([value]), this.focus(), $text.val(''); + } + }); + + function showTags(tagsArr) { + $(tagsArr).each(function (idx, text) { + $('
    ').data('value', text).on('click', 'i', function () { + tags.splice(tags.indexOf($(this).parent().data('value')), 1); + $this.val(tags.join(',')) && $(this).parent().remove(); + }).insertBefore($text).html(text + ''); + }); + } + }); + }; + + /*! 文本框插入内容 */ + $.fn.insertAtCursor = function (value) { + return this.each(function () { + this.focus(); + if (document.selection) { + let selection = document.selection.createRange(); + (selection.text = value), selection.select(), selection.unselect(); + } else if (this.selectionStart || this.selectionStart === 0) { + let spos = this.selectionStart, apos = this.selectionEnd || spos; + this.value = this.value.substring(0, spos) + value + this.value.substring(apos); + this.selectionEnd = this.selectionStart = spos + value.length; + } else { + this.value += value; + } + this.focus(); + }); + }; + + /*! 组件 layui.table 封装 */ + $.fn.layTable = function (params) { + return this.each(function () { + $.layTable.create(this, params); + }); + }; + $.layTable = new function () { + this.showImage = function (image, circle, size, title) { + if (typeof image !== 'string' || image.length < 5) { + return '-' + (title ? laytpl('{{d.title}}').render({title: title}) : ''); + } + return laytpl('
    ').render({ + size: size || 'ss', class: circle ? 'shadow-inset' : 'headimg-no', image: image, style: 'background-image:url(' + image + ');margin-right:0' + }) + (title ? laytpl('{{d.title}}').render({title: title}) : ''); + }, this.render = function (tabldId) { + return this.reload(tabldId, true); + }, this.reload = function (tabldId, force) { + return typeof tabldId === 'string' ? tabldId.split(',').map(function (tableid) { + $('#' + tableid).trigger(force ? 'render' : 'reload') + }) : $.form.reload(); + }, this.create = function (table, params) { + // 动态初始化表格 + table.id = table.id || 't' + Math.random().toString().replace('.', ''); + let $table = $(table).attr('lay-filter', table.dataset.id = table.getAttribute('lay-filter') || table.id); + // 插件初始化参数 + let option = params || {}, data = option.where || {}, sort = option.initSort || option.sort || {}; + option.id = table.id, option.elem = table, option.url = params.url || table.dataset.url || location.href; + option.limit = params.limit || 20, option.loading = params.loading !== false, option.autoSort = params.autoSort === true; + option.page = params.page !== false ? (params.page || true) : false, option.cols = params.cols || [[]], option.success = params.done || ''; + option.cellExpandedMode = option.cellExpandedMode || 'tips'; + + // 默认动态设置页数, 动态设置最大高度 + if (option.page === true) option.page = {curr: layui.sessionData('pages')[option.id] || 1}; + if (option.width === 'full') option.width = $table.parent().width(); + if (option.height === 'full') if ($table.parents('.iframe-pagination').size()) { + $table.parents('.iframe-pagination').addClass('not-footer'); + option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 20; + } else if ($table.parents('.laytable-pagination').size()) { + option.height = $table.parents('.laytable-pagination').height() - $table.removeClass('layui-hide').position().top - 20; + } else { + option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 35; + } + + // 初始化不显示头部 + let cls = ['.layui-table-header', '.layui-table-fixed', '.layui-table-body', '.layui-table-page']; + option.css = (typeof option.height === 'number' ? '{height:' + option.height + 'px}' : '') + (option.css || '') + cls.concat(['']).join('{opacity:0}'); + + // 动态计算最大页数 + option.done = function (res, curr, count) { + layui.sessionData('pages', {key: table.id, value: this.page.curr || 1}); + typeof option.success === 'function' && option.success.call(this, res, curr, count); + $.form.reInit($table.next()).find('[data-open],[data-load][data-time!="false"],[data-action][data-time!="false"],[data-queue],[data-iframe]').not('[data-table-id]').attr('data-table-id', table.id); + (option.loading = this.loading = true) && $table.data('next', this).next().find(cls.join(',')).animate({opacity: 1}); + setTimeout(() => layui.table.resize(table.id), 10); + }, option.parseData = function (res) { + if (res.code === 0 && res.url) { + return $.msg.auto(res); + } + if (typeof params.filter === 'function') { + res.data = params.filter(res.data, res); + } + if (!this.page || !this.page.curr) return res; + let curp = this.page.curr, maxp = Math.ceil(res.count / (this.page.limit || option.limit)); + if (curp > maxp && maxp > 1) $table.trigger('reload', {page: {curr: maxp}}); + return res; + }; + // 关联搜索表单 + let sform, search = params.search || table.dataset.targetSearch || 'form[data-table-id="' + table.id + '"] [data-form-export]'; + if (search) (sform = $body.find(search)).map(function () { + $(this).attr('data-table-id', table.id); + }); + // 关联绑定选择项 + let checked = params.checked || table.dataset.targetChecked; + if (checked) $body.find(checked).map(function () { + $(this).attr('data-table-id', table.id); + }); + // 实例并绑定事件 + $table.data('this', layui.table.render(bindData(option))); + $table.bind('reload render reloadData', function (evt, opts) { + if (option.page === false) (opts || {}).page = false; + data = $.extend({}, data, (opts || {}).where || {}); + opts = bindData($.extend({}, opts || {}, {loading: true})); + table.id.split(',').map(function (tableid) { + if (evt.type.indexOf('reload') > -1) { + layui.table.reloadData(tableid, opts); + } else { + layui.table.render(tableid, opts); + } + }) + }).bind('row sort tool edit radio toolbar checkbox rowDouble', function (evt, call) { + table.id.split(',').map(function (tableid) { + layui.table.on(evt.type + '(' + tableid + ')', call) + }) + }).bind('setFullHeight', function () { + $table.trigger('render', {height: $(window).height() - $table.next().offset().top - 35}) + }).trigger('sort', function (rets) { + (sort = rets), $table.trigger('reload') + }).trigger('rowDouble', function (event) { + $(event.tr[0]).find('[data-event-dbclick]').map(function () { + $(this).trigger(this.dataset.eventDbclick || 'click', event); + }); + }); + return $table; + + // 生成初始化参数 + function bindData(options) { + data['output'] = 'layui.table'; + if (sort.field && sort.type) { + data['_order_'] = sort.type, data['_field_'] = sort.field; + options.initSort = {type: sort.type.split(',')[0].split(' ')[0], field: sort.field.split(',')[0].split(' ')[0]}; + if (sform) $(sform).find('[data-form-export]').attr({'data-sort-type': sort.type, 'data-sort-field': sort.field}); + } + if (options.page === false) options.limit = ''; + return (options['where'] = data), options; + } + }; + }; + + /*!格式化文件大小 */ + $.formatFileSize = function (size, fixed, units) { + let unit; + units = units || ['B', 'K', 'M', 'G', 'TB']; + while ((unit = units.shift()) && size > 1024) size = size / 1024; + return (unit === 'B' ? size : size.toFixed(fixed === undefined ? 2 : fixed)) + unit; + } + + /*! 弹出图片层 */ + $.previewImage = function (src, area) { + let img = new Image(), defer = $.Deferred(), loaded = $.msg.loading(); + img.style.background = '#FFF', img.referrerPolicy = 'no-referrer'; + img.style.height = 'auto', img.style.width = area || '100%', img.style.display = 'none'; + return document.body.appendChild(img), img.onerror = function () { + $.msg.close(loaded) && defer.reject(); + }, img.src = src, img.onload = function () { + layer.open({ + type: 1, title: false, shadeClose: true, content: $(img), success: function ($elem, idx) { + $.msg.close(loaded) && defer.notify($elem, idx); + }, area: area || '480px', skin: 'layui-layer-nobg', closeBtn: 1, end: function () { + document.body.removeChild(img) && defer.resolve() + } + }); + }, defer.promise(); + }; + + /*! 以手机模式显示内容 */ + $.previewPhonePage = function (href, title) { + let template = '
    {{d.title}}
    '; + layer.style(layer.open({type: true, resize: false, scrollbar: false, area: ['320px', '600px'], title: false, closeBtn: true, shadeClose: false, skin: 'layui-layer-nobg', content: laytpl(template).render({title: title || '公众号', url: href})}), {boxShadow: 'none'}); + }; + + /*! 显示任务进度 */ + $.loadQueue = function (code, doScript, element) { + require(['queue'], function (Queue) { + return new Queue(code, doScript, element); + }); + }; + + /*! 注册JqFn函数 */ + $.fn.vali = function (done, init) { + return this.each(function () { + $.vali(this, done, init); + }); + }; + + /*! 创建表单验证 */ + $.vali = function (form, done, init) { + require(['validate'], function (Validate) { + /** @type {import("./plugs/admin/validate")|Validate}*/ + let vali = $(form).data('validate') || new Validate(form); + typeof init === 'function' && init.call(vali, $(form).formToJson(), vali); + typeof done === 'function' && vali.addDoneEvent(done); + }); + }; + + /*! 自动监听表单 */ + $.vali.listen = function ($dom) { + let $els = $($dom || $body).find('form[data-auto]'); + $dom && $($dom).filter('form[data-auto]') && $els.add($dom); + return $els.map(function (idx, form) { + $(this).vali(function (data) { + let type = form.getAttribute('method') || 'POST', href = form.getAttribute('action') || location.href; + let dset = form.dataset, tips = dset.tips || undefined, time = dset.time || undefined, taid = dset.tableId || false; + let call = window[dset.callable || '_default_callable'] || (taid ? function (ret) { + if (typeof ret === 'object' && ret.code > 0 && $('#' + taid).size() > 0) { + return $.msg.success(ret.info, 3, function () { + $.msg.closeLastModal(); + (typeof ret.data === 'string' && ret.data) ? $.form.goto(ret.data) : $.layTable.reload(taid); + }) && false; + } + } : undefined); + $.base.onConfirm(dset.confirm, function () { + $.form.load(href, data, type, call, true, tips, time); + }); + }); + }); + }; + + /*! 注册 data-search 表单搜索行为 */ + $.base.onEvent('submit', 'form.form-search', function () { + if (this.dataset.tableId) { + let data = $(this).formToJson(); + return this.dataset.tableId.split(',').map(function (tableid) { + $('table#' + tableid).trigger('reload', {page: {curr: 1}, where: data}); + }); + } + let url = $(this).attr('action').replace(/&?page=\d+/g, ''); + if ((this.method || 'get').toLowerCase() === 'get') { + let split = url.indexOf('?') > -1 ? '&' : '?', stype = location.href.indexOf('spm=') > -1 ? '#' : ''; + $.form.goto(stype + $.menu.parseUri(url + split + $(this).serialize().replace(/\+/g, ' '))); + } else { + $.form.load(url, this, 'post'); + } + }); + + /*! 注册 data-file 事件行为 */ + $.base.onEvent('click', '[data-file]', function () { + this.id = this.dataset.id = this.id || (function (date) { + return (date + Math.random()).replace('0.', ''); + })(layui.util.toDateString(Date.now(), 'yyyyMMddHHmmss-')); + /*! 查找表单元素, 如果没有找到将不会自动写值 */ + if (!(this.$elem = $(this)).data('input') && this.$elem.data('field')) { + let $input = $('input[name="' + this.$elem.data('field') + '"]:not([type=file])'); + this.$elem.data('input', $input.size() > 0 ? $input.get(0) : null); + } + // 单图或多图选择器 ( image|images ) + if (typeof this.dataset.file === 'string' && /^images?$/.test(this.dataset.file)) { + return $.form.modal(tapiRoot + '/api.upload/image', this.dataset, '图片选择器') + } + // 其他文件上传处理 + this.dataset.inited || $(this).uploadFile(undefined, function () { + $(this).trigger('upload.start'); + }); + }); + + /*! 注册 data-load 事件行为 */ + $.base.onEvent('click', '[data-load]', function () { + $.base.applyRuleValue(this, {}, function (data, elem, dset) { + $.form.load(dset.load, data, 'get', $.base.onConfirm.getLoadCallable(dset.tableId), true, dset.tips, dset.time); + }); + }); + + /*! 注册 data-reload 事件行为 */ + $.base.onEvent('click', '[data-reload]', function () { + $.layTable.reload(this.dataset.tableId || true); + }); + + /*! 注册 data-dbclick 事件行为 */ + $.base.onEvent('dblclick', '[data-dbclick]', function () { + $(this).find(this.dataset.dbclick || '[data-dbclick]').trigger('click'); + }); + + /*! 注册 data-check 事件行为 */ + $.base.onEvent('click', '[data-check-target]', function () { + let target = this; + $(this.dataset.checkTarget).map(function () { + (this.checked = !!target.checked), $(this).trigger('change'); + }); + }); + + /*! 表单元素失去焦点时数字 */ + $.base.onEvent('blur', '[data-blur-number]', function () { + let set = this.dataset, value = parseFloat(this.value) || 0; + let min = $.isNumeric(set.valueMin) ? set.valueMin : this.min; + let max = $.isNumeric(set.valueMax) ? set.valueMax : this.max; + if ($.isNumeric(min) && value < min) value = parseFloat(min) || 0; + if ($.isNumeric(max) && value > max) value = parseFloat(max) || 0; + this.value = value.toFixed(parseInt(set.blurNumber) || 0); + }); + + /*! 表单元素失焦时提交 */ + $.base.onEvent('blur', '[data-action-blur],[data-blur-action]', function () { + let that = $(this), dset = this.dataset, data = {'_token_': dset.token || dset.csrf || '--'}; + let attrs = (dset.value || '').replace('{value}', that.val()).split(';'); + for (let i in attrs) data[attrs[i].split('#')[0]] = attrs[i].split('#')[1]; + $.base.onConfirm(dset.confirm, function () { + $.form.load(dset.actionBlur || dset.blurAction, data, dset.method || 'post', function (ret) { + return that.css('border', (ret && ret.code) ? '1px solid #e6e6e6' : '1px solid red') && false; + }, dset.loading !== 'false', dset.loading, dset.time); + }); + }); + + /*! 注册 data-href 事件行为 */ + $.base.onEvent('click', '[data-href]', function () { + if (this.dataset.href && this.dataset.href.indexOf('#') !== 0) { + $.form.goto(this.dataset.href); + } + }); + + /*! 注册 data-open 事件行为 */ + $.base.onEvent('click', '[data-open]', function () { + // 仅记录当前表格分页 + let page = 0, tbid = this.dataset.tableId || null; + if (tbid) page = layui.sessionData('pages')[tbid] || 0; + layui.sessionData('pages', null); + if (page > 0) layui.sessionData('pages', {key: tbid, value: page}) + // 根据链接类型跳转页面 + if (this.dataset.open.match(/^https?:/)) { + $.form.goto(this.dataset.open); + } else { + $.form.href(this.dataset.open, this); + } + }); + + /*! 注册 data-action 事件行为 */ + $.base.onEvent('click', '[data-action]', function () { + $.base.applyRuleValue(this, {}, function (data, elem, dset) { + Object.assign(data, {'_token_': dset.token || dset.csrf || '--'}) + let load = dset.loading !== 'false', tips = typeof load === 'string' ? load : undefined; + $.form.load(dset.action, data, dset.method || 'post', $.base.onConfirm.getLoadCallable(dset.tableId), load, tips, dset.time) + }); + }); + + /*! 注册 data-modal 事件行为 */ + $.base.onEvent('click', '[data-modal]', function () { + $.base.applyRuleValue(this, {open_type: 'modal'}, function (data, elem, dset) { + let defer = $.form.modal(dset.modal, data, dset.title || this.innerText || '编辑', undefined, undefined, undefined, dset.area || dset.width || '800px', dset.offset || 'auto', dset.full !== undefined, dset.maxmin || false); + defer.progress((type) => type === 'modal.close' && dset.closeRefresh && $.layTable.reload(dset.closeRefresh)); + }); + }); + + /*! 注册 data-iframe 事件行为 */ + $.base.onEvent('click', '[data-iframe]', function () { + $.base.applyRuleValue(this, {open_type: 'iframe'}, function (data, elem, dset) { + let name = dset.title || this.innerText || 'IFRAME 窗口'; + let area = dset.area || [dset.width || '800px', dset.height || '580px']; + let frame = dset.iframe + (dset.iframe.indexOf('?') > -1 ? '&' : '?') + $.param(data); + $(this).attr('data-index', $.form.iframe(frame + '&' + $.param(data), name, area, dset.offset || 'auto', function () { + typeof dset.refresh !== 'undefined' && $.layTable.reload(dset.tableId || true); + }, undefined, dset.full !== undefined, dset.maxmin || false)); + }) + }); + + /*! 注册 data-video-player 事件行为 */ + $.base.onEvent('click', '[data-video-player]', function () { + let idx = $.msg.loading(), url = this.dataset.videoPlayer, name = this.dataset.title || '媒体播放器', payer; + require(['artplayer'], () => layer.open({ + title: name, type: 1, fixed: true, maxmin: false, + content: '
    ', + end: () => payer.destroy(), success: $ele => payer = new Artplayer({ + url: url, container: $ele.selector + ' .data-play-video', controls: [ + {html: '全屏播放', position: 'right', click: () => payer.fullscreen = !payer.fullscreen}, + ] + }, art => art.play(), $.msg.close(idx)) + })); + }); + + /*! 注册 data-icon 事件行为 */ + $.base.onEvent('click', '[data-icon]', function () { + let location = tapiRoot + '/api.plugs/icon', field = this.dataset.icon || this.dataset.field || 'icon'; + $.form.iframe(location + (location.indexOf('?') > -1 ? '&' : '?') + 'field=' + field, '图标选择', ['900px', '700px']); + }); + + /*! 注册 data-copy 事件行为 */ + $.base.onEvent('click', '[data-copy]', function () { + layui.lay.clipboard.writeText({ + text: this.dataset.copy || this.innerText, + done: () => $.msg.tips('已复制到剪贴板!'), + error: () => $.msg.tips('请使用鼠标复制!') + }) + }); + + /*! 异步任务状态监听与展示 */ + $.base.onEvent('click', '[data-queue]', function () { + $.base.applyRuleValue(this, {}, function (data, elem, dset) { + $.form.load(dset.queue, data, 'post', function (ret) { + if (typeof ret.data === 'string' && ret.data.indexOf('Q') === 0) { + return $.loadQueue(ret.data, true, elem), false; + } + }); + }); + }); + + /*! 注册 data-tips-text 事件行为 */ + $.base.onEvent('mouseenter', '[data-tips-text]', function () { + let opts = {tips: [$(this).attr('data-tips-type') || 3, '#78BA32'], time: 0}; + let layidx = layer.tips($(this).attr('data-tips-text') || this.innerText, this, opts); + $(this).off('mouseleave').on('mouseleave', function () { + setTimeout("layer.close('" + layidx + "')", 100); + }); + }); + + /*! 注册 data-tips-hover 事件行为 */ + $.base.onEvent('mouseenter', '[data-tips-image][data-tips-hover],[data-tips-image-hover]', function () { + let $el = $(this), img = new Image(); + if ((img.src = this.dataset.tipsImage || this.dataset.lazySrc || this.src || this.value)) { + img.layopt = {anim: 5, tips: 3, time: 0, skin: 'layui-layer-image', isOutAnim: false, scrollbar: false}; + img.referrerPolicy = 'no-referrer', img.style.maxWidth = '260px', img.style.maxHeight = '260px'; + $el.data('layidx', layer.tips(img.outerHTML, this, img.layopt)).off('mouseleave').on('mouseleave', function () { + $el.off('mousemove') && layer.close($el.data('layidx')); + }); + let $lay = $('#layui-layer' + $el.data('layidx')); + $el.on('mousemove', e => $lay.css({top: e.pageY + 20, left: e.pageX - 20})); + } + }); + + /*! 注册 data-tips-image 事件行为 */ + $.base.onEvent('click', '[data-tips-image]', function (event) { + (event.items = [], event.$imgs = $(this).parent().find('[data-tips-image]')).map(function () { + (src => src && event.items.push({src: src}))(this.dataset.tipsImage || this.dataset.lazySrc || this.src || this.value); + }) && event.items.length > 0 && layer.photos({ + anim: 5, closeBtn: 1, photos: {start: event.$imgs.index(this), data: event.items}, tab: function (pic, $ele) { + $ele.find('img').attr('referrerpolicy', 'no-referrer'); + $ele.find('.layui-layer-close').css({top: '20px', right: '20px', position: 'fixed'}); + } + }); + }); + + /*! 注册 data-phone-view 事件行为 */ + $.base.onEvent('click', '[data-phone-view]', function () { + $.previewPhonePage(this.dataset.phoneView || this.href); + }); + + /*! 注册 data-target-submit 事件行为 */ + $.base.onEvent('click', '[data-target-submit]', function () { + $(this.dataset.targetSubmit || 'form:last').submit(); + }); + + /*! 表单编辑返回操作 */ + $.base.onEvent('click', '[data-target-backup],[data-history-back]', function () { + $.base.onConfirm(this.dataset.historyBack || this.dataset.targetBackup || '确定要返回上个页面吗?', function () { + history.back(); + }); + }); + + /*! 图片加载异常处理 */ + document.addEventListener('error', function (event) { + if (event.target.nodeName !== 'IMG') return; + event.target.src = baseRoot + 'theme/img/404_icon.png'; + }, true); + + /*! 初始化系统菜单及表单验证 */ + $.menu.listen() && $.form.reInit($body); +}); \ No newline at end of file diff --git a/public/static/extra/script.js b/public/static/extra/script.js new file mode 100644 index 0000000..caebe9f --- /dev/null +++ b/public/static/extra/script.js @@ -0,0 +1,53 @@ +// +---------------------------------------------------------------------- +// | Static Plugin for ThinkAdmin +// +---------------------------------------------------------------------- +// | 官方网站: https://thinkadmin.top +// +---------------------------------------------------------------------- +// | 版权所有 2014~2023 Anyon +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// | 免责声明 ( https://thinkadmin.top/disclaimer ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +// | github 代码仓库:https://github.com/zoujingli/think-plugs-static +// +---------------------------------------------------------------------- +// | 自定义后台扩展脚本,需要在加载 admin.js 后载入 +// | 使用 composer require zoujingli/think-plugs-static 时不会更新此文件 +// +---------------------------------------------------------------------- + +$(function () { + window.$body = $('body'); + + /*! 初始化异步加载的内容扩展动作 */ + // $body.on('reInit', function (evt, $dom) { + // console.log('Event.reInit', $dom); + // }); + + /*! 追加 require 配置参数 + /*! 加载的文件不能与主配置重复 */ + // require.config({ + // paths: { + // 'vue': ['plugs/vue/vue.min'], + // }, + // shim: { + // 'vue': ['json'] + // }, + // }); + // // 基于 Require 加载测试 + // require(['vue', 'md5'], function (vue, md5) { + // console.log(vue) + // console.log(md5.hash('content')) + // }); + + /*! 其他 javascript 脚本代码 */ + + // 显示表格图片 + window.showTableImage = function (image, circle, size, title) { + if (typeof image !== 'string' || image.length < 5) { + return '-' + (title ? laytpl('{{d.title}}').render({title: title}) : ''); + } + return laytpl('
    ').render({ + size: size || 'ss', class: circle ? 'shadow-inset' : 'headimg-no', image: image, style: 'background-image:url(' + image + ');margin-right:0' + }) + (title ? laytpl('{{d.title}}').render({title: title}) : ''); + }; +}); \ No newline at end of file diff --git a/public/static/extra/style.css b/public/static/extra/style.css new file mode 100644 index 0000000..9f27dae --- /dev/null +++ b/public/static/extra/style.css @@ -0,0 +1,16 @@ +/* +---------------------------------------------------------------------- +/* | Static Plugin for ThinkAdmin +/* +---------------------------------------------------------------------- +/* | 官方网站: https://thinkadmin.top +/* +---------------------------------------------------------------------- +/* | 版权所有 2014~2023 Anyon +/* +---------------------------------------------------------------------- +/* | 开源协议 ( https://mit-license.org ) +/* | 免责声明 ( https://thinkadmin.top/disclaimer ) +/* +---------------------------------------------------------------------- +/* | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +/* | github 代码仓库:https://github.com/zoujingli/think-plugs-static +/* +---------------------------------------------------------------------- +/* | 自定义后台扩展样式,需要在加载 console.css 后载入 +/* | 使用 composer require zoujingli/think-plugs-static 时不会更新此文件 +/* +---------------------------------------------------------------------- */ diff --git a/public/static/login.js b/public/static/login.js new file mode 100644 index 0000000..7777f91 --- /dev/null +++ b/public/static/login.js @@ -0,0 +1,75 @@ +// +---------------------------------------------------------------------- +// | Static Plugin for ThinkAdmin +// +---------------------------------------------------------------------- +// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ] +// +---------------------------------------------------------------------- +// | 官方网站: https://thinkadmin.top +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// | 免责声明 ( https://thinkadmin.top/disclaimer ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +// | github 代码仓库:https://github.com/zoujingli/think-plugs-static +// +---------------------------------------------------------------------- + +$(function () { + + window.$body = $('body'); + + /*! 登录界面背景切换 */ + $('[data-bg-transition]').each(function (i, el) { + el.idx = 0, el.imgs = [], el.SetBackImage = function (css) { + window.setTimeout(function () { + $(el).removeClass(el.imgs.join(' ')).addClass(css) + }, 1000) && $body.removeClass(el.imgs.join(' ')).addClass(css) + }, el.lazy = window.setInterval(function () { + el.imgs.length > 0 && el.SetBackImage(el.imgs[++el.idx] || el.imgs[el.idx = 0]); + }, 5000) && el.dataset.bgTransition.split(',').forEach(function (image) { + layui.img(image, function (img, cssid, style) { + style = document.createElement('style'), cssid = 'LoginBackImage' + (el.imgs.length + 1); + style.innerHTML = '.' + cssid + '{background-image:url("' + encodeURI(image) + '")!important}'; + document.head.appendChild(style) && el.imgs.push(cssid); + }); + }); + }); + + /*! 后台加密登录处理 */ + $body.find('form[data-login-form]').each(function (idx, form) { + require(['md5'], function (md5) { + $(form).vali(function (data) { + data['password'] = md5.hash(md5.hash(data['password']) + data['uniqid']); + $.form.load(location.href, data, "post", function (ret) { + if (parseInt(ret.code) !== 1) { + $(form).find('[data-captcha]').trigger('click'); + $(form).find('.verify.layui-hide').removeClass('layui-hide'); + } + }, null, null, 'false'); + }); + }); + }); + + /*! 登录图形验证码刷新 */ + $body.on('click', '[data-captcha]', function () { + let $that = $(this), $form = $that.parents('form'); + let action = this.dataset.captcha || location.href; + if (action.length < 5) return $.msg.tips('请设置验证码请求及验证地址'); + let type = this.dataset.captchaType || 'captcha-type', token = this.dataset.captchaToken || 'captcha-token'; + let uniqid = this.dataset.fieldUniqid || 'captcha-uniqid', verify = this.dataset.fieldVerify || 'captcha-verify'; + $.form.load(action, {type: type, token: token}, 'post', function (ret) { + if (ret.code) { + // 每六分钟自动刷新验证码 + $that.attr('timer') && clearTimeout($that.attr('timer')); + $that.attr('timer', setTimeout(() => $that.trigger('click'), 350000)); + $that.html('img').find('input').attr('name', uniqid).val(ret.data.uniqid || ''); + $form.find('[name="' + verify + '"]').attr('value', ret.data.code || '').val(ret.data.code || ''); + return (ret.data.code || $form.find('.verify.layui-hide').removeClass('layui-hide')), false; + } + }, false); + }); + + /*! 初始化登录图形 */ + $('[data-captcha]').map(function () { + $(this).trigger('click'); + }); + +}); \ No newline at end of file diff --git a/public/static/plugs/admin/excel.js b/public/static/plugs/admin/excel.js new file mode 100644 index 0000000..db1eeaa --- /dev/null +++ b/public/static/plugs/admin/excel.js @@ -0,0 +1,213 @@ +// +---------------------------------------------------------------------- +// | Static Plugin for ThinkAdmin +// +---------------------------------------------------------------------- +// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ] +// +---------------------------------------------------------------------- +// | 官方网站: https://thinkadmin.top +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// | 免责声明 ( https://thinkadmin.top/disclaimer ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +// | github 代码仓库:https://github.com/zoujingli/think-plugs-static +// +---------------------------------------------------------------------- + +define(function () { + + /*! 定义构造函数 */ + function Excel(data, name) { + if (data && name) this.export(data, name); + } + + /*! 默认导出配置 */ + Excel.prototype.options = {writeOpt: {bookSST: true}}; + + /*! 导出 Excel 文件 */ + Excel.prototype.export = function (data, name, options) { + if (name.substring(0, -5).toLowerCase() !== '.xlsx') name += '.xlsx'; + layui.excel.exportExcel(data, name, 'xlsx', options || this.options || {writeOpt: {bookSST: true}}); + }; + + /*! 绑定导出的事件 */ + // 通用导出 + // 指定链接导出 + // + // 自定义导出1 + // 自定义导出2 + // + Excel.prototype.bind = function (done, filename, selector, options) { + let that = this; + this.options = options || {} + $('body').off('click', selector || '[data-form-export]').on('click', selector || '[data-form-export]', function () { + let form = $(this).parents('form'); + let name = this.dataset.filename || filename; + let method = this.dataset.method || form.attr('method') || 'get'; + let location = this.dataset.excel || this.dataset.formExport || form.attr('action') || ''; + let sortType = $(this).attr('data-sort-type') || '', sortField = $(this).attr('data-sort-field') || ''; + if (sortField.length > 0 && sortType.length > 0) { + location += (location.indexOf('?') > -1 ? '&' : '?') + '_order_=' + sortType + '&_field_=' + sortField; + } + that.load(location, form.serialize(), method).then(function (data) { + that.export(done.call(that, data, []), name); + }).fail(function (ret) { + $.msg.tips(ret || '文件导出失败'); + }); + }); + }; + + /*! 加载导出的文档 */ + Excel.prototype.load = function (url, data, method) { + return (function (defer, lists, loaded) { + loaded = $.msg.loading('正在加载 0.00%'); + return (lists = []), LoadNextPage(1, 1), defer; + + function LoadNextPage(curPage, maxPage, urlParams) { + let proc = (curPage / maxPage * 100).toFixed(2); + $('[data-upload-count]').html(proc > 100 ? '100.00' : proc); + if (curPage > maxPage) return $.msg.close(loaded), defer.resolve(lists); + urlParams = (url.indexOf('?') > -1 ? '&' : '?') + 'output=json¬_cache_limit=1&limit=100&page=' + curPage; + $.form.load(url + urlParams, data, method, function (ret) { + if (ret.code) { + lists = lists.concat(ret.data.list); + if (ret.data.page) LoadNextPage((ret.data.page.current || 1) + 1, ret.data.page.pages || 1); + } else { + defer.reject('数据加载异常'); + } + return false; + }, false); + } + })($.Deferred()); + }; + + /*! 设置表格导出样式 */ + // this.withStyle(data, {A: 60, B: 80, C: 99, E: 120, G: 120}, 99, 28) + Excel.prototype.withStyle = function (data, colsWidth, defaultWidth, defaultHeight) { + // 自动计算列序 + let idx, colN = 0, defaC = {}, lastCol; + for (idx in data[0]) defaC[lastCol = layui.excel.numToTitle(++colN)] = defaultWidth || 99; + defaC[lastCol] = 160; + + // 设置表头样式 + layui.excel.setExportCellStyle(data, 'A1:' + lastCol + '1', { + s: { + font: {sz: 12, bold: true, color: {rgb: "FFFFFF"}, name: '微软雅黑', shadow: true}, + fill: {bgColor: {indexed: 64}, fgColor: {rgb: '5FB878'}}, + alignment: {vertical: 'center', horizontal: 'center'} + } + }); + + // 设置内容样式 + (function (style1, style2) { + layui.excel.setExportCellStyle(data, 'A2:' + lastCol + data.length, {s: style1}, function (rawCell, newCell, row, config, curRow) { + typeof rawCell !== 'object' && (rawCell = {v: rawCell}); + rawCell.s = Object.assign({}, style2, rawCell.s || {}); + return (curRow % 2 === 0) ? newCell : rawCell; + }); + })({ + font: {sz: 10, shadow: true, name: '微软雅黑'}, + fill: {bgColor: {indexed: 64}, fgColor: {rgb: "EAEAEA"}}, + alignment: {vertical: 'center', horizontal: 'center'} + }, { + font: {sz: 10, shadow: true, name: '微软雅黑'}, + fill: {bgColor: {indexed: 64}, fgColor: {rgb: "FFFFFF"}}, + alignment: {vertical: 'center', horizontal: 'center'} + }); + + // 设置表格行宽高,需要设置最后的行或列宽高,否则部分不生效 ??? + let rowsC = {1: 33}, colsC = Object.assign({}, defaC, {A: 60}, colsWidth || {}); + rowsC[data.length] = defaultHeight || 28, this.options.extend = Object.assign({}, { + '!cols': layui.excel.makeColConfig(colsC, defaultWidth || 99), + '!rows': layui.excel.makeRowConfig(rowsC, defaultHeight || 28), + }, this.options.extend || {}); + return data; + } + + /*! 直接推送表格内容 */ + // url: 记录推送地址 + // sheet: 表格 Sheet 名称 + // cols: { _: 1, 表头名1: 字段名1, 表头名2: 字段名2 },其中字段 _ 配置起始行 + // filter: 数据过滤处理,如果返回 false 不上传记录 + // Excel.push(ACTION, '用户信息', {_:1, username: "用户名称", phone: "联系手机"}) + Excel.prototype.push = function (url, sheet, cols, filter) { + let loaded, $input; + $input = $(''); + $input.appendTo($('body')).click().on('change', function (event) { + if (!event.target.files || event.target.files.length < 1) return $.msg.tips('没有可操作文件'); + loaded = $.msg.loading('读取 0.00%'); + try { + // 导入Excel数据,并逐行上传处理 + layui.excel.importExcel(event.target.files, {}, function (data) { + if (!data[0][sheet]) return $.msg.tips('未读取到表[' + sheet + ']的数据'); + let _cols = {}, _data = data[0][sheet], items = [], row, col, key, item; + for (row in _data) if (parseInt(row) + 1 === parseInt(cols._ || '1')) { + for (col in _data[row]) for (key in cols) if (_data[row][col] === cols[key]) _cols[key] = col; + } else if (parseInt(row) + 1 > cols._ || 1) { + item = {}; + for (key in _cols) item[key] = CellToValue(_data[row][_cols[key]]); + items.push(item); + } + PushQueue(items, items.length, 0, 0, 1); + }); + } catch (e) { + $.msg.error('读取 Excel 文件失败!') + } + }); + + /*! 单项推送数据 */ + function PushQueue(items, total, ers, oks, idx) { + if ((total = items.length) < 1) return CleanAll(), $.msg.tips('未读取到有效数据'); + return (ers = 0, oks = 0, idx = 0), $('[data-load-name]').html('更新'), DoPostItem(idx, items[idx]); + + /*! 执行导入的数据 */ + function DoPostItem(idx, item, data) { + if (idx >= total) { + return CleanAll(), $.msg.success('共处理' + total + '条记录( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )', 3, function () { + $.form.reload(); + }); + } else { + let proc = (idx * 100 / total).toFixed(2); + $('[data-load-count]').html((proc > 100 ? '100.00' : proc) + '%( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )'); + /*! 单元数据过滤 */ + data = item; + if (filter && (data = filter(item)) === false) { + return (ers++), DoPostItem(idx + 1, items[idx + 1]); + } + /*! 提交单个数据 */ + DoUpdate(url, data).then(function (ret) { + (ret.code ? oks++ : ers++), DoPostItem(idx + 1, items[idx + 1]); + }); + } + } + } + + /*! 清理文件选择器 */ + function CleanAll() { + $input.remove(); + if (loaded) $.msg.close(loaded); + } + + /*! 表格单元内容转换 */ + function CellToValue(v) { + if (typeof v !== 'undefined' && /^\d+\.\d{12}$/.test(v)) { + return LAY_EXCEL.dateCodeFormat(v, 'YYYY-MM-DD HH:ii:ss'); + } else { + return typeof v !== 'undefined' ? v : ''; + } + } + + /*! 队列方式上传数据 */ + function DoUpdate(url, item) { + return (function (defer) { + return $.form.load(url, item, 'post', function (ret) { + return defer.resolve(ret), false; + }, false), defer.promise(); + })($.Deferred()); + } + } + + /*! 返回对象实例 */ + return new Excel; +}); \ No newline at end of file diff --git a/public/static/plugs/admin/queue.js b/public/static/plugs/admin/queue.js new file mode 100644 index 0000000..008836d --- /dev/null +++ b/public/static/plugs/admin/queue.js @@ -0,0 +1,101 @@ +// +---------------------------------------------------------------------- +// | Static Plugin for ThinkAdmin +// +---------------------------------------------------------------------- +// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ] +// +---------------------------------------------------------------------- +// | 官方网站: https://thinkadmin.top +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// | 免责声明 ( https://thinkadmin.top/disclaimer ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +// | github 代码仓库:https://github.com/zoujingli/think-plugs-static +// +---------------------------------------------------------------------- + +define(function () { + + let template = '
    ...
    ' + '
    '; + + return Queue; + + function Queue(code, doScript, element) { + let queue = this; + (this.doAjax = true) && (this.doReload = false) || layer.open({ + type: 1, title: false, area: ['560px', '315px'], anim: 2, shadeClose: false, end: function () { + queue.doAjax = queue.doReload && doScript && $.layTable.reload(((element || {}).dataset || {}).tableId || true) && false; + }, content: laytpl(template).render({code: code}), success: function ($elem) { + new Progress($elem, code, queue, doScript); + } + }); + } + + function Progress($elem, code, queue, doScript) { + let that = this; + + this.$box = $elem.find('[data-queue-load=' + code + ']'); + if (queue.doAjax === false || this.$box.length < 1) return false; + + this.$code = this.$box.find('code'); + this.$title = this.$box.find('[data-message-title]'); + this.$percent = this.$box.find('.layui-progress div'); + + // 设置数据缓存 + this.SetCache = function (code, index, value) { + let ckey = code + '_' + index, ctype = 'admin-queue-script'; + return value !== undefined ? layui.data(ctype, {key: ckey, value: value}) : layui.data(ctype)[ckey] || 0; + }; + + // 更新任务显示状态 + this.SetState = function (status, message) { + if (message.indexOf('javascript:') === -1) if (status === 1) { + that.$title.html('' + message + '').addClass('text-center'); + that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red'); + } else if (status === 2) { + if (message.indexOf('>>>') > -1) { + that.$title.html('' + message + '').addClass('text-center'); + } else { + that.$title.html('正在处理:' + message).removeClass('text-center'); + } + that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red'); + } else if (status === 3) { + queue.doReload = true; + that.$title.html('' + message + '').addClass('text-center'); + that.$percent.addClass('layui-bg-green').removeClass('layui-bg-blue layui-bg-red'); + } else if (status === 4) { + that.$title.html('' + message + '').addClass('text-center'); + that.$percent.addClass('layui-bg-red').removeClass('layui-bg-blue layui-bg-green'); + } + }; + + // 读取任务进度信息 + this.LoadProgress = function () { + if (queue.doAjax === false || that.$box.length < 1) return false; + $.form.load(tapiRoot + '/api.queue/progress', {code: code}, 'post', function (ret) { + if (ret.code) { + let lines = []; + for (let idx in ret.data.history) { + let line = ret.data.history[idx], percent = '[ ' + line.progress + '% ] '; + if (line.message.indexOf('javascript:') === -1) { + lines.push(line.message.indexOf('>>>') > -1 ? line.message : percent + line.message); + } else if (!that.SetCache(code, idx) && doScript !== false) { + that.SetCache(code, idx, 1) + $.form.goto(line.message); + } + } + if (ret.data.status > 0) { + that.SetState(parseInt(ret.data.status), ret.data.message); + that.$percent.attr('lay-percent', (parseFloat(ret.data.progress || '0.00').toFixed(2)) + '%') && layui.element.render(); + that.$code.html('

    ' + lines.join('

    ') + '

    ').animate({scrollTop: that.$code[0].scrollHeight + 'px'}, 200); + parseInt(ret.data.status) === 3 || parseInt(ret.data.status) === 4 || setTimeout(that.LoadProgress, Math.floor(Math.random() * 200)); + } else { + setTimeout(that.LoadProgress, Math.floor(Math.random() * 500) + 200); + } + return false; + } + }, false); + }; + + // 首页加载进度信息 + this.LoadProgress(); + } +}); \ No newline at end of file diff --git a/public/static/plugs/admin/validate.js b/public/static/plugs/admin/validate.js new file mode 100644 index 0000000..a892245 --- /dev/null +++ b/public/static/plugs/admin/validate.js @@ -0,0 +1,126 @@ +// +---------------------------------------------------------------------- +// | Static Plugin for ThinkAdmin +// +---------------------------------------------------------------------- +// | 版权所有 2014~2024 ThinkAdmin [ thinkadmin.top ] +// +---------------------------------------------------------------------- +// | 官方网站: https://thinkadmin.top +// +---------------------------------------------------------------------- +// | 开源协议 ( https://mit-license.org ) +// | 免责声明 ( https://thinkadmin.top/disclaimer ) +// +---------------------------------------------------------------------- +// | gitee 代码仓库:https://gitee.com/zoujingli/think-plugs-static +// | github 代码仓库:https://github.com/zoujingli/think-plugs-static +// +---------------------------------------------------------------------- + +define(function () { + + return Validate; + + function Validate(form) { + let that = this; + // 绑定表单元素 + this.form = $(form); + // 绑定元素事件 + this.evts = 'blur change'; + // 检测表单元素 + this.tags = 'input,textarea'; + // 验证成功回调 + this.dones = []; + // 预设检测规则 + this.patterns = { + qq: '^[1-9][0-9]{4,11}$', + ip: '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$', + url: '^https?://([a-zA-Z0-9-]+\\.)+[-_a-zA-Z0-9-]+', + phone: '^1[3-9][0-9]{9}$', + mobile: '^1[3-9][0-9]{9}$', + email: '^([a-zA-Z0-9_\\.-])+@(([a-zA-Z0-9-])+\\.)+([a-zA-Z0-9]{2,4})+$', + wechat: '^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$', + cardid: '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$', + userame: '^[a-zA-Z0-9_-]{4,16}$', + }; + // 设置完成回调 + this.addDoneEvent = function (done) { + if (typeof done === 'function') this.dones.push(done); + }; + this.isRegex = function (el, value, pattern) { + pattern = pattern || el.getAttribute('pattern'); + if ((value = value || $.trim($(el).val())) === '') return true; + if (!(pattern = this.patterns[pattern] || pattern)) return true; + return new RegExp(pattern, 'i').test(value); + }; + this.hasProp = function (el, prop) { + let attrProp = el.getAttribute(prop); + return typeof attrProp !== 'undefined' && attrProp !== null && attrProp !== false; + }; + this.hasCheck = function (el, type) { + if (this.hasProp(el, 'data-auto-none')) return false; + type = (el.getAttribute('type') || '').replace(/\W+/, '').toLowerCase(); + return $.inArray(type, ['file', 'reset', 'image', 'radio', 'checkbox', 'submit', 'hidden']) < 0; + }; + this.checkAllInput = function () { + let status = true; + return this.form.find(this.tags).each(function () { + !that.checkInput(this) && status && (status = !$(this).focus()); + }) && status; + }; + this.checkInput = function (el) { + if (!this.hasCheck(el = typeof el === 'string' ? form[el] : el)) return true; + if (this.hasProp(el, 'required') && $.trim($(el).val()) === '') return this.remind(el, 'required'); + return this.isRegex(el) ? !!this.hideError(el) : this.remind(el, 'pattern'); + }; + this.remind = function (el, type, tips) { + return $(el).is(':visible') ? this.showError(el, tips || el.getAttribute(type + '-error') || function (name, tips) { + return name ? name + (type === 'required' ? '不能为空' : "格式错误") : (tips || el.getAttribute('placeholder') || '输入格式错误'); + }(el.getAttribute('vali-name') || el.getAttribute('data-vali-name'), el.getAttribute('title'))) && false : true; + }; + this.showError = function (el, tip) { + return this.insertError($(el).addClass('validate-error')).addClass('layui-anim-fadein').css({width: 'auto'}).html(tip); + }; + this.hideError = function (el) { + return this.insertError($(el).removeClass('validate-error')).removeClass('layui-anim-fadein').css({width: '30px'}).html(''); + }; + this.insertError = function ($el) { + return (function ($icon) { + return $el.data('vali-tags').css({ + top: $el.position().top + 'px', right: (($icon ? $icon.width() + parseFloat($icon.css('right') || 0) : 0) + 10) + 'px', + paddingTop: $el.css('marginTop'), lineHeight: ($el.get(0).nodeName || '') === 'TEXTAREA' ? '32px' : $el.css('height'), + }); + })($el.nextAll('.input-right-icon'), $el.data('vali-tags') || function () { + let css = 'display:block;position:absolute;text-align:center;color:#c44;font-size:12px;z-index:2'; + $el.data('vali-tags', $('').insertAfter($el)); + }()); + }; + /*! 预埋异常标签*/ + this.form.find(this.tags).each(function (i, el) { + that.hasCheck(this) && that.hideError(el, ''); + }); + /*! 表单元素验证 */ + this.form.attr({onsubmit: 'return false', novalidate: 'novalidate', autocomplete: 'off'}).on('keydown', this.tags, function () { + that.hideError(this) + }).off(this.evts, this.tags).on(this.evts, this.tags, function () { + that.checkInput(this); + }).data('validate', this).bind('submit', function (evt) { + evt.preventDefault(); + /* 检查所有表单元素是否通过H5的规则验证 */ + if (that.checkAllInput() && that.dones.length > 0) { + if (typeof CKEDITOR === 'object' && typeof CKEDITOR.instances === 'object') { + for (let i in CKEDITOR.instances) CKEDITOR.instances[i].updateElement(); + } + /* 触发表单提交后,锁定三秒不能再次提交表单 */ + if (that.form.attr('submit-locked')) return false; + evt.submit = that.form.find('button[type=submit],button:not([type=button])'); + $.base.onConfirm(evt.submit.attr('data-confirm'), function () { + that.form.attr('submit-locked', 1) && evt.submit.addClass('submit-button-loading'); + setTimeout(function () { + that.form.removeAttr('submit-locked') && evt.submit.removeClass('submit-button-loading'); + }, 3000) && that.dones.forEach(function (done) { + done.call(form, that.form.formToJson(), []); + }); + }); + } + }).find('[data-form-loaded]').map(function () { + $(this).html(this.dataset.formLoaded || this.innerHTML); + $(this).removeAttr('data-form-loaded').removeClass('layui-disabled'); + }); + } +}); \ No newline at end of file diff --git a/public/static/plugs/angular/angular.min.js b/public/static/plugs/angular/angular.min.js new file mode 100644 index 0000000..4bcfc08 --- /dev/null +++ b/public/static/plugs/angular/angular.min.js @@ -0,0 +1,351 @@ +/* + AngularJS v1.8.3 + (c) 2010-2020 Google LLC. http://angularjs.org + License: MIT +*/ +(function(z){'use strict';function ve(a){if(D(a))w(a.objectMaxDepth)&&(Xb.objectMaxDepth=Yb(a.objectMaxDepth)?a.objectMaxDepth:NaN),w(a.urlErrorParamsEnabled)&&Ga(a.urlErrorParamsEnabled)&&(Xb.urlErrorParamsEnabled=a.urlErrorParamsEnabled);else return Xb}function Yb(a){return X(a)&&0c)return"...";var d=b.$$hashKey,f;if(H(a)){f=0;for(var g=a.length;f").append(a).html();try{return a[0].nodeType===Pa?K(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+K(b)})}catch(d){return K(b)}}function Vc(a){try{return decodeURIComponent(a)}catch(b){}}function hc(a){var b={};r((a||"").split("&"), +function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Vc(e),w(e)&&(f=w(f)?Vc(f):!0,ta.call(b,e)?H(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Ce(a){var b=[];r(a,function(a,c){H(a)?r(a,function(a){b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))}):b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))});return b.length?b.join("&"):""}function ic(a){return ba(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ba(a, +b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function De(a,b){var d,c,e=Qa.length;for(c=0;c protocol indicates an extension, document.location.href does not match."))}function Wc(a,b,d){D(d)||(d={});d=S({strictDi:!1},d);var c=function(){a=x(a);if(a.injector()){var c=a[0]===z.document?"document":Aa(a);throw oa("btstrpd",c.replace(//,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider", +function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;z&&e.test(z.name)&&(d.debugInfoEnabled=!0,z.name=z.name.replace(e,""));if(z&&!f.test(z.name))return c();z.name=z.name.replace(f,"");ca.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};B(ca.resumeDeferredBootstrap)&& +ca.resumeDeferredBootstrap()}function Ge(){z.name="NG_ENABLE_DEBUG_INFO!"+z.name;z.location.reload()}function He(a){a=ca.element(a).injector();if(!a)throw oa("test");return a.get("$$testability")}function Xc(a,b){b=b||"_";return a.replace(Ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function Je(){var a;if(!Yc){var b=rb();(sb=A(b)?z.jQuery:b?z[b]:void 0)&&sb.fn.on?(x=sb,S(sb.fn,{scope:Wa.scope,isolateScope:Wa.isolateScope,controller:Wa.controller,injector:Wa.injector,inheritedData:Wa.inheritedData})): +x=U;a=x.cleanData;x.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=(x._data(f)||{}).events)&&c.$destroy&&x(f).triggerHandler("$destroy");a(b)};ca.element=x;Yc=!0}}function Ke(){U.legacyXHTMLReplacement=!0}function gb(a,b,d){if(!a)throw oa("areq",b||"?",d||"required");return a}function tb(a,b,d){d&&H(a)&&(a=a[a.length-1]);gb(B(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ja(a,b){if("hasOwnProperty"===a)throw oa("badname", +b);}function Le(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g"):a;if(10>wa)for(c=hb[c]||hb._default,d.innerHTML=c[1]+e+c[2],k=c[0];k--;)d=d.firstChild;else{c=qa[c]||[];for(k=c.length;-1<--k;)d.appendChild(z.document.createElement(c[k])),d=d.firstChild;d.innerHTML=e}g=db(g,d.childNodes);d=f.firstChild;d.textContent=""}else g.push(b.createTextNode(a)); +f.textContent="";f.innerHTML="";r(g,function(a){f.appendChild(a)});return f}function U(a){if(a instanceof U)return a;var b;C(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!==a.charAt(0))throw oc("nosel");return new U(a)}if(b){b=z.document;var d;a=(d=tg.exec(a))?[b.createElement(d[1])]:(d=gd(a,b))?d.childNodes:[];pc(this,a)}else B(a)?hd(a):pc(this,a)}function qc(a){return a.cloneNode(!0)}function zb(a,b){!b&&mc(a)&&x.cleanData([a]);a.querySelectorAll&&x.cleanData(a.querySelectorAll("*"))}function id(a){for(var b in a)return!1; +return!0}function jd(a){var b=a.ng339,d=b&&Ka[b],c=d&&d.events,d=d&&d.data;d&&!id(d)||c&&!id(c)||(delete Ka[b],a.ng339=void 0)}function kd(a,b,d,c){if(w(c))throw oc("offargs");var e=(c=Ab(a))&&c.events,f=c&&c.handle;if(f){if(b){var g=function(b){var c=e[b];w(d)&&cb(c||[],d);w(d)&&c&&0l&&this.remove(n.key);return b}},get:function(a){if(l";b=Fa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function sa(a,b){try{a.addClass(b)}catch(c){}}function da(a,b,c,d,e){a instanceof x||(a=x(a));var f=Xa(a,b,a,c,d,e);da.$$addScopeClass(a);var g=null;return function(b,c,d){if(!a)throw $("multilink");gb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement; +h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ua(d)&&la.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==g?x(ja(g,x("
    ").append(a).html())):c?Wa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);da.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);c||(a=f=null);return d}}function Xa(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,I,t;if(n)for(t=Array(c.length),m=0;mu.priority)break;if(O=u.scope)u.templateUrl||(D(O)?(ba("new/isolated scope",s||t,u,y),s=u):ba("new/isolated scope",s,u,y)),t=t||u;Q=u.name;if(!ma&&(u.replace&&(u.templateUrl||u.template)||u.transclude&& +!u.$$tlb)){for(O=sa+1;ma=a[O++];)if(ma.transclude&&!ma.$$tlb||ma.replace&&(ma.templateUrl||ma.template)){Jb=!0;break}ma=!0}!u.templateUrl&&u.controller&&(J=J||T(),ba("'"+Q+"' controller",J[Q],u,y),J[Q]=u);if(O=u.transclude)if(G=!0,u.$$tlb||(ba("transclusion",L,u,y),L=u),"element"===O)N=!0,n=u.priority,M=y,y=d.$$element=x(da.$$createComment(Q,d[Q])),b=y[0],oa(f,Ha.call(M,0),b),R=Z(Jb,M,e,n,g&&g.name,{nonTlbTranscludeDirective:L});else{var ka=T();if(D(O)){M=z.document.createDocumentFragment();var Xa= +T(),F=T();r(O,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Xa[a]=b;ka[b]=null;F[b]=c});r(y.contents(),function(a){var b=Xa[xa(ua(a))];b?(F[b]=!0,ka[b]=ka[b]||z.document.createDocumentFragment(),ka[b].appendChild(a)):M.appendChild(a)});r(F,function(a,b){if(!a)throw $("reqslot",b);});for(var K in ka)ka[K]&&(R=x(ka[K].childNodes),ka[K]=Z(Jb,R,e));M=x(M.childNodes)}else M=x(qc(b)).contents();y.empty();R=Z(Jb,M,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});R.$$slots=ka}if(u.template)if(P= +!0,ba("template",v,u,y),v=u,O=B(u.template)?u.template(y,d):u.template,O=Na(O),u.replace){g=u;M=nc.test(O)?td(ja(u.templateNamespace,V(O))):[];b=M[0];if(1!==M.length||1!==b.nodeType)throw $("tplrt",Q,"");oa(f,y,b);C={$attr:{}};O=tc(b,[],C);var Ig=a.splice(sa+1,a.length-(sa+1));(s||t)&&fa(O,s,t);a=a.concat(O).concat(Ig);ga(d,C);C=a.length}else y.html(O);if(u.templateUrl)P=!0,ba("template",v,u,y),v=u,u.replace&&(g=u),p=ha(a.splice(sa,a.length-sa),y,d,f,G&&R,h,k,{controllerDirectives:J,newScopeDirective:t!== +u&&t,newIsolateScopeDirective:s,templateDirective:v,nonTlbTranscludeDirective:L}),C=a.length;else if(u.compile)try{q=u.compile(y,d,R);var Y=u.$$originalDirective||u;B(q)?m(null,Va(Y,q),E,jb):q&&m(Va(Y,q.pre),Va(Y,q.post),E,jb)}catch(ca){c(ca,Aa(y))}u.terminal&&(p.terminal=!0,n=Math.max(n,u.priority))}p.scope=t&&!0===t.scope;p.transcludeOnThisElement=G;p.templateOnThisElement=P;p.transclude=R;l.hasElementTranscludeDirective=N;return p}function X(a,b,c,d){var e;if(C(b)){var f=b.match(l);b=b.substring(f[0].length); +var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e="^^"===g&&c[0]&&9===c[0].nodeType?null:g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw $("ctreq",b,a);}else if(H(b))for(e=[],g=0,f=b.length;gc.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=bc(c,{$$start:k,$$end:l}));if(!c.$$bindings){var I=m=c,t=c.name,u={isolateScope:null,bindToController:null}; +D(I.scope)&&(!0===I.bindToController?(u.bindToController=d(I.scope,t,!0),u.isolateScope={}):u.isolateScope=d(I.scope,t,!1));D(I.bindToController)&&(u.bindToController=d(I.bindToController,t,!0));if(u.bindToController&&!I.controller)throw $("noctrl",t);m=m.$$bindings=u;D(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function ca(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function qa(a,b){if("srcdoc"=== +b)return u.HTML;if("src"===b||"ngSrc"===b)return-1===["img","video","audio","source","track"].indexOf(a)?u.RESOURCE_URL:u.MEDIA_URL;if("xlinkHref"===b)return"image"===a?u.MEDIA_URL:"a"===a?u.URL:u.RESOURCE_URL;if("form"===a&&"action"===b||"base"===a&&"href"===b||"link"===a&&"href"===b)return u.RESOURCE_URL;if("a"===a&&("href"===b||"ngHref"===b))return u.URL}function ya(a,b){var c=b.toLowerCase();return v[a+"|"+c]||v["*|"+c]}function za(a){return ma(u.valueOf(a),"ng-prop-srcset")}function Ea(a,b,c, +d){if(m.test(d))throw $("nodomevents");a=ua(a);var e=ya(a,d),f=Ta;"srcset"!==d||"img"!==a&&"source"!==a?e&&(f=u.getTrusted.bind(u,e)):f=za;b.push({priority:100,compile:function(a,b){var e=p(b[c]),g=p(b[c],function(a){return u.valueOf(a)});return{pre:function(a,b){function c(){var g=e(a);b[0][d]=f(g)}c();a.$watch(g,c)}}}})}function Ia(a,c,d,e,f){var g=ua(a),k=qa(g,e),l=h[e]||f,p=b(d,!f,k,l);if(p){if("multiple"===e&&"select"===g)throw $("selmulti",Aa(a));if(m.test(e))throw $("nodomevents");c.push({priority:100, +compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=T());var g=f[e];g!==d&&(p=g&&b(g,!0,k,l),d=g);p&&(f[e]=p(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(p,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function oa(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Pa&&""===d.nodeValue.trim())&&Kg.call(a,b,1)}return a} +function Gg(a,b){if(b&&C(b))return b;if(C(a)){var d=wd.exec(a);if(d)return d[3]}}function Kf(){var a={};this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,d){Ja(b,"controller");D(b)?S(a,b):a[b]=d};this.$get=["$injector",function(b){function d(a,b,d,g){if(!a||!D(a.$scope))throw F("$controller")("noscp",g,b);a.$scope[b]=d}return function(c,e,f,g){var k,h,l;f=!0===f;g&&C(g)&&(l=g);if(C(c)){g=c.match(wd);if(!g)throw xd("ctrlfmt",c);h=g[1];l=l||g[3];c=a.hasOwnProperty(h)?a[h]:Le(e.$scope, +h,!0);if(!c)throw xd("ctrlreg",h);tb(c,h,!0)}if(f)return f=(H(c)?c[c.length-1]:c).prototype,k=Object.create(f||null),l&&d(e,l,k,h||c.name),S(function(){var a=b.invoke(c,k,e,h);a!==k&&(D(a)||B(a))&&(k=a,l&&d(e,l,k,h||c.name));return k},{instance:k,identifier:l});k=b.instantiate(c,e,h);l&&d(e,l,k,h||c.name);return k}}]}function Lf(){this.$get=["$window",function(a){return x(a.document)}]}function Mf(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden; +a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]}function Nf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function vc(a){return D(a)?ha(a)?a.toISOString():eb(a):a}function Tf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Qc(a,function(a,c){null===a||A(a)||B(a)||(H(a)?r(a,function(a){b.push(ba(c)+"="+ba(vc(a)))}):b.push(ba(c)+"="+ba(vc(a))))});return b.join("&")}}}function Uf(){this.$get= +function(){return function(a){function b(a,e,f){H(a)?r(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!ha(a)?Qc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):(B(a)&&(a=a()),d.push(ba(e)+"="+(null==a?"":ba(vc(a)))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function wc(a,b){if(C(a)){var d=a.replace(Lg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(yd),e;(e=c)||(e=(e=d.match(Mg))&&Ng[e[0]].test(d));if(e)try{a=Tc(d)}catch(f){if(!c)return a;throw Lb("baddata",a,f);}}}return a} +function zd(a){var b=T(),d;C(a)?r(a.split("\n"),function(a){d=a.indexOf(":");var e=K(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&r(a,function(a,d){var f=K(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function Ad(a){var b;return function(d){b||(b=zd(a));return d?(d=b[K(d)],void 0===d&&(d=null),d):b}}function Bd(a,b,d,c){if(B(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function Sf(){var a=this.defaults={transformResponse:[wc],transformRequest:[function(a){return D(a)&& +"[object File]"!==la.call(a)&&"[object Blob]"!==la.call(a)&&"[object FormData]"!==la.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja(xc),put:ja(xc),patch:ja(xc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=this.interceptors=[],c=this.xsrfTrustedOrigins=[];Object.defineProperty(this,"xsrfWhitelistedOrigins", +{get:function(){return this.xsrfTrustedOrigins},set:function(a){this.xsrfTrustedOrigins=a}});this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(e,f,g,k,h,l,m,p){function n(b){function c(a,b){for(var d=0,e=b.length;da?b:l.reject(b)}if(!D(b))throw F("$http")("badreq",b);if(!C(p.valueOf(b.url)))throw F("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,jsonpCallbackParam:a.jsonpCallbackParam},b);g.headers=function(b){var c=a.headers,e=S({},b.headers),f,g,h,c=S({},c.common,c[K(b.method)]);a:for(f in c){g=K(f);for(h in e)if(K(h)===g)continue a;e[f]=c[f]}return d(e,ja(b))}(b);g.method= +vb(g.method);g.paramSerializer=C(g.paramSerializer)?m.get(g.paramSerializer):g.paramSerializer;e.$$incOutstandingRequestCount("$http");var h=[],k=[];b=l.resolve(g);r(v,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&k.push(a.response,a.responseError)});b=c(b,h);b=b.then(function(b){var c=b.headers,d=Bd(b.data,Ad(c),void 0,b.transformRequest);A(d)&&r(c,function(a,b){"content-type"===K(b)&&delete c[b]});A(b.withCredentials)&&!A(a.withCredentials)&& +(b.withCredentials=a.withCredentials);return s(b,d).then(f,f)});b=c(b,k);return b=b.finally(function(){e.$$completeOutstandingRequest(E,"$http")})}function s(c,d){function e(a){if(a){var c={};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function k(a,c,d,e,f){function g(){m(c,a,d,e,f)}R&&(200<=a&&300>a?R.put(O,[a,c,zd(d),e,f]):R.remove(O));b?h.$applyAsync(g):(g(),h.$$phase||h.$apply())}function m(a,b,d,e,f){b=-1<=b?b:0;(200<=b&&300> +b?L.resolve:L.reject)({data:a,status:b,headers:Ad(d),config:c,statusText:e,xhrStatus:f})}function s(a){m(a.data,a.status,ja(a.headers()),a.statusText,a.xhrStatus)}function v(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var L=l.defer(),u=L.promise,R,q,ma=c.headers,x="jsonp"===K(c.method),O=c.url;x?O=p.getTrustedResourceUrl(O):C(O)||(O=p.valueOf(O));O=G(O,c.paramSerializer(c.params));x&&(O=t(O,c.jsonpCallbackParam));n.pendingRequests.push(c);u.then(v,v);!c.cache&&!a.cache|| +!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(R=D(c.cache)?c.cache:D(a.cache)?a.cache:N);R&&(q=R.get(O),w(q)?q&&B(q.then)?q.then(s,s):H(q)?m(q[1],q[0],ja(q[2]),q[3],q[4]):m(q,200,{},"OK","complete"):R.put(O,u));A(q)&&((q=kc(c.url)?g()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(ma[c.xsrfHeaderName||a.xsrfHeaderName]=q),f(c.method,O,d,k,ma,c.timeout,c.withCredentials,c.responseType,e(c.eventHandlers),e(c.uploadEventHandlers)));return u}function G(a,b){0=h&&(t.resolve(s),f(r.$$intervalId));G||c.$apply()},k,t,G);return r}}}]}function Cd(a,b){var d=ga(a);b.$$protocol=d.protocol;b.$$host= +d.hostname;b.$$port=fa(d.port)||Rg[d.protocol]||null}function Dd(a,b,d){if(Sg.test(a))throw kb("badpath",a);var c="/"!==a.charAt(0);c&&(a="/"+a);a=ga(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=hc(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function yc(a,b){return a.slice(0, +b.length)===b}function ya(a,b){if(yc(b,a))return b.substr(a.length)}function Da(a){var b=a.indexOf("#");return-1===b?a:a.substr(0,b)}function zc(a,b,d){this.$$html5=!0;d=d||"";Cd(a,this);this.$$parse=function(a){var d=ya(b,a);if(!C(d))throw kb("ipthprfx",a,b);Dd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$normalizeUrl=function(a){return b+a.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;w(f=ya(a,c))?(g=f,g=d&&w(f=ya(d,f))? +b+(ya("/",f)||f):a+g):w(f=ya(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function Ac(a,b,d){Cd(a,this);this.$$parse=function(c){var e=ya(a,c)||ya(b,c),f;A(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",A(e)&&(a=c,this.replace())):(f=ya(d,e),A(f)&&(f=e));Dd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;yc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$normalizeUrl=function(b){return a+(b?d+b:"")};this.$$parseLinkUrl=function(b, +d){return Da(a)===Da(b)?(this.$$parse(b),!0):!1}}function Ed(a,b,d){this.$$html5=!0;Ac.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===Da(c)?f=c:(g=ya(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$normalizeUrl=function(b){return a+d+b}}function Mb(a){return function(){return this[a]}}function Fd(a,b){return function(d){if(A(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Yf(){var a="!", +b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a};this.html5Mode=function(a){if(Ga(a))return b.enabled=a,this;if(D(a)){Ga(a.enabled)&&(b.enabled=a.enabled);Ga(a.requireBase)&&(b.requireBase=a.requireBase);if(Ga(a.rewriteLinks)||C(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function k(a,b){return a===b||ga(a).href===ga(b).href}function h(a, +b,d){var e=m.url(),f=m.$$state;try{c.url(a,b,d),m.$$state=c.state()}catch(g){throw m.url(e),m.$$state=f,g;}}function l(a,b){d.$broadcast("$locationChangeSuccess",m.absUrl(),a,m.$$state,b)}var m,p;p=c.baseHref();var n=c.url(),s;if(b.enabled){if(!p&&b.requireBase)throw kb("nobase");s=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(p||"/");p=e.history?zc:Ed}else s=Da(n),p=Ac;var r=s.substr(0,Da(s).lastIndexOf("/")+1);m=new p(s,r,"#"+a);m.$$parseLinkUrl(n,n);m.$$state=c.state();var t=/^\s*(javascript|mailto):/i; +f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var g=x(a.target);"a"!==ua(g[0]);)if(g[0]===f[0]||!(g=g.parent())[0])return;if(!C(e)||!A(g.attr(e))){var e=g.prop("href"),h=g.attr("href")||g.attr("xlink:href");D(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ga(e.animVal).href);t.test(e)||!e||g.attr("target")||a.isDefaultPrevented()||!m.$$parseLinkUrl(e,h)||(a.preventDefault(),m.absUrl()!==c.url()&&d.$apply())}}});m.absUrl()!== +n&&c.url(m.absUrl(),!0);var N=!0;c.onUrlChange(function(a,b){yc(a,r)?(d.$evalAsync(function(){var c=m.absUrl(),e=m.$$state,f;m.$$parse(a);m.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;m.absUrl()===a&&(f?(m.$$parse(c),m.$$state=e,h(c,!1,e)):(N=!1,l(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(N||m.$$urlUpdatedByLocation){m.$$urlUpdatedByLocation=!1;var a=c.url(),b=m.absUrl(),f=c.state(),g=m.$$replace,n=!k(a,b)||m.$$html5&&e.history&&f!== +m.$$state;if(N||n)N=!1,d.$evalAsync(function(){var b=m.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,m.$$state,f).defaultPrevented;m.absUrl()===b&&(c?(m.$$parse(a),m.$$state=f):(n&&h(b,g,f===m.$$state?null:m.$$state),l(a,f)))})}m.$$replace=!1});return m}]}function Zf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){dc(a)&&(a.stack&&f?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&& +(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||E;return function(){var a=[];r(arguments,function(b){a.push(c(b))});return Function.prototype.apply.call(e,b,a)}}var f=wa||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Tg(a){return a+""}function Ug(a,b){return"undefined"!==typeof a?a: +b}function Gd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Vg(a,b){switch(a.type){case q.MemberExpression:if(a.computed)return!1;break;case q.UnaryExpression:return 1;case q.BinaryExpression:return"+"!==a.operator?1:!1;case q.CallExpression:return!1}return void 0===b?Hd:b}function Z(a,b,d){var c,e,f=a.isPure=Vg(a,d);switch(a.type){case q.Program:c=!0;r(a.body,function(a){Z(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case q.Literal:a.constant=!0;a.toWatch= +[];break;case q.UnaryExpression:Z(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case q.BinaryExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:Z(a.test,b,f);Z(a.alternate,b,f);Z(a.consequent,b,f);a.constant=a.test.constant&& +a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=[a];break;case q.MemberExpression:Z(a.object,b,f);a.computed&&Z(a.property,b,f);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case q.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];r(a.arguments,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case q.AssignmentExpression:Z(a.left, +b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case q.ArrayExpression:c=!0;e=[];r(a.elements,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=e;break;case q.ObjectExpression:c=!0;e=[];r(a.properties,function(a){Z(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(Z(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case q.ThisExpression:a.constant= +!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Id(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Jd(a){return a.type===q.Identifier||a.type===q.MemberExpression}function Kd(a){if(1===a.body.length&&Jd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function Ld(a){this.$filter=a}function Md(a){this.$filter=a}function Nb(a,b,d){this.ast= +new q(a,d);this.astCompiler=d.csp?new Md(b):new Ld(b)}function Bc(a){return B(a.valueOf)?a.valueOf():Wg.call(a)}function $f(){var a=T(),b={"true":!0,"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral=function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(b,c){var d,f;switch(typeof b){case "string":return f=b=b.trim(),d=a[f],d||(d=new Ob(G),d=(new Nb(d,e,G)).parse(b),a[f]=p(d)),s(d,c);case "function":return s(b,c);default:return s(E, +c)}}function g(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=Bc(a),"object"!==typeof a||c)?a===b||a!==a&&b!==b:!1}function k(a,b,c,d,e){var f=d.inputs,h;if(1===f.length){var k=g,f=f[0];return a.$watch(function(a){var b=f(a);g(b,k,f.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&Bc(b));return h},b,c,e)}for(var l=[],m=[],n=0,p=f.length;n=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,f=0,g=e.length;fa)for(b in l++, +f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$$pure=g(a).literal;c.$stateful=!c.$$pure;var d=this,e,f,h,k=1r&&(A=4-r,N[A]||(N[A]=[]),N[A].push({msg:B(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:h}));else if(a===c){s= +!1;break a}}catch(E){f(E)}if(!(n=!q.$$suspended&&q.$$watchersCount&&q.$$childHead||q!==y&&q.$$nextSibling))for(;q!==y&&!(n=q.$$nextSibling);)q=q.$parent}while(q=n);if((s||w.length)&&!r--)throw v.$$phase=null,d("infdig",b,N);}while(s||w.length);for(v.$$phase=null;Jwa)throw Ea("iequirks");var c=ja(W);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ta);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(W, +function(a,b){var d=K(b);c[("parse_as_"+d).replace(Dc,xb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Dc,xb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Dc,xb)]=function(b){return g(a,b)}});return c}]}function fg(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=fa((/android (\d+)/.exec(K((a.navigator||{}).userAgent))|| +[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},k=g.body&&g.body.style,h=!1,l=!1;k&&(h=!!("transition"in k||"webkitTransition"in k),l=!!("animation"in k||"webkitAnimation"in k));return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===a&&wa)return!1;if(A(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),transitions:h,animations:l,android:e}}]}function gg(){this.$get=ia(function(a){return new Yg(a)})}function Yg(a){function b(){var a=e.pop();return a&& +a.cb}function d(a){for(var b=e.length-1;0<=b;--b){var c=e[b];if(c.type===a)return e.splice(b,1),c.cb}}var c={},e=[],f=this.ALL_TASKS_TYPE="$$all$$",g=this.DEFAULT_TASK_TYPE="$$default$$";this.completeTask=function(e,h){h=h||g;try{e()}finally{var l;l=h||g;c[l]&&(c[l]--,c[f]--);l=c[h];var m=c[f];if(!m||!l)for(l=m?d:b;m=l(h);)try{m()}catch(p){a.error(p)}}};this.incTaskCount=function(a){a=a||g;c[a]=(c[a]||0)+1;c[f]=(c[f]||0)+1};this.notifyWhenNoPendingTasks=function(a,b){b=b||f;c[b]?e.push({type:b,cb:a}): +a()}}function ig(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(k,h){g.totalPendingRequests++;if(!C(k)||A(d.get(k)))k=f.getTrustedResourceUrl(k);var l=c.defaults&&c.defaults.transformResponse;H(l)?l=l.filter(function(a){return a!==wc}):l===wc&&(l=null);return c.get(k,S({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){return d.put(k,a.data)}, +function(a){h||(a=Zg("tpload",k,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function jg(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var c=ca.element(a).data("$binding");c&&r(c,function(c){d?(new RegExp("(^|\\s)"+Od(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-", +"data-ng-","ng\\:"],k=0;kc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Fc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Fc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Yd&&(d=d.splice(0,Yd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ih(a, +b,d,c){var e=a.d,f=e.length-a.i;b=A(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fk;)h.unshift(0),k++;0=b.lgSize&&k.unshift(h.splice(-b.lgSize,h.length).join(""));h.length>b.gSize;)k.unshift(h.splice(-b.gSize,h.length).join(""));h.length&&k.unshift(h.join(""));h=k.join(d);f.length&&(h+=c+f.join(""));e&&(h+="e+"+e)}return 0>a&&!g?b.negPre+h+b.negSuf:b.posPre+ +h+b.posSuf}function Pb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length-d)f+=d;0===f&&-12===d&&(f=12);return Pb(f,b,c,e)}}function lb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Zd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function $d(a){return function(b){var d= +Zd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Pb(b,a)}}function Gc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Td(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=fa(b[9]+b[10]),g=fa(b[9]+b[11]));k.call(a,fa(b[1]),fa(b[2])-1,fa(b[3]));f=fa(b[4]||0)-f;g=fa(b[5]||0)-g;k=fa(b[6]||0);b=Math.round(1E3*parseFloat("0."+ +(b[7]||0)));h.call(a,f,g,k,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",k=[],h,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;C(c)&&(c=jh.test(c)?fa(c):b(c));X(c)&&(c=new Date(c));if(!ha(c)||!isFinite(c.getTime()))return c;for(;d;)(l=kh.exec(d))?(k=db(k,l,1),d=k.pop()):(k.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=fc(f,m),c=gc(c,f,!0));r(k,function(b){h=lh[b];g+=h?h(c,a.DATETIME_FORMATS, +m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ch(){return function(a,b){A(b)&&(b=2);return eb(a,b)}}function dh(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):fa(b);if(Y(b))return a;X(a)&&(a=a.toString());if(!za(a))return a;d=!d||isNaN(d)?0:fa(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Hc(a,d,d+b):0===d?Hc(a,b,a.length):Hc(a,Math.max(0,d+b),d)}}function Hc(a,b,d){return C(a)?a.slice(b,d):Ha.call(a,b,d)}function Vd(a){function b(b){return b.map(function(b){var c= +1,d=Ta;if(B(b))d=b;else if(C(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e=d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,h=b.type;if(d===h){var h=a.value,l=b.value;"string"===d?(h=h.toLowerCase(),l=l.toLowerCase()):"object"===d&&(D(h)&&(h=a.index),D(l)&&(l=b.index));h!==l&&(c= +hb||37<=b&&40>=b|| +m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut drop",m)}b.on("change",l);if(ee[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!h){var b=this.validity,c=b.badInput,d=b.typeMismatch;h=f.defer(function(){h=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Rb(a,b){return function(d,c){var e,f;if(ha(d))return d;if(C(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length- +1)&&(d=d.substring(1,d.length-1));if(mh.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(a,c){cf.yyyy&&e.setFullYear(f.yyyy),e}return NaN}}function ob(a,b,d,c){return function(e,f,g,k,h,l,m, +p){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return w(a)&&!ha(a)?r(a)||void 0:a}function r(a,b){var c=k.$options.getOption("timezone");v&&v!==c&&(b=Uc(b,fc(v)));var e=d(a,b);!isNaN(e)&&c&&(e=gc(e,c));return e}Jc(e,f,g,k,a);Sa(e,f,g,k,h,l);var t="time"===a||"datetimelocal"===a,q,v;k.$parsers.push(function(c){if(k.$isEmpty(c))return null;if(b.test(c))return r(c,q);k.$$parserName=a});k.$formatters.push(function(a){if(a&&!ha(a))throw pb("datefmt",a);if(n(a)){q=a;var b= +k.$options.getOption("timezone");b&&(v=b,q=gc(q,b,!0));var d=c;t&&C(k.$options.getOption("timeSecondsFormat"))&&(d=c.replace("ss.sss",k.$options.getOption("timeSecondsFormat")).replace(/:$/,""));a=m("date")(a,d,b);t&&k.$options.getOption("timeStripZeroSeconds")&&(a=a.replace(/(?::00)?(?:\.000)?$/,""));return a}v=q=null;return""});if(w(g.min)||g.ngMin){var x=g.min||p(g.ngMin)(e),z=s(x);k.$validators.min=function(a){return!n(a)||A(z)||d(a)>=z};g.$observe("min",function(a){a!==x&&(z=s(a),x=a,k.$validate())})}if(w(g.max)|| +g.ngMax){var y=g.max||p(g.ngMax)(e),J=s(y);k.$validators.max=function(a){return!n(a)||A(J)||d(a)<=J};g.$observe("max",function(a){a!==y&&(J=s(a),y=a,k.$validate())})}}}function Jc(a,b,d,c,e){(c.$$hasNativeValidators=D(b[0].validity))&&c.$parsers.push(function(a){var d=b.prop("validity")||{};if(d.badInput||d.typeMismatch)c.$$parserName=e;else return a})}function fe(a){a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(nh.test(b))return parseFloat(b);a.$$parserName="number"});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!X(b))throw pb("numfmt", +b);b=b.toString()}return b})}function na(a){w(a)&&!X(a)&&(a=parseFloat(a));return Y(a)?void 0:a}function Kc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ge(a,b,d){a=Number(a);var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Kc(a):0,k=e?Kc(b):0,h=f?Kc(d):0,g=Math.max(g,k,h),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function he(a,b,d,c,e){if(w(c)){a= +a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return e}function Lc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d(?:<\/\1>|)$/,nc=/<|&#?\w+;/,rg=/<([\w:-]+)/,sg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,qa={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr", +"tbody","table"]};qa.tbody=qa.tfoot=qa.colgroup=qa.caption=qa.thead;qa.th=qa.td;var hb={option:[1,'"],_default:[0,"",""]},Nc;for(Nc in qa){var le=qa[Nc],me=le.slice().reverse();hb[Nc]=[me.length,"<"+me.join("><")+">",""]}hb.optgroup=hb.option;var zg=z.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Wa=U.prototype={ready:hd,toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+ +"]"},eq:function(a){return 0<=a?x(this[a]):x(this[this.length+a])},length:0,push:ph,sort:[].sort,splice:[].splice},Hb={};r("multiple selected checked disabled readOnly required open".split(" "),function(a){Hb[K(a)]=a});var od={};r("input select option textarea button form details".split(" "),function(a){od[a]=!0});var vd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:sc,removeData:rc,hasData:function(a){for(var b in Ka[a.ng339])return!0; +return!1},cleanData:function(a){for(var b=0,d=a.length;b/,Cg=/^[^(]*\(\s*([^)]*)\)/m,sh=/,/,th=/^\s*(_?)(\S+?)\1\s*$/,Ag=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ca=F("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw C(d)&&d||(d=a.name||Dg(a)),Ca("strictdi",d);b=qd(a);r(b[1].split(sh),function(a){a.replace(th,function(a,b,d){c.push(d)})})}a.$inject=c}}else H(a)?(b=a.length-1,tb(a[b],"fn"),c=a.slice(0,b)):tb(a,"fn",!0);return c};var ne=F("$animate"), +Ef=function(){this.$get=E},Ff=function(){var a=new Ib,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=C(b)?b.split(" "):H(b)?b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=Eg(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Eb(a,e);f&&Db(a,f)});a.delete(b)}});b.length=0}return{enabled:E,on:E,off:E,pin:E,push:function(g, +k,h,l){l&&l();h=h||{};h.from&&g.css(h.from);h.to&&g.css(h.to);if(h.addClass||h.removeClass)if(k=h.addClass,l=h.removeClass,h=a.get(g)||{},k=e(h,k,!0),l=e(h,l,!1),k||l)a.set(g,h),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Cf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw ne("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g, +d)};this.customFilter=function(a){1===arguments.length&&(c=B(a)?a:null);return c};this.classNameFilter=function(a){if(1===arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,ne("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e <= >= && || ! = |".split(" "),function(a){Vb[a]= +!0});var wh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ob=function(a){this.options=a};Ob.prototype={constructor:Ob,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"=== +typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)}, +isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b= +w(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Ya("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:q.BinaryExpression,operator:b.text, +left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()}, +primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=Ia(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:q.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression", +this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression()); +return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]"); +return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:q.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"), +b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw Ya("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Ya("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Ya("ueoe", +this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:q.ThisExpression},$locals:{type:q.LocalsExpression}}};var Hd=2;Ld.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[], +body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};Z(a,b.$filter);var d="",c;this.stage="assign";if(c=Kd(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Id(a.body);b.stage="inputs";r(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d;var k=b.nextId();b.recurse(a,k);b.return_(k);b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage= +"main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Tg,Ug,Gd);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;r(b,function(b){a.push("var "+b.name+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+ +";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")}, +recurse:function(a,b,d,c,e,f){var g,k,h=this,l,m,p;c=c||E;if(!f&&w(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case q.Program:r(a.body,function(b,c){h.recurse(b.expression,void 0,void 0,function(a){k=a});c!==a.body.length-1?h.current().body.push(k,";"):h.return_(k)});break;case q.Literal:m=this.escape(a.value);this.assign(b,m);c(b||m);break;case q.UnaryExpression:this.recurse(a.argument,void 0, +void 0,function(a){k=a});m=a.operator+"("+this.ifDefined(k,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){k=a});m="+"===a.operator?this.plus(g,k):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(k,0):"("+g+")"+a.operator+"("+k+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId();h.recurse(a.left,b);h.if_("&&"===a.operator?b:h.not(b),h.lazyRecurse(a.right, +b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();h.recurse(a.test,b);h.if_(b,h.lazyRecurse(a.alternate,b),h.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",a.name)),function(){h.if_("inputs"===h.stage||"s",function(){e&&1!==e&&h.if_(h.isNull(h.nonComputedMember("s",a.name)), +h.lazyAssign(h.nonComputedMember("s",a.name),"{}"));h.assign(b,h.nonComputedMember("s",a.name))})},b&&h.lazyAssign(b,h.nonComputedMember("l",a.name)));c(b);break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();h.recurse(a.object,g,void 0,function(){h.if_(h.notNull(g),function(){a.computed?(k=h.nextId(),h.recurse(a.property,k),h.getStringValue(k),e&&1!==e&&h.if_(h.not(h.computedMember(g,k)),h.lazyAssign(h.computedMember(g,k),"{}")),m=h.computedMember(g,k),h.assign(b, +m),d&&(d.computed=!0,d.name=k)):(e&&1!==e&&h.if_(h.isNull(h.nonComputedMember(g,a.property.name)),h.lazyAssign(h.nonComputedMember(g,a.property.name),"{}")),m=h.nonComputedMember(g,a.property.name),h.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){h.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(k=h.filter(a.callee.name),l=[],r(a.arguments,function(a){var b=h.nextId();h.recurse(a,b);l.push(b)}),m=k+"("+l.join(",")+")",h.assign(b,m),c(b)): +(k=h.nextId(),g={},l=[],h.recurse(a.callee,k,g,function(){h.if_(h.notNull(k),function(){r(a.arguments,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m=g.name?h.member(g.context,g.name,g.computed)+"("+l.join(",")+")":k+"("+l.join(",")+")";h.assign(b,m)},function(){h.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:k=this.nextId();g={};this.recurse(a.left,void 0,g,function(){h.if_(h.notNull(g.context),function(){h.recurse(a.right,k);m=h.member(g.context, +g.name,g.computed)+a.operator+k;h.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];r(a.elements,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case q.ObjectExpression:l=[];p=!1;r(a.properties,function(a){a.computed&&(p=!0)});p?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed?(g=h.nextId(),h.recurse(a.key,g)):g=a.key.type===q.Identifier?a.key.name:""+a.key.value;k=h.nextId(); +h.recurse(a.value,k);h.assign(h.member(b,g,a.computed),k)})):(r(a.properties,function(b){h.recurse(b.value,a.constant?void 0:h.nextId(),void 0,function(a){l.push(h.escape(b.key.type===q.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case q.ThisExpression:this.assign(b,"s");c(b||"s");break;case q.LocalsExpression:this.assign(b,"l");c(b||"l");break;case q.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+ +b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a, +b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a, +b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(C(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(X(a))return a.toString();if(!0===a)return"true";if(!1=== +a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Ya("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Md.prototype={compile:function(a){var b=this;Z(a,b.$filter);var d,c;if(d=Kd(a))c=this.recurse(d);d=Id(a.body);var e;d&&(e=[],r(d,function(a,c){var d=b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];r(a.body, +function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?E:1===a.body.length?f[0]:function(a,b){var c;r(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left), +e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return f.identifier(a.name,b,d);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c, +e,b,d):this.nonComputedMember(c,e,b,d);case q.CallExpression:return g=[],r(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var p=[],n=0;n":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c= +a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k)?b(e,f,g,k):d(e,f,g,k);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c= +e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,k){var h=a(e,f,g,k),l,m;null!=h&&(l=b(e,f,g,k),l+="",c&&1!==c&&h&&!h[l]&&(h[l]={}),m=h[l]);return d?{context:h,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0;return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d, +c,e,f){return f?f[b]:a(d,c,e)}}};Nb.prototype={constructor:Nb,parse:function(a){a=this.getAst(a);var b=this.astCompiler.compile(a.ast),d=a.ast;b.literal=0===d.body.length||1===d.body.length&&(d.body[0].expression.type===q.Literal||d.body[0].expression.type===q.ArrayExpression||d.body[0].expression.type===q.ObjectExpression);b.constant=a.ast.constant;b.oneTime=a.oneTime;return b},getAst:function(a){var b=!1;a=a.trim();":"===a.charAt(0)&&":"===a.charAt(1)&&(b=!0,a=a.substring(2));return{ast:this.ast.ast(a), +oneTime:b}}};var Ea=F("$sce"),W={HTML:"html",CSS:"css",MEDIA_URL:"mediaUrl",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Dc=/_([a-z])/g,Zg=F("$templateRequest"),$g=F("$timeout"),aa=z.document.createElement("a"),Qd=ga(z.location.href),Na;aa.href="http://[::1]";var ah="[::1]"===aa.hostname;Rd.$inject=["$document"];fd.$inject=["$provide"];var Yd=22,Xd=".",Fc="0";Sd.$inject=["$locale"];Ud.$inject=["$locale"];var lh={yyyy:ea("FullYear",4,0,!1,!0),yy:ea("FullYear",2,0,!0,!0),y:ea("FullYear",1,0,!1,!0), +MMMM:lb("Month"),MMM:lb("Month",!0),MM:ea("Month",2,1),M:ea("Month",1,1),LLLL:lb("Month",!1,!0),dd:ea("Date",2),d:ea("Date",1),HH:ea("Hours",2),H:ea("Hours",1),hh:ea("Hours",2,-12),h:ea("Hours",1,-12),mm:ea("Minutes",2),m:ea("Minutes",1),ss:ea("Seconds",2),s:ea("Seconds",1),sss:ea("Milliseconds",3),EEEE:lb("Day"),EEE:lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Pb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},kh=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,jh=/^-?\d+$/;Td.$inject=["$locale"];var eh=ia(K),fh=ia(vb);Vd.$inject=["$parse"];var Re=ia({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===la.call(b.prop("href"))?"xlink:href":"href"; +b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};r(Hb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(vd,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(ke))){e.$set("ngPattern",new RegExp(c[1], +c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});r(["src","srcset","href"],function(a){var b=xa("ng-"+a);wb[b]=["$sce",function(d){return{priority:99,link:function(c,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===la.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$set(b,d.getTrustedMediaUrl(f[b]));f.$observe(b,function(b){b?(f.$set(k,b),wa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}]});var mb={$addControl:E,$getControls:ia([]),$$renameControl:function(a, +b){a.$name=b},$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E,$setSubmitted:E,$$setSubmitted:E};Qb.$inject=["$element","$attrs","$scope","$animate","$interpolate"];Qb.prototype={$rollbackViewValue:function(){r(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(a){a.$commitViewValue()})},$addControl:function(a){Ja(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$getControls:function(){return ja(this.$$controls)}, +$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name];r(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);r(this.$error,function(b,d){this.$setValidity(d,null,a)},this);r(this.$$success,function(b,d){this.$setValidity(d,null,a)},this);cb(this.$$controls,a);a.$$parentForm=mb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Za);this.$$animate.addClass(this.$$element, +Wb);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Za,Wb+" ng-submitted");this.$dirty=!1;this.$pristine=!0;this.$submitted=!1;r(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){for(var a=this;a.$$parentForm&&a.$$parentForm!==mb;)a=a.$$parentForm;a.$$setSubmitted()},$$setSubmitted:function(){this.$$animate.addClass(this.$$element, +"ng-submitted");this.$submitted=!0;r(this.$$controls,function(a){a.$$setSubmitted&&a.$$setSubmitted()})}};ce({clazz:Qb,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(cb(c,d),0===c.length&&delete a[b])}});var oe=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||E}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Qb,compile:function(d,f){d.addClass(Za).addClass(nb); +var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var p=f[0];if(!("action"in e)){var n=function(b){a.$apply(function(){p.$commitViewValue();p.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",n);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",n)},0,!1)})}(f[1]||p.$$parentForm).$addControl(p);var s=g?c(p.$name):E;g&&(s(a,p),e.$observe(g,function(b){p.$name!==b&&(s(a,void 0),p.$$parentForm.$$renameControl(p,b),s=c(p.$name),s(a,p))})); +d.on("$destroy",function(){p.$$parentForm.$removeControl(p);s(a,void 0);S(p,mb)})}}}}}]},Se=oe(),df=oe(!0),mh=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,xh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,yh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/, +nh=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,pe=/^(\d{4,})-(\d{2})-(\d{2})$/,qe=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Oc=/^(\d{4,})-W(\d\d)$/,re=/^(\d{4,})-(\d\d)$/,se=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ee=T();r(["date","datetime-local","month","time","week"],function(a){ee[a]=!0});var te={text:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c)},date:ob("date",pe,Rb(pe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",qe,Rb(qe,"yyyy MM dd HH mm ss sss".split(" ")), +"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",se,Rb(se,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",Oc,function(a,b){if(ha(a))return a;if(C(a)){Oc.lastIndex=0;var d=Oc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,k=0,h=Zd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),k=b.getMilliseconds());return new Date(c,0,h.getDate()+e,d,f,g,k)}}return NaN},"yyyy-Www"),month:ob("month",re,Rb(re,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f,g,k){Jc(a,b,d,c,"number");fe(c);Sa(a, +b,d,c,e,f);var h;if(w(d.min)||d.ngMin){var l=d.min||k(d.ngMin)(a);h=na(l);c.$validators.min=function(a,b){return c.$isEmpty(b)||A(h)||b>=h};d.$observe("min",function(a){a!==l&&(h=na(a),l=a,c.$validate())})}if(w(d.max)||d.ngMax){var m=d.max||k(d.ngMax)(a),p=na(m);c.$validators.max=function(a,b){return c.$isEmpty(b)||A(p)||b<=p};d.$observe("max",function(a){a!==m&&(p=na(a),m=a,c.$validate())})}if(w(d.step)||d.ngStep){var n=d.step||k(d.ngStep)(a),s=na(n);c.$validators.step=function(a,b){return c.$isEmpty(b)|| +A(s)||ge(b,h||0,s)};d.$observe("step",function(a){a!==n&&(s=na(a),n=a,c.$validate())})}},url:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||xh.test(d)}},email:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||yh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==V(d.ngTrim);A(d.name)&&b.attr("name",++qb);b.on("change",function(a){var g;b[0].checked&&(g=d.value,e&&(g= +V(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=V(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,d[a]);var e=d[a];d.$observe(a,function(a){a!==e&&(e=a,c(a))})}function k(a){p=na(a);Y(c.$modelValue)||(m?(a=b.val(),p>a&&(a=p,b.val(a)),c.$setViewValue(a)):c.$validate())}function h(a){n=na(a);Y(c.$modelValue)||(m?(a=b.val(),n=p},g("min",k)); +e&&(n=na(d.max),c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||A(n)||b<=n},g("max",h));f&&(s=na(d.step),c.$validators.step=m?function(){return!r.stepMismatch}:function(a,b){return c.$isEmpty(b)||A(s)||ge(b,p||0,s)},g("step",l))},checkbox:function(a,b,d,c,e,f,g,k){var h=he(k,a,"ngTrueValue",d.ngTrueValue,!0),l=he(k,a,"ngFalseValue",d.ngFalseValue,!1);b.on("change",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty= +function(a){return!1===a};c.$formatters.push(function(a){return va(a,h)});c.$parsers.push(function(a){return a?h:l})},hidden:E,button:E,submit:E,reset:E,file:E},$c=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,k){k[0]&&(te[K(g.type)]||te.text)(e,f,g,k[0],b,a,d,c)}}}}],Af=function(){var a={configurable:!0,enumerable:!1,get:function(){return this.getAttribute("value")||""},set:function(a){this.setAttribute("value",a)}}; +return{restrict:"E",priority:200,compile:function(b,d){if("hidden"===K(d.type))return{pre:function(b,d,f,g){b=d[0];b.parentNode&&b.parentNode.insertBefore(b,b.nextSibling);Object.defineProperty&&Object.defineProperty(b,"value",a)}}}}},zh=/^(true|false|\d+)$/,xf=function(){function a(a,d,c){var e=w(c)?c:9===wa?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return zh.test(d.ngValue)?function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue, +function(b){a(d,f,b)})}}}},We=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=jc(a)})}}}}],Ye=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=A(a)?"":a})}}}}], +Xe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],wf=ia({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ze=Lc("",!0),af=Lc("Odd",0),$e=Lc("Even",1),bf=Ra({compile:function(a, +b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),cf=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ed={},Ah={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);ed[b]=["$parse","$rootScope","$exceptionHandler",function(d,c,e){return sd(d,c,e,b,a,Ah[a])}]});var ff=["$animate","$compile",function(a,b){return{multiElement:!0, +transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var k,h,l;d.$watch(e.ngIf,function(d){d?h||g(function(d,f){h=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);k={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ub(k.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),k=null))})}}}],gf=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element", +controller:ca.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",k=e.autoscroll;return function(c,e,m,p,n){var r=0,q,t,x,v=function(){t&&(t.remove(),t=null);q&&(q.$destroy(),q=null);x&&(d.leave(x).done(function(a){!1!==a&&(t=null)}),t=x,x=null)};c.$watch(f,function(f){var m=function(a){!1===a||!w(k)||k&&!c.$eval(k)||b()},t=++r;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===r){var b=c.$new();p.template=a;a=n(b,function(a){v();d.enter(a,null,e).done(m)});q=b;x=a;q.$emit("$includeContentLoaded", +f);c.$eval(g)}},function(){c.$$destroyed||t!==r||(v(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(v(),p.template=null)})}}}}],zf=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){la.call(d[0]).match(/SVG/)?(d.empty(),a(gd(e.template,z.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],hf=Ra({priority:450,compile:function(){return{pre:function(a, +b,d){a.$eval(d.ngInit)}}}}),vf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!A(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(H(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},nb="ng-valid",be="ng-invalid",Za="ng-pristine",Wb="ng-dirty",pb=F("ngModel");Sb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" "); +Sb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);B(c)&&(c=a(b));return c};this.$$ngModelSet=function(a,c){B(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw pb("nonassign",this.$$attr.ngModel,Aa(this.$$element));},$render:E,$isEmpty:function(a){return A(a)|| +""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element,"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Wb);this.$$animate.addClass(this.$$element,Za)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element, +Za);this.$$animate.addClass(this.$$element,Wb);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched=!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!Y(this.$modelValue)){var a= +this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!==c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;r(h.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(r(h.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(h.$asyncValidators,function(e, +g){var h=e(a,b);if(!h||!B(h.then))throw pb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?h.$$q.all(c).then(function(){g(d)},E):g(!0)}function f(a,b){k===h.$$currentValidationRunId&&h.$setValidity(a,b)}function g(a){k===h.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var k=this.$$currentValidationRunId,h=this;(function(){var a=h.$$parserName;if(A(h.$$parserValid))f(a,null);else return h.$$parserValid||(r(h.$validators,function(a, +b){f(b,null)}),r(h.$asyncValidators,function(a,b){f(b,null)})),f(a,h.$$parserValid),h.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce);if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;this.$$parserValid= +A(a)?void 0:!0;this.$setValidity(this.$$parserName,null);this.$$parserName="parse";if(this.$$parserValid)for(var d=0;dg||e.$isEmpty(b)||b.length<=g}}}}}],cd= +["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=c.minlength||a(c.ngMinlength)(b),g=Ub(f)||-1;c.$observe("minlength",function(a){f!==a&&(g=Ub(a)||-1,f=a,e.$validate())});e.$validators.minlength=function(a,b){return e.$isEmpty(b)||b.length>=g}}}}}];z.angular.bootstrap?z.console&&console.log("WARNING: Tried to load AngularJS more than once."):(Je(),Oe(ca),ca.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1== +b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "), +WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a, +c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),x(function(){Ee(z.document,Wc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element("`),t=this.attachShadow({mode:"open"});t.appendChild(e.content.cloneNode(!0)),t.addEventListener("move",this),this[bg]=this[vg].map((e=>new e(t)))}connectedCallback(){if(this.hasOwnProperty("color")){const e=this.color;delete this.color,this.color=e}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(e,t,i){const n=this.colorModel.fromAttr(i);this[mg](n)||(this.color=n)}handleEvent(e){const t=this[fg],i={...t,...e.detail};let n;this[pg](i),ng(i,t)||this[mg](n=this.colorModel.fromHsva(i))||(this[gg]=n,rg(this,"color-changed",{value:n}))}[mg](e){return this.color&&this.colorModel.equal(e,this.color)}[pg](e){this[fg]=e,this[bg].forEach((t=>t.update(e)))}}const yg={defaultColor:"#000",toHsva:e=>ig(Jm(e)),fromHsva:({h:e,s:t,v:i})=>tg(Xm({h:e,s:t,v:i,a:1})),equal:(e,t)=>e.toLowerCase()===t.toLowerCase()||ng(Jm(e),Jm(t)),fromAttr:e=>e};class kg extends _g{get colorModel(){return yg}}class Cg extends Du{constructor(e,t={}){super(e),this.set({color:"",_hexColor:""}),this.hexInputRow=this._createInputRow();const i=this.createCollection();t.hideInput||i.add(this.hexInputRow),this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-picker"],tabindex:-1},children:i}),this._config=t,this._debounceColorPickerEvent=La((e=>{this.set("color",e),this.fire("colorSelected",{color:this.color})}),150,{leading:!0}),this.on("set:color",((e,t,i)=>{e.return=dm(i,this._config.format||"hsl")})),this.on("change:color",(()=>{this._hexColor=Ag(this.color)})),this.on("change:_hexColor",(()=>{document.activeElement!==this.picker&&this.picker.setAttribute("color",this._hexColor),Ag(this.color)!=Ag(this._hexColor)&&(this.color=this._hexColor)}))}render(){var e,t;if(super.render(),e="hex-color-picker",t=kg,void 0===customElements.get(e)&&customElements.define(e,t),this.picker=Mn.document.createElement("hex-color-picker"),this.picker.setAttribute("class","hex-color-picker"),this.picker.setAttribute("tabindex","-1"),this._createSlidersView(),this.element){this.hexInputRow.element?this.element.insertBefore(this.picker,this.hexInputRow.element):this.element.appendChild(this.picker);const e=document.createElement("style");e.textContent='[role="slider"]:focus [part$="pointer"] {border: 1px solid #fff;outline: 1px solid var(--ck-color-focus-border);box-shadow: 0 0 0 2px #fff;}',this.picker.shadowRoot.appendChild(e)}this.picker.addEventListener("color-changed",(e=>{const t=e.detail.value;this._debounceColorPickerEvent(t)}))}focus(){if(!this._config.hideInput&&(l.isGecko||l.isiOS||l.isSafari)){this.hexInputRow.children.get(1).focus()}this.slidersView.first.focus()}_createSlidersView(){const e=[...this.picker.shadowRoot.children].filter((e=>"slider"===e.getAttribute("role"))).map((e=>new xg(e)));this.slidersView=this.createCollection(),e.forEach((e=>{this.slidersView.add(e)}))}_createInputRow(){const e=new Eg,t=this._createColorInput();return new Tg(this.locale,[e,t])}_createColorInput(){const e=new um(this.locale,Um),{t}=this.locale;return e.set({label:t("HEX"),class:"color-picker-hex-input"}),e.fieldView.bind("value").to(this,"_hexColor",(t=>e.isFocused?e.fieldView.value:t.startsWith("#")?t.substring(1):t)),e.fieldView.on("input",(()=>{const t=e.fieldView.element.value;if(t){const e=t.trim(),i=e.startsWith("#")?e.substring(1):e;[3,4,6,8].includes(i.length)&&/(([0-9a-fA-F]{2}){3,4}|([0-9a-fA-F]){3,4})/.test(i)&&this._debounceColorPickerEvent("#"+i)}})),e}}function Ag(e){let t=function(e){if(!e)return"";const t=hm(e);return t?"hex"===t.space?t.hexValue:dm(e,"hex"):"#000"}(e);return t||(t="#000"),4===t.length&&(t="#"+[t[1],t[1],t[2],t[2],t[3],t[3]].join("")),t.toLowerCase()}class xg extends Du{constructor(e){super(),this.element=e}focus(){this.element.focus()}}class Eg extends Du{constructor(e){super(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-picker__hash-view"]},children:"#"})}}class Tg extends Du{constructor(e,t){super(e),this.children=this.createCollection(t),this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-picker__row"]},children:this.children})}}class Sg extends(G(Ks)){constructor(e){super(e),this.set("isEmpty",!0),this.on("change",(()=>{this.set("isEmpty",0===this.length)}))}add(e,t){return this.find((t=>t.color===e.color))?this:super.add(e,t)}hasColor(e){return!!this.find((t=>t.color===e))}}const{eraser:Pg,colorPalette:Ig}=fu;class Vg extends Du{constructor(e,{colors:t,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o,colorPickerLabel:r,focusTracker:a,focusables:l}){super(e);const c=this.bindTemplate;this.set("isVisible",!0),this.focusTracker=a,this.items=this.createCollection(),this.colorDefinitions=t,this.columns=i,this.documentColors=new Sg,this.documentColorsCount=o,this._focusables=l,this._removeButtonLabel=n,this._colorPickerLabel=r,this._documentColorsLabel=s,this.setTemplate({tag:"div",attributes:{class:["ck-color-grids-fragment",c.if("isVisible","ck-hidden",(e=>!e))]},children:this.items}),this.removeColorButtonView=this._createRemoveColorButton(),this.items.add(this.removeColorButtonView)}updateDocumentColors(e,t){const i=e.document,n=this.documentColorsCount;this.documentColors.clear();for(const s of i.getRoots()){const i=e.createRangeIn(s);for(const e of i.getItems())if(e.is("$textProxy")&&e.hasAttribute(t)&&(this._addColorToDocumentColors(e.getAttribute(t)),this.documentColors.length>=n))return}}updateSelectedColors(){const e=this.documentColorsGrid,t=this.staticColorsGrid,i=this.selectedColor;t.selectedColor=i,e&&(e.selectedColor=i)}render(){if(super.render(),this.staticColorsGrid=this._createStaticColorsGrid(),this.items.add(this.staticColorsGrid),this.documentColorsCount){const e=bu.bind(this.documentColors,this.documentColors),t=new Lu(this.locale);t.text=this._documentColorsLabel,t.extendTemplate({attributes:{class:["ck","ck-color-grid__label",e.if("isEmpty","ck-hidden")]}}),this.items.add(t),this.documentColorsGrid=this._createDocumentColorsGrid(),this.items.add(this.documentColorsGrid)}this._createColorPickerButton(),this._addColorSelectorElementsToFocusTracker()}focus(){this.removeColorButtonView.focus()}destroy(){super.destroy()}addColorPickerButton(){this.colorPickerButtonView&&(this.items.add(this.colorPickerButtonView),this.focusTracker.add(this.colorPickerButtonView.element),this._focusables.add(this.colorPickerButtonView))}_addColorSelectorElementsToFocusTracker(){this.focusTracker.add(this.removeColorButtonView.element),this._focusables.add(this.removeColorButtonView),this.staticColorsGrid&&(this.focusTracker.add(this.staticColorsGrid.element),this._focusables.add(this.staticColorsGrid)),this.documentColorsGrid&&(this.focusTracker.add(this.documentColorsGrid.element),this._focusables.add(this.documentColorsGrid))}_createColorPickerButton(){this.colorPickerButtonView=new Ku,this.colorPickerButtonView.set({label:this._colorPickerLabel,withText:!0,icon:Ig,class:"ck-color-selector__color-picker"}),this.colorPickerButtonView.on("execute",(()=>{this.fire("colorPicker:show")}))}_createRemoveColorButton(){const e=new Ku;return e.set({withText:!0,icon:Pg,label:this._removeButtonLabel}),e.class="ck-color-selector__remove-color",e.on("execute",(()=>{this.fire("execute",{value:null,source:"removeColorButton"})})),e.render(),e}_createStaticColorsGrid(){const e=new sm(this.locale,{colorDefinitions:this.colorDefinitions,columns:this.columns});return e.on("execute",((e,t)=>{this.fire("execute",{value:t.value,source:"staticColorsGrid"})})),e}_createDocumentColorsGrid(){const e=bu.bind(this.documentColors,this.documentColors),t=new sm(this.locale,{columns:this.columns});return t.extendTemplate({attributes:{class:e.if("isEmpty","ck-hidden")}}),t.items.bindTo(this.documentColors).using((e=>{const t=new nm;return t.set({color:e.color,hasBorder:e.options&&e.options.hasBorder}),e.label&&t.set({label:e.label,tooltip:!0}),t.on("execute",(()=>{this.fire("execute",{value:e.color,source:"documentColorsGrid"})})),t})),this.documentColors.on("change:isEmpty",((e,i,n)=>{n&&(t.selectedColor=null)})),t}_addColorToDocumentColors(e){const t=this.colorDefinitions.find((t=>t.color===e));t?this.documentColors.add(Object.assign({},t)):this.documentColors.add({color:e,label:e,options:{hasBorder:!1}})}}class Rg extends Du{constructor(e,{focusTracker:t,focusables:i,keystrokes:n,colorPickerViewConfig:s}){super(e),this.items=this.createCollection(),this.focusTracker=t,this.keystrokes=n,this.set("isVisible",!1),this.set("selectedColor",void 0),this._focusables=i,this._colorPickerViewConfig=s;const o=this.bindTemplate,{saveButtonView:r,cancelButtonView:a}=this._createActionButtons();this.saveButtonView=r,this.cancelButtonView=a,this.actionBarView=this._createActionBarView({saveButtonView:r,cancelButtonView:a}),this.setTemplate({tag:"div",attributes:{class:["ck-color-picker-fragment",o.if("isVisible","ck-hidden",(e=>!e))]},children:this.items})}render(){super.render();const e=new Cg(this.locale,{...this._colorPickerViewConfig});this.colorPickerView=e,this.colorPickerView.render(),this.selectedColor&&(e.color=this.selectedColor),this.listenTo(this,"change:selectedColor",((t,i,n)=>{e.color=n})),this.items.add(this.colorPickerView),this.items.add(this.actionBarView),this._addColorPickersElementsToFocusTracker(),this._stopPropagationOnArrowsKeys(),this._executeOnEnterPress(),this._executeUponColorChange()}destroy(){super.destroy()}focus(){this.colorPickerView.focus()}_executeOnEnterPress(){this.keystrokes.set("enter",(e=>{this.isVisible&&this.focusTracker.focusedElement!==this.cancelButtonView.element&&(this.fire("execute",{value:this.selectedColor}),e.stopPropagation(),e.preventDefault())}))}_stopPropagationOnArrowsKeys(){const e=e=>e.stopPropagation();this.keystrokes.set("arrowright",e),this.keystrokes.set("arrowleft",e),this.keystrokes.set("arrowup",e),this.keystrokes.set("arrowdown",e)}_addColorPickersElementsToFocusTracker(){for(const e of this.colorPickerView.slidersView)this.focusTracker.add(e.element),this._focusables.add(e);const e=this.colorPickerView.hexInputRow.children.get(1);e.element&&(this.focusTracker.add(e.element),this._focusables.add(e)),this.focusTracker.add(this.saveButtonView.element),this._focusables.add(this.saveButtonView),this.focusTracker.add(this.cancelButtonView.element),this._focusables.add(this.cancelButtonView)}_createActionBarView({saveButtonView:e,cancelButtonView:t}){const i=new Du,n=this.createCollection();return n.add(e),n.add(t),i.setTemplate({tag:"div",attributes:{class:["ck","ck-color-selector_action-bar"]},children:n}),i}_createActionButtons(){const e=this.locale,t=e.t,i=new Ku(e),n=new Ku(e);return i.set({icon:fu.check,class:"ck-button-save",type:"button",withText:!1,label:t("Accept")}),n.set({icon:fu.cancel,class:"ck-button-cancel",type:"button",withText:!1,label:t("Cancel")}),i.on("execute",(()=>{this.fire("execute",{source:"colorPickerSaveButton",value:this.selectedColor})})),n.on("execute",(()=>{this.fire("colorPicker:cancel")})),{saveButtonView:i,cancelButtonView:n}}_executeUponColorChange(){this.colorPickerView.on("colorSelected",((e,t)=>{this.fire("execute",{value:t.color,source:"colorPicker"}),this.set("selectedColor",t.color)}))}}class Og extends Du{constructor(e,{colors:t,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o,colorPickerLabel:r,colorPickerViewConfig:a}){super(e),this.items=this.createCollection(),this.focusTracker=new Js,this.keystrokes=new Qs,this._focusables=new pu,this._colorPickerViewConfig=a,this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.colorGridsFragmentView=new Vg(e,{colors:t,columns:i,removeButtonLabel:n,documentColorsLabel:s,documentColorsCount:o,colorPickerLabel:r,focusTracker:this.focusTracker,focusables:this._focusables}),this.colorPickerFragmentView=new Rg(e,{focusables:this._focusables,focusTracker:this.focusTracker,keystrokes:this.keystrokes,colorPickerViewConfig:a}),this.set("_isColorGridsFragmentVisible",!0),this.set("_isColorPickerFragmentVisible",!1),this.set("selectedColor",void 0),this.colorGridsFragmentView.bind("isVisible").to(this,"_isColorGridsFragmentVisible"),this.colorPickerFragmentView.bind("isVisible").to(this,"_isColorPickerFragmentVisible"),this.on("change:selectedColor",((e,t,i)=>{this.colorGridsFragmentView.set("selectedColor",i),this.colorPickerFragmentView.set("selectedColor",i)})),this.colorGridsFragmentView.on("change:selectedColor",((e,t,i)=>{this.set("selectedColor",i)})),this.colorPickerFragmentView.on("change:selectedColor",((e,t,i)=>{this.set("selectedColor",i)})),this.setTemplate({tag:"div",attributes:{class:["ck","ck-color-selector"]},children:this.items})}render(){super.render(),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}appendUI(){this._appendColorGridsFragment(),this._colorPickerViewConfig&&this._appendColorPickerFragment()}showColorPickerFragment(){this.colorPickerFragmentView.colorPickerView&&!this._isColorPickerFragmentVisible&&(this._isColorPickerFragmentVisible=!0,this.colorPickerFragmentView.focus(),this._isColorGridsFragmentVisible=!1)}showColorGridsFragment(){this._isColorGridsFragmentVisible||(this._isColorGridsFragmentVisible=!0,this.colorGridsFragmentView.focus(),this._isColorPickerFragmentVisible=!1)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}updateDocumentColors(e,t){this.colorGridsFragmentView.updateDocumentColors(e,t)}updateSelectedColors(){this.colorGridsFragmentView.updateSelectedColors()}_appendColorGridsFragment(){this.items.length||(this.items.add(this.colorGridsFragmentView),this.colorGridsFragmentView.delegate("execute").to(this),this.colorGridsFragmentView.delegate("colorPicker:show").to(this))}_appendColorPickerFragment(){2!==this.items.length&&(this.items.add(this.colorPickerFragmentView),this.colorGridsFragmentView.colorPickerButtonView&&this.colorGridsFragmentView.colorPickerButtonView.on("execute",(()=>{this.showColorPickerFragment()})),this.colorGridsFragmentView.addColorPickerButton(),this.colorPickerFragmentView.delegate("execute").to(this),this.colorPickerFragmentView.delegate("colorPicker:cancel").to(this))}}class Bg{constructor(e){this._components=new Map,this.editor=e}*names(){for(const e of this._components.values())yield e.originalName}add(e,t){this._components.set(Mg(e),{callback:t,originalName:e})}create(e){if(!this.has(e))throw new y("componentfactory-item-missing",this,{name:e});return this._components.get(Mg(e)).callback(this.editor.locale)}has(e){return this._components.has(Mg(e))}}function Mg(e){return String(e).toLowerCase()}class Ng extends Du{constructor(e,t={}){super(e);const i=this.bindTemplate;this.set("label",t.label||""),this.set("class",t.class||null),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",i.to("class")]},children:this.children}),t.icon&&(this.iconView=new qu,this.iconView.content=t.icon,this.children.add(this.iconView));const n=new Du(e);n.setTemplate({tag:"h2",attributes:{class:["ck","ck-form__header__label"],role:"presentation"},children:[{text:i.to("label")}]}),this.children.add(n)}}class Fg extends Du{constructor(e){super(e),this.children=this.createCollection(),this.keystrokes=new Qs,this._focusTracker=new Js,this._focusables=new pu,this.focusCycler=new ym({focusables:this._focusables,focusTracker:this._focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog__actions"]},children:this.children})}render(){super.render(),this.keystrokes.listenTo(this.element)}setButtons(e){for(const t of e){const e=new Ku(this.locale);let i;for(i in e.on("execute",(()=>t.onExecute())),t.onCreate&&t.onCreate(e),t)"onExecute"!=i&&"onCreate"!=i&&e.set(i,t[i]);this.children.add(e)}this._updateFocusCyclableItems()}focus(e){-1===e?this.focusCycler.focusLast():this.focusCycler.focusFirst()}_updateFocusCyclableItems(){Array.from(this.children).forEach((e=>{this._focusables.add(e),this._focusTracker.add(e.element)}))}}class Dg extends Du{constructor(e){super(e),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog__content"]},children:this.children})}reset(){for(;this.children.length;)this.children.remove(0)}}const Lg="screen-center",zg="editor-center",Hg="editor-top-side",$g="editor-top-center",Wg="editor-bottom-center",jg="editor-above-center",Ug="editor-below-center",qg=Zn("px");class Gg extends(function(e){return class extends e{constructor(...e){super(...e),this._onDragBound=this._onDrag.bind(this),this._onDragEndBound=this._onDragEnd.bind(this),this._lastDraggingCoordinates={x:0,y:0},this.on("render",(()=>{this._attachListeners()})),this.set("isDragging",!1)}_attachListeners(){this.listenTo(this.element,"mousedown",this._onDragStart.bind(this)),this.listenTo(this.element,"touchstart",this._onDragStart.bind(this))}_attachDragListeners(){this.listenTo(Mn.document,"mouseup",this._onDragEndBound),this.listenTo(Mn.document,"touchend",this._onDragEndBound),this.listenTo(Mn.document,"mousemove",this._onDragBound),this.listenTo(Mn.document,"touchmove",this._onDragBound)}_detachDragListeners(){this.stopListening(Mn.document,"mouseup",this._onDragEndBound),this.stopListening(Mn.document,"touchend",this._onDragEndBound),this.stopListening(Mn.document,"mousemove",this._onDragBound),this.stopListening(Mn.document,"touchmove",this._onDragBound)}_onDragStart(e,t){if(!this._isHandleElementPressed(t))return;this._attachDragListeners();let i=0,n=0;t instanceof MouseEvent?(i=t.clientX,n=t.clientY):(i=t.touches[0].clientX,n=t.touches[0].clientY),this._lastDraggingCoordinates={x:i,y:n},this.isDragging=!0}_onDrag(e,t){if(!this.isDragging)return void this._detachDragListeners();let i=0,n=0;t instanceof MouseEvent?(i=t.clientX,n=t.clientY):(i=t.touches[0].clientX,n=t.touches[0].clientY),t.preventDefault(),this.fire("drag",{deltaX:Math.round(i-this._lastDraggingCoordinates.x),deltaY:Math.round(n-this._lastDraggingCoordinates.y)}),this._lastDraggingCoordinates={x:i,y:n}}_onDragEnd(){this._detachDragListeners(),this.isDragging=!1}_isHandleElementPressed(e){return!!this.dragHandleElement&&(this.dragHandleElement===e.target||e.target instanceof HTMLElement&&this.dragHandleElement.contains(e.target))}}}(Du)){constructor(e,{getCurrentDomRoot:t,getViewportOffset:i}){super(e),this.wasMoved=!1;const n=this.bindTemplate,s=e.t;this.set("className",""),this.set("ariaLabel",s("Editor dialog")),this.set("isModal",!1),this.set("position",Lg),this.set("_isVisible",!1),this.set("_isTransparent",!1),this.set("_top",0),this.set("_left",0),this._getCurrentDomRoot=t,this._getViewportOffset=i,this.decorate("moveTo"),this.parts=this.createCollection(),this.keystrokes=new Qs,this.focusTracker=new Js,this._focusables=new pu,this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog-overlay",n.if("isModal","ck-dialog-overlay__transparent",(e=>!e)),n.if("_isVisible","ck-hidden",(e=>!e))],tabindex:"-1"},children:[{tag:"div",attributes:{tabindex:"-1",class:["ck","ck-dialog",n.to("className")],role:"dialog","aria-label":n.to("ariaLabel"),style:{top:n.to("_top",(e=>qg(e))),left:n.to("_left",(e=>qg(e))),visibility:n.if("_isTransparent","hidden")}},children:this.parts}]})}render(){super.render(),this.keystrokes.set("Esc",((e,t)=>{this.fire("close",{source:"escKeyPress"}),t()})),this.on("drag",((e,{deltaX:t,deltaY:i})=>{this.wasMoved=!0,this.moveBy(t,i)})),this.listenTo(Mn.window,"resize",(()=>{this._isVisible&&!this.wasMoved&&this.updatePosition()})),this.listenTo(Mn.document,"scroll",(()=>{this._isVisible&&!this.wasMoved&&this.updatePosition()})),this.on("change:_isVisible",((e,t,i)=>{i&&(this._isTransparent=!0,setTimeout((()=>{this.updatePosition(),this._isTransparent=!1,this.focus()}),10))})),this.keystrokes.listenTo(this.element)}get dragHandleElement(){return this.headerView?this.headerView.element:null}setupParts({icon:e,title:t,hasCloseButton:i=!0,content:n,actionButtons:s}){t&&(this.headerView=new Ng(this.locale,{icon:e}),i&&(this.closeButtonView=this._createCloseButton(),this.headerView.children.add(this.closeButtonView)),this.headerView.label=t,this.ariaLabel=t,this.parts.add(this.headerView,0)),n&&(n instanceof Du&&(n=[n]),this.contentView=new Dg(this.locale),this.contentView.children.addMany(n),this.parts.add(this.contentView)),s&&(this.actionsView=new Fg(this.locale),this.actionsView.setButtons(s),this.parts.add(this.actionsView)),this._updateFocusCyclableItems()}focus(){this._focusCycler.focusFirst()}moveTo(e,t){const i=this._getViewportRect(),n=this._getDialogRect();e+n.width>i.right&&(e=i.right-n.width),e{var t;this._focusables.add(e),this.focusTracker.add(e.element),Cm(t=e)&&"focusCycler"in t&&t.focusCycler instanceof ym&&(this.listenTo(e.focusCycler,"forwardCycle",(e=>{this._focusCycler.focusNext(),this._focusCycler.next!==this._focusCycler.focusables.get(this._focusCycler.current)&&e.stop()})),this.listenTo(e.focusCycler,"backwardCycle",(e=>{this._focusCycler.focusPrevious(),this._focusCycler.previous!==this._focusCycler.focusables.get(this._focusCycler.current)&&e.stop()})))}))}_createCloseButton(){const e=new Ku(this.locale),t=this.locale.t;return e.set({label:t("Close"),tooltip:!0,icon:fu.cancel}),e.on("execute",(()=>this.fire("close",{source:"closeButton"}))),e}}Gg.defaultOffset=15;const Kg=Gg;class Zg extends so{static get pluginName(){return"Dialog"}constructor(e){super(e);const t=e.t;this._initShowHideListeners(),this._initFocusToggler(),this._initMultiRootIntegration(),this.set("id",null),e.accessibility.addKeystrokeInfos({categoryId:"navigation",keystrokes:[{label:t("Move focus in and out of an active dialog window"),keystroke:"Ctrl+F6",mayRequireFn:!0}]})}_initShowHideListeners(){this.on("show",((e,t)=>{this._show(t)})),this.on("show",((e,t)=>{t.onShow&&t.onShow(this)}),{priority:"low"}),this.on("hide",(()=>{Zg._visibleDialogPlugin&&Zg._visibleDialogPlugin._hide()})),this.on("hide",(()=>{this._onHide&&(this._onHide(this),this._onHide=void 0)}),{priority:"low"})}_initFocusToggler(){const e=this.editor;e.keystrokes.set("Ctrl+F6",((t,i)=>{this.isOpen&&!this.view.isModal&&(this.view.focusTracker.isFocused?e.editing.view.focus():this.view.focus(),i())}))}_initMultiRootIntegration(){const e=this.editor.model;e.document.on("change:data",(()=>{if(!this.view)return;const t=e.document.differ.getChangedRoots();for(const e of t)e.state&&this.view.updatePosition()}))}show(e){this.hide(),this.fire(`show:${e.id}`,e)}_show({id:e,icon:t,title:i,hasCloseButton:n=!0,content:s,actionButtons:o,className:r,isModal:a,position:l,onHide:c}){const d=this.editor;this.view=new Kg(d.locale,{getCurrentDomRoot:()=>d.editing.view.getDomRoot(d.model.document.selection.anchor.root.rootName),getViewportOffset:()=>d.ui.viewportOffset});const h=this.view;h.on("close",(()=>{this.hide()})),d.ui.view.body.add(h),d.ui.focusTracker.add(h.element),d.keystrokes.listenTo(h.element),l||(l=a?Lg:zg),h.set({position:l,_isVisible:!0,className:r,isModal:a}),h.setupParts({icon:t,title:i,hasCloseButton:n,content:s,actionButtons:o}),this.id=e,c&&(this._onHide=c),this.isOpen=!0,Zg._visibleDialogPlugin=this}hide(){Zg._visibleDialogPlugin&&Zg._visibleDialogPlugin.fire(`hide:${Zg._visibleDialogPlugin.id}`)}_hide(){if(!this.view)return;const e=this.editor,t=this.view;t.contentView&&t.contentView.reset(),e.ui.view.body.remove(t),e.ui.focusTracker.remove(t.element),e.keystrokes.stopListening(t.element),t.destroy(),e.editing.view.focus(),this.id=null,this.isOpen=!1,Zg._visibleDialogPlugin=null}}const Jg=Zn("px"),Qg=Mn.document.body,Yg={top:-99999,left:-99999,name:"arrowless",config:{withArrow:!1}};class Xg extends Du{constructor(e){super(e);const t=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class",void 0),this._pinWhenIsVisibleCallback=null,this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",t.to("position",(e=>`ck-balloon-panel_${e}`)),t.if("isVisible","ck-balloon-panel_visible"),t.if("withArrow","ck-balloon-panel_with-arrow"),t.to("class")],style:{top:t.to("top",Jg),left:t.to("left",Jg)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(e){this.show();const t=Xg.defaultPositions,i=Object.assign({},{element:this.element,positions:[t.southArrowNorth,t.southArrowNorthMiddleWest,t.southArrowNorthMiddleEast,t.southArrowNorthWest,t.southArrowNorthEast,t.northArrowSouth,t.northArrowSouthMiddleWest,t.northArrowSouthMiddleEast,t.northArrowSouthWest,t.northArrowSouthEast,t.viewportStickyNorth],limiter:Qg,fitInViewport:!0},e),n=Xg._getOptimalPosition(i)||Yg,s=parseInt(n.left),o=parseInt(n.top),r=n.name,a=n.config||{},{withArrow:l=!0}=a;this.top=o,this.left=s,this.position=r,this.withArrow=l}pin(e){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(e):this._stopPinning()},this._startPinning(e),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(e){this.attachTo(e);const t=tf(e.target),i=e.limiter?tf(e.limiter):Qg;this.listenTo(Mn.document,"scroll",((n,s)=>{const o=s.target,r=t&&o.contains(t),a=i&&o.contains(i);!r&&!a&&t&&i||this.attachTo(e)}),{useCapture:!0}),this.listenTo(Mn.window,"resize",(()=>{this.attachTo(e)}))}_stopPinning(){this.stopListening(Mn.document,"scroll"),this.stopListening(Mn.window,"resize")}}Xg.arrowSideOffset=25,Xg.arrowHeightOffset=10,Xg.stickyVerticalOffset=20,Xg._getOptimalPosition=ts,Xg.defaultPositions=nf();const ef=Xg;function tf(e){return An(e)?e:Dn(e)?e.commonAncestorContainer:"function"==typeof e?tf(e()):null}function nf(e={}){const{sideOffset:t=Xg.arrowSideOffset,heightOffset:i=Xg.arrowHeightOffset,stickyVerticalOffset:n=Xg.stickyVerticalOffset,config:s}=e;return{northWestArrowSouthWest:(e,i)=>({top:o(e,i),left:e.left-t,name:"arrow_sw",...s&&{config:s}}),northWestArrowSouthMiddleWest:(e,i)=>({top:o(e,i),left:e.left-.25*i.width-t,name:"arrow_smw",...s&&{config:s}}),northWestArrowSouth:(e,t)=>({top:o(e,t),left:e.left-t.width/2,name:"arrow_s",...s&&{config:s}}),northWestArrowSouthMiddleEast:(e,i)=>({top:o(e,i),left:e.left-.75*i.width+t,name:"arrow_sme",...s&&{config:s}}),northWestArrowSouthEast:(e,i)=>({top:o(e,i),left:e.left-i.width+t,name:"arrow_se",...s&&{config:s}}),northArrowSouthWest:(e,i)=>({top:o(e,i),left:e.left+e.width/2-t,name:"arrow_sw",...s&&{config:s}}),northArrowSouthMiddleWest:(e,i)=>({top:o(e,i),left:e.left+e.width/2-.25*i.width-t,name:"arrow_smw",...s&&{config:s}}),northArrowSouth:(e,t)=>({top:o(e,t),left:e.left+e.width/2-t.width/2,name:"arrow_s",...s&&{config:s}}),northArrowSouthMiddleEast:(e,i)=>({top:o(e,i),left:e.left+e.width/2-.75*i.width+t,name:"arrow_sme",...s&&{config:s}}),northArrowSouthEast:(e,i)=>({top:o(e,i),left:e.left+e.width/2-i.width+t,name:"arrow_se",...s&&{config:s}}),northEastArrowSouthWest:(e,i)=>({top:o(e,i),left:e.right-t,name:"arrow_sw",...s&&{config:s}}),northEastArrowSouthMiddleWest:(e,i)=>({top:o(e,i),left:e.right-.25*i.width-t,name:"arrow_smw",...s&&{config:s}}),northEastArrowSouth:(e,t)=>({top:o(e,t),left:e.right-t.width/2,name:"arrow_s",...s&&{config:s}}),northEastArrowSouthMiddleEast:(e,i)=>({top:o(e,i),left:e.right-.75*i.width+t,name:"arrow_sme",...s&&{config:s}}),northEastArrowSouthEast:(e,i)=>({top:o(e,i),left:e.right-i.width+t,name:"arrow_se",...s&&{config:s}}),southWestArrowNorthWest:e=>({top:r(e),left:e.left-t,name:"arrow_nw",...s&&{config:s}}),southWestArrowNorthMiddleWest:(e,i)=>({top:r(e),left:e.left-.25*i.width-t,name:"arrow_nmw",...s&&{config:s}}),southWestArrowNorth:(e,t)=>({top:r(e),left:e.left-t.width/2,name:"arrow_n",...s&&{config:s}}),southWestArrowNorthMiddleEast:(e,i)=>({top:r(e),left:e.left-.75*i.width+t,name:"arrow_nme",...s&&{config:s}}),southWestArrowNorthEast:(e,i)=>({top:r(e),left:e.left-i.width+t,name:"arrow_ne",...s&&{config:s}}),southArrowNorthWest:e=>({top:r(e),left:e.left+e.width/2-t,name:"arrow_nw",...s&&{config:s}}),southArrowNorthMiddleWest:(e,i)=>({top:r(e),left:e.left+e.width/2-.25*i.width-t,name:"arrow_nmw",...s&&{config:s}}),southArrowNorth:(e,t)=>({top:r(e),left:e.left+e.width/2-t.width/2,name:"arrow_n",...s&&{config:s}}),southArrowNorthMiddleEast:(e,i)=>({top:r(e),left:e.left+e.width/2-.75*i.width+t,name:"arrow_nme",...s&&{config:s}}),southArrowNorthEast:(e,i)=>({top:r(e),left:e.left+e.width/2-i.width+t,name:"arrow_ne",...s&&{config:s}}),southEastArrowNorthWest:e=>({top:r(e),left:e.right-t,name:"arrow_nw",...s&&{config:s}}),southEastArrowNorthMiddleWest:(e,i)=>({top:r(e),left:e.right-.25*i.width-t,name:"arrow_nmw",...s&&{config:s}}),southEastArrowNorth:(e,t)=>({top:r(e),left:e.right-t.width/2,name:"arrow_n",...s&&{config:s}}),southEastArrowNorthMiddleEast:(e,i)=>({top:r(e),left:e.right-.75*i.width+t,name:"arrow_nme",...s&&{config:s}}),southEastArrowNorthEast:(e,i)=>({top:r(e),left:e.right-i.width+t,name:"arrow_ne",...s&&{config:s}}),westArrowEast:(e,t)=>({top:e.top+e.height/2-t.height/2,left:e.left-t.width-i,name:"arrow_e",...s&&{config:s}}),eastArrowWest:(e,t)=>({top:e.top+e.height/2-t.height/2,left:e.right+i,name:"arrow_w",...s&&{config:s}}),viewportStickyNorth:(e,t,i,o)=>{const r=o||i;return e.getIntersection(r)?r.height-e.height>n?null:{top:r.top+n,left:e.left+e.width/2-t.width/2,name:"arrowless",config:{withArrow:!1,...s}}:null}};function o(e,t){return e.top-t.height-i}function r(e){return e.bottom+i}}const sf="ck-tooltip";class of extends(Vn()){constructor(e){if(super(),this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._resizeObserver=null,this._mutationObserver=null,of._editors.add(e),of._instance)return of._instance;of._instance=this,this.tooltipTextView=new Du(e.locale),this.tooltipTextView.set("text",""),this.tooltipTextView.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:this.tooltipTextView.bindTemplate.to("text")}]}),this.balloonPanelView=new ef(e.locale),this.balloonPanelView.class=sf,this.balloonPanelView.content.add(this.tooltipTextView),this._mutationObserver=function(e){const t=new MutationObserver((()=>{e()}));return{attach(e){t.observe(e,{attributes:!0,attributeFilter:["data-cke-tooltip-text","data-cke-tooltip-position"]})},detach(){t.disconnect()}}}((()=>{this._updateTooltipPosition()})),this._pinTooltipDebounced=La(this._pinTooltip,600),this._unpinTooltipDebounced=La(this._unpinTooltip,400),this.listenTo(Mn.document,"keydown",this._onKeyDown.bind(this),{useCapture:!0}),this.listenTo(Mn.document,"mouseenter",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(Mn.document,"mouseleave",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(Mn.document,"focus",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(Mn.document,"blur",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(Mn.document,"scroll",this._onScroll.bind(this),{useCapture:!0}),this._watchdogExcluded=!0}destroy(e){const t=e.ui.view&&e.ui.view.body;of._editors.delete(e),this.stopListening(e.ui),t&&t.has(this.balloonPanelView)&&t.remove(this.balloonPanelView),of._editors.size||(this._unpinTooltip(),this.balloonPanelView.destroy(),this.stopListening(),of._instance=null)}static getPositioningFunctions(e){const t=of.defaultBalloonPositions;return{s:[t.southArrowNorth,t.southArrowNorthEast,t.southArrowNorthWest],n:[t.northArrowSouth],e:[t.eastArrowWest],w:[t.westArrowEast],sw:[t.southArrowNorthEast],se:[t.southArrowNorthWest]}[e]}_onKeyDown(e,t){"Escape"===t.key&&this._currentElementWithTooltip&&(this._unpinTooltip(),t.stopPropagation())}_onEnterOrFocus(e,{target:t}){const i=af(t);i?i!==this._currentElementWithTooltip&&(this._unpinTooltip(),this._pinTooltipDebounced(i,lf(i))):"focus"===e.name&&this._unpinTooltip()}_onLeaveOrBlur(e,{target:t,relatedTarget:i}){if("mouseleave"===e.name){if(!An(t))return;const e=this.balloonPanelView.element,n=e&&(e===i||e.contains(i)),s=!n&&t===e;if(n)return void this._unpinTooltipDebounced.cancel();if(!s&&this._currentElementWithTooltip&&t!==this._currentElementWithTooltip)return;const o=af(t),r=af(i);(s||o&&o!==r)&&this._unpinTooltipDebounced()}else{if(this._currentElementWithTooltip&&t!==this._currentElementWithTooltip)return;this._unpinTooltipDebounced()}}_onScroll(e,{target:t}){this._currentElementWithTooltip&&(t.contains(this.balloonPanelView.element)&&t.contains(this._currentElementWithTooltip)||this._unpinTooltip())}_pinTooltip(e,{text:t,position:i,cssClass:n}){this._unpinTooltip();const s=Zs(of._editors.values()).ui.view.body;s.has(this.balloonPanelView)||s.add(this.balloonPanelView),this.tooltipTextView.text=t,this.balloonPanelView.pin({target:e,positions:of.getPositioningFunctions(i)}),this._resizeObserver=new Gn(e,(()=>{es(e)||this._unpinTooltip()})),this._mutationObserver.attach(e),this.balloonPanelView.class=[sf,n].filter((e=>e)).join(" ");for(const e of of._editors)this.listenTo(e.ui,"update",this._updateTooltipPosition.bind(this),{priority:"low"});this._currentElementWithTooltip=e,this._currentTooltipPosition=i}_unpinTooltip(){this._unpinTooltipDebounced.cancel(),this._pinTooltipDebounced.cancel(),this.balloonPanelView.unpin();for(const e of of._editors)this.stopListening(e.ui,"update");this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this.tooltipTextView.text="",this._resizeObserver&&this._resizeObserver.destroy(),this._mutationObserver.detach()}_updateTooltipPosition(){const e=lf(this._currentElementWithTooltip);es(this._currentElementWithTooltip)&&e.text?this.balloonPanelView.pin({target:this._currentElementWithTooltip,positions:of.getPositioningFunctions(e.position)}):this._unpinTooltip()}}of.defaultBalloonPositions=nf({heightOffset:5,sideOffset:13}),of._editors=new Set,of._instance=null;const rf=of;function af(e){return An(e)?e.closest("[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])"):null}function lf(e){return{text:e.dataset.ckeTooltipText,position:e.dataset.ckeTooltipPosition||"s",cssClass:e.dataset.ckeTooltipClass||""}}const cf=function(e,t,i){var n=!0,s=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return L(i)&&(n="leading"in i?!!i.leading:n,s="trailing"in i?!!i.trailing:s),La(e,t,{leading:n,maxWait:t,trailing:s})},df=50,hf=350,uf="Powered by";class mf extends(Vn()){constructor(e){super(),this.editor=e,this._balloonView=null,this._lastFocusedEditableElement=null,this._showBalloonThrottled=cf(this._showBalloon.bind(this),50,{leading:!0}),e.on("ready",this._handleEditorReady.bind(this))}destroy(){const e=this._balloonView;e&&(e.unpin(),this._balloonView=null),this._showBalloonThrottled.cancel(),this.stopListening()}_handleEditorReady(){const e=this.editor;(!!e.config.get("ui.poweredBy.forceVisible")||"VALID"!==function(e){function t(e){return e.length>=40&&e.length<=255?"VALID":"INVALID"}if(!e)return"INVALID";let i="";try{i=atob(e)}catch(e){return"INVALID"}const n=i.split("-"),s=n[0],o=n[1];if(!o)return t(e);try{atob(o)}catch(i){try{if(atob(s),!atob(s).length)return t(e)}catch(i){return t(e)}}if(s.length<40||s.length>255)return"INVALID";let r="";try{atob(s),r=atob(o)}catch(e){return"INVALID"}if(8!==r.length)return"INVALID";const a=Number(r.substring(0,4)),l=Number(r.substring(4,6))-1,c=Number(r.substring(6,8)),d=new Date(a,l,c);return d{this._updateLastFocusedEditableElement(),i?this._showBalloon():this._hideBalloon()})),e.ui.focusTracker.on("change:focusedElement",((e,t,i)=>{this._updateLastFocusedEditableElement(),i&&this._showBalloon()})),e.ui.on("update",(()=>{this._showBalloonThrottled()})))}_createBalloonView(){const e=this.editor,t=this._balloonView=new ef,i=pf(e),n=new gf(e.locale,i.label);t.content.add(n),t.set({class:"ck-powered-by-balloon"}),e.ui.view.body.add(t),e.ui.focusTracker.add(t.element),this._balloonView=t}_showBalloon(){if(!this._lastFocusedEditableElement)return;const e=function(e,t){const i=pf(e),n="right"===i.side?function(e,t){return ff(e,t,((e,i)=>e.left+e.width-i.width-t.horizontalOffset))}(t,i):function(e,t){return ff(e,t,(e=>e.left+t.horizontalOffset))}(t,i);return{target:t,positions:[n]}}(this.editor,this._lastFocusedEditableElement);e&&(this._balloonView||this._createBalloonView(),this._balloonView.pin(e))}_hideBalloon(){this._balloonView&&this._balloonView.unpin()}_updateLastFocusedEditableElement(){const e=this.editor,t=e.ui.focusTracker.isFocused,i=e.ui.focusTracker.focusedElement;if(!t||!i)return void(this._lastFocusedEditableElement=null);const n=Array.from(e.ui.getEditableElementsNames()).map((t=>e.ui.getEditableElement(t)));n.includes(i)?this._lastFocusedEditableElement=i:this._lastFocusedEditableElement=n[0]}}class gf extends Du{constructor(e,t){super(e);const i=new qu,n=this.bindTemplate;i.set({content:'\n',isColorInherited:!1}),i.extendTemplate({attributes:{style:{width:"53px",height:"10px"}}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-powered-by"],"aria-hidden":!0},children:[{tag:"a",attributes:{href:"https://ckeditor.com/?utm_source=ckeditor&utm_medium=referral&utm_campaign=701Dn000000hVgmIAE_powered_by_ckeditor_logo",target:"_blank",tabindex:"-1"},children:[...t?[{tag:"span",attributes:{class:["ck","ck-powered-by__label"]},children:[t]}]:[],i],on:{dragstart:n.to((e=>e.preventDefault()))}}]})}}function ff(e,t,i){return(n,s)=>{const o=new Hn(e);if(o.widtht.regionName===e));s||(s=new _f(this.view.locale),this.view.regionViews.add(s)),s.set({regionName:e,text:t,politeness:i})}}class vf extends Du{constructor(e){super(e),this.regionViews=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-aria-live-announcer"]},children:this.regionViews})}}class _f extends Du{constructor(e){super(e);const t=this.bindTemplate;this.set("regionName",""),this.set("text",""),this.set("politeness",bf),this.setTemplate({tag:"div",attributes:{role:"region","data-region":t.to("regionName"),"aria-live":t.to("politeness")},children:[{text:t.to("text")}]})}}class yf extends(G()){constructor(e){super(),this.isReady=!1,this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[];const t=e.editing.view;this.editor=e,this.componentFactory=new Bg(e),this.focusTracker=new Js,this.tooltipManager=new rf(e),this.poweredBy=new mf(e),this.ariaLiveAnnouncer=new wf(e),this.set("viewportOffset",this._readViewportOffsetFromConfig()),this.once("ready",(()=>{this.isReady=!0})),this.listenTo(t.document,"layoutChanged",this.update.bind(this)),this.listenTo(t,"scrollToTheSelection",this._handleScrollToTheSelection.bind(this)),this._initFocusTracking()}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy(),this.tooltipManager.destroy(this.editor),this.poweredBy.destroy();for(const e of this._editableElementsMap.values())e.ckeditorInstance=null,this.editor.keystrokes.stopListening(e);this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[]}setEditableElement(e,t){this._editableElementsMap.set(e,t),t.ckeditorInstance||(t.ckeditorInstance=this.editor),this.focusTracker.add(t);const i=()=>{this.editor.editing.view.getDomRoot(e)||this.editor.keystrokes.listenTo(t)};this.isReady?i():this.once("ready",i)}removeEditableElement(e){const t=this._editableElementsMap.get(e);t&&(this._editableElementsMap.delete(e),this.editor.keystrokes.stopListening(t),this.focusTracker.remove(t),t.ckeditorInstance=null)}getEditableElement(e="main"){return this._editableElementsMap.get(e)}getEditableElementsNames(){return this._editableElementsMap.keys()}addToolbar(e,t={}){e.isRendered?(this.focusTracker.add(e.element),this.editor.keystrokes.listenTo(e.element)):e.once("render",(()=>{this.focusTracker.add(e.element),this.editor.keystrokes.listenTo(e.element)})),this._focusableToolbarDefinitions.push({toolbarView:e,options:t})}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}_readViewportOffsetFromConfig(){const e=this.editor,t=e.config.get("ui.viewportOffset");if(t)return t;const i=e.config.get("toolbar.viewportTopOffset");return i?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:i}):{top:0}}_initFocusTracking(){const e=this.editor,t=e.editing.view;let i,n;e.keystrokes.set("Alt+F10",((e,s)=>{const o=this.focusTracker.focusedElement;Array.from(this._editableElementsMap.values()).includes(o)&&!Array.from(t.domRoots.values()).includes(o)&&(i=o);const r=this._getCurrentFocusedToolbarDefinition();r&&n||(n=this._getFocusableCandidateToolbarDefinitions());for(let e=0;e{const s=this._getCurrentFocusedToolbarDefinition();s&&(i?(i.focus(),i=null):e.editing.view.focus(),s.options.afterBlur&&s.options.afterBlur(),n())}))}_getFocusableCandidateToolbarDefinitions(){const e=[];for(const t of this._focusableToolbarDefinitions){const{toolbarView:i,options:n}=t;(es(i.element)||n.beforeFocus)&&e.push(t)}return e.sort(((e,t)=>kf(e)-kf(t))),e}_getCurrentFocusedToolbarDefinition(){for(const e of this._focusableToolbarDefinitions)if(e.toolbarView.element&&e.toolbarView.element.contains(this.focusTracker.focusedElement))return e;return null}_focusFocusableCandidateToolbar(e){const{toolbarView:t,options:{beforeFocus:i}}=e;return i&&i(),!!es(t.element)&&(t.focus(),!0)}_handleScrollToTheSelection(e,t){const i={top:0,bottom:0,left:0,right:0,...this.viewportOffset};t.viewportOffset.top+=i.top,t.viewportOffset.bottom+=i.bottom,t.viewportOffset.left+=i.left,t.viewportOffset.right+=i.right}}function kf(e){const{toolbarView:t,options:i}=e;let n=10;return es(t.element)&&n--,i.isContextual&&n--,n}class Cf extends Du{constructor(e){super(e),this.body=new ju(e)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}class Af extends Cf{constructor(e){super(e),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:e.uiLanguageDirection,lang:e.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const e=this.t,t=new Lu;return t.text=e("Rich Text Editor"),t.extendTemplate({attributes:{class:"ck-voice-label"}}),t}}class xf extends Du{constructor(e,t,i){super(e),this.name=null,this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:e.contentLanguage,dir:e.contentLanguageDirection}}),this.set("isFocused",!1),this._editableElement=i,this._hasExternalElement=!!this._editableElement,this._editingView=t}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",(()=>this._updateIsFocusedClasses())),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}get hasExternalElement(){return this._hasExternalElement}_updateIsFocusedClasses(){const e=this._editingView;function t(t){e.change((i=>{const n=e.document.getRoot(t.name);i.addClass(t.isFocused?"ck-focused":"ck-blurred",n),i.removeClass(t.isFocused?"ck-blurred":"ck-focused",n)}))}e.isRenderingInProgress?function i(n){e.once("change:isRenderingInProgress",((e,s,o)=>{o?i(n):t(n)}))}(this):t(this)}}class Ef extends xf{constructor(e,t,i,n={}){super(e,t,i);const s=e.t;this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}}),this._generateLabel=n.label||(()=>s("Editor editing area: %0",this.name))}render(){super.render();const e=this._editingView;e.change((t=>{const i=e.document.getRoot(this.name);t.setAttribute("aria-label",this._generateLabel(this),i)}))}}class Tf extends uo{static get pluginName(){return"Notification"}init(){this.on("show:warning",((e,t)=>{window.alert(t.message)}),{priority:"lowest"})}showSuccess(e,t={}){this._showNotification({message:e,type:"success",namespace:t.namespace,title:t.title})}showInfo(e,t={}){this._showNotification({message:e,type:"info",namespace:t.namespace,title:t.title})}showWarning(e,t={}){this._showNotification({message:e,type:"warning",namespace:t.namespace,title:t.title})}_showNotification(e){const t=e.namespace?`show:${e.type}:${e.namespace}`:`show:${e.type}`;this.fire(t,{message:e.message,type:e.type,title:e.title||""})}}class Sf extends(G()){constructor(e,t){super(),t&&Ca(this,t),e&&this.set(e)}}const Pf=Zn("px");class If extends so{static get pluginName(){return"ContextualBalloon"}constructor(e){super(e),this._viewToStack=new Map,this._idToStack=new Map,this._view=null,this._rotatorView=null,this._fakePanelsView=null,this.positionLimiter=()=>{const e=this.editor.editing.view,t=e.document.selection.editableElement;return t?e.domConverter.mapViewToDom(t.root):null},this.set("visibleView",null),this.set("_numberOfStacks",0),this.set("_singleViewMode",!1)}destroy(){super.destroy(),this._view&&this._view.destroy(),this._rotatorView&&this._rotatorView.destroy(),this._fakePanelsView&&this._fakePanelsView.destroy()}get view(){return this._view||this._createPanelView(),this._view}hasView(e){return Array.from(this._viewToStack.keys()).includes(e)}add(e){if(this._view||this._createPanelView(),this.hasView(e.view))throw new y("contextualballoon-add-view-exist",[this,e]);const t=e.stackId||"main";if(!this._idToStack.has(t))return this._idToStack.set(t,new Map([[e.view,e]])),this._viewToStack.set(e.view,this._idToStack.get(t)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!e.singleViewMode||this.showStack(t));const i=this._idToStack.get(t);e.singleViewMode&&this.showStack(t),i.set(e.view,e),this._viewToStack.set(e.view,i),i===this._visibleStack&&this._showView(e)}remove(e){if(!this.hasView(e))throw new y("contextualballoon-remove-view-not-exist",[this,e]);const t=this._viewToStack.get(e);this._singleViewMode&&this.visibleView===e&&(this._singleViewMode=!1),this.visibleView===e&&(1===t.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(t.values())[t.size-2])),1===t.size?(this._idToStack.delete(this._getStackId(t)),this._numberOfStacks=this._idToStack.size):t.delete(e),this._viewToStack.delete(e)}updatePosition(e){e&&(this._visibleStack.get(this.visibleView).position=e),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(e){this.visibleStack=e;const t=this._idToStack.get(e);if(!t)throw new y("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==t&&this._showView(Array.from(t.values()).pop())}_createPanelView(){this._view=new ef(this.editor.locale),this.editor.ui.view.body.add(this._view),this.editor.ui.focusTracker.add(this._view.element),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(e){return Array.from(this._idToStack.entries()).find((t=>t[1]===e))[0]}_showNextStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)+1;e[t]||(t=0),this.showStack(this._getStackId(e[t]))}_showPrevStack(){const e=Array.from(this._idToStack.values());let t=e.indexOf(this._visibleStack)-1;e[t]||(t=e.length-1),this.showStack(this._getStackId(e[t]))}_createRotatorView(){const e=new Vf(this.editor.locale),t=this.editor.locale.t;return this.view.content.add(e),e.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((e,t)=>!t&&e>1)),e.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"}),e.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((e,i)=>{if(i<2)return"";const n=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return t("%0 of %1",[n,i])})),e.buttonNextView.on("execute",(()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()})),e.buttonPrevView.on("execute",(()=>{e.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()})),e}_createFakePanelsView(){const e=new Rf(this.editor.locale,this.view);return e.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((e,t)=>!t&&e>=2?Math.min(e-1,2):0)),e.listenTo(this.view,"change:top",(()=>e.updatePosition())),e.listenTo(this.view,"change:left",(()=>e.updatePosition())),this.editor.ui.view.body.add(e),e}_showView({view:e,balloonClassName:t="",withArrow:i=!0,singleViewMode:n=!1}){this.view.class=t,this.view.withArrow=i,this._rotatorView.showView(e),this.visibleView=e,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),n&&(this._singleViewMode=!0)}_getBalloonPosition(){let e=Array.from(this._visibleStack.values()).pop().position;return e&&(e.limiter||(e=Object.assign({},e,{limiter:this.positionLimiter})),e=Object.assign({},e,{viewportOffsetConfig:this.editor.ui.viewportOffset})),e}}class Vf extends Du{constructor(e){super(e);const t=e.t,i=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new Js,this.buttonPrevView=this._createButtonView(t("Previous"),fu.previousArrow),this.buttonNextView=this._createButtonView(t("Next"),fu.nextArrow),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",i.to("isNavigationVisible",(e=>e?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:i.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}destroy(){super.destroy(),this.focusTracker.destroy()}showView(e){this.hideView(),this.content.add(e)}hideView(){this.content.clear()}_createButtonView(e,t){const i=new Ku(this.locale);return i.set({label:e,icon:t,tooltip:!0}),i}}class Rf extends Du{constructor(e,t){super(e);const i=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=t,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",i.to("numberOfPanels",(e=>e?"":"ck-hidden"))],style:{top:i.to("top",Pf),left:i.to("left",Pf),width:i.to("width",Pf),height:i.to("height",Pf)}},children:this.content}),this.on("change:numberOfPanels",((e,t,i,n)=>{i>n?this._addPanels(i-n):this._removePanels(n-i),this.updatePosition()}))}_addPanels(e){for(;e--;){const e=new Du;e.setTemplate({tag:"div"}),this.content.add(e),this.registerChild(e)}}_removePanels(e){for(;e--;){const e=this.content.last;this.content.remove(e),this.deregisterChild(e),e.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:e,left:t}=this._balloonPanelView,{width:i,height:n}=new Hn(this._balloonPanelView.element);Object.assign(this,{top:e,left:t,width:i,height:n})}}}const Of=Zn("px");class Bf extends Du{constructor(e){super(e);const t=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheBottomOfLimiter",!1),this.set("_stickyTopOffset",null),this.set("_stickyBottomOffset",null),this.content=this.createCollection(),this._contentPanelPlaceholder=new bu({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:t.to("isSticky",(e=>e?"block":"none")),height:t.to("isSticky",(e=>e?Of(this._contentPanelRect.height):null))}}}).render(),this.contentPanelElement=new bu({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",t.if("isSticky","ck-sticky-panel__content_sticky"),t.if("_isStickyToTheBottomOfLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:t.to("isSticky",(e=>e?Of(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:t.to("_stickyTopOffset",(e=>e?Of(e):e)),bottom:t.to("_stickyBottomOffset",(e=>e?Of(e):e)),marginLeft:t.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this.contentPanelElement]})}render(){super.render(),this.checkIfShouldBeSticky(),this.listenTo(Mn.document,"scroll",(()=>{this.checkIfShouldBeSticky()}),{useCapture:!0}),this.listenTo(this,"change:isActive",(()=>{this.checkIfShouldBeSticky()}))}checkIfShouldBeSticky(){if(!this.limiterElement||!this.isActive)return void this._unstick();const e=new Hn(this.limiterElement);let t=e.getVisible();if(t){const e=new Hn(Mn.window);e.top+=this.viewportTopOffset,e.height-=this.viewportTopOffset,t=t.getIntersection(e)}if(t&&e.topt.bottom){const i=Math.max(e.bottom-t.bottom,0)+this.limiterBottomOffset;e.bottom-i>e.top+this._contentPanelRect.height?this._stickToBottomOfLimiter(i):this._unstick()}else this._contentPanelRect.height+this.limiterBottomOffset{this.reset(),this.focus(),this.fire("reset")})),this.resetButtonView.bind("isVisible").to(this.fieldView,"isEmpty",(e=>!e)),this.fieldWrapperChildren.add(this.resetButtonView),this.extendTemplate({attributes:{class:"ck-search__query_with-reset"}}))}reset(){this.fieldView.reset(),this._viewConfig.showResetButton&&(this.resetButtonView.isVisible=!1)}}class Nf extends Du{constructor(){super();const e=this.bindTemplate;this.set({isVisible:!1,primaryText:"",secondaryText:""}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-search__info",e.if("isVisible","ck-hidden",(e=>!e))],tabindex:-1},children:[{tag:"span",children:[{text:[e.to("primaryText")]}]},{tag:"span",children:[{text:[e.to("secondaryText")]}]}]})}focus(){this.element.focus()}}class Ff extends Du{constructor(e){super(e),this.children=this.createCollection(),this.focusTracker=new Js,this.setTemplate({tag:"div",attributes:{class:["ck","ck-search__results"],tabindex:-1},children:this.children}),this._focusCycler=new ym({focusables:this.children,focusTracker:this.focusTracker})}render(){super.render();for(const e of this.children)this.focusTracker.add(e.element)}focus(){this._focusCycler.focusFirst()}focusFirst(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}var Df=/[\\^$.*+?()[\]{}|]/g,Lf=RegExp(Df.source);const zf=function(e){return(e=Uo(e))&&Lf.test(e)?e.replace(Df,"\\$&"):e};class Hf extends Du{constructor(e,t){super(e),this._config=t,this.filteredView=t.filteredView,this.queryView=this._createSearchTextQueryView(),this.focusTracker=new Js,this.keystrokes=new Qs,this.resultsView=new Ff(e),this.children=this.createCollection(),this.focusableChildren=this.createCollection([this.queryView,this.resultsView]),this.set("isEnabled",!0),this.set("resultsCount",0),this.set("totalItemsCount",0),t.infoView&&t.infoView.instance?this.infoView=t.infoView.instance:(this.infoView=new Nf,this._enableDefaultInfoViewBehavior(),this.on("render",(()=>{this.search("")}))),this.resultsView.children.addMany([this.infoView,this.filteredView]),this.focusCycler=new ym({focusables:this.focusableChildren,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.on("search",((e,{resultsCount:t,totalItemsCount:i})=>{this.resultsCount=t,this.totalItemsCount=i})),this.setTemplate({tag:"div",attributes:{class:["ck","ck-search",t.class||null],tabindex:"-1"},children:this.children})}render(){super.render(),this.children.addMany([this.queryView,this.resultsView]);const e=e=>e.stopPropagation();for(const e of this.focusableChildren)this.focusTracker.add(e.element);this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",e),this.keystrokes.set("arrowleft",e),this.keystrokes.set("arrowup",e),this.keystrokes.set("arrowdown",e)}focus(){this.queryView.focus()}reset(){this.queryView.reset(),this.search("")}search(e){const t=e?new RegExp(zf(e),"ig"):null,i=this.filteredView.filter(t);this.fire("search",{query:e,...i})}_createSearchTextQueryView(){const e=new Mf(this.locale,this._config.queryView);return this.listenTo(e.fieldView,"input",(()=>{this.search(e.fieldView.element.value)})),e.on("reset",(()=>this.reset())),e.bind("isEnabled").to(this),e}_enableDefaultInfoViewBehavior(){const e=this.locale.t,t=this.infoView;function i(e,{query:t,resultsCount:i,totalItemsCount:n}){return"function"==typeof e?e(t,i,n):e}this.on("search",((n,s)=>{if(s.resultsCount)t.set({isVisible:!1});else{const n=this._config.infoView&&this._config.infoView.text;let o,r;s.totalItemsCount?n&&n.notFound?(o=n.notFound.primary,r=n.notFound.secondary):(o=e("No results found"),r=""):n&&n.noSearchableItems?(o=n.noSearchableItems.primary,r=n.noSearchableItems.secondary):(o=e("No searchable items"),r=""),t.set({primaryText:i(o,s),secondaryText:i(r,s),isVisible:!0})}}))}}class $f extends Hf{constructor(e,t){super(e,t),this._config=t;const i=Zn("px");this.extendTemplate({attributes:{class:["ck-autocomplete"]}});const n=this.resultsView.bindTemplate;this.resultsView.set("isVisible",!1),this.resultsView.set("_position","s"),this.resultsView.set("_width",0),this.resultsView.extendTemplate({attributes:{class:[n.if("isVisible","ck-hidden",(e=>!e)),n.to("_position",(e=>`ck-search__results_${e}`))],style:{width:n.to("_width",i)}}}),this.focusTracker.on("change:isFocused",((e,i,n)=>{this._updateResultsVisibility(),n?this.resultsView.element.scrollTop=0:t.resetOnBlur&&this.queryView.reset()})),this.on("search",(()=>{this._updateResultsVisibility(),this._updateResultsViewWidthAndPosition()})),this.keystrokes.set("esc",((e,t)=>{this.resultsView.isVisible&&(this.queryView.focus(),this.resultsView.isVisible=!1,t())})),this.listenTo(Mn.document,"scroll",(()=>{this._updateResultsViewWidthAndPosition()})),this.on("change:isEnabled",(()=>{this._updateResultsVisibility()})),this.filteredView.on("execute",((e,{value:t})=>{this.focus(),this.reset(),this.queryView.fieldView.value=this.queryView.fieldView.element.value=t,this.resultsView.isVisible=!1})),this.resultsView.on("change:isVisible",(()=>{this._updateResultsViewWidthAndPosition()}))}_updateResultsViewWidthAndPosition(){if(!this.resultsView.isVisible)return;this.resultsView._width=new Hn(this.queryView.fieldView.element).width;const e=$f._getOptimalPosition({element:this.resultsView.element,target:this.queryView.element,fitInViewport:!0,positions:$f.defaultResultsPositions});this.resultsView._position=e?e.name:"s"}_updateResultsVisibility(){const e=void 0===this._config.queryMinChars?0:this._config.queryMinChars,t=this.queryView.fieldView.element.value.length;this.resultsView.isVisible=this.focusTracker.isFocused&&this.isEnabled&&t>=e}}$f.defaultResultsPositions=[e=>({top:e.bottom,left:e.left,name:"s"}),(e,t)=>({top:e.top-t.height,left:e.left,name:"n"})],$f._getOptimalPosition=ts;const Wf=function(e){return function(t){return null==e?void 0:e[t]}};Wf({"&":"&","<":"<",">":">",'"':""","'":"'"});var jf=/[&<>"']/g;RegExp(jf.source);Zn("px");Zn("px");Zn("px");class Uf extends Ku{constructor(e){super(e);const t=this.bindTemplate;this.set({withText:!0,role:"menuitem"}),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__button"],"aria-haspopup":!0,"aria-expanded":this.bindTemplate.to("isOn",(e=>String(e))),"data-cke-tooltip-disabled":t.to("isOn")},on:{mouseenter:t.to("mouseenter")}})}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const e=new qu;return e.content=Yu,e.extendTemplate({attributes:{class:"ck-menu-bar__menu__button__arrow"}}),e}}class qf extends Om{constructor(e,t){super(e);const i=this.bindTemplate;this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item"]},on:{mouseenter:i.to("mouseenter")}}),this.delegate("mouseenter").to(t)}}const Gf={toggleMenusAndFocusItemsOnHover(e){e.on("menu:mouseenter",(t=>{if(e.isOpen){for(const i of e.menus){const e=t.path[0],n=e instanceof qf&&e.children.first===i;i.isOpen=(t.path.includes(i)||n)&&i.isEnabled}t.source.focus()}}))},focusCycleMenusOnArrows(e){const t="rtl"===e.locale.uiLanguageDirection;function i(t,i){const n=e.children.getIndex(t),s=t.isOpen,o=e.children.length,r=e.children.get((n+o+i)%o);t.isOpen=!1,s&&(r.isOpen=!0),r.buttonView.focus()}e.on("menu:arrowright",(e=>{i(e.source,t?-1:1)})),e.on("menu:arrowleft",(e=>{i(e.source,t?1:-1)}))},closeMenusWhenTheBarCloses(e){e.on("change:isOpen",(()=>{e.isOpen||e.menus.forEach((e=>{e.isOpen=!1}))}))},closeMenuWhenAnotherOnTheSameLevelOpens(e){e.on("menu:change:isOpen",((t,i,n)=>{n&&e.menus.filter((e=>t.source.parentMenuView===e.parentMenuView&&t.source!==e&&e.isOpen)).forEach((e=>{e.isOpen=!1}))}))},closeOnClickOutside(t){e({emitter:t,activator:()=>t.isOpen,callback:()=>t.close(),contextElements:()=>t.children.map((e=>e.element))})}},Kf={openAndFocusPanelOnArrowDownKey(e){e.keystrokes.set("arrowdown",((t,i)=>{e.focusTracker.focusedElement===e.buttonView.element&&(e.isOpen||(e.isOpen=!0),e.panelView.focus(),i())}))},openOnArrowRightKey(e){const t="rtl"===e.locale.uiLanguageDirection?"arrowleft":"arrowright";e.keystrokes.set(t,((t,i)=>{e.focusTracker.focusedElement===e.buttonView.element&&e.isEnabled&&(e.isOpen||(e.isOpen=!0),e.panelView.focus(),i())}))},openOnButtonClick(e){e.buttonView.on("execute",(()=>{e.isOpen=!0,e.panelView.focus()}))},toggleOnButtonClick(e){e.buttonView.on("execute",(()=>{e.isOpen=!e.isOpen,e.isOpen&&e.panelView.focus()}))},closeOnArrowLeftKey(e){const t="rtl"===e.locale.uiLanguageDirection?"arrowright":"arrowleft";e.keystrokes.set(t,((t,i)=>{e.isOpen&&(e.isOpen=!1,e.focus(),i())}))},closeOnEscKey(e){e.keystrokes.set("esc",((t,i)=>{e.isOpen&&(e.isOpen=!1,e.focus(),i())}))},closeOnParentClose(e){e.parentMenuView.on("change:isOpen",((t,i,n)=>{n||t.source!==e.parentMenuView||(e.isOpen=!1)}))}},Zf={southEast:e=>({top:e.bottom,left:e.left,name:"se"}),southWest:(e,t)=>({top:e.bottom,left:e.left-t.width+e.width,name:"sw"}),northEast:(e,t)=>({top:e.top-t.height,left:e.left,name:"ne"}),northWest:(e,t)=>({top:e.top-t.height,left:e.left-t.width+e.width,name:"nw"}),eastSouth:e=>({top:e.top,left:e.right-5,name:"es"}),eastNorth:(e,t)=>({top:e.top-t.height,left:e.right-5,name:"en"}),westSouth:(e,t)=>({top:e.top,left:e.left-t.width+5,name:"ws"}),westNorth:(e,t)=>({top:e.top-t.height,left:e.left-t.width+5,name:"wn"})},Jf=[{menuId:"file",label:"File",groups:[{groupId:"export",items:["menuBar:exportPdf","menuBar:exportWord"]},{groupId:"import",items:["menuBar:importWord"]},{groupId:"revisionHistory",items:["menuBar:revisionHistory"]}]},{menuId:"edit",label:"Edit",groups:[{groupId:"undo",items:["menuBar:undo","menuBar:redo"]},{groupId:"selectAll",items:["menuBar:selectAll"]},{groupId:"findAndReplace",items:["menuBar:findAndReplace"]}]},{menuId:"view",label:"View",groups:[{groupId:"sourceEditing",items:["menuBar:sourceEditing"]},{groupId:"showBlocks",items:["menuBar:showBlocks"]},{groupId:"restrictedEditingException",items:["menuBar:restrictedEditingException"]}]},{menuId:"insert",label:"Insert",groups:[{groupId:"insertMainWidgets",items:["menuBar:uploadImage","menuBar:ckbox","menuBar:ckfinder","menuBar:insertTable"]},{groupId:"insertInline",items:["menuBar:link","menuBar:comment"]},{groupId:"insertMinorWidgets",items:["menuBar:insertTemplate","menuBar:blockQuote","menuBar:codeBlock","menuBar:htmlEmbed"]},{groupId:"insertStructureWidgets",items:["menuBar:horizontalLine","menuBar:pageBreak","menuBar:tableOfContents"]},{groupId:"restrictedEditing",items:["menuBar:restrictedEditing"]}]},{menuId:"format",label:"Format",groups:[{groupId:"textAndFont",items:[{menuId:"text",label:"Text",groups:[{groupId:"basicStyles",items:["menuBar:bold","menuBar:italic","menuBar:underline","menuBar:strikethrough","menuBar:superscript","menuBar:subscript","menuBar:code"]},{groupId:"textPartLanguage",items:["menuBar:textPartLanguage"]}]},{menuId:"font",label:"Font",groups:[{groupId:"fontProperties",items:["menuBar:fontSize","menuBar:fontFamily"]},{groupId:"fontColors",items:["menuBar:fontColor","menuBar:fontBackgroundColor"]},{groupId:"highlight",items:["menuBar:highlight"]}]},"menuBar:heading"]},{groupId:"list",items:["menuBar:bulletedList","menuBar:numberedList","menuBar:todoList"]},{groupId:"indent",items:["menuBar:alignment","menuBar:indent","menuBar:outdent"]},{groupId:"caseChange",items:["menuBar:caseChange"]},{groupId:"removeFormat",items:["menuBar:removeFormat"]}]},{menuId:"tools",label:"Tools",groups:[{groupId:"aiTools",items:["menuBar:aiAssistant","menuBar:aiCommands"]},{groupId:"tools",items:["menuBar:trackChanges","menuBar:commentsArchive"]}]},{menuId:"help",label:"Help",groups:[{groupId:"help",items:["menuBar:accessibilityHelp"]}]}];function Qf({normalizedConfig:e,locale:t,componentFactory:i}){const n=wl(e);return function(e,t){const i=t.removeItems,n=[];t.items=t.items.filter((({menuId:e})=>!i.includes(e)||(n.push(e),!1))),tp(t.items,(e=>{e.groups=e.groups.filter((({groupId:e})=>!i.includes(e)||(n.push(e),!1)));for(const t of e.groups)t.items=t.items.filter((e=>{const t=rp(e);return!i.includes(t)||(n.push(t),!1)}))}));for(const t of i)n.includes(t)||k("menu-bar-item-could-not-be-removed",{menuBarConfig:e,itemName:t})}(e,n),function(e,t){const i=t.addItems,n=[];for(const e of i){const i=sp(e.position),s=op(e.position);if(ip(e))if(s){const o=t.items.findIndex((e=>e.menuId===s));if(-1!=o)"before"===i?(t.items.splice(o,0,e.menu),n.push(e)):"after"===i&&(t.items.splice(o+1,0,e.menu),n.push(e));else{Yf(t,e.menu,s,i)&&n.push(e)}}else"start"===i?(t.items.unshift(e.menu),n.push(e)):"end"===i&&(t.items.push(e.menu),n.push(e));else if(np(e))tp(t.items,(t=>{if(t.menuId===s)"start"===i?(t.groups.unshift(e.group),n.push(e)):"end"===i&&(t.groups.push(e.group),n.push(e));else{const o=t.groups.findIndex((e=>e.groupId===s));-1!==o&&("before"===i?(t.groups.splice(o,0,e.group),n.push(e)):"after"===i&&(t.groups.splice(o+1,0,e.group),n.push(e)))}}));else{Yf(t,e.item,s,i)&&n.push(e)}}for(const t of i)n.includes(t)||k("menu-bar-item-could-not-be-added",{menuBarConfig:e,addedItemConfig:t})}(e,n),function(e,t,i){tp(t.items,(n=>{for(const s of n.groups)s.items=s.items.filter((s=>{const o="string"==typeof s&&!i.has(s);return o&&!t.isUsingDefaultConfig&&k("menu-bar-item-unavailable",{menuBarConfig:e,parentMenuConfig:wl(n),componentName:s}),!o}))}))}(e,n,i),Xf(e,n),function(e,t){const i=t.t,n={File:i({string:"File",id:"MENU_BAR_MENU_FILE"}),Edit:i({string:"Edit",id:"MENU_BAR_MENU_EDIT"}),View:i({string:"View",id:"MENU_BAR_MENU_VIEW"}),Insert:i({string:"Insert",id:"MENU_BAR_MENU_INSERT"}),Format:i({string:"Format",id:"MENU_BAR_MENU_FORMAT"}),Tools:i({string:"Tools",id:"MENU_BAR_MENU_TOOLS"}),Help:i({string:"Help",id:"MENU_BAR_MENU_HELP"}),Text:i({string:"Text",id:"MENU_BAR_MENU_TEXT"}),Font:i({string:"Font",id:"MENU_BAR_MENU_FONT"})};tp(e.items,(e=>{e.label in n&&(e.label=n[e.label])}))}(n,t),n}function Yf(e,t,i,n){let s=!1;return tp(e.items,(e=>{for(const{groupId:o,items:r}of e.groups){if(s)return;if(o===i)"start"===n?(r.unshift(t),s=!0):"end"===n&&(r.push(t),s=!0);else{const e=r.findIndex((e=>rp(e)===i));-1!==e&&("before"===n?(r.splice(e,0,t),s=!0):"after"===n&&(r.splice(e+1,0,t),s=!0))}}})),s}function Xf(e,t){const i=t.isUsingDefaultConfig;let n=!1;t.items=t.items.filter((t=>!!t.groups.length||(ep(e,t,i),!1))),t.items.length?(tp(t.items,(t=>{t.groups=t.groups.filter((e=>!!e.items.length||(n=!0,!1)));for(const s of t.groups)s.items=s.items.filter((t=>!(ap(t)&&!t.groups.length)||(ep(e,t,i),n=!0,!1)))})),n&&Xf(e,t)):ep(e,e,i)}function ep(e,t,i){i||k("menu-bar-menu-empty",{menuBarConfig:e,emptyMenuConfig:t})}function tp(e,t){if(Array.isArray(e))for(const t of e)i(t);function i(e){t(e);for(const t of e.groups)for(const e of t.items)ap(e)&&i(e)}}function ip(e){return"object"==typeof e&&"menu"in e}function np(e){return"object"==typeof e&&"group"in e}function sp(e){return e.startsWith("start")?"start":e.startsWith("end")?"end":e.startsWith("after")?"after":"before"}function op(e){const t=e.match(/^[^:]+:(.+)/);return t?t[1]:null}function rp(e){return"string"==typeof e?e:e.menuId}function ap(e){return"object"==typeof e&&"menuId"in e}class lp extends Du{constructor(e){super(e);const t=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-menu-bar__menu__panel",t.to("position",(e=>`ck-menu-bar__menu__panel_position_${e}`)),t.if("isVisible","ck-hidden",(e=>!e))],tabindex:"-1"},children:this.children,on:{selectstart:t.to((e=>{"input"!==e.target.tagName.toLocaleLowerCase()&&e.preventDefault()}))}})}focus(e=1){this.children.length&&(1===e?this.children.first.focus():this.children.last.focus())}}class cp extends Du{constructor(e){super(e);const t=this.bindTemplate;this.buttonView=new Uf(e),this.buttonView.delegate("mouseenter").to(this),this.buttonView.bind("isOn","isEnabled").to(this,"isOpen","isEnabled"),this.panelView=new lp(e),this.panelView.bind("isVisible").to(this,"isOpen"),this.keystrokes=new Qs,this.focusTracker=new Js,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("panelPosition","w"),this.set("class",void 0),this.set("parentMenuView",null),this.setTemplate({tag:"div",attributes:{class:["ck","ck-menu-bar__menu",t.to("class"),t.if("isEnabled","ck-disabled",(e=>!e)),t.if("parentMenuView","ck-menu-bar__menu_top-level",(e=>!e))]},children:[this.buttonView,this.panelView]})}render(){super.render(),this.focusTracker.add(this.buttonView.element),this.focusTracker.add(this.panelView.element),this.keystrokes.listenTo(this.element),Kf.closeOnEscKey(this),this._repositionPanelOnOpen()}_attachBehaviors(){this.parentMenuView?(Kf.openOnButtonClick(this),Kf.openOnArrowRightKey(this),Kf.closeOnArrowLeftKey(this),Kf.closeOnParentClose(this)):(this._propagateArrowKeystrokeEvents(),Kf.openAndFocusPanelOnArrowDownKey(this),Kf.toggleOnButtonClick(this))}_propagateArrowKeystrokeEvents(){this.keystrokes.set("arrowright",((e,t)=>{this.fire("arrowright"),t()})),this.keystrokes.set("arrowleft",((e,t)=>{this.fire("arrowleft"),t()}))}_repositionPanelOnOpen(){this.on("change:isOpen",((e,t,i)=>{if(!i)return;const n=cp._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions});this.panelView.position=n?n.name:this._panelPositions[0].name}))}focus(){this.buttonView.focus()}get _panelPositions(){const{southEast:e,southWest:t,northEast:i,northWest:n,westSouth:s,eastSouth:o,westNorth:r,eastNorth:a}=Zf;return"ltr"===this.locale.uiLanguageDirection?this.parentMenuView?[o,a,s,r]:[e,t,i,n]:this.parentMenuView?[s,r,o,a]:[t,e,n,i]}}cp._getOptimalPosition=ts;const dp=cp;class hp extends Nm{constructor(e){super(e),this.role="menu"}}class up extends Ku{constructor(e){super(e),this.set({withText:!0,withKeystroke:!0,tooltip:!1,role:"menuitem"}),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item__button"]}})}}class mp extends Ju{constructor(e){super(e),this.set({withText:!0,withKeystroke:!0,tooltip:!1,role:"menuitem"}),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item__button"]}})}}const gp=["mouseenter","arrowleft","arrowright","change:isOpen"];class fp extends Du{constructor(e){super(e),this.menus=[];const t=e.t;this.set("isOpen",!1),this._setupIsOpenUpdater(),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-menu-bar"],"aria-label":t("Editor menu bar"),role:"menubar"},children:this.children})}fillFromConfig(e,t){const i=Qf({normalizedConfig:e,locale:this.locale,componentFactory:t}).items.map((e=>this._createMenu({componentFactory:t,menuDefinition:e})));this.children.addMany(i)}render(){super.render(),Gf.toggleMenusAndFocusItemsOnHover(this),Gf.closeMenusWhenTheBarCloses(this),Gf.closeMenuWhenAnotherOnTheSameLevelOpens(this),Gf.focusCycleMenusOnArrows(this),Gf.closeOnClickOutside(this)}focus(){this.children.first&&this.children.first.focus()}close(){for(const e of this.children)e.isOpen=!1}registerMenu(e,t=null){t?(e.delegate(...gp).to(t),e.parentMenuView=t):e.delegate(...gp).to(this,(e=>"menu:"+e)),e._attachBehaviors(),this.menus.push(e)}_createMenu({componentFactory:e,menuDefinition:t,parentMenuView:i}){const n=this.locale,s=new dp(n);return this.registerMenu(s,i),s.buttonView.set({label:t.label}),s.once("change:isOpen",(()=>{const i=new hp(n);i.ariaLabel=t.label,s.panelView.children.add(i),i.items.addMany(this._createMenuItems({menuDefinition:t,parentMenuView:s,componentFactory:e}))})),s}_createMenuItems({menuDefinition:e,parentMenuView:t,componentFactory:i}){const n=this.locale,s=[];for(const o of e.groups){for(const e of o.items){const o=new qf(n,t);if(L(e))o.children.add(this._createMenu({componentFactory:i,menuDefinition:e,parentMenuView:t}));else{const n=this._createMenuItemContentFromFactory({componentName:e,componentFactory:i,parentMenuView:t});if(!n)continue;o.children.add(n)}s.push(o)}o!==e.groups[e.groups.length-1]&&s.push(new Bm(n))}return s}_createMenuItemContentFromFactory({componentName:e,parentMenuView:t,componentFactory:i}){const n=i.create(e);return n instanceof dp||n instanceof up||n instanceof mp?(this._registerMenuTree(n,t),n.on("execute",(()=>{this.close()})),n):(k("menu-bar-component-unsupported",{componentName:e,componentView:n}),null)}_registerMenuTree(e,t){if(!(e instanceof dp))return void e.delegate("mouseenter").to(t);this.registerMenu(e,t);const i=e.panelView.children.filter((e=>e instanceof hp))[0];if(!i)return void e.delegate("mouseenter").to(t);const n=i.items.filter((e=>e instanceof Om));for(const t of n)this._registerMenuTree(t.children.get(0),e)}_setupIsOpenUpdater(){let e;this.on("menu:change:isOpen",((t,i,n)=>{clearTimeout(e),n?this.isOpen=!0:e=setTimeout((()=>{this.isOpen=Array.from(this.children).some((e=>e.isOpen))}),0)}))}}class pp extends yf{constructor(e,t){super(e),this.view=t,this._toolbarConfig=Em(e.config.get("toolbar")),this._menuBarConfig=function(e){let t;return t="items"in e&&e.items?{items:e.items,removeItems:[],addItems:[],isVisible:!0,isUsingDefaultConfig:!1,...e}:{items:wl(Jf),addItems:[],removeItems:[],isVisible:!0,isUsingDefaultConfig:!0,...e},t}(e.config.get("menuBar")||{}),this._elementReplacer=new X,this.listenTo(e.editing.view,"scrollToTheSelection",this._handleScrollToTheSelectionWithStickyPanel.bind(this))}get element(){return this.view.element}init(e){const t=this.editor,i=this.view,n=t.editing.view,s=i.editable,o=n.document.getRoot();s.name=o.rootName,i.render();const r=s.element;this.setEditableElement(s.name,r),i.editable.bind("isFocused").to(this.focusTracker),n.attachDomRoot(r),e&&this._elementReplacer.replace(e,this.element),this._initPlaceholder(),this._initToolbar(),this._initMenuBar(),this._initDialogPluginIntegration(),this.fire("ready")}destroy(){super.destroy();const e=this.view,t=this.editor.editing.view;this._elementReplacer.restore(),t.detachDomRoot(e.editable.name),e.destroy()}_initToolbar(){const e=this.view;e.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),e.stickyPanel.limiterElement=e.element,e.stickyPanel.bind("viewportTopOffset").to(this,"viewportOffset",(({top:e})=>e||0)),e.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),this.addToolbar(e.toolbar)}_initMenuBar(){const e=this.view;e.menuBarView&&(this._setupMenuBarBehaviors(e.menuBarView.element),e.menuBarView.fillFromConfig(this._menuBarConfig,this.componentFactory))}_initPlaceholder(){const e=this.editor,t=e.editing.view,i=t.document.getRoot(),n=e.sourceElement;let s;const o=e.config.get("placeholder");o&&(s="string"==typeof o?o:o[this.view.editable.name]),!s&&n&&"textarea"===n.tagName.toLowerCase()&&(s=n.getAttribute("placeholder")),s&&(i.placeholder=s),fo({view:t,element:i,isDirectHost:!1,keepOnFocus:!0})}_handleScrollToTheSelectionWithStickyPanel(e,t,i){const n=this.view.stickyPanel;if(n.isSticky){const e=new Hn(n.element).height;t.viewportOffset.top+=e}else{const e=()=>{this.editor.editing.view.scrollToTheSelection(i)};this.listenTo(n,"change:isSticky",e),setTimeout((()=>{this.stopListening(n,"change:isSticky",e)}),20)}}_initDialogPluginIntegration(){if(!this.editor.plugins.has("Dialog"))return;const e=this.view.stickyPanel,t=this.editor.plugins.get("Dialog");t.on("show",(()=>{const i=t.view;i.on("moveTo",((t,n)=>{if(!e.isSticky||i.wasMoved)return;const s=new Hn(e.contentPanelElement);n[1]{e.contains(this.focusTracker.focusedElement)&&(t.editing.view.focus(),n())})),t.keystrokes.set("Alt+F9",((t,i)=>{e.contains(this.focusTracker.focusedElement)||(this.view.menuBarView.focus(),i())}))}}class bp extends Af{constructor(e,t,i={}){super(e),this.stickyPanel=new Bf(e),this.toolbar=new Pm(e,{shouldGroupWhenFull:i.shouldToolbarGroupWhenFull}),i.useMenuBar&&(this.menuBarView=new fp(e)),this.editable=new Ef(e,t)}render(){super.render(),this.menuBarView?this.stickyPanel.content.addMany([this.menuBarView,this.toolbar]):this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class wp{constructor(e){if(this.crashes=[],this.state="initializing",this._now=Date.now,this.crashes=[],this._crashNumberLimit="number"==typeof e.crashNumberLimit?e.crashNumberLimit:3,this._minimumNonErrorTimePeriod="number"==typeof e.minimumNonErrorTimePeriod?e.minimumNonErrorTimePeriod:5e3,this._boundErrorHandler=e=>{const t="error"in e?e.error:e.reason;t instanceof Error&&this._handleError(t,e)},this._listeners={},!this._restart)throw new Error("The Watchdog class was split into the abstract `Watchdog` class and the `EditorWatchdog` class. Please, use `EditorWatchdog` if you have used the `Watchdog` class previously.")}destroy(){this._stopErrorHandling(),this._listeners={}}on(e,t){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t)}off(e,t){this._listeners[e]=this._listeners[e].filter((e=>e!==t))}_fire(e,...t){const i=this._listeners[e]||[];for(const e of i)e.apply(this,[null,...t])}_startErrorHandling(){window.addEventListener("error",this._boundErrorHandler),window.addEventListener("unhandledrejection",this._boundErrorHandler)}_stopErrorHandling(){window.removeEventListener("error",this._boundErrorHandler),window.removeEventListener("unhandledrejection",this._boundErrorHandler)}_handleError(e,t){if(this._shouldReactToError(e)){this.crashes.push({message:e.message,stack:e.stack,filename:t instanceof ErrorEvent?t.filename:void 0,lineno:t instanceof ErrorEvent?t.lineno:void 0,colno:t instanceof ErrorEvent?t.colno:void 0,date:this._now()});const i=this._shouldRestart();this.state="crashed",this._fire("stateChange"),this._fire("error",{error:e,causesRestart:i}),i?this._restart():(this.state="crashedPermanently",this._fire("stateChange"))}}_shouldReactToError(e){return e.is&&e.is("CKEditorError")&&void 0!==e.context&&null!==e.context&&"ready"===this.state&&this._isErrorComingFromThisItem(e)}_shouldRestart(){if(this.crashes.length<=this._crashNumberLimit)return!0;return(this.crashes[this.crashes.length-1].date-this.crashes[this.crashes.length-1-this._crashNumberLimit].date)/this._crashNumberLimit>this._minimumNonErrorTimePeriod}}function vp(e,t=new Set){const i=[e],n=new Set;let s=0;for(;i.length>s;){const e=i[s++];if(!n.has(e)&&_p(e)&&!t.has(e))if(n.add(e),Symbol.iterator in e)try{for(const t of e)i.push(t)}catch(e){}else for(const t in e)"defaultValue"!==t&&i.push(e[t])}return n}function _p(e){const t=Object.prototype.toString.call(e),i=typeof e;return!("number"===i||"boolean"===i||"string"===i||"symbol"===i||"function"===i||"[object Date]"===t||"[object RegExp]"===t||"[object Module]"===t||null==e||e._watchdogExcluded||e instanceof EventTarget||e instanceof Event)}function yp(e,t,i=new Set){if(e===t&&("object"==typeof(n=e)&&null!==n))return!0;var n;const s=vp(e,i),o=vp(t,i);for(const e of s)if(o.has(e))return!0;return!1}class kp extends wp{constructor(e,t={}){super(t),this._editor=null,this._lifecyclePromise=null,this._initUsingData=!0,this._editables={},this._throttledSave=cf(this._save.bind(this),"number"==typeof t.saveInterval?t.saveInterval:5e3),e&&(this._creator=(t,i)=>e.create(t,i)),this._destructor=e=>e.destroy()}get editor(){return this._editor}get _item(){return this._editor}setCreator(e){this._creator=e}setDestructor(e){this._destructor=e}_restart(){return Promise.resolve().then((()=>(this.state="initializing",this._fire("stateChange"),this._destroy()))).catch((e=>{console.error("An error happened during the editor destroying.",e)})).then((()=>{const e={},t=[],i=this._config.rootsAttributes||{},n={};for(const[s,o]of Object.entries(this._data.roots))o.isLoaded?(e[s]="",n[s]=i[s]||{}):t.push(s);const s={...this._config,extraPlugins:this._config.extraPlugins||[],lazyRoots:t,rootsAttributes:n,_watchdogInitialData:this._data};return delete s.initialData,s.extraPlugins.push(Cp),this._initUsingData?this.create(e,s,s.context):An(this._elementOrData)?this.create(this._elementOrData,s,s.context):this.create(this._editables,s,s.context)})).then((()=>{this._fire("restart")}))}create(e=this._elementOrData,t=this._config,i){return this._lifecyclePromise=Promise.resolve(this._lifecyclePromise).then((()=>(super._startErrorHandling(),this._elementOrData=e,this._initUsingData="string"==typeof e||Object.keys(e).length>0&&"string"==typeof Object.values(e)[0],this._config=this._cloneEditorConfiguration(t)||{},this._config.context=i,this._creator(e,this._config)))).then((e=>{this._editor=e,e.model.document.on("change:data",this._throttledSave),this._lastDocumentVersion=e.model.document.version,this._data=this._getData(),this._initUsingData||(this._editables=this._getEditables()),this.state="ready",this._fire("stateChange")})).finally((()=>{this._lifecyclePromise=null})),this._lifecyclePromise}destroy(){return this._lifecyclePromise=Promise.resolve(this._lifecyclePromise).then((()=>(this.state="destroyed",this._fire("stateChange"),super.destroy(),this._destroy()))).finally((()=>{this._lifecyclePromise=null})),this._lifecyclePromise}_destroy(){return Promise.resolve().then((()=>{this._stopErrorHandling(),this._throttledSave.cancel();const e=this._editor;return this._editor=null,e.model.document.off("change:data",this._throttledSave),this._destructor(e)}))}_save(){const e=this._editor.model.document.version;try{this._data=this._getData(),this._initUsingData||(this._editables=this._getEditables()),this._lastDocumentVersion=e}catch(e){console.error(e,"An error happened during restoring editor data. Editor will be restored from the previously saved data.")}}_setExcludedProperties(e){this._excludedProps=e}_getData(){const e=this._editor,t=e.model.document.roots.filter((e=>e.isAttached()&&"$graveyard"!=e.rootName)),{plugins:i}=e,n=i.has("CommentsRepository")&&i.get("CommentsRepository"),s=i.has("TrackChanges")&&i.get("TrackChanges"),o={roots:{},markers:{},commentThreads:JSON.stringify([]),suggestions:JSON.stringify([])};t.forEach((e=>{o.roots[e.rootName]={content:JSON.stringify(Array.from(e.getChildren())),attributes:JSON.stringify(Array.from(e.getAttributes())),isLoaded:e._isLoaded}}));for(const t of e.model.markers)t._affectsData&&(o.markers[t.name]={rangeJSON:t.getRange().toJSON(),usingOperation:t._managedUsingOperations,affectsData:t._affectsData});return n&&(o.commentThreads=JSON.stringify(n.getCommentThreads({toJSON:!0,skipNotAttached:!0}))),s&&(o.suggestions=JSON.stringify(s.getSuggestions({toJSON:!0,skipNotAttached:!0}))),o}_getEditables(){const e={};for(const t of this.editor.model.document.getRootNames()){const i=this.editor.ui.getEditableElement(t);i&&(e[t]=i)}return e}_isErrorComingFromThisItem(e){return yp(this._editor,e.context,this._excludedProps)}_cloneEditorConfiguration(e){return Cn(e,((e,t)=>An(e)||"context"===t?e:void 0))}}class Cp{constructor(e){this.editor=e,this._data=e.config.get("_watchdogInitialData")}init(){this.editor.data.on("init",(e=>{e.stop(),this.editor.model.enqueueChange({isUndoable:!1},(e=>{this._restoreCollaborationData(),this._restoreEditorData(e)})),this.editor.data.fire("ready")}),{priority:999})}_createNode(e,t){if("name"in t){const i=e.createElement(t.name,t.attributes);if(t.children)for(const n of t.children)i._appendChild(this._createNode(e,n));return i}return e.createText(t.data,t.attributes)}_restoreEditorData(e){const t=this.editor;Object.entries(this._data.roots).forEach((([i,{content:n,attributes:s}])=>{const o=JSON.parse(n),r=JSON.parse(s),a=t.model.document.getRoot(i);for(const[t,i]of r)e.setAttribute(t,i,a);for(const t of o){const i=this._createNode(e,t);e.insert(i,a,"end")}})),Object.entries(this._data.markers).forEach((([i,n])=>{const{document:s}=t.model,{rangeJSON:{start:o,end:r},...a}=n,l=s.getRoot(o.root),c=e.createPositionFromPath(l,o.path,o.stickiness),d=e.createPositionFromPath(l,r.path,r.stickiness),h=e.createRange(c,d);e.addMarker(i,{range:h,...a})}))}_restoreCollaborationData(){const e=JSON.parse(this._data.commentThreads),t=JSON.parse(this._data.suggestions);e.forEach((e=>{const t=this.editor.config.get("collaboration.channelId"),i=this.editor.plugins.get("CommentsRepository");if(i.hasCommentThread(e.threadId)){i.getCommentThread(e.threadId).remove()}i.addCommentThread({channelId:t,...e})})),t.forEach((e=>{const t=this.editor.plugins.get("TrackChangesEditing");if(t.hasSuggestion(e.id)){t.getSuggestion(e.id).attributes=e.attributes}else t.addSuggestionData(e)}))}}const Ap=Symbol("MainQueueId");class xp{constructor(){this._onEmptyCallbacks=[],this._queues=new Map,this._activeActions=0}onEmpty(e){this._onEmptyCallbacks.push(e)}enqueue(e,t){const i=e===Ap;this._activeActions++,this._queues.get(e)||this._queues.set(e,Promise.resolve());const n=(i?Promise.all(this._queues.values()):Promise.all([this._queues.get(Ap),this._queues.get(e)])).then(t),s=n.catch((()=>{}));return this._queues.set(e,s),n.finally((()=>{this._activeActions--,this._queues.get(e)===s&&0===this._activeActions&&this._onEmptyCallbacks.forEach((e=>e()))}))}}function Ep(e){return Array.isArray(e)?e:[e]}class Tp extends(mu(uu)){constructor(e,t={}){if(!Pp(e)&&void 0!==t.initialData)throw new y("editor-create-initial-data",null);super(t),this.config.define("menuBar.isVisible",!1),void 0===this.config.get("initialData")&&this.config.set("initialData",function(e){return Pp(e)?(t=e,t instanceof HTMLTextAreaElement?t.value:t.innerHTML):e;var t}(e)),Pp(e)&&(this.sourceElement=e),this.model.document.createRoot();const i=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=this.config.get("menuBar"),s=new bp(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:i,useMenuBar:n.isVisible});this.ui=new pp(this,s),function(e){if(!$e(e.updateSourceElement))throw new y("attachtoform-missing-elementapi-interface",e);const t=e.sourceElement;if(function(e){return!!e&&"textarea"===e.tagName.toLowerCase()}(t)&&t.form){let i;const n=t.form,s=()=>e.updateSourceElement();$e(n.submit)&&(i=n.submit,n.submit=()=>{s(),i.apply(n)}),n.addEventListener("submit",s),e.on("destroy",(()=>{n.removeEventListener("submit",s),i&&(n.submit=i)}))}}(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(e,t={}){return new Promise((i=>{const n=new this(e,t);i(n.initPlugins().then((()=>n.ui.init(Pp(e)?e:null))).then((()=>n.data.init(n.config.get("initialData")))).then((()=>n.fire("ready"))).then((()=>n)))}))}}Tp.Context=ho,Tp.EditorWatchdog=kp,Tp.ContextWatchdog=class extends wp{constructor(e,t={}){super(t),this._watchdogs=new Map,this._context=null,this._contextProps=new Set,this._actionQueues=new xp,this._watchdogConfig=t,this._creator=t=>e.create(t),this._destructor=e=>e.destroy(),this._actionQueues.onEmpty((()=>{"initializing"===this.state&&(this.state="ready",this._fire("stateChange"))}))}setCreator(e){this._creator=e}setDestructor(e){this._destructor=e}get context(){return this._context}create(e={}){return this._actionQueues.enqueue(Ap,(()=>(this._contextConfig=e,this._create())))}getItem(e){return this._getWatchdog(e)._item}getItemState(e){return this._getWatchdog(e).state}add(e){const t=Ep(e);return Promise.all(t.map((e=>this._actionQueues.enqueue(e.id,(()=>{if("destroyed"===this.state)throw new Error("Cannot add items to destroyed watchdog.");if(!this._context)throw new Error("Context was not created yet. You should call the `ContextWatchdog#create()` method first.");let t;if(this._watchdogs.has(e.id))throw new Error(`Item with the given id is already added: '${e.id}'.`);if("editor"===e.type)return t=new kp(null,this._watchdogConfig),t.setCreator(e.creator),t._setExcludedProperties(this._contextProps),e.destructor&&t.setDestructor(e.destructor),this._watchdogs.set(e.id,t),t.on("error",((i,{error:n,causesRestart:s})=>{this._fire("itemError",{itemId:e.id,error:n}),s&&this._actionQueues.enqueue(e.id,(()=>new Promise((i=>{const n=()=>{t.off("restart",n),this._fire("itemRestart",{itemId:e.id}),i()};t.on("restart",n)}))))})),t.create(e.sourceElementOrData,e.config,this._context);throw new Error(`Not supported item type: '${e.type}'.`)})))))}remove(e){const t=Ep(e);return Promise.all(t.map((e=>this._actionQueues.enqueue(e,(()=>{const t=this._getWatchdog(e);return this._watchdogs.delete(e),t.destroy()})))))}destroy(){return this._actionQueues.enqueue(Ap,(()=>(this.state="destroyed",this._fire("stateChange"),super.destroy(),this._destroy())))}_restart(){return this._actionQueues.enqueue(Ap,(()=>(this.state="initializing",this._fire("stateChange"),this._destroy().catch((e=>{console.error("An error happened during destroying the context or items.",e)})).then((()=>this._create())).then((()=>this._fire("restart"))))))}_create(){return Promise.resolve().then((()=>(this._startErrorHandling(),this._creator(this._contextConfig)))).then((e=>(this._context=e,this._contextProps=vp(this._context),Promise.all(Array.from(this._watchdogs.values()).map((e=>(e._setExcludedProperties(this._contextProps),e.create(void 0,void 0,this._context))))))))}_destroy(){return Promise.resolve().then((()=>{this._stopErrorHandling();const e=this._context;return this._context=null,this._contextProps=new Set,Promise.all(Array.from(this._watchdogs.values()).map((e=>e.destroy()))).then((()=>this._destructor(e)))}))}_getWatchdog(e){const t=this._watchdogs.get(e);if(!t)throw new Error(`Item with the given id was not registered: ${e}.`);return t}_isErrorComingFromThisItem(e){for(const t of this._watchdogs.values())if(t._isErrorComingFromThisItem(e))return!1;return yp(this._context,e.context)}};const Sp=Tp;function Pp(e){return An(e)}const Ip=["left","right","center","justify"];function Vp(e){return Ip.includes(e)}function Rp(e,t){return"rtl"==t.contentLanguageDirection?"right"===e:"left"===e}function Op(e){const t=e.map((e=>{let t;return t="string"==typeof e?{name:e}:e,t})).filter((e=>{const t=Ip.includes(e.name);return t||k("alignment-config-name-not-recognized",{option:e}),t})),i=t.filter((e=>Boolean(e.className))).length;if(i&&i{const s=n.slice(i+1);if(s.some((e=>e.name==t.name)))throw new y("alignment-config-name-already-defined",{option:t,configuredOptions:e});if(t.className){if(s.some((e=>e.className==t.className)))throw new y("alignment-config-classname-already-defined",{option:t,configuredOptions:e})}})),t}const Bp="alignment";class Mp extends ro{refresh(){const e=this.editor.locale,t=Zs(this.editor.model.document.selection.getSelectedBlocks());this.isEnabled=Boolean(t)&&this._canBeAligned(t),this.isEnabled&&t.hasAttribute("alignment")?this.value=t.getAttribute("alignment"):this.value="rtl"===e.contentLanguageDirection?"right":"left"}execute(e={}){const t=this.editor,i=t.locale,n=t.model,s=n.document,o=e.value;n.change((e=>{const t=Array.from(s.selection.getSelectedBlocks()).filter((e=>this._canBeAligned(e))),n=t[0].getAttribute("alignment");Rp(o,i)||n===o||!o?function(e,t){for(const i of e)t.removeAttribute(Bp,i)}(t,e):function(e,t,i){for(const n of e)t.setAttribute(Bp,i,n)}(t,e,o)}))}_canBeAligned(e){return this.editor.model.schema.checkAttribute(e,Bp)}}class Np extends so{static get pluginName(){return"AlignmentEditing"}constructor(e){super(e),e.config.define("alignment",{options:Ip.map((e=>({name:e})))})}init(){const e=this.editor,t=e.locale,i=e.model.schema,n=Op(e.config.get("alignment.options")).filter((e=>Vp(e.name)&&!Rp(e.name,t))),s=n.some((e=>!!e.className));i.extend("$block",{allowAttributes:"alignment"}),e.model.schema.setAttributeProperties("alignment",{isFormatting:!0}),s?e.conversion.attributeToAttribute(function(e){const t={};for(const i of e)t[i.name]={key:"class",value:i.className};const i={model:{key:"alignment",values:e.map((e=>e.name))},view:t};return i}(n)):e.conversion.for("downcast").attributeToAttribute(function(e){const t={};for(const{name:i}of e)t[i]={key:"style",value:{"text-align":i}};const i={model:{key:"alignment",values:e.map((e=>e.name))},view:t};return i}(n));const o=function(e){const t=[];for(const{name:i}of e)t.push({view:{key:"style",value:{"text-align":i}},model:{key:"alignment",value:i}});return t}(n);for(const t of o)e.conversion.for("upcast").attributeToAttribute(t);const r=function(e){const t=[];for(const{name:i}of e)t.push({view:{key:"align",value:i},model:{key:"alignment",value:i}});return t}(n);for(const t of r)e.conversion.for("upcast").attributeToAttribute(t);e.commands.add("alignment",new Mp(e))}}const Fp=new Map([["left",fu.alignLeft],["right",fu.alignRight],["center",fu.alignCenter],["justify",fu.alignJustify]]);class Dp extends so{get localizedOptionTitles(){const e=this.editor.t;return{left:e("Align left"),right:e("Align right"),center:e("Align center"),justify:e("Justify")}}static get pluginName(){return"AlignmentUI"}init(){const e=Op(this.editor.config.get("alignment.options"));e.map((e=>e.name)).filter(Vp).forEach((e=>this._addButton(e))),this._addToolbarDropdown(e),this._addMenuBarMenu(e)}_addButton(e){this.editor.ui.componentFactory.add(`alignment:${e}`,(t=>this._createButton(t,e)))}_createButton(e,t,i={}){const n=this.editor,s=n.commands.get("alignment"),o=new Ku(e);return o.set({label:this.localizedOptionTitles[t],icon:Fp.get(t),tooltip:!0,isToggleable:!0,...i}),o.bind("isEnabled").to(s),o.bind("isOn").to(s,"value",(e=>e===t)),this.listenTo(o,"execute",(()=>{n.execute("alignment",{value:t}),n.editing.view.focus()})),o}_addToolbarDropdown(e){const t=this.editor;t.ui.componentFactory.add("alignment",(i=>{const n=Dm(i),s="rtl"===i.uiLanguageDirection?"w":"e",o=i.t;Lm(n,(()=>e.map((e=>this._createButton(i,e.name,{tooltipPosition:s})))),{enableActiveItemFocusOnDropdownOpen:!0,isVertical:!0,ariaLabel:o("Text alignment toolbar")}),n.buttonView.set({label:o("Text alignment"),tooltip:!0}),n.extendTemplate({attributes:{class:"ck-alignment-dropdown"}});const r="rtl"===i.contentLanguageDirection?Fp.get("right"):Fp.get("left"),a=t.commands.get("alignment");return n.buttonView.bind("icon").to(a,"value",(e=>Fp.get(e)||r)),n.bind("isEnabled").to(a,"isEnabled"),this.listenTo(n,"execute",(()=>{t.editing.view.focus()})),n}))}_addMenuBarMenu(e){const t=this.editor;t.ui.componentFactory.add("menuBar:alignment",(i=>{const n=t.commands.get("alignment"),s=i.t,o=new dp(i),r=new hp(i);o.bind("isEnabled").to(n),r.set({ariaLabel:s("Text alignment"),role:"menu"}),o.buttonView.set({label:s("Text alignment")});for(const s of e){const e=new qf(i,o),a=new up(i);a.extendTemplate({attributes:{"aria-checked":a.bindTemplate.to("isOn")}}),a.delegate("execute").to(o),a.set({label:this.localizedOptionTitles[s.name],icon:Fp.get(s.name)}),a.on("execute",(()=>{t.execute("alignment",{value:s.name}),t.editing.view.focus()})),a.bind("isOn").to(n,"value",(e=>e===s.name)),a.bind("isEnabled").to(n,"isEnabled"),e.children.add(a),r.items.add(e)}return o.panelView.children.add(r),o}))}}class Lp{constructor(e,t=20){this._batch=null,this.model=e,this._size=0,this.limit=t,this._isLocked=!1,this._changeCallback=(e,t)=>{t.isLocal&&t.isUndoable&&t!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch({isTyping:!0})),this._batch}get size(){return this._size}input(e){this._size+=e,this._size>=this.limit&&this._reset(!0)}get isLocked(){return this._isLocked}lock(){this._isLocked=!0}unlock(){this._isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(e=!1){this.isLocked&&!e||(this._batch=null,this._size=0)}}class zp extends ro{constructor(e,t){super(e),this._buffer=new Lp(e.model,t),this._isEnabledBasedOnSelection=!1}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(e={}){const t=this.editor.model,i=t.document,n=e.text||"",s=n.length;let o=i.selection;if(e.selection?o=e.selection:e.range&&(o=t.createSelection(e.range)),!t.canEditAt(o))return;const r=e.resultRange;t.enqueueChange(this._buffer.batch,(e=>{this._buffer.lock();const a=Array.from(i.selection.getAttributes());t.deleteContent(o),n&&t.insertContent(e.createText(n,a),o),r?e.setSelection(r):o.is("documentSelection")||e.setSelection(o),this._buffer.unlock(),this._buffer.input(s)}))}}const Hp=["insertText","insertReplacementText"];class $p extends ka{constructor(e){super(e),this.focusObserver=e.getObserver(dl),l.isAndroid&&Hp.push("insertCompositionText");const t=e.document;t.on("beforeinput",((i,n)=>{if(!this.isEnabled)return;const{data:s,targetRanges:o,inputType:r,domEvent:a}=n;if(!Hp.includes(r))return;this.focusObserver.flush();const l=new f(t,"insertText");t.fire(l,new Aa(e,a,{text:s,selection:e.createSelection(o)})),l.stop.called&&i.stop()})),t.on("compositionend",((i,{data:n,domEvent:s})=>{this.isEnabled&&!l.isAndroid&&n&&t.fire("insertText",new Aa(e,s,{text:n,selection:t.selection}))}),{priority:"lowest"})}observe(){}stopObserving(){}}class Wp extends so{static get pluginName(){return"Input"}init(){const e=this.editor,t=e.model,i=e.editing.view,n=t.document.selection;i.addObserver($p);const s=new zp(e,e.config.get("typing.undoStep")||20);e.commands.add("insertText",s),e.commands.add("input",s),this.listenTo(i.document,"insertText",((n,s)=>{i.document.isComposing||s.preventDefault();const{text:o,selection:r,resultRange:a}=s,c=Array.from(r.getRanges()).map((t=>e.editing.mapper.toModelRange(t)));let d=o;if(l.isAndroid){const e=Array.from(c[0].getItems()).reduce(((e,t)=>e+(t.is("$textProxy")?t.data:"")),"");e&&(e.length<=d.length?d.startsWith(e)&&(d=d.substring(e.length),c[0].start=c[0].start.getShiftedBy(e.length)):e.startsWith(d)&&(c[0].start=c[0].start.getShiftedBy(d.length),d=""))}const h={text:d,selection:t.createSelection(c)};a&&(h.resultRange=e.editing.mapper.toModelRange(a)),e.execute("insertText",h),i.scrollToTheSelection()})),l.isAndroid?this.listenTo(i.document,"keydown",((e,o)=>{!n.isCollapsed&&229==o.keyCode&&i.document.isComposing&&jp(t,s)})):this.listenTo(i.document,"compositionstart",(()=>{n.isCollapsed||jp(t,s)}))}}function jp(e,t){if(!t.isEnabled)return;const i=t.buffer;i.lock(),e.enqueueChange(i.batch,(()=>{e.deleteContent(e.document.selection)})),i.unlock()}class Up extends ro{constructor(e,t){super(e),this.direction=t,this._buffer=new Lp(e.model,e.config.get("typing.undoStep")),this._isEnabledBasedOnSelection=!1}get buffer(){return this._buffer}execute(e={}){const t=this.editor.model,i=t.document;t.enqueueChange(this._buffer.batch,(n=>{this._buffer.lock();const s=n.createSelection(e.selection||i.selection);if(!t.canEditAt(s))return;const o=e.sequence||1,r=s.isCollapsed;if(s.isCollapsed&&t.modifySelection(s,{direction:this.direction,unit:e.unit,treatEmojiAsSingleUnit:!0}),this._shouldEntireContentBeReplacedWithParagraph(o))return void this._replaceEntireContentWithParagraph(n);if(this._shouldReplaceFirstBlockWithParagraph(s,o))return void this.editor.execute("paragraph",{selection:s});if(s.isCollapsed)return;let a=0;s.getFirstRange().getMinimalFlatRanges().forEach((e=>{a+=ee(e.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))})),t.deleteContent(s,{doNotResetEntireContent:r,direction:this.direction}),this._buffer.input(a),n.setSelection(s),this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(e){if(e>1)return!1;const t=this.editor.model,i=t.document.selection,n=t.schema.getLimitElement(i);if(!(i.isCollapsed&&i.containsEntireContent(n)))return!1;if(!t.schema.checkChild(n,"paragraph"))return!1;const s=n.getChild(0);return!s||!s.is("element","paragraph")}_replaceEntireContentWithParagraph(e){const t=this.editor.model,i=t.document.selection,n=t.schema.getLimitElement(i),s=e.createElement("paragraph");e.remove(e.createRangeIn(n)),e.insert(s,n),e.setSelection(s,0)}_shouldReplaceFirstBlockWithParagraph(e,t){const i=this.editor.model;if(t>1||"backward"!=this.direction)return!1;if(!e.isCollapsed)return!1;const n=e.getFirstPosition(),s=i.schema.getLimitElement(n),o=s.getChild(0);return n.parent==o&&(!!e.containsEntireContent(o)&&(!!i.schema.checkChild(s,"paragraph")&&"paragraph"!=o.name))}}const qp="word",Gp="selection",Kp="backward",Zp="forward",Jp={deleteContent:{unit:Gp,direction:Kp},deleteContentBackward:{unit:"codePoint",direction:Kp},deleteWordBackward:{unit:qp,direction:Kp},deleteHardLineBackward:{unit:Gp,direction:Kp},deleteSoftLineBackward:{unit:Gp,direction:Kp},deleteContentForward:{unit:"character",direction:Zp},deleteWordForward:{unit:qp,direction:Zp},deleteHardLineForward:{unit:Gp,direction:Zp},deleteSoftLineForward:{unit:Gp,direction:Zp}};class Qp extends ka{constructor(e){super(e);const t=e.document;let i=0;t.on("keydown",(()=>{i++})),t.on("keyup",(()=>{i=0})),t.on("beforeinput",((n,s)=>{if(!this.isEnabled)return;const{targetRanges:o,domEvent:r,inputType:a}=s,c=Jp[a];if(!c)return;const d={direction:c.direction,unit:c.unit,sequence:i};d.unit==Gp&&(d.selectionToRemove=e.createSelection(o[0])),"deleteContentBackward"===a&&(l.isAndroid&&(d.sequence=1),function(e){if(1!=e.length||e[0].isCollapsed)return!1;const t=e[0].getWalker({direction:"backward",singleCharacters:!0,ignoreElementEnd:!0});let i=0;for(const{nextPosition:e}of t){if(e.parent.is("$text")){const t=e.parent.data,n=e.offset;if(eo(t,n)||to(t,n)||no(t,n))continue;i++}else i++;if(i>1)return!0}return!1}(o)&&(d.unit=Gp,d.selectionToRemove=e.createSelection(o)));const h=new _r(t,"delete",o[0]);t.fire(h,new Aa(e,r,d)),h.stop.called&&n.stop()})),l.isBlink&&function(e){const t=e.view,i=t.document;let n=null,s=!1;function o(e){return e==bs.backspace||e==bs.delete}function r(e){return e==bs.backspace?Kp:Zp}i.on("keydown",((e,{keyCode:t})=>{n=t,s=!1})),i.on("keyup",((a,{keyCode:l,domEvent:c})=>{const d=i.selection,h=e.isEnabled&&l==n&&o(l)&&!d.isCollapsed&&!s;if(n=null,h){const e=d.getFirstRange(),n=new _r(i,"delete",e),s={unit:Gp,direction:r(l),selectionToRemove:d};i.fire(n,new Aa(t,c,s))}})),i.on("beforeinput",((e,{inputType:t})=>{const i=Jp[t];o(n)&&i&&i.direction==r(n)&&(s=!0)}),{priority:"high"}),i.on("beforeinput",((e,{inputType:t,data:i})=>{n==bs.delete&&"insertText"==t&&""==i&&e.stop()}),{priority:"high"})}(this)}observe(){}stopObserving(){}}class Yp extends so{static get pluginName(){return"Delete"}init(){const e=this.editor,t=e.editing.view,i=t.document,n=e.model.document;t.addObserver(Qp),this._undoOnBackspace=!1;const s=new Up(e,"forward");e.commands.add("deleteForward",s),e.commands.add("forwardDelete",s),e.commands.add("delete",new Up(e,"backward")),this.listenTo(i,"delete",((n,s)=>{i.isComposing||s.preventDefault();const{direction:o,sequence:r,selectionToRemove:a,unit:l}=s,c="forward"===o?"deleteForward":"delete",d={sequence:r};if("selection"==l){const t=Array.from(a.getRanges()).map((t=>e.editing.mapper.toModelRange(t)));d.selection=e.model.createSelection(t)}else d.unit=l;e.execute(c,d),t.scrollToTheSelection()}),{priority:"low"}),this.editor.plugins.has("UndoEditing")&&(this.listenTo(i,"delete",((t,i)=>{this._undoOnBackspace&&"backward"==i.direction&&1==i.sequence&&"codePoint"==i.unit&&(this._undoOnBackspace=!1,e.execute("undo"),i.preventDefault(),t.stop())}),{context:"$capture"}),this.listenTo(n,"change",(()=>{this._undoOnBackspace=!1})))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}class Xp extends so{static get requires(){return[Wp,Yp]}static get pluginName(){return"Typing"}}function eb(e,t){let i=e.start;return{text:Array.from(e.getWalker({ignoreElementEnd:!1})).reduce(((e,{item:n})=>n.is("$text")||n.is("$textProxy")?e+n.data:(i=t.createPositionAfter(n),"")),""),range:t.createRange(i,e.end)}}class tb extends(G()){constructor(e,t){super(),this.model=e,this.testCallback=t,this._hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",(()=>{this.isEnabled?this._startListening():(this.stopListening(e.document.selection),this.stopListening(e.document))})),this._startListening()}get hasMatch(){return this._hasMatch}_startListening(){const e=this.model.document;this.listenTo(e.selection,"change:range",((t,{directChange:i})=>{i&&(e.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this._hasMatch=!1))})),this.listenTo(e,"change:data",((e,t)=>{!t.isUndo&&t.isLocal&&this._evaluateTextBeforeSelection("data",{batch:t})}))}_evaluateTextBeforeSelection(e,t={}){const i=this.model,n=i.document.selection,s=i.createRange(i.createPositionAt(n.focus.parent,0),n.focus),{text:o,range:r}=eb(s,i),a=this.testCallback(o);if(!a&&this.hasMatch&&this.fire("unmatched"),this._hasMatch=!!a,a){const i=Object.assign(t,{text:o,range:r});"object"==typeof a&&Object.assign(i,a),this.fire(`matched:${e}`,i)}}}class ib extends so{static get pluginName(){return"TwoStepCaretMovement"}constructor(e){super(e),this._isNextGravityRestorationSkipped=!1,this.attributes=new Set,this._overrideUid=null}init(){const e=this.editor,t=e.model,i=e.editing.view,n=e.locale,s=t.document.selection;this.listenTo(i.document,"arrowKey",((e,t)=>{if(!s.isCollapsed)return;if(t.shiftKey||t.altKey||t.ctrlKey)return;const i=t.keyCode==bs.arrowright,o=t.keyCode==bs.arrowleft;if(!i&&!o)return;const r=n.contentLanguageDirection;let a=!1;a="ltr"===r&&i||"rtl"===r&&o?this._handleForwardMovement(t):this._handleBackwardMovement(t),!0===a&&e.stop()}),{context:"$text",priority:"highest"}),this.listenTo(s,"change:range",((e,t)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!t.directChange&&lb(s.getFirstPosition(),this.attributes)||this._restoreGravity())})),this._enableClickingAfterNode(),this._enableInsertContentSelectionAttributesFixer(),this._handleDeleteContentAfterNode()}registerAttribute(e){this.attributes.add(e)}_handleForwardMovement(e){const t=this.attributes,i=this.editor.model,n=i.document.selection,s=n.getFirstPosition();return!this._isGravityOverridden&&((!s.isAtStart||!nb(n,t))&&(!!lb(s,t)&&(rb(e),nb(n,t)&&lb(s,t,!0)?ob(i,t):this._overrideGravity(),!0)))}_handleBackwardMovement(e){const t=this.attributes,i=this.editor.model,n=i.document.selection,s=n.getFirstPosition();return this._isGravityOverridden?(rb(e),this._restoreGravity(),lb(s,t,!0)?ob(i,t):sb(i,t,s),!0):s.isAtStart?!!nb(n,t)&&(rb(e),sb(i,t,s),!0):!nb(n,t)&&lb(s,t,!0)?(rb(e),sb(i,t,s),!0):!!ab(s,t)&&(s.isAtEnd&&!nb(n,t)&&lb(s,t)?(rb(e),sb(i,t,s),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1))}_enableClickingAfterNode(){const e=this.editor,t=e.model,i=t.document.selection,n=e.editing.view.document;e.editing.view.addObserver(vh);let s=!1;this.listenTo(n,"mousedown",(()=>{s=!0})),this.listenTo(n,"selectionChange",(()=>{const e=this.attributes;if(!s)return;if(s=!1,!i.isCollapsed)return;if(!nb(i,e))return;const n=i.getFirstPosition();lb(n,e)&&(n.isAtStart||lb(n,e,!0)?ob(t,e):this._isGravityOverridden||this._overrideGravity())}))}_enableInsertContentSelectionAttributesFixer(){const e=this.editor.model,t=e.document.selection,i=this.attributes;this.listenTo(e,"insertContent",(()=>{const n=t.getFirstPosition();nb(t,i)&&lb(n,i)&&ob(e,i)}),{priority:"low"})}_handleDeleteContentAfterNode(){const e=this.editor,t=e.model,i=t.document.selection,n=e.editing.view;let s=!1,o=!1;this.listenTo(n.document,"delete",((e,t)=>{s="backward"===t.direction}),{priority:"high"}),this.listenTo(t,"deleteContent",(()=>{if(!s)return;const e=i.getFirstPosition();o=nb(i,this.attributes)&&!ab(e,this.attributes)}),{priority:"high"}),this.listenTo(t,"deleteContent",(()=>{s&&(s=!1,o||e.model.enqueueChange((()=>{const e=i.getFirstPosition();nb(i,this.attributes)&&lb(e,this.attributes)&&(e.isAtStart||lb(e,this.attributes,!0)?ob(t,this.attributes):this._isGravityOverridden||this._overrideGravity())})))}),{priority:"low"})}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((e=>e.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((e=>{e.restoreSelectionGravity(this._overrideUid),this._overrideUid=null}))}}function nb(e,t){for(const i of t)if(e.hasAttribute(i))return!0;return!1}function sb(e,t,i){const n=i.nodeBefore;e.change((i=>{if(n){const t=[],s=e.schema.isObject(n)&&e.schema.isInline(n);for(const[i,o]of n.getAttributes())!e.schema.checkAttribute("$text",i)||s&&!1===e.schema.getAttributeProperties(i).copyFromObject||t.push([i,o]);i.setSelectionAttribute(t)}else i.removeSelectionAttribute(t)}))}function ob(e,t){e.change((e=>{e.removeSelectionAttribute(t)}))}function rb(e){e.preventDefault()}function ab(e,t){return lb(e.getShiftedBy(-1),t)}function lb(e,t,i=!1){const{nodeBefore:n,nodeAfter:s}=e;for(const e of t){const t=n?n.getAttribute(e):void 0,o=s?s.getAttribute(e):void 0;if((!i||void 0!==t&&void 0!==o)&&o!==t)return!0}return!1}const cb={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:fb('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:fb("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:fb("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:fb('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:fb('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:fb("'"),to:[null,"‚",null,"’"]}},db={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},hb=["symbols","mathematical","typography","quotes"];function ub(e){return"string"==typeof e?new RegExp(`(${zf(e)})$`):e}function mb(e){return"string"==typeof e?()=>[e]:e instanceof Array?()=>e:e}function gb(e){return(e.textNode?e.textNode:e.nodeAfter).getAttributes()}function fb(e){return new RegExp(`(^|\\s)(${e})([^${e}]*)(${e})$`)}function pb(e,t,i,n){return n.createRange(bb(e,t,i,!0,n),bb(e,t,i,!1,n))}function bb(e,t,i,n,s){let o=e.textNode||(n?e.nodeBefore:e.nodeAfter),r=null;for(;o&&o.getAttribute(t)==i;)r=o,o=n?o.previousSibling:o.nextSibling;return r?s.createPositionAt(r,n?"before":"after"):e}function wb(e,t,i,n){const s=e.editing.view,o=new Set;s.document.registerPostFixer((s=>{const r=e.model.document.selection;let a=!1;if(r.hasAttribute(t)){const l=pb(r.getFirstPosition(),t,r.getAttribute(t),e.model),c=e.editing.mapper.toViewRange(l);for(const e of c.getItems())e.is("element",i)&&!e.hasClass(n)&&(s.addClass(n,e),o.add(e),a=!0)}return a})),e.conversion.for("editingDowncast").add((e=>{function t(){s.change((e=>{for(const t of o.values())e.removeClass(n,t),o.delete(t)}))}e.on("insert",t,{priority:"highest"}),e.on("remove",t,{priority:"highest"}),e.on("attribute",t,{priority:"highest"}),e.on("selection",t,{priority:"highest"})}))}function vb(e,t,i,n){let s,o=null;"function"==typeof n?s=n:(o=e.commands.get(n),s=()=>{e.execute(n)}),e.model.document.on("change:data",((r,a)=>{if(o&&!o.isEnabled||!t.isEnabled)return;const l=Zs(e.model.document.selection.getRanges());if(!l.isCollapsed)return;if(a.isUndo||!a.isLocal)return;const c=Array.from(e.model.document.differ.getChanges()),d=c[0];if(1!=c.length||"insert"!==d.type||"$text"!=d.name||1!=d.length)return;const h=d.position.parent;if(h.is("element","codeBlock"))return;if(h.is("element","listItem")&&"function"!=typeof n&&!["numberedList","bulletedList","todoList"].includes(n))return;if(o&&!0===o.value)return;const u=h.getChild(0),m=e.model.createRangeOn(u);if(!m.containsRange(l)&&!l.end.isEqual(m.end))return;const g=i.exec(u.data.substr(0,l.end.offset));g&&e.model.enqueueChange((t=>{const i=t.createPositionAt(h,0),n=t.createPositionAt(h,g[0].length),o=new Kl(i,n);if(!1!==s({match:g})){t.remove(o);const i=e.model.document.selection.getFirstRange(),n=t.createRangeIn(h);!h.isEmpty||n.isEqual(i)||n.containsRange(i,!0)||t.remove(h)}o.detach(),e.model.enqueueChange((()=>{e.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function _b(e,t,i,n){let s,o;i instanceof RegExp?s=i:o=i,o=o||(e=>{let t;const i=[],n=[];for(;null!==(t=s.exec(e))&&!(t&&t.length<4);){let{index:e,1:s,2:o,3:r}=t;const a=s+o+r;e+=t[0].length-a.length;const l=[e,e+s.length],c=[e+s.length+o.length,e+s.length+o.length+r.length];i.push(l),i.push(c),n.push([e+s.length,e+s.length+o.length])}return{remove:i,format:n}}),e.model.document.on("change:data",((i,s)=>{if(s.isUndo||!s.isLocal||!t.isEnabled)return;const r=e.model,a=r.document.selection;if(!a.isCollapsed)return;const l=Array.from(r.document.differ.getChanges()),c=l[0];if(1!=l.length||"insert"!==c.type||"$text"!=c.name||1!=c.length)return;const d=a.focus,h=d.parent,{text:u,range:m}=function(e,t){let i=e.start;const n=Array.from(e.getItems()).reduce(((e,n)=>!n.is("$text")&&!n.is("$textProxy")||n.getAttribute("code")?(i=t.createPositionAfter(n),""):e+n.data),"");return{text:n,range:t.createRange(i,e.end)}}(r.createRange(r.createPositionAt(h,0),d),r),g=o(u),f=yb(m.start,g.format,r),p=yb(m.start,g.remove,r);f.length&&p.length&&r.enqueueChange((t=>{if(!1!==n(t,f)){for(const e of p.reverse())t.remove(e);r.enqueueChange((()=>{e.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function yb(e,t,i){return t.filter((e=>void 0!==e[0]&&void 0!==e[1])).map((t=>i.createRange(e.getShiftedBy(t[0]),e.getShiftedBy(t[1]))))}function kb(e,t){return(i,n)=>{if(!e.commands.get(t).isEnabled)return!1;const s=e.model.schema.getValidRanges(n,t);for(const e of s)i.setAttribute(t,!0,e);i.removeSelectionAttribute(t)}}class Cb extends ro{constructor(e,t){super(e),this.attributeKey=t}refresh(){const e=this.editor.model,t=e.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=e.schema.checkAttributeInSelection(t.selection,this.attributeKey)}execute(e={}){const t=this.editor.model,i=t.document.selection,n=void 0===e.forceValue?!this.value:e.forceValue;t.change((e=>{if(i.isCollapsed)n?e.setSelectionAttribute(this.attributeKey,!0):e.removeSelectionAttribute(this.attributeKey);else{const s=t.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const t of s)n?e.setAttribute(this.attributeKey,n,t):e.removeAttribute(this.attributeKey,t)}}))}_getValueFromFirstAllowedNode(){const e=this.editor.model,t=e.schema,i=e.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const e of i.getRanges())for(const i of e.getItems())if(t.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}const Ab="bold";class xb extends so{static get pluginName(){return"BoldEditing"}init(){const e=this.editor,t=this.editor.t;e.model.schema.extend("$text",{allowAttributes:Ab}),e.model.schema.setAttributeProperties(Ab,{isFormatting:!0,copyOnEnter:!0}),e.conversion.attributeToElement({model:Ab,view:"strong",upcastAlso:["b",e=>{const t=e.getStyle("font-weight");return t&&("bold"==t||Number(t)>=600)?{name:!0,styles:["font-weight"]}:null}]}),e.commands.add(Ab,new Cb(e,Ab)),e.keystrokes.set("CTRL+B",Ab),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Bold text"),keystroke:"CTRL+B"}]})}}function Eb({editor:e,commandName:t,plugin:i,icon:n,label:s,keystroke:o}){return r=>{const a=e.commands.get(t),l=new r(e.locale);return l.set({label:s,icon:n,keystroke:o,isToggleable:!0}),l.bind("isEnabled").to(a,"isEnabled"),i.listenTo(l,"execute",(()=>{e.execute(t),e.editing.view.focus()})),l}}const Tb="bold";class Sb extends so{static get pluginName(){return"BoldUI"}init(){const e=this.editor,t=e.locale.t,i=e.commands.get(Tb),n=Eb({editor:e,commandName:Tb,plugin:this,icon:fu.bold,label:t("Bold"),keystroke:"CTRL+B"});e.ui.componentFactory.add(Tb,(()=>{const e=n(Ku);return e.set({tooltip:!0}),e.bind("isOn").to(i,"value"),e})),e.ui.componentFactory.add("menuBar:"+Tb,(()=>n(up)))}}const Pb="code";class Ib extends so{static get pluginName(){return"CodeEditing"}static get requires(){return[ib]}init(){const e=this.editor,t=this.editor.t;e.model.schema.extend("$text",{allowAttributes:Pb}),e.model.schema.setAttributeProperties(Pb,{isFormatting:!0,copyOnEnter:!1}),e.conversion.attributeToElement({model:Pb,view:"code",upcastAlso:{styles:{"word-wrap":"break-word"}}}),e.commands.add(Pb,new Cb(e,Pb)),e.plugins.get(ib).registerAttribute(Pb),wb(e,Pb,"code","ck-code_selected"),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Move out of an inline code style"),keystroke:[["arrowleft","arrowleft"],["arrowright","arrowright"]]}]})}}const Vb="code";class Rb extends so{static get pluginName(){return"CodeUI"}init(){const e=this.editor,t=e.locale.t,i=Eb({editor:e,commandName:Vb,plugin:this,icon:'',label:t("Code")});e.ui.componentFactory.add(Vb,(()=>{const t=i(Ku),n=e.commands.get(Vb);return t.set({tooltip:!0}),t.bind("isOn").to(n,"value"),t})),e.ui.componentFactory.add("menuBar:"+Vb,(()=>i(up)))}}const Ob="italic";class Bb extends so{static get pluginName(){return"ItalicEditing"}init(){const e=this.editor,t=this.editor.t;e.model.schema.extend("$text",{allowAttributes:Ob}),e.model.schema.setAttributeProperties(Ob,{isFormatting:!0,copyOnEnter:!0}),e.conversion.attributeToElement({model:Ob,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),e.commands.add(Ob,new Cb(e,Ob)),e.keystrokes.set("CTRL+I",Ob),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Italic text"),keystroke:"CTRL+I"}]})}}const Mb="italic";class Nb extends so{static get pluginName(){return"ItalicUI"}init(){const e=this.editor,t=e.commands.get(Mb),i=e.locale.t,n=Eb({editor:e,commandName:Mb,plugin:this,icon:'',keystroke:"CTRL+I",label:i("Italic")});e.ui.componentFactory.add(Mb,(()=>{const e=n(Ku);return e.set({tooltip:!0}),e.bind("isOn").to(t,"value"),e})),e.ui.componentFactory.add("menuBar:"+Mb,(()=>n(up)))}}const Fb="strikethrough";class Db extends so{static get pluginName(){return"StrikethroughEditing"}init(){const e=this.editor,t=this.editor.t;e.model.schema.extend("$text",{allowAttributes:Fb}),e.model.schema.setAttributeProperties(Fb,{isFormatting:!0,copyOnEnter:!0}),e.conversion.attributeToElement({model:Fb,view:"s",upcastAlso:["del","strike",{styles:{"text-decoration":"line-through"}}]}),e.commands.add(Fb,new Cb(e,Fb)),e.keystrokes.set("CTRL+SHIFT+X","strikethrough"),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Strikethrough text"),keystroke:"CTRL+SHIFT+X"}]})}}const Lb="strikethrough";class zb extends so{static get pluginName(){return"StrikethroughUI"}init(){const e=this.editor,t=e.locale.t,i=Eb({editor:e,commandName:Lb,plugin:this,icon:'',keystroke:"CTRL+SHIFT+X",label:t("Strikethrough")});e.ui.componentFactory.add(Lb,(()=>{const t=i(Ku),n=e.commands.get(Lb);return t.set({tooltip:!0}),t.bind("isOn").to(n,"value"),t})),e.ui.componentFactory.add("menuBar:"+Lb,(()=>i(up)))}}const Hb="underline";class $b extends so{static get pluginName(){return"UnderlineEditing"}init(){const e=this.editor,t=this.editor.t;e.model.schema.extend("$text",{allowAttributes:Hb}),e.model.schema.setAttributeProperties(Hb,{isFormatting:!0,copyOnEnter:!0}),e.conversion.attributeToElement({model:Hb,view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}}),e.commands.add(Hb,new Cb(e,Hb)),e.keystrokes.set("CTRL+U","underline"),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Underline text"),keystroke:"CTRL+U"}]})}}const Wb="underline";class jb extends so{static get pluginName(){return"UnderlineUI"}init(){const e=this.editor,t=e.commands.get(Wb),i=e.locale.t,n=Eb({editor:e,commandName:Wb,plugin:this,icon:'',label:i("Underline"),keystroke:"CTRL+U"});e.ui.componentFactory.add(Wb,(()=>{const e=n(Ku);return e.set({tooltip:!0}),e.bind("isOn").to(t,"value"),e})),e.ui.componentFactory.add("menuBar:"+Wb,(()=>n(up)))}}function*Ub(e,t){for(const i of t)i&&e.getAttributeProperties(i[0]).copyOnEnter&&(yield i)}class qb extends ro{execute(){this.editor.model.change((e=>{this.enterBlock(e),this.fire("afterExecute",{writer:e})}))}enterBlock(e){const t=this.editor.model,i=t.document.selection,n=t.schema,s=i.isCollapsed,o=i.getFirstRange(),r=o.start.parent,a=o.end.parent;if(n.isLimit(r)||n.isLimit(a))return s||r!=a||t.deleteContent(i),!1;if(s){const t=Ub(e.model.schema,i.getAttributes());return Gb(e,o.start),e.setSelectionAttribute(t),!0}{const n=!(o.start.isAtStart&&o.end.isAtEnd),s=r==a;if(t.deleteContent(i,{leaveUnmerged:n}),n){if(s)return Gb(e,i.focus),!0;e.setSelection(a,0)}}return!1}}function Gb(e,t){e.split(t),e.setSelection(t.parent.nextSibling,0)}const Kb={insertParagraph:{isSoft:!1},insertLineBreak:{isSoft:!0}};class Zb extends ka{constructor(e){super(e);const t=this.document;let i=!1;t.on("keydown",((e,t)=>{i=t.shiftKey})),t.on("beforeinput",((n,s)=>{if(!this.isEnabled)return;let o=s.inputType;l.isSafari&&i&&"insertParagraph"==o&&(o="insertLineBreak");const r=s.domEvent,a=Kb[o];if(!a)return;const c=new _r(t,"enter",s.targetRanges[0]);t.fire(c,new Aa(e,r,{isSoft:a.isSoft})),c.stop.called&&n.stop()}))}observe(){}stopObserving(){}}class Jb extends so{static get pluginName(){return"Enter"}init(){const e=this.editor,t=e.editing.view,i=t.document,n=this.editor.t;t.addObserver(Zb),e.commands.add("enter",new qb(e)),this.listenTo(i,"enter",((n,s)=>{i.isComposing||s.preventDefault(),s.isSoft||(e.execute("enter"),t.scrollToTheSelection())}),{priority:"low"}),e.accessibility.addKeystrokeInfos({keystrokes:[{label:n("Insert a hard break (a new paragraph)"),keystroke:"Enter"}]})}}class Qb extends ro{execute(){const e=this.editor.model,t=e.document;e.change((i=>{!function(e,t,i){const n=i.isCollapsed,s=i.getFirstRange(),o=s.start.parent,r=s.end.parent,a=o==r;if(n){const n=Ub(e.schema,i.getAttributes());Yb(e,t,s.end),t.removeSelectionAttribute(i.getAttributeKeys()),t.setSelectionAttribute(n)}else{const n=!(s.start.isAtStart&&s.end.isAtEnd);e.deleteContent(i,{leaveUnmerged:n}),a?Yb(e,t,i.focus):n&&t.setSelection(r,0)}}(e,i,t.selection),this.fire("afterExecute",{writer:i})}))}refresh(){const e=this.editor.model,t=e.document;this.isEnabled=function(e,t){if(t.rangeCount>1)return!1;const i=t.anchor;if(!i||!e.checkChild(i,"softBreak"))return!1;const n=t.getFirstRange(),s=n.start.parent,o=n.end.parent;if((Xb(s,e)||Xb(o,e))&&s!==o)return!1;return!0}(e.schema,t.selection)}}function Yb(e,t,i){const n=t.createElement("softBreak");e.insertContent(n,i),t.setSelection(n,"after")}function Xb(e,t){return!e.is("rootElement")&&(t.isLimit(e)||Xb(e.parent,t))}class ew extends so{static get pluginName(){return"ShiftEnter"}init(){const e=this.editor,t=e.model.schema,i=e.conversion,n=e.editing.view,s=n.document,o=this.editor.t;t.register("softBreak",{allowWhere:"$text",isInline:!0}),i.for("upcast").elementToElement({model:"softBreak",view:"br"}),i.for("downcast").elementToElement({model:"softBreak",view:(e,{writer:t})=>t.createEmptyElement("br")}),n.addObserver(Zb),e.commands.add("shiftEnter",new Qb(e)),this.listenTo(s,"enter",((t,i)=>{s.isComposing||i.preventDefault(),i.isSoft&&(e.execute("shiftEnter"),n.scrollToTheSelection())}),{priority:"low"}),e.accessibility.addKeystrokeInfos({keystrokes:[{label:o("Insert a soft break (a <br> element)"),keystroke:"Shift+Enter"}]})}}class tw extends ro{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,i=t.schema,n=t.document.selection,s=Array.from(n.getSelectedBlocks()),o=void 0===e.forceValue?!this.value:e.forceValue;t.change((e=>{if(o){const t=s.filter((e=>iw(e)||sw(i,e)));this._applyQuote(e,t)}else this._removeQuote(e,s.filter(iw))}))}_getValue(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());return!(!e||!iw(e))}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,i=Zs(e.getSelectedBlocks());return!!i&&sw(t,i)}_removeQuote(e,t){nw(e,t).reverse().forEach((t=>{if(t.start.isAtStart&&t.end.isAtEnd)return void e.unwrap(t.start.parent);if(t.start.isAtStart){const i=e.createPositionBefore(t.start.parent);return void e.move(t,i)}t.end.isAtEnd||e.split(t.end);const i=e.createPositionAfter(t.end.parent);e.move(t,i)}))}_applyQuote(e,t){const i=[];nw(e,t).reverse().forEach((t=>{let n=iw(t.start);n||(n=e.createElement("blockQuote"),e.wrap(t,n)),i.push(n)})),i.reverse().reduce(((t,i)=>t.nextSibling==i?(e.merge(e.createPositionAfter(t)),t):i))}}function iw(e){return"blockQuote"==e.parent.name?e.parent:null}function nw(e,t){let i,n=0;const s=[];for(;n{const n=e.model.document.differ.getChanges();for(const e of n)if("insert"==e.type){const n=e.position.nodeAfter;if(!n)continue;if(n.is("element","blockQuote")&&n.isEmpty)return i.remove(n),!0;if(n.is("element","blockQuote")&&!t.checkChild(e.position,n))return i.unwrap(n),!0;if(n.is("element")){const e=i.createRangeIn(n);for(const n of e.getItems())if(n.is("element","blockQuote")&&!t.checkChild(i.createPositionBefore(n),n))return i.unwrap(n),!0}}else if("remove"==e.type){const t=e.position.parent;if(t.is("element","blockQuote")&&t.isEmpty)return i.remove(t),!0}return!1}));const i=this.editor.editing.view.document,n=e.model.document.selection,s=e.commands.get("blockQuote");this.listenTo(i,"enter",((t,i)=>{if(!n.isCollapsed||!s.value)return;n.getLastPosition().parent.isEmpty&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),i.preventDefault(),t.stop())}),{context:"blockquote"}),this.listenTo(i,"delete",((t,i)=>{if("backward"!=i.direction||!n.isCollapsed||!s.value)return;const o=n.getLastPosition().parent;o.isEmpty&&!o.previousSibling&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),i.preventDefault(),t.stop())}),{context:"blockquote"})}}class rw extends so{static get pluginName(){return"BlockQuoteUI"}init(){const e=this.editor,t=e.commands.get("blockQuote");e.ui.componentFactory.add("blockQuote",(()=>{const e=this._createButton(Ku);return e.set({tooltip:!0}),e.bind("isOn").to(t,"value"),e})),e.ui.componentFactory.add("menuBar:blockQuote",(()=>this._createButton(up)))}_createButton(e){const t=this.editor,i=t.locale,n=t.commands.get("blockQuote"),s=new e(t.locale),o=i.t;return s.set({label:o("Block quote"),icon:fu.quote,isToggleable:!0}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("blockQuote"),t.editing.view.focus()})),s}}class aw extends xa{constructor(e){super(e),this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"];const t=this.document;function i(e){return(i,n)=>{n.preventDefault();const s=n.dropRange?[n.dropRange]:null,o=new f(t,e);t.fire(o,{dataTransfer:n.dataTransfer,method:i.name,targetRanges:s,target:n.target,domEvent:n.domEvent}),o.stop.called&&n.stopPropagation()}}this.listenTo(t,"paste",i("clipboardInput"),{priority:"low"}),this.listenTo(t,"drop",i("clipboardInput"),{priority:"low"}),this.listenTo(t,"dragover",i("dragging"),{priority:"low"})}onDomEvent(e){const t="clipboardData"in e?e.clipboardData:e.dataTransfer,i="drop"==e.type||"paste"==e.type,n={dataTransfer:new ml(t,{cacheFiles:i})};"drop"!=e.type&&"dragover"!=e.type||(n.dropRange=function(e,t){const i=t.target.ownerDocument,n=t.clientX,s=t.clientY;let o;i.caretRangeFromPoint&&i.caretRangeFromPoint(n,s)?o=i.caretRangeFromPoint(n,s):t.rangeParent&&(o=i.createRange(),o.setStart(t.rangeParent,t.rangeOffset),o.collapse(!0));if(o)return e.domConverter.domRangeToView(o);return null}(this.view,e)),this.fire(e.type,e,n)}}const lw=["figcaption","li"],cw=["ol","ul"];function dw(e){if(e.is("$text")||e.is("$textProxy"))return e.data;if(e.is("element","img")&&e.hasAttribute("alt"))return e.getAttribute("alt");if(e.is("element","br"))return"\n";let t="",i=null;for(const n of e.getChildren())t+=hw(n,i)+dw(n),i=n;return t}function hw(e,t){return t?e.is("element","li")&&!e.isEmpty&&e.getChild(0).is("containerElement")||cw.includes(e.name)&&cw.includes(t.name)?"\n\n":e.is("containerElement")||t.is("containerElement")?lw.includes(e.name)||lw.includes(t.name)?"\n":"\n\n":"":""}const uw=function(e,t){return e&&xs(e,t,ci)};const mw=function(e,t,i,n){var s=i.length,o=s,r=!n;if(null==e)return!o;for(e=Object(e);s--;){var a=i[s];if(r&&a[2]?a[1]!==e[a[0]]:!(a[0]in e))return!1}for(;++se.model.getSelectedContent(e.model.document.selection))){return this.editor.model.change((n=>{const s=n.model.document.selection;n.setSelection(t);const o=this._insertFakeMarkersIntoSelection(n,n.model.document.selection,e),r=i(n),a=this._removeFakeMarkersInsideElement(n,r);for(const[e,t]of Object.entries(o)){a[e]||(a[e]=n.createRangeIn(r));for(const e of t)n.remove(e)}r.markers.clear();for(const[e,t]of Object.entries(a))r.markers.set(e,t);return n.setSelection(s),r}))}_pasteMarkersIntoTransformedElement(e,t){const i=this._getPasteMarkersFromRangeMap(e);return this.editor.model.change((e=>{const n=this._insertFakeMarkersElements(e,i),s=t(e),o=this._removeFakeMarkersInsideElement(e,s);for(const t of Object.values(n).flat())e.remove(t);for(const[t,i]of Object.entries(o))e.model.markers.has(t)||e.addMarker(t,{usingOperation:!0,affectsData:!0,range:i});return s}))}_pasteFragmentWithMarkers(e){const t=this._getPasteMarkersFromRangeMap(e.markers);e.markers.clear();for(const i of t)e.markers.set(i.name,i.range);return this.editor.model.insertContent(e)}_forceMarkersCopy(e,t,i={allowedActions:"all",copyPartiallySelected:!0,duplicateOnPaste:!0}){const n=this._markersToCopy.get(e);this._markersToCopy.set(e,i),t(),n?this._markersToCopy.set(e,n):this._markersToCopy.delete(e)}_isMarkerCopyable(e,t){const i=this._getMarkerClipboardConfig(e);if(!i)return!1;if(!t)return!0;const{allowedActions:n}=i;return"all"===n||n.includes(t)}_hasMarkerConfiguration(e){return!!this._getMarkerClipboardConfig(e)}_getMarkerClipboardConfig(e){const[t]=e.split(":");return this._markersToCopy.get(t)||null}_insertFakeMarkersIntoSelection(e,t,i){const n=this._getCopyableMarkersFromSelection(e,t,i);return this._insertFakeMarkersElements(e,n)}_getCopyableMarkersFromSelection(e,t,i){const n=Array.from(t.getRanges()),s=new Set(n.flatMap((t=>Array.from(e.model.markers.getMarkersIntersectingRange(t)))));return Array.from(s).filter((e=>{if(!this._isMarkerCopyable(e.name,i))return!1;const{copyPartiallySelected:t}=this._getMarkerClipboardConfig(e.name);if(!t){const t=e.getRange();return n.some((e=>e.containsRange(t,!0)))}return!0})).map((e=>({name:"dragstart"===i?this._getUniqueMarkerName(e.name):e.name,range:e.getRange()})))}_getPasteMarkersFromRangeMap(e,t=null){const{model:i}=this.editor;return(e instanceof Map?Array.from(e.entries()):Object.entries(e)).flatMap((([e,n])=>{if(!this._hasMarkerConfiguration(e))return[{name:e,range:n}];if(this._isMarkerCopyable(e,t)){const t=this._getMarkerClipboardConfig(e),s=i.markers.has(e)&&"$graveyard"===i.markers.get(e).getRange().root.rootName;return(t.duplicateOnPaste||s)&&(e=this._getUniqueMarkerName(e)),[{name:e,range:n}]}return[]}))}_insertFakeMarkersElements(e,t){const i={},n=t.flatMap((e=>{const{start:t,end:i}=e.range;return[{position:t,marker:e,type:"start"},{position:i,marker:e,type:"end"}]})).sort((({position:e},{position:t})=>e.isBefore(t)?1:-1));for(const{position:t,marker:s,type:o}of n){const n=e.createElement("$marker",{"data-name":s.name,"data-type":o});i[s.name]||(i[s.name]=[]),i[s.name].push(n),e.insert(n,t)}return i}_removeFakeMarkersInsideElement(e,t){const i=this._getAllFakeMarkersFromElement(e,t).reduce(((t,i)=>{const n=i.markerElement&&e.createPositionBefore(i.markerElement);let s=t[i.name],o=!1;if(s&&s.start&&s.end){this._getMarkerClipboardConfig(i.name).duplicateOnPaste?t[this._getUniqueMarkerName(i.name)]=t[i.name]:o=!0,s=null}return o||(t[i.name]={...s,[i.type]:n}),i.markerElement&&e.remove(i.markerElement),t}),{});return Ew(i,(i=>new Bl(i.start||e.createPositionFromPath(t,[0]),i.end||e.createPositionAt(t,"end"))))}_getAllFakeMarkersFromElement(e,t){const i=Array.from(e.createRangeIn(t)).flatMap((({item:e})=>{if(!e.is("element","$marker"))return[];const t=e.getAttribute("data-name"),i=e.getAttribute("data-type");return[{markerElement:e,name:t,type:i}]})),n=[],s=[];for(const e of i){if("end"===e.type){i.some((t=>t.name===e.name&&"start"===t.type))||n.push({markerElement:null,name:e.name,type:"start"})}if("start"===e.type){i.some((t=>t.name===e.name&&"end"===t.type))||s.unshift({markerElement:null,name:e.name,type:"end"})}}return[...n,...i,...s]}_getUniqueMarkerName(e){const t=e.split(":"),i=b().substring(1,6);return 3===t.length?`${t.slice(0,2).join(":")}:${i}`:`${t.join(":")}:${i}`}}class Sw extends so{static get pluginName(){return"ClipboardPipeline"}static get requires(){return[Tw]}init(){this.editor.editing.view.addObserver(aw),this._setupPasteDrop(),this._setupCopyCut()}_fireOutputTransformationEvent(e,t,i){const n=this.editor.plugins.get("ClipboardMarkersUtils");this.editor.model.enqueueChange({isUndoable:"cut"===i},(()=>{const s=n._copySelectedFragmentWithMarkers(i,t);this.fire("outputTransformation",{dataTransfer:e,content:s,method:i})}))}_setupPasteDrop(){const e=this.editor,t=e.model,i=e.editing.view,n=i.document,s=this.editor.plugins.get("ClipboardMarkersUtils");this.listenTo(n,"clipboardInput",((t,i)=>{"paste"!=i.method||e.model.canEditAt(e.model.document.selection)||t.stop()}),{priority:"highest"}),this.listenTo(n,"clipboardInput",((e,t)=>{const n=t.dataTransfer;let s;if(t.content)s=t.content;else{let e="";n.getData("text/html")?e=function(e){return e.replace(/(\s+)<\/span>/g,((e,t)=>1==t.length?" ":t)).replace(//g,"")}(n.getData("text/html")):n.getData("text/plain")&&(((o=(o=n.getData("text/plain")).replace(/&/g,"&").replace(//g,">").replace(/\r?\n\r?\n/g,"

    ").replace(/\r?\n/g,"
    ").replace(/\t/g,"    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

    ")||o.includes("
    "))&&(o=`

    ${o}

    `),e=o),s=this.editor.data.htmlProcessor.toView(e)}var o;const r=new f(this,"inputTransformation");this.fire(r,{content:s,dataTransfer:n,targetRanges:t.targetRanges,method:t.method}),r.stop.called&&e.stop(),i.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((e,i)=>{if(i.content.isEmpty)return;const n=this.editor.data.toModel(i.content,"$clipboardHolder");0!=n.childCount&&(e.stop(),t.change((()=>{this.fire("contentInsertion",{content:n,method:i.method,dataTransfer:i.dataTransfer,targetRanges:i.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((e,t)=>{t.resultRange=s._pasteFragmentWithMarkers(t.content)}),{priority:"low"})}_setupCopyCut(){const e=this.editor,t=e.model.document,i=e.editing.view.document,n=(e,i)=>{const n=i.dataTransfer;i.preventDefault(),this._fireOutputTransformationEvent(n,t.selection,e.name)};this.listenTo(i,"copy",n,{priority:"low"}),this.listenTo(i,"cut",((t,i)=>{e.model.canEditAt(e.model.document.selection)?n(t,i):i.preventDefault()}),{priority:"low"}),this.listenTo(this,"outputTransformation",((t,n)=>{const s=e.data.toView(n.content);i.fire("clipboardOutput",{dataTransfer:n.dataTransfer,content:s,method:n.method})}),{priority:"low"}),this.listenTo(i,"clipboardOutput",((i,n)=>{n.content.isEmpty||(n.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(n.content)),n.dataTransfer.setData("text/plain",dw(n.content))),"cut"==n.method&&e.model.deleteContent(t.selection)}),{priority:"low"})}}class Pw extends(V()){constructor(){super(...arguments),this._stack=[]}add(e,t){const i=this._stack,n=i[0];this._insertDescriptor(e);const s=i[0];n===s||Iw(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:t})}remove(e,t){const i=this._stack,n=i[0];this._removeDescriptor(e);const s=i[0];n===s||Iw(n,s)||this.fire("change:top",{oldDescriptor:n,newDescriptor:s,writer:t})}_insertDescriptor(e){const t=this._stack,i=t.findIndex((t=>t.id===e.id));if(Iw(e,t[i]))return;i>-1&&t.splice(i,1);let n=0;for(;t[n]&&Vw(t[n],e);)n++;t.splice(n,0,e)}_removeDescriptor(e){const t=this._stack,i=t.findIndex((t=>t.id===e));i>-1&&t.splice(i,1)}}function Iw(e,t){return e&&t&&e.priority==t.priority&&Rw(e.classes)==Rw(t.classes)}function Vw(e,t){return e.priority>t.priority||!(e.priorityRw(t.classes)}function Rw(e){return Array.isArray(e)?e.sort().join(","):e}const Ow='',Bw="ck-widget",Mw="ck-widget_selected";function Nw(e){return!!e.is("element")&&!!e.getCustomProperty("widget")}function Fw(e,t,i={}){if(!e.is("containerElement"))throw new y("widget-to-widget-wrong-element-type",null,{element:e});return t.setAttribute("contenteditable","false",e),t.addClass(Bw,e),t.setCustomProperty("widget",!0,e),e.getFillerOffset=Ww,t.setCustomProperty("widgetLabel",[],e),i.label&&function(e,t){const i=e.getCustomProperty("widgetLabel");i.push(t)}(e,i.label),i.hasSelectionHandle&&function(e,t){const i=t.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(e){const t=this.toDomElement(e),i=new qu;return i.set("content",Ow),i.render(),t.appendChild(i.element),t}));t.insert(t.createPositionAt(e,0),i),t.addClass(["ck-widget_with-selection-handle"],e)}(e,t),zw(e,t),e}function Dw(e,t,i){if(t.classes&&i.addClass(Cs(t.classes),e),t.attributes)for(const n in t.attributes)i.setAttribute(n,t.attributes[n],e)}function Lw(e,t,i){if(t.classes&&i.removeClass(Cs(t.classes),e),t.attributes)for(const n in t.attributes)i.removeAttribute(n,e)}function zw(e,t,i=Dw,n=Lw){const s=new Pw;s.on("change:top",((t,s)=>{s.oldDescriptor&&n(e,s.oldDescriptor,s.writer),s.newDescriptor&&i(e,s.newDescriptor,s.writer)}));t.setCustomProperty("addHighlight",((e,t,i)=>s.add(t,i)),e),t.setCustomProperty("removeHighlight",((e,t,i)=>s.remove(t,i)),e)}function Hw(e,t,i={}){return t.addClass(["ck-editor__editable","ck-editor__nested-editable"],e),t.setAttribute("role","textbox",e),t.setAttribute("tabindex","-1",e),i.label&&t.setAttribute("aria-label",i.label,e),t.setAttribute("contenteditable",e.isReadOnly?"false":"true",e),e.on("change:isReadOnly",((i,n,s)=>{t.setAttribute("contenteditable",s?"false":"true",e)})),e.on("change:isFocused",((i,n,s)=>{s?t.addClass("ck-editor__nested-editable_focused",e):t.removeClass("ck-editor__nested-editable_focused",e)})),zw(e,t),e}function $w(e,t){const i=e.getSelectedElement();if(i){const n=qw(e);if(n)return t.createRange(t.createPositionAt(i,n))}return t.schema.findOptimalInsertionRange(e)}function Ww(){return null}const jw="widget-type-around";function Uw(e,t,i){return!!e&&Nw(e)&&!i.isInline(t)}function qw(e){return e.getAttribute(jw)}const Gw=["before","after"],Kw=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,Zw="ck-widget__type-around_disabled";class Jw extends so{constructor(){super(...arguments),this._currentFakeCaretModelElement=null}static get pluginName(){return"WidgetTypeAround"}static get requires(){return[Jb,Yp]}init(){const e=this.editor,t=e.editing.view;this.on("change:isEnabled",((i,n,s)=>{t.change((e=>{for(const i of t.document.roots)s?e.removeClass(Zw,i):e.addClass(Zw,i)})),s||e.model.change((e=>{e.removeSelectionAttribute(jw)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){super.destroy(),this._currentFakeCaretModelElement=null}_insertParagraph(e,t){const i=this.editor,n=i.editing.view,s=i.model.schema.getAttributesWithProperty(e,"copyOnReplace",!0);i.execute("insertParagraph",{position:i.model.createPositionAt(e,t),attributes:s}),n.focus(),n.scrollToTheSelection()}_listenToIfEnabled(e,t,i,n){this.listenTo(e,t,((...e)=>{this.isEnabled&&i(...e)}),n)}_insertParagraphAccordingToFakeCaretPosition(){const e=this.editor.model.document.selection,t=qw(e);if(!t)return!1;const i=e.getSelectedElement();return this._insertParagraph(i,t),!0}_enableTypeAroundUIInjection(){const e=this.editor,t=e.model.schema,i=e.locale.t,n={before:i("Insert paragraph before block"),after:i("Insert paragraph after block")};e.editing.downcastDispatcher.on("insert",((e,s,o)=>{const r=o.mapper.toViewElement(s.item);if(r&&Uw(r,s.item,t)){!function(e,t,i){const n=e.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(e){const i=this.toDomElement(e);return function(e,t){for(const i of Gw){const n=new bu({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${i}`],title:t[i],"aria-hidden":"true"},children:[e.ownerDocument.importNode(Kw,!0)]});e.appendChild(n.render())}}(i,t),function(e){const t=new bu({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});e.appendChild(t.render())}(i),i}));e.insert(e.createPositionAt(i,"end"),n)}(o.writer,n,r);r.getCustomProperty("widgetLabel").push((()=>this.isEnabled?i("Press Enter to type after or press Shift + Enter to type before the widget"):""))}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const e=this.editor,t=e.model,i=t.document.selection,n=t.schema,s=e.editing.view;function o(e){return`ck-widget_type-around_show-fake-caret_${e}`}this._listenToIfEnabled(s.document,"arrowKey",((e,t)=>{this._handleArrowKeyPress(e,t)}),{context:[Nw,"$text"],priority:"high"}),this._listenToIfEnabled(i,"change:range",((t,i)=>{i.directChange&&e.model.change((e=>{e.removeSelectionAttribute(jw)}))})),this._listenToIfEnabled(t.document,"change:data",(()=>{const t=i.getSelectedElement();if(t){if(Uw(e.editing.mapper.toViewElement(t),t,n))return}e.model.change((e=>{e.removeSelectionAttribute(jw)}))})),this._listenToIfEnabled(e.editing.downcastDispatcher,"selection",((e,t,i)=>{const s=i.writer;if(this._currentFakeCaretModelElement){const e=i.mapper.toViewElement(this._currentFakeCaretModelElement);e&&(s.removeClass(Gw.map(o),e),this._currentFakeCaretModelElement=null)}const r=t.selection.getSelectedElement();if(!r)return;const a=i.mapper.toViewElement(r);if(!Uw(a,r,n))return;const l=qw(t.selection);l&&(s.addClass(o(l),a),this._currentFakeCaretModelElement=r)})),this._listenToIfEnabled(e.ui.focusTracker,"change:isFocused",((t,i,n)=>{n||e.model.change((e=>{e.removeSelectionAttribute(jw)}))}))}_handleArrowKeyPress(e,t){const i=this.editor,n=i.model,s=n.document.selection,o=n.schema,r=i.editing.view,a=function(e,t){const i=ks(e,t);return"down"===i||"right"===i}(t.keyCode,i.locale.contentLanguageDirection),l=r.document.selection.getSelectedElement();let c;Uw(l,i.editing.mapper.toModelElement(l),o)?c=this._handleArrowKeyPressOnSelectedWidget(a):s.isCollapsed?c=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):t.shiftKey||(c=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),c&&(t.preventDefault(),e.stop())}_handleArrowKeyPressOnSelectedWidget(e){const t=this.editor.model,i=qw(t.document.selection);return t.change((t=>{if(!i)return t.setSelectionAttribute(jw,e?"after":"before"),!0;if(!(i===(e?"after":"before")))return t.removeSelectionAttribute(jw),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(e){const t=this.editor,i=t.model,n=i.schema,s=t.plugins.get("Widget"),o=s._getObjectElementNextToSelection(e);return!!Uw(t.editing.mapper.toViewElement(o),o,n)&&(i.change((t=>{s._setSelectionOverElement(o),t.setSelectionAttribute(jw,e?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(e){const t=this.editor,i=t.model,n=i.schema,s=t.editing.mapper,o=i.document.selection,r=e?o.getLastPosition().nodeBefore:o.getFirstPosition().nodeAfter;return!!Uw(s.toViewElement(r),r,n)&&(i.change((t=>{t.setSelection(r,"on"),t.setSelectionAttribute(jw,e?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const e=this.editor,t=e.editing.view;this._listenToIfEnabled(t.document,"mousedown",((i,n)=>{const s=n.domTarget.closest(".ck-widget__type-around__button");if(!s)return;const o=function(e){return e.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(s),r=function(e,t){const i=e.closest(".ck-widget");return t.mapDomToView(i)}(s,t.domConverter),a=e.editing.mapper.toModelElement(r);this._insertParagraph(a,o),n.preventDefault(),i.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const e=this.editor,t=e.model.document.selection,i=e.editing.view;this._listenToIfEnabled(i.document,"enter",((i,n)=>{if("atTarget"!=i.eventPhase)return;const s=t.getSelectedElement(),o=e.editing.mapper.toViewElement(s),r=e.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:Uw(o,s,r)&&(this._insertParagraph(s,n.isSoft?"before":"after"),a=!0),a&&(n.preventDefault(),i.stop())}),{context:Nw})}_enableInsertingParagraphsOnTypingKeystroke(){const e=this.editor.editing.view.document;this._listenToIfEnabled(e,"insertText",((t,i)=>{this._insertParagraphAccordingToFakeCaretPosition()&&(i.selection=e.selection)}),{priority:"high"}),l.isAndroid?this._listenToIfEnabled(e,"keydown",((e,t)=>{229==t.keyCode&&this._insertParagraphAccordingToFakeCaretPosition()})):this._listenToIfEnabled(e,"compositionstart",(()=>{this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const e=this.editor,t=e.editing.view,i=e.model,n=i.schema;this._listenToIfEnabled(t.document,"delete",((t,s)=>{if("atTarget"!=t.eventPhase)return;const o=qw(i.document.selection);if(!o)return;const r=s.direction,a=i.document.selection.getSelectedElement(),l="forward"==r;if("before"===o===l)e.execute("delete",{selection:i.createSelection(a,"on")});else{const t=n.getNearestSelectionRange(i.createPositionAt(a,o),r);if(t)if(t.isCollapsed){const s=i.createSelection(t.start);if(i.modifySelection(s,{direction:r}),s.focus.isEqual(t.start)){const e=function(e,t){let i=t;for(const n of t.getAncestors({parentFirst:!0})){if(n.childCount>1||e.isLimit(n))break;i=n}return i}(n,t.start.parent);i.deleteContent(i.createSelection(e,"on"),{doNotAutoparagraph:!0})}else i.change((i=>{i.setSelection(t),e.execute(l?"deleteForward":"delete")}))}else i.change((i=>{i.setSelection(t),e.execute(l?"deleteForward":"delete")}))}s.preventDefault(),t.stop()}),{context:Nw})}_enableInsertContentIntegration(){const e=this.editor,t=this.editor.model,i=t.document.selection;this._listenToIfEnabled(e.model,"insertContent",((e,[n,s])=>{if(s&&!s.is("documentSelection"))return;const o=qw(i);return o?(e.stop(),t.change((e=>{const s=i.getSelectedElement(),r=t.createPositionAt(s,o),a=e.createSelection(r),l=t.insertContent(n,a);return e.setSelection(a),l}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const e=this.editor,t=this.editor.model.document.selection;this._listenToIfEnabled(e.model,"insertObject",((e,i)=>{const[,n,s={}]=i;if(n&&!n.is("documentSelection"))return;const o=qw(t);o&&(s.findOptimalPosition=o,i[3]=s)}),{priority:"high"})}_enableDeleteContentIntegration(){const e=this.editor,t=this.editor.model.document.selection;this._listenToIfEnabled(e.model,"deleteContent",((e,[i])=>{if(i&&!i.is("documentSelection"))return;qw(t)&&e.stop()}),{priority:"high"})}}function Qw(e){const t=e.model;return(i,n)=>{const s=n.keyCode==bs.arrowup,o=n.keyCode==bs.arrowdown,r=n.shiftKey,a=t.document.selection;if(!s&&!o)return;const l=o;if(r&&function(e,t){return!e.isCollapsed&&e.isBackward==t}(a,l))return;const c=function(e,t,i){const n=e.model;if(i){const e=t.isCollapsed?t.focus:t.getLastPosition(),i=Yw(n,e,"forward");if(!i)return null;const s=n.createRange(e,i),o=Xw(n.schema,s,"backward");return o?n.createRange(e,o):null}{const e=t.isCollapsed?t.focus:t.getFirstPosition(),i=Yw(n,e,"backward");if(!i)return null;const s=n.createRange(i,e),o=Xw(n.schema,s,"forward");return o?n.createRange(o,e):null}}(e,a,l);if(c){if(c.isCollapsed){if(a.isCollapsed)return;if(r)return}(c.isCollapsed||function(e,t,i){const n=e.model,s=e.view.domConverter;if(i){const e=n.createSelection(t.start);n.modifySelection(e),e.focus.isAtEnd||t.start.isEqual(e.focus)||(t=n.createRange(e.focus,t.end))}const o=e.mapper.toViewRange(t),r=s.viewRangeToDom(o),a=Hn.getDomRangeRects(r);let l;for(const e of a)if(void 0!==l){if(Math.round(e.top)>=l)return!1;l=Math.max(l,Math.round(e.bottom))}else l=Math.round(e.bottom);return!0}(e,c,l))&&(t.change((e=>{const i=l?c.end:c.start;if(r){const n=t.createSelection(a.anchor);n.setFocus(i),e.setSelection(n)}else e.setSelection(i)})),i.stop(),n.preventDefault(),n.stopPropagation())}}}function Yw(e,t,i){const n=e.schema,s=e.createRangeIn(t.root),o="forward"==i?"elementStart":"elementEnd";for(const{previousPosition:e,item:r,type:a}of s.getWalker({startPosition:t,direction:i})){if(n.isLimit(r)&&!n.isInline(r))return e;if(a==o&&n.isBlock(r))return null}return null}function Xw(e,t,i){const n="backward"==i?t.end:t.start;if(e.checkChild(n,"$text"))return n;for(const{nextPosition:n}of t.getWalker({direction:i}))if(e.checkChild(n,"$text"))return n;return null}class ev extends so{constructor(){super(...arguments),this._previouslySelected=new Set}static get pluginName(){return"Widget"}static get requires(){return[Jw,Yp]}init(){const e=this.editor,t=e.editing.view,i=t.document,n=e.t;this.editor.editing.downcastDispatcher.on("selection",((t,i,n)=>{const s=n.writer,o=i.selection;if(o.isCollapsed)return;const r=o.getSelectedElement();if(!r)return;const a=e.editing.mapper.toViewElement(r);var l;Nw(a)&&(n.consumable.consume(o,"selection")&&s.setSelection(s.createRangeOn(a),{fake:!0,label:(l=a,l.getCustomProperty("widgetLabel").reduce(((e,t)=>"function"==typeof t?e?e+". "+t():t():e?e+". "+t:t),""))}))})),this.editor.editing.downcastDispatcher.on("selection",((e,t,i)=>{this._clearPreviouslySelectedWidgets(i.writer);const n=i.writer,s=n.document.selection;let o=null;for(const e of s.getRanges())for(const t of e){const e=t.item;Nw(e)&&!tv(e,o)&&(n.addClass(Mw,e),this._previouslySelected.add(e),o=e)}}),{priority:"low"}),t.addObserver(vh),this.listenTo(i,"mousedown",((...e)=>this._onMousedown(...e))),this.listenTo(i,"arrowKey",((...e)=>{this._handleSelectionChangeOnArrowKeyPress(...e)}),{context:[Nw,"$text"]}),this.listenTo(i,"arrowKey",((...e)=>{this._preventDefaultOnArrowKeyPress(...e)}),{context:"$root"}),this.listenTo(i,"arrowKey",Qw(this.editor.editing),{context:"$text"}),this.listenTo(i,"delete",((e,t)=>{this._handleDelete("forward"==t.direction)&&(t.preventDefault(),e.stop())}),{context:"$root"}),this.listenTo(i,"tab",((e,t)=>{"atTarget"==e.eventPhase&&(t.shiftKey||this._selectFirstNestedEditable()&&(t.preventDefault(),e.stop()))}),{context:Nw,priority:"low"}),this.listenTo(i,"tab",((e,t)=>{t.shiftKey&&this._selectAncestorWidget()&&(t.preventDefault(),e.stop())}),{priority:"low"}),this.listenTo(i,"keydown",((e,t)=>{t.keystroke==bs.esc&&this._selectAncestorWidget()&&(t.preventDefault(),e.stop())}),{priority:"low"}),e.accessibility.addKeystrokeInfoGroup({id:"widget",label:n("Keystrokes that can be used when a widget is selected (for example: image, table, etc.)"),keystrokes:[{label:n("Insert a new paragraph directly after a widget"),keystroke:"Enter"},{label:n("Insert a new paragraph directly before a widget"),keystroke:"Shift+Enter"},{label:n("Move the caret to allow typing directly before a widget"),keystroke:[["arrowup"],["arrowleft"]]},{label:n("Move the caret to allow typing directly after a widget"),keystroke:[["arrowdown"],["arrowright"]]}]})}_onMousedown(e,t){const i=this.editor,n=i.editing.view,s=n.document;let o=t.target;if(t.domEvent.detail>=3)return void(this._selectBlockContent(o)&&t.preventDefault());if(function(e){let t=e;for(;t;){if(t.is("editableElement")&&!t.is("rootElement"))return!0;if(Nw(t))return!1;t=t.parent}return!1}(o))return;if(!Nw(o)&&(o=o.findAncestor(Nw),!o))return;l.isAndroid&&t.preventDefault(),s.isFocused||n.focus();const r=i.editing.mapper.toModelElement(o);this._setSelectionOverElement(r)}_selectBlockContent(e){const t=this.editor,i=t.model,n=t.editing.mapper,s=i.schema,o=n.findMappedViewAncestor(this.editor.editing.view.createPositionAt(e,0)),r=function(e,t){for(const i of e.getAncestors({includeSelf:!0,parentFirst:!0})){if(t.checkChild(i,"$text"))return i;if(t.isLimit(i)&&!t.isObject(i))break}return null}(n.toModelElement(o),i.schema);return!!r&&(i.change((e=>{const t=s.isLimit(r)?null:function(e,t){const i=new El({startPosition:e});for(const{item:e}of i){if(t.isLimit(e)||!e.is("element"))return null;if(t.checkChild(e,"$text"))return e}return null}(e.createPositionAfter(r),s),i=e.createPositionAt(r,0),n=t?e.createPositionAt(t,0):e.createPositionAt(r,"end");e.setSelection(e.createRange(i,n))})),!0)}_handleSelectionChangeOnArrowKeyPress(e,t){const i=t.keyCode,n=this.editor.model,s=n.schema,o=n.document.selection,r=o.getSelectedElement(),a=ks(i,this.editor.locale.contentLanguageDirection),l="down"==a||"right"==a,c="up"==a||"down"==a;if(r&&s.isObject(r)){const i=l?o.getLastPosition():o.getFirstPosition(),r=s.getNearestSelectionRange(i,l?"forward":"backward");return void(r&&(n.change((e=>{e.setSelection(r)})),t.preventDefault(),e.stop()))}if(!o.isCollapsed&&!t.shiftKey){const i=o.getFirstPosition(),r=o.getLastPosition(),a=i.nodeAfter,c=r.nodeBefore;return void((a&&s.isObject(a)||c&&s.isObject(c))&&(n.change((e=>{e.setSelection(l?r:i)})),t.preventDefault(),e.stop()))}if(!o.isCollapsed)return;const d=this._getObjectElementNextToSelection(l);if(d&&s.isObject(d)){if(s.isInline(d)&&c)return;this._setSelectionOverElement(d),t.preventDefault(),e.stop()}}_preventDefaultOnArrowKeyPress(e,t){const i=this.editor.model,n=i.schema,s=i.document.selection.getSelectedElement();s&&n.isObject(s)&&(t.preventDefault(),e.stop())}_handleDelete(e){const t=this.editor.model.document.selection;if(!this.editor.model.canEditAt(t))return;if(!t.isCollapsed)return;const i=this._getObjectElementNextToSelection(e);return i?(this.editor.model.change((e=>{let n=t.anchor.parent;for(;n.isEmpty;){const t=n;n=t.parent,e.remove(t)}this._setSelectionOverElement(i)})),!0):void 0}_setSelectionOverElement(e){this.editor.model.change((t=>{t.setSelection(t.createRangeOn(e))}))}_getObjectElementNextToSelection(e){const t=this.editor.model,i=t.schema,n=t.document.selection,s=t.createSelection(n);if(t.modifySelection(s,{direction:e?"forward":"backward"}),s.isEqual(n))return null;const o=e?s.focus.nodeBefore:s.focus.nodeAfter;return o&&i.isObject(o)?o:null}_clearPreviouslySelectedWidgets(e){for(const t of this._previouslySelected)e.removeClass(Mw,t);this._previouslySelected.clear()}_selectFirstNestedEditable(){const e=this.editor,t=this.editor.editing.view.document;for(const i of t.selection.getFirstRange().getItems())if(i.is("editableElement")){const t=e.editing.mapper.toModelElement(i);if(!t)continue;const n=e.model.createPositionAt(t,0),s=e.model.schema.getNearestSelectionRange(n,"forward");return e.model.change((e=>{e.setSelection(s)})),!0}return!1}_selectAncestorWidget(){const e=this.editor,t=e.editing.mapper,i=e.editing.view.document.selection.getFirstPosition().parent,n=(i.is("$text")?i.parent:i).findAncestor(Nw);if(!n)return!1;const s=t.toModelElement(n);return!!s&&(e.model.change((e=>{e.setSelection(s,"on")})),!0)}}function tv(e,t){return!!t&&Array.from(e.getAncestors()).includes(t)}class iv extends so{constructor(){super(...arguments),this._toolbarDefinitions=new Map}static get requires(){return[If]}static get pluginName(){return"WidgetToolbarRepository"}init(){const e=this.editor;if(e.plugins.has("BalloonToolbar")){const t=e.plugins.get("BalloonToolbar");this.listenTo(t,"show",(t=>{(function(e){const t=e.getSelectedElement();return!(!t||!Nw(t))})(e.editing.view.document.selection)&&t.stop()}),{priority:"high"})}this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()})),this.listenTo(e.ui,"update",(()=>{this._updateToolbarsVisibility()})),this.listenTo(e.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const e of this._toolbarDefinitions.values())e.view.destroy()}register(e,{ariaLabel:t,items:i,getRelatedElement:n,balloonClassName:s="ck-toolbar-container"}){if(!i.length)return void k("widget-toolbar-no-items",{toolbarId:e});const o=this.editor,r=o.t,a=new Pm(o.locale);if(a.ariaLabel=t||r("Widget toolbar"),this._toolbarDefinitions.has(e))throw new y("widget-toolbar-duplicated",this,{toolbarId:e});const l={view:a,getRelatedElement:n,balloonClassName:s,itemsConfig:i,initialized:!1};o.ui.addToolbar(a,{isContextual:!0,beforeFocus:()=>{const e=n(o.editing.view.document.selection);e&&this._showToolbar(l,e)},afterBlur:()=>{this._hideToolbar(l)}}),this._toolbarDefinitions.set(e,l)}_updateToolbarsVisibility(){let e=0,t=null,i=null;for(const n of this._toolbarDefinitions.values()){const s=n.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&s)if(this.editor.ui.focusTracker.isFocused){const o=s.getAncestors().length;o>e&&(e=o,t=s,i=n)}else this._isToolbarVisible(n)&&this._hideToolbar(n);else this._isToolbarInBalloon(n)&&this._hideToolbar(n)}i&&this._showToolbar(i,t)}_hideToolbar(e){this._balloon.remove(e.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(e,t){this._isToolbarVisible(e)?nv(this.editor,t):this._isToolbarInBalloon(e)||(e.initialized||(e.initialized=!0,e.view.fillFromConfig(e.itemsConfig,this.editor.ui.componentFactory)),this._balloon.add({view:e.view,position:sv(this.editor,t),balloonClassName:e.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",(()=>{for(const e of this._toolbarDefinitions.values())if(this._isToolbarVisible(e)){const t=e.getRelatedElement(this.editor.editing.view.document.selection);nv(this.editor,t)}})))}_isToolbarVisible(e){return this._balloon.visibleView===e.view}_isToolbarInBalloon(e){return this._balloon.hasView(e.view)}}function nv(e,t){const i=e.plugins.get("ContextualBalloon"),n=sv(e,t);i.updatePosition(n)}function sv(e,t){const i=e.editing.view,n=ef.defaultPositions;return{target:i.domConverter.mapViewToDom(t),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast,n.viewportStickyNorth]}}class ov extends(G()){constructor(e){super(),this.set("activeHandlePosition",null),this.set("proposedWidthPercents",null),this.set("proposedWidth",null),this.set("proposedHeight",null),this.set("proposedHandleHostWidth",null),this.set("proposedHandleHostHeight",null),this._options=e,this._referenceCoordinates=null}get originalWidth(){return this._originalWidth}get originalHeight(){return this._originalHeight}get originalWidthPercents(){return this._originalWidthPercents}get aspectRatio(){return this._aspectRatio}begin(e,t,i){const n=new Hn(t);this.activeHandlePosition=function(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const i of t)if(e.classList.contains(rv(i)))return i}(e),this._referenceCoordinates=function(e,t){const i=new Hn(e),n=t.split("-"),s={x:"right"==n[1]?i.right:i.left,y:"bottom"==n[0]?i.bottom:i.top};return s.x+=e.ownerDocument.defaultView.scrollX,s.y+=e.ownerDocument.defaultView.scrollY,s}(t,function(e){const t=e.split("-"),i={top:"bottom",bottom:"top",left:"right",right:"left"};return`${i[t[0]]}-${i[t[1]]}`}(this.activeHandlePosition)),this._originalWidth=n.width,this._originalHeight=n.height,this._aspectRatio=n.width/n.height;const s=i.style.width;s&&s.match(/^\d+(\.\d*)?%$/)?this._originalWidthPercents=parseFloat(s):this._originalWidthPercents=function(e,t){const i=e.parentElement;let n=parseFloat(i.ownerDocument.defaultView.getComputedStyle(i).width);const s=5;let o=0,r=i;for(;isNaN(n);){if(r=r.parentElement,++o>s)return 0;n=parseFloat(i.ownerDocument.defaultView.getComputedStyle(r).width)}return t.width/n*100}(i,n)}update(e){this.proposedWidth=e.width,this.proposedHeight=e.height,this.proposedWidthPercents=e.widthPercents,this.proposedHandleHostWidth=e.handleHostWidth,this.proposedHandleHostHeight=e.handleHostHeight}}function rv(e){return`ck-widget__resizer__handle-${e}`}class av extends Du{constructor(){super();const e=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-size-view",e.to("_viewPosition",(e=>e?`ck-orientation-${e}`:""))],style:{display:e.if("_isVisible","none",(e=>!e))}},children:[{text:e.to("_label")}]})}_bindToState(e,t){this.bind("_isVisible").to(t,"proposedWidth",t,"proposedHeight",((e,t)=>null!==e&&null!==t)),this.bind("_label").to(t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",t,"proposedWidthPercents",((t,i,n)=>"px"===e.unit?`${t}×${i}`:`${n}%`)),this.bind("_viewPosition").to(t,"activeHandlePosition",t,"proposedHandleHostWidth",t,"proposedHandleHostHeight",((e,t,i)=>t<50||i<50?"above-center":e))}_dismiss(){this.unbind(),this._isVisible=!1}}class lv extends(G()){constructor(e){super(),this._viewResizerWrapper=null,this._options=e,this.set("isEnabled",!0),this.set("isSelected",!1),this.bind("isVisible").to(this,"isEnabled",this,"isSelected",((e,t)=>e&&t)),this.decorate("begin"),this.decorate("cancel"),this.decorate("commit"),this.decorate("updateSize"),this.on("commit",(e=>{this.state.proposedWidth||this.state.proposedWidthPercents||(this._cleanup(),e.stop())}),{priority:"high"})}get state(){return this._state}show(){this._options.editor.editing.view.change((e=>{e.removeClass("ck-hidden",this._viewResizerWrapper)}))}hide(){this._options.editor.editing.view.change((e=>{e.addClass("ck-hidden",this._viewResizerWrapper)}))}attach(){const e=this,t=this._options.viewElement;this._options.editor.editing.view.change((i=>{const n=i.createUIElement("div",{class:"ck ck-reset_all ck-widget__resizer"},(function(t){const i=this.toDomElement(t);return e._appendHandles(i),e._appendSizeUI(i),i}));i.insert(i.createPositionAt(t,"end"),n),i.addClass("ck-widget_with-resizer",t),this._viewResizerWrapper=n,this.isVisible||this.hide()})),this.on("change:isVisible",(()=>{this.isVisible?(this.show(),this.redraw()):this.hide()}))}begin(e){this._state=new ov(this._options),this._sizeView._bindToState(this._options,this.state),this._initialViewWidth=this._options.viewElement.getStyle("width"),this.state.begin(e,this._getHandleHost(),this._getResizeHost())}updateSize(e){const t=this._proposeNewSize(e);this._options.editor.editing.view.change((e=>{const i=this._options.unit||"%",n=("%"===i?t.widthPercents:t.width)+i;e.setStyle("width",n,this._options.viewElement)}));const i=this._getHandleHost(),n=new Hn(i),s=Math.round(n.width),o=Math.round(n.height),r=new Hn(i);t.width=Math.round(r.width),t.height=Math.round(r.height),this.redraw(n),this.state.update({...t,handleHostWidth:s,handleHostHeight:o})}commit(){const e=this._options.unit||"%",t=("%"===e?this.state.proposedWidthPercents:this.state.proposedWidth)+e;this._options.editor.editing.view.change((()=>{this._cleanup(),this._options.onCommit(t)}))}cancel(){this._cleanup()}destroy(){this.cancel()}redraw(e){const t=this._domResizerWrapper;if(!((i=t)&&i.ownerDocument&&i.ownerDocument.contains(i)))return;var i;const n=t.parentElement,s=this._getHandleHost(),o=this._viewResizerWrapper,r=[o.getStyle("width"),o.getStyle("height"),o.getStyle("left"),o.getStyle("top")];let a;if(n.isSameNode(s)){const t=e||new Hn(s);a=[t.width+"px",t.height+"px",void 0,void 0]}else a=[s.offsetWidth+"px",s.offsetHeight+"px",s.offsetLeft+"px",s.offsetTop+"px"];"same"!==te(r,a)&&this._options.editor.editing.view.change((e=>{e.setStyle({width:a[0],height:a[1],left:a[2],top:a[3]},o)}))}containsHandle(e){return this._domResizerWrapper.contains(e)}static isResizeHandle(e){return e.classList.contains("ck-widget__resizer__handle")}_cleanup(){this._sizeView._dismiss();this._options.editor.editing.view.change((e=>{e.setStyle("width",this._initialViewWidth,this._options.viewElement)}))}_proposeNewSize(e){const t=this.state,i={x:(n=e).pageX,y:n.pageY};var n;const s=!this._options.isCentered||this._options.isCentered(this),o={x:t._referenceCoordinates.x-(i.x+t.originalWidth),y:i.y-t.originalHeight-t._referenceCoordinates.y};s&&t.activeHandlePosition.endsWith("-right")&&(o.x=i.x-(t._referenceCoordinates.x+t.originalWidth)),s&&(o.x*=2);let r=Math.abs(t.originalWidth+o.x),a=Math.abs(t.originalHeight+o.y);return"width"==(r/t.aspectRatio>a?"width":"height")?a=r/t.aspectRatio:r=a*t.aspectRatio,{width:Math.round(r),height:Math.round(a),widthPercents:Math.min(Math.round(t.originalWidthPercents/t.originalWidth*r*100)/100,100)}}_getResizeHost(){const e=this._domResizerWrapper.parentElement;return this._options.getResizeHost(e)}_getHandleHost(){const e=this._domResizerWrapper.parentElement;return this._options.getHandleHost(e)}get _domResizerWrapper(){return this._options.editor.editing.view.domConverter.mapViewToDom(this._viewResizerWrapper)}_appendHandles(e){const t=["top-left","top-right","bottom-right","bottom-left"];for(const n of t)e.appendChild(new bu({tag:"div",attributes:{class:"ck-widget__resizer__handle "+(i=n,`ck-widget__resizer__handle-${i}`)}}).render());var i}_appendSizeUI(e){this._sizeView=new av,this._sizeView.render(),e.appendChild(this._sizeView.element)}}class cv extends so{constructor(){super(...arguments),this._resizers=new Map}static get pluginName(){return"WidgetResize"}init(){const e=this.editor.editing,t=Mn.window.document;this.set("selectedResizer",null),this.set("_activeResizer",null),e.view.addObserver(vh),this._observer=new(Vn()),this.listenTo(e.view.document,"mousedown",this._mouseDownListener.bind(this),{priority:"high"}),this._observer.listenTo(t,"mousemove",this._mouseMoveListener.bind(this)),this._observer.listenTo(t,"mouseup",this._mouseUpListener.bind(this)),this._redrawSelectedResizerThrottled=cf((()=>this.redrawSelectedResizer()),200),this.editor.ui.on("update",this._redrawSelectedResizerThrottled),this.editor.model.document.on("change",(()=>{for(const[e,t]of this._resizers)e.isAttached()||(this._resizers.delete(e),t.destroy())}),{priority:"lowest"}),this._observer.listenTo(Mn.window,"resize",this._redrawSelectedResizerThrottled);const i=this.editor.editing.view.document.selection;i.on("change",(()=>{const e=i.getSelectedElement(),t=this.getResizerByViewElement(e)||null;t?this.select(t):this.deselect()}))}redrawSelectedResizer(){this.selectedResizer&&this.selectedResizer.isVisible&&this.selectedResizer.redraw()}destroy(){super.destroy(),this._observer.stopListening();for(const e of this._resizers.values())e.destroy();this._redrawSelectedResizerThrottled.cancel()}select(e){this.deselect(),this.selectedResizer=e,this.selectedResizer.isSelected=!0}deselect(){this.selectedResizer&&(this.selectedResizer.isSelected=!1),this.selectedResizer=null}attachTo(e){const t=new lv(e),i=this.editor.plugins;if(t.attach(),i.has("WidgetToolbarRepository")){const e=i.get("WidgetToolbarRepository");t.on("begin",(()=>{e.forceDisabled("resize")}),{priority:"lowest"}),t.on("cancel",(()=>{e.clearForceDisabled("resize")}),{priority:"highest"}),t.on("commit",(()=>{e.clearForceDisabled("resize")}),{priority:"highest"})}this._resizers.set(e.viewElement,t);const n=this.editor.editing.view.document.selection.getSelectedElement();return this.getResizerByViewElement(n)==t&&this.select(t),t}getResizerByViewElement(e){return this._resizers.get(e)}_getResizerByHandle(e){for(const t of this._resizers.values())if(t.containsHandle(e))return t}_mouseDownListener(e,t){const i=t.domTarget;lv.isResizeHandle(i)&&(this._activeResizer=this._getResizerByHandle(i)||null,this._activeResizer&&(this._activeResizer.begin(i),e.stop(),t.preventDefault()))}_mouseMoveListener(e,t){this._activeResizer&&this._activeResizer.updateSize(t)}_mouseUpListener(){this._activeResizer&&(this._activeResizer.commit(),this._activeResizer=null)}}const dv=Zn("px");class hv extends Du{constructor(){super();const e=this.bindTemplate;this.set({isVisible:!1,left:null,top:null,width:null}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-clipboard-drop-target-line",e.if("isVisible","ck-hidden",(e=>!e))],style:{left:e.to("left",(e=>dv(e))),top:e.to("top",(e=>dv(e))),width:e.to("width",(e=>dv(e)))}}})}}class uv extends so{constructor(){super(...arguments),this.removeDropMarkerDelayed=Xs((()=>this.removeDropMarker()),40),this._updateDropMarkerThrottled=cf((e=>this._updateDropMarker(e)),40),this._reconvertMarkerThrottled=cf((()=>{this.editor.model.markers.has("drop-target")&&this.editor.editing.reconvertMarker("drop-target")}),0),this._dropTargetLineView=new hv,this._domEmitter=new(Vn()),this._scrollables=new Map}static get pluginName(){return"DragDropTarget"}init(){this._setupDropMarker()}destroy(){this._domEmitter.stopListening();for(const{resizeObserver:e}of this._scrollables.values())e.destroy();return this._updateDropMarkerThrottled.cancel(),this.removeDropMarkerDelayed.cancel(),this._reconvertMarkerThrottled.cancel(),super.destroy()}updateDropMarker(e,t,i,n,s,o){this.removeDropMarkerDelayed.cancel();const r=mv(this.editor,e,t,i,n,s,o);if(r)return o&&o.containsRange(r)?this.removeDropMarker():void this._updateDropMarkerThrottled(r)}getFinalDropRange(e,t,i,n,s,o){const r=mv(this.editor,e,t,i,n,s,o);return this.removeDropMarker(),r}removeDropMarker(){const e=this.editor.model;this.removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),this._dropTargetLineView.isVisible=!1,e.markers.has("drop-target")&&e.change((e=>{e.removeMarker("drop-target")}))}_setupDropMarker(){const e=this.editor;e.ui.view.body.add(this._dropTargetLineView),e.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),e.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(t,{writer:i})=>{if(e.model.schema.checkChild(t.markerRange.start,"$text"))return this._dropTargetLineView.isVisible=!1,this._createDropTargetPosition(i);t.markerRange.isCollapsed?this._updateDropTargetLine(t.markerRange):this._dropTargetLineView.isVisible=!1}})}_updateDropMarker(e){const t=this.editor,i=t.model.markers;t.model.change((t=>{i.has("drop-target")?i.get("drop-target").getRange().isEqual(e)||t.updateMarker("drop-target",{range:e}):t.addMarker("drop-target",{range:e,usingOperation:!1,affectsData:!1})}))}_createDropTargetPosition(e){return e.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(e){const t=this.toDomElement(e);return t.append("⁠",e.createElement("span"),"⁠"),t}))}_updateDropTargetLine(e){const t=this.editor.editing,i=e.start.nodeBefore,n=e.start.nodeAfter,s=e.start.parent,o=i?t.mapper.toViewElement(i):null,r=o?t.view.domConverter.mapViewToDom(o):null,a=n?t.mapper.toViewElement(n):null,l=a?t.view.domConverter.mapViewToDom(a):null,c=t.mapper.toViewElement(s);if(!c)return;const d=t.view.domConverter.mapViewToDom(c),h=this._getScrollableRect(c),{scrollX:u,scrollY:m}=Mn.window,g=r?new Hn(r):null,f=l?new Hn(l):null,p=new Hn(d).excludeScrollbarsAndBorders(),b=g?g.bottom:p.top,w=f?f.top:p.bottom,v=Mn.window.getComputedStyle(d),_=b<=w?(b+w)/2:w;if(h.top<_&&_a.schema.checkChild(o,e)))){if(a.schema.checkChild(o,"$text"))return a.createRange(o);if(t)return fv(e,bv(e,t.parent),n,s)}}}else if(a.schema.isInline(c))return fv(e,c,n,s);if(a.schema.isBlock(c))return fv(e,c,n,s);if(a.schema.checkChild(c,"$block")){const t=Array.from(c.getChildren()).filter((t=>t.is("element")&&!gv(e,t)));let i=0,o=t.length;if(0==o)return a.createRange(a.createPositionAt(c,"end"));for(;i{i?(this.forceDisabled("readOnlyMode"),this._isBlockDragging=!1):this.clearForceDisabled("readOnlyMode")})),l.isAndroid&&this.forceDisabled("noAndroidSupport"),e.plugins.has("BlockToolbar")){const t=e.plugins.get("BlockToolbar").buttonView.element;this._domEmitter.listenTo(t,"dragstart",((e,t)=>this._handleBlockDragStart(t))),this._domEmitter.listenTo(Mn.document,"dragover",((e,t)=>this._handleBlockDragging(t))),this._domEmitter.listenTo(Mn.document,"drop",((e,t)=>this._handleBlockDragging(t))),this._domEmitter.listenTo(Mn.document,"dragend",(()=>this._handleBlockDragEnd()),{useCapture:!0}),this.isEnabled&&t.setAttribute("draggable","true"),this.on("change:isEnabled",((e,i,n)=>{t.setAttribute("draggable",n?"true":"false")}))}}destroy(){return this._domEmitter.stopListening(),super.destroy()}_handleBlockDragStart(e){if(!this.isEnabled)return;const t=this.editor.model,i=t.document.selection,n=this.editor.editing.view,s=Array.from(i.getSelectedBlocks()),o=t.createRange(t.createPositionBefore(s[0]),t.createPositionAfter(s[s.length-1]));t.change((e=>e.setSelection(o))),this._isBlockDragging=!0,n.focus(),n.getObserver(aw).onDomEvent(e)}_handleBlockDragging(e){if(!this.isEnabled||!this._isBlockDragging)return;const t=e.clientX+("ltr"==this.editor.locale.contentLanguageDirection?100:-100),i=e.clientY,n=document.elementFromPoint(t,i),s=this.editor.editing.view;n&&n.closest(".ck-editor__editable")&&s.getObserver(aw).onDomEvent({...e,type:e.type,dataTransfer:e.dataTransfer,target:n,clientX:t,clientY:i,preventDefault:()=>e.preventDefault(),stopPropagation:()=>e.stopPropagation()})}_handleBlockDragEnd(){this._isBlockDragging=!1}}class vv extends so{constructor(){super(...arguments),this._clearDraggableAttributesDelayed=Xs((()=>this._clearDraggableAttributes()),40),this._blockMode=!1,this._domEmitter=new(Vn())}static get pluginName(){return"DragDrop"}static get requires(){return[Sw,ev,uv,wv]}init(){const e=this.editor,t=e.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,t.addObserver(aw),t.addObserver(vh),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDraggableAttributeHandling(),this.listenTo(e,"change:isReadOnly",((e,t,i)=>{i?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((e,t,i)=>{i||this._finalizeDragging(!1)})),l.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._previewContainer&&this._previewContainer.remove(),this._domEmitter.stopListening(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const e=this.editor,t=e.model,i=e.editing.view,n=i.document,s=e.plugins.get(uv);this.listenTo(n,"dragstart",((e,i)=>{if(i.target&&i.target.is("editableElement"))return void i.preventDefault();if(this._prepareDraggedRange(i.target),!this._draggedRange)return void i.preventDefault();this._draggingUid=b(),i.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",i.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const n=t.createSelection(this._draggedRange.toRange());this.editor.plugins.get("ClipboardPipeline")._fireOutputTransformationEvent(i.dataTransfer,n,"dragstart");const{dataTransfer:s,domTarget:o,domEvent:r}=i,{clientX:a}=r;this._updatePreview({dataTransfer:s,domTarget:o,clientX:a}),i.stopPropagation(),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(n,"dragend",((e,t)=>{this._finalizeDragging(!t.dataTransfer.isCanceled&&"move"==t.dataTransfer.dropEffect)}),{priority:"low"}),this._domEmitter.listenTo(Mn.document,"dragend",(()=>{this._blockMode=!1}),{useCapture:!0}),this.listenTo(n,"dragenter",(()=>{this.isEnabled&&i.focus()})),this.listenTo(n,"dragleave",(()=>{s.removeDropMarkerDelayed()})),this.listenTo(n,"dragging",((e,t)=>{if(!this.isEnabled)return void(t.dataTransfer.dropEffect="none");const{clientX:i,clientY:n}=t.domEvent;s.updateDropMarker(t.target,t.targetRanges,i,n,this._blockMode,this._draggedRange),this._draggedRange||(t.dataTransfer.dropEffect="copy"),l.isGecko||("copy"==t.dataTransfer.effectAllowed?t.dataTransfer.dropEffect="copy":["all","copyMove"].includes(t.dataTransfer.effectAllowed)&&(t.dataTransfer.dropEffect="move")),e.stop()}),{priority:"low"})}_setupClipboardInputIntegration(){const e=this.editor,t=e.editing.view.document,i=e.plugins.get(uv);this.listenTo(t,"clipboardInput",((t,n)=>{if("drop"!=n.method)return;const{clientX:s,clientY:o}=n.domEvent,r=i.getFinalDropRange(n.target,n.targetRanges,s,o,this._blockMode,this._draggedRange);if(!r)return this._finalizeDragging(!1),void t.stop();this._draggedRange&&this._draggingUid!=n.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==_v(n.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(r,!0))return this._finalizeDragging(!1),void t.stop();n.targetRanges=[e.editing.mapper.toViewRange(r)]}),{priority:"high"})}_setupContentInsertionIntegration(){const e=this.editor.plugins.get(Sw);e.on("contentInsertion",((e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const i=t.targetRanges.map((e=>this.editor.editing.mapper.toModelRange(e)));this.editor.model.change((e=>e.setSelection(i)))}),{priority:"high"}),e.on("contentInsertion",((e,t)=>{if(!this.isEnabled||"drop"!==t.method)return;const i="move"==_v(t.dataTransfer),n=!t.resultRange||!t.resultRange.isCollapsed;this._finalizeDragging(n&&i)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const e=this.editor,t=e.editing.view,i=t.document;this.listenTo(i,"mousedown",((n,s)=>{if(l.isAndroid||!s)return;this._clearDraggableAttributesDelayed.cancel();let o=yv(s.target);if(l.isBlink&&!e.isReadOnly&&!o&&!i.selection.isCollapsed){const e=i.selection.getSelectedElement();e&&Nw(e)||(o=i.selection.editableElement)}o&&(t.change((e=>{e.setAttribute("draggable","true",o)})),this._draggableElement=e.editing.mapper.toModelElement(o))})),this.listenTo(i,"mouseup",(()=>{l.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const e=this.editor.editing;e.view.change((t=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&t.removeAttribute("draggable",e.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_finalizeDragging(e){const t=this.editor,i=t.model;if(t.plugins.get(uv).removeDropMarker(),this._clearDraggableAttributes(),t.plugins.has("WidgetToolbarRepository")){t.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop")}this._draggingUid="",this._previewContainer&&(this._previewContainer.remove(),this._previewContainer=void 0),this._draggedRange&&(e&&this.isEnabled&&i.change((e=>{const t=i.createSelection(this._draggedRange);i.deleteContent(t,{doNotAutoparagraph:!0});const n=t.getFirstPosition().parent;n.isEmpty&&!i.schema.checkChild(n,"$text")&&i.schema.checkChild(n,"paragraph")&&e.insertElement("paragraph",n,0)})),this._draggedRange.detach(),this._draggedRange=null)}_prepareDraggedRange(e){const t=this.editor,i=t.model,n=i.document.selection,s=e?yv(e):null;if(s){const e=t.editing.mapper.toModelElement(s);if(this._draggedRange=Kl.fromRange(i.createRangeOn(e)),this._blockMode=i.schema.isBlock(e),t.plugins.has("WidgetToolbarRepository")){t.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}return}if(n.isCollapsed&&!n.getFirstPosition().parent.isEmpty)return;const o=Array.from(n.getSelectedBlocks()),r=n.getFirstRange();if(0==o.length)return void(this._draggedRange=Kl.fromRange(r));const a=kv(i,o);if(o.length>1)this._draggedRange=Kl.fromRange(a),this._blockMode=!0;else if(1==o.length){const e=r.start.isTouching(a.start)&&r.end.isTouching(a.end);this._draggedRange=Kl.fromRange(e?a:r),this._blockMode=e}i.change((e=>e.setSelection(this._draggedRange.toRange())))}_updatePreview({dataTransfer:e,domTarget:t,clientX:i}){const n=this.editor.editing.view,s=n.document.selection.editableElement,o=n.domConverter.mapViewToDom(s),r=Mn.window.getComputedStyle(o);this._previewContainer?this._previewContainer.firstElementChild&&this._previewContainer.removeChild(this._previewContainer.firstElementChild):(this._previewContainer=ve(Mn.document,"div",{style:"position: fixed; left: -999999px;"}),Mn.document.body.appendChild(this._previewContainer));const a=new Hn(o);if(o.contains(t))return;const c=parseFloat(r.paddingLeft),d=ve(Mn.document,"div");d.className="ck ck-content",d.style.width=r.width,d.style.paddingLeft=`${a.left-i+c}px`,l.isiOS&&(d.style.backgroundColor="white"),d.innerHTML=e.getData("text/html"),e.setDragImage(d,0,0),this._previewContainer.appendChild(d)}}function _v(e){return l.isGecko?e.dropEffect:["all","copyMove"].includes(e.effectAllowed)?"move":"copy"}function yv(e){if(e.is("editableElement"))return null;if(e.hasClass("ck-widget__selection-handle"))return e.findAncestor(Nw);if(Nw(e))return e;const t=e.findAncestor((e=>Nw(e)||e.is("editableElement")));return Nw(t)?t:null}function kv(e,t){const i=t[0],n=t[t.length-1],s=i.getCommonAncestor(n),o=e.createPositionBefore(i),r=e.createPositionAfter(n);if(s&&s.is("element")&&!e.schema.isLimit(s)){const t=e.createRangeOn(s),i=o.isTouching(t.start),n=r.isTouching(t.end);if(i&&n)return kv(e,[s])}return e.createRange(o,r)}class Cv extends so{static get pluginName(){return"PastePlainText"}static get requires(){return[Sw]}init(){const e=this.editor,t=e.model,i=e.editing.view,n=i.document,s=t.document.selection;let o=!1;i.addObserver(aw),this.listenTo(n,"keydown",((e,t)=>{o=t.shiftKey})),e.plugins.get(Sw).on("contentInsertion",((e,i)=>{(o||function(e,t){if(e.childCount>1)return!1;const i=e.getChild(0);if(t.isObject(i))return!1;return 0==Array.from(i.getAttributeKeys()).length}(i.content,t.schema))&&t.change((e=>{const n=Array.from(s.getAttributes()).filter((([e])=>t.schema.getAttributeProperties(e).isFormatting));s.isCollapsed||t.deleteContent(s,{doNotAutoparagraph:!0}),n.push(...s.getAttributes());const o=e.createRangeIn(i.content);for(const t of o.getItems())t.is("$textProxy")&&e.setAttributes(n,t)}))}))}}class Av extends so{static get pluginName(){return"Clipboard"}static get requires(){return[Tw,Sw,vv,Cv]}init(){const e=this.editor,t=this.editor.t;e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Copy selected content"),keystroke:"CTRL+C"},{label:t("Paste content"),keystroke:"CTRL+V"},{label:t("Paste content as plain text"),keystroke:"CTRL+SHIFT+V"}]})}}class xv extends ro{constructor(e){super(e),this.affectsData=!1}execute(){const e=this.editor.model,t=e.document.selection;let i=e.schema.getLimitElement(t);if(t.containsEntireContent(i)||!Ev(e.schema,i))do{if(i=i.parent,!i)return}while(!Ev(e.schema,i));e.change((e=>{e.setSelection(i,"in")}))}}function Ev(e,t){return e.isLimit(t)&&(e.checkChild(t,"$text")||e.checkChild(t,"paragraph"))}const Tv=_s("Ctrl+A");class Sv extends so{static get pluginName(){return"SelectAllEditing"}init(){const e=this.editor,t=e.t,i=e.editing.view.document;e.commands.add("selectAll",new xv(e)),this.listenTo(i,"keydown",((t,i)=>{vs(i)===Tv&&(e.execute("selectAll"),i.preventDefault())})),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Select all"),keystroke:"CTRL+A"}]})}}class Pv extends so{static get pluginName(){return"SelectAllUI"}init(){const e=this.editor;e.ui.componentFactory.add("selectAll",(()=>{const e=this._createButton(Ku);return e.set({tooltip:!0}),e})),e.ui.componentFactory.add("menuBar:selectAll",(()=>this._createButton(up)))}_createButton(e){const t=this.editor,i=t.locale,n=t.commands.get("selectAll"),s=new e(t.locale),o=i.t;return s.set({label:o("Select all"),icon:'',keystroke:"Ctrl+A"}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("selectAll"),t.editing.view.focus()})),s}}class Iv extends so{static get requires(){return[Sv,Pv]}static get pluginName(){return"SelectAll"}}class Vv extends ro{constructor(e){super(e),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this._isEnabledBasedOnSelection=!1,this.listenTo(e.data,"set",((e,t)=>{t[1]={...t[1]};const i=t[1];i.batchType||(i.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(e.data,"set",((e,t)=>{t[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}get createdBatches(){return this._createdBatches}addBatch(e){const t=this.editor.model.document.selection,i={ranges:t.hasOwnRange?Array.from(t.getRanges()):[],isBackward:t.isBackward};this._stack.push({batch:e,selection:i}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(e,t,i){const n=this.editor.model,s=n.document,o=[],r=e.map((e=>e.getTransformedByOperations(i))),a=r.flat();for(const e of r){const t=e.filter((e=>e.root!=s.graveyard)).filter((e=>!Ov(e,a)));t.length&&(Rv(t),o.push(t[0]))}o.length&&n.change((e=>{e.setSelection(o,{backward:t})}))}_undo(e,t){const i=this.editor.model,n=i.document;this._createdBatches.add(t);const s=e.operations.slice().filter((e=>e.isDocumentOperation));s.reverse();for(const e of s){const s=e.baseVersion+1,o=Array.from(n.history.getOperations(s)),r=Ed([e.getReversed()],o,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(let s of r){const o=s.affectedSelectable;o&&!i.canEditAt(o)&&(s=new pd(s.baseVersion)),t.addOperation(s),i.applyOperation(s),n.history.setOperationAsUndone(e,s)}}}}function Rv(e){e.sort(((e,t)=>e.start.isBefore(t.start)?-1:1));for(let t=1;tt!==e&&t.containsRange(e,!0)))}class Bv extends Vv{execute(e=null){const t=e?this._stack.findIndex((t=>t.batch==e)):this._stack.length-1,i=this._stack.splice(t,1)[0],n=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(n,(()=>{this._undo(i.batch,n);const e=this.editor.model.document.history.getOperations(i.batch.baseVersion);this._restoreSelection(i.selection.ranges,i.selection.isBackward,e)})),this.fire("revert",i.batch,n),this.refresh()}}class Mv extends Vv{execute(){const e=this._stack.pop(),t=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(t,(()=>{const i=e.batch.operations[e.batch.operations.length-1].baseVersion+1,n=this.editor.model.document.history.getOperations(i);this._restoreSelection(e.selection.ranges,e.selection.isBackward,n),this._undo(e.batch,t)})),this.refresh()}}class Nv extends so{constructor(){super(...arguments),this._batchRegistry=new WeakSet}static get pluginName(){return"UndoEditing"}init(){const e=this.editor,t=e.t;this._undoCommand=new Bv(e),this._redoCommand=new Mv(e),e.commands.add("undo",this._undoCommand),e.commands.add("redo",this._redoCommand),this.listenTo(e.model,"applyOperation",((e,t)=>{const i=t[0];if(!i.isDocumentOperation)return;const n=i.batch,s=this._redoCommand.createdBatches.has(n),o=this._undoCommand.createdBatches.has(n);this._batchRegistry.has(n)||(this._batchRegistry.add(n),n.isUndoable&&(s?this._undoCommand.addBatch(n):o||(this._undoCommand.addBatch(n),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((e,t,i)=>{this._redoCommand.addBatch(i)})),e.keystrokes.set("CTRL+Z","undo"),e.keystrokes.set("CTRL+Y","redo"),e.keystrokes.set("CTRL+SHIFT+Z","redo"),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Undo"),keystroke:"CTRL+Z"},{label:t("Redo"),keystroke:[["CTRL+Y"],["CTRL+SHIFT+Z"]]}]})}}class Fv extends so{static get pluginName(){return"UndoUI"}init(){const e=this.editor,t=e.locale,i=e.t,n="ltr"==t.uiLanguageDirection?fu.undo:fu.redo,s="ltr"==t.uiLanguageDirection?fu.redo:fu.undo;this._addButtonsToFactory("undo",i("Undo"),"CTRL+Z",n),this._addButtonsToFactory("redo",i("Redo"),"CTRL+Y",s)}_addButtonsToFactory(e,t,i,n){const s=this.editor;s.ui.componentFactory.add(e,(()=>{const s=this._createButton(Ku,e,t,i,n);return s.set({tooltip:!0}),s})),s.ui.componentFactory.add("menuBar:"+e,(()=>this._createButton(up,e,t,i,n)))}_createButton(e,t,i,n,s){const o=this.editor,r=o.locale,a=o.commands.get(t),l=new e(r);return l.set({label:i,icon:s,keystroke:n}),l.bind("isEnabled").to(a,"isEnabled"),this.listenTo(l,"execute",(()=>{o.execute(t),o.editing.view.focus()})),l}}class Dv extends so{static get requires(){return[Nv,Fv]}static get pluginName(){return"Undo"}}class Lv extends ro{constructor(e,t){super(e),this.attributeKey=t}refresh(){const e=this.editor.model,t=e.document;this.value=t.selection.getAttribute(this.attributeKey),this.isEnabled=e.schema.checkAttributeInSelection(t.selection,this.attributeKey)}execute(e={}){const t=this.editor.model,i=t.document.selection,n=e.value,s=e.batch,o=e=>{if(i.isCollapsed)n?e.setSelectionAttribute(this.attributeKey,n):e.removeSelectionAttribute(this.attributeKey);else{const s=t.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const t of s)n?e.setAttribute(this.attributeKey,n,t):e.removeAttribute(this.attributeKey,t)}};s?t.enqueueChange(s,(e=>{o(e)})):t.change((e=>{o(e)}))}}const zv="fontSize",Hv="fontFamily",$v="fontColor",Wv="fontBackgroundColor";function jv(e,t){const i={model:{key:e,values:[]},view:{},upcastAlso:{}};for(const e of t)i.model.values.push(e.model),i.view[e.model]=e.view,e.upcastAlso&&(i.upcastAlso[e.model]=e.upcastAlso);return i}function Uv(e){return t=>t.getStyle(e).replace(/\s/g,"")}function qv(e){return(t,{writer:i})=>i.createAttributeElement("span",{style:`${e}:${t}`},{priority:7})}class Gv extends Lv{constructor(e){super(e,Hv)}}function Kv(e){return e.map(Zv).filter((e=>void 0!==e))}function Zv(e){return"object"==typeof e?e:"default"===e?{title:"Default",model:void 0}:"string"==typeof e?function(e){const t=e.replace(/"|'/g,"").split(","),i=t[0],n=t.map(Jv).join(", ");return{title:i,model:n,view:{name:"span",styles:{"font-family":n},priority:7}}}(e):void 0}function Jv(e){return(e=e.trim()).indexOf(" ")>0&&(e=`'${e}'`),e}class Qv extends so{static get pluginName(){return"FontFamilyEditing"}constructor(e){super(e),e.config.define(Hv,{options:["default","Arial, Helvetica, sans-serif","Courier New, Courier, monospace","Georgia, serif","Lucida Sans Unicode, Lucida Grande, sans-serif","Tahoma, Geneva, sans-serif","Times New Roman, Times, serif","Trebuchet MS, Helvetica, sans-serif","Verdana, Geneva, sans-serif"],supportAllValues:!1})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:Hv}),e.model.schema.setAttributeProperties(Hv,{isFormatting:!0,copyOnEnter:!0});const t=Kv(e.config.get("fontFamily.options")).filter((e=>e.model)),i=jv(Hv,t);e.config.get("fontFamily.supportAllValues")?(this._prepareAnyValueConverters(),this._prepareCompatibilityConverter()):e.conversion.attributeToElement(i),e.commands.add(Hv,new Gv(e))}_prepareAnyValueConverters(){const e=this.editor;e.conversion.for("downcast").attributeToElement({model:Hv,view:(e,{writer:t})=>t.createAttributeElement("span",{style:"font-family:"+e},{priority:7})}),e.conversion.for("upcast").elementToAttribute({model:{key:Hv,value:e=>e.getStyle("font-family")},view:{name:"span",styles:{"font-family":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{face:/.*/}},model:{key:Hv,value:e=>e.getAttribute("face")}})}}const Yv='';class Xv extends so{static get pluginName(){return"FontFamilyUI"}init(){const e=this.editor,t=e.t,i=this._getLocalizedOptions(),n=e.commands.get(Hv),s=t("Font Family"),o=function(e,t){const i=new Ks;for(const n of e){const e={type:"button",model:new Sf({commandName:Hv,commandParam:n.model,label:n.title,role:"menuitemradio",withText:!0})};e.model.bind("isOn").to(t,"value",(e=>e===n.model||!(!e||!n.model)&&e.split(",")[0].replace(/'/g,"").toLowerCase()===n.model.toLowerCase())),n.view&&"string"!=typeof n.view&&n.view.styles&&e.model.set("labelStyle",`font-family: ${n.view.styles["font-family"]}`),i.add(e)}return i}(i,n);e.ui.componentFactory.add(Hv,(t=>{const i=Dm(t);return Hm(i,o,{role:"menu",ariaLabel:s}),i.buttonView.set({label:s,icon:Yv,tooltip:!0}),i.extendTemplate({attributes:{class:"ck-font-family-dropdown"}}),i.bind("isEnabled").to(n),this.listenTo(i,"execute",(t=>{e.execute(t.source.commandName,{value:t.source.commandParam}),e.editing.view.focus()})),i})),e.ui.componentFactory.add(`menuBar:${Hv}`,(t=>{const i=new dp(t);i.buttonView.set({label:s,icon:Yv}),i.bind("isEnabled").to(n);const r=new hp(t);for(const n of o){const s=new qf(t,i),o=new up(t);o.bind(...Object.keys(n.model)).to(n.model),o.bind("ariaChecked").to(o,"isOn"),o.delegate("execute").to(i),o.on("execute",(()=>{e.execute(n.model.commandName,{value:n.model.commandParam}),e.editing.view.focus()})),s.children.add(o),r.items.add(s)}return i.panelView.children.add(r),i}))}_getLocalizedOptions(){const e=this.editor,t=e.t;return Kv(e.config.get(Hv).options).map((e=>("Default"===e.title&&(e.title=t("Default")),e)))}}class e_ extends Lv{constructor(e){super(e,zv)}}function t_(e){return e.map((e=>function(e){"number"==typeof e&&(e=String(e));if("object"==typeof e&&(t=e,t.title&&t.model&&t.view))return n_(e);var t;const i=function(e){return"string"==typeof e?i_[e]:i_[e.model]}(e);if(i)return n_(i);if("default"===e)return{model:void 0,title:"Default"};if(function(e){let t;if("object"==typeof e){if(!e.model)throw new y("font-size-invalid-definition",null,e);t=parseFloat(e.model)}else t=parseFloat(e);return isNaN(t)}(e))return;return function(e){"string"==typeof e&&(e={title:e,model:`${parseFloat(e)}px`});return e.view={name:"span",styles:{"font-size":e.model}},n_(e)}(e)}(e))).filter((e=>void 0!==e))}const i_={get tiny(){return{title:"Tiny",model:"tiny",view:{name:"span",classes:"text-tiny",priority:7}}},get small(){return{title:"Small",model:"small",view:{name:"span",classes:"text-small",priority:7}}},get big(){return{title:"Big",model:"big",view:{name:"span",classes:"text-big",priority:7}}},get huge(){return{title:"Huge",model:"huge",view:{name:"span",classes:"text-huge",priority:7}}}};function n_(e){return e.view&&"string"!=typeof e.view&&!e.view.priority&&(e.view.priority=7),e}const s_=["x-small","x-small","small","medium","large","x-large","xx-large","xxx-large"];class o_ extends so{static get pluginName(){return"FontSizeEditing"}constructor(e){super(e),e.config.define(zv,{options:["tiny","small","default","big","huge"],supportAllValues:!1})}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:zv}),e.model.schema.setAttributeProperties(zv,{isFormatting:!0,copyOnEnter:!0});const t=e.config.get("fontSize.supportAllValues"),i=t_(this.editor.config.get("fontSize.options")).filter((e=>e.model)),n=jv(zv,i);t?(this._prepareAnyValueConverters(n),this._prepareCompatibilityConverter()):e.conversion.attributeToElement(n),e.commands.add(zv,new e_(e))}_prepareAnyValueConverters(e){const t=this.editor,i=e.model.values.filter((e=>!Rh(String(e))&&!Bh(String(e))));if(i.length)throw new y("font-size-invalid-use-of-named-presets",null,{presets:i});t.conversion.for("downcast").attributeToElement({model:zv,view:(e,{writer:t})=>{if(e)return t.createAttributeElement("span",{style:"font-size:"+e},{priority:7})}}),t.conversion.for("upcast").elementToAttribute({model:{key:zv,value:e=>e.getStyle("font-size")},view:{name:"span",styles:{"font-size":/.*/}}})}_prepareCompatibilityConverter(){this.editor.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{size:/^[+-]?\d{1,3}$/}},model:{key:zv,value:e=>{const t=e.getAttribute("size"),i="-"===t[0]||"+"===t[0];let n=parseInt(t,10);i&&(n=3+n);const s=s_.length-1,o=Math.min(Math.max(n,0),s);return s_[o]}}})}}const r_='';class a_ extends so{static get pluginName(){return"FontSizeUI"}init(){const e=this.editor,t=e.t,i=this._getLocalizedOptions(),n=e.commands.get(zv),s=t("Font Size"),o=function(e,t){const i=new Ks;for(const n of e){const e={type:"button",model:new Sf({commandName:zv,commandParam:n.model,label:n.title,class:"ck-fontsize-option",role:"menuitemradio",withText:!0})};n.view&&"string"!=typeof n.view&&(n.view.styles&&e.model.set("labelStyle",`font-size:${n.view.styles["font-size"]}`),n.view.classes&&e.model.set("class",`${e.model.class} ${n.view.classes}`)),e.model.bind("isOn").to(t,"value",(e=>e===n.model)),i.add(e)}return i}(i,n);e.ui.componentFactory.add(zv,(t=>{const i=Dm(t);return Hm(i,o,{role:"menu",ariaLabel:s}),i.buttonView.set({label:s,icon:r_,tooltip:!0}),i.extendTemplate({attributes:{class:["ck-font-size-dropdown"]}}),i.bind("isEnabled").to(n),this.listenTo(i,"execute",(t=>{e.execute(t.source.commandName,{value:t.source.commandParam}),e.editing.view.focus()})),i})),e.ui.componentFactory.add(`menuBar:${zv}`,(t=>{const i=new dp(t);i.buttonView.set({label:s,icon:r_}),i.bind("isEnabled").to(n);const r=new hp(t);for(const n of o){const s=new qf(t,i),o=new up(t);o.bind(...Object.keys(n.model)).to(n.model),o.bind("ariaChecked").to(o,"isOn"),o.delegate("execute").to(i),o.on("execute",(()=>{e.execute(n.model.commandName,{value:n.model.commandParam}),e.editing.view.focus()})),s.children.add(o),r.items.add(s)}return i.panelView.children.add(r),i}))}_getLocalizedOptions(){const e=this.editor,t=e.t,i={Default:t("Default"),Tiny:t("Tiny"),Small:t("Small"),Big:t("Big"),Huge:t("Huge")};return t_(e.config.get(zv).options).map((e=>{const t=i[e.title];return t&&t!=e.title&&(e=Object.assign({},e,{title:t})),e}))}}class l_ extends Lv{constructor(e){super(e,$v)}}class c_ extends so{static get pluginName(){return"FontColorEditing"}constructor(e){super(e),e.config.define($v,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5}),e.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{color:/[\s\S]+/}},model:{key:$v,value:Uv("color")}}),e.conversion.for("upcast").elementToAttribute({view:{name:"font",attributes:{color:/^#?\w+$/}},model:{key:$v,value:e=>e.getAttribute("color")}}),e.conversion.for("downcast").attributeToElement({model:$v,view:qv("color")}),e.commands.add($v,new l_(e)),e.model.schema.extend("$text",{allowAttributes:$v}),e.model.schema.setAttributeProperties($v,{isFormatting:!0,copyOnEnter:!0})}}class d_ extends so{constructor(e,{commandName:t,componentName:i,icon:n,dropdownLabel:s}){super(e),this.commandName=t,this.componentName=i,this.icon=n,this.dropdownLabel=s,this.columns=e.config.get(`${this.componentName}.columns`)}init(){const e=this.editor,t=e.locale,i=t.t,n=e.commands.get(this.commandName),s=e.config.get(this.componentName),o=em(t,tm(s.colors)),r=s.documentColors,a=!1!==s.colorPicker;e.ui.componentFactory.add(this.componentName,(t=>{const l=Dm(t);let c=!1;const d=function({dropdownView:e,colors:t,columns:i,removeButtonLabel:n,colorPickerLabel:s,documentColorsLabel:o,documentColorsCount:r,colorPickerViewConfig:a}){const l=e.locale,c=new Og(l,{colors:t,columns:i,removeButtonLabel:n,colorPickerLabel:s,documentColorsLabel:o,documentColorsCount:r,colorPickerViewConfig:a});return e.colorSelectorView=c,e.panelView.children.add(c),c}({dropdownView:l,colors:o.map((e=>({label:e.label,color:e.model,options:{hasBorder:e.hasBorder}}))),columns:this.columns,removeButtonLabel:i("Remove color"),colorPickerLabel:i("Color picker"),documentColorsLabel:0!==r?i("Document colors"):"",documentColorsCount:void 0===r?this.columns:r,colorPickerViewConfig:!!a&&(s.colorPicker||{})});return d.bind("selectedColor").to(n,"value"),l.buttonView.set({label:this.dropdownLabel,icon:this.icon,tooltip:!0}),l.extendTemplate({attributes:{class:"ck-color-ui-dropdown"}}),l.bind("isEnabled").to(n),d.on("execute",((t,i)=>{l.isOpen&&e.execute(this.commandName,{value:i.value,batch:this._undoStepBatch}),"colorPicker"!==i.source&&e.editing.view.focus(),"colorPickerSaveButton"===i.source&&(l.isOpen=!1)})),d.on("colorPicker:show",(()=>{this._undoStepBatch=e.model.createBatch()})),d.on("colorPicker:cancel",(()=>{this._undoStepBatch.operations.length&&(l.isOpen=!1,e.execute("undo",this._undoStepBatch)),e.editing.view.focus()})),l.on("change:isOpen",((t,i,n)=>{c||(c=!0,l.colorSelectorView.appendUI()),n&&(0!==r&&d.updateDocumentColors(e.model,this.componentName),d.updateSelectedColors(),d.showColorGridsFragment())})),Wm(l,(()=>l.colorSelectorView.colorGridsFragmentView.staticColorsGrid.items.find((e=>e.isOn)))),l})),e.ui.componentFactory.add(`menuBar:${this.componentName}`,(t=>{const s=new dp(t);s.buttonView.set({label:this.dropdownLabel,icon:this.icon}),s.bind("isEnabled").to(n);let a=!1;const l=new Og(t,{colors:o.map((e=>({label:e.label,color:e.model,options:{hasBorder:e.hasBorder}}))),columns:this.columns,removeButtonLabel:i("Remove color"),colorPickerLabel:i("Color picker"),documentColorsLabel:0!==r?i("Document colors"):"",documentColorsCount:void 0===r?this.columns:r,colorPickerViewConfig:!1});return l.bind("selectedColor").to(n,"value"),l.delegate("execute").to(s),l.on("execute",((t,i)=>{e.execute(this.commandName,{value:i.value,batch:this._undoStepBatch}),e.editing.view.focus()})),s.on("change:isOpen",((t,i,n)=>{a||(a=!0,l.appendUI()),n&&(0!==r&&l.updateDocumentColors(e.model,this.componentName),l.updateSelectedColors(),l.showColorGridsFragment())})),s.panelView.children.add(l),s}))}}class h_ extends d_{constructor(e){const t=e.locale.t;super(e,{commandName:$v,componentName:$v,icon:'',dropdownLabel:t("Font Color")})}static get pluginName(){return"FontColorUI"}}class u_ extends Lv{constructor(e){super(e,Wv)}}class m_ extends so{static get pluginName(){return"FontBackgroundColorEditing"}constructor(e){super(e),e.config.define(Wv,{colors:[{color:"hsl(0, 0%, 0%)",label:"Black"},{color:"hsl(0, 0%, 30%)",label:"Dim grey"},{color:"hsl(0, 0%, 60%)",label:"Grey"},{color:"hsl(0, 0%, 90%)",label:"Light grey"},{color:"hsl(0, 0%, 100%)",label:"White",hasBorder:!0},{color:"hsl(0, 75%, 60%)",label:"Red"},{color:"hsl(30, 75%, 60%)",label:"Orange"},{color:"hsl(60, 75%, 60%)",label:"Yellow"},{color:"hsl(90, 75%, 60%)",label:"Light green"},{color:"hsl(120, 75%, 60%)",label:"Green"},{color:"hsl(150, 75%, 60%)",label:"Aquamarine"},{color:"hsl(180, 75%, 60%)",label:"Turquoise"},{color:"hsl(210, 75%, 60%)",label:"Light blue"},{color:"hsl(240, 75%, 60%)",label:"Blue"},{color:"hsl(270, 75%, 60%)",label:"Purple"}],columns:5}),e.data.addStyleProcessorRules(Kh),e.conversion.for("upcast").elementToAttribute({view:{name:"span",styles:{"background-color":/[\s\S]+/}},model:{key:Wv,value:Uv("background-color")}}),e.conversion.for("downcast").attributeToElement({model:Wv,view:qv("background-color")}),e.commands.add(Wv,new u_(e)),e.model.schema.extend("$text",{allowAttributes:Wv}),e.model.schema.setAttributeProperties(Wv,{isFormatting:!0,copyOnEnter:!0})}}class g_ extends d_{constructor(e){const t=e.locale.t;super(e,{commandName:Wv,componentName:Wv,icon:'',dropdownLabel:t("Font Background Color")})}static get pluginName(){return"FontBackgroundColorUI"}}class f_ extends ro{constructor(e){super(e),this._isEnabledBasedOnSelection=!1}refresh(){const e=this.editor.model,t=Zs(e.document.selection.getSelectedBlocks());this.value=!!t&&t.is("element","paragraph"),this.isEnabled=!!t&&p_(t,e.schema)}execute(e={}){const t=this.editor.model,i=t.document,n=e.selection||i.selection;t.canEditAt(n)&&t.change((e=>{const i=n.getSelectedBlocks();for(const n of i)!n.is("element","paragraph")&&p_(n,t.schema)&&e.rename(n,"paragraph")}))}}function p_(e,t){return t.checkChild(e.parent,"paragraph")&&!t.isObject(e)}class b_ extends ro{constructor(e){super(e),this._isEnabledBasedOnSelection=!1}execute(e){const t=this.editor.model,i=e.attributes;let n=e.position;t.canEditAt(n)&&t.change((e=>{if(n=this._findPositionToInsertParagraph(n,e),!n)return;const s=e.createElement("paragraph");i&&t.schema.setAllowedAttributes(s,i,e),t.insertContent(s,n),e.setSelection(s,"in")}))}_findPositionToInsertParagraph(e,t){const i=this.editor.model;if(i.schema.checkChild(e,"paragraph"))return e;const n=i.schema.findAllowedParent(e,"paragraph");if(!n)return null;const s=e.parent,o=i.schema.checkChild(s,"$text");return s.isEmpty||o&&e.isAtEnd?i.createPositionAfter(s):!s.isEmpty&&o&&e.isAtStart?i.createPositionBefore(s):t.split(e,n).position}}class w_ extends so{static get pluginName(){return"Paragraph"}init(){const e=this.editor,t=e.model;e.commands.add("paragraph",new f_(e)),e.commands.add("insertParagraph",new b_(e)),t.schema.register("paragraph",{inheritAllFrom:"$block"}),e.conversion.elementToElement({model:"paragraph",view:"p"}),e.conversion.for("upcast").elementToElement({model:(e,{writer:t})=>w_.paragraphLikeElements.has(e.name)?e.isEmpty?null:t.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}}w_.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);const v_=w_;class __ extends ro{constructor(e,t){super(e),this.modelElements=t}refresh(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());this.value=!!e&&this.modelElements.includes(e.name)&&e.name,this.isEnabled=!!e&&this.modelElements.some((t=>y_(e,t,this.editor.model.schema)))}execute(e){const t=this.editor.model,i=t.document,n=e.value;t.change((e=>{const s=Array.from(i.selection.getSelectedBlocks()).filter((e=>y_(e,n,t.schema)));for(const t of s)t.is("element",n)||e.rename(t,n)}))}}function y_(e,t,i){return i.checkChild(e.parent,t)&&!i.isObject(e)}const k_="paragraph";class C_ extends so{static get pluginName(){return"HeadingEditing"}constructor(e){super(e),e.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[v_]}init(){const e=this.editor,t=e.config.get("heading.options"),i=[];for(const n of t)"paragraph"!==n.model&&(e.model.schema.register(n.model,{inheritAllFrom:"$block"}),e.conversion.elementToElement(n),i.push(n.model));this._addDefaultH1Conversion(e),e.commands.add("heading",new __(e,i))}afterInit(){const e=this.editor,t=e.commands.get("enter"),i=e.config.get("heading.options");t&&this.listenTo(t,"afterExecute",((t,n)=>{const s=e.model.document.selection.getFirstPosition().parent;i.some((e=>s.is("element",e.model)))&&!s.is("element",k_)&&0===s.childCount&&n.writer.rename(s,k_)}))}_addDefaultH1Conversion(e){e.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:w.low+1})}}class A_ extends so{static get pluginName(){return"HeadingUI"}init(){const e=this.editor,t=e.t,i=function(e){const t=e.t,i={Paragraph:t("Paragraph"),"Heading 1":t("Heading 1"),"Heading 2":t("Heading 2"),"Heading 3":t("Heading 3"),"Heading 4":t("Heading 4"),"Heading 5":t("Heading 5"),"Heading 6":t("Heading 6")};return e.config.get("heading.options").map((e=>{const t=i[e.title];return t&&t!=e.title&&(e.title=t),e}))}(e),n=t("Choose heading"),s=t("Heading");e.ui.componentFactory.add("heading",(t=>{const o={},r=new Ks,a=e.commands.get("heading"),l=e.commands.get("paragraph"),c=[a];for(const e of i){const t={type:"button",model:new Sf({label:e.title,class:e.class,role:"menuitemradio",withText:!0})};"paragraph"===e.model?(t.model.bind("isOn").to(l,"value"),t.model.set("commandName","paragraph"),c.push(l)):(t.model.bind("isOn").to(a,"value",(t=>t===e.model)),t.model.set({commandName:"heading",commandValue:e.model})),r.add(t),o[e.model]=e.title}const d=Dm(t);return Hm(d,r,{ariaLabel:s,role:"menu"}),d.buttonView.set({ariaLabel:s,ariaLabelledBy:void 0,isOn:!1,withText:!0,tooltip:s}),d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),d.bind("isEnabled").toMany(c,"isEnabled",((...e)=>e.some((e=>e)))),d.buttonView.bind("label").to(a,"value",l,"value",((e,t)=>{const i=t?"paragraph":e;return"boolean"==typeof i?n:o[i]?o[i]:n})),d.buttonView.bind("ariaLabel").to(a,"value",l,"value",((e,t)=>{const i=t?"paragraph":e;return"boolean"==typeof i?s:o[i]?`${o[i]}, ${s}`:s})),this.listenTo(d,"execute",(t=>{const{commandName:i,commandValue:n}=t.source;e.execute(i,n?{value:n}:void 0),e.editing.view.focus()})),d})),e.ui.componentFactory.add("menuBar:heading",(n=>{const s=new dp(n),o=e.commands.get("heading"),r=e.commands.get("paragraph"),a=[o],l=new hp(n);s.set({class:"ck-heading-dropdown"}),l.set({ariaLabel:t("Heading"),role:"menu"}),s.buttonView.set({label:t("Heading")}),s.panelView.children.add(l);for(const t of i){const i=new qf(n,s),c=new up(n);i.children.add(c),l.items.add(i),c.set({label:t.title,role:"menuitemradio",class:t.class}),c.bind("ariaChecked").to(c,"isOn"),c.delegate("execute").to(s),c.on("execute",(()=>{const i="paragraph"===t.model?"paragraph":"heading";e.execute(i,{value:t.model}),e.editing.view.focus()})),"paragraph"===t.model?(c.bind("isOn").to(r,"value"),a.push(r)):c.bind("isOn").to(o,"value",(e=>e===t.model))}return s.bind("isEnabled").toMany(a,"isEnabled",((...e)=>e.some((e=>e)))),s}))}}new Set(["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"]);class x_ extends ro{refresh(){const e=this.editor.model,t=e.schema,i=e.document.selection;this.isEnabled=function(e,t,i){const n=function(e,t){const i=$w(e,t),n=i.start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(e,i);return t.checkChild(n,"horizontalLine")}(i,t,e)}execute(){const e=this.editor.model;e.change((t=>{const i=t.createElement("horizontalLine");e.insertObject(i,null,null,{setSelection:"after"})}))}}class E_ extends so{static get pluginName(){return"HorizontalLineEditing"}init(){const e=this.editor,t=e.model.schema,i=e.t,n=e.conversion;t.register("horizontalLine",{inheritAllFrom:"$blockObject"}),n.for("dataDowncast").elementToElement({model:"horizontalLine",view:(e,{writer:t})=>t.createEmptyElement("hr")}),n.for("editingDowncast").elementToStructure({model:"horizontalLine",view:(e,{writer:t})=>{const n=i("Horizontal line"),s=t.createContainerElement("div",null,t.createEmptyElement("hr"));return t.addClass("ck-horizontal-line",s),t.setCustomProperty("hr",!0,s),function(e,t,i){return t.setCustomProperty("horizontalLine",!0,e),Fw(e,t,{label:i})}(s,t,n)}}),n.for("upcast").elementToElement({view:"hr",model:"horizontalLine"}),e.commands.add("horizontalLine",new x_(e))}}class T_ extends so{static get pluginName(){return"HorizontalLineUI"}init(){const e=this.editor;e.ui.componentFactory.add("horizontalLine",(()=>{const e=this._createButton(Ku);return e.set({tooltip:!0}),e})),e.ui.componentFactory.add("menuBar:horizontalLine",(()=>this._createButton(up)))}_createButton(e){const t=this.editor,i=t.locale,n=t.commands.get("horizontalLine"),s=new e(t.locale),o=i.t;return s.set({label:o("Horizontal line"),icon:fu.horizontalLine}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>{t.execute("horizontalLine"),t.editing.view.focus()})),s}}const S_=function(e,t,i,n){var s=-1,o=null==e?0:e.length;for(n&&o&&(i=e[++s]);++s=n?e:Jo(e,t,i)};var dy=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const hy=function(e){return dy.test(e)};const uy=function(e){return e.split("")};var my="\\ud800-\\udfff",gy="["+my+"]",fy="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",py="\\ud83c[\\udffb-\\udfff]",by="[^"+my+"]",wy="(?:\\ud83c[\\udde6-\\uddff]){2}",vy="[\\ud800-\\udbff][\\udc00-\\udfff]",_y="(?:"+fy+"|"+py+")"+"?",yy="[\\ufe0e\\ufe0f]?",ky=yy+_y+("(?:\\u200d(?:"+[by,wy,vy].join("|")+")"+yy+_y+")*"),Cy="(?:"+[by+fy+"?",fy,wy,vy,gy].join("|")+")",Ay=RegExp(py+"(?="+py+")|"+Cy+ky,"g");const xy=function(e){return e.match(Ay)||[]};const Ey=function(e){return hy(e)?xy(e):uy(e)};const Ty=function(e){return function(t){t=Uo(t);var i=hy(t)?Ey(t):void 0,n=i?i[0]:t.charAt(0),s=i?cy(i,1).join(""):t.slice(1);return n[e]()+s}}("toUpperCase");const Sy=ly((function(e,t,i){return e+(i?" ":"")+Ty(t)}));function Py(e,t,i,n){t&&function(e,t,i){if(t.attributes)for(const[n]of Object.entries(t.attributes))e.removeAttribute(n,i);if(t.styles)for(const n of Object.keys(t.styles))e.removeStyle(n,i);t.classes&&e.removeClass(t.classes,i)}(e,t,n),i&&Iy(e,i,n)}function Iy(e,t,i){if(t.attributes)for(const[n,s]of Object.entries(t.attributes))e.setAttribute(n,s,i);t.styles&&e.setStyle(t.styles,i),t.classes&&e.addClass(t.classes,i)}function Vy(e,t,i,n,s){const o=t.getAttribute(i),r={};for(const e of["attributes","styles","classes"]){if(e!=n){o&&o[e]&&(r[e]=o[e]);continue}if("classes"==n){const t=new Set(o&&o.classes||[]);s(t),t.size&&(r[e]=Array.from(t));continue}const t=new Map(Object.entries(o&&o[e]||{}));s(t),t.size&&(r[e]=Object.fromEntries(t))}Object.keys(r).length?t.is("documentSelection")?e.setSelectionAttribute(i,r):e.setAttribute(i,r,t):o&&(t.is("documentSelection")?e.removeSelectionAttribute(i):e.removeAttribute(i,t))}function Ry(e){return`html${t=e,Sy(t).replace(/ /g,"")}Attributes`;var t}function Oy({model:e}){return(t,i)=>i.writer.createElement(e,{htmlContent:t.getCustomProperty("$rawContent")})}function By(e,{view:t,isInline:i}){const n=e.t;return(e,{writer:s})=>{const o=n("HTML object"),r=My(t,e,s),a=e.getAttribute(Ry(t));s.addClass("html-object-embed__content",r),a&&Iy(s,a,r);return Fw(s.createContainerElement(i?"span":"div",{class:"html-object-embed","data-html-object-embed-label":o},r),s,{label:o})}}function My(e,t,i){return i.createRawElement(e,null,((e,i)=>{i.setContentOf(e,t.getAttribute("htmlContent"))}))}function Ny({view:e,model:t,allowEmpty:i},n){return t=>{t.on(`element:${e}`,((e,t,o)=>{let r=n.processViewAttributes(t.viewItem,o);if(r||o.consumable.test(t.viewItem,{name:!0})){if(r=r||{},o.consumable.consume(t.viewItem,{name:!0}),t.modelRange||(t=Object.assign(t,o.convertChildren(t.viewItem,t.modelCursor))),i&&t.modelRange.isCollapsed&&Object.keys(r).length){const e=o.writer.createElement("htmlEmptyElement");if(!o.safeInsert(e,t.modelCursor))return;const i=o.getSplitParts(e);return t.modelRange=o.writer.createRange(t.modelRange.start,o.writer.createPositionAfter(i[i.length-1])),o.updateConversionResult(e,t),void s(e,r,o)}for(const e of t.modelRange.getItems())s(e,r,o)}}),{priority:"low"})};function s(e,i,n){if(n.schema.checkAttribute(e,t)){const s=function(e,t){const i=wl(e);let n="attributes";for(n in t)i[n]="classes"==n?Array.from(new Set([...e[n]||[],...t[n]])):{...e[n],...t[n]};return i}(i,e.getAttribute(t)||{});n.writer.setAttribute(t,s,e)}}}function Fy({model:e,view:t},i){return(n,{writer:s,consumable:o})=>{if(!n.hasAttribute(e))return null;const r=s.createContainerElement(t),a=n.getAttribute(e);return o.consume(n,`attribute:${e}`),Iy(s,a,r),r.getFillerOffset=()=>null,i?Fw(r,s):r}}function Dy({priority:e,view:t}){return(i,n)=>{if(!i)return;const{writer:s}=n,o=s.createAttributeElement(t,null,{priority:e});return Iy(s,i,o),o}}function Ly({view:e},t){return i=>{i.on(`element:${e}`,((e,i,n)=>{if(!i.modelRange||i.modelRange.isCollapsed)return;const s=t.processViewAttributes(i.viewItem,n);s&&n.writer.setAttribute(Ry(i.viewItem.name),s,i.modelRange)}),{priority:"low"})}}function zy({view:e,model:t}){return i=>{i.on(`attribute:${Ry(e)}:${t}`,((e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const{attributeOldValue:n,attributeNewValue:s}=t;Py(i.writer,n,s,i.mapper.toViewElement(t.item))}))}}const Hy=[{model:"codeBlock",view:"pre"},{model:"paragraph",view:"p"},{model:"blockQuote",view:"blockquote"},{model:"listItem",view:"li"},{model:"pageBreak",view:"div"},{model:"rawHtml",view:"div"},{model:"table",view:"table"},{model:"tableRow",view:"tr"},{model:"tableCell",view:"td"},{model:"tableCell",view:"th"},{model:"tableColumnGroup",view:"colgroup"},{model:"tableColumn",view:"col"},{model:"caption",view:"caption"},{model:"caption",view:"figcaption"},{model:"imageBlock",view:"img"},{model:"imageInline",view:"img"},{model:"htmlP",view:"p",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlBlockquote",view:"blockquote",modelSchema:{inheritAllFrom:"$container"}},{model:"htmlTable",view:"table",modelSchema:{allowWhere:"$block",isBlock:!0}},{model:"htmlTbody",view:"tbody",modelSchema:{allowIn:"htmlTable",isBlock:!1}},{model:"htmlThead",view:"thead",modelSchema:{allowIn:"htmlTable",isBlock:!1}},{model:"htmlTfoot",view:"tfoot",modelSchema:{allowIn:"htmlTable",isBlock:!1}},{model:"htmlCaption",view:"caption",modelSchema:{allowIn:"htmlTable",allowChildren:"$text",isBlock:!1}},{model:"htmlColgroup",view:"colgroup",modelSchema:{allowIn:"htmlTable",allowChildren:"col",isBlock:!1}},{model:"htmlCol",view:"col",modelSchema:{allowIn:"htmlColgroup",isBlock:!1}},{model:"htmlTr",view:"tr",modelSchema:{allowIn:["htmlTable","htmlThead","htmlTbody"],isLimit:!0}},{model:"htmlTd",view:"td",modelSchema:{allowIn:"htmlTr",allowContentOf:"$container",isLimit:!0,isBlock:!1}},{model:"htmlTh",view:"th",modelSchema:{allowIn:"htmlTr",allowContentOf:"$container",isLimit:!0,isBlock:!1}},{model:"htmlFigure",view:"figure",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlFigcaption",view:"figcaption",modelSchema:{allowIn:"htmlFigure",allowChildren:"$text",isBlock:!1}},{model:"htmlAddress",view:"address",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlAside",view:"aside",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlMain",view:"main",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlDetails",view:"details",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlSummary",view:"summary",modelSchema:{allowChildren:"$text",allowIn:"htmlDetails",isBlock:!1}},{model:"htmlDiv",view:"div",paragraphLikeModel:"htmlDivParagraph",modelSchema:{inheritAllFrom:"$container"}},{model:"htmlFieldset",view:"fieldset",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlLegend",view:"legend",modelSchema:{allowIn:"htmlFieldset",allowChildren:"$text"}},{model:"htmlHeader",view:"header",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlFooter",view:"footer",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlForm",view:"form",modelSchema:{inheritAllFrom:"$container",isBlock:!0}},{model:"htmlHgroup",view:"hgroup",modelSchema:{allowChildren:["htmlH1","htmlH2","htmlH3","htmlH4","htmlH5","htmlH6"],isBlock:!1}},{model:"htmlH1",view:"h1",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH2",view:"h2",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH3",view:"h3",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH4",view:"h4",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH5",view:"h5",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlH6",view:"h6",modelSchema:{inheritAllFrom:"$block"}},{model:"$htmlList",modelSchema:{allowWhere:"$container",allowChildren:["$htmlList","htmlLi"],isBlock:!1}},{model:"htmlDir",view:"dir",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlMenu",view:"menu",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlUl",view:"ul",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlOl",view:"ol",modelSchema:{inheritAllFrom:"$htmlList"}},{model:"htmlLi",view:"li",modelSchema:{allowIn:"$htmlList",allowChildren:"$text",isBlock:!1}},{model:"htmlPre",view:"pre",modelSchema:{inheritAllFrom:"$block"}},{model:"htmlArticle",view:"article",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlSection",view:"section",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlNav",view:"nav",modelSchema:{inheritAllFrom:"$container",isBlock:!1}},{model:"htmlDivDl",view:"div",modelSchema:{allowChildren:["htmlDt","htmlDd"],allowIn:"htmlDl"}},{model:"htmlDl",view:"dl",modelSchema:{allowWhere:"$container",allowChildren:["htmlDt","htmlDd","htmlDivDl"],isBlock:!1}},{model:"htmlDt",view:"dt",modelSchema:{allowChildren:"$block",isBlock:!1}},{model:"htmlDd",view:"dd",modelSchema:{allowChildren:"$block",isBlock:!1}},{model:"htmlCenter",view:"center",modelSchema:{inheritAllFrom:"$container",isBlock:!1}}],$y=[{model:"htmlLiAttributes",view:"li",appliesToBlock:!0,coupledAttribute:"listItemId"},{model:"htmlOlAttributes",view:"ol",appliesToBlock:!0,coupledAttribute:"listItemId"},{model:"htmlUlAttributes",view:"ul",appliesToBlock:!0,coupledAttribute:"listItemId"},{model:"htmlFigureAttributes",view:"figure",appliesToBlock:"table"},{model:"htmlTheadAttributes",view:"thead",appliesToBlock:"table"},{model:"htmlTbodyAttributes",view:"tbody",appliesToBlock:"table"},{model:"htmlFigureAttributes",view:"figure",appliesToBlock:"imageBlock"},{model:"htmlAcronym",view:"acronym",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlTt",view:"tt",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlFont",view:"font",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlTime",view:"time",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlVar",view:"var",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlBig",view:"big",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlSmall",view:"small",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlSamp",view:"samp",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlQ",view:"q",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlOutput",view:"output",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlKbd",view:"kbd",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlBdi",view:"bdi",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlBdo",view:"bdo",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlAbbr",view:"abbr",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlA",view:"a",priority:5,coupledAttribute:"linkHref"},{model:"htmlStrong",view:"strong",coupledAttribute:"bold",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlB",view:"b",coupledAttribute:"bold",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlI",view:"i",coupledAttribute:"italic",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlEm",view:"em",coupledAttribute:"italic",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlS",view:"s",coupledAttribute:"strikethrough",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlDel",view:"del",coupledAttribute:"strikethrough",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlIns",view:"ins",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlU",view:"u",coupledAttribute:"underline",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlSub",view:"sub",coupledAttribute:"subscript",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlSup",view:"sup",coupledAttribute:"superscript",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlCode",view:"code",coupledAttribute:"code",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlMark",view:"mark",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlSpan",view:"span",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlCite",view:"cite",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlLabel",view:"label",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlDfn",view:"dfn",attributeProperties:{copyOnEnter:!0,isFormatting:!0}},{model:"htmlObject",view:"object",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlIframe",view:"iframe",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlInput",view:"input",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlButton",view:"button",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlTextarea",view:"textarea",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlSelect",view:"select",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlVideo",view:"video",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlEmbed",view:"embed",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlOembed",view:"oembed",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlAudio",view:"audio",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlImg",view:"img",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlCanvas",view:"canvas",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlMeter",view:"meter",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlProgress",view:"progress",isObject:!0,modelSchema:{inheritAllFrom:"$inlineObject"}},{model:"htmlScript",view:"script",modelSchema:{allowWhere:["$text","$block"],isInline:!0}},{model:"htmlStyle",view:"style",modelSchema:{allowWhere:["$text","$block"],isInline:!0}},{model:"htmlCustomElement",view:"$customElement",modelSchema:{allowWhere:["$text","$block"],allowAttributesOf:"$inlineObject",isInline:!0}}];const Wy=$s((function(e,t,i,n){Is(e,t,i,n)}));class jy extends so{constructor(){super(...arguments),this._definitions=[]}static get pluginName(){return"DataSchema"}init(){for(const e of Hy)this.registerBlockElement(e);for(const e of $y)this.registerInlineElement(e)}registerBlockElement(e){this._definitions.push({...e,isBlock:!0})}registerInlineElement(e){this._definitions.push({...e,isInline:!0})}extendBlockElement(e){this._extendDefinition({...e,isBlock:!0})}extendInlineElement(e){this._extendDefinition({...e,isInline:!0})}getDefinitionsForView(e,t=!1){const i=new Set;for(const n of this._getMatchingViewDefinitions(e)){if(t)for(const e of this._getReferences(n.model))i.add(e);i.add(n)}return i}getDefinitionsForModel(e){return this._definitions.filter((t=>t.model==e))}_getMatchingViewDefinitions(e){return this._definitions.filter((t=>t.view&&function(e,t){if("string"==typeof e)return e===t;if(e instanceof RegExp)return e.test(t);return!1}(e,t.view)))}*_getReferences(e){const t=["inheritAllFrom","inheritTypesFrom","allowWhere","allowContentOf","allowAttributesOf"],i=this._definitions.filter((t=>t.model==e));for(const{modelSchema:n}of i)if(n)for(const i of t)for(const t of Cs(n[i]||[])){const i=this._definitions.filter((e=>e.model==t));for(const n of i)t!==e&&(yield*this._getReferences(n.model),yield n)}}_extendDefinition(e){const t=Array.from(this._definitions.entries()).filter((([,t])=>t.model==e.model));if(0!=t.length)for(const[i,n]of t)this._definitions[i]=Wy({},n,e,((e,t)=>Array.isArray(e)?e.concat(t):void 0));else this._definitions.push(e)}}class Uy extends so{constructor(e){super(e),this._dataSchema=e.plugins.get("DataSchema"),this._allowedAttributes=new To,this._disallowedAttributes=new To,this._allowedElements=new Set,this._disallowedElements=new Set,this._dataInitialized=!1,this._coupledAttributes=null,this._registerElementsAfterInit(),this._registerElementHandlers(),this._registerCoupledAttributesPostFixer(),this._registerAssociatedHtmlAttributesPostFixer()}static get pluginName(){return"DataFilter"}static get requires(){return[jy,ev]}loadAllowedConfig(e){for(const t of e){const e=t.name||/[\s\S]+/,i=Jy(t);this.allowElement(e),i.forEach((e=>this.allowAttributes(e)))}}loadDisallowedConfig(e){for(const t of e){const e=t.name||/[\s\S]+/,i=Jy(t);0==i.length?this.disallowElement(e):i.forEach((e=>this.disallowAttributes(e)))}}loadAllowedEmptyElementsConfig(e){for(const t of e)this.allowEmptyElement(t)}allowElement(e){for(const t of this._dataSchema.getDefinitionsForView(e,!0))this._addAllowedElement(t),this._coupledAttributes=null}disallowElement(e){for(const t of this._dataSchema.getDefinitionsForView(e,!1))this._disallowedElements.add(t.view)}allowEmptyElement(e){for(const t of this._dataSchema.getDefinitionsForView(e,!0))t.isInline&&this._dataSchema.extendInlineElement({...t,allowEmpty:!0})}allowAttributes(e){this._allowedAttributes.add(e)}disallowAttributes(e){this._disallowedAttributes.add(e)}processViewAttributes(e,t){const{consumable:i}=t;return qy(e,this._disallowedAttributes,i),function(e,{attributes:t,classes:i,styles:n}){if(!t.length&&!i.length&&!n.length)return null;return{...t.length&&{attributes:Gy(e,t)},...n.length&&{styles:Ky(e,n)},...i.length&&{classes:i}}}(e,qy(e,this._allowedAttributes,i))}_addAllowedElement(e){if(!this._allowedElements.has(e)){if(this._allowedElements.add(e),"appliesToBlock"in e&&"string"==typeof e.appliesToBlock)for(const t of this._dataSchema.getDefinitionsForModel(e.appliesToBlock))t.isBlock&&this._addAllowedElement(t);this._dataInitialized&&this.editor.data.once("set",(()=>{this._fireRegisterEvent(e)}),{priority:w.highest+1})}}_registerElementsAfterInit(){this.editor.data.on("init",(()=>{this._dataInitialized=!0;for(const e of this._allowedElements)this._fireRegisterEvent(e)}),{priority:w.highest+1})}_registerElementHandlers(){this.on("register",((e,t)=>{const i=this.editor.model.schema;if(t.isObject&&!i.isRegistered(t.model))this._registerObjectElement(t);else if(t.isBlock)this._registerBlockElement(t);else{if(!t.isInline)throw new y("data-filter-invalid-definition",null,t);this._registerInlineElement(t)}e.stop()}),{priority:"lowest"})}_registerCoupledAttributesPostFixer(){const e=this.editor.model,t=e.document.selection;e.document.registerPostFixer((t=>{const i=e.document.differ.getChanges();let n=!1;const s=this._getCoupledAttributesMap();for(const e of i){if("attribute"!=e.type||null!==e.attributeNewValue)continue;const i=s.get(e.attributeKey);if(i)for(const{item:s}of e.range.getWalker())for(const e of i)s.hasAttribute(e)&&(t.removeAttribute(e,s),n=!0)}return n})),this.listenTo(t,"change:attribute",((i,{attributeKeys:n})=>{const s=new Set,o=this._getCoupledAttributesMap();for(const e of n){if(t.hasAttribute(e))continue;const i=o.get(e);if(i)for(const e of i)t.hasAttribute(e)&&s.add(e)}0!=s.size&&e.change((e=>{for(const t of s)e.removeSelectionAttribute(t)}))}))}_registerAssociatedHtmlAttributesPostFixer(){const e=this.editor.model;e.document.registerPostFixer((t=>{const i=e.document.differ.getChanges();let n=!1;for(const s of i)if("insert"===s.type&&"$text"!==s.name)for(const i of s.attributes.keys())i.startsWith("html")&&i.endsWith("Attributes")&&(e.schema.checkAttribute(s.name,i)||(t.removeAttribute(i,s.position.nodeAfter),n=!0));return n}))}_getCoupledAttributesMap(){if(this._coupledAttributes)return this._coupledAttributes;this._coupledAttributes=new Map;for(const e of this._allowedElements)if(e.coupledAttribute&&e.model){const t=this._coupledAttributes.get(e.coupledAttribute);t?t.push(e.model):this._coupledAttributes.set(e.coupledAttribute,[e.model])}return this._coupledAttributes}_fireRegisterEvent(e){e.view&&this._disallowedElements.has(e.view)||this.fire(e.view?`register:${e.view}`:"register",e)}_registerObjectElement(e){const t=this.editor,i=t.model.schema,n=t.conversion,{view:s,model:o}=e;i.register(o,e.modelSchema),s&&(i.extend(e.model,{allowAttributes:[Ry(s),"htmlContent"]}),t.data.registerRawContentMatcher({name:s}),n.for("upcast").elementToElement({view:s,model:Oy(e),converterPriority:w.low+2}),n.for("upcast").add(Ly(e,this)),n.for("editingDowncast").elementToStructure({model:{name:o,attributes:[Ry(s)]},view:By(t,e)}),n.for("dataDowncast").elementToElement({model:o,view:(e,{writer:t})=>My(s,e,t)}),n.for("dataDowncast").add(zy(e)))}_registerBlockElement(e){const t=this.editor,i=t.model.schema,n=t.conversion,{view:s,model:o}=e;if(!i.isRegistered(e.model)){if(i.register(e.model,e.modelSchema),!s)return;n.for("upcast").elementToElement({model:o,view:s,converterPriority:w.low+2}),n.for("downcast").elementToElement({model:o,view:s})}s&&(i.extend(e.model,{allowAttributes:Ry(s)}),n.for("upcast").add(Ly(e,this)),n.for("downcast").add(zy(e)))}_registerInlineElement(e){const t=this.editor,i=t.model.schema,n=t.conversion,s=e.model;e.appliesToBlock||(i.extend("$text",{allowAttributes:s}),e.attributeProperties&&i.setAttributeProperties(s,e.attributeProperties),n.for("upcast").add(Ny(e,this)),n.for("downcast").attributeToElement({model:s,view:Dy(e)}),e.allowEmpty&&(i.setAttributeProperties(s,{copyFromObject:!1}),i.isRegistered("htmlEmptyElement")||i.register("htmlEmptyElement",{inheritAllFrom:"$inlineObject"}),t.data.htmlProcessor.domConverter.registerInlineObjectMatcher((t=>t.name==e.view&&t.isEmpty&&Array.from(t.getAttributeKeys()).length?{name:!0}:null)),n.for("editingDowncast").elementToElement({model:"htmlEmptyElement",view:Fy(e,!0)}),n.for("dataDowncast").elementToElement({model:"htmlEmptyElement",view:Fy(e)})))}}function qy(e,t,i){const n=t.matchAll(e)||[],s=e.document.stylesProcessor;return n.reduce(((t,{match:n})=>{for(const o of n.styles||[]){const n=s.getRelatedStyles(o).filter((e=>e.split("-").length>o.split("-").length)).sort(((e,t)=>t.split("-").length-e.split("-").length));for(const s of n)i.consume(e,{styles:[s]})&&t.styles.push(s);i.consume(e,{styles:[o]})&&t.styles.push(o)}for(const s of n.classes||[])i.consume(e,{classes:[s]})&&t.classes.push(s);for(const s of n.attributes||[])i.consume(e,{attributes:[s]})&&t.attributes.push(s);return t}),{attributes:[],classes:[],styles:[]})}function Gy(e,t){const i={};for(const n of t){const t=e.getAttribute(n);void 0!==t&&Xn(n)&&(i[n]=t)}return i}function Ky(e,t){const i=new nr(e.document.stylesProcessor);for(const n of t){const t=e.getStyle(n);void 0!==t&&i.set(n,t)}return Object.fromEntries(i.getStylesEntries())}function Zy(e,t){const{name:i}=e,n=e[t];return Te(n)?Object.entries(n).map((([e,n])=>({name:i,[t]:{[e]:n}}))):Array.isArray(n)?n.map((e=>({name:i,[t]:[e]}))):[e]}function Jy(e){const{name:t,attributes:i,classes:n,styles:s}=e,o=[];return i&&o.push(...Zy({name:t,attributes:i},"attributes")),n&&o.push(...Zy({name:t,classes:n},"classes")),s&&o.push(...Zy({name:t,styles:s},"styles")),o}class Qy extends so{static get requires(){return[Uy]}static get pluginName(){return"CodeBlockElementSupport"}init(){if(!this.editor.plugins.has("CodeBlockEditing"))return;const e=this.editor.plugins.get(Uy);e.on("register:pre",((t,i)=>{if("codeBlock"!==i.model)return;const n=this.editor,s=n.model.schema,o=n.conversion;s.extend("codeBlock",{allowAttributes:["htmlPreAttributes","htmlContentAttributes"]}),o.for("upcast").add(function(e){return t=>{t.on("element:code",((t,i,n)=>{const s=i.viewItem,o=s.parent;function r(t,s){const o=e.processViewAttributes(t,n);o&&n.writer.setAttribute(s,o,i.modelRange)}o&&o.is("element","pre")&&(r(o,"htmlPreAttributes"),r(s,"htmlContentAttributes"))}),{priority:"low"})}}(e)),o.for("downcast").add((e=>{e.on("attribute:htmlPreAttributes:codeBlock",((e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const{attributeOldValue:n,attributeNewValue:s}=t,o=i.mapper.toViewElement(t.item).parent;Py(i.writer,n,s,o)})),e.on("attribute:htmlContentAttributes:codeBlock",((e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const{attributeOldValue:n,attributeNewValue:s}=t,o=i.mapper.toViewElement(t.item);Py(i.writer,n,s,o)}))})),t.stop()}))}}class Yy extends so{static get requires(){return[Uy]}static get pluginName(){return"DualContentModelElementSupport"}init(){this.editor.plugins.get(Uy).on("register",((e,t)=>{const i=t,n=this.editor,s=n.model.schema,o=n.conversion;if(!i.paragraphLikeModel)return;if(s.isRegistered(i.model)||s.isRegistered(i.paragraphLikeModel))return;const r={model:i.paragraphLikeModel,view:i.view};s.register(i.model,i.modelSchema),s.register(r.model,{inheritAllFrom:"$block"}),o.for("upcast").elementToElement({view:i.view,model:(e,{writer:t})=>this._hasBlockContent(e)?t.createElement(i.model):t.createElement(r.model),converterPriority:w.low+.5}),o.for("downcast").elementToElement({view:i.view,model:i.model}),this._addAttributeConversion(i),o.for("downcast").elementToElement({view:r.view,model:r.model}),this._addAttributeConversion(r),e.stop()}))}_hasBlockContent(e){const t=this.editor.editing.view,i=t.domConverter.blockElements;for(const n of t.createRangeIn(e).getItems())if(n.is("element")&&i.includes(n.name))return!0;return!1}_addAttributeConversion(e){const t=this.editor,i=t.conversion,n=t.plugins.get(Uy);t.model.schema.extend(e.model,{allowAttributes:Ry(e.view)}),i.for("upcast").add(Ly(e,n)),i.for("downcast").add(zy(e))}}class Xy extends so{static get requires(){return[jy,Jb]}static get pluginName(){return"HeadingElementSupport"}init(){const e=this.editor;if(!e.plugins.has("HeadingEditing"))return;const t=e.config.get("heading.options");this.registerHeadingElements(e,t)}registerHeadingElements(e,t){const i=e.plugins.get(jy),n=[];for(const e of t)"model"in e&&"view"in e&&(i.registerBlockElement({view:e.view,model:e.model}),n.push(e.model));i.extendBlockElement({model:"htmlHgroup",modelSchema:{allowChildren:n}})}}function ek(e,t,i){const n=e.createRangeOn(t);for(const{item:e}of n.getWalker())if(e.is("element",i))return e}class tk extends so{static get requires(){return[Uy]}static get pluginName(){return"ImageElementSupport"}init(){const e=this.editor;if(!e.plugins.has("ImageInlineEditing")&&!e.plugins.has("ImageBlockEditing"))return;const t=e.model.schema,i=e.conversion,n=e.plugins.get(Uy);n.on("register:figure",(()=>{i.for("upcast").add(function(e){return t=>{t.on("element:figure",((t,i,n)=>{const s=i.viewItem;if(!i.modelRange||!s.hasClass("image"))return;const o=e.processViewAttributes(s,n);o&&n.writer.setAttribute("htmlFigureAttributes",o,i.modelRange)}),{priority:"low"})}}(n))})),n.on("register:img",((s,o)=>{"imageBlock"!==o.model&&"imageInline"!==o.model||(t.isRegistered("imageBlock")&&t.extend("imageBlock",{allowAttributes:["htmlImgAttributes","htmlFigureAttributes","htmlLinkAttributes"]}),t.isRegistered("imageInline")&&t.extend("imageInline",{allowAttributes:["htmlA","htmlImgAttributes"]}),i.for("upcast").add(function(e){return t=>{t.on("element:img",((t,i,n)=>{if(!i.modelRange)return;const s=i.viewItem,o=e.processViewAttributes(s,n);o&&n.writer.setAttribute("htmlImgAttributes",o,i.modelRange)}),{priority:"low"})}}(n)),i.for("downcast").add((e=>{function t(t){e.on(`attribute:${t}:imageInline`,((e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const{attributeOldValue:n,attributeNewValue:s}=t,o=i.mapper.toViewElement(t.item);Py(i.writer,n,s,o)}),{priority:"low"})}function i(t,i){e.on(`attribute:${i}:imageBlock`,((e,i,n)=>{if(!n.consumable.test(i.item,e.name))return;const{attributeOldValue:s,attributeNewValue:o}=i,r=n.mapper.toViewElement(i.item),a=ek(n.writer,r,t);a&&(Py(n.writer,s,o,a),n.consumable.consume(i.item,e.name))}),{priority:"low"}),"a"===t&&e.on("attribute:linkHref:imageBlock",((e,t,i)=>{if(!i.consumable.consume(t.item,"attribute:htmlLinkAttributes:imageBlock"))return;const n=i.mapper.toViewElement(t.item),s=ek(i.writer,n,"a");Iy(i.writer,t.item.getAttribute("htmlLinkAttributes"),s)}),{priority:"low"})}t("htmlImgAttributes"),i("img","htmlImgAttributes"),i("figure","htmlFigureAttributes"),i("a","htmlLinkAttributes")})),e.plugins.has("LinkImage")&&i.for("upcast").add(function(e,t){const i=t.plugins.get("ImageUtils");return t=>{t.on("element:a",((t,n,s)=>{const o=n.viewItem;if(!i.findViewImgElement(o))return;const r=n.modelCursor.parent;if(!r.is("element","imageBlock"))return;const a=e.processViewAttributes(o,s);a&&s.writer.setAttribute("htmlLinkAttributes",a,r)}),{priority:"low"})}}(n,e)),s.stop())}))}}class ik extends so{static get requires(){return[Uy]}static get pluginName(){return"MediaEmbedElementSupport"}init(){const e=this.editor;if(!e.plugins.has("MediaEmbed")||e.config.get("mediaEmbed.previewsInData"))return;const t=e.model.schema,i=e.conversion,n=this.editor.plugins.get(Uy),s=this.editor.plugins.get(jy),o=e.config.get("mediaEmbed.elementName");s.registerBlockElement({model:"media",view:o}),n.on("register:figure",(()=>{i.for("upcast").add(function(e){return t=>{t.on("element:figure",((t,i,n)=>{const s=i.viewItem;if(!i.modelRange||!s.hasClass("media"))return;const o=e.processViewAttributes(s,n);o&&n.writer.setAttribute("htmlFigureAttributes",o,i.modelRange)}),{priority:"low"})}}(n))})),n.on(`register:${o}`,((e,s)=>{"media"===s.model&&(t.extend("media",{allowAttributes:[Ry(o),"htmlFigureAttributes"]}),i.for("upcast").add(function(e,t){const i=(i,n,s)=>{function o(t,i){const o=e.processViewAttributes(t,s);o&&s.writer.setAttribute(i,o,n.modelRange)}o(n.viewItem,Ry(t))};return e=>{e.on(`element:${t}`,i,{priority:"low"})}}(n,o)),i.for("dataDowncast").add(function(e){return t=>{function i(e,i){t.on(`attribute:${i}:media`,((t,i,n)=>{if(!n.consumable.consume(i.item,t.name))return;const{attributeOldValue:s,attributeNewValue:o}=i,r=n.mapper.toViewElement(i.item),a=ek(n.writer,r,e);Py(n.writer,s,o,a)}))}i(e,Ry(e)),i("figure","htmlFigureAttributes")}}(o)),e.stop())}))}}class nk extends so{static get requires(){return[Uy]}static get pluginName(){return"ScriptElementSupport"}init(){const e=this.editor.plugins.get(Uy);e.on("register:script",((t,i)=>{const n=this.editor,s=n.model.schema,o=n.conversion;s.register("htmlScript",i.modelSchema),s.extend("htmlScript",{allowAttributes:["htmlScriptAttributes","htmlContent"],isContent:!0}),n.data.registerRawContentMatcher({name:"script"}),o.for("upcast").elementToElement({view:"script",model:Oy(i)}),o.for("upcast").add(Ly(i,e)),o.for("downcast").elementToElement({model:"htmlScript",view:(e,{writer:t})=>My("script",e,t)}),o.for("downcast").add(zy(i)),t.stop()}))}}class sk extends so{static get requires(){return[Uy]}static get pluginName(){return"TableElementSupport"}init(){const e=this.editor;if(!e.plugins.has("TableEditing"))return;const t=e.model.schema,i=e.conversion,n=e.plugins.get(Uy),s=e.plugins.get("TableUtils");n.on("register:figure",(()=>{i.for("upcast").add(function(e){return t=>{t.on("element:figure",((t,i,n)=>{const s=i.viewItem;if(!i.modelRange||!s.hasClass("table"))return;const o=e.processViewAttributes(s,n);o&&n.writer.setAttribute("htmlFigureAttributes",o,i.modelRange)}),{priority:"low"})}}(n))})),n.on("register:table",((o,r)=>{"table"===r.model&&(t.extend("table",{allowAttributes:["htmlTableAttributes","htmlFigureAttributes","htmlTheadAttributes","htmlTbodyAttributes"]}),i.for("upcast").add(function(e){return t=>{t.on("element:table",((t,i,n)=>{if(!i.modelRange)return;const s=i.viewItem;o(s,"htmlTableAttributes");for(const e of s.getChildren())e.is("element","thead")&&o(e,"htmlTheadAttributes"),e.is("element","tbody")&&o(e,"htmlTbodyAttributes");function o(t,s){const o=e.processViewAttributes(t,n);o&&n.writer.setAttribute(s,o,i.modelRange)}}),{priority:"low"})}}(n)),i.for("downcast").add((e=>{function t(t,i){e.on(`attribute:${i}:table`,((e,i,n)=>{if(!n.consumable.test(i.item,e.name))return;const s=n.mapper.toViewElement(i.item),o=ek(n.writer,s,t);o&&(n.consumable.consume(i.item,e.name),Py(n.writer,i.attributeOldValue,i.attributeNewValue,o))}))}t("table","htmlTableAttributes"),t("figure","htmlFigureAttributes"),t("thead","htmlTheadAttributes"),t("tbody","htmlTbodyAttributes")})),e.model.document.registerPostFixer(function(e,t){return i=>{const n=e.document.differ.getChanges();let s=!1;for(const e of n){if("attribute"!=e.type||"headingRows"!=e.attributeKey)continue;const n=e.range.start.nodeAfter,o=n.getAttribute("htmlTheadAttributes"),r=n.getAttribute("htmlTbodyAttributes");o&&!e.attributeNewValue?(i.removeAttribute("htmlTheadAttributes",n),s=!0):r&&e.attributeNewValue==t.getRows(n)&&(i.removeAttribute("htmlTbodyAttributes",n),s=!0)}return s}}(e.model,s)),o.stop())}))}}class ok extends so{static get requires(){return[Uy]}static get pluginName(){return"StyleElementSupport"}init(){const e=this.editor.plugins.get(Uy);e.on("register:style",((t,i)=>{const n=this.editor,s=n.model.schema,o=n.conversion;s.register("htmlStyle",i.modelSchema),s.extend("htmlStyle",{allowAttributes:["htmlStyleAttributes","htmlContent"],isContent:!0}),n.data.registerRawContentMatcher({name:"style"}),o.for("upcast").elementToElement({view:"style",model:Oy(i)}),o.for("upcast").add(Ly(i,e)),o.for("downcast").elementToElement({model:"htmlStyle",view:(e,{writer:t})=>My("style",e,t)}),o.for("downcast").add(zy(i)),t.stop()}))}}class rk extends so{static get requires(){return[Uy]}static get pluginName(){return"ListElementSupport"}init(){const e=this.editor;if(!e.plugins.has("ListEditing"))return;const t=e.model.schema,i=e.conversion,n=e.plugins.get(Uy),s=e.plugins.get("ListEditing"),o=e.plugins.get("ListUtils"),r=["ul","ol","li"];s.registerDowncastStrategy({scope:"item",attributeName:"htmlLiAttributes",setAttributeOnDowncast:Iy}),s.registerDowncastStrategy({scope:"list",attributeName:"htmlUlAttributes",setAttributeOnDowncast:Iy}),s.registerDowncastStrategy({scope:"list",attributeName:"htmlOlAttributes",setAttributeOnDowncast:Iy}),n.on("register",((e,s)=>{if(!r.includes(s.view))return;if(e.stop(),t.checkAttribute("$block","htmlLiAttributes"))return;const o=r.map((e=>Ry(e)));t.extend("$listItem",{allowAttributes:o}),i.for("upcast").add((e=>{e.on("element:ul",ak("htmlUlAttributes",n),{priority:"low"}),e.on("element:ol",ak("htmlOlAttributes",n),{priority:"low"}),e.on("element:li",ak("htmlLiAttributes",n),{priority:"low"})}))})),s.on("postFixer",((e,{listNodes:t,writer:i})=>{for(const{node:n,previousNodeInList:s}of t)if(s){if(s.getAttribute("listType")==n.getAttribute("listType")){const t=lk(s.getAttribute("listType")),o=s.getAttribute(t);!gd(n.getAttribute(t),o)&&i.model.schema.checkAttribute(n,t)&&(i.setAttribute(t,o,n),e.return=!0)}if(s.getAttribute("listItemId")==n.getAttribute("listItemId")){const t=s.getAttribute("htmlLiAttributes");!gd(n.getAttribute("htmlLiAttributes"),t)&&i.model.schema.checkAttribute(n,"htmlLiAttributes")&&(i.setAttribute("htmlLiAttributes",t,n),e.return=!0)}}})),s.on("postFixer",((e,{listNodes:t,writer:i})=>{for(const{node:n}of t){const t=n.getAttribute("listType");!o.isNumberedListType(t)&&n.getAttribute("htmlOlAttributes")&&(i.removeAttribute("htmlOlAttributes",n),e.return=!0),o.isNumberedListType(t)&&n.getAttribute("htmlUlAttributes")&&(i.removeAttribute("htmlUlAttributes",n),e.return=!0)}}))}afterInit(){const e=this.editor;if(!e.commands.get("indentList"))return;const t=e.commands.get("indentList");this.listenTo(t,"afterExecute",((t,i)=>{e.model.change((t=>{for(const n of i){const i=lk(n.getAttribute("listType"));e.model.schema.checkAttribute(n,i)&&t.setAttribute(i,{},n)}}))}))}}function ak(e,t){return(i,n,s)=>{const o=n.viewItem;n.modelRange||Object.assign(n,s.convertChildren(n.viewItem,n.modelCursor));const r=t.processViewAttributes(o,s);for(const t of n.modelRange.getItems({shallow:!0}))t.hasAttribute("listItemId")&&(t.hasAttribute(e)||s.writer.model.schema.checkAttribute(t,e)&&s.writer.setAttribute(e,r||{},t))}}function lk(e){return"numbered"===e||"customNumbered"==e?"htmlOlAttributes":"htmlUlAttributes"}class ck extends so{static get requires(){return[Uy,jy]}static get pluginName(){return"CustomElementSupport"}init(){const e=this.editor.plugins.get(Uy),t=this.editor.plugins.get(jy);e.on("register:$customElement",((i,n)=>{i.stop();const s=this.editor,o=s.model.schema,r=s.conversion,a=s.editing.view.domConverter.unsafeElements,l=s.data.htmlProcessor.domConverter.preElements;o.register(n.model,n.modelSchema),o.extend(n.model,{allowAttributes:["htmlElementName","htmlCustomElementAttributes","htmlContent"],isContent:!0}),s.data.htmlProcessor.domConverter.registerRawContentMatcher({name:"template"}),r.for("upcast").elementToElement({view:/.*/,model:(i,o)=>{if("$comment"==i.name)return null;if(!function(e){try{document.createElement(e)}catch(e){return!1}return!0}(i.name))return null;if(t.getDefinitionsForView(i.name).size)return null;a.includes(i.name)||a.push(i.name),l.includes(i.name)||l.push(i.name);const r=o.writer.createElement(n.model,{htmlElementName:i.name}),c=e.processViewAttributes(i,o);let d;if(c&&o.writer.setAttribute("htmlCustomElementAttributes",c,r),i.is("element","template")&&i.getCustomProperty("$rawContent"))d=i.getCustomProperty("$rawContent");else{const e=new _h(i.document).createDocumentFragment(i),t=s.data.htmlProcessor.domConverter.viewToDom(e),n=t.firstChild;for(;n.firstChild;)t.appendChild(n.firstChild);n.remove(),d=s.data.htmlProcessor.htmlWriter.getHtml(t)}o.writer.setAttribute("htmlContent",d,r);for(const{item:e}of s.editing.view.createRangeIn(i))o.consumable.consume(e,{name:!0});return r},converterPriority:"low"}),r.for("editingDowncast").elementToElement({model:{name:n.model,attributes:["htmlElementName","htmlCustomElementAttributes","htmlContent"]},view:(e,{writer:t})=>{const i=e.getAttribute("htmlElementName"),n=t.createRawElement(i);return e.hasAttribute("htmlCustomElementAttributes")&&Iy(t,e.getAttribute("htmlCustomElementAttributes"),n),n}}),r.for("dataDowncast").elementToElement({model:{name:n.model,attributes:["htmlElementName","htmlCustomElementAttributes","htmlContent"]},view:(e,{writer:t})=>{const i=e.getAttribute("htmlElementName"),n=e.getAttribute("htmlContent"),s=t.createRawElement(i,null,((e,t)=>{t.setContentOf(e,n)}));return e.hasAttribute("htmlCustomElementAttributes")&&Iy(t,e.getAttribute("htmlCustomElementAttributes"),s),s}})}))}}function*dk(e,t,i){if(t)if(!(Symbol.iterator in t)&&t.is("documentSelection")&&t.isCollapsed)e.schema.checkAttributeInSelection(t,i)&&(yield t);else for(const n of function(e,t,i){return!(Symbol.iterator in t)&&(t.is("node")||t.is("$text")||t.is("$textProxy"))?e.schema.checkAttribute(t,i)?[e.createRangeOn(t)]:[]:e.schema.getValidRanges(e.createSelection(t).getRanges(),i)}(e,t,i))yield*n.getItems({shallow:!0})}function hk(e){return e.createContainerElement("figure",{class:"image"},[e.createEmptyElement("img"),e.createSlot("children")])}function uk(e,t){const i=e.plugins.get("ImageUtils"),n=e.plugins.has("ImageInlineEditing")&&e.plugins.has("ImageBlockEditing");return e=>{if(!i.isInlineImageView(e))return null;if(!n)return s(e);return("block"==e.getStyle("display")||e.findAncestor(i.isBlockImageView)?"imageBlock":"imageInline")!==t?null:s(e)};function s(e){const t={name:!0};return e.hasAttribute("src")&&(t.attributes=["src"]),t}}function mk(e,t){const i=Zs(t.getSelectedBlocks());return!i||e.isObject(i)||i.isEmpty&&"listItem"!=i.name?"imageBlock":"imageInline"}function gk(e){return e&&e.endsWith("px")?parseInt(e):null}function fk(e){const t=gk(e.getStyle("width")),i=gk(e.getStyle("height"));return!(!t||!i)}const pk=/^(image|image-inline)$/;class bk extends so{constructor(){super(...arguments),this._domEmitter=new(Vn())}static get pluginName(){return"ImageUtils"}isImage(e){return this.isInlineImage(e)||this.isBlockImage(e)}isInlineImageView(e){return!!e&&e.is("element","img")}isBlockImageView(e){return!!e&&e.is("element","figure")&&e.hasClass("image")}insertImage(e={},t=null,i=null,n={}){const s=this.editor,o=s.model,r=o.document.selection,a=wk(s,t||r,i);e={...Object.fromEntries(r.getAttributes()),...e};for(const t in e)o.schema.checkAttribute(a,t)||delete e[t];return o.change((i=>{const{setImageSizes:s=!0}=n,r=i.createElement(a,e);return o.insertObject(r,t,null,{setSelection:"on",findOptimalPosition:t||"imageInline"==a?void 0:"auto"}),r.parent?(s&&this.setImageNaturalSizeAttributes(r),r):null}))}setImageNaturalSizeAttributes(e){const t=e.getAttribute("src");t&&(e.getAttribute("width")||e.getAttribute("height")||this.editor.model.change((i=>{const n=new Mn.window.Image;this._domEmitter.listenTo(n,"load",(()=>{e.getAttribute("width")||e.getAttribute("height")||this.editor.model.enqueueChange(i.batch,(t=>{t.setAttribute("width",n.naturalWidth,e),t.setAttribute("height",n.naturalHeight,e)})),this._domEmitter.stopListening(n,"load")})),n.src=t})))}getClosestSelectedImageWidget(e){const t=e.getFirstPosition();if(!t)return null;const i=e.getSelectedElement();if(i&&this.isImageWidget(i))return i;let n=t.parent;for(;n;){if(n.is("element")&&this.isImageWidget(n))return n;n=n.parent}return null}getClosestSelectedImageElement(e){const t=e.getSelectedElement();return this.isImage(t)?t:e.getFirstPosition().findAncestor("imageBlock")}getImageWidgetFromImageView(e){return e.findAncestor({classes:pk})}isImageAllowed(){const e=this.editor.model.document.selection;return function(e,t){const i=wk(e,t,null);if("imageBlock"==i){const i=function(e,t){const i=$w(e,t),n=i.start.parent;if(n.isEmpty&&!n.is("element","$root"))return n.parent;return n}(t,e.model);if(e.model.schema.checkChild(i,"imageBlock"))return!0}else if(e.model.schema.checkChild(t.focus,"imageInline"))return!0;return!1}(this.editor,e)&&function(e){return[...e.focus.getAncestors()].every((e=>!e.is("element","imageBlock")))}(e)}toImageWidget(e,t,i){t.setCustomProperty("image",!0,e);return Fw(e,t,{label:()=>{const t=this.findViewImgElement(e).getAttribute("alt");return t?`${t} ${i}`:i}})}isImageWidget(e){return!!e.getCustomProperty("image")&&Nw(e)}isBlockImage(e){return!!e&&e.is("element","imageBlock")}isInlineImage(e){return!!e&&e.is("element","imageInline")}findViewImgElement(e){if(this.isInlineImageView(e))return e;const t=this.editor.editing.view;for(const{item:i}of t.createRangeIn(e))if(this.isInlineImageView(i))return i}destroy(){return this._domEmitter.stopListening(),super.destroy()}}function wk(e,t,i){const n=e.model.schema,s=e.config.get("image.insert.type");return e.plugins.has("ImageBlockEditing")?e.plugins.has("ImageInlineEditing")?i||("inline"===s?"imageInline":"auto"!==s?"imageBlock":t.is("selection")?mk(n,t):n.checkChild(t,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}const vk=new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class _k extends ro{refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled&&e.hasAttribute("alt")?this.value=e.getAttribute("alt"):this.value=!1}execute(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n=t.model,s=i.getClosestSelectedImageElement(n.document.selection);n.change((t=>{t.setAttribute("alt",e.newValue,s)}))}}class yk extends so{static get requires(){return[bk]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new _k(this.editor))}}class kk extends Du{constructor(e){super(e);const t=this.locale.t;this.focusTracker=new Js,this.keystrokes=new Qs,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(t("Save"),fu.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(t("Cancel"),fu.cancel,"ck-button-cancel","cancel"),this._focusables=new pu,this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]})}render(){super.render(),this.keystrokes.listenTo(this.element),i({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((e=>{this._focusables.add(e),this.focusTracker.add(e.element)}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createButton(e,t,i,n){const s=new Ku(this.locale);return s.set({label:e,icon:t,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),n&&s.delegate("execute").to(this,n),s}_createLabeledInputView(){const e=this.locale.t,t=new um(this.locale,Um);return t.label=e("Text alternative"),t}}function Ck(e){const t=e.editing.view,i=ef.defaultPositions,n=e.plugins.get("ImageUtils");return{target:t.domConverter.mapViewToDom(n.getClosestSelectedImageWidget(t.document.selection)),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast,i.viewportStickyNorth]}}class Ak extends so{static get requires(){return[If]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton()}destroy(){super.destroy(),this._form&&this._form.destroy()}_createButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("imageTextAlternative",(i=>{const n=e.commands.get("imageTextAlternative"),s=new Ku(i);return s.set({label:t("Change image text alternative"),icon:fu.textAlternative,tooltip:!0}),s.bind("isEnabled").to(n,"isEnabled"),s.bind("isOn").to(n,"value",(e=>!!e)),this.listenTo(s,"execute",(()=>{this._showForm()})),s}))}_createForm(){const i=this.editor,n=i.editing.view.document,s=i.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new(t(kk))(i.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{i.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((e,t)=>{this._hideForm(!0),t()})),this.listenTo(i.ui,"update",(()=>{s.getClosestSelectedImageWidget(n.selection)?this._isVisible&&function(e){const t=e.plugins.get("ContextualBalloon");if(e.plugins.get("ImageUtils").getClosestSelectedImageWidget(e.editing.view.document.selection)){const i=Ck(e);t.updatePosition(i)}}(i):this._hideForm(!0)})),e({emitter:this._form,activator:()=>this._isVisible,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;this._form||this._createForm();const e=this.editor,t=e.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:Ck(e)}),i.fieldView.value=i.fieldView.element.value=t.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(e=!1){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),e&&this.editor.editing.view.focus())}get _isVisible(){return!!this._balloon&&this._balloon.visibleView===this._form}get _isInBalloon(){return!!this._balloon&&this._balloon.hasView(this._form)}}class xk extends so{static get requires(){return[yk,Ak]}static get pluginName(){return"ImageTextAlternative"}}function Ek(e,t){const i=(t,i,n)=>{if(!n.consumable.consume(i.item,t.name))return;const s=n.writer,o=n.mapper.toViewElement(i.item),r=e.findViewImgElement(o);null===i.attributeNewValue?(s.removeAttribute("srcset",r),s.removeAttribute("sizes",r)):i.attributeNewValue&&(s.setAttribute("srcset",i.attributeNewValue,r),s.setAttribute("sizes","100vw",r))};return e=>{e.on(`attribute:srcset:${t}`,i)}}function Tk(e,t,i){const n=(t,i,n)=>{if(!n.consumable.consume(i.item,t.name))return;const s=n.writer,o=n.mapper.toViewElement(i.item),r=e.findViewImgElement(o);s.setAttribute(i.attributeKey,i.attributeNewValue||"",r)};return e=>{e.on(`attribute:${i}:${t}`,n)}}class Sk extends ka{observe(e){this.listenTo(e,"load",((e,t)=>{const i=t.target;this.checkShouldIgnoreEventFromTarget(i)||"IMG"==i.tagName&&this._fireEvents(t)}),{useCapture:!0})}stopObserving(e){this.stopListening(e)}_fireEvents(e){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",e))}}class Pk extends ro{constructor(e){super(e);const t=e.config.get("image.insert.type");e.plugins.has("ImageBlockEditing")||"block"===t&&k("image-block-plugin-required"),e.plugins.has("ImageInlineEditing")||"inline"===t&&k("image-inline-plugin-required")}refresh(){const e=this.editor.plugins.get("ImageUtils");this.isEnabled=e.isImageAllowed()}execute(e){const t=Cs(e.source),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),s=Object.fromEntries(i.getAttributes());t.forEach(((e,t)=>{const o=i.getSelectedElement();if("string"==typeof e&&(e={src:e}),t&&o&&n.isImage(o)){const t=this.editor.model.createPositionAfter(o);n.insertImage({...e,...s},t)}else n.insertImage({...e,...s})}))}}class Ik extends ro{constructor(e){super(e),this.decorate("cleanupImage")}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=e.isImage(t),this.value=this.isEnabled?t.getAttribute("src"):null}execute(e){const t=this.editor.model.document.selection.getSelectedElement(),i=this.editor.plugins.get("ImageUtils");this.editor.model.change((n=>{n.setAttribute("src",e.source,t),this.cleanupImage(n,t),i.setImageNaturalSizeAttributes(t)}))}cleanupImage(e,t){e.removeAttribute("srcset",t),e.removeAttribute("sizes",t),e.removeAttribute("sources",t),e.removeAttribute("width",t),e.removeAttribute("height",t),e.removeAttribute("alt",t)}}class Vk extends so{static get requires(){return[bk]}static get pluginName(){return"ImageEditing"}init(){const e=this.editor,t=e.conversion;e.editing.view.addObserver(Sk),t.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:"srcset"});const i=new Pk(e),n=new Ik(e);e.commands.add("insertImage",i),e.commands.add("replaceImageSource",n),e.commands.add("imageInsert",i)}}class Rk extends so{static get requires(){return[bk]}static get pluginName(){return"ImageSizeAttributes"}afterInit(){this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline")}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:["width","height"]}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:["width","height"]})}_registerConverters(e){const t=this.editor,i=t.plugins.get("ImageUtils"),n="imageBlock"===e?"figure":"img";function s(t,n,s,o){t.on(`attribute:${n}:${e}`,((t,n,r)=>{if(!r.consumable.consume(n.item,t.name))return;const a=r.writer,l=r.mapper.toViewElement(n.item),c=i.findViewImgElement(l);if(null!==n.attributeNewValue?a.setAttribute(s,n.attributeNewValue,c):a.removeAttribute(s,c),n.item.hasAttribute("sources"))return;const d=n.item.hasAttribute("resizedWidth");if("imageInline"===e&&!d&&!o)return;const h=n.item.getAttribute("width"),u=n.item.getAttribute("height");h&&u&&a.setStyle("aspect-ratio",`${h}/${u}`,c)}))}t.conversion.for("upcast").attributeToAttribute({view:{name:n,styles:{width:/.+/}},model:{key:"width",value:e=>fk(e)?gk(e.getStyle("width")):null}}).attributeToAttribute({view:{name:n,key:"width"},model:"width"}).attributeToAttribute({view:{name:n,styles:{height:/.+/}},model:{key:"height",value:e=>fk(e)?gk(e.getStyle("height")):null}}).attributeToAttribute({view:{name:n,key:"height"},model:"height"}),t.conversion.for("editingDowncast").add((e=>{s(e,"width","width",!0),s(e,"height","height",!0)})),t.conversion.for("dataDowncast").add((e=>{s(e,"width","width",!1),s(e,"height","height",!1)}))}}class Ok extends ro{constructor(e,t){super(e),this._modelElementName=t}refresh(){const e=this.editor.plugins.get("ImageUtils"),t=e.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=e.isInlineImage(t):this.isEnabled=e.isBlockImage(t)}execute(e={}){const t=this.editor,i=this.editor.model,n=t.plugins.get("ImageUtils"),s=n.getClosestSelectedImageElement(i.document.selection),o=Object.fromEntries(s.getAttributes());return o.src||o.uploadId?i.change((t=>{const{setImageSizes:r=!0}=e,a=Array.from(i.markers).filter((e=>e.getRange().containsItem(s))),l=n.insertImage(o,i.createSelection(s,"on"),this._modelElementName,{setImageSizes:r});if(!l)return null;const c=t.createRangeOn(l);for(const e of a){const i=e.getRange(),n="$graveyard"!=i.root.rootName?i.getJoined(c,!0):c;t.updateMarker(e,{range:n})}return{oldElement:s,newElement:l}})):null}}class Bk extends so{static get requires(){return[bk]}static get pluginName(){return"ImagePlaceholder"}afterInit(){this._setupSchema(),this._setupConversion(),this._setupLoadListener()}_setupSchema(){const e=this.editor.model.schema;e.isRegistered("imageBlock")&&e.extend("imageBlock",{allowAttributes:["placeholder"]}),e.isRegistered("imageInline")&&e.extend("imageInline",{allowAttributes:["placeholder"]})}_setupConversion(){const e=this.editor,t=e.conversion,i=e.plugins.get("ImageUtils");t.for("editingDowncast").add((e=>{e.on("attribute:placeholder",((e,t,n)=>{if(!n.consumable.test(t.item,e.name))return;if(!t.item.is("element","imageBlock")&&!t.item.is("element","imageInline"))return;n.consumable.consume(t.item,e.name);const s=n.writer,o=n.mapper.toViewElement(t.item),r=i.findViewImgElement(o);t.attributeNewValue?(s.addClass("image_placeholder",r),s.setStyle("background-image",`url(${t.attributeNewValue})`,r),s.setCustomProperty("editingPipeline:doNotReuseOnce",!0,r)):(s.removeClass("image_placeholder",r),s.removeStyle("background-image",r))}))}))}_setupLoadListener(){const e=this.editor,t=e.model,i=e.editing,n=i.view,s=e.plugins.get("ImageUtils");n.addObserver(Sk),this.listenTo(n.document,"imageLoaded",((e,o)=>{const r=n.domConverter.mapDomToView(o.target);if(!r)return;const a=s.getImageWidgetFromImageView(r);if(!a)return;const l=i.mapper.toModelElement(a);l&&l.hasAttribute("placeholder")&&t.enqueueChange({isUndoable:!1},(e=>{e.removeAttribute("placeholder",l)}))}))}}class Mk extends so{static get requires(){return[Vk,Rk,bk,Bk,Sw]}static get pluginName(){return"ImageBlockEditing"}init(){const e=this.editor;e.model.schema.register("imageBlock",{inheritAllFrom:"$blockObject",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),e.plugins.has("ImageInlineEditing")&&(e.commands.add("imageTypeBlock",new Ok(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToStructure({model:"imageBlock",view:(e,{writer:t})=>hk(t)}),i.for("editingDowncast").elementToStructure({model:"imageBlock",view:(e,{writer:i})=>n.toImageWidget(hk(i),i,t("image widget"))}),i.for("downcast").add(Tk(n,"imageBlock","src")).add(Tk(n,"imageBlock","alt")).add(Ek(n,"imageBlock")),i.for("upcast").elementToElement({view:uk(e,"imageBlock"),model:(e,{writer:t})=>t.createElement("imageBlock",e.hasAttribute("src")?{src:e.getAttribute("src")}:void 0)}).add(function(e){const t=(t,i,n)=>{if(!n.consumable.test(i.viewItem,{name:!0,classes:"image"}))return;const s=e.findViewImgElement(i.viewItem);if(!s||!n.consumable.test(s,{name:!0}))return;n.consumable.consume(i.viewItem,{name:!0,classes:"image"});const o=Zs(n.convertItem(s,i.modelCursor).modelRange.getItems());o?(n.convertChildren(i.viewItem,o),n.updateConversionResult(o,i)):n.consumable.revert(i.viewItem,{name:!0,classes:"image"})};return e=>{e.on("element:figure",t)}}(n))}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils"),s=e.plugins.get("ClipboardPipeline");this.listenTo(s,"inputTransformation",((s,o)=>{const r=Array.from(o.content.getChildren());let a;if(!r.every(n.isInlineImageView))return;a=o.targetRanges?e.editing.mapper.toModelRange(o.targetRanges[0]):t.document.selection.getFirstRange();const l=t.createSelection(a);if("imageBlock"===mk(t.schema,l)){const e=new _h(i.document),t=r.map((t=>e.createElement("figure",{class:"image"},t)));o.content=e.createDocumentFragment(t)}})),this.listenTo(s,"contentInsertion",((e,i)=>{"paste"===i.method&&t.change((e=>{const t=e.createRangeIn(i.content);for(const e of t.getItems())e.is("element","imageBlock")&&n.setImageNaturalSizeAttributes(e)}))}))}}class Nk extends Du{constructor(e,t=[]){super(e),this.focusTracker=new Js,this.keystrokes=new Qs,this._focusables=new pu,this.children=this.createCollection(),this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});for(const e of t)this.children.add(e),this._focusables.add(e),e instanceof Xu&&this._focusables.addMany(e.children);if(this._focusables.length>1)for(const e of this._focusables)Fk(e)&&(e.focusCycler.on("forwardCycle",(e=>{this._focusCycler.focusNext(),e.stop()})),e.focusCycler.on("backwardCycle",(e=>{this._focusCycler.focusPrevious(),e.stop()})));this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:-1},children:this.children})}render(){super.render(),i({view:this});for(const e of this._focusables)this.focusTracker.add(e.element);this.keystrokes.listenTo(this.element);const e=e=>e.stopPropagation();this.keystrokes.set("arrowright",e),this.keystrokes.set("arrowleft",e),this.keystrokes.set("arrowup",e),this.keystrokes.set("arrowdown",e)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}}function Fk(e){return"focusCycler"in e}class Dk extends so{static get pluginName(){return"ImageInsertUI"}static get requires(){return[bk]}constructor(e){super(e),this._integrations=new Map,e.config.define("image.insert.integrations",["upload","assetManager","url"])}init(){const e=this.editor,t=e.model.document.selection,i=e.plugins.get("ImageUtils");this.set("isImageSelected",!1),this.listenTo(e.model.document,"change",(()=>{this.isImageSelected=i.isImage(t.getSelectedElement())}));const n=e=>this._createToolbarComponent(e);e.ui.componentFactory.add("insertImage",n),e.ui.componentFactory.add("imageInsert",n)}registerIntegration({name:e,observable:t,buttonViewCreator:i,formViewCreator:n,requiresForm:s}){this._integrations.has(e)&&k("image-insert-integration-exists",{name:e}),this._integrations.set(e,{observable:t,buttonViewCreator:i,formViewCreator:n,requiresForm:!!s})}_createToolbarComponent(e){const t=this.editor,i=e.t,n=this._prepareIntegrations();if(!n.length)return null;let s;const o=n[0];if(1==n.length){if(!o.requiresForm)return o.buttonViewCreator(!0);s=o.buttonViewCreator(!0)}else{const t=o.buttonViewCreator(!1);s=new Fm(e,t),s.tooltip=!0,s.bind("label").to(this,"isImageSelected",(e=>i(e?"Replace image":"Insert image")))}const r=this.dropdownView=Dm(e,s),a=n.map((({observable:e})=>"function"==typeof e?e():e));return r.bind("isEnabled").toMany(a,"isEnabled",((...e)=>e.some((e=>e)))),r.once("change:isOpen",(()=>{const e=n.map((({formViewCreator:e})=>e(1==n.length))),i=new Nk(t.locale,e);r.panelView.children.add(i)})),r}_prepareIntegrations(){const e=this.editor.config.get("image.insert.integrations"),t=[];if(!e.length)return k("image-insert-integrations-not-specified"),t;for(const i of e)this._integrations.has(i)?t.push(this._integrations.get(i)):["upload","assetManager","url"].includes(i)||k("image-insert-unknown-integration",{item:i});return t.length||k("image-insert-integrations-not-registered"),t}}class Lk extends so{static get requires(){return[Mk,ev,xk,Dk]}static get pluginName(){return"ImageBlock"}}class zk extends so{static get requires(){return[Vk,Rk,bk,Bk,Sw]}static get pluginName(){return"ImageInlineEditing"}init(){const e=this.editor,t=e.model.schema;t.register("imageInline",{inheritAllFrom:"$inlineObject",allowAttributes:["alt","src","srcset"]}),t.addChildCheck(((e,t)=>{if(e.endsWith("caption")&&"imageInline"===t.name)return!1})),this._setupConversion(),e.plugins.has("ImageBlockEditing")&&(e.commands.add("imageTypeInline",new Ok(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const e=this.editor,t=e.t,i=e.conversion,n=e.plugins.get("ImageUtils");i.for("dataDowncast").elementToElement({model:"imageInline",view:(e,{writer:t})=>t.createEmptyElement("img")}),i.for("editingDowncast").elementToStructure({model:"imageInline",view:(e,{writer:i})=>n.toImageWidget(function(e){return e.createContainerElement("span",{class:"image-inline"},e.createEmptyElement("img"))}(i),i,t("image widget"))}),i.for("downcast").add(Tk(n,"imageInline","src")).add(Tk(n,"imageInline","alt")).add(Ek(n,"imageInline")),i.for("upcast").elementToElement({view:uk(e,"imageInline"),model:(e,{writer:t})=>t.createElement("imageInline",e.hasAttribute("src")?{src:e.getAttribute("src")}:void 0)})}_setupClipboardIntegration(){const e=this.editor,t=e.model,i=e.editing.view,n=e.plugins.get("ImageUtils"),s=e.plugins.get("ClipboardPipeline");this.listenTo(s,"inputTransformation",((s,o)=>{const r=Array.from(o.content.getChildren());let a;if(!r.every(n.isBlockImageView))return;a=o.targetRanges?e.editing.mapper.toModelRange(o.targetRanges[0]):t.document.selection.getFirstRange();const l=t.createSelection(a);if("imageInline"===mk(t.schema,l)){const e=new _h(i.document),t=r.map((t=>1===t.childCount?(Array.from(t.getAttributes()).forEach((i=>e.setAttribute(...i,n.findViewImgElement(t)))),t.getChild(0)):t));o.content=e.createDocumentFragment(t)}})),this.listenTo(s,"contentInsertion",((e,i)=>{"paste"===i.method&&t.change((e=>{const t=e.createRangeIn(i.content);for(const e of t.getItems())e.is("element","imageInline")&&n.setImageNaturalSizeAttributes(e)}))}))}}class Hk extends so{static get requires(){return[zk,ev,xk,Dk]}static get pluginName(){return"ImageInline"}}class $k extends so{static get pluginName(){return"ImageCaptionUtils"}static get requires(){return[bk]}getCaptionFromImageModelElement(e){for(const t of e.getChildren())if(t&&t.is("element","caption"))return t;return null}getCaptionFromModelSelection(e){const t=this.editor.plugins.get("ImageUtils"),i=e.getFirstPosition().findAncestor("caption");return i&&t.isBlockImage(i.parent)?i:null}matchImageCaptionViewElement(e){const t=this.editor.plugins.get("ImageUtils");return"figcaption"==e.name&&t.isBlockImageView(e.parent)?{name:!0}:null}}class Wk extends ro{refresh(){const e=this.editor,t=e.plugins.get("ImageCaptionUtils"),i=e.plugins.get("ImageUtils");if(!e.plugins.has(Mk))return this.isEnabled=!1,void(this.value=!1);const n=e.model.document.selection,s=n.getSelectedElement();if(!s){const e=t.getCaptionFromModelSelection(n);return this.isEnabled=!!e,void(this.value=!!e)}this.isEnabled=i.isImage(s),this.isEnabled?this.value=!!t.getCaptionFromImageModelElement(s):this.value=!1}execute(e={}){const{focusCaptionOnShow:t}=e;this.editor.model.change((e=>{this.value?this._hideImageCaption(e):this._showImageCaption(e,t)}))}_showImageCaption(e,t){const i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageCaptionEditing"),s=this.editor.plugins.get("ImageUtils");let o=i.getSelectedElement();const r=n._getSavedCaption(o);s.isInlineImage(o)&&(this.editor.execute("imageTypeBlock"),o=i.getSelectedElement());const a=r||e.createElement("caption");e.append(a,o),t&&e.setSelection(a,"in")}_hideImageCaption(e){const t=this.editor,i=t.model.document.selection,n=t.plugins.get("ImageCaptionEditing"),s=t.plugins.get("ImageCaptionUtils");let o,r=i.getSelectedElement();r?o=s.getCaptionFromImageModelElement(r):(o=s.getCaptionFromModelSelection(i),r=o.parent),n._saveCaption(r,o),e.setSelection(r,"on"),e.remove(o)}}class jk extends so{static get requires(){return[bk,$k]}static get pluginName(){return"ImageCaptionEditing"}constructor(e){super(e),this._savedCaptionsMap=new WeakMap}init(){const e=this.editor,t=e.model.schema;t.isRegistered("caption")?t.extend("caption",{allowIn:"imageBlock"}):t.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),e.commands.add("toggleImageCaption",new Wk(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration(),this._registerCaptionReconversion()}_setupConversion(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils"),n=e.plugins.get("ImageCaptionUtils"),s=e.t;e.conversion.for("upcast").elementToElement({view:e=>n.matchImageCaptionViewElement(e),model:"caption"}),e.conversion.for("dataDowncast").elementToElement({model:"caption",view:(e,{writer:t})=>i.isBlockImage(e.parent)?t.createContainerElement("figcaption"):null}),e.conversion.for("editingDowncast").elementToElement({model:"caption",view:(e,{writer:n})=>{if(!i.isBlockImage(e.parent))return null;const o=n.createEditableElement("figcaption");n.setCustomProperty("imageCaption",!0,o),o.placeholder=s("Enter image caption"),fo({view:t,element:o,keepOnFocus:!0});const r=e.parent.getAttribute("alt");return Hw(o,n,{label:r?s("Caption for image: %0",[r]):s("Caption for the image")})}})}_setupImageTypeCommandsIntegration(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.plugins.get("ImageCaptionUtils"),n=e.commands.get("imageTypeInline"),s=e.commands.get("imageTypeBlock"),o=e=>{if(!e.return)return;const{oldElement:n,newElement:s}=e.return;if(!n)return;if(t.isBlockImage(n)){const e=i.getCaptionFromImageModelElement(n);if(e)return void this._saveCaption(s,e)}const o=this._getSavedCaption(n);o&&this._saveCaption(s,o)};n&&this.listenTo(n,"execute",o,{priority:"low"}),s&&this.listenTo(s,"execute",o,{priority:"low"})}_getSavedCaption(e){const t=this._savedCaptionsMap.get(e);return t?xl.fromJSON(t):null}_saveCaption(e,t){this._savedCaptionsMap.set(e,t.toJSON())}_registerCaptionReconversion(){const e=this.editor,t=e.model,i=e.plugins.get("ImageUtils"),n=e.plugins.get("ImageCaptionUtils");t.document.on("change:data",(()=>{const s=t.document.differ.getChanges();for(const t of s){if("alt"!==t.attributeKey)continue;const s=t.range.start.nodeAfter;if(i.isBlockImage(s)){const t=n.getCaptionFromImageModelElement(s);if(!t)return;e.editing.reconvertItem(t)}}}))}}class Uk extends so{static get requires(){return[$k]}static get pluginName(){return"ImageCaptionUI"}init(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageCaptionUtils"),n=e.t;e.ui.componentFactory.add("toggleImageCaption",(s=>{const o=e.commands.get("toggleImageCaption"),r=new Ku(s);return r.set({icon:fu.caption,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),r.bind("label").to(o,"value",(e=>n(e?"Toggle caption off":"Toggle caption on"))),this.listenTo(r,"execute",(()=>{e.execute("toggleImageCaption",{focusCaptionOnShow:!0});const n=i.getCaptionFromModelSelection(e.model.document.selection);if(n){const i=e.editing.mapper.toViewElement(n);t.scrollToTheSelection(),t.change((e=>{e.addClass("image__caption_highlighted",i)}))}e.editing.view.focus()})),r}))}}function qk(e){const t=e.map((e=>e.replace("+","\\+")));return new RegExp(`^image\\/(${t.join("|")})$`)}function Gk(e){return new Promise(((t,i)=>{const n=e.getAttribute("src");fetch(n).then((e=>e.blob())).then((e=>{const i=Kk(e,n),s=i.replace("image/",""),o=new File([e],`image.${s}`,{type:i});t(o)})).catch((e=>e&&"TypeError"===e.name?function(e){return function(e){return new Promise(((t,i)=>{const n=Mn.document.createElement("img");n.addEventListener("load",(()=>{const e=Mn.document.createElement("canvas");e.width=n.width,e.height=n.height;e.getContext("2d").drawImage(n,0,0),e.toBlob((e=>e?t(e):i()))})),n.addEventListener("error",(()=>i())),n.src=e}))}(e).then((t=>{const i=Kk(t,e),n=i.replace("image/","");return new File([t],`image.${n}`,{type:i})}))}(n).then(t).catch(i):i(e)))}))}function Kk(e,t){return e.type?e.type:t.match(/data:(image\/\w+);base64/)?t.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class Zk extends so{static get pluginName(){return"ImageUploadUI"}init(){const e=this.editor,t=e.t,i=()=>{const e=this._createButton(Ju);return e.set({label:t("Upload image from computer"),tooltip:!0}),e};if(e.ui.componentFactory.add("uploadImage",i),e.ui.componentFactory.add("imageUpload",i),e.ui.componentFactory.add("menuBar:uploadImage",(()=>{const e=this._createButton(mp);return e.label=t("Image from computer"),e})),e.plugins.has("ImageInsertUI")){const i=e.plugins.get("ImageInsertUI");i.registerIntegration({name:"upload",observable:()=>e.commands.get("uploadImage"),buttonViewCreator:()=>{const n=e.ui.componentFactory.create("uploadImage");return n.bind("label").to(i,"isImageSelected",(e=>t(e?"Replace image from computer":"Upload image from computer"))),n},formViewCreator:()=>{const n=e.ui.componentFactory.create("uploadImage");return n.withText=!0,n.bind("label").to(i,"isImageSelected",(e=>t(e?"Replace from computer":"Upload from computer"))),n.on("execute",(()=>{i.dropdownView.isOpen=!1})),n}})}}_createButton(e){const t=this.editor,i=t.locale,n=t.commands.get("uploadImage"),s=t.config.get("image.upload.types"),o=qk(s),r=new e(t.locale),a=i.t;return r.set({acceptedType:s.map((e=>`image/${e}`)).join(","),allowMultipleFiles:!0,label:a("Upload image from computer"),icon:fu.imageUpload}),r.bind("isEnabled").to(n),r.on("done",((e,i)=>{const n=Array.from(i).filter((e=>o.test(e.type)));n.length&&(t.execute("uploadImage",{file:n}),t.editing.view.focus())})),r}}class Jk extends(G()){constructor(){super();const e=new window.FileReader;this._reader=e,this._data=void 0,this.set("loaded",0),e.onprogress=e=>{this.loaded=e.loaded}}get error(){return this._reader.error}get data(){return this._data}read(e){const t=this._reader;return this.total=e.size,new Promise(((i,n)=>{t.onload=()=>{const e=t.result;this._data=e,i(e)},t.onerror=()=>{n("error")},t.onabort=()=>{n("aborted")},this._reader.readAsDataURL(e)}))}abort(){this._reader.abort()}}class Qk extends so{constructor(){super(...arguments),this.loaders=new Ks,this._loadersMap=new Map,this._pendingAction=null}static get pluginName(){return"FileRepository"}static get requires(){return[gu]}init(){this.loaders.on("change",(()=>this._updatePendingAction())),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((e,t)=>t?e/t*100:0))}getLoader(e){return this._loadersMap.get(e)||null}createLoader(e){if(!this.createUploadAdapter)return k("filerepository-no-upload-adapter"),null;const t=new Yk(Promise.resolve(e),this.createUploadAdapter);return this.loaders.add(t),this._loadersMap.set(e,t),e instanceof Promise&&t.file.then((e=>{this._loadersMap.set(e,t)})).catch((()=>{})),t.on("change:uploaded",(()=>{let e=0;for(const t of this.loaders)e+=t.uploaded;this.uploaded=e})),t.on("change:uploadTotal",(()=>{let e=0;for(const t of this.loaders)t.uploadTotal&&(e+=t.uploadTotal);this.uploadTotal=e})),t}destroyLoader(e){const t=e instanceof Yk?e:this.getLoader(e);t._destroy(),this.loaders.remove(t),this._loadersMap.forEach(((e,i)=>{e===t&&this._loadersMap.delete(i)}))}_updatePendingAction(){const e=this.editor.plugins.get(gu);if(this.loaders.length){if(!this._pendingAction){const t=this.editor.t,i=e=>`${t("Upload in progress")} ${parseInt(e)}%.`;this._pendingAction=e.add(i(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",i)}}else e.remove(this._pendingAction),this._pendingAction=null}}class Yk extends(G()){constructor(e,t){super(),this.id=b(),this._filePromiseWrapper=this._createFilePromiseWrapper(e),this._adapter=t(this),this._reader=new Jk,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((e,t)=>t?e/t*100:0)),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then((e=>this._filePromiseWrapper?e:null)):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new y("filerepository-read-wrong-status",this);return this.status="reading",this.file.then((e=>this._reader.read(e))).then((e=>{if("reading"!==this.status)throw this.status;return this.status="idle",e})).catch((e=>{if("aborted"===e)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:e}))}upload(){if("idle"!=this.status)throw new y("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then((()=>this._adapter.upload())).then((e=>(this.uploadResponse=e,this.status="idle",e))).catch((e=>{if("aborted"===this.status)throw"aborted";throw this.status="error",e}))}abort(){const e=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==e?this._reader.abort():"uploading"==e&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch((()=>{})),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(e){const t={};return t.promise=new Promise(((i,n)=>{t.rejecter=n,t.isFulfilled=!1,e.then((e=>{t.isFulfilled=!0,i(e)})).catch((e=>{t.isFulfilled=!0,n(e)}))})),t}}class Xk extends so{static get pluginName(){return"ImageUploadProgress"}constructor(e){super(e),this.uploadStatusChange=(e,t,i)=>{const n=this.editor,s=t.item,o=s.getAttribute("uploadId");if(!i.consumable.consume(t.item,e.name))return;const r=n.plugins.get("ImageUtils"),a=n.plugins.get(Qk),l=o?t.attributeNewValue:null,c=this.placeholder,d=n.editing.mapper.toViewElement(s),h=i.writer;if("reading"==l)return eC(d,h),void tC(r,c,d,h);if("uploading"==l){const e=a.loaders.get(o);return eC(d,h),void(e?(iC(d,h),function(e,t,i,n){const s=function(e){const t=e.createUIElement("div",{class:"ck-progress-bar"});return e.setCustomProperty("progressBar",!0,t),t}(t);t.insert(t.createPositionAt(e,"end"),s),i.on("change:uploadedPercent",((e,t,i)=>{n.change((e=>{e.setStyle("width",i+"%",s)}))}))}(d,h,e,n.editing.view),function(e,t,i,n){if(n.data){const s=e.findViewImgElement(t);i.setAttribute("src",n.data,s)}}(r,d,h,e)):tC(r,c,d,h))}"complete"==l&&a.loaders.get(o)&&function(e,t,i){const n=t.createUIElement("div",{class:"ck-image-upload-complete-icon"});t.insert(t.createPositionAt(e,"end"),n),setTimeout((()=>{i.change((e=>e.remove(e.createRangeOn(n))))}),3e3)}(d,h,n.editing.view),function(e,t){sC(e,t,"progressBar")}(d,h),iC(d,h),function(e,t){t.removeClass("ck-appear",e)}(d,h)},this.placeholder="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="}init(){const e=this.editor;e.plugins.has("ImageBlockEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",this.uploadStatusChange),e.plugins.has("ImageInlineEditing")&&e.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",this.uploadStatusChange)}}function eC(e,t){e.hasClass("ck-appear")||t.addClass("ck-appear",e)}function tC(e,t,i,n){i.hasClass("ck-image-upload-placeholder")||n.addClass("ck-image-upload-placeholder",i);const s=e.findViewImgElement(i);s.getAttribute("src")!==t&&n.setAttribute("src",t,s),nC(i,"placeholder")||n.insert(n.createPositionAfter(s),function(e){const t=e.createUIElement("div",{class:"ck-upload-placeholder-loader"});return e.setCustomProperty("placeholder",!0,t),t}(n))}function iC(e,t){e.hasClass("ck-image-upload-placeholder")&&t.removeClass("ck-image-upload-placeholder",e),sC(e,t,"placeholder")}function nC(e,t){for(const i of e.getChildren())if(i.getCustomProperty(t))return i}function sC(e,t,i){const n=nC(e,i);n&&t.remove(t.createRangeOn(n))}class oC extends ro{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils"),i=e.model.document.selection.getSelectedElement();this.isEnabled=t.isImageAllowed()||t.isImage(i)}execute(e){const t=Cs(e.file),i=this.editor.model.document.selection,n=this.editor.plugins.get("ImageUtils"),s=Object.fromEntries(i.getAttributes());t.forEach(((e,t)=>{const o=i.getSelectedElement();if(t&&o&&n.isImage(o)){const t=this.editor.model.createPositionAfter(o);this._uploadImage(e,s,t)}else this._uploadImage(e,s)}))}_uploadImage(e,t,i){const n=this.editor,s=n.plugins.get(Qk).createLoader(e),o=n.plugins.get("ImageUtils");s&&o.insertImage({...t,uploadId:s.id},i)}}class rC extends so{static get requires(){return[Qk,Tf,Sw,bk]}static get pluginName(){return"ImageUploadEditing"}constructor(e){super(e),e.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}init(){const e=this.editor,t=e.model.document,i=e.conversion,n=e.plugins.get(Qk),s=e.plugins.get("ImageUtils"),o=e.plugins.get("ClipboardPipeline"),r=qk(e.config.get("image.upload.types")),a=new oC(e);e.commands.add("uploadImage",a),e.commands.add("imageUpload",a),i.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(e.editing.view.document,"clipboardInput",((t,i)=>{if(n=i.dataTransfer,Array.from(n.types).includes("text/html")&&""!==n.getData("text/html"))return;var n;const s=Array.from(i.dataTransfer.files).filter((e=>!!e&&r.test(e.type)));s.length&&(t.stop(),e.model.change((t=>{i.targetRanges&&t.setSelection(i.targetRanges.map((t=>e.editing.mapper.toModelRange(t)))),e.execute("uploadImage",{file:s})})))})),this.listenTo(o,"inputTransformation",((t,i)=>{const o=Array.from(e.editing.view.createRangeIn(i.content)).map((e=>e.item)).filter((e=>function(e,t){return!(!e.isInlineImageView(t)||!t.getAttribute("src")||!t.getAttribute("src").match(/^data:image\/\w+;base64,/g)&&!t.getAttribute("src").match(/^blob:/g))}(s,e)&&!e.getAttribute("uploadProcessed"))).map((e=>({promise:Gk(e),imageElement:e})));if(!o.length)return;const r=new _h(e.editing.view.document);for(const e of o){r.setAttribute("uploadProcessed",!0,e.imageElement);const t=n.createLoader(e.promise);t&&(r.setAttribute("src","",e.imageElement),r.setAttribute("uploadId",t.id,e.imageElement))}})),e.editing.view.document.on("dragover",((e,t)=>{t.preventDefault()})),t.on("change",(()=>{const i=t.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),s=new Set;for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter,o="$graveyard"==t.position.root.rootName;for(const t of aC(e,i)){const e=t.getAttribute("uploadId");if(!e)continue;const i=n.loaders.get(e);i&&(o?s.has(e)||i.abort():(s.add(e),this._uploadImageElements.set(e,t),"idle"==i.status&&this._readAndUpload(i)))}}})),this.on("uploadComplete",((e,{imageElement:t,data:i})=>{const n=i.urls?i.urls:i;this.editor.model.change((e=>{e.setAttribute("src",n.default,t),this._parseAndSetSrcsetAttributeOnImage(n,t,e),s.setImageNaturalSizeAttributes(t)}))}),{priority:"low"})}afterInit(){const e=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&e.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&e.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(e){const t=this.editor,i=t.model,n=t.locale.t,s=t.plugins.get(Qk),o=t.plugins.get(Tf),r=t.plugins.get("ImageUtils"),a=this._uploadImageElements;return i.enqueueChange({isUndoable:!1},(t=>{t.setAttribute("uploadStatus","reading",a.get(e.id))})),e.read().then((()=>{const n=e.upload(),s=a.get(e.id);if(l.isSafari){const e=t.editing.mapper.toViewElement(s),i=r.findViewImgElement(e);t.editing.view.once("render",(()=>{if(!i.parent)return;const e=t.editing.view.domConverter.mapViewToDom(i.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n}))}return i.enqueueChange({isUndoable:!1},(e=>{e.setAttribute("uploadStatus","uploading",s)})),n})).then((t=>{i.enqueueChange({isUndoable:!1},(i=>{const n=a.get(e.id);i.setAttribute("uploadStatus","complete",n),this.fire("uploadComplete",{data:t,imageElement:n})})),c()})).catch((t=>{if("error"!==e.status&&"aborted"!==e.status)throw t;"error"==e.status&&t&&o.showWarning(t,{title:n("Upload failed"),namespace:"upload"}),i.enqueueChange({isUndoable:!1},(t=>{t.remove(a.get(e.id))})),c()}));function c(){i.enqueueChange({isUndoable:!1},(t=>{const i=a.get(e.id);t.removeAttribute("uploadId",i),t.removeAttribute("uploadStatus",i),a.delete(e.id)})),s.destroyLoader(e)}}_parseAndSetSrcsetAttributeOnImage(e,t,i){let n=0;const s=Object.keys(e).filter((e=>{const t=parseInt(e,10);if(!isNaN(t))return n=Math.max(n,t),!0})).map((t=>`${e[t]} ${t}w`)).join(", ");if(""!=s){const e={srcset:s};t.hasAttribute("width")||t.hasAttribute("height")||(e.width=n),i.setAttributes(e,t)}}}function aC(e,t){const i=e.plugins.get("ImageUtils");return Array.from(e.model.createRangeOn(t)).filter((e=>i.isImage(e.item))).map((e=>e.item))}class lC extends so{static get pluginName(){return"ImageUpload"}static get requires(){return[rC,Zk,Xk]}}class cC extends Du{constructor(e){super(e),this.set("imageURLInputValue",""),this.set("isImageSelected",!1),this.set("isEnabled",!0),this.focusTracker=new Js,this.keystrokes=new Qs,this._focusables=new pu,this.focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.urlInputView=this._createUrlInputView(),this.insertButtonView=this._createInsertButton(),this.cancelButtonView=this._createCancelButton(),this._focusables.addMany([this.urlInputView,this.insertButtonView,this.cancelButtonView]),this.setTemplate({tag:"div",attributes:{class:["ck","ck-image-insert-url"]},children:[this.urlInputView,{tag:"div",attributes:{class:["ck","ck-image-insert-url__action-row"]},children:[this.insertButtonView,this.cancelButtonView]}]})}render(){super.render();for(const e of this._focusables)this.focusTracker.add(e.element);this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createUrlInputView(){const e=this.locale,t=e.t,i=new um(e,Um);return i.bind("label").to(this,"isImageSelected",(e=>t(e?"Update image URL":"Insert image via URL"))),i.bind("isEnabled").to(this),i.fieldView.placeholder="https://example.com/image.png",i.fieldView.bind("value").to(this,"imageURLInputValue",(e=>e||"")),i.fieldView.on("input",(()=>{this.imageURLInputValue=i.fieldView.element.value.trim()})),i}_createInsertButton(){const e=this.locale,t=e.t,i=new Ku(e);return i.set({icon:fu.check,class:"ck-button-save",type:"submit",withText:!0}),i.bind("label").to(this,"isImageSelected",(e=>t(e?"Update":"Insert"))),i.bind("isEnabled").to(this,"imageURLInputValue",this,"isEnabled",((...e)=>e.every((e=>e)))),i.delegate("execute").to(this,"submit"),i}_createCancelButton(){const e=this.locale,t=e.t,i=new Ku(e);return i.set({label:t("Cancel"),icon:fu.cancel,class:"ck-button-cancel",withText:!0}),i.bind("isEnabled").to(this),i.delegate("execute").to(this,"cancel"),i}focus(e){-1===e?this.focusCycler.focusLast():this.focusCycler.focusFirst()}}class dC extends so{static get pluginName(){return"ImageInsertViaUrlUI"}static get requires(){return[Dk]}afterInit(){this._imageInsertUI=this.editor.plugins.get("ImageInsertUI"),this._imageInsertUI.registerIntegration({name:"url",observable:()=>this.editor.commands.get("insertImage"),requiresForm:!0,buttonViewCreator:e=>this._createInsertUrlButton(e),formViewCreator:e=>this._createInsertUrlView(e)})}_createInsertUrlView(e){const t=this.editor,i=t.locale,n=i.t,s=t.commands.get("replaceImageSource"),o=t.commands.get("insertImage"),r=new cC(i),a=e?null:new Xu(i,[r]);return r.bind("isImageSelected").to(this._imageInsertUI),r.bind("isEnabled").toMany([o,s],"isEnabled",((...e)=>e.some((e=>e)))),r.imageURLInputValue=s.value||"",this._imageInsertUI.dropdownView.on("change:isOpen",(()=>{this._imageInsertUI.dropdownView.isOpen&&(r.imageURLInputValue=s.value||"",a&&(a.isCollapsed=!0))}),{priority:"low"}),r.on("submit",(()=>{s.isEnabled?t.execute("replaceImageSource",{source:r.imageURLInputValue}):t.execute("insertImage",{source:r.imageURLInputValue}),this._closePanel()})),r.on("cancel",(()=>this._closePanel())),a?(a.set({isCollapsed:!0}),a.bind("label").to(this._imageInsertUI,"isImageSelected",(e=>n(e?"Update image URL":"Insert image via URL"))),a):r}_createInsertUrlButton(e){const t=e?_m:Ku,i=this.editor,n=new t(i.locale),s=i.locale.t;return n.set({icon:fu.imageUrl,tooltip:!0}),n.bind("label").to(this._imageInsertUI,"isImageSelected",(e=>s(e?"Update image URL":"Insert image via URL"))),n}_closePanel(){this.editor.editing.view.focus(),this._imageInsertUI.dropdownView.isOpen=!1}}class hC extends so{static get pluginName(){return"ImageInsertViaUrl"}static get requires(){return[dC,Dk]}}class uC extends ro{refresh(){const e=this.editor,t=e.plugins.get("ImageUtils").getClosestSelectedImageElement(e.model.document.selection);this.isEnabled=!!t,t&&t.hasAttribute("resizedWidth")?this.value={width:t.getAttribute("resizedWidth"),height:null}:this.value=null}execute(e){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils"),s=n.getClosestSelectedImageElement(i.document.selection);this.value={width:e.width,height:null},s&&i.change((t=>{t.setAttribute("resizedWidth",e.width,s),t.removeAttribute("resizedHeight",s),n.setImageNaturalSizeAttributes(s)}))}}class mC extends so{static get requires(){return[bk]}static get pluginName(){return"ImageResizeEditing"}constructor(e){super(e),e.config.define("image",{resizeUnit:"%",resizeOptions:[{name:"resizeImage:original",value:null,icon:"original"},{name:"resizeImage:25",value:"25",icon:"small"},{name:"resizeImage:50",value:"50",icon:"medium"},{name:"resizeImage:75",value:"75",icon:"large"}]})}init(){const e=this.editor,t=new uC(e);this._registerConverters("imageBlock"),this._registerConverters("imageInline"),e.commands.add("resizeImage",t),e.commands.add("imageResize",t)}afterInit(){this._registerSchema()}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:["resizedWidth","resizedHeight"]}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:["resizedWidth","resizedHeight"]})}_registerConverters(e){const t=this.editor,i=t.plugins.get("ImageUtils");t.conversion.for("downcast").add((t=>t.on(`attribute:resizedWidth:${e}`,((e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=i.writer,s=i.mapper.toViewElement(t.item);null!==t.attributeNewValue?(n.setStyle("width",t.attributeNewValue,s),n.addClass("image_resized",s)):(n.removeStyle("width",s),n.removeClass("image_resized",s))})))),t.conversion.for("dataDowncast").attributeToAttribute({model:{name:e,key:"resizedHeight"},view:e=>({key:"style",value:{height:e}})}),t.conversion.for("editingDowncast").add((t=>t.on(`attribute:resizedHeight:${e}`,((t,n,s)=>{if(!s.consumable.consume(n.item,t.name))return;const o=s.writer,r=s.mapper.toViewElement(n.item),a="imageInline"===e?i.findViewImgElement(r):r;null!==n.attributeNewValue?o.setStyle("height",n.attributeNewValue,a):o.removeStyle("height",a)})))),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{width:/.+/}},model:{key:"resizedWidth",value:e=>fk(e)?null:e.getStyle("width")}}),t.conversion.for("upcast").attributeToAttribute({view:{name:"imageBlock"===e?"figure":"img",styles:{height:/.+/}},model:{key:"resizedHeight",value:e=>fk(e)?null:e.getStyle("height")}})}}const gC={small:fu.objectSizeSmall,medium:fu.objectSizeMedium,large:fu.objectSizeLarge,original:fu.objectSizeFull};class fC extends so{static get requires(){return[mC]}static get pluginName(){return"ImageResizeButtons"}constructor(e){super(e),this._resizeUnit=e.config.get("image.resizeUnit")}init(){const e=this.editor,t=e.config.get("image.resizeOptions"),i=e.commands.get("resizeImage");this.bind("isEnabled").to(i);for(const e of t)this._registerImageResizeButton(e);this._registerImageResizeDropdown(t)}_registerImageResizeButton(e){const t=this.editor,{name:i,value:n,icon:s}=e,o=n?n+this._resizeUnit:null;t.ui.componentFactory.add(i,(i=>{const n=new Ku(i),r=t.commands.get("resizeImage"),a=this._getOptionLabelValue(e,!0);if(!gC[s])throw new y("imageresizebuttons-missing-icon",t,e);return n.set({label:a,icon:gC[s],tooltip:a,isToggleable:!0}),n.bind("isEnabled").to(this),n.bind("isOn").to(r,"value",pC(o)),this.listenTo(n,"execute",(()=>{t.execute("resizeImage",{width:o})})),n}))}_registerImageResizeDropdown(e){const t=this.editor,i=t.t,n=e.find((e=>!e.value)),s=s=>{const o=t.commands.get("resizeImage"),r=Dm(s,_m),a=r.buttonView,l=i("Resize image");return a.set({tooltip:l,commandValue:n.value,icon:gC.medium,isToggleable:!0,label:this._getOptionLabelValue(n),withText:!0,class:"ck-resize-image-button",ariaLabel:l,ariaLabelledBy:void 0}),a.bind("label").to(o,"value",(e=>e&&e.width?e.width:this._getOptionLabelValue(n))),r.bind("isEnabled").to(this),Hm(r,(()=>this._getResizeDropdownListItemDefinitions(e,o)),{ariaLabel:i("Image resize list"),role:"menu"}),this.listenTo(r,"execute",(e=>{t.execute(e.source.commandName,{width:e.source.commandValue}),t.editing.view.focus()})),r};t.ui.componentFactory.add("resizeImage",s),t.ui.componentFactory.add("imageResize",s)}_getOptionLabelValue(e,t=!1){const i=this.editor.t;return e.label?e.label:t?e.value?i("Resize image to %0",e.value+this._resizeUnit):i("Resize image to the original size"):e.value?e.value+this._resizeUnit:i("Original")}_getResizeDropdownListItemDefinitions(e,t){const i=new Ks;return e.map((e=>{const n=e.value?e.value+this._resizeUnit:null,s={type:"button",model:new Sf({commandName:"resizeImage",commandValue:n,label:this._getOptionLabelValue(e),role:"menuitemradio",withText:!0,icon:null})};s.model.bind("isOn").to(t,"value",pC(n)),i.add(s)})),i}}function pC(e){return t=>null===e&&t===e||null!==t&&t.width===e}const bC="image_resized";class wC extends so{static get requires(){return[cv,bk]}static get pluginName(){return"ImageResizeHandles"}init(){const e=this.editor.commands.get("resizeImage");this.bind("isEnabled").to(e),this._setupResizerCreator()}_setupResizerCreator(){const e=this.editor,t=e.editing.view,i=e.plugins.get("ImageUtils");t.addObserver(Sk),this.listenTo(t.document,"imageLoaded",((n,s)=>{if(!s.target.matches("figure.image.ck-widget > img,figure.image.ck-widget > picture > img,figure.image.ck-widget > a > img,figure.image.ck-widget > a > picture > img,span.image-inline.ck-widget > img,span.image-inline.ck-widget > picture > img"))return;const o=e.editing.view.domConverter,r=o.domToView(s.target),a=i.getImageWidgetFromImageView(r);let l=this.editor.plugins.get(cv).getResizerByViewElement(a);if(l)return void l.redraw();const c=e.editing.mapper,d=c.toModelElement(a);l=e.plugins.get(cv).attachTo({unit:e.config.get("image.resizeUnit"),modelElement:d,viewElement:a,editor:e,getHandleHost:e=>e.querySelector("img"),getResizeHost:()=>o.mapViewToDom(c.toViewElement(d.parent)),isCentered:()=>"alignCenter"==d.getAttribute("imageStyle"),onCommit(i){t.change((e=>{e.removeClass(bC,a)})),e.execute("resizeImage",{width:i})}}),l.on("updateSize",(()=>{a.hasClass(bC)||t.change((e=>{e.addClass(bC,a)}));const e="imageInline"===d.name?r:a;e.getStyle("height")&&t.change((t=>{t.removeStyle("height",e)}))})),l.bind("isEnabled").to(this)}))}}class vC extends ro{constructor(e,t){super(e),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(t.map((e=>{if(e.isDefault)for(const t of e.modelElements)this._defaultStyles[t]=e.name;return[e.name,e]})))}refresh(){const e=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!e,this.isEnabled?e.hasAttribute("imageStyle")?this.value=e.getAttribute("imageStyle"):this.value=this._defaultStyles[e.name]:this.value=!1}execute(e={}){const t=this.editor,i=t.model,n=t.plugins.get("ImageUtils");i.change((t=>{const s=e.value,{setImageSizes:o=!0}=e;let r=n.getClosestSelectedImageElement(i.document.selection);s&&this.shouldConvertImageType(s,r)&&(this.editor.execute(n.isBlockImage(r)?"imageTypeInline":"imageTypeBlock",{setImageSizes:o}),r=n.getClosestSelectedImageElement(i.document.selection)),!s||this._styles.get(s).isDefault?t.removeAttribute("imageStyle",r):t.setAttribute("imageStyle",s,r),o&&n.setImageNaturalSizeAttributes(r)}))}shouldConvertImageType(e,t){return!this._styles.get(e).modelElements.includes(t.name)}}const{objectFullWidth:_C,objectInline:yC,objectLeft:kC,objectRight:CC,objectCenter:AC,objectBlockLeft:xC,objectBlockRight:EC}=fu,TC={get inline(){return{name:"inline",title:"In line",icon:yC,modelElements:["imageInline"],isDefault:!0}},get alignLeft(){return{name:"alignLeft",title:"Left aligned image",icon:kC,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"}},get alignBlockLeft(){return{name:"alignBlockLeft",title:"Left aligned image",icon:xC,modelElements:["imageBlock"],className:"image-style-block-align-left"}},get alignCenter(){return{name:"alignCenter",title:"Centered image",icon:AC,modelElements:["imageBlock"],className:"image-style-align-center"}},get alignRight(){return{name:"alignRight",title:"Right aligned image",icon:CC,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"}},get alignBlockRight(){return{name:"alignBlockRight",title:"Right aligned image",icon:EC,modelElements:["imageBlock"],className:"image-style-block-align-right"}},get block(){return{name:"block",title:"Centered image",icon:AC,modelElements:["imageBlock"],isDefault:!0}},get side(){return{name:"side",title:"Side image",icon:CC,modelElements:["imageBlock"],className:"image-style-side"}}},SC={full:_C,left:xC,right:EC,center:AC,inlineLeft:kC,inlineRight:CC,inline:yC},PC=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function IC(e){k("image-style-configuration-definition-invalid",e)}const VC={normalizeStyles:function(e){return(e.configuredStyles.options||[]).map((e=>function(e){e="string"==typeof e?TC[e]?{...TC[e]}:{name:e}:function(e,t){const i={...t};for(const n in e)Object.prototype.hasOwnProperty.call(t,n)||(i[n]=e[n]);return i}(TC[e.name],e);"string"==typeof e.icon&&(e.icon=SC[e.icon]||e.icon);return e}(e))).filter((t=>function(e,{isBlockPluginLoaded:t,isInlinePluginLoaded:i}){const{modelElements:n,name:s}=e;if(!(n&&n.length&&s))return IC({style:e}),!1;{const s=[t?"imageBlock":null,i?"imageInline":null];if(!n.some((e=>s.includes(e))))return k("image-style-missing-dependency",{style:e,missingPlugins:n.map((e=>"imageBlock"===e?"ImageBlockEditing":"ImageInlineEditing"))}),!1}return!0}(t,e)))},getDefaultStylesConfiguration:function(e,t){return e&&t?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:e?{options:["block","side"]}:t?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(e){return e.has("ImageBlockEditing")&&e.has("ImageInlineEditing")?[...PC]:[]},warnInvalidStyle:IC,DEFAULT_OPTIONS:TC,DEFAULT_ICONS:SC,DEFAULT_DROPDOWN_DEFINITIONS:PC};function RC(e,t){for(const i of t)if(i.name===e)return i}class OC extends so{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[bk]}init(){const{normalizeStyles:e,getDefaultStylesConfiguration:t}=VC,i=this.editor,n=i.plugins.has("ImageBlockEditing"),s=i.plugins.has("ImageInlineEditing");i.config.define("image.styles",t(n,s)),this.normalizedStyles=e({configuredStyles:i.config.get("image.styles"),isBlockPluginLoaded:n,isInlinePluginLoaded:s}),this._setupConversion(n,s),this._setupPostFixer(),i.commands.add("imageStyle",new vC(i,this.normalizedStyles))}_setupConversion(e,t){const i=this.editor,n=i.model.schema,s=(o=this.normalizedStyles,(e,t,i)=>{if(!i.consumable.consume(t.item,e.name))return;const n=RC(t.attributeNewValue,o),s=RC(t.attributeOldValue,o),r=i.mapper.toViewElement(t.item),a=i.writer;s&&a.removeClass(s.className,r),n&&a.addClass(n.className,r)});var o;const r=function(e){const t={imageInline:e.filter((e=>!e.isDefault&&e.modelElements.includes("imageInline"))),imageBlock:e.filter((e=>!e.isDefault&&e.modelElements.includes("imageBlock")))};return(e,i,n)=>{if(!i.modelRange)return;const s=i.viewItem,o=Zs(i.modelRange.getItems());if(o&&n.schema.checkAttribute(o,"imageStyle"))for(const e of t[o.name])n.consumable.consume(s,{classes:e.className})&&n.writer.setAttribute("imageStyle",e.name,o)}}(this.normalizedStyles);i.editing.downcastDispatcher.on("attribute:imageStyle",s),i.data.downcastDispatcher.on("attribute:imageStyle",s),e&&(n.extend("imageBlock",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:figure",r,{priority:"low"})),t&&(n.extend("imageInline",{allowAttributes:"imageStyle"}),i.data.upcastDispatcher.on("element:img",r,{priority:"low"}))}_setupPostFixer(){const e=this.editor,t=e.model.document,i=e.plugins.get(bk),n=new Map(this.normalizedStyles.map((e=>[e.name,e])));t.registerPostFixer((e=>{let s=!1;for(const o of t.differ.getChanges())if("insert"==o.type||"attribute"==o.type&&"imageStyle"==o.attributeKey){let t="insert"==o.type?o.position.nodeAfter:o.range.start.nodeAfter;if(t&&t.is("element","paragraph")&&t.childCount>0&&(t=t.getChild(0)),!i.isImage(t))continue;const r=t.getAttribute("imageStyle");if(!r)continue;const a=n.get(r);a&&a.modelElements.includes(t.name)||(e.removeAttribute("imageStyle",t),s=!0)}return s}))}}class BC extends so{static get requires(){return[OC]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const e=this.editor.t;return{"Wrap text":e("Wrap text"),"Break text":e("Break text"),"In line":e("In line"),"Full size image":e("Full size image"),"Side image":e("Side image"),"Left aligned image":e("Left aligned image"),"Centered image":e("Centered image"),"Right aligned image":e("Right aligned image")}}init(){const e=this.editor.plugins,t=this.editor.config.get("image.toolbar")||[],i=MC(e.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const e of i)this._createButton(e);const n=MC([...t.filter(L),...VC.getDefaultDropdownDefinitions(e)],this.localizedDefaultStylesTitles);for(const e of n)this._createDropdown(e,i)}_createDropdown(e,t){const i=this.editor.ui.componentFactory;i.add(e.name,(n=>{let s;const{defaultItem:o,items:r,title:a}=e,l=r.filter((e=>t.find((({name:t})=>NC(t)===e)))).map((e=>{const t=i.create(e);return e===o&&(s=t),t}));r.length!==l.length&&VC.warnInvalidStyle({dropdown:e});const c=Dm(n,Fm),d=c.buttonView,h=d.arrowView;return Lm(c,l,{enableActiveItemFocusOnDropdownOpen:!0}),d.set({label:FC(a,s.label),class:null,tooltip:!0}),h.unbind("label"),h.set({label:a}),d.bind("icon").toMany(l,"isOn",((...e)=>{const t=e.findIndex(Vs);return t<0?s.icon:l[t].icon})),d.bind("label").toMany(l,"isOn",((...e)=>{const t=e.findIndex(Vs);return FC(a,t<0?s.label:l[t].label)})),d.bind("isOn").toMany(l,"isOn",((...e)=>e.some(Vs))),d.bind("class").toMany(l,"isOn",((...e)=>e.some(Vs)?"ck-splitbutton_flatten":void 0)),d.on("execute",(()=>{l.some((({isOn:e})=>e))?c.isOpen=!c.isOpen:s.fire("execute")})),c.bind("isEnabled").toMany(l,"isEnabled",((...e)=>e.some(Vs))),this.listenTo(c,"execute",(()=>{this.editor.editing.view.focus()})),c}))}_createButton(e){const t=e.name;this.editor.ui.componentFactory.add(NC(t),(i=>{const n=this.editor.commands.get("imageStyle"),s=new Ku(i);return s.set({label:e.title,icon:e.icon,tooltip:!0,isToggleable:!0}),s.bind("isEnabled").to(n,"isEnabled"),s.bind("isOn").to(n,"value",(e=>e===t)),s.on("execute",this._executeCommand.bind(this,t)),s}))}_executeCommand(e){this.editor.execute("imageStyle",{value:e}),this.editor.editing.view.focus()}}function MC(e,t){for(const i of e)t[i.title]&&(i.title=t[i.title]);return e}function NC(e){return`imageStyle:${e}`}function FC(e,t){return(e?e+": ":"")+t}class DC extends so{static get pluginName(){return"IndentEditing"}init(){const e=this.editor;e.commands.add("indent",new lo(e)),e.commands.add("outdent",new lo(e))}}class LC extends so{static get pluginName(){return"IndentUI"}init(){const e=this.editor,t=e.locale,i=e.t,n="ltr"==t.uiLanguageDirection?fu.indent:fu.outdent,s="ltr"==t.uiLanguageDirection?fu.outdent:fu.indent;this._defineButton("indent",i("Increase indent"),n),this._defineButton("outdent",i("Decrease indent"),s)}_defineButton(e,t,i){const n=this.editor;n.ui.componentFactory.add(e,(()=>{const n=this._createButton(Ku,e,t,i);return n.set({tooltip:!0}),n})),n.ui.componentFactory.add("menuBar:"+e,(()=>this._createButton(up,e,t,i)))}_createButton(e,t,i,n){const s=this.editor,o=s.commands.get(t),r=new e(s.locale);return r.set({label:i,icon:n}),r.bind("isEnabled").to(o,"isEnabled"),this.listenTo(r,"execute",(()=>{s.execute(t),s.editing.view.focus()})),r}}class zC extends ro{constructor(e,t){super(e),this._indentBehavior=t}refresh(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());e&&this._isIndentationChangeAllowed(e)?this.isEnabled=this._indentBehavior.checkEnabled(e.getAttribute("blockIndent")):this.isEnabled=!1}execute(){const e=this.editor.model,t=this._getBlocksToChange();e.change((e=>{for(const i of t){const t=i.getAttribute("blockIndent"),n=this._indentBehavior.getNextIndent(t);n?e.setAttribute("blockIndent",n,i):e.removeAttribute("blockIndent",i)}}))}_getBlocksToChange(){const e=this.editor.model.document.selection;return Array.from(e.getSelectedBlocks()).filter((e=>this._isIndentationChangeAllowed(e)))}_isIndentationChangeAllowed(e){const t=this.editor;if(!t.model.schema.checkAttribute(e,"blockIndent"))return!1;if(!t.plugins.has("ListUtils"))return!0;if(!this._indentBehavior.isForward)return!0;return!t.plugins.get("ListUtils").isListItemBlock(e)}}class HC{constructor(e){this.isForward="forward"===e.direction,this.offset=e.offset,this.unit=e.unit}checkEnabled(e){const t=parseFloat(e||"0");return this.isForward||t>0}getNextIndent(e){const t=parseFloat(e||"0");if(!(!e||e.endsWith(this.unit)))return this.isForward?this.offset+this.unit:void 0;const i=t+(this.isForward?this.offset:-this.offset);return i>0?i+this.unit:void 0}}class $C{constructor(e){this.isForward="forward"===e.direction,this.classes=e.classes}checkEnabled(e){const t=this.classes.indexOf(e);return this.isForward?t=0}getNextIndent(e){const t=this.classes.indexOf(e),i=this.isForward?1:-1;return this.classes[t+i]}}const WC=["paragraph","heading1","heading2","heading3","heading4","heading5","heading6"];class jC{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(e){Array.isArray(e)?e.forEach((e=>this._definitions.add(e))):this._definitions.add(e)}getDispatcher(){return e=>{e.on("attribute:linkHref",((e,t,i)=>{if(!i.consumable.test(t.item,"attribute:linkHref"))return;if(!t.item.is("selection")&&!i.schema.isInline(t.item))return;const n=i.writer,s=n.document.selection;for(const e of this._definitions){const o=n.createAttributeElement("a",e.attributes,{priority:5});e.classes&&n.addClass(e.classes,o);for(const t in e.styles)n.setStyle(t,e.styles[t],o);n.setCustomProperty("link",!0,o),e.callback(t.attributeNewValue)?t.item.is("selection")?n.wrap(s.getFirstRange(),o):n.wrap(i.mapper.toViewRange(t.range),o):n.unwrap(i.mapper.toViewRange(t.range),o)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return e=>{e.on("attribute:linkHref:imageBlock",((e,t,{writer:i,mapper:n})=>{const s=n.toViewElement(t.item),o=Array.from(s.getChildren()).find((e=>e.is("element","a")));for(const e of this._definitions){const n=Ys(e.attributes);if(e.callback(t.attributeNewValue)){for(const[e,t]of n)"class"===e?i.addClass(t,o):i.setAttribute(e,t,o);e.classes&&i.addClass(e.classes,o);for(const t in e.styles)i.setStyle(t,e.styles[t],o)}else{for(const[e,t]of n)"class"===e?i.removeClass(t,o):i.removeAttribute(e,o);e.classes&&i.removeClass(e.classes,o);for(const t in e.styles)i.removeStyle(t,o)}}}))}}}const UC=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,qC=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,GC=/^((\w+:(\/{2,})?)|(\W))/i,KC=["https?","ftps?","mailto"],ZC="Ctrl+K";function JC(e,{writer:t}){const i=t.createAttributeElement("a",{href:e},{priority:5});return t.setCustomProperty("link",!0,i),i}function QC(e,t=KC){const i=String(e),n=t.join("|");return function(e,t){const i=e.replace(UC,"");return!!i.match(t)}(i,new RegExp(`${"^(?:(?:):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))".replace("",n)}`,"i"))?i:"#"}function YC(e,t){return!!e&&t.checkAttribute(e.name,"linkHref")}function XC(e,t){const i=(n=e,qC.test(n)?"mailto:":t);var n;const s=!!i&&!eA(e);return e&&s?i+e:e}function eA(e){return GC.test(e)}function tA(e){window.open(e,"_blank","noopener")}class iA extends ro{constructor(){super(...arguments),this.manualDecorators=new Ks,this.automaticDecorators=new jC}restoreManualDecoratorStates(){for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement()||Zs(t.getSelectedBlocks());YC(i,e.schema)?(this.value=i.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttribute(i,"linkHref")):(this.value=t.getAttribute("linkHref"),this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref"));for(const e of this.manualDecorators)e.value=this._getDecoratorStateFromModel(e.id)}execute(e,t={}){const i=this.editor.model,n=i.document.selection,s=[],o=[];for(const e in t)t[e]?s.push(e):o.push(e);i.change((t=>{if(n.isCollapsed){const r=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=nA(n);let l=pb(r,"linkHref",n.getAttribute("linkHref"),i);n.getAttribute("linkHref")===a&&(l=this._updateLinkContent(i,t,l,e)),t.setAttribute("linkHref",e,l),s.forEach((e=>{t.setAttribute(e,!0,l)})),o.forEach((e=>{t.removeAttribute(e,l)})),t.setSelection(t.createPositionAfter(l.end.nodeBefore))}else if(""!==e){const o=Ys(n.getAttributes());o.set("linkHref",e),s.forEach((e=>{o.set(e,!0)}));const{end:a}=i.insertContent(t.createText(e,o),r);t.setSelection(a)}["linkHref",...s,...o].forEach((e=>{t.removeSelectionAttribute(e)}))}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref"),a=[];for(const e of n.getSelectedBlocks())i.schema.checkAttribute(e,"linkHref")&&a.push(t.createRangeOn(e));const l=a.slice();for(const e of r)this._isRangeToUpdate(e,a)&&l.push(e);for(const r of l){let a=r;if(1===l.length){const s=nA(n);n.getAttribute("linkHref")===s&&(a=this._updateLinkContent(i,t,r,e),t.setSelection(t.createSelection(a)))}t.setAttribute("linkHref",e,a),s.forEach((e=>{t.setAttribute(e,!0,a)})),o.forEach((e=>{t.removeAttribute(e,a)}))}}}))}_getDecoratorStateFromModel(e){const t=this.editor.model,i=t.document.selection,n=i.getSelectedElement();return YC(n,t.schema)?n.getAttribute(e):i.getAttribute(e)}_isRangeToUpdate(e,t){for(const i of t)if(i.containsRange(e))return!1;return!0}_updateLinkContent(e,t,i,n){const s=t.createText(n,{linkHref:n});return e.insertContent(s,i)}}function nA(e){if(e.isCollapsed){const t=e.getFirstPosition();return t.textNode&&t.textNode.data}{const t=Array.from(e.getFirstRange().getItems());if(t.length>1)return null;const i=t[0];return i.is("$text")||i.is("$textProxy")?i.data:null}}class sA extends ro{refresh(){const e=this.editor.model,t=e.document.selection,i=t.getSelectedElement();YC(i,e.schema)?this.isEnabled=e.schema.checkAttribute(i,"linkHref"):this.isEnabled=e.schema.checkAttributeInSelection(t,"linkHref")}execute(){const e=this.editor,t=this.editor.model,i=t.document.selection,n=e.commands.get("link");t.change((e=>{const s=i.isCollapsed?[pb(i.getFirstPosition(),"linkHref",i.getAttribute("linkHref"),t)]:t.schema.getValidRanges(i.getRanges(),"linkHref");for(const t of s)if(e.removeAttribute("linkHref",t),n)for(const i of n.manualDecorators)e.removeAttribute(i.id,t)}))}}class oA extends(G()){constructor({id:e,label:t,attributes:i,classes:n,styles:s,defaultValue:o}){super(),this.id=e,this.set("value",void 0),this.defaultValue=o,this.label=t,this.attributes=i,this.classes=n,this.styles=s}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}const rA="automatic",aA=/^(https?:)?\/\//;class lA extends so{static get pluginName(){return"LinkEditing"}static get requires(){return[ib,Wp,Sw]}constructor(e){super(e),e.config.define("link",{allowCreatingEmptyLinks:!1,addTargetToExternalLinks:!1})}init(){const e=this.editor,t=this.editor.config.get("link.allowedProtocols");e.model.schema.extend("$text",{allowAttributes:"linkHref"}),e.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:JC}),e.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(e,i)=>JC(QC(e,t),i)}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:e=>e.getAttribute("href")}}),e.commands.add("link",new iA(e)),e.commands.add("unlink",new sA(e));const i=function(e,t){const i={"Open in a new tab":e("Open in a new tab"),Downloadable:e("Downloadable")};return t.forEach((e=>("label"in e&&i[e.label]&&(e.label=i[e.label]),e))),t}(e.t,function(e){const t=[];if(e)for(const[i,n]of Object.entries(e)){const e=Object.assign({},n,{id:`link${Ty(i)}`});t.push(e)}return t}(e.config.get("link.decorators")));this._enableAutomaticDecorators(i.filter((e=>e.mode===rA))),this._enableManualDecorators(i.filter((e=>"manual"===e.mode)));e.plugins.get(ib).registerAttribute("linkHref"),wb(e,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableSelectionAttributesFixer(),this._enableClipboardIntegration()}_enableAutomaticDecorators(e){const t=this.editor,i=t.commands.get("link").automaticDecorators;t.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:rA,callback:e=>!!e&&aA.test(e),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(e),i.length&&t.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(e){if(!e.length)return;const t=this.editor,i=t.commands.get("link").manualDecorators;e.forEach((e=>{t.model.schema.extend("$text",{allowAttributes:e.id});const n=new oA(e);i.add(n),t.conversion.for("downcast").attributeToElement({model:n.id,view:(e,{writer:t,schema:i},{item:s})=>{if((s.is("selection")||i.isInline(s))&&e){const e=t.createAttributeElement("a",n.attributes,{priority:5});n.classes&&t.addClass(n.classes,e);for(const i in n.styles)t.setStyle(i,n.styles[i],e);return t.setCustomProperty("link",!0,e),e}}}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",...n._createPattern()},model:{key:n.id}})}))}_enableLinkOpen(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"click",((e,t)=>{if(!(l.isMac?t.domEvent.metaKey:t.domEvent.ctrlKey))return;let i=t.domTarget;if("a"!=i.tagName.toLowerCase()&&(i=i.closest("a")),!i)return;const n=i.getAttribute("href");n&&(e.stop(),t.preventDefault(),tA(n))}),{context:"$capture"}),this.listenTo(t,"keydown",((t,i)=>{const n=e.commands.get("link").value;!!n&&i.keyCode===bs.enter&&i.altKey&&(t.stop(),tA(n))}))}_enableSelectionAttributesFixer(){const e=this.editor.model,t=e.document.selection;this.listenTo(t,"change:attribute",((i,{attributeKeys:n})=>{n.includes("linkHref")&&!t.hasAttribute("linkHref")&&e.change((t=>{var i;!function(e,t){e.removeSelectionAttribute("linkHref");for(const i of t)e.removeSelectionAttribute(i)}(t,(i=e.schema,i.getDefinition("$text").allowAttributes.filter((e=>e.startsWith("link")))))}))}))}_enableClipboardIntegration(){const e=this.editor,t=e.model,i=this.editor.config.get("link.defaultProtocol");i&&this.listenTo(e.plugins.get("ClipboardPipeline"),"contentInsertion",((e,n)=>{t.change((e=>{const t=e.createRangeIn(n.content);for(const n of t.getItems())if(n.hasAttribute("linkHref")){const t=XC(n.getAttribute("linkHref"),i);e.setAttribute("linkHref",t,n)}}))}))}}class cA extends Du{constructor(e,t){super(e),this.focusTracker=new Js,this.keystrokes=new Qs,this._focusables=new pu;const i=e.t;this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("Save"),fu.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("Cancel"),fu.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(t),this.children=this._createFormChildren(t.manualDecorators),this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const n=["ck","ck-link-form","ck-responsive-form"];t.manualDecorators.length&&n.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:n,tabindex:"-1"},children:this.children})}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((e,t)=>(e[t.name]=t.isOn,e)),{})}render(){super.render(),i({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((e=>{this._focusables.add(e),this.focusTracker.add(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const e=this.locale.t,t=new um(this.locale,Um);return t.label=e("Link URL"),t}_createButton(e,t,i,n){const s=new Ku(this.locale);return s.set({label:e,icon:t,tooltip:!0}),s.extendTemplate({attributes:{class:i}}),n&&s.delegate("execute").to(this,n),s}_createManualDecoratorSwitches(e){const t=this.createCollection();for(const i of e.manualDecorators){const n=new Zu(this.locale);n.set({name:i.id,label:i.label,withText:!0}),n.bind("isOn").toMany([i,e],"value",((e,t)=>void 0===t&&void 0===e?!!i.defaultValue:!!e)),n.on("execute",(()=>{i.set("value",!n.isOn)})),t.add(n)}return t}_createFormChildren(e){const t=this.createCollection();if(t.add(this.urlInputView),e.length){const e=new Du;e.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((e=>({tag:"li",children:[e],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),t.add(e)}return t.add(this.saveButtonView),t.add(this.cancelButtonView),t}}class dA extends Du{constructor(e,t={}){super(e),this.focusTracker=new Js,this.keystrokes=new Qs,this._focusables=new pu;const i=e.t;this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(i("Unlink"),'',"unlink"),this.editButtonView=this._createButton(i("Edit link"),fu.pencil,"edit"),this.set("href",void 0),this._linkConfig=t,this._focusCycler=new ym({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((e=>{this._focusables.add(e),this.focusTracker.add(e.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(e,t,i){const n=new Ku(this.locale);return n.set({label:e,icon:t,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const e=new Ku(this.locale),t=this.bindTemplate,i=this.t;return e.set({withText:!0,tooltip:i("Open link in new tab")}),e.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:t.to("href",(e=>e&&QC(e,this._linkConfig.allowedProtocols))),target:"_blank",rel:"noopener noreferrer"}}),e.bind("label").to(this,"href",(e=>e||i("This link has no URL"))),e.bind("isEnabled").to(this,"href",(e=>!!e)),e.template.tag="a",e.template.eventListeners={},e}}const hA='',uA="link-ui";class mA extends so{constructor(){super(...arguments),this.actionsView=null,this.formView=null}static get requires(){return[If]}static get pluginName(){return"LinkUI"}init(){const e=this.editor,t=this.editor.t;e.editing.view.addObserver(wh),this._balloon=e.plugins.get(If),this._createToolbarLinkButton(),this._enableBalloonActivators(),e.conversion.for("editingDowncast").markerToHighlight({model:uA,view:{classes:["ck-fake-link-selection"]}}),e.conversion.for("editingDowncast").markerToElement({model:uA,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}}),e.accessibility.addKeystrokeInfos({keystrokes:[{label:t("Create link"),keystroke:ZC},{label:t("Move out of a link"),keystroke:[["arrowleft","arrowleft"],["arrowright","arrowright"]]}]})}destroy(){super.destroy(),this.formView&&this.formView.destroy(),this.actionsView&&this.actionsView.destroy()}_createViews(){this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._enableUserBalloonInteractions()}_createActionsView(){const e=this.editor,t=new dA(e.locale,e.config.get("link")),i=e.commands.get("link"),n=e.commands.get("unlink");return t.bind("href").to(i,"value"),t.editButtonView.bind("isEnabled").to(i),t.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(t,"edit",(()=>{this._addFormView()})),this.listenTo(t,"unlink",(()=>{e.execute("unlink"),this._hideUI()})),t.keystrokes.set("Esc",((e,t)=>{this._hideUI(),t()})),t.keystrokes.set(ZC,((e,t)=>{this._addFormView(),t()})),t}_createFormView(){const e=this.editor,i=e.commands.get("link"),n=e.config.get("link.defaultProtocol"),s=e.config.get("link.allowCreatingEmptyLinks"),o=new(t(cA))(e.locale,i);return o.urlInputView.fieldView.bind("value").to(i,"value"),o.urlInputView.bind("isEnabled").to(i,"isEnabled"),o.saveButtonView.bind("isEnabled").to(i,"isEnabled",o.urlInputView,"isEmpty",((e,t)=>e&&(s||!t))),this.listenTo(o,"submit",(()=>{const{value:t}=o.urlInputView.fieldView.element,i=XC(t,n);e.execute("link",i,o.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(o,"cancel",(()=>{this._closeFormView()})),o.keystrokes.set("Esc",((e,t)=>{this._closeFormView(),t()})),o}_createToolbarLinkButton(){const e=this.editor,t=e.commands.get("link");e.ui.componentFactory.add("link",(()=>{const e=this._createButton(Ku);return e.set({tooltip:!0,isToggleable:!0}),e.bind("isOn").to(t,"value",(e=>!!e)),e})),e.ui.componentFactory.add("menuBar:link",(()=>this._createButton(up)))}_createButton(e){const t=this.editor,i=t.locale,n=t.commands.get("link"),s=new e(t.locale),o=i.t;return s.set({label:o("Link"),icon:hA,keystroke:ZC}),s.bind("isEnabled").to(n,"isEnabled"),this.listenTo(s,"execute",(()=>this._showUI(!0))),s}_enableBalloonActivators(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),e.keystrokes.set(ZC,((t,i)=>{i(),e.commands.get("link").isEnabled&&this._showUI(!0)}))}_enableUserBalloonInteractions(){this.editor.keystrokes.set("Tab",((e,t)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),t())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((e,t)=>{this._isUIVisible&&(this._hideUI(),t())})),e({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this.actionsView||this._createViews(),this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this.formView||this._createViews(),this._isFormInPanel)return;const e=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this.formView.urlInputView.fieldView.value=e.value||"",this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions()}_closeFormView(){const e=this.editor.commands.get("link");e.restoreManualDecoratorStates(),void 0!==e.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this.formView.urlInputView.fieldView.reset(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(e=!1){this.formView||this._createViews(),this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),e&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),e&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const e=this.editor;this.stopListening(e.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),e.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const e=this.editor,t=e.editing.view.document;let i=this._getSelectedLinkElement(),n=o();const s=()=>{const e=this._getSelectedLinkElement(),t=o();i&&!e||!i&&t!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=e,n=t};function o(){return t.selection.focus.getAncestors().reverse().find((e=>e.is("element")))}this.listenTo(e.ui,"update",s),this.listenTo(this._balloon,"change:visibleView",s)}get _isFormInPanel(){return!!this.formView&&this._balloon.hasView(this.formView)}get _areActionsInPanel(){return!!this.actionsView&&this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return!!this.actionsView&&this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){const e=this._balloon.visibleView;return!!this.formView&&e==this.formView||this._areActionsVisible}_getBalloonPositionData(){const e=this.editor.editing.view,t=this.editor.model,i=e.document;let n;if(t.markers.has(uA)){const t=Array.from(this.editor.editing.mapper.markerNameToElements(uA)),i=e.createRange(e.createPositionBefore(t[0]),e.createPositionAfter(t[t.length-1]));n=e.domConverter.viewRangeToDom(i)}else n=()=>{const t=this._getSelectedLinkElement();return t?e.domConverter.mapViewToDom(t):e.domConverter.viewRangeToDom(i.selection.getFirstRange())};return{target:n}}_getSelectedLinkElement(){const e=this.editor.editing.view,t=e.document.selection,i=t.getSelectedElement();if(t.isCollapsed||i&&Nw(i))return gA(t.getFirstPosition());{const i=t.getFirstRange().getTrimmed(),n=gA(i.start),s=gA(i.end);return n&&n==s&&e.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}_showFakeVisualSelection(){const e=this.editor.model;e.change((t=>{const i=e.document.selection.getFirstRange();if(e.markers.has(uA))t.updateMarker(uA,{range:i});else if(i.start.isAtEnd){const n=i.start.getLastMatchingPosition((({item:t})=>!e.schema.isContent(t)),{boundaries:i});t.addMarker(uA,{usingOperation:!1,affectsData:!1,range:t.createRange(n,i.end)})}else t.addMarker(uA,{usingOperation:!1,affectsData:!1,range:i})}))}_hideFakeVisualSelection(){const e=this.editor.model;e.markers.has(uA)&&e.change((e=>{e.removeMarker(uA)}))}}function gA(e){return e.getAncestors().find((e=>{return(t=e).is("attributeElement")&&!!t.getCustomProperty("link");var t}))||null}const fA=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i");class pA extends so{static get requires(){return[Yp,lA]}static get pluginName(){return"AutoLink"}init(){const e=this.editor.model.document.selection;e.on("change:range",(()=>{this.isEnabled=!e.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling(),this._enablePasteLinking()}_expandLinkRange(e,t){return t.textNode&&t.textNode.hasAttribute("linkHref")?pb(t,"linkHref",t.textNode.getAttribute("linkHref"),e):null}_selectEntireLinks(e,t){const i=this.editor.model,n=i.document.selection,s=n.getFirstPosition(),o=n.getLastPosition();let r=t.getJoined(this._expandLinkRange(i,s)||t);r&&(r=r.getJoined(this._expandLinkRange(i,o)||t)),r&&(r.start.isBefore(s)||r.end.isAfter(o))&&e.setSelection(r)}_enablePasteLinking(){const e=this.editor,t=e.model,i=t.document.selection,n=e.plugins.get("ClipboardPipeline"),s=e.commands.get("link");n.on("inputTransformation",((e,n)=>{if(!this.isEnabled||!s.isEnabled||i.isCollapsed||"paste"!==n.method)return;if(i.rangeCount>1)return;const o=i.getFirstRange(),r=n.dataTransfer.getData("text/plain");if(!r)return;const a=r.match(fA);a&&a[2]===r&&(t.change((e=>{this._selectEntireLinks(e,o),s.execute(r)})),e.stop())}),{priority:"high"})}_enableTypingHandling(){const e=this.editor,t=new tb(e.model,(e=>{if(!function(e){return e.length>4&&" "===e[e.length-1]&&" "!==e[e.length-2]}(e))return;const t=bA(e.substr(0,e.length-1));return t?{url:t}:void 0}));t.on("matched:data",((t,i)=>{const{batch:n,range:s,url:o}=i;if(!n.isTyping)return;const r=s.end.getShiftedBy(-1),a=r.getShiftedBy(-o.length),l=e.model.createRange(a,r);this._applyAutoLink(o,l)})),t.bind("isEnabled").to(this)}_enableEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("enter");i&&i.on("execute",(()=>{const e=t.document.selection.getFirstPosition();if(!e.parent.previousSibling)return;const i=t.createRangeIn(e.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(i)}))}_enableShiftEnterHandling(){const e=this.editor,t=e.model,i=e.commands.get("shiftEnter");i&&i.on("execute",(()=>{const e=t.document.selection.getFirstPosition(),i=t.createRange(t.createPositionAt(e.parent,0),e.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(i)}))}_checkAndApplyAutoLinkOnRange(e){const t=this.editor.model,{text:i,range:n}=eb(e,t),s=bA(i);if(s){const e=t.createRange(n.end.getShiftedBy(-s.length),n.end);this._applyAutoLink(s,e)}}_applyAutoLink(e,t){const i=this.editor.model,n=XC(e,this.editor.config.get("link.defaultProtocol"));this.isEnabled&&function(e,t){return t.schema.checkAttributeInSelection(t.createSelection(e),"linkHref")}(t,i)&&eA(n)&&!function(e){const t=e.start.nodeAfter;return!!t&&t.hasAttribute("linkHref")}(t)&&this._persistAutoLink(n,t)}_persistAutoLink(e,t){const i=this.editor.model,n=this.editor.plugins.get("Delete");i.enqueueChange((s=>{s.setAttribute("linkHref",e,t),i.enqueueChange((()=>{n.requestUndoOnBackspace()}))}))}}function bA(e){const t=fA.exec(e);return t?t[2]:null}class wA extends so{static get requires(){return["ImageEditing","ImageUtils",lA]}static get pluginName(){return"LinkImageEditing"}afterInit(){const e=this.editor,t=e.model.schema;e.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["linkHref"]}),e.conversion.for("upcast").add(function(e){const t=e.plugins.has("ImageInlineEditing"),i=e.plugins.get("ImageUtils");return e=>{e.on("element:a",((e,n,s)=>{const o=n.viewItem,r=i.findViewImgElement(o);if(!r)return;const a=r.findAncestor((e=>i.isBlockImageView(e)));if(t&&!a)return;const l={attributes:["href"]};if(!s.consumable.consume(o,l))return;const c=o.getAttribute("href");if(!c)return;let d=n.modelCursor.parent;if(!d.is("element","imageBlock")){const e=s.convertItem(r,n.modelCursor);n.modelRange=e.modelRange,n.modelCursor=e.modelCursor,d=n.modelCursor.nodeBefore}d&&d.is("element","imageBlock")&&s.writer.setAttribute("linkHref",c,d)}),{priority:"high"})}}(e)),e.conversion.for("downcast").add(function(e){const t=e.plugins.get("ImageUtils");return e=>{e.on("attribute:linkHref:imageBlock",((e,i,n)=>{if(!n.consumable.consume(i.item,e.name))return;const s=n.mapper.toViewElement(i.item),o=n.writer,r=Array.from(s.getChildren()).find((e=>e.is("element","a"))),a=t.findViewImgElement(s),l=a.parent.is("element","picture")?a.parent:a;if(r)i.attributeNewValue?o.setAttribute("href",i.attributeNewValue,r):(o.move(o.createRangeOn(l),o.createPositionAt(s,0)),o.remove(r));else{const e=o.createContainerElement("a",{href:i.attributeNewValue});o.insert(o.createPositionAt(s,0),e),o.move(o.createRangeOn(l),o.createPositionAt(e,0))}}),{priority:"high"})}}(e)),this._enableAutomaticDecorators(),this._enableManualDecorators()}_enableAutomaticDecorators(){const e=this.editor,t=e.commands.get("link").automaticDecorators;t.length&&e.conversion.for("downcast").add(t.getDispatcherForLinkedImage())}_enableManualDecorators(){const e=this.editor,t=e.commands.get("link");for(const i of t.manualDecorators)e.plugins.has("ImageBlockEditing")&&e.model.schema.extend("imageBlock",{allowAttributes:i.id}),e.plugins.has("ImageInlineEditing")&&e.model.schema.extend("imageInline",{allowAttributes:i.id}),e.conversion.for("downcast").add(vA(i)),e.conversion.for("upcast").add(_A(e,i))}}function vA(e){return t=>{t.on(`attribute:${e.id}:imageBlock`,((t,i,n)=>{const s=n.mapper.toViewElement(i.item),o=Array.from(s.getChildren()).find((e=>e.is("element","a")));if(o){for(const[t,i]of Ys(e.attributes))n.writer.setAttribute(t,i,o);e.classes&&n.writer.addClass(e.classes,o);for(const t in e.styles)n.writer.setStyle(t,e.styles[t],o)}}))}}function _A(e,t){const i=e.plugins.has("ImageInlineEditing"),n=e.plugins.get("ImageUtils");return e=>{e.on("element:a",((e,s,o)=>{const r=s.viewItem,a=n.findViewImgElement(r);if(!a)return;const l=a.findAncestor((e=>n.isBlockImageView(e)));if(i&&!l)return;const c=new To(t._createPattern()).match(r);if(!c)return;if(!o.consumable.consume(r,c.match))return;const d=s.modelCursor.nodeBefore||s.modelCursor.parent;o.writer.setAttribute(t.id,!0,d)}),{priority:"high"})}}class yA extends so{static get requires(){return[lA,mA,"ImageBlockEditing"]}static get pluginName(){return"LinkImageUI"}init(){const e=this.editor,t=e.editing.view.document;this.listenTo(t,"click",((t,i)=>{this._isSelectedLinkedImage(e.model.document.selection)&&(i.preventDefault(),t.stop())}),{priority:"high"}),this._createToolbarLinkImageButton()}_createToolbarLinkImageButton(){const e=this.editor,t=e.t;e.ui.componentFactory.add("linkImage",(i=>{const n=new Ku(i),s=e.plugins.get("LinkUI"),o=e.commands.get("link");return n.set({isEnabled:!0,label:t("Link image"),icon:hA,keystroke:ZC,tooltip:!0,isToggleable:!0}),n.bind("isEnabled").to(o,"isEnabled"),n.bind("isOn").to(o,"value",(e=>!!e)),this.listenTo(n,"execute",(()=>{this._isSelectedLinkedImage(e.model.document.selection)?s._addActionsView():s._showUI(!0)})),n}))}_isSelectedLinkedImage(e){const t=e.getSelectedElement();return this.editor.plugins.get("ImageUtils").isImage(t)&&t.hasAttribute("linkHref")}}class kA{constructor(e,t){this._startElement=e,this._referenceIndent=e.getAttribute("listIndent"),this._isForward="forward"==t.direction,this._includeSelf=!!t.includeSelf,this._sameAttributes=Cs(t.sameAttributes||[]),this._sameIndent=!!t.sameIndent,this._lowerIndent=!!t.lowerIndent,this._higherIndent=!!t.higherIndent}static first(e,t){return Zs(new this(e,t)[Symbol.iterator]())}*[Symbol.iterator](){const e=[];for(const{node:t}of CA(this._getStartNode(),this._isForward?"forward":"backward")){const i=t.getAttribute("listIndent");if(ithis._referenceIndent){if(!this._higherIndent)continue;if(!this._isForward){e.push(t);continue}}else{if(!this._sameIndent){if(this._higherIndent){e.length&&(yield*e,e.length=0);break}continue}if(this._sameAttributes.some((e=>t.getAttribute(e)!==this._startElement.getAttribute(e))))break}e.length&&(yield*e,e.length=0),yield t}}_getStartNode(){return this._includeSelf?this._startElement:this._isForward?this._startElement.nextSibling:this._startElement.previousSibling}}function*CA(e,t="forward"){const i="forward"==t,n=[];let s=null;for(;EA(e);){let t=null;if(s){const i=e.getAttribute("listIndent"),o=s.getAttribute("listIndent");i>o?n[o]=s:ie.getAttribute("listItemId")!=t))}function LA(e){return Array.from(e).filter((e=>"$graveyard"!==e.root.rootName)).sort(((e,t)=>e.index-t.index))}function zA(e){const t=e.document.selection.getSelectedElement();return t&&e.schema.isObject(t)&&e.schema.isBlock(t)?t:null}function HA(e,t){return t.checkChild(e.parent,"listItem")&&t.checkChild(e,"$text")&&!t.isObject(e)}function $A(e){return"numbered"==e||"customNumbered"==e}function WA(e,t,i){return SA(t,{direction:"forward"}).pop().index>e.index?MA(e,t,i):[]}class jA extends ro{constructor(e,t){super(e),this._direction=t}refresh(){this.isEnabled=this._checkEnabled()}execute(){const e=this.editor.model,t=UA(e.document.selection);e.change((e=>{const i=[];DA(t)&&!IA(t[0])?("forward"==this._direction&&i.push(...NA(t,e)),i.push(...BA(t[0],e))):"forward"==this._direction?i.push(...NA(t,e,{expand:!0})):i.push(...function(e,t){const i=RA(e=Cs(e)),n=new Set,s=Math.min(...i.map((e=>e.getAttribute("listIndent")))),o=new Map;for(const e of i)o.set(e,kA.first(e,{lowerIndent:!0}));for(const e of i){if(n.has(e))continue;n.add(e);const i=e.getAttribute("listIndent")-1;if(i<0)FA(e,t);else{if(e.getAttribute("listIndent")==s){const i=WA(e,o.get(e),t);for(const e of i)n.add(e);if(i.length)continue}t.setAttribute("listIndent",i,e)}}return LA(n)}(t,e));for(const t of i){if(!t.hasAttribute("listType"))continue;const i=kA.first(t,{sameIndent:!0});i&&e.setAttribute("listType",i.getAttribute("listType"),t)}this._fireAfterExecute(i)}))}_fireAfterExecute(e){this.fire("afterExecute",LA(new Set(e)))}_checkEnabled(){let e=UA(this.editor.model.document.selection),t=e[0];if(!t)return!1;if("backward"==this._direction)return!0;if(DA(e)&&!IA(e[0]))return!0;e=RA(e),t=e[0];const i=kA.first(t,{sameIndent:!0});return!!i&&i.getAttribute("listType")==t.getAttribute("listType")}}function UA(e){const t=Array.from(e.getSelectedBlocks()),i=t.findIndex((e=>!EA(e)));return-1!=i&&(t.length=i),t}class qA extends ro{constructor(e,t,i={}){super(e),this.type=t,this._listWalkerOptions=i.multiLevel?{higherIndent:!0,lowerIndent:!0,sameAttributes:[]}:void 0}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,i=t.document,n=zA(t),s=Array.from(i.selection.getSelectedBlocks()).filter((e=>t.schema.checkAttribute(e,"listType")||HA(e,t.schema))),o=void 0!==e.forceValue?!e.forceValue:this.value;t.change((r=>{if(o){const e=s[s.length-1],t=SA(e,{direction:"forward"}),i=[];t.length>1&&i.push(...BA(t[1],r)),i.push(...FA(s,r)),i.push(...function(e,t){const i=[];let n=Number.POSITIVE_INFINITY;for(const{node:s}of CA(e.nextSibling,"forward")){const e=s.getAttribute("listIndent");if(0==e)break;e{const{firstElement:o,lastElement:r}=this._getMergeSubjectElements(i,e),a=o.getAttribute("listIndent")||0,l=r.getAttribute("listIndent"),c=r.getAttribute("listItemId");if(a!=l){const e=(d=r,Array.from(new kA(d,{direction:"forward",higherIndent:!0})));n.push(...NA([r,...e],s,{indentBy:a-l,expand:a{const t=BA(this._getStartBlock(),e);this._fireAfterExecute(t)}))}_fireAfterExecute(e){this.fire("afterExecute",LA(new Set(e)))}_checkEnabled(){const e=this.editor.model.document.selection,t=this._getStartBlock();return e.isCollapsed&&EA(t)&&!IA(t)}_getStartBlock(){const e=this.editor.model.document.selection.getFirstPosition().parent;return"before"==this._direction?e:e.nextSibling}}class ZA extends so{static get pluginName(){return"ListUtils"}expandListBlocksToCompleteList(e){return OA(e)}isFirstBlockOfListItem(e){return IA(e)}isListItemBlock(e){return EA(e)}expandListBlocksToCompleteItems(e,t={}){return RA(e,t)}isNumberedListType(e){return $A(e)}}function JA(e){return e.is("element","ol")||e.is("element","ul")}function QA(e){return e.is("element","li")}function YA(e,t,i,n=tx(i,t)){return e.createAttributeElement(ex(i),null,{priority:2*t/100-100,id:n})}function XA(e,t,i){return e.createAttributeElement("li",null,{priority:(2*t+1)/100-100,id:i})}function ex(e){return"numbered"==e||"customNumbered"==e?"ol":"ul"}function tx(e,t){return`list-${e}-${t}`}function ix(e,t){const i=e.nodeBefore;if(EA(i)){let e=i;for(const{node:i}of CA(e,"backward"))if(e=i,t.has(e))return;t.set(i,e)}else{const i=e.nodeAfter;EA(i)&&t.set(i,i)}}function nx(){return(e,t,i)=>{const{writer:n,schema:s}=i;if(!t.modelRange)return;const o=Array.from(t.modelRange.getItems({shallow:!0})).filter((e=>s.checkAttribute(e,"listItemId")));if(!o.length)return;const r=xA.next(),a=function(e){let t=0,i=e.parent;for(;i;){if(QA(i))t++;else{const e=i.previousSibling;e&&QA(e)&&t++}i=i.parent}return t}(t.viewItem);let l=t.viewItem.parent&&t.viewItem.parent.is("element","ol")?"numbered":"bulleted";const c=o[0].getAttribute("listType");c&&(l=c);const d={listItemId:r,listIndent:a,listType:l};for(const e of o)e.hasAttribute("listItemId")||n.setAttributes(d,e);o.length>1&&o[1].getAttribute("listItemId")!=d.listItemId&&i.keepEmptyElement(o[0])}}function sx(){return(e,t,i)=>{if(!i.consumable.test(t.viewItem,{name:!0}))return;const n=new _h(t.viewItem.document);for(const e of Array.from(t.viewItem.getChildren()))QA(e)||JA(e)||n.remove(e)}}function ox(e,t,i,{dataPipeline:n}={}){const s=function(e){return(t,i)=>{const n=[];for(const i of e)t.hasAttribute(i)&&n.push(`attribute:${i}`);return!!n.every((e=>!1!==i.test(t,e)))&&(n.forEach((e=>i.consume(t,e))),!0)}}(e);return(o,r,a)=>{const{writer:l,mapper:c,consumable:d}=a,h=r.item;if(!e.includes(r.attributeKey))return;if(!s(h,d))return;const u=function(e,t,i){const n=i.createRangeOn(e),s=t.toViewRange(n).getTrimmed();return s.end.nodeBefore}(h,c,i);ax(u,l,c),function(e,t){let i=e.parent;for(;i.is("attributeElement")&&["ul","ol","li"].includes(i.name);){const n=i.parent;t.unwrap(t.createRangeOn(e),i),i=n}}(u,l);const m=function(e,t,i,n,{dataPipeline:s}){let o=n.createRangeOn(t);if(!IA(e))return o;for(const r of i){if("itemMarker"!=r.scope)continue;const i=r.createElement(n,e,{dataPipeline:s});if(!i)continue;if(n.setCustomProperty("listItemMarker",!0,i),r.canInjectMarkerIntoElement&&r.canInjectMarkerIntoElement(e)?n.insert(n.createPositionAt(t,0),i):(n.insert(o.start,i),o=n.createRange(n.createPositionBefore(i),n.createPositionAfter(t))),!r.createWrapperElement||!r.canWrapElement)continue;const a=r.createWrapperElement(n,e,{dataPipeline:s});n.setCustomProperty("listItemWrapper",!0,a),r.canWrapElement(e)?o=n.wrap(o,a):(o=n.wrap(n.createRangeOn(i),a),o=n.createRange(o.start,n.createPositionAfter(t)))}return o}(h,u,t,l,{dataPipeline:n});!function(e,t,i,n){if(!e.hasAttribute("listIndent"))return;const s=e.getAttribute("listIndent");let o=e;for(let e=s;e>=0;e--){const s=XA(n,e,o.getAttribute("listItemId")),r=YA(n,e,o.getAttribute("listType"));for(const e of i)"list"!=e.scope&&"item"!=e.scope||!o.hasAttribute(e.attributeName)||e.setAttributeOnDowncast(n,o.getAttribute(e.attributeName),"list"==e.scope?r:s);if(t=n.wrap(t,s),t=n.wrap(t,r),0==e)break;if(o=kA.first(o,{lowerIndent:!0}),!o)break}}(h,m,t,l)}}function rx(e,{dataPipeline:t}={}){return(i,{writer:n})=>{if(!lx(i,e))return null;if(!t)return n.createContainerElement("span",{class:"ck-list-bogus-paragraph"});const s=n.createContainerElement("p");return n.setCustomProperty("dataPipeline:transparentRendering",!0,s),s}}function ax(e,t,i){for(;e.parent.is("attributeElement")&&e.parent.getCustomProperty("listItemWrapper");)t.unwrap(t.createRangeOn(e),e.parent);const n=[];s(t.createPositionBefore(e).getWalker({direction:"backward"})),s(t.createRangeIn(e).getWalker());for(const e of n)t.remove(e);function s(e){for(const{item:t}of e){if(t.is("element")&&i.toModelElement(t))break;t.is("element")&&t.getCustomProperty("listItemMarker")&&n.push(t)}}}function lx(e,t,i=TA(e)){if(!EA(e))return!1;for(const i of e.getAttributeKeys())if(!i.startsWith("selection:")&&!t.includes(i))return!1;return i.length<2}const cx=["listType","listIndent","listItemId"];class dx extends so{static get pluginName(){return"ListEditing"}static get requires(){return[Jb,Yp,ZA,Sw]}constructor(e){super(e),this._downcastStrategies=[],e.config.define("list.multiBlock",!0)}init(){const e=this.editor,t=e.model,i=e.config.get("list.multiBlock");if(e.plugins.has("LegacyListEditing"))throw new y("list-feature-conflict",this,{conflictPlugin:"LegacyListEditing"});t.schema.register("$listItem",{allowAttributes:cx}),i?(t.schema.extend("$container",{allowAttributesOf:"$listItem"}),t.schema.extend("$block",{allowAttributesOf:"$listItem"}),t.schema.extend("$blockObject",{allowAttributesOf:"$listItem"})):t.schema.register("listItem",{inheritAllFrom:"$block",allowAttributesOf:"$listItem"});for(const e of cx)t.schema.setAttributeProperties(e,{copyOnReplace:!0});e.commands.add("numberedList",new qA(e,"numbered")),e.commands.add("bulletedList",new qA(e,"bulleted")),e.commands.add("customNumberedList",new qA(e,"customNumbered",{multiLevel:!0})),e.commands.add("customBulletedList",new qA(e,"customBulleted",{multiLevel:!0})),e.commands.add("indentList",new jA(e,"forward")),e.commands.add("outdentList",new jA(e,"backward")),e.commands.add("splitListItemBefore",new KA(e,"before")),e.commands.add("splitListItemAfter",new KA(e,"after")),i&&(e.commands.add("mergeListItemBackward",new GA(e,"backward")),e.commands.add("mergeListItemForward",new GA(e,"forward"))),this._setupDeleteIntegration(),this._setupEnterIntegration(),this._setupTabIntegration(),this._setupClipboardIntegration(),this._setupAccessibilityIntegration()}afterInit(){const e=this.editor.commands,t=e.get("indent"),i=e.get("outdent");t&&t.registerChildCommand(e.get("indentList"),{priority:"high"}),i&&i.registerChildCommand(e.get("outdentList"),{priority:"lowest"}),this._setupModelPostFixing(),this._setupConversion()}registerDowncastStrategy(e){this._downcastStrategies.push(e)}getListAttributeNames(){return[...cx,...this._downcastStrategies.map((e=>e.attributeName))]}_setupDeleteIntegration(){const e=this.editor,t=e.commands.get("mergeListItemBackward"),i=e.commands.get("mergeListItemForward");this.listenTo(e.editing.view.document,"delete",((n,s)=>{const o=e.model.document.selection;zA(e.model)||e.model.change((()=>{const r=o.getFirstPosition();if(o.isCollapsed&&"backward"==s.direction){if(!r.isAtStart)return;const i=r.parent;if(!EA(i))return;if(kA.first(i,{sameAttributes:"listType",sameIndent:!0})||0!==i.getAttribute("listIndent")){if(!t||!t.isEnabled)return;t.execute({shouldMergeOnBlocksContentLevel:hx(e.model,"backward")})}else VA(i)||e.execute("splitListItemAfter"),e.execute("outdentList");s.preventDefault(),n.stop()}else{if(o.isCollapsed&&!o.getLastPosition().isAtEnd)return;if(!i||!i.isEnabled)return;i.execute({shouldMergeOnBlocksContentLevel:hx(e.model,"forward")}),s.preventDefault(),n.stop()}}))}),{context:"li"})}_setupEnterIntegration(){const e=this.editor,t=e.model,i=e.commands,n=i.get("enter");this.listenTo(e.editing.view.document,"enter",((i,n)=>{const s=t.document,o=s.selection.getFirstPosition().parent;if(s.selection.isCollapsed&&EA(o)&&o.isEmpty&&!n.isSoft){const t=IA(o),s=VA(o);t&&s?(e.execute("outdentList"),n.preventDefault(),i.stop()):t&&!s?(e.execute("splitListItemAfter"),n.preventDefault(),i.stop()):s&&(e.execute("splitListItemBefore"),n.preventDefault(),i.stop())}}),{context:"li"}),this.listenTo(n,"afterExecute",(()=>{const t=i.get("splitListItemBefore");if(t.refresh(),!t.isEnabled)return;2===TA(e.model.document.selection.getLastPosition().parent).length&&t.execute()}))}_setupTabIntegration(){const e=this.editor;this.listenTo(e.editing.view.document,"tab",((t,i)=>{const n=i.shiftKey?"outdentList":"indentList";this.editor.commands.get(n).isEnabled&&(e.execute(n),i.stopPropagation(),i.preventDefault(),t.stop())}),{context:"li"})}_setupConversion(){const e=this.editor,t=e.model,i=this.getListAttributeNames(),n=e.config.get("list.multiBlock"),s=n?"paragraph":"listItem";e.conversion.for("upcast").elementToElement({view:"li",model:(e,{writer:t})=>t.createElement(s,{listType:""})}).elementToElement({view:"p",model:(e,{writer:t})=>e.parent&&e.parent.is("element","li")?t.createElement(s,{listType:""}):null,converterPriority:"high"}).add((e=>{e.on("element:li",nx()),e.on("element:ul",sx(),{priority:"high"}),e.on("element:ol",sx(),{priority:"high"})})),n||e.conversion.for("downcast").elementToElement({model:"listItem",view:"p"}),e.conversion.for("editingDowncast").elementToElement({model:s,view:rx(i),converterPriority:"high"}).add((e=>{var n;e.on("attribute",ox(i,this._downcastStrategies,t)),e.on("remove",(n=t.schema,(e,t,i)=>{const{writer:s,mapper:o}=i,r=e.name.split(":")[1];if(!n.checkAttribute(r,"listItemId"))return;const a=o.toViewPosition(t.position),l=t.position.getShiftedBy(t.length),c=o.toViewPosition(l,{isPhantom:!0}),d=s.createRange(a,c).getTrimmed().end.nodeBefore;d&&ax(d,s,o)}))})),e.conversion.for("dataDowncast").elementToElement({model:s,view:rx(i,{dataPipeline:!0}),converterPriority:"high"}).add((e=>{e.on("attribute",ox(i,this._downcastStrategies,t,{dataPipeline:!0}))}));const o=(r=this._downcastStrategies,a=e.editing.view,(e,t)=>{if(t.modelPosition.offset>0)return;const i=t.modelPosition.parent;if(!EA(i))return;if(!r.some((e=>"itemMarker"==e.scope&&e.canInjectMarkerIntoElement&&e.canInjectMarkerIntoElement(i))))return;const n=t.mapper.toViewElement(i),s=a.createRangeIn(n),o=s.getWalker();let l=s.start;for(const{item:e}of o){if(e.is("element")&&t.mapper.toModelElement(e)||e.is("$textProxy"))break;e.is("element")&&e.getCustomProperty("listItemMarker")&&(l=a.createPositionAfter(e),o.skip((({previousPosition:e})=>!e.isEqual(l))))}t.viewPosition=l});var r,a;e.editing.mapper.on("modelToViewPosition",o),e.data.mapper.on("modelToViewPosition",o),this.listenTo(t.document,"change:data",function(e,t,i,n){return()=>{const n=e.document.differ.getChanges(),r=[],a=new Map,l=new Set;for(const e of n)if("insert"==e.type&&"$text"!=e.name)ix(e.position,a),e.attributes.has("listItemId")?l.add(e.position.nodeAfter):ix(e.position.getShiftedBy(e.length),a);else if("remove"==e.type&&e.attributes.has("listItemId"))ix(e.position,a);else if("attribute"==e.type){const t=e.range.start.nodeAfter;i.includes(e.attributeKey)?(ix(e.range.start,a),null===e.attributeNewValue?(ix(e.range.start.getShiftedBy(1),a),o(t)&&r.push(t)):l.add(t)):EA(t)&&o(t)&&r.push(t)}for(const e of a.values())r.push(...s(e,l));for(const e of new Set(r))t.reconvertItem(e)};function s(e,t){const n=[],s=new Set,a=[];for(const{node:l,previous:c}of CA(e,"forward")){if(s.has(l))continue;const e=l.getAttribute("listIndent");c&&ei.includes(e))));const d=SA(l,{direction:"forward"});for(const e of d)s.add(e),(o(e,d)||r(e,a,t))&&n.push(e)}return n}function o(e,s){const o=t.mapper.toViewElement(e);if(!o)return!1;if(n.fire("checkElement",{modelElement:e,viewElement:o}))return!0;if(!e.is("element","paragraph")&&!e.is("element","listItem"))return!1;const r=lx(e,i,s);return!(!r||!o.is("element","p"))||!(r||!o.is("element","span"))}function r(e,i,s){if(s.has(e))return!1;const o=t.mapper.toViewElement(e);let r=i.length-1;for(let e=o.parent;!e.is("editableElement");e=e.parent){const t=QA(e),s=JA(e);if(!s&&!t)continue;const o="checkAttributes:"+(t?"item":"list");if(n.fire(o,{viewElement:e,modelAttributes:i[r]}))break;if(s&&(r--,r<0))return!1}return!0}}(t,e.editing,i,this),{priority:"high"}),this.on("checkAttributes:item",((e,{viewElement:t,modelAttributes:i})=>{t.id!=i.listItemId&&(e.return=!0,e.stop())})),this.on("checkAttributes:list",((e,{viewElement:t,modelAttributes:i})=>{t.name==ex(i.listType)&&t.id==tx(i.listType,i.listIndent)||(e.return=!0,e.stop())}))}_setupModelPostFixing(){const e=this.editor.model,t=this.getListAttributeNames();e.document.registerPostFixer((i=>function(e,t,i,n){const s=e.document.differ.getChanges(),o=new Map,r=n.editor.config.get("list.multiBlock");let a=!1;for(const n of s){if("insert"==n.type&&"$text"!=n.name){const s=n.position.nodeAfter;if(!e.schema.checkAttribute(s,"listItemId"))for(const e of Array.from(s.getAttributeKeys()))i.includes(e)&&(t.removeAttribute(e,s),a=!0);ix(n.position,o),n.attributes.has("listItemId")||ix(n.position.getShiftedBy(n.length),o);for(const{item:t,previousPosition:i}of e.createRangeIn(s))EA(t)&&ix(i,o)}else"remove"==n.type?ix(n.position,o):"attribute"==n.type&&i.includes(n.attributeKey)&&(ix(n.range.start,o),null===n.attributeNewValue&&ix(n.range.start.getShiftedBy(1),o));if(!r&&"attribute"==n.type&&cx.includes(n.attributeKey)){const e=n.range.start.nodeAfter;null===n.attributeNewValue&&e&&e.is("element","listItem")?(t.rename(e,"paragraph"),a=!0):null===n.attributeOldValue&&e&&e.is("element")&&"listItem"!=e.name&&(t.rename(e,"listItem"),a=!0)}}const l=new Set;for(const e of o.values())a=n.fire("postFixer",{listNodes:new AA(e),listHead:e,writer:t,seenIds:l})||a;return a}(e,i,t,this))),this.on("postFixer",((e,{listNodes:t,writer:i})=>{e.return=function(e,t){let i=0,n=-1,s=null,o=!1;for(const{node:r}of e){const e=r.getAttribute("listIndent");if(e>i){let a;null===s?(s=e-i,a=i):(s>e&&(s=e),a=e-s),a>n+1&&(a=n+1),t.setAttribute("listIndent",a,r),o=!0,n=a}else s=null,i=e+1,n=e}return o}(t,i)||e.return}),{priority:"high"}),this.on("postFixer",((e,{listNodes:t,writer:i,seenIds:n})=>{e.return=function(e,t,i){const n=new Set;let s=!1;for(const{node:o}of e){if(n.has(o))continue;let e=o.getAttribute("listType"),r=o.getAttribute("listItemId");if(t.has(r)&&(r=xA.next()),t.add(r),o.is("element","listItem"))o.getAttribute("listItemId")!=r&&(i.setAttribute("listItemId",r,o),s=!0);else for(const t of SA(o,{direction:"forward"}))n.add(t),t.getAttribute("listType")!=e&&(r=xA.next(),e=t.getAttribute("listType")),t.getAttribute("listItemId")!=r&&(i.setAttribute("listItemId",r,t),s=!0)}return s}(t,n,i)||e.return}),{priority:"high"})}_setupClipboardIntegration(){const e=this.editor.model,t=this.editor.plugins.get("ClipboardPipeline");this.listenTo(e,"insertContent",function(e){return(t,[i,n])=>{const s=i.is("documentFragment")?Array.from(i.getChildren()):[i];if(!s.length)return;const o=(n?e.createSelection(n):e.document.selection).getFirstPosition();let r;if(EA(o.parent))r=o.parent;else{if(!EA(o.nodeBefore))return;r=o.nodeBefore}e.change((e=>{const t=r.getAttribute("listType"),i=r.getAttribute("listIndent"),n=s[0].getAttribute("listIndent")||0,o=Math.max(i-n,0);for(const i of s){const n=EA(i);r.is("element","listItem")&&i.is("element","paragraph")&&e.rename(i,"listItem"),e.setAttributes({listIndent:(n?i.getAttribute("listIndent"):0)+o,listItemId:n?i.getAttribute("listItemId"):xA.next(),listType:t},i)}}))}}(e),{priority:"high"}),this.listenTo(t,"outputTransformation",((t,i)=>{e.change((e=>{const t=Array.from(i.content.getChildren()),n=t[t.length-1];if(t.length>1&&n.is("element")&&n.isEmpty){t.slice(0,-1).every(EA)&&e.remove(n)}if("copy"==i.method||"cut"==i.method){const t=Array.from(i.content.getChildren());DA(t)&&FA(t,e)}}))}))}_setupAccessibilityIntegration(){const e=this.editor,t=e.t;e.accessibility.addKeystrokeInfoGroup({id:"list",label:t("Keystrokes that can be used in a list"),keystrokes:[{label:t("Increase list item indent"),keystroke:"Tab"},{label:t("Decrease list item indent"),keystroke:"Shift+Tab"}]})}}function hx(e,t){const i=e.document.selection;if(!i.isCollapsed)return!zA(e);if("forward"===t)return!0;const n=i.getFirstPosition().parent,s=n.previousSibling;return!e.schema.isObject(s)&&(!!s.isEmpty||DA([n,s]))}function ux(e,t,i,n){e.ui.componentFactory.add(t,(()=>{const s=mx(Ku,e,t,i,n);return s.set({tooltip:!0,isToggleable:!0}),s})),e.ui.componentFactory.add(`menuBar:${t}`,(()=>mx(up,e,t,i,n)))}function mx(e,t,i,n,s){const o=t.commands.get(i),r=new e(t.locale);return r.set({label:n,icon:s}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),r.on("execute",(()=>{t.execute(i),t.editing.view.focus()})),r}class gx extends so{static get pluginName(){return"ListUI"}init(){const e=this.editor.t;ux(this.editor,"numberedList",e("Numbered List"),fu.numberedList),ux(this.editor,"bulletedList",e("Bulleted List"),fu.bulletedList)}}class fx extends so{static get requires(){return[dx,gx]}static get pluginName(){return"List"}}class px extends ro{refresh(){const e=this._getValue();this.value=e,this.isEnabled=null!=e}execute({startIndex:e=1}={}){const t=this.editor.model,i=t.document;let n=Array.from(i.selection.getSelectedBlocks()).filter((e=>EA(e)&&$A(e.getAttribute("listType"))));n=OA(n),t.change((t=>{for(const i of n)t.setAttribute("listStart",e>=0?e:1,i)}))}_getValue(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());return e&&EA(e)&&$A(e.getAttribute("listType"))?e.getAttribute("listStart"):null}}const bx={},wx={},vx={},_x=[{listStyle:"disc",typeAttribute:"disc",listType:"bulleted"},{listStyle:"circle",typeAttribute:"circle",listType:"bulleted"},{listStyle:"square",typeAttribute:"square",listType:"bulleted"},{listStyle:"decimal",typeAttribute:"1",listType:"numbered"},{listStyle:"decimal-leading-zero",typeAttribute:null,listType:"numbered"},{listStyle:"lower-roman",typeAttribute:"i",listType:"numbered"},{listStyle:"upper-roman",typeAttribute:"I",listType:"numbered"},{listStyle:"lower-alpha",typeAttribute:"a",listType:"numbered"},{listStyle:"upper-alpha",typeAttribute:"A",listType:"numbered"},{listStyle:"lower-latin",typeAttribute:"a",listType:"numbered"},{listStyle:"upper-latin",typeAttribute:"A",listType:"numbered"}];for(const{listStyle:e,typeAttribute:t,listType:i}of _x)bx[e]=i,wx[e]=t,t&&(vx[t]=e);function yx(){return _x.map((e=>e.listStyle))}function kx(e){return bx[e]||null}function Cx(e){return vx[e]||null}function Ax(e){return wx[e]||null}class xx extends ro{constructor(e,t,i){super(e),this.defaultType=t,this._supportedTypes=i}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,i=t.document;t.change((t=>{this._tryToConvertItemsToList(e);let n=Array.from(i.selection.getSelectedBlocks()).filter((e=>e.hasAttribute("listType")));if(n.length){n=OA(n);for(const i of n)t.setAttribute("listStyle",e.type||this.defaultType,i)}}))}isStyleTypeSupported(e){return!this._supportedTypes||this._supportedTypes.includes(e)}_getValue(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());return EA(e)?e.getAttribute("listStyle"):null}_checkEnabled(){const e=this.editor,t=e.commands.get("numberedList"),i=e.commands.get("bulletedList");return t.isEnabled||i.isEnabled}_tryToConvertItemsToList(e){if(!e.type)return;const t=kx(e.type);if(!t)return;const i=this.editor,n=`${t}List`;i.commands.get(n).value||i.execute(n)}}class Ex extends ro{refresh(){const e=this._getValue();this.value=e,this.isEnabled=null!=e}execute(e={}){const t=this.editor.model,i=t.document;let n=Array.from(i.selection.getSelectedBlocks()).filter((e=>EA(e)&&"numbered"==e.getAttribute("listType")));n=OA(n),t.change((t=>{for(const i of n)t.setAttribute("listReversed",!!e.reversed,i)}))}_getValue(){const e=Zs(this.editor.model.document.selection.getSelectedBlocks());return EA(e)&&"numbered"==e.getAttribute("listType")?e.getAttribute("listReversed"):null}}function Tx(e){return(t,i,n)=>{const{writer:s,schema:o,consumable:r}=n;if(!1===r.test(i.viewItem,e.viewConsumables))return;i.modelRange||Object.assign(i,n.convertChildren(i.viewItem,i.modelCursor));let a=!1;for(const t of i.modelRange.getItems({shallow:!0}))o.checkAttribute(t,e.attributeName)&&e.appliesToListItem(t)&&(t.hasAttribute(e.attributeName)||(s.setAttribute(e.attributeName,e.getAttributeOnUpcast(i.viewItem),t),a=!0));a&&r.consume(i.viewItem,e.viewConsumables)}}class Sx extends so{static get pluginName(){return"ListPropertiesUtils"}getAllSupportedStyleTypes(){return yx()}getListTypeFromListStyleType(e){return kx(e)}getListStyleTypeFromTypeAttribute(e){return Cx(e)}getTypeAttributeFromListStyleType(e){return Ax(e)}}const Px="default";class Ix extends so{static get requires(){return[dx,Sx]}static get pluginName(){return"ListPropertiesEditing"}constructor(e){super(e),e.config.define("list.properties",{styles:!0,startIndex:!1,reversed:!1})}init(){const e=this.editor,t=e.model,i=e.plugins.get(dx),n=function(e){const t=[];if(e.styles){const i="object"==typeof e.styles&&e.styles.useAttribute;t.push({attributeName:"listStyle",defaultValue:Px,viewConsumables:{styles:"list-style-type"},addCommand(e){let t=yx();i&&(t=t.filter((e=>!!Ax(e)))),e.commands.add("listStyle",new xx(e,Px,t))},appliesToListItem:e=>"numbered"==e.getAttribute("listType")||"bulleted"==e.getAttribute("listType"),hasValidAttribute(e){if(!this.appliesToListItem(e))return!e.hasAttribute("listStyle");if(!e.hasAttribute("listStyle"))return!1;const t=e.getAttribute("listStyle");return t==Px||kx(t)==e.getAttribute("listType")},setAttributeOnDowncast(e,t,n){if(t&&t!==Px){if(!i)return void e.setStyle("list-style-type",t,n);{const i=Ax(t);if(i)return void e.setAttribute("type",i,n)}}e.removeStyle("list-style-type",n),e.removeAttribute("type",n)},getAttributeOnUpcast(e){const t=e.getStyle("list-style-type");if(t)return t;const i=e.getAttribute("type");return i?Cx(i):Px}})}e.reversed&&t.push({attributeName:"listReversed",defaultValue:!1,viewConsumables:{attributes:"reversed"},addCommand(e){e.commands.add("listReversed",new Ex(e))},appliesToListItem:e=>"numbered"==e.getAttribute("listType"),hasValidAttribute(e){return this.appliesToListItem(e)==e.hasAttribute("listReversed")},setAttributeOnDowncast(e,t,i){t?e.setAttribute("reversed","reversed",i):e.removeAttribute("reversed",i)},getAttributeOnUpcast:e=>e.hasAttribute("reversed")});e.startIndex&&t.push({attributeName:"listStart",defaultValue:1,viewConsumables:{attributes:"start"},addCommand(e){e.commands.add("listStart",new px(e))},appliesToListItem:e=>$A(e.getAttribute("listType")),hasValidAttribute(e){return this.appliesToListItem(e)==e.hasAttribute("listStart")},setAttributeOnDowncast(e,t,i){0==t||t>1?e.setAttribute("start",t,i):e.removeAttribute("start",i)},getAttributeOnUpcast(e){const t=e.getAttribute("start");return t>=0?t:1}});return t}(e.config.get("list.properties"));for(const s of n)s.addCommand(e),t.schema.extend("$listItem",{allowAttributes:s.attributeName}),i.registerDowncastStrategy({scope:"list",attributeName:s.attributeName,setAttributeOnDowncast(e,t,i){s.setAttributeOnDowncast(e,t,i)}});e.conversion.for("upcast").add((e=>{for(const t of n)e.on("element:ol",Tx(t)),e.on("element:ul",Tx(t))})),i.on("checkAttributes:list",((e,{viewElement:t,modelAttributes:i})=>{for(const s of n)s.getAttributeOnUpcast(t)!=i[s.attributeName]&&(e.return=!0,e.stop())})),this.listenTo(e.commands.get("indentList"),"afterExecute",((e,i)=>{t.change((e=>{for(const t of i)for(const i of n)i.appliesToListItem(t)&&e.setAttribute(i.attributeName,i.defaultValue,t)}))})),i.on("postFixer",((e,{listNodes:t,writer:i})=>{for(const{node:s}of t)for(const t of n)t.hasValidAttribute(s)||(t.appliesToListItem(s)?i.setAttribute(t.attributeName,t.defaultValue,s):i.removeAttribute(t.attributeName,s),e.return=!0)})),i.on("postFixer",((e,{listNodes:t,writer:i})=>{for(const{node:s,previousNodeInList:o}of t)if(o&&o.getAttribute("listType")==s.getAttribute("listType"))for(const t of n){const{attributeName:n}=t;if(!t.appliesToListItem(s))continue;const r=o.getAttribute(n);s.getAttribute(n)!=r&&(i.setAttribute(n,r,s),e.return=!0)}}))}}class Vx extends Du{constructor(e,{enabledProperties:t,styleButtonViews:i,styleGridAriaLabel:n}){super(e),this.stylesView=null,this.additionalPropertiesCollapsibleView=null,this.startIndexFieldView=null,this.reversedSwitchButtonView=null,this.focusTracker=new Js,this.keystrokes=new Qs,this.focusables=new pu;const s=["ck","ck-list-properties"];this.children=this.createCollection(),this.focusCycler=new ym({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),t.styles?(this.stylesView=this._createStylesView(i,n),this.children.add(this.stylesView)):s.push("ck-list-properties_without-styles"),(t.startIndex||t.reversed)&&(this._addNumberedListPropertyViews(t),s.push("ck-list-properties_with-numbered-properties")),this.setTemplate({tag:"div",attributes:{class:s},children:this.children})}render(){if(super.render(),this.stylesView){this.focusables.add(this.stylesView),this.focusTracker.add(this.stylesView.element),(this.startIndexFieldView||this.reversedSwitchButtonView)&&(this.focusables.add(this.children.last.buttonView),this.focusTracker.add(this.children.last.buttonView.element));for(const e of this.stylesView.children)this.stylesView.focusTracker.add(e.element);n({keystrokeHandler:this.stylesView.keystrokes,focusTracker:this.stylesView.focusTracker,gridItems:this.stylesView.children,numberOfColumns:()=>Mn.window.getComputedStyle(this.stylesView.element).getPropertyValue("grid-template-columns").split(" ").length,uiLanguageDirection:this.locale&&this.locale.uiLanguageDirection})}if(this.startIndexFieldView){this.focusables.add(this.startIndexFieldView),this.focusTracker.add(this.startIndexFieldView.element);const e=e=>e.stopPropagation();this.keystrokes.set("arrowright",e),this.keystrokes.set("arrowleft",e),this.keystrokes.set("arrowup",e),this.keystrokes.set("arrowdown",e)}this.reversedSwitchButtonView&&(this.focusables.add(this.reversedSwitchButtonView),this.focusTracker.add(this.reversedSwitchButtonView.element)),this.keystrokes.listenTo(this.element)}focus(){this.focusCycler.focusFirst()}focusLast(){this.focusCycler.focusLast()}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createStylesView(e,t){const i=new Du(this.locale);return i.children=i.createCollection(),i.children.addMany(e),i.setTemplate({tag:"div",attributes:{"aria-label":t,class:["ck","ck-list-styles-list"]},children:i.children}),i.children.delegate("execute").to(this),i.focus=function(){this.children.first.focus()},i.focusTracker=new Js,i.keystrokes=new Qs,i.render(),i.keystrokes.listenTo(i.element),i}_addNumberedListPropertyViews(e){const t=this.locale.t,i=[];e.startIndex&&(this.startIndexFieldView=this._createStartIndexField(),i.push(this.startIndexFieldView)),e.reversed&&(this.reversedSwitchButtonView=this._createReversedSwitchButton(),i.push(this.reversedSwitchButtonView)),e.styles?(this.additionalPropertiesCollapsibleView=new Xu(this.locale,i),this.additionalPropertiesCollapsibleView.set({label:t("List properties"),isCollapsed:!0}),this.additionalPropertiesCollapsibleView.buttonView.bind("isEnabled").toMany(i,"isEnabled",((...e)=>e.some((e=>e)))),this.additionalPropertiesCollapsibleView.buttonView.on("change:isEnabled",((e,t,i)=>{i||(this.additionalPropertiesCollapsibleView.isCollapsed=!0)})),this.children.add(this.additionalPropertiesCollapsibleView)):this.children.addMany(i)}_createStartIndexField(){const e=this.locale.t,t=new um(this.locale,qm);return t.set({label:e("Start at"),class:"ck-numbered-list-properties__start-index"}),t.fieldView.set({min:0,step:1,value:1,inputMode:"numeric"}),t.fieldView.on("input",(()=>{const i=t.fieldView.element,n=i.valueAsNumber;Number.isNaN(n)?t.errorText=e("Invalid start index value."):i.checkValidity()?this.fire("listStart",{startIndex:n}):t.errorText=e("Start index must be greater than 0.")})),t}_createReversedSwitchButton(){const e=this.locale.t,t=new Zu(this.locale);return t.set({withText:!0,label:e("Reversed order"),class:"ck-numbered-list-properties__reversed-order"}),t.delegate("execute").to(this,"listReversed"),t}}class Rx extends so{static get pluginName(){return"ListPropertiesUI"}init(){const e=this.editor,t=e.locale.t,i=e.config.get("list.properties");if(i.styles){const n=[{label:t("Toggle the disc list style"),tooltip:t("Disc"),type:"disc",icon:''},{label:t("Toggle the circle list style"),tooltip:t("Circle"),type:"circle",icon:''},{label:t("Toggle the square list style"),tooltip:t("Square"),type:"square",icon:''}],s=t("Bulleted List"),o=t("Bulleted list styles toolbar"),r="bulletedList";e.ui.componentFactory.add(r,Ox({editor:e,propertiesConfig:i,parentCommandName:r,buttonLabel:s,buttonIcon:fu.bulletedList,styleGridAriaLabel:o,styleDefinitions:n})),e.ui.componentFactory.add(`menuBar:${r}`,Mx({editor:e,propertiesConfig:i,parentCommandName:r,buttonLabel:s,styleGridAriaLabel:o,styleDefinitions:n}))}if(i.styles||i.startIndex||i.reversed){const n=[{label:t("Toggle the decimal list style"),tooltip:t("Decimal"),type:"decimal",icon:''},{label:t("Toggle the decimal with leading zero list style"),tooltip:t("Decimal with leading zero"),type:"decimal-leading-zero",icon:''},{label:t("Toggle the lower–roman list style"),tooltip:t("Lower–roman"),type:"lower-roman",icon:''},{label:t("Toggle the upper–roman list style"),tooltip:t("Upper-roman"),type:"upper-roman",icon:''},{label:t("Toggle the lower–latin list style"),tooltip:t("Lower-latin"),type:"lower-latin",icon:''},{label:t("Toggle the upper–latin list style"),tooltip:t("Upper-latin"),type:"upper-latin",icon:''}],s=t("Numbered List"),o=t("Numbered list styles toolbar"),r="numberedList";e.ui.componentFactory.add(r,Ox({editor:e,propertiesConfig:i,parentCommandName:r,buttonLabel:s,buttonIcon:fu.numberedList,styleGridAriaLabel:o,styleDefinitions:n})),i.styles&&e.ui.componentFactory.add(`menuBar:${r}`,Mx({editor:e,propertiesConfig:i,parentCommandName:r,buttonLabel:s,styleGridAriaLabel:o,styleDefinitions:n}))}}}function Ox({editor:e,propertiesConfig:t,parentCommandName:i,buttonLabel:n,buttonIcon:s,styleGridAriaLabel:o,styleDefinitions:r}){const a=e.commands.get(i);return l=>{const c=Dm(l,Fm),d=c.buttonView;return c.bind("isEnabled").to(a),c.class="ck-list-styles-dropdown",d.on("execute",(()=>{e.execute(i),e.editing.view.focus()})),d.set({label:n,icon:s,tooltip:!0,isToggleable:!0}),d.bind("isOn").to(a,"value",(e=>!!e)),c.once("change:isOpen",(()=>{const n=function({editor:e,propertiesConfig:t,dropdownView:i,parentCommandName:n,styleDefinitions:s,styleGridAriaLabel:o}){const r=e.locale,a={...t};"numberedList"!=n&&(a.startIndex=!1,a.reversed=!1);let l=null;if(a.styles){const t=e.commands.get("listStyle"),i=Bx({editor:e,parentCommandName:n,listStyleCommand:t}),o=Nx(t);l=s.filter(o).map(i)}const c=new Vx(r,{styleGridAriaLabel:o,enabledProperties:a,styleButtonViews:l});a.styles&&Wm(i,(()=>c.stylesView.children.find((e=>e.isOn))));if(a.startIndex){const t=e.commands.get("listStart");c.startIndexFieldView.bind("isEnabled").to(t),c.startIndexFieldView.fieldView.bind("value").to(t),c.on("listStart",((t,i)=>e.execute("listStart",i)))}if(a.reversed){const t=e.commands.get("listReversed");c.reversedSwitchButtonView.bind("isEnabled").to(t),c.reversedSwitchButtonView.bind("isOn").to(t,"value",(e=>!!e)),c.on("listReversed",(()=>{const i=t.value;e.execute("listReversed",{reversed:!i})}))}return c.delegate("execute").to(i),c}({editor:e,propertiesConfig:t,dropdownView:c,parentCommandName:i,styleGridAriaLabel:o,styleDefinitions:r});c.panelView.children.add(n)})),c.on("execute",(()=>{e.editing.view.focus()})),c}}function Bx({editor:e,listStyleCommand:t,parentCommandName:i}){const n=e.locale,s=e.commands.get(i);return({label:o,type:r,icon:a,tooltip:l})=>{const c=new Ku(n);return c.set({label:o,icon:a,tooltip:l}),t.on("change:value",(()=>{c.isOn=t.value===r})),c.on("execute",(()=>{s.value?t.value===r?e.execute(i):t.value!==r&&e.execute("listStyle",{type:r}):e.model.change((()=>{e.execute("listStyle",{type:r})}))})),c}}function Mx({editor:e,propertiesConfig:t,parentCommandName:i,buttonLabel:n,styleGridAriaLabel:s,styleDefinitions:o}){return r=>{const a=new dp(r),l=e.commands.get(i),c=e.commands.get("listStyle"),d=Nx(c),h=Bx({editor:e,parentCommandName:i,listStyleCommand:c}),u=o.filter(d).map(h),m=new Vx(r,{styleGridAriaLabel:s,enabledProperties:{...t,startIndex:!1,reversed:!1},styleButtonViews:u});return m.delegate("execute").to(a),a.buttonView.set({label:n,icon:fu[i]}),a.panelView.children.add(m),a.bind("isEnabled").to(l,"isEnabled"),a.on("execute",(()=>{e.editing.view.focus()})),a}}function Nx(e){return"function"==typeof e.isStyleTypeSupported?t=>e.isStyleTypeSupported(t.type):()=>!0}class Fx extends so{static get requires(){return[Ix,Rx]}static get pluginName(){return"ListProperties"}}_s("Ctrl+Enter");_s("Ctrl+Enter");function Dx(e){return void 0!==e&&e.endsWith("px")}function Lx(e){return e.toFixed(2).replace(/\.?0+$/,"")+"px"}function zx(e,t,i){if(!e.childCount)return;const n=new _h(e.document),s=function(e,t){const i=t.createRangeIn(e),n=[],s=new Set;for(const e of i.getItems()){if(!e.is("element")||!e.name.match(/^(p|h\d+|li|div)$/))continue;let t=Kx(e);if(void 0===t||0!=parseFloat(t)||Array.from(e.getClassNames()).find((e=>e.startsWith("MsoList")))||(t=void 0),e.hasStyle("mso-list")||void 0!==t&&s.has(t)){const i=qx(e);n.push({element:e,id:i.id,order:i.order,indent:i.indent,marginLeft:t}),void 0!==t&&s.add(t)}else s.clear()}return n}(e,n);if(!s.length)return;const o={},r=[];for(const e of s)if(void 0!==e.indent){Hx(e)||(r.length=0);const s=`${e.id}:${e.indent}`,a=Math.min(e.indent-1,r.length);if(ar.length-1||r[a].listElement.name!=l.type){0==a&&"ol"==l.type&&void 0!==e.id&&o[s]&&(l.startIndex=o[s]);const t=Ux(l,n,i);if(Dx(e.marginLeft)&&(0==a||Dx(r[a-1].marginLeft))){let i=e.marginLeft;a>0&&(i=Lx(parseFloat(i)-parseFloat(r[a-1].marginLeft))),n.setStyle("padding-left",i,t)}if(0==r.length){const i=e.element.parent,s=i.getChildIndex(e.element)+1;n.insertChild(s,t,i)}else{const e=r[a-1].listItemElements;n.appendChild(t,e[e.length-1])}r[a]={...e,listElement:t,listItemElements:[]},0==a&&void 0!==e.id&&(o[s]=l.startIndex||1)}}const l="li"==e.element.name?e.element:n.createElement("li");n.appendChild(l,r[a].listElement),r[a].listItemElements.push(l),0==a&&void 0!==e.id&&o[s]++,e.element!=l&&n.appendChild(e.element,l),Gx(e.element,n),n.removeStyle("text-indent",e.element),n.removeStyle("margin-left",e.element)}else{const t=r.find((t=>t.marginLeft==e.marginLeft));if(t){const i=t.listItemElements;n.appendChild(e.element,i[i.length-1]),n.removeStyle("margin-left",e.element)}else r.length=0}}function Hx(e){const t=e.element.previousSibling;return $x(t||e.element.parent)}function $x(e){return e.is("element","ol")||e.is("element","ul")}function Wx(e,t){const i=new RegExp(`@list l${e.id}:level${e.indent}\\s*({[^}]*)`,"gi"),n=/mso-level-number-format:([^;]{0,100});/gi,s=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,o=new RegExp(`@list\\s+l${e.id}:level\\d\\s*{[^{]*mso-level-text:"%\\d\\\\.`,"gi"),r=new RegExp(`@list l${e.id}:level\\d\\s*{[^{]*mso-level-number-format:`,"gi"),a=o.exec(t),l=r.exec(t),c=a&&!l,d=i.exec(t);let h="decimal",u="ol",m=null;if(d&&d[1]){const t=n.exec(d[1]);if(t&&t[1]&&(h=t[1].trim(),u="bullet"!==h&&"image"!==h?"ol":"ul"),"bullet"===h){const t=function(e){if("li"==e.name&&"ul"==e.parent.name&&e.parent.hasAttribute("type"))return e.parent.getAttribute("type");const t=function(e){if(e.getChild(0).is("$text"))return null;for(const t of e.getChildren()){if(!t.is("element","span"))continue;const e=t.getChild(0);if(e)return e.is("$text")?e:e.getChild(0)}return null}(e);if(!t)return null;const i=t._data;if("o"===i)return"circle";if("·"===i)return"disc";if("§"===i)return"square";return null}(e.element);t&&(h=t)}else{const e=s.exec(d[1]);e&&e[1]&&(m=parseInt(e[1]))}c&&(u="ol")}return{type:u,startIndex:m,style:jx(h),isLegalStyleList:c}}function jx(e){if(e.startsWith("arabic-leading-zero"))return"decimal-leading-zero";switch(e){case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return e;default:return null}}function Ux(e,t,i){const n=t.createElement(e.type);return e.style&&t.setStyle("list-style-type",e.style,n),e.startIndex&&e.startIndex>1&&t.setAttribute("start",e.startIndex,n),e.isLegalStyleList&&i&&t.addClass("legal-list",n),n}function qx(e){const t=e.getStyle("mso-list");if(void 0===t)return{};const i=t.match(/(^|\s{1,100})l(\d+)/i),n=t.match(/\s{0,100}lfo(\d+)/i),s=t.match(/\s{0,100}level(\d+)/i);return i&&n&&s?{id:i[2],order:n[1],indent:parseInt(s[1])}:{indent:1}}function Gx(e,t){const i=new To({name:"span",styles:{"mso-list":"Ignore"}}),n=t.createRangeIn(e);for(const e of n)"elementStart"===e.type&&i.match(e.item)&&t.remove(e.item)}function Kx(e){const t=e.getStyle("margin-left");return void 0===t||t.endsWith("px")?t:function(e){const t=parseFloat(e);return e.endsWith("pt")?Lx(96*t/72):e.endsWith("pc")?Lx(12*t*96/72):e.endsWith("in")?Lx(96*t):e.endsWith("cm")?Lx(96*t/2.54):e.endsWith("mm")?Lx(t/10*96/2.54):e}(t)}function Zx(e,t){if(!e.childCount)return;const i=new _h(e.document),n=function(e,t){const i=t.createRangeIn(e),n=new To({name:/v:(.+)/}),s=[];for(const e of i){if("elementStart"!=e.type)continue;const t=e.item,i=t.previousSibling,o=i&&i.is("element")?i.name:null,r=["Chart"],a=n.match(t),l=t.getAttribute("o:gfxdata"),c="v:shapetype"===o,d=l&&r.some((e=>t.getAttribute("id").includes(e)));a&&l&&!c&&!d&&s.push(e.item.getAttribute("id"))}return s}(e,i);!function(e,t,i){const n=i.createRangeIn(t),s=new To({name:"img"}),o=[];for(const t of n)if(t.item.is("element")&&s.match(t.item)){const i=t.item,n=i.getAttribute("v:shapes")?i.getAttribute("v:shapes").split(" "):[];n.length&&n.every((t=>e.indexOf(t)>-1))?o.push(i):i.getAttribute("src")||o.push(i)}for(const e of o)i.remove(e)}(n,e,i),function(e,t,i){const n=i.createRangeIn(t),s=[];for(const t of n)if("elementStart"==t.type&&t.item.is("element","v:shape")){const i=t.item.getAttribute("id");if(e.includes(i))continue;o(t.item.parent.getChildren(),i)||s.push(t.item)}for(const e of s){const t={src:r(e)};e.hasAttribute("alt")&&(t.alt=e.getAttribute("alt"));const n=i.createElement("img",t);i.insertChild(e.index+1,n,e.parent)}function o(e,t){for(const i of e)if(i.is("element")){if("img"==i.name&&i.getAttribute("v:shapes")==t)return!0;if(o(i.getChildren(),t))return!0}return!1}function r(e){for(const t of e.getChildren())if(t.is("element")&&t.getAttribute("src"))return t.getAttribute("src")}}(n,e,i),function(e,t){const i=t.createRangeIn(e),n=new To({name:/v:(.+)/}),s=[];for(const e of i)"elementStart"==e.type&&n.match(e.item)&&s.push(e.item);for(const e of s)t.remove(e)}(e,i);const s=function(e,t){const i=t.createRangeIn(e),n=new To({name:"img"}),s=[];for(const e of i)e.item.is("element")&&n.match(e.item)&&e.item.getAttribute("src").startsWith("file://")&&s.push(e.item);return s}(e,i);s.length&&function(e,t,i){if(e.length===t.length)for(let n=0;nString.fromCharCode(parseInt(e,16)))).join(""))}const Qx=//i,Yx=/xmlns:o="urn:schemas-microsoft-com/i;class Xx{constructor(e,t=!1){this.document=e,this.hasMultiLevelListPlugin=t}isActive(e){return Qx.test(e)||Yx.test(e)}execute(e){const{body:t,stylesString:i}=e._parsedData;zx(t,i,this.hasMultiLevelListPlugin),Zx(t,e.dataTransfer.getData("text/rtf")),function(e){const t=[],i=new _h(e.document);for(const{item:n}of i.createRangeIn(e))if(n.is("element")){for(const e of n.getClassNames())/\bmso/gi.exec(e)&&i.removeClass(e,n);for(const e of n.getStyleNames())/\bmso/gi.exec(e)&&i.removeStyle(e,n);(n.is("element","w:sdt")||n.is("element","w:sdtpr")&&n.isEmpty||n.is("element","o:p")&&n.isEmpty)&&t.push(n)}for(const e of t){const t=e.parent,n=t.getChildIndex(e);i.insertChild(n,e.getChildren(),t),i.remove(e)}}(t),e.content=t}}function eE(e,t,i,{blockElements:n,inlineObjectElements:s}){let o=i.createPositionAt(e,"forward"==t?"after":"before");return o=o.getLastMatchingPosition((({item:e})=>e.is("element")&&!n.includes(e.name)&&!s.includes(e.name)),{direction:t}),"forward"==t?o.nodeAfter:o.nodeBefore}function tE(e,t){return!!e&&e.is("element")&&t.includes(e.name)}const iE=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class nE{constructor(e){this.document=e}isActive(e){return iE.test(e)}execute(e){const t=new _h(this.document),{body:i}=e._parsedData;!function(e,t){for(const i of e.getChildren())if(i.is("element","b")&&"normal"===i.getStyle("font-weight")){const n=e.getChildIndex(i);t.remove(i),t.insertChild(n,i.getChildren(),e)}}(i,t),function(e,t){for(const i of t.createRangeIn(e)){const e=i.item;if(e.is("element","li")){const i=e.getChild(0);i&&i.is("element","p")&&t.unwrapElement(i)}}}(i,t),function(e,t){const i=new Tr(t.document.stylesProcessor),n=new ba(i,{renderingMode:"data"}),s=n.blockElements,o=n.inlineObjectElements,r=[];for(const i of t.createRangeIn(e)){const e=i.item;if(e.is("element","br")){const i=eE(e,"forward",t,{blockElements:s,inlineObjectElements:o}),n=eE(e,"backward",t,{blockElements:s,inlineObjectElements:o}),a=tE(i,s);(tE(n,s)||a)&&r.push(e)}}for(const e of r)e.hasClass("Apple-interchange-newline")?t.remove(e):t.replace(e,t.createElement("p"))}(i,t),e.content=i}}const sE=/(\s+)<\/span>/g,((e,t)=>1===t.length?" ":Array(t.length+1).join("  ").substr(0,t.length)))}function aE(e,t){const i=new DOMParser,n=function(e){return rE(rE(e)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/()[\r\n]+(<\/span>)/g,"$1 $2").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(e){const t="",i="",n=e.indexOf(t);if(n<0)return e;const s=e.indexOf(i,n+t.length);return e.substring(0,n+t.length)+(s>=0?e.substring(s):"")}(e=(e=e.replace(//,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"));})),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:a}};r["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var i={};i[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},t.languages.insertBefore("markup","cdata",i);}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}});}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"));}(t),t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,function(){if(void 0!==t&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},n="data-src-status",a="loading",r="loaded",i='pre[data-src]:not([data-src-status="loaded"]):not([data-src-status="loading"])',s=/\blang(?:uage)?-([\w-]+)\b/i;t.hooks.add("before-highlightall",(function(e){e.selector+=", "+i;})),t.hooks.add("before-sanity-check",(function(s){var o=s.element;if(o.matches(i)){s.code="",o.setAttribute(n,a);var u=o.appendChild(document.createElement("CODE"));u.textContent="Loading…";var c=o.getAttribute("data-src"),d=s.language;if("none"===d){var p=(/\.(\w+)$/.exec(c)||[,"none"])[1];d=e[p]||p;}l(u,d),l(o,d);var g=t.plugins.autoloader;g&&g.loadLanguages(d);var f=new XMLHttpRequest;f.open("GET",c,!0),f.onreadystatechange=function(){var e,a;4==f.readyState&&(f.status<400&&f.responseText?(o.setAttribute(n,r),u.textContent=f.responseText,t.highlightElement(u)):(o.setAttribute(n,"failed"),f.status>=400?u.textContent=(e=f.status,a=f.statusText,"✖ Error "+e+" while fetching file: "+a):u.textContent="✖ Error: File does not exist or is empty"));},f.send(null);}})),t.plugins.fileHighlight={highlight:function(e){for(var n,a=(e||document).querySelectorAll(i),r=0;n=a[r++];)t.highlightElement(n);}};var o=!1;t.fileHighlight=function(){o||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),o=!0),t.plugins.fileHighlight.highlight.apply(this,arguments);};}function l(e,t){var n=e.className;n=n.replace(s," ")+" language-"+t,e.className=n.replace(/\s+/g," ").trim();}}();}));!function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,a=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,r=/(?:\{*\.{3}(?:[^{}]|)*\})/.source;function i(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return a})).replace(//g,(function(){return r})),RegExp(e,t)}r=i(r).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=i(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:i(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:i(/=/.source),inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""},o=function(t){for(var n=[],a=0;a0&&n[n.length-1].tagName===s(r.content[0].content[1])&&n.pop():"/>"===r.content[r.content.length-1].content||n.push({tagName:s(r.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===r.type&&"{"===r.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===r.type&&"}"===r.content?n[n.length-1].openedBraces--:i=!0),(i||"string"==typeof r)&&n.length>0&&0===n[n.length-1].openedBraces){var l=s(r);a0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(l=s(t[a-1])+l,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",l,null,l);}r.content&&"string"!=typeof r.content&&o(r.content);}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||o(e.tokens);}));}(Prism),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|as|declare|implements|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter;var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript;}(Prism),Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"));})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r);}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,t){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}});}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete Prism.languages.go["class-name"],function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var s={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:s}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:s}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi);}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php");}));}(Prism),Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean,Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[a,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}});}(Prism),function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:module|import)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"]);}(Prism),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return "(?:"+t[+n]+")"}))}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,(function(){return "(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var r="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",i="class enum interface record struct",s="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return "\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(i),c=RegExp(l(r+" "+i+" "+s+" "+o)),d=l(i+" "+s+" "+o),p=l(r+" "+i+" "+o),g=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),f=a(/\((?:[^()]|<>)*\)/.source,2),b=/@?\b[A-Za-z_]\w*\b/.source,h=t(/<<0>>(?:\s*<<1>>)?/.source,[b,g]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,h]),y=/\[\s*(?:,\s*)*\]/.source,E=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),v=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,f,y]),S=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[v]),w=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[S,m,y]),k={keyword:c,punctuation:/[<>()?,.:[\]]/},A=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,x=/"(?:\\.|[^\\"\r\n])*"/.source,T=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[x]),lookbehind:!0,greedy:!0},{pattern:RegExp(A),greedy:!0,alias:"character"}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:k},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[b,w]),lookbehind:!0,inside:k},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[b]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,h]),lookbehind:!0,inside:k},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:k},{pattern:n(/(\bwhere\s+)<<0>>/.source,[b]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[E]),lookbehind:!0,inside:k},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[w,p,b]),inside:k}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[b]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[b]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[f]),lookbehind:!0,alias:"class-name",inside:k},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[w,m]),inside:k,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[w]),lookbehind:!0,inside:k,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[b,g]),inside:{function:n(/^<<0>>/.source,[b]),generic:{pattern:RegExp(g),alias:"class-name",inside:k}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,h,b,w,c.source,f,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[h,f]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(w),greedy:!0,inside:k},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=x+"|"+A,O=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[_]),I=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[O]),2),R=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,N=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,I]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[R,N]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[R]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[I]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var L=/:[^}\r\n]+/.source,P=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[O]),2),C=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,L]),F=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[_]),2),D=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[F,L]);function $(t,a){return {interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,L]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[C]),lookbehind:!0,greedy:!0,inside:$(C,P)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[D]),lookbehind:!0,greedy:!0,inside:$(D,F)}]});}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:[^\S\r\n]_[^\S\r\n]*(?:\r\n?|\n)|.)+/i,alias:"comment",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[^\S\r\n]*(?:\d+([/-])\d+\1\d+(?:[^\S\r\n]+(?:\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?))?|\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?)[^\S\r\n]*#/i,alias:"builtin"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:U?[ILS]|[FRD])?/i,boolean:/\b(?:True|False|Nothing)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Until|Xor)\b/i,operator:[/[+\-*/\\^<=>&#@$%!]/,{pattern:/([^\S\r\n])_(?=[^\S\r\n]*[\r\n])/,lookbehind:!0}],punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"],Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var t={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:t}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:t}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby;}(Prism),Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:true|false)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:true|false)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift;})),function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,s=0;s/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),i=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+i+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+i+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n]);}));})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown;}(Prism),Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/},Prism.languages.groovy=Prism.languages.extend("clike",{string:[{pattern:/("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0},{pattern:/(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:/\b(?:as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),Prism.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment"}}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:setup|given|when|then|and|cleanup|expect|where):/}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),Prism.hooks.add("wrap",(function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;"$"===t&&(n=/([^\$])(?:\$(?:\{.*?\}|[\w.]+))/),e.content=e.content.replace(/</g,"<").replace(/&/g,"&"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring");}}}));var vn=["comment","prolog","doctype","cdata","punctuation","namespace","property","tag","boolean","number","constant","symbol","deleted","selector","attr-name","string","builtin","inserted","operator","entity","url","string","atrule","attr-value","keyword","function","class-name","regex","important","variable","bold","italic","entity","char"];function Sn(e){return "string"==typeof e?e.length:"string"==typeof e.content?e.content.length:e.content.reduce((function(e,t){return e+Sn(t)}),0)}var wn,kn=d.String,An=function(e){if("Symbol"===nt(e))throw TypeError("Cannot convert a Symbol value to a string");return kn(e)},xn=function(){var e=ie(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t},Tn=d.RegExp,_n=j((function(){var e=Tn("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),On=_n||j((function(){return !Tn("a","y").sticky})),In={BROKEN_CARET:_n||j((function(){var e=Tn("^r","gy");return e.lastIndex=2,null!=e.exec("str")})),MISSED_STICKY:On,UNSUPPORTED_Y:_n},Rn=K?Object.defineProperties:function(e,t){ie(e);for(var n,a=jt(t),r=fn(t),i=r.length,s=0;i>s;)ke.f(e,n=r[s++],a[n]);return e},Nn=C("document","documentElement"),Ln=Ce("IE_PROTO"),Pn=function(){},Cn=function(e){return " + + *** 省市联动 *** + new PCAS("Province","City") + new PCAS("Province","City","吉林省") + new PCAS("Province","City","吉林省","吉林市") + + *** 省市区联动 *** + new PCAS("Province","City","Area") + new PCAS("Province","City","Area","吉林省") + new PCAS("Province","City","Area","吉林省","松原市") + new PCAS("Province","City","Area","吉林省","松原市","宁江区") + + 省、市、地区对象取得的值均为实际值。 + 注:省、市、地区提示信息选项的值为""(空字符串) + *********************************************************/ + +SPT = window.SPT || "-省份-"; +SCT = window.SCT || "-城市-"; +SAT = window.SAT || "-地区-"; +SWT = window.SWT || 0; // 提示文字 0:不显示 1:显示 + +function PCAS() { + this.SelP = document.getElementsByName(arguments[0])[0]; + this.SelC = document.getElementsByName(arguments[1])[0]; + this.SelA = document.getElementsByName(arguments[2])[0]; + this.DefP = this.SelA ? arguments[3] : arguments[2]; + this.DefC = this.SelA ? arguments[4] : arguments[3]; + this.DefA = this.SelA ? arguments[5] : arguments[4]; + if (this.SelP) this.SelP.PCA = this; + if (this.SelC) this.SelC.PCA = this; + if (this.SelA) this.SelA.PCA = this; + if (this.SelP && this.SelC) { + this.SelP.onchange = function () { + PCAS.SetC(this.PCA) + }; + if (this.SelA) this.SelC.onchange = function () { + PCAS.SetA(this.PCA) + }; + } + PCAS.init(this).SetP(this) +} + +PCAS.init = function (PCA) { + PCA.PCAP = [], PCA.PCAC = [], PCA.PCAA = [], PCA.PCAD = "__STRING__"; + if (SWT) PCA.PCAD = SPT + "$" + SCT + "," + SAT + "#" + PCA.PCAD; + PCA.PCAD.split("#").forEach(function (VAL1, ID1) { + PCA.PCAP[ID1] = VAL1.split("$")[0], PCA.PCAC[ID1] = [], PCA.PCAA[ID1] = []; + VAL1.split("$")[1].split("|").forEach(function (VAL2, ID2) { + PCA.PCAC[ID1].push((PCA.PCAR = VAL2.split(",")).shift()), PCA.PCAA[ID1][ID2] = PCA.PCAR; + }); + }); + return this; +}; + +PCAS.SetP = function (PCA) { + PCA.PCAP.forEach(function (VAL, IDX) { + PCA.PCAT = PCA.PCAV = VAL; + if (PCA.PCAT === SPT) PCA.PCAV = ""; + PCA.SelP.options.add(new Option(PCA.PCAT, PCA.PCAV)); + if (PCA.DefP === PCA.PCAV) PCA.SelP[IDX].selected = true + }), PCA.SelC ? PCAS.SetC(PCA) : $(PCA.SelP).trigger('change'); +}; + +PCAS.SetC = function (PCA) { + PCA.SelC.length = 0; + PCA.PCAC[PCA.SelP.selectedIndex].forEach(function (VAL, IDX) { + PCA.PCAT = PCA.PCAV = VAL; + if (PCA.PCAT === SCT) PCA.PCAV = ""; + PCA.SelC.options.add(new Option(PCA.PCAT, PCA.PCAV)); + if (PCA.DefC === PCA.PCAV) PCA.SelC[IDX].selected = true + }), PCA.SelA ? PCAS.SetA(PCA) : $(PCA.SelC).trigger('change'); +}; + +PCAS.SetA = function (PCA) { + PCA.SelA.length = 0; + PCA.PCAA[PCA.SelP.selectedIndex][PCA.SelC.selectedIndex].forEach(function (VAL, IDX) { + PCA.PCAT = PCA.PCAV = VAL; + if (PCA.PCAT === SAT) PCA.PCAV = ""; + PCA.SelA.options.add(new Option(PCA.PCAT, PCA.PCAV)); + if (PCA.DefA === PCA.PCAV) PCA.SelA[IDX].selected = true + }), $(PCA.SelA).trigger('change') +}; +EOL + ); + + // 写入区域文件 + return file_put_contents($scriptFile, $scriptContent) && file_put_contents($jsonFile, $jsonContent); + } +}; \ No newline at end of file diff --git a/public/static/plugs/jquery/area/data.json b/public/static/plugs/jquery/area/data.json new file mode 100644 index 0000000..20e8302 --- /dev/null +++ b/public/static/plugs/jquery/area/data.json @@ -0,0 +1 @@ +[{"code":"110000","name":"北京市","list":[{"code":"110100","name":"北京市","list":[{"code":"110101","name":"东城区"},{"code":"110102","name":"西城区"},{"code":"110105","name":"朝阳区"},{"code":"110106","name":"丰台区"},{"code":"110107","name":"石景山区"},{"code":"110108","name":"海淀区"},{"code":"110109","name":"门头沟区"},{"code":"110111","name":"房山区"},{"code":"110112","name":"通州区"},{"code":"110113","name":"顺义区"},{"code":"110114","name":"昌平区"},{"code":"110115","name":"大兴区"},{"code":"110116","name":"怀柔区"},{"code":"110117","name":"平谷区"},{"code":"110118","name":"密云区"},{"code":"110119","name":"延庆区"}]}]},{"code":"120000","name":"天津市","list":[{"code":"120100","name":"天津市","list":[{"code":"120101","name":"和平区"},{"code":"120102","name":"河东区"},{"code":"120103","name":"河西区"},{"code":"120104","name":"南开区"},{"code":"120105","name":"河北区"},{"code":"120106","name":"红桥区"},{"code":"120110","name":"东丽区"},{"code":"120111","name":"西青区"},{"code":"120112","name":"津南区"},{"code":"120113","name":"北辰区"},{"code":"120114","name":"武清区"},{"code":"120115","name":"宝坻区"},{"code":"120116","name":"滨海新区"},{"code":"120117","name":"宁河区"},{"code":"120118","name":"静海区"},{"code":"120119","name":"蓟州区"}]}]},{"code":"130000","name":"河北省","list":[{"code":"130100","name":"石家庄市","list":[{"code":"130102","name":"长安区"},{"code":"130104","name":"桥西区"},{"code":"130105","name":"新华区"},{"code":"130107","name":"井陉矿区"},{"code":"130108","name":"裕华区"},{"code":"130109","name":"藁城区"},{"code":"130110","name":"鹿泉区"},{"code":"130111","name":"栾城区"},{"code":"130121","name":"井陉县"},{"code":"130123","name":"正定县"},{"code":"130125","name":"行唐县"},{"code":"130126","name":"灵寿县"},{"code":"130127","name":"高邑县"},{"code":"130128","name":"深泽县"},{"code":"130129","name":"赞皇县"},{"code":"130130","name":"无极县"},{"code":"130131","name":"平山县"},{"code":"130132","name":"元氏县"},{"code":"130133","name":"赵县"},{"code":"130181","name":"辛集市"},{"code":"130183","name":"晋州市"},{"code":"130184","name":"新乐市"}]},{"code":"130200","name":"唐山市","list":[{"code":"130202","name":"路南区"},{"code":"130203","name":"路北区"},{"code":"130204","name":"古冶区"},{"code":"130205","name":"开平区"},{"code":"130207","name":"丰南区"},{"code":"130208","name":"丰润区"},{"code":"130209","name":"曹妃甸区"},{"code":"130224","name":"滦南县"},{"code":"130225","name":"乐亭县"},{"code":"130227","name":"迁西县"},{"code":"130229","name":"玉田县"},{"code":"130281","name":"遵化市"},{"code":"130283","name":"迁安市"},{"code":"130284","name":"滦州市"}]},{"code":"130300","name":"秦皇岛市","list":[{"code":"130302","name":"海港区"},{"code":"130303","name":"山海关区"},{"code":"130304","name":"北戴河区"},{"code":"130306","name":"抚宁区"},{"code":"130321","name":"青龙满族自治县"},{"code":"130322","name":"昌黎县"},{"code":"130324","name":"卢龙县"}]},{"code":"130400","name":"邯郸市","list":[{"code":"130402","name":"邯山区"},{"code":"130403","name":"丛台区"},{"code":"130404","name":"复兴区"},{"code":"130406","name":"峰峰矿区"},{"code":"130407","name":"肥乡区"},{"code":"130408","name":"永年区"},{"code":"130423","name":"临漳县"},{"code":"130424","name":"成安县"},{"code":"130425","name":"大名县"},{"code":"130426","name":"涉县"},{"code":"130427","name":"磁县"},{"code":"130430","name":"邱县"},{"code":"130431","name":"鸡泽县"},{"code":"130432","name":"广平县"},{"code":"130433","name":"馆陶县"},{"code":"130434","name":"魏县"},{"code":"130435","name":"曲周县"},{"code":"130481","name":"武安市"}]},{"code":"130500","name":"邢台市","list":[{"code":"130502","name":"襄都区"},{"code":"130503","name":"信都区"},{"code":"130505","name":"任泽区"},{"code":"130506","name":"南和区"},{"code":"130522","name":"临城县"},{"code":"130523","name":"内丘县"},{"code":"130524","name":"柏乡县"},{"code":"130525","name":"隆尧县"},{"code":"130528","name":"宁晋县"},{"code":"130529","name":"巨鹿县"},{"code":"130530","name":"新河县"},{"code":"130531","name":"广宗县"},{"code":"130532","name":"平乡县"},{"code":"130533","name":"威县"},{"code":"130534","name":"清河县"},{"code":"130535","name":"临西县"},{"code":"130581","name":"南宫市"},{"code":"130582","name":"沙河市"}]},{"code":"130600","name":"保定市","list":[{"code":"130602","name":"竞秀区"},{"code":"130606","name":"莲池区"},{"code":"130607","name":"满城区"},{"code":"130608","name":"清苑区"},{"code":"130609","name":"徐水区"},{"code":"130623","name":"涞水县"},{"code":"130624","name":"阜平县"},{"code":"130626","name":"定兴县"},{"code":"130627","name":"唐县"},{"code":"130628","name":"高阳县"},{"code":"130630","name":"涞源县"},{"code":"130631","name":"望都县"},{"code":"130633","name":"易县"},{"code":"130634","name":"曲阳县"},{"code":"130635","name":"蠡县"},{"code":"130636","name":"顺平县"},{"code":"130637","name":"博野县"},{"code":"130681","name":"涿州市"},{"code":"130682","name":"定州市"},{"code":"130683","name":"安国市"},{"code":"130684","name":"高碑店市"}]},{"code":"130700","name":"张家口市","list":[{"code":"130702","name":"桥东区"},{"code":"130703","name":"桥西区"},{"code":"130705","name":"宣化区"},{"code":"130706","name":"下花园区"},{"code":"130708","name":"万全区"},{"code":"130709","name":"崇礼区"},{"code":"130722","name":"张北县"},{"code":"130723","name":"康保县"},{"code":"130724","name":"沽源县"},{"code":"130725","name":"尚义县"},{"code":"130726","name":"蔚县"},{"code":"130727","name":"阳原县"},{"code":"130728","name":"怀安县"},{"code":"130730","name":"怀来县"},{"code":"130731","name":"涿鹿县"},{"code":"130732","name":"赤城县"}]},{"code":"130800","name":"承德市","list":[{"code":"130802","name":"双桥区"},{"code":"130803","name":"双滦区"},{"code":"130804","name":"鹰手营子矿区"},{"code":"130821","name":"承德县"},{"code":"130822","name":"兴隆县"},{"code":"130824","name":"滦平县"},{"code":"130825","name":"隆化县"},{"code":"130826","name":"丰宁满族自治县"},{"code":"130827","name":"宽城满族自治县"},{"code":"130828","name":"围场满族蒙古族自治县"},{"code":"130881","name":"平泉市"}]},{"code":"130900","name":"沧州市","list":[{"code":"130902","name":"新华区"},{"code":"130903","name":"运河区"},{"code":"130921","name":"沧县"},{"code":"130922","name":"青县"},{"code":"130923","name":"东光县"},{"code":"130924","name":"海兴县"},{"code":"130925","name":"盐山县"},{"code":"130926","name":"肃宁县"},{"code":"130927","name":"南皮县"},{"code":"130928","name":"吴桥县"},{"code":"130929","name":"献县"},{"code":"130930","name":"孟村回族自治县"},{"code":"130981","name":"泊头市"},{"code":"130982","name":"任丘市"},{"code":"130983","name":"黄骅市"},{"code":"130984","name":"河间市"}]},{"code":"131000","name":"廊坊市","list":[{"code":"131002","name":"安次区"},{"code":"131003","name":"广阳区"},{"code":"131022","name":"固安县"},{"code":"131023","name":"永清县"},{"code":"131024","name":"香河县"},{"code":"131025","name":"大城县"},{"code":"131026","name":"文安县"},{"code":"131028","name":"大厂回族自治县"},{"code":"131081","name":"霸州市"},{"code":"131082","name":"三河市"}]},{"code":"131100","name":"衡水市","list":[{"code":"131102","name":"桃城区"},{"code":"131103","name":"冀州区"},{"code":"131121","name":"枣强县"},{"code":"131122","name":"武邑县"},{"code":"131123","name":"武强县"},{"code":"131124","name":"饶阳县"},{"code":"131125","name":"安平县"},{"code":"131126","name":"故城县"},{"code":"131127","name":"景县"},{"code":"131128","name":"阜城县"},{"code":"131182","name":"深州市"}]},{"code":"133100","name":"雄安新区","list":[{"code":"133129","name":"容城县"},{"code":"133132","name":"安新县"},{"code":"133138","name":"雄县"}]}]},{"code":"140000","name":"山西省","list":[{"code":"140100","name":"太原市","list":[{"code":"140105","name":"小店区"},{"code":"140106","name":"迎泽区"},{"code":"140107","name":"杏花岭区"},{"code":"140108","name":"尖草坪区"},{"code":"140109","name":"万柏林区"},{"code":"140110","name":"晋源区"},{"code":"140121","name":"清徐县"},{"code":"140122","name":"阳曲县"},{"code":"140123","name":"娄烦县"},{"code":"140181","name":"古交市"}]},{"code":"140200","name":"大同市","list":[{"code":"140212","name":"新荣区"},{"code":"140213","name":"平城区"},{"code":"140214","name":"云冈区"},{"code":"140215","name":"云州区"},{"code":"140221","name":"阳高县"},{"code":"140222","name":"天镇县"},{"code":"140223","name":"广灵县"},{"code":"140224","name":"灵丘县"},{"code":"140225","name":"浑源县"},{"code":"140226","name":"左云县"}]},{"code":"140300","name":"阳泉市","list":[{"code":"140302","name":"城区"},{"code":"140303","name":"矿区"},{"code":"140311","name":"郊区"},{"code":"140321","name":"平定县"},{"code":"140322","name":"盂县"}]},{"code":"140400","name":"长治市","list":[{"code":"140403","name":"潞州区"},{"code":"140404","name":"上党区"},{"code":"140405","name":"屯留区"},{"code":"140406","name":"潞城区"},{"code":"140423","name":"襄垣县"},{"code":"140425","name":"平顺县"},{"code":"140426","name":"黎城县"},{"code":"140427","name":"壶关县"},{"code":"140428","name":"长子县"},{"code":"140429","name":"武乡县"},{"code":"140430","name":"沁县"},{"code":"140431","name":"沁源县"}]},{"code":"140500","name":"晋城市","list":[{"code":"140502","name":"城区"},{"code":"140521","name":"沁水县"},{"code":"140522","name":"阳城县"},{"code":"140524","name":"陵川县"},{"code":"140525","name":"泽州县"},{"code":"140581","name":"高平市"}]},{"code":"140600","name":"朔州市","list":[{"code":"140602","name":"朔城区"},{"code":"140603","name":"平鲁区"},{"code":"140621","name":"山阴县"},{"code":"140622","name":"应县"},{"code":"140623","name":"右玉县"},{"code":"140681","name":"怀仁市"}]},{"code":"140700","name":"晋中市","list":[{"code":"140702","name":"榆次区"},{"code":"140703","name":"太谷区"},{"code":"140721","name":"榆社县"},{"code":"140722","name":"左权县"},{"code":"140723","name":"和顺县"},{"code":"140724","name":"昔阳县"},{"code":"140725","name":"寿阳县"},{"code":"140727","name":"祁县"},{"code":"140728","name":"平遥县"},{"code":"140729","name":"灵石县"},{"code":"140781","name":"介休市"}]},{"code":"140800","name":"运城市","list":[{"code":"140802","name":"盐湖区"},{"code":"140821","name":"临猗县"},{"code":"140822","name":"万荣县"},{"code":"140823","name":"闻喜县"},{"code":"140824","name":"稷山县"},{"code":"140825","name":"新绛县"},{"code":"140826","name":"绛县"},{"code":"140827","name":"垣曲县"},{"code":"140828","name":"夏县"},{"code":"140829","name":"平陆县"},{"code":"140830","name":"芮城县"},{"code":"140881","name":"永济市"},{"code":"140882","name":"河津市"}]},{"code":"140900","name":"忻州市","list":[{"code":"140902","name":"忻府区"},{"code":"140921","name":"定襄县"},{"code":"140922","name":"五台县"},{"code":"140923","name":"代县"},{"code":"140924","name":"繁峙县"},{"code":"140925","name":"宁武县"},{"code":"140926","name":"静乐县"},{"code":"140927","name":"神池县"},{"code":"140928","name":"五寨县"},{"code":"140929","name":"岢岚县"},{"code":"140930","name":"河曲县"},{"code":"140931","name":"保德县"},{"code":"140932","name":"偏关县"},{"code":"140981","name":"原平市"}]},{"code":"141000","name":"临汾市","list":[{"code":"141002","name":"尧都区"},{"code":"141021","name":"曲沃县"},{"code":"141022","name":"翼城县"},{"code":"141023","name":"襄汾县"},{"code":"141024","name":"洪洞县"},{"code":"141025","name":"古县"},{"code":"141026","name":"安泽县"},{"code":"141027","name":"浮山县"},{"code":"141028","name":"吉县"},{"code":"141029","name":"乡宁县"},{"code":"141030","name":"大宁县"},{"code":"141031","name":"隰县"},{"code":"141032","name":"永和县"},{"code":"141033","name":"蒲县"},{"code":"141034","name":"汾西县"},{"code":"141081","name":"侯马市"},{"code":"141082","name":"霍州市"}]},{"code":"141100","name":"吕梁市","list":[{"code":"141102","name":"离石区"},{"code":"141121","name":"文水县"},{"code":"141122","name":"交城县"},{"code":"141123","name":"兴县"},{"code":"141124","name":"临县"},{"code":"141125","name":"柳林县"},{"code":"141126","name":"石楼县"},{"code":"141127","name":"岚县"},{"code":"141128","name":"方山县"},{"code":"141129","name":"中阳县"},{"code":"141130","name":"交口县"},{"code":"141181","name":"孝义市"},{"code":"141182","name":"汾阳市"}]}]},{"code":"150000","name":"内蒙古自治区","list":[{"code":"150100","name":"呼和浩特市","list":[{"code":"150102","name":"新城区"},{"code":"150103","name":"回民区"},{"code":"150104","name":"玉泉区"},{"code":"150105","name":"赛罕区"},{"code":"150121","name":"土默特左旗"},{"code":"150122","name":"托克托县"},{"code":"150123","name":"和林格尔县"},{"code":"150124","name":"清水河县"},{"code":"150125","name":"武川县"}]},{"code":"150200","name":"包头市","list":[{"code":"150202","name":"东河区"},{"code":"150203","name":"昆都仑区"},{"code":"150204","name":"青山区"},{"code":"150205","name":"石拐区"},{"code":"150206","name":"白云鄂博矿区"},{"code":"150207","name":"九原区"},{"code":"150221","name":"土默特右旗"},{"code":"150222","name":"固阳县"},{"code":"150223","name":"达尔罕茂明安联合旗"}]},{"code":"150300","name":"乌海市","list":[{"code":"150302","name":"海勃湾区"},{"code":"150303","name":"海南区"},{"code":"150304","name":"乌达区"}]},{"code":"150400","name":"赤峰市","list":[{"code":"150402","name":"红山区"},{"code":"150403","name":"元宝山区"},{"code":"150404","name":"松山区"},{"code":"150421","name":"阿鲁科尔沁旗"},{"code":"150422","name":"巴林左旗"},{"code":"150423","name":"巴林右旗"},{"code":"150424","name":"林西县"},{"code":"150425","name":"克什克腾旗"},{"code":"150426","name":"翁牛特旗"},{"code":"150428","name":"喀喇沁旗"},{"code":"150429","name":"宁城县"},{"code":"150430","name":"敖汉旗"}]},{"code":"150500","name":"通辽市","list":[{"code":"150502","name":"科尔沁区"},{"code":"150521","name":"科尔沁左翼中旗"},{"code":"150522","name":"科尔沁左翼后旗"},{"code":"150523","name":"开鲁县"},{"code":"150524","name":"库伦旗"},{"code":"150525","name":"奈曼旗"},{"code":"150526","name":"扎鲁特旗"},{"code":"150581","name":"霍林郭勒市"}]},{"code":"150600","name":"鄂尔多斯市","list":[{"code":"150602","name":"东胜区"},{"code":"150603","name":"康巴什区"},{"code":"150621","name":"达拉特旗"},{"code":"150622","name":"准格尔旗"},{"code":"150623","name":"鄂托克前旗"},{"code":"150624","name":"鄂托克旗"},{"code":"150625","name":"杭锦旗"},{"code":"150626","name":"乌审旗"},{"code":"150627","name":"伊金霍洛旗"}]},{"code":"150700","name":"呼伦贝尔市","list":[{"code":"150702","name":"海拉尔区"},{"code":"150703","name":"扎赉诺尔区"},{"code":"150721","name":"阿荣旗"},{"code":"150722","name":"莫力达瓦达斡尔族自治旗"},{"code":"150723","name":"鄂伦春自治旗"},{"code":"150724","name":"鄂温克族自治旗"},{"code":"150725","name":"陈巴尔虎旗"},{"code":"150726","name":"新巴尔虎左旗"},{"code":"150727","name":"新巴尔虎右旗"},{"code":"150781","name":"满洲里市"},{"code":"150782","name":"牙克石市"},{"code":"150783","name":"扎兰屯市"},{"code":"150784","name":"额尔古纳市"},{"code":"150785","name":"根河市"}]},{"code":"150800","name":"巴彦淖尔市","list":[{"code":"150802","name":"临河区"},{"code":"150821","name":"五原县"},{"code":"150822","name":"磴口县"},{"code":"150823","name":"乌拉特前旗"},{"code":"150824","name":"乌拉特中旗"},{"code":"150825","name":"乌拉特后旗"},{"code":"150826","name":"杭锦后旗"}]},{"code":"150900","name":"乌兰察布市","list":[{"code":"150902","name":"集宁区"},{"code":"150921","name":"卓资县"},{"code":"150922","name":"化德县"},{"code":"150923","name":"商都县"},{"code":"150924","name":"兴和县"},{"code":"150925","name":"凉城县"},{"code":"150926","name":"察哈尔右翼前旗"},{"code":"150927","name":"察哈尔右翼中旗"},{"code":"150928","name":"察哈尔右翼后旗"},{"code":"150929","name":"四子王旗"},{"code":"150981","name":"丰镇市"}]},{"code":"152200","name":"兴安盟","list":[{"code":"152201","name":"乌兰浩特市"},{"code":"152202","name":"阿尔山市"},{"code":"152221","name":"科尔沁右翼前旗"},{"code":"152222","name":"科尔沁右翼中旗"},{"code":"152223","name":"扎赉特旗"},{"code":"152224","name":"突泉县"}]},{"code":"152500","name":"锡林郭勒盟","list":[{"code":"152501","name":"二连浩特市"},{"code":"152502","name":"锡林浩特市"},{"code":"152522","name":"阿巴嘎旗"},{"code":"152523","name":"苏尼特左旗"},{"code":"152524","name":"苏尼特右旗"},{"code":"152525","name":"东乌珠穆沁旗"},{"code":"152526","name":"西乌珠穆沁旗"},{"code":"152527","name":"太仆寺旗"},{"code":"152528","name":"镶黄旗"},{"code":"152529","name":"正镶白旗"},{"code":"152530","name":"正蓝旗"},{"code":"152531","name":"多伦县"}]},{"code":"152900","name":"阿拉善盟","list":[{"code":"152921","name":"阿拉善左旗"},{"code":"152922","name":"阿拉善右旗"},{"code":"152923","name":"额济纳旗"}]}]},{"code":"210000","name":"辽宁省","list":[{"code":"210100","name":"沈阳市","list":[{"code":"210102","name":"和平区"},{"code":"210103","name":"沈河区"},{"code":"210104","name":"大东区"},{"code":"210105","name":"皇姑区"},{"code":"210106","name":"铁西区"},{"code":"210111","name":"苏家屯区"},{"code":"210112","name":"浑南区"},{"code":"210113","name":"沈北新区"},{"code":"210114","name":"于洪区"},{"code":"210115","name":"辽中区"},{"code":"210123","name":"康平县"},{"code":"210124","name":"法库县"},{"code":"210181","name":"新民市"}]},{"code":"210200","name":"大连市","list":[{"code":"210202","name":"中山区"},{"code":"210203","name":"西岗区"},{"code":"210204","name":"沙河口区"},{"code":"210211","name":"甘井子区"},{"code":"210212","name":"旅顺口区"},{"code":"210213","name":"金州区"},{"code":"210214","name":"普兰店区"},{"code":"210224","name":"长海县"},{"code":"210281","name":"瓦房店市"},{"code":"210283","name":"庄河市"}]},{"code":"210300","name":"鞍山市","list":[{"code":"210302","name":"铁东区"},{"code":"210303","name":"铁西区"},{"code":"210304","name":"立山区"},{"code":"210311","name":"千山区"},{"code":"210321","name":"台安县"},{"code":"210323","name":"岫岩满族自治县"},{"code":"210381","name":"海城市"}]},{"code":"210400","name":"抚顺市","list":[{"code":"210402","name":"新抚区"},{"code":"210403","name":"东洲区"},{"code":"210404","name":"望花区"},{"code":"210411","name":"顺城区"},{"code":"210421","name":"抚顺县"},{"code":"210422","name":"新宾满族自治县"},{"code":"210423","name":"清原满族自治县"}]},{"code":"210500","name":"本溪市","list":[{"code":"210502","name":"平山区"},{"code":"210503","name":"溪湖区"},{"code":"210504","name":"明山区"},{"code":"210505","name":"南芬区"},{"code":"210521","name":"本溪满族自治县"},{"code":"210522","name":"桓仁满族自治县"}]},{"code":"210600","name":"丹东市","list":[{"code":"210602","name":"元宝区"},{"code":"210603","name":"振兴区"},{"code":"210604","name":"振安区"},{"code":"210624","name":"宽甸满族自治县"},{"code":"210681","name":"东港市"},{"code":"210682","name":"凤城市"}]},{"code":"210700","name":"锦州市","list":[{"code":"210702","name":"古塔区"},{"code":"210703","name":"凌河区"},{"code":"210711","name":"太和区"},{"code":"210726","name":"黑山县"},{"code":"210727","name":"义县"},{"code":"210781","name":"凌海市"},{"code":"210782","name":"北镇市"}]},{"code":"210800","name":"营口市","list":[{"code":"210802","name":"站前区"},{"code":"210803","name":"西市区"},{"code":"210804","name":"鲅鱼圈区"},{"code":"210811","name":"老边区"},{"code":"210881","name":"盖州市"},{"code":"210882","name":"大石桥市"}]},{"code":"210900","name":"阜新市","list":[{"code":"210902","name":"海州区"},{"code":"210903","name":"新邱区"},{"code":"210904","name":"太平区"},{"code":"210905","name":"清河门区"},{"code":"210911","name":"细河区"},{"code":"210921","name":"阜新蒙古族自治县"},{"code":"210922","name":"彰武县"}]},{"code":"211000","name":"辽阳市","list":[{"code":"211002","name":"白塔区"},{"code":"211003","name":"文圣区"},{"code":"211004","name":"宏伟区"},{"code":"211005","name":"弓长岭区"},{"code":"211011","name":"太子河区"},{"code":"211021","name":"辽阳县"},{"code":"211081","name":"灯塔市"}]},{"code":"211100","name":"盘锦市","list":[{"code":"211102","name":"双台子区"},{"code":"211103","name":"兴隆台区"},{"code":"211104","name":"大洼区"},{"code":"211122","name":"盘山县"}]},{"code":"211200","name":"铁岭市","list":[{"code":"211202","name":"银州区"},{"code":"211204","name":"清河区"},{"code":"211221","name":"铁岭县"},{"code":"211223","name":"西丰县"},{"code":"211224","name":"昌图县"},{"code":"211281","name":"调兵山市"},{"code":"211282","name":"开原市"}]},{"code":"211300","name":"朝阳市","list":[{"code":"211302","name":"双塔区"},{"code":"211303","name":"龙城区"},{"code":"211321","name":"朝阳县"},{"code":"211322","name":"建平县"},{"code":"211324","name":"喀喇沁左翼蒙古族自治县"},{"code":"211381","name":"北票市"},{"code":"211382","name":"凌源市"}]},{"code":"211400","name":"葫芦岛市","list":[{"code":"211402","name":"连山区"},{"code":"211403","name":"龙港区"},{"code":"211404","name":"南票区"},{"code":"211421","name":"绥中县"},{"code":"211422","name":"建昌县"},{"code":"211481","name":"兴城市"}]}]},{"code":"220000","name":"吉林省","list":[{"code":"220100","name":"长春市","list":[{"code":"220102","name":"南关区"},{"code":"220103","name":"宽城区"},{"code":"220104","name":"朝阳区"},{"code":"220105","name":"二道区"},{"code":"220106","name":"绿园区"},{"code":"220112","name":"双阳区"},{"code":"220113","name":"九台区"},{"code":"220122","name":"农安县"},{"code":"220182","name":"榆树市"},{"code":"220183","name":"德惠市"},{"code":"220184","name":"公主岭市"}]},{"code":"220200","name":"吉林市","list":[{"code":"220202","name":"昌邑区"},{"code":"220203","name":"龙潭区"},{"code":"220204","name":"船营区"},{"code":"220211","name":"丰满区"},{"code":"220221","name":"永吉县"},{"code":"220281","name":"蛟河市"},{"code":"220282","name":"桦甸市"},{"code":"220283","name":"舒兰市"},{"code":"220284","name":"磐石市"}]},{"code":"220300","name":"四平市","list":[{"code":"220302","name":"铁西区"},{"code":"220303","name":"铁东区"},{"code":"220322","name":"梨树县"},{"code":"220323","name":"伊通满族自治县"},{"code":"220382","name":"双辽市"}]},{"code":"220400","name":"辽源市","list":[{"code":"220402","name":"龙山区"},{"code":"220403","name":"西安区"},{"code":"220421","name":"东丰县"},{"code":"220422","name":"东辽县"}]},{"code":"220500","name":"通化市","list":[{"code":"220502","name":"东昌区"},{"code":"220503","name":"二道江区"},{"code":"220521","name":"通化县"},{"code":"220523","name":"辉南县"},{"code":"220524","name":"柳河县"},{"code":"220581","name":"梅河口市"},{"code":"220582","name":"集安市"}]},{"code":"220600","name":"白山市","list":[{"code":"220602","name":"浑江区"},{"code":"220605","name":"江源区"},{"code":"220621","name":"抚松县"},{"code":"220622","name":"靖宇县"},{"code":"220623","name":"长白朝鲜族自治县"},{"code":"220681","name":"临江市"}]},{"code":"220700","name":"松原市","list":[{"code":"220702","name":"宁江区"},{"code":"220721","name":"前郭尔罗斯蒙古族自治县"},{"code":"220722","name":"长岭县"},{"code":"220723","name":"乾安县"},{"code":"220781","name":"扶余市"}]},{"code":"220800","name":"白城市","list":[{"code":"220802","name":"洮北区"},{"code":"220821","name":"镇赉县"},{"code":"220822","name":"通榆县"},{"code":"220881","name":"洮南市"},{"code":"220882","name":"大安市"}]},{"code":"222400","name":"延边朝鲜族自治州","list":[{"code":"222401","name":"延吉市"},{"code":"222402","name":"图们市"},{"code":"222403","name":"敦化市"},{"code":"222404","name":"珲春市"},{"code":"222405","name":"龙井市"},{"code":"222406","name":"和龙市"},{"code":"222424","name":"汪清县"},{"code":"222426","name":"安图县"}]}]},{"code":"230000","name":"黑龙江省","list":[{"code":"230100","name":"哈尔滨市","list":[{"code":"230102","name":"道里区"},{"code":"230103","name":"南岗区"},{"code":"230104","name":"道外区"},{"code":"230108","name":"平房区"},{"code":"230109","name":"松北区"},{"code":"230110","name":"香坊区"},{"code":"230111","name":"呼兰区"},{"code":"230112","name":"阿城区"},{"code":"230113","name":"双城区"},{"code":"230123","name":"依兰县"},{"code":"230124","name":"方正县"},{"code":"230125","name":"宾县"},{"code":"230126","name":"巴彦县"},{"code":"230127","name":"木兰县"},{"code":"230128","name":"通河县"},{"code":"230129","name":"延寿县"},{"code":"230183","name":"尚志市"},{"code":"230184","name":"五常市"}]},{"code":"230200","name":"齐齐哈尔市","list":[{"code":"230202","name":"龙沙区"},{"code":"230203","name":"建华区"},{"code":"230204","name":"铁锋区"},{"code":"230205","name":"昂昂溪区"},{"code":"230206","name":"富拉尔基区"},{"code":"230207","name":"碾子山区"},{"code":"230208","name":"梅里斯达斡尔族区"},{"code":"230221","name":"龙江县"},{"code":"230223","name":"依安县"},{"code":"230224","name":"泰来县"},{"code":"230225","name":"甘南县"},{"code":"230227","name":"富裕县"},{"code":"230229","name":"克山县"},{"code":"230230","name":"克东县"},{"code":"230231","name":"拜泉县"},{"code":"230281","name":"讷河市"}]},{"code":"230300","name":"鸡西市","list":[{"code":"230302","name":"鸡冠区"},{"code":"230303","name":"恒山区"},{"code":"230304","name":"滴道区"},{"code":"230305","name":"梨树区"},{"code":"230306","name":"城子河区"},{"code":"230307","name":"麻山区"},{"code":"230321","name":"鸡东县"},{"code":"230381","name":"虎林市"},{"code":"230382","name":"密山市"}]},{"code":"230400","name":"鹤岗市","list":[{"code":"230402","name":"向阳区"},{"code":"230403","name":"工农区"},{"code":"230404","name":"南山区"},{"code":"230405","name":"兴安区"},{"code":"230406","name":"东山区"},{"code":"230407","name":"兴山区"},{"code":"230421","name":"萝北县"},{"code":"230422","name":"绥滨县"}]},{"code":"230500","name":"双鸭山市","list":[{"code":"230502","name":"尖山区"},{"code":"230503","name":"岭东区"},{"code":"230505","name":"四方台区"},{"code":"230506","name":"宝山区"},{"code":"230521","name":"集贤县"},{"code":"230522","name":"友谊县"},{"code":"230523","name":"宝清县"},{"code":"230524","name":"饶河县"}]},{"code":"230600","name":"大庆市","list":[{"code":"230602","name":"萨尔图区"},{"code":"230603","name":"龙凤区"},{"code":"230604","name":"让胡路区"},{"code":"230605","name":"红岗区"},{"code":"230606","name":"大同区"},{"code":"230621","name":"肇州县"},{"code":"230622","name":"肇源县"},{"code":"230623","name":"林甸县"},{"code":"230624","name":"杜尔伯特蒙古族自治县"}]},{"code":"230700","name":"伊春市","list":[{"code":"230717","name":"伊美区"},{"code":"230718","name":"乌翠区"},{"code":"230719","name":"友好区"},{"code":"230722","name":"嘉荫县"},{"code":"230723","name":"汤旺县"},{"code":"230724","name":"丰林县"},{"code":"230725","name":"大箐山县"},{"code":"230726","name":"南岔县"},{"code":"230751","name":"金林区"},{"code":"230781","name":"铁力市"}]},{"code":"230800","name":"佳木斯市","list":[{"code":"230803","name":"向阳区"},{"code":"230804","name":"前进区"},{"code":"230805","name":"东风区"},{"code":"230811","name":"郊区"},{"code":"230822","name":"桦南县"},{"code":"230826","name":"桦川县"},{"code":"230828","name":"汤原县"},{"code":"230881","name":"同江市"},{"code":"230882","name":"富锦市"},{"code":"230883","name":"抚远市"}]},{"code":"230900","name":"七台河市","list":[{"code":"230902","name":"新兴区"},{"code":"230903","name":"桃山区"},{"code":"230904","name":"茄子河区"},{"code":"230921","name":"勃利县"}]},{"code":"231000","name":"牡丹江市","list":[{"code":"231002","name":"东安区"},{"code":"231003","name":"阳明区"},{"code":"231004","name":"爱民区"},{"code":"231005","name":"西安区"},{"code":"231025","name":"林口县"},{"code":"231081","name":"绥芬河市"},{"code":"231083","name":"海林市"},{"code":"231084","name":"宁安市"},{"code":"231085","name":"穆棱市"},{"code":"231086","name":"东宁市"}]},{"code":"231100","name":"黑河市","list":[{"code":"231102","name":"爱辉区"},{"code":"231123","name":"逊克县"},{"code":"231124","name":"孙吴县"},{"code":"231181","name":"北安市"},{"code":"231182","name":"五大连池市"},{"code":"231183","name":"嫩江市"}]},{"code":"231200","name":"绥化市","list":[{"code":"231202","name":"北林区"},{"code":"231221","name":"望奎县"},{"code":"231222","name":"兰西县"},{"code":"231223","name":"青冈县"},{"code":"231224","name":"庆安县"},{"code":"231225","name":"明水县"},{"code":"231226","name":"绥棱县"},{"code":"231281","name":"安达市"},{"code":"231282","name":"肇东市"},{"code":"231283","name":"海伦市"}]},{"code":"232700","name":"大兴安岭地区","list":[{"code":"232701","name":"漠河市"},{"code":"232721","name":"呼玛县"},{"code":"232722","name":"塔河县"},{"code":"232761","name":"加格达奇区"},{"code":"232762","name":"松岭区"},{"code":"232763","name":"新林区"},{"code":"232764","name":"呼中区"}]}]},{"code":"310000","name":"上海市","list":[{"code":"310100","name":"上海市","list":[{"code":"310101","name":"黄浦区"},{"code":"310104","name":"徐汇区"},{"code":"310105","name":"长宁区"},{"code":"310106","name":"静安区"},{"code":"310107","name":"普陀区"},{"code":"310109","name":"虹口区"},{"code":"310110","name":"杨浦区"},{"code":"310112","name":"闵行区"},{"code":"310113","name":"宝山区"},{"code":"310114","name":"嘉定区"},{"code":"310115","name":"浦东新区"},{"code":"310116","name":"金山区"},{"code":"310117","name":"松江区"},{"code":"310118","name":"青浦区"},{"code":"310120","name":"奉贤区"},{"code":"310151","name":"崇明区"}]}]},{"code":"320000","name":"江苏省","list":[{"code":"320100","name":"南京市","list":[{"code":"320102","name":"玄武区"},{"code":"320104","name":"秦淮区"},{"code":"320105","name":"建邺区"},{"code":"320106","name":"鼓楼区"},{"code":"320111","name":"浦口区"},{"code":"320113","name":"栖霞区"},{"code":"320114","name":"雨花台区"},{"code":"320115","name":"江宁区"},{"code":"320116","name":"六合区"},{"code":"320117","name":"溧水区"},{"code":"320118","name":"高淳区"}]},{"code":"320200","name":"无锡市","list":[{"code":"320205","name":"锡山区"},{"code":"320206","name":"惠山区"},{"code":"320211","name":"滨湖区"},{"code":"320213","name":"梁溪区"},{"code":"320214","name":"新吴区"},{"code":"320281","name":"江阴市"},{"code":"320282","name":"宜兴市"}]},{"code":"320300","name":"徐州市","list":[{"code":"320302","name":"鼓楼区"},{"code":"320303","name":"云龙区"},{"code":"320305","name":"贾汪区"},{"code":"320311","name":"泉山区"},{"code":"320312","name":"铜山区"},{"code":"320321","name":"丰县"},{"code":"320322","name":"沛县"},{"code":"320324","name":"睢宁县"},{"code":"320381","name":"新沂市"},{"code":"320382","name":"邳州市"}]},{"code":"320400","name":"常州市","list":[{"code":"320402","name":"天宁区"},{"code":"320404","name":"钟楼区"},{"code":"320411","name":"新北区"},{"code":"320412","name":"武进区"},{"code":"320413","name":"金坛区"},{"code":"320481","name":"溧阳市"}]},{"code":"320500","name":"苏州市","list":[{"code":"320505","name":"虎丘区"},{"code":"320506","name":"吴中区"},{"code":"320507","name":"相城区"},{"code":"320508","name":"姑苏区"},{"code":"320509","name":"吴江区"},{"code":"320571","name":"苏州工业园区"},{"code":"320581","name":"常熟市"},{"code":"320582","name":"张家港市"},{"code":"320583","name":"昆山市"},{"code":"320585","name":"太仓市"}]},{"code":"320600","name":"南通市","list":[{"code":"320612","name":"通州区"},{"code":"320613","name":"崇川区"},{"code":"320614","name":"海门区"},{"code":"320623","name":"如东县"},{"code":"320681","name":"启东市"},{"code":"320682","name":"如皋市"},{"code":"320685","name":"海安市"}]},{"code":"320700","name":"连云港市","list":[{"code":"320703","name":"连云区"},{"code":"320706","name":"海州区"},{"code":"320707","name":"赣榆区"},{"code":"320722","name":"东海县"},{"code":"320723","name":"灌云县"},{"code":"320724","name":"灌南县"}]},{"code":"320800","name":"淮安市","list":[{"code":"320803","name":"淮安区"},{"code":"320804","name":"淮阴区"},{"code":"320812","name":"清江浦区"},{"code":"320813","name":"洪泽区"},{"code":"320826","name":"涟水县"},{"code":"320830","name":"盱眙县"},{"code":"320831","name":"金湖县"}]},{"code":"320900","name":"盐城市","list":[{"code":"320902","name":"亭湖区"},{"code":"320903","name":"盐都区"},{"code":"320904","name":"大丰区"},{"code":"320921","name":"响水县"},{"code":"320922","name":"滨海县"},{"code":"320923","name":"阜宁县"},{"code":"320924","name":"射阳县"},{"code":"320925","name":"建湖县"},{"code":"320981","name":"东台市"}]},{"code":"321000","name":"扬州市","list":[{"code":"321002","name":"广陵区"},{"code":"321003","name":"邗江区"},{"code":"321012","name":"江都区"},{"code":"321023","name":"宝应县"},{"code":"321081","name":"仪征市"},{"code":"321084","name":"高邮市"}]},{"code":"321100","name":"镇江市","list":[{"code":"321102","name":"京口区"},{"code":"321111","name":"润州区"},{"code":"321112","name":"丹徒区"},{"code":"321181","name":"丹阳市"},{"code":"321182","name":"扬中市"},{"code":"321183","name":"句容市"}]},{"code":"321200","name":"泰州市","list":[{"code":"321202","name":"海陵区"},{"code":"321203","name":"高港区"},{"code":"321204","name":"姜堰区"},{"code":"321281","name":"兴化市"},{"code":"321282","name":"靖江市"},{"code":"321283","name":"泰兴市"}]},{"code":"321300","name":"宿迁市","list":[{"code":"321302","name":"宿城区"},{"code":"321311","name":"宿豫区"},{"code":"321322","name":"沭阳县"},{"code":"321323","name":"泗阳县"},{"code":"321324","name":"泗洪县"}]}]},{"code":"330000","name":"浙江省","list":[{"code":"330100","name":"杭州市","list":[{"code":"330102","name":"上城区"},{"code":"330105","name":"拱墅区"},{"code":"330106","name":"西湖区"},{"code":"330108","name":"滨江区"},{"code":"330109","name":"萧山区"},{"code":"330110","name":"余杭区"},{"code":"330111","name":"富阳区"},{"code":"330112","name":"临安区"},{"code":"330113","name":"临平区"},{"code":"330114","name":"钱塘区"},{"code":"330122","name":"桐庐县"},{"code":"330127","name":"淳安县"},{"code":"330182","name":"建德市"}]},{"code":"330200","name":"宁波市","list":[{"code":"330203","name":"海曙区"},{"code":"330205","name":"江北区"},{"code":"330206","name":"北仑区"},{"code":"330211","name":"镇海区"},{"code":"330212","name":"鄞州区"},{"code":"330213","name":"奉化区"},{"code":"330225","name":"象山县"},{"code":"330226","name":"宁海县"},{"code":"330281","name":"余姚市"},{"code":"330282","name":"慈溪市"}]},{"code":"330300","name":"温州市","list":[{"code":"330302","name":"鹿城区"},{"code":"330303","name":"龙湾区"},{"code":"330304","name":"瓯海区"},{"code":"330305","name":"洞头区"},{"code":"330324","name":"永嘉县"},{"code":"330326","name":"平阳县"},{"code":"330327","name":"苍南县"},{"code":"330328","name":"文成县"},{"code":"330329","name":"泰顺县"},{"code":"330381","name":"瑞安市"},{"code":"330382","name":"乐清市"},{"code":"330383","name":"龙港市"}]},{"code":"330400","name":"嘉兴市","list":[{"code":"330402","name":"南湖区"},{"code":"330411","name":"秀洲区"},{"code":"330421","name":"嘉善县"},{"code":"330424","name":"海盐县"},{"code":"330481","name":"海宁市"},{"code":"330482","name":"平湖市"},{"code":"330483","name":"桐乡市"}]},{"code":"330500","name":"湖州市","list":[{"code":"330502","name":"吴兴区"},{"code":"330503","name":"南浔区"},{"code":"330521","name":"德清县"},{"code":"330522","name":"长兴县"},{"code":"330523","name":"安吉县"}]},{"code":"330600","name":"绍兴市","list":[{"code":"330602","name":"越城区"},{"code":"330603","name":"柯桥区"},{"code":"330604","name":"上虞区"},{"code":"330624","name":"新昌县"},{"code":"330681","name":"诸暨市"},{"code":"330683","name":"嵊州市"}]},{"code":"330700","name":"金华市","list":[{"code":"330702","name":"婺城区"},{"code":"330703","name":"金东区"},{"code":"330723","name":"武义县"},{"code":"330726","name":"浦江县"},{"code":"330727","name":"磐安县"},{"code":"330781","name":"兰溪市"},{"code":"330782","name":"义乌市"},{"code":"330783","name":"东阳市"},{"code":"330784","name":"永康市"}]},{"code":"330800","name":"衢州市","list":[{"code":"330802","name":"柯城区"},{"code":"330803","name":"衢江区"},{"code":"330822","name":"常山县"},{"code":"330824","name":"开化县"},{"code":"330825","name":"龙游县"},{"code":"330881","name":"江山市"}]},{"code":"330900","name":"舟山市","list":[{"code":"330902","name":"定海区"},{"code":"330903","name":"普陀区"},{"code":"330921","name":"岱山县"},{"code":"330922","name":"嵊泗县"}]},{"code":"331000","name":"台州市","list":[{"code":"331002","name":"椒江区"},{"code":"331003","name":"黄岩区"},{"code":"331004","name":"路桥区"},{"code":"331022","name":"三门县"},{"code":"331023","name":"天台县"},{"code":"331024","name":"仙居县"},{"code":"331081","name":"温岭市"},{"code":"331082","name":"临海市"},{"code":"331083","name":"玉环市"}]},{"code":"331100","name":"丽水市","list":[{"code":"331102","name":"莲都区"},{"code":"331121","name":"青田县"},{"code":"331122","name":"缙云县"},{"code":"331123","name":"遂昌县"},{"code":"331124","name":"松阳县"},{"code":"331125","name":"云和县"},{"code":"331126","name":"庆元县"},{"code":"331127","name":"景宁畲族自治县"},{"code":"331181","name":"龙泉市"}]}]},{"code":"340000","name":"安徽省","list":[{"code":"340100","name":"合肥市","list":[{"code":"340102","name":"瑶海区"},{"code":"340103","name":"庐阳区"},{"code":"340104","name":"蜀山区"},{"code":"340111","name":"包河区"},{"code":"340121","name":"长丰县"},{"code":"340122","name":"肥东县"},{"code":"340123","name":"肥西县"},{"code":"340124","name":"庐江县"},{"code":"340181","name":"巢湖市"}]},{"code":"340200","name":"芜湖市","list":[{"code":"340202","name":"镜湖区"},{"code":"340207","name":"鸠江区"},{"code":"340209","name":"弋江区"},{"code":"340210","name":"湾沚区"},{"code":"340212","name":"繁昌区"},{"code":"340223","name":"南陵县"},{"code":"340281","name":"无为市"}]},{"code":"340300","name":"蚌埠市","list":[{"code":"340302","name":"龙子湖区"},{"code":"340303","name":"蚌山区"},{"code":"340304","name":"禹会区"},{"code":"340311","name":"淮上区"},{"code":"340321","name":"怀远县"},{"code":"340322","name":"五河县"},{"code":"340323","name":"固镇县"}]},{"code":"340400","name":"淮南市","list":[{"code":"340402","name":"大通区"},{"code":"340403","name":"田家庵区"},{"code":"340404","name":"谢家集区"},{"code":"340405","name":"八公山区"},{"code":"340406","name":"潘集区"},{"code":"340421","name":"凤台县"},{"code":"340422","name":"寿县"}]},{"code":"340500","name":"马鞍山市","list":[{"code":"340503","name":"花山区"},{"code":"340504","name":"雨山区"},{"code":"340506","name":"博望区"},{"code":"340521","name":"当涂县"},{"code":"340522","name":"含山县"},{"code":"340523","name":"和县"}]},{"code":"340600","name":"淮北市","list":[{"code":"340602","name":"杜集区"},{"code":"340603","name":"相山区"},{"code":"340604","name":"烈山区"},{"code":"340621","name":"濉溪县"}]},{"code":"340700","name":"铜陵市","list":[{"code":"340705","name":"铜官区"},{"code":"340706","name":"义安区"},{"code":"340711","name":"郊区"},{"code":"340722","name":"枞阳县"}]},{"code":"340800","name":"安庆市","list":[{"code":"340802","name":"迎江区"},{"code":"340803","name":"大观区"},{"code":"340811","name":"宜秀区"},{"code":"340822","name":"怀宁县"},{"code":"340825","name":"太湖县"},{"code":"340826","name":"宿松县"},{"code":"340827","name":"望江县"},{"code":"340828","name":"岳西县"},{"code":"340881","name":"桐城市"},{"code":"340882","name":"潜山市"}]},{"code":"341000","name":"黄山市","list":[{"code":"341002","name":"屯溪区"},{"code":"341003","name":"黄山区"},{"code":"341004","name":"徽州区"},{"code":"341021","name":"歙县"},{"code":"341022","name":"休宁县"},{"code":"341023","name":"黟县"},{"code":"341024","name":"祁门县"}]},{"code":"341100","name":"滁州市","list":[{"code":"341102","name":"琅琊区"},{"code":"341103","name":"南谯区"},{"code":"341122","name":"来安县"},{"code":"341124","name":"全椒县"},{"code":"341125","name":"定远县"},{"code":"341126","name":"凤阳县"},{"code":"341181","name":"天长市"},{"code":"341182","name":"明光市"}]},{"code":"341200","name":"阜阳市","list":[{"code":"341202","name":"颍州区"},{"code":"341203","name":"颍东区"},{"code":"341204","name":"颍泉区"},{"code":"341221","name":"临泉县"},{"code":"341222","name":"太和县"},{"code":"341225","name":"阜南县"},{"code":"341226","name":"颍上县"},{"code":"341282","name":"界首市"}]},{"code":"341300","name":"宿州市","list":[{"code":"341302","name":"埇桥区"},{"code":"341321","name":"砀山县"},{"code":"341322","name":"萧县"},{"code":"341323","name":"灵璧县"},{"code":"341324","name":"泗县"}]},{"code":"341500","name":"六安市","list":[{"code":"341502","name":"金安区"},{"code":"341503","name":"裕安区"},{"code":"341504","name":"叶集区"},{"code":"341522","name":"霍邱县"},{"code":"341523","name":"舒城县"},{"code":"341524","name":"金寨县"},{"code":"341525","name":"霍山县"}]},{"code":"341600","name":"亳州市","list":[{"code":"341602","name":"谯城区"},{"code":"341621","name":"涡阳县"},{"code":"341622","name":"蒙城县"},{"code":"341623","name":"利辛县"}]},{"code":"341700","name":"池州市","list":[{"code":"341702","name":"贵池区"},{"code":"341721","name":"东至县"},{"code":"341722","name":"石台县"},{"code":"341723","name":"青阳县"}]},{"code":"341800","name":"宣城市","list":[{"code":"341802","name":"宣州区"},{"code":"341821","name":"郎溪县"},{"code":"341823","name":"泾县"},{"code":"341824","name":"绩溪县"},{"code":"341825","name":"旌德县"},{"code":"341881","name":"宁国市"},{"code":"341882","name":"广德市"}]}]},{"code":"350000","name":"福建省","list":[{"code":"350100","name":"福州市","list":[{"code":"350102","name":"鼓楼区"},{"code":"350103","name":"台江区"},{"code":"350104","name":"仓山区"},{"code":"350105","name":"马尾区"},{"code":"350111","name":"晋安区"},{"code":"350112","name":"长乐区"},{"code":"350121","name":"闽侯县"},{"code":"350122","name":"连江县"},{"code":"350123","name":"罗源县"},{"code":"350124","name":"闽清县"},{"code":"350125","name":"永泰县"},{"code":"350128","name":"平潭县"},{"code":"350181","name":"福清市"}]},{"code":"350200","name":"厦门市","list":[{"code":"350203","name":"思明区"},{"code":"350205","name":"海沧区"},{"code":"350206","name":"湖里区"},{"code":"350211","name":"集美区"},{"code":"350212","name":"同安区"},{"code":"350213","name":"翔安区"}]},{"code":"350300","name":"莆田市","list":[{"code":"350302","name":"城厢区"},{"code":"350303","name":"涵江区"},{"code":"350304","name":"荔城区"},{"code":"350305","name":"秀屿区"},{"code":"350322","name":"仙游县"}]},{"code":"350400","name":"三明市","list":[{"code":"350404","name":"三元区"},{"code":"350405","name":"沙县区"},{"code":"350421","name":"明溪县"},{"code":"350423","name":"清流县"},{"code":"350424","name":"宁化县"},{"code":"350425","name":"大田县"},{"code":"350426","name":"尤溪县"},{"code":"350428","name":"将乐县"},{"code":"350429","name":"泰宁县"},{"code":"350430","name":"建宁县"},{"code":"350481","name":"永安市"}]},{"code":"350500","name":"泉州市","list":[{"code":"350502","name":"鲤城区"},{"code":"350503","name":"丰泽区"},{"code":"350504","name":"洛江区"},{"code":"350505","name":"泉港区"},{"code":"350521","name":"惠安县"},{"code":"350524","name":"安溪县"},{"code":"350525","name":"永春县"},{"code":"350526","name":"德化县"},{"code":"350527","name":"金门县"},{"code":"350581","name":"石狮市"},{"code":"350582","name":"晋江市"},{"code":"350583","name":"南安市"}]},{"code":"350600","name":"漳州市","list":[{"code":"350602","name":"芗城区"},{"code":"350603","name":"龙文区"},{"code":"350604","name":"龙海区"},{"code":"350605","name":"长泰区"},{"code":"350622","name":"云霄县"},{"code":"350623","name":"漳浦县"},{"code":"350624","name":"诏安县"},{"code":"350626","name":"东山县"},{"code":"350627","name":"南靖县"},{"code":"350628","name":"平和县"},{"code":"350629","name":"华安县"}]},{"code":"350700","name":"南平市","list":[{"code":"350702","name":"延平区"},{"code":"350703","name":"建阳区"},{"code":"350721","name":"顺昌县"},{"code":"350722","name":"浦城县"},{"code":"350723","name":"光泽县"},{"code":"350724","name":"松溪县"},{"code":"350725","name":"政和县"},{"code":"350781","name":"邵武市"},{"code":"350782","name":"武夷山市"},{"code":"350783","name":"建瓯市"}]},{"code":"350800","name":"龙岩市","list":[{"code":"350802","name":"新罗区"},{"code":"350803","name":"永定区"},{"code":"350821","name":"长汀县"},{"code":"350823","name":"上杭县"},{"code":"350824","name":"武平县"},{"code":"350825","name":"连城县"},{"code":"350881","name":"漳平市"}]},{"code":"350900","name":"宁德市","list":[{"code":"350902","name":"蕉城区"},{"code":"350921","name":"霞浦县"},{"code":"350922","name":"古田县"},{"code":"350923","name":"屏南县"},{"code":"350924","name":"寿宁县"},{"code":"350925","name":"周宁县"},{"code":"350926","name":"柘荣县"},{"code":"350981","name":"福安市"},{"code":"350982","name":"福鼎市"}]}]},{"code":"360000","name":"江西省","list":[{"code":"360100","name":"南昌市","list":[{"code":"360102","name":"东湖区"},{"code":"360103","name":"西湖区"},{"code":"360104","name":"青云谱区"},{"code":"360111","name":"青山湖区"},{"code":"360112","name":"新建区"},{"code":"360113","name":"红谷滩区"},{"code":"360121","name":"南昌县"},{"code":"360123","name":"安义县"},{"code":"360124","name":"进贤县"}]},{"code":"360200","name":"景德镇市","list":[{"code":"360202","name":"昌江区"},{"code":"360203","name":"珠山区"},{"code":"360222","name":"浮梁县"},{"code":"360281","name":"乐平市"}]},{"code":"360300","name":"萍乡市","list":[{"code":"360302","name":"安源区"},{"code":"360313","name":"湘东区"},{"code":"360321","name":"莲花县"},{"code":"360322","name":"上栗县"},{"code":"360323","name":"芦溪县"}]},{"code":"360400","name":"九江市","list":[{"code":"360402","name":"濂溪区"},{"code":"360403","name":"浔阳区"},{"code":"360404","name":"柴桑区"},{"code":"360423","name":"武宁县"},{"code":"360424","name":"修水县"},{"code":"360425","name":"永修县"},{"code":"360426","name":"德安县"},{"code":"360428","name":"都昌县"},{"code":"360429","name":"湖口县"},{"code":"360430","name":"彭泽县"},{"code":"360481","name":"瑞昌市"},{"code":"360482","name":"共青城市"},{"code":"360483","name":"庐山市"}]},{"code":"360500","name":"新余市","list":[{"code":"360502","name":"渝水区"},{"code":"360521","name":"分宜县"}]},{"code":"360600","name":"鹰潭市","list":[{"code":"360602","name":"月湖区"},{"code":"360603","name":"余江区"},{"code":"360681","name":"贵溪市"}]},{"code":"360700","name":"赣州市","list":[{"code":"360702","name":"章贡区"},{"code":"360703","name":"南康区"},{"code":"360704","name":"赣县区"},{"code":"360722","name":"信丰县"},{"code":"360723","name":"大余县"},{"code":"360724","name":"上犹县"},{"code":"360725","name":"崇义县"},{"code":"360726","name":"安远县"},{"code":"360728","name":"定南县"},{"code":"360729","name":"全南县"},{"code":"360730","name":"宁都县"},{"code":"360731","name":"于都县"},{"code":"360732","name":"兴国县"},{"code":"360733","name":"会昌县"},{"code":"360734","name":"寻乌县"},{"code":"360735","name":"石城县"},{"code":"360781","name":"瑞金市"},{"code":"360783","name":"龙南市"}]},{"code":"360800","name":"吉安市","list":[{"code":"360802","name":"吉州区"},{"code":"360803","name":"青原区"},{"code":"360821","name":"吉安县"},{"code":"360822","name":"吉水县"},{"code":"360823","name":"峡江县"},{"code":"360824","name":"新干县"},{"code":"360825","name":"永丰县"},{"code":"360826","name":"泰和县"},{"code":"360827","name":"遂川县"},{"code":"360828","name":"万安县"},{"code":"360829","name":"安福县"},{"code":"360830","name":"永新县"},{"code":"360881","name":"井冈山市"}]},{"code":"360900","name":"宜春市","list":[{"code":"360902","name":"袁州区"},{"code":"360921","name":"奉新县"},{"code":"360922","name":"万载县"},{"code":"360923","name":"上高县"},{"code":"360924","name":"宜丰县"},{"code":"360925","name":"靖安县"},{"code":"360926","name":"铜鼓县"},{"code":"360981","name":"丰城市"},{"code":"360982","name":"樟树市"},{"code":"360983","name":"高安市"}]},{"code":"361000","name":"抚州市","list":[{"code":"361002","name":"临川区"},{"code":"361003","name":"东乡区"},{"code":"361021","name":"南城县"},{"code":"361022","name":"黎川县"},{"code":"361023","name":"南丰县"},{"code":"361024","name":"崇仁县"},{"code":"361025","name":"乐安县"},{"code":"361026","name":"宜黄县"},{"code":"361027","name":"金溪县"},{"code":"361028","name":"资溪县"},{"code":"361030","name":"广昌县"}]},{"code":"361100","name":"上饶市","list":[{"code":"361102","name":"信州区"},{"code":"361103","name":"广丰区"},{"code":"361104","name":"广信区"},{"code":"361123","name":"玉山县"},{"code":"361124","name":"铅山县"},{"code":"361125","name":"横峰县"},{"code":"361126","name":"弋阳县"},{"code":"361127","name":"余干县"},{"code":"361128","name":"鄱阳县"},{"code":"361129","name":"万年县"},{"code":"361130","name":"婺源县"},{"code":"361181","name":"德兴市"}]}]},{"code":"370000","name":"山东省","list":[{"code":"370100","name":"济南市","list":[{"code":"370102","name":"历下区"},{"code":"370103","name":"市中区"},{"code":"370104","name":"槐荫区"},{"code":"370105","name":"天桥区"},{"code":"370112","name":"历城区"},{"code":"370113","name":"长清区"},{"code":"370114","name":"章丘区"},{"code":"370115","name":"济阳区"},{"code":"370116","name":"莱芜区"},{"code":"370117","name":"钢城区"},{"code":"370124","name":"平阴县"},{"code":"370126","name":"商河县"}]},{"code":"370200","name":"青岛市","list":[{"code":"370202","name":"市南区"},{"code":"370203","name":"市北区"},{"code":"370211","name":"黄岛区"},{"code":"370212","name":"崂山区"},{"code":"370213","name":"李沧区"},{"code":"370214","name":"城阳区"},{"code":"370215","name":"即墨区"},{"code":"370281","name":"胶州市"},{"code":"370283","name":"平度市"},{"code":"370285","name":"莱西市"}]},{"code":"370300","name":"淄博市","list":[{"code":"370302","name":"淄川区"},{"code":"370303","name":"张店区"},{"code":"370304","name":"博山区"},{"code":"370305","name":"临淄区"},{"code":"370306","name":"周村区"},{"code":"370321","name":"桓台县"},{"code":"370322","name":"高青县"},{"code":"370323","name":"沂源县"}]},{"code":"370400","name":"枣庄市","list":[{"code":"370402","name":"市中区"},{"code":"370403","name":"薛城区"},{"code":"370404","name":"峄城区"},{"code":"370405","name":"台儿庄区"},{"code":"370406","name":"山亭区"},{"code":"370481","name":"滕州市"}]},{"code":"370500","name":"东营市","list":[{"code":"370502","name":"东营区"},{"code":"370503","name":"河口区"},{"code":"370505","name":"垦利区"},{"code":"370522","name":"利津县"},{"code":"370523","name":"广饶县"}]},{"code":"370600","name":"烟台市","list":[{"code":"370602","name":"芝罘区"},{"code":"370611","name":"福山区"},{"code":"370612","name":"牟平区"},{"code":"370613","name":"莱山区"},{"code":"370614","name":"蓬莱区"},{"code":"370681","name":"龙口市"},{"code":"370682","name":"莱阳市"},{"code":"370683","name":"莱州市"},{"code":"370685","name":"招远市"},{"code":"370686","name":"栖霞市"},{"code":"370687","name":"海阳市"}]},{"code":"370700","name":"潍坊市","list":[{"code":"370702","name":"潍城区"},{"code":"370703","name":"寒亭区"},{"code":"370704","name":"坊子区"},{"code":"370705","name":"奎文区"},{"code":"370724","name":"临朐县"},{"code":"370725","name":"昌乐县"},{"code":"370781","name":"青州市"},{"code":"370782","name":"诸城市"},{"code":"370783","name":"寿光市"},{"code":"370784","name":"安丘市"},{"code":"370785","name":"高密市"},{"code":"370786","name":"昌邑市"}]},{"code":"370800","name":"济宁市","list":[{"code":"370811","name":"任城区"},{"code":"370812","name":"兖州区"},{"code":"370826","name":"微山县"},{"code":"370827","name":"鱼台县"},{"code":"370828","name":"金乡县"},{"code":"370829","name":"嘉祥县"},{"code":"370830","name":"汶上县"},{"code":"370831","name":"泗水县"},{"code":"370832","name":"梁山县"},{"code":"370881","name":"曲阜市"},{"code":"370883","name":"邹城市"}]},{"code":"370900","name":"泰安市","list":[{"code":"370902","name":"泰山区"},{"code":"370911","name":"岱岳区"},{"code":"370921","name":"宁阳县"},{"code":"370923","name":"东平县"},{"code":"370982","name":"新泰市"},{"code":"370983","name":"肥城市"}]},{"code":"371000","name":"威海市","list":[{"code":"371002","name":"环翠区"},{"code":"371003","name":"文登区"},{"code":"371082","name":"荣成市"},{"code":"371083","name":"乳山市"}]},{"code":"371100","name":"日照市","list":[{"code":"371102","name":"东港区"},{"code":"371103","name":"岚山区"},{"code":"371121","name":"五莲县"},{"code":"371122","name":"莒县"}]},{"code":"371300","name":"临沂市","list":[{"code":"371302","name":"兰山区"},{"code":"371311","name":"罗庄区"},{"code":"371312","name":"河东区"},{"code":"371321","name":"沂南县"},{"code":"371322","name":"郯城县"},{"code":"371323","name":"沂水县"},{"code":"371324","name":"兰陵县"},{"code":"371325","name":"费县"},{"code":"371326","name":"平邑县"},{"code":"371327","name":"莒南县"},{"code":"371328","name":"蒙阴县"},{"code":"371329","name":"临沭县"}]},{"code":"371400","name":"德州市","list":[{"code":"371402","name":"德城区"},{"code":"371403","name":"陵城区"},{"code":"371422","name":"宁津县"},{"code":"371423","name":"庆云县"},{"code":"371424","name":"临邑县"},{"code":"371425","name":"齐河县"},{"code":"371426","name":"平原县"},{"code":"371427","name":"夏津县"},{"code":"371428","name":"武城县"},{"code":"371481","name":"乐陵市"},{"code":"371482","name":"禹城市"}]},{"code":"371500","name":"聊城市","list":[{"code":"371502","name":"东昌府区"},{"code":"371503","name":"茌平区"},{"code":"371521","name":"阳谷县"},{"code":"371522","name":"莘县"},{"code":"371524","name":"东阿县"},{"code":"371525","name":"冠县"},{"code":"371526","name":"高唐县"},{"code":"371581","name":"临清市"}]},{"code":"371600","name":"滨州市","list":[{"code":"371602","name":"滨城区"},{"code":"371603","name":"沾化区"},{"code":"371621","name":"惠民县"},{"code":"371622","name":"阳信县"},{"code":"371623","name":"无棣县"},{"code":"371625","name":"博兴县"},{"code":"371681","name":"邹平市"}]},{"code":"371700","name":"菏泽市","list":[{"code":"371702","name":"牡丹区"},{"code":"371703","name":"定陶区"},{"code":"371721","name":"曹县"},{"code":"371722","name":"单县"},{"code":"371723","name":"成武县"},{"code":"371724","name":"巨野县"},{"code":"371725","name":"郓城县"},{"code":"371726","name":"鄄城县"},{"code":"371728","name":"东明县"}]}]},{"code":"410000","name":"河南省","list":[{"code":"410100","name":"郑州市","list":[{"code":"410102","name":"中原区"},{"code":"410103","name":"二七区"},{"code":"410104","name":"管城回族区"},{"code":"410105","name":"金水区"},{"code":"410106","name":"上街区"},{"code":"410108","name":"惠济区"},{"code":"410122","name":"中牟县"},{"code":"410181","name":"巩义市"},{"code":"410182","name":"荥阳市"},{"code":"410183","name":"新密市"},{"code":"410184","name":"新郑市"},{"code":"410185","name":"登封市"}]},{"code":"410200","name":"开封市","list":[{"code":"410202","name":"龙亭区"},{"code":"410203","name":"顺河回族区"},{"code":"410204","name":"鼓楼区"},{"code":"410205","name":"禹王台区"},{"code":"410212","name":"祥符区"},{"code":"410221","name":"杞县"},{"code":"410222","name":"通许县"},{"code":"410223","name":"尉氏县"},{"code":"410225","name":"兰考县"}]},{"code":"410300","name":"洛阳市","list":[{"code":"410302","name":"老城区"},{"code":"410303","name":"西工区"},{"code":"410304","name":"瀍河回族区"},{"code":"410305","name":"涧西区"},{"code":"410307","name":"偃师区"},{"code":"410308","name":"孟津区"},{"code":"410311","name":"洛龙区"},{"code":"410323","name":"新安县"},{"code":"410324","name":"栾川县"},{"code":"410325","name":"嵩县"},{"code":"410326","name":"汝阳县"},{"code":"410327","name":"宜阳县"},{"code":"410328","name":"洛宁县"},{"code":"410329","name":"伊川县"}]},{"code":"410400","name":"平顶山市","list":[{"code":"410402","name":"新华区"},{"code":"410403","name":"卫东区"},{"code":"410404","name":"石龙区"},{"code":"410411","name":"湛河区"},{"code":"410421","name":"宝丰县"},{"code":"410422","name":"叶县"},{"code":"410423","name":"鲁山县"},{"code":"410425","name":"郏县"},{"code":"410481","name":"舞钢市"},{"code":"410482","name":"汝州市"}]},{"code":"410500","name":"安阳市","list":[{"code":"410502","name":"文峰区"},{"code":"410503","name":"北关区"},{"code":"410505","name":"殷都区"},{"code":"410506","name":"龙安区"},{"code":"410522","name":"安阳县"},{"code":"410523","name":"汤阴县"},{"code":"410526","name":"滑县"},{"code":"410527","name":"内黄县"},{"code":"410581","name":"林州市"}]},{"code":"410600","name":"鹤壁市","list":[{"code":"410602","name":"鹤山区"},{"code":"410603","name":"山城区"},{"code":"410611","name":"淇滨区"},{"code":"410621","name":"浚县"},{"code":"410622","name":"淇县"}]},{"code":"410700","name":"新乡市","list":[{"code":"410702","name":"红旗区"},{"code":"410703","name":"卫滨区"},{"code":"410704","name":"凤泉区"},{"code":"410711","name":"牧野区"},{"code":"410721","name":"新乡县"},{"code":"410724","name":"获嘉县"},{"code":"410725","name":"原阳县"},{"code":"410726","name":"延津县"},{"code":"410727","name":"封丘县"},{"code":"410781","name":"卫辉市"},{"code":"410782","name":"辉县市"},{"code":"410783","name":"长垣市"}]},{"code":"410800","name":"焦作市","list":[{"code":"410802","name":"解放区"},{"code":"410803","name":"中站区"},{"code":"410804","name":"马村区"},{"code":"410811","name":"山阳区"},{"code":"410821","name":"修武县"},{"code":"410822","name":"博爱县"},{"code":"410823","name":"武陟县"},{"code":"410825","name":"温县"},{"code":"410882","name":"沁阳市"},{"code":"410883","name":"孟州市"}]},{"code":"410900","name":"濮阳市","list":[{"code":"410902","name":"华龙区"},{"code":"410922","name":"清丰县"},{"code":"410923","name":"南乐县"},{"code":"410926","name":"范县"},{"code":"410927","name":"台前县"},{"code":"410928","name":"濮阳县"}]},{"code":"411000","name":"许昌市","list":[{"code":"411002","name":"魏都区"},{"code":"411003","name":"建安区"},{"code":"411024","name":"鄢陵县"},{"code":"411025","name":"襄城县"},{"code":"411081","name":"禹州市"},{"code":"411082","name":"长葛市"}]},{"code":"411100","name":"漯河市","list":[{"code":"411102","name":"源汇区"},{"code":"411103","name":"郾城区"},{"code":"411104","name":"召陵区"},{"code":"411121","name":"舞阳县"},{"code":"411122","name":"临颍县"}]},{"code":"411200","name":"三门峡市","list":[{"code":"411202","name":"湖滨区"},{"code":"411203","name":"陕州区"},{"code":"411221","name":"渑池县"},{"code":"411224","name":"卢氏县"},{"code":"411281","name":"义马市"},{"code":"411282","name":"灵宝市"}]},{"code":"411300","name":"南阳市","list":[{"code":"411302","name":"宛城区"},{"code":"411303","name":"卧龙区"},{"code":"411321","name":"南召县"},{"code":"411322","name":"方城县"},{"code":"411323","name":"西峡县"},{"code":"411324","name":"镇平县"},{"code":"411325","name":"内乡县"},{"code":"411326","name":"淅川县"},{"code":"411327","name":"社旗县"},{"code":"411328","name":"唐河县"},{"code":"411329","name":"新野县"},{"code":"411330","name":"桐柏县"},{"code":"411381","name":"邓州市"}]},{"code":"411400","name":"商丘市","list":[{"code":"411402","name":"梁园区"},{"code":"411403","name":"睢阳区"},{"code":"411421","name":"民权县"},{"code":"411422","name":"睢县"},{"code":"411423","name":"宁陵县"},{"code":"411424","name":"柘城县"},{"code":"411425","name":"虞城县"},{"code":"411426","name":"夏邑县"},{"code":"411481","name":"永城市"}]},{"code":"411500","name":"信阳市","list":[{"code":"411502","name":"浉河区"},{"code":"411503","name":"平桥区"},{"code":"411521","name":"罗山县"},{"code":"411522","name":"光山县"},{"code":"411523","name":"新县"},{"code":"411524","name":"商城县"},{"code":"411525","name":"固始县"},{"code":"411526","name":"潢川县"},{"code":"411527","name":"淮滨县"},{"code":"411528","name":"息县"}]},{"code":"411600","name":"周口市","list":[{"code":"411602","name":"川汇区"},{"code":"411603","name":"淮阳区"},{"code":"411621","name":"扶沟县"},{"code":"411622","name":"西华县"},{"code":"411623","name":"商水县"},{"code":"411624","name":"沈丘县"},{"code":"411625","name":"郸城县"},{"code":"411627","name":"太康县"},{"code":"411628","name":"鹿邑县"},{"code":"411681","name":"项城市"}]},{"code":"411700","name":"驻马店市","list":[{"code":"411702","name":"驿城区"},{"code":"411721","name":"西平县"},{"code":"411722","name":"上蔡县"},{"code":"411723","name":"平舆县"},{"code":"411724","name":"正阳县"},{"code":"411725","name":"确山县"},{"code":"411726","name":"泌阳县"},{"code":"411727","name":"汝南县"},{"code":"411728","name":"遂平县"},{"code":"411729","name":"新蔡县"}]},{"code":"419001","name":"济源市","list":[{"code":"419001001","name":"沁园街道"},{"code":"419001002","name":"济水街道"},{"code":"419001003","name":"北海街道"},{"code":"419001004","name":"天坛街道"},{"code":"419001005","name":"玉泉街道"},{"code":"419001100","name":"克井镇"},{"code":"419001101","name":"五龙口镇"},{"code":"419001102","name":"轵城镇"},{"code":"419001103","name":"承留镇"},{"code":"419001104","name":"邵原镇"},{"code":"419001105","name":"坡头镇"},{"code":"419001106","name":"梨林镇"},{"code":"419001107","name":"大峪镇"},{"code":"419001108","name":"思礼镇"},{"code":"419001109","name":"王屋镇"},{"code":"419001110","name":"下冶镇"}]}]},{"code":"420000","name":"湖北省","list":[{"code":"420100","name":"武汉市","list":[{"code":"420102","name":"江岸区"},{"code":"420103","name":"江汉区"},{"code":"420104","name":"硚口区"},{"code":"420105","name":"汉阳区"},{"code":"420106","name":"武昌区"},{"code":"420107","name":"青山区"},{"code":"420111","name":"洪山区"},{"code":"420112","name":"东西湖区"},{"code":"420113","name":"汉南区"},{"code":"420114","name":"蔡甸区"},{"code":"420115","name":"江夏区"},{"code":"420116","name":"黄陂区"},{"code":"420117","name":"新洲区"}]},{"code":"420200","name":"黄石市","list":[{"code":"420202","name":"黄石港区"},{"code":"420203","name":"西塞山区"},{"code":"420204","name":"下陆区"},{"code":"420205","name":"铁山区"},{"code":"420222","name":"阳新县"},{"code":"420281","name":"大冶市"}]},{"code":"420300","name":"十堰市","list":[{"code":"420302","name":"茅箭区"},{"code":"420303","name":"张湾区"},{"code":"420304","name":"郧阳区"},{"code":"420322","name":"郧西县"},{"code":"420323","name":"竹山县"},{"code":"420324","name":"竹溪县"},{"code":"420325","name":"房县"},{"code":"420381","name":"丹江口市"}]},{"code":"420500","name":"宜昌市","list":[{"code":"420502","name":"西陵区"},{"code":"420503","name":"伍家岗区"},{"code":"420504","name":"点军区"},{"code":"420505","name":"猇亭区"},{"code":"420506","name":"夷陵区"},{"code":"420525","name":"远安县"},{"code":"420526","name":"兴山县"},{"code":"420527","name":"秭归县"},{"code":"420528","name":"长阳土家族自治县"},{"code":"420529","name":"五峰土家族自治县"},{"code":"420581","name":"宜都市"},{"code":"420582","name":"当阳市"},{"code":"420583","name":"枝江市"}]},{"code":"420600","name":"襄阳市","list":[{"code":"420602","name":"襄城区"},{"code":"420606","name":"樊城区"},{"code":"420607","name":"襄州区"},{"code":"420624","name":"南漳县"},{"code":"420625","name":"谷城县"},{"code":"420626","name":"保康县"},{"code":"420682","name":"老河口市"},{"code":"420683","name":"枣阳市"},{"code":"420684","name":"宜城市"}]},{"code":"420700","name":"鄂州市","list":[{"code":"420702","name":"梁子湖区"},{"code":"420703","name":"华容区"},{"code":"420704","name":"鄂城区"}]},{"code":"420800","name":"荆门市","list":[{"code":"420802","name":"东宝区"},{"code":"420804","name":"掇刀区"},{"code":"420822","name":"沙洋县"},{"code":"420881","name":"钟祥市"},{"code":"420882","name":"京山市"}]},{"code":"420900","name":"孝感市","list":[{"code":"420902","name":"孝南区"},{"code":"420921","name":"孝昌县"},{"code":"420922","name":"大悟县"},{"code":"420923","name":"云梦县"},{"code":"420981","name":"应城市"},{"code":"420982","name":"安陆市"},{"code":"420984","name":"汉川市"}]},{"code":"421000","name":"荆州市","list":[{"code":"421002","name":"沙市区"},{"code":"421003","name":"荆州区"},{"code":"421022","name":"公安县"},{"code":"421024","name":"江陵县"},{"code":"421081","name":"石首市"},{"code":"421083","name":"洪湖市"},{"code":"421087","name":"松滋市"},{"code":"421088","name":"监利市"}]},{"code":"421100","name":"黄冈市","list":[{"code":"421102","name":"黄州区"},{"code":"421121","name":"团风县"},{"code":"421122","name":"红安县"},{"code":"421123","name":"罗田县"},{"code":"421124","name":"英山县"},{"code":"421125","name":"浠水县"},{"code":"421126","name":"蕲春县"},{"code":"421127","name":"黄梅县"},{"code":"421181","name":"麻城市"},{"code":"421182","name":"武穴市"}]},{"code":"421200","name":"咸宁市","list":[{"code":"421202","name":"咸安区"},{"code":"421221","name":"嘉鱼县"},{"code":"421222","name":"通城县"},{"code":"421223","name":"崇阳县"},{"code":"421224","name":"通山县"},{"code":"421281","name":"赤壁市"}]},{"code":"421300","name":"随州市","list":[{"code":"421303","name":"曾都区"},{"code":"421321","name":"随县"},{"code":"421381","name":"广水市"}]},{"code":"422800","name":"恩施土家族苗族自治州","list":[{"code":"422801","name":"恩施市"},{"code":"422802","name":"利川市"},{"code":"422822","name":"建始县"},{"code":"422823","name":"巴东县"},{"code":"422825","name":"宣恩县"},{"code":"422826","name":"咸丰县"},{"code":"422827","name":"来凤县"},{"code":"422828","name":"鹤峰县"}]},{"code":"429004","name":"仙桃市","list":[{"code":"429004001","name":"沙嘴街道"},{"code":"429004002","name":"干河街道"},{"code":"429004003","name":"龙华山街道"},{"code":"429004100","name":"郑场镇"},{"code":"429004101","name":"毛嘴镇"},{"code":"429004102","name":"豆河镇"},{"code":"429004103","name":"三伏潭镇"},{"code":"429004104","name":"胡场镇"},{"code":"429004105","name":"长埫口镇"},{"code":"429004106","name":"西流河镇"},{"code":"429004107","name":"沙湖镇"},{"code":"429004108","name":"杨林尾镇"},{"code":"429004109","name":"彭场镇"},{"code":"429004110","name":"张沟镇"},{"code":"429004111","name":"郭河镇"},{"code":"429004112","name":"沔城回族镇"},{"code":"429004113","name":"通海口镇"},{"code":"429004115","name":"陈场镇"},{"code":"429004400","name":"仙桃工业园"}]},{"code":"429005","name":"潜江市","list":[{"code":"429005001","name":"园林街道"},{"code":"429005003","name":"周矶街道"},{"code":"429005004","name":"广华寺街道"},{"code":"429005005","name":"泰丰街道"},{"code":"429005007","name":"泽口街道"},{"code":"429005100","name":"竹根滩镇"},{"code":"429005101","name":"渔洋镇"},{"code":"429005102","name":"王场镇"},{"code":"429005103","name":"高石碑镇"},{"code":"429005104","name":"熊口镇"},{"code":"429005105","name":"老新镇"},{"code":"429005106","name":"浩口镇"},{"code":"429005107","name":"积玉口镇"},{"code":"429005108","name":"张金镇"},{"code":"429005109","name":"龙湾镇"},{"code":"429005451","name":"后湖管理区"},{"code":"429005452","name":"熊口管理区"},{"code":"429005453","name":"总口管理区"},{"code":"429005455","name":"运粮湖管理区"}]},{"code":"429006","name":"天门市","list":[{"code":"429006001","name":"竟陵街道"},{"code":"429006002","name":"候口街道"},{"code":"429006003","name":"杨林街道"},{"code":"429006100","name":"多宝镇"},{"code":"429006101","name":"拖市镇"},{"code":"429006102","name":"张港镇"},{"code":"429006103","name":"蒋场镇"},{"code":"429006104","name":"汪场镇"},{"code":"429006105","name":"渔薪镇"},{"code":"429006106","name":"黄潭镇"},{"code":"429006107","name":"岳口镇"},{"code":"429006108","name":"横林镇"},{"code":"429006109","name":"彭市镇"},{"code":"429006110","name":"麻洋镇"},{"code":"429006111","name":"多祥镇"},{"code":"429006112","name":"干驿镇"},{"code":"429006113","name":"马湾镇"},{"code":"429006114","name":"卢市镇"},{"code":"429006115","name":"小板镇"},{"code":"429006116","name":"九真镇"},{"code":"429006118","name":"皂市镇"},{"code":"429006119","name":"胡市镇"},{"code":"429006120","name":"石家河镇"},{"code":"429006121","name":"佛子山镇"},{"code":"429006201","name":"净潭乡"},{"code":"429006452","name":"沉湖管委会"}]},{"code":"429021","name":"神农架林区","list":[{"code":"429021100","name":"松柏镇"},{"code":"429021101","name":"阳日镇"},{"code":"429021102","name":"木鱼镇"},{"code":"429021103","name":"红坪镇"},{"code":"429021104","name":"新华镇"},{"code":"429021105","name":"九湖镇"},{"code":"429021201","name":"宋洛乡"},{"code":"429021203","name":"下谷坪土家族乡"}]}]},{"code":"430000","name":"湖南省","list":[{"code":"430100","name":"长沙市","list":[{"code":"430102","name":"芙蓉区"},{"code":"430103","name":"天心区"},{"code":"430104","name":"岳麓区"},{"code":"430105","name":"开福区"},{"code":"430111","name":"雨花区"},{"code":"430112","name":"望城区"},{"code":"430121","name":"长沙县"},{"code":"430181","name":"浏阳市"},{"code":"430182","name":"宁乡市"}]},{"code":"430200","name":"株洲市","list":[{"code":"430202","name":"荷塘区"},{"code":"430203","name":"芦淞区"},{"code":"430204","name":"石峰区"},{"code":"430211","name":"天元区"},{"code":"430212","name":"渌口区"},{"code":"430223","name":"攸县"},{"code":"430224","name":"茶陵县"},{"code":"430225","name":"炎陵县"},{"code":"430281","name":"醴陵市"}]},{"code":"430300","name":"湘潭市","list":[{"code":"430302","name":"雨湖区"},{"code":"430304","name":"岳塘区"},{"code":"430321","name":"湘潭县"},{"code":"430381","name":"湘乡市"},{"code":"430382","name":"韶山市"}]},{"code":"430400","name":"衡阳市","list":[{"code":"430405","name":"珠晖区"},{"code":"430406","name":"雁峰区"},{"code":"430407","name":"石鼓区"},{"code":"430408","name":"蒸湘区"},{"code":"430412","name":"南岳区"},{"code":"430421","name":"衡阳县"},{"code":"430422","name":"衡南县"},{"code":"430423","name":"衡山县"},{"code":"430424","name":"衡东县"},{"code":"430426","name":"祁东县"},{"code":"430481","name":"耒阳市"},{"code":"430482","name":"常宁市"}]},{"code":"430500","name":"邵阳市","list":[{"code":"430502","name":"双清区"},{"code":"430503","name":"大祥区"},{"code":"430511","name":"北塔区"},{"code":"430522","name":"新邵县"},{"code":"430523","name":"邵阳县"},{"code":"430524","name":"隆回县"},{"code":"430525","name":"洞口县"},{"code":"430527","name":"绥宁县"},{"code":"430528","name":"新宁县"},{"code":"430529","name":"城步苗族自治县"},{"code":"430581","name":"武冈市"},{"code":"430582","name":"邵东市"}]},{"code":"430600","name":"岳阳市","list":[{"code":"430602","name":"岳阳楼区"},{"code":"430603","name":"云溪区"},{"code":"430611","name":"君山区"},{"code":"430621","name":"岳阳县"},{"code":"430623","name":"华容县"},{"code":"430624","name":"湘阴县"},{"code":"430626","name":"平江县"},{"code":"430681","name":"汨罗市"},{"code":"430682","name":"临湘市"}]},{"code":"430700","name":"常德市","list":[{"code":"430702","name":"武陵区"},{"code":"430703","name":"鼎城区"},{"code":"430721","name":"安乡县"},{"code":"430722","name":"汉寿县"},{"code":"430723","name":"澧县"},{"code":"430724","name":"临澧县"},{"code":"430725","name":"桃源县"},{"code":"430726","name":"石门县"},{"code":"430781","name":"津市市"}]},{"code":"430800","name":"张家界市","list":[{"code":"430802","name":"永定区"},{"code":"430811","name":"武陵源区"},{"code":"430821","name":"慈利县"},{"code":"430822","name":"桑植县"}]},{"code":"430900","name":"益阳市","list":[{"code":"430902","name":"资阳区"},{"code":"430903","name":"赫山区"},{"code":"430921","name":"南县"},{"code":"430922","name":"桃江县"},{"code":"430923","name":"安化县"},{"code":"430981","name":"沅江市"}]},{"code":"431000","name":"郴州市","list":[{"code":"431002","name":"北湖区"},{"code":"431003","name":"苏仙区"},{"code":"431021","name":"桂阳县"},{"code":"431022","name":"宜章县"},{"code":"431023","name":"永兴县"},{"code":"431024","name":"嘉禾县"},{"code":"431025","name":"临武县"},{"code":"431026","name":"汝城县"},{"code":"431027","name":"桂东县"},{"code":"431028","name":"安仁县"},{"code":"431081","name":"资兴市"}]},{"code":"431100","name":"永州市","list":[{"code":"431102","name":"零陵区"},{"code":"431103","name":"冷水滩区"},{"code":"431122","name":"东安县"},{"code":"431123","name":"双牌县"},{"code":"431124","name":"道县"},{"code":"431125","name":"江永县"},{"code":"431126","name":"宁远县"},{"code":"431127","name":"蓝山县"},{"code":"431128","name":"新田县"},{"code":"431129","name":"江华瑶族自治县"},{"code":"431181","name":"祁阳市"}]},{"code":"431200","name":"怀化市","list":[{"code":"431202","name":"鹤城区"},{"code":"431221","name":"中方县"},{"code":"431222","name":"沅陵县"},{"code":"431223","name":"辰溪县"},{"code":"431224","name":"溆浦县"},{"code":"431225","name":"会同县"},{"code":"431226","name":"麻阳苗族自治县"},{"code":"431227","name":"新晃侗族自治县"},{"code":"431228","name":"芷江侗族自治县"},{"code":"431229","name":"靖州苗族侗族自治县"},{"code":"431230","name":"通道侗族自治县"},{"code":"431281","name":"洪江市"}]},{"code":"431300","name":"娄底市","list":[{"code":"431302","name":"娄星区"},{"code":"431321","name":"双峰县"},{"code":"431322","name":"新化县"},{"code":"431381","name":"冷水江市"},{"code":"431382","name":"涟源市"}]},{"code":"433100","name":"湘西土家族苗族自治州","list":[{"code":"433101","name":"吉首市"},{"code":"433122","name":"泸溪县"},{"code":"433123","name":"凤凰县"},{"code":"433124","name":"花垣县"},{"code":"433125","name":"保靖县"},{"code":"433126","name":"古丈县"},{"code":"433127","name":"永顺县"},{"code":"433130","name":"龙山县"}]}]},{"code":"440000","name":"广东省","list":[{"code":"440100","name":"广州市","list":[{"code":"440103","name":"荔湾区"},{"code":"440104","name":"越秀区"},{"code":"440105","name":"海珠区"},{"code":"440106","name":"天河区"},{"code":"440111","name":"白云区"},{"code":"440112","name":"黄埔区"},{"code":"440113","name":"番禺区"},{"code":"440114","name":"花都区"},{"code":"440115","name":"南沙区"},{"code":"440117","name":"从化区"},{"code":"440118","name":"增城区"}]},{"code":"440200","name":"韶关市","list":[{"code":"440203","name":"武江区"},{"code":"440204","name":"浈江区"},{"code":"440205","name":"曲江区"},{"code":"440222","name":"始兴县"},{"code":"440224","name":"仁化县"},{"code":"440229","name":"翁源县"},{"code":"440232","name":"乳源瑶族自治县"},{"code":"440233","name":"新丰县"},{"code":"440281","name":"乐昌市"},{"code":"440282","name":"南雄市"}]},{"code":"440300","name":"深圳市","list":[{"code":"440303","name":"罗湖区"},{"code":"440304","name":"福田区"},{"code":"440305","name":"南山区"},{"code":"440306","name":"宝安区"},{"code":"440307","name":"龙岗区"},{"code":"440308","name":"盐田区"},{"code":"440309","name":"龙华区"},{"code":"440310","name":"坪山区"},{"code":"440311","name":"光明区"}]},{"code":"440400","name":"珠海市","list":[{"code":"440402","name":"香洲区"},{"code":"440403","name":"斗门区"},{"code":"440404","name":"金湾区"}]},{"code":"440500","name":"汕头市","list":[{"code":"440507","name":"龙湖区"},{"code":"440511","name":"金平区"},{"code":"440512","name":"濠江区"},{"code":"440513","name":"潮阳区"},{"code":"440514","name":"潮南区"},{"code":"440515","name":"澄海区"},{"code":"440523","name":"南澳县"}]},{"code":"440600","name":"佛山市","list":[{"code":"440604","name":"禅城区"},{"code":"440605","name":"南海区"},{"code":"440606","name":"顺德区"},{"code":"440607","name":"三水区"},{"code":"440608","name":"高明区"}]},{"code":"440700","name":"江门市","list":[{"code":"440703","name":"蓬江区"},{"code":"440704","name":"江海区"},{"code":"440705","name":"新会区"},{"code":"440781","name":"台山市"},{"code":"440783","name":"开平市"},{"code":"440784","name":"鹤山市"},{"code":"440785","name":"恩平市"}]},{"code":"440800","name":"湛江市","list":[{"code":"440802","name":"赤坎区"},{"code":"440803","name":"霞山区"},{"code":"440804","name":"坡头区"},{"code":"440811","name":"麻章区"},{"code":"440823","name":"遂溪县"},{"code":"440825","name":"徐闻县"},{"code":"440881","name":"廉江市"},{"code":"440882","name":"雷州市"},{"code":"440883","name":"吴川市"}]},{"code":"440900","name":"茂名市","list":[{"code":"440902","name":"茂南区"},{"code":"440904","name":"电白区"},{"code":"440981","name":"高州市"},{"code":"440982","name":"化州市"},{"code":"440983","name":"信宜市"}]},{"code":"441200","name":"肇庆市","list":[{"code":"441202","name":"端州区"},{"code":"441203","name":"鼎湖区"},{"code":"441204","name":"高要区"},{"code":"441223","name":"广宁县"},{"code":"441224","name":"怀集县"},{"code":"441225","name":"封开县"},{"code":"441226","name":"德庆县"},{"code":"441284","name":"四会市"}]},{"code":"441300","name":"惠州市","list":[{"code":"441302","name":"惠城区"},{"code":"441303","name":"惠阳区"},{"code":"441322","name":"博罗县"},{"code":"441323","name":"惠东县"},{"code":"441324","name":"龙门县"}]},{"code":"441400","name":"梅州市","list":[{"code":"441402","name":"梅江区"},{"code":"441403","name":"梅县区"},{"code":"441422","name":"大埔县"},{"code":"441423","name":"丰顺县"},{"code":"441424","name":"五华县"},{"code":"441426","name":"平远县"},{"code":"441427","name":"蕉岭县"},{"code":"441481","name":"兴宁市"}]},{"code":"441500","name":"汕尾市","list":[{"code":"441502","name":"城区"},{"code":"441521","name":"海丰县"},{"code":"441523","name":"陆河县"},{"code":"441581","name":"陆丰市"}]},{"code":"441600","name":"河源市","list":[{"code":"441602","name":"源城区"},{"code":"441621","name":"紫金县"},{"code":"441622","name":"龙川县"},{"code":"441623","name":"连平县"},{"code":"441624","name":"和平县"},{"code":"441625","name":"东源县"}]},{"code":"441700","name":"阳江市","list":[{"code":"441702","name":"江城区"},{"code":"441704","name":"阳东区"},{"code":"441721","name":"阳西县"},{"code":"441781","name":"阳春市"}]},{"code":"441800","name":"清远市","list":[{"code":"441802","name":"清城区"},{"code":"441803","name":"清新区"},{"code":"441821","name":"佛冈县"},{"code":"441823","name":"阳山县"},{"code":"441825","name":"连山壮族瑶族自治县"},{"code":"441826","name":"连南瑶族自治县"},{"code":"441881","name":"英德市"},{"code":"441882","name":"连州市"}]},{"code":"441900","name":"东莞市","list":[{"code":"441900003","name":"东城街道"},{"code":"441900004","name":"南城街道"},{"code":"441900005","name":"万江街道"},{"code":"441900006","name":"莞城街道"},{"code":"441900101","name":"石碣镇"},{"code":"441900102","name":"石龙镇"},{"code":"441900103","name":"茶山镇"},{"code":"441900104","name":"石排镇"},{"code":"441900105","name":"企石镇"},{"code":"441900106","name":"横沥镇"},{"code":"441900107","name":"桥头镇"},{"code":"441900108","name":"谢岗镇"},{"code":"441900109","name":"东坑镇"},{"code":"441900110","name":"常平镇"},{"code":"441900111","name":"寮步镇"},{"code":"441900112","name":"樟木头镇"},{"code":"441900113","name":"大朗镇"},{"code":"441900114","name":"黄江镇"},{"code":"441900115","name":"清溪镇"},{"code":"441900116","name":"塘厦镇"},{"code":"441900117","name":"凤岗镇"},{"code":"441900118","name":"大岭山镇"},{"code":"441900119","name":"长安镇"},{"code":"441900121","name":"虎门镇"},{"code":"441900122","name":"厚街镇"},{"code":"441900123","name":"沙田镇"},{"code":"441900124","name":"道滘镇"},{"code":"441900125","name":"洪梅镇"},{"code":"441900126","name":"麻涌镇"},{"code":"441900127","name":"望牛墩镇"},{"code":"441900128","name":"中堂镇"},{"code":"441900129","name":"高埗镇"}]},{"code":"442000","name":"中山市","list":[{"code":"442000001","name":"石岐街道"},{"code":"442000002","name":"东区街道"},{"code":"442000003","name":"中山港街道"},{"code":"442000004","name":"西区街道"},{"code":"442000005","name":"南区街道"},{"code":"442000006","name":"五桂山街道"},{"code":"442000007","name":"民众街道"},{"code":"442000008","name":"南朗街道"},{"code":"442000101","name":"黄圃镇"},{"code":"442000103","name":"东凤镇"},{"code":"442000105","name":"古镇镇"},{"code":"442000106","name":"沙溪镇"},{"code":"442000107","name":"坦洲镇"},{"code":"442000108","name":"港口镇"},{"code":"442000109","name":"三角镇"},{"code":"442000110","name":"横栏镇"},{"code":"442000111","name":"南头镇"},{"code":"442000112","name":"阜沙镇"},{"code":"442000114","name":"三乡镇"},{"code":"442000115","name":"板芙镇"},{"code":"442000116","name":"大涌镇"},{"code":"442000117","name":"神湾镇"},{"code":"442000118","name":"小榄镇"}]},{"code":"445100","name":"潮州市","list":[{"code":"445102","name":"湘桥区"},{"code":"445103","name":"潮安区"},{"code":"445122","name":"饶平县"}]},{"code":"445200","name":"揭阳市","list":[{"code":"445202","name":"榕城区"},{"code":"445203","name":"揭东区"},{"code":"445222","name":"揭西县"},{"code":"445224","name":"惠来县"},{"code":"445281","name":"普宁市"}]},{"code":"445300","name":"云浮市","list":[{"code":"445302","name":"云城区"},{"code":"445303","name":"云安区"},{"code":"445321","name":"新兴县"},{"code":"445322","name":"郁南县"},{"code":"445381","name":"罗定市"}]}]},{"code":"450000","name":"广西壮族自治区","list":[{"code":"450100","name":"南宁市","list":[{"code":"450102","name":"兴宁区"},{"code":"450103","name":"青秀区"},{"code":"450105","name":"江南区"},{"code":"450107","name":"西乡塘区"},{"code":"450108","name":"良庆区"},{"code":"450109","name":"邕宁区"},{"code":"450110","name":"武鸣区"},{"code":"450123","name":"隆安县"},{"code":"450124","name":"马山县"},{"code":"450125","name":"上林县"},{"code":"450126","name":"宾阳县"},{"code":"450181","name":"横州市"}]},{"code":"450200","name":"柳州市","list":[{"code":"450202","name":"城中区"},{"code":"450203","name":"鱼峰区"},{"code":"450204","name":"柳南区"},{"code":"450205","name":"柳北区"},{"code":"450206","name":"柳江区"},{"code":"450222","name":"柳城县"},{"code":"450223","name":"鹿寨县"},{"code":"450224","name":"融安县"},{"code":"450225","name":"融水苗族自治县"},{"code":"450226","name":"三江侗族自治县"}]},{"code":"450300","name":"桂林市","list":[{"code":"450302","name":"秀峰区"},{"code":"450303","name":"叠彩区"},{"code":"450304","name":"象山区"},{"code":"450305","name":"七星区"},{"code":"450311","name":"雁山区"},{"code":"450312","name":"临桂区"},{"code":"450321","name":"阳朔县"},{"code":"450323","name":"灵川县"},{"code":"450324","name":"全州县"},{"code":"450325","name":"兴安县"},{"code":"450326","name":"永福县"},{"code":"450327","name":"灌阳县"},{"code":"450328","name":"龙胜各族自治县"},{"code":"450329","name":"资源县"},{"code":"450330","name":"平乐县"},{"code":"450332","name":"恭城瑶族自治县"},{"code":"450381","name":"荔浦市"}]},{"code":"450400","name":"梧州市","list":[{"code":"450403","name":"万秀区"},{"code":"450405","name":"长洲区"},{"code":"450406","name":"龙圩区"},{"code":"450421","name":"苍梧县"},{"code":"450422","name":"藤县"},{"code":"450423","name":"蒙山县"},{"code":"450481","name":"岑溪市"}]},{"code":"450500","name":"北海市","list":[{"code":"450502","name":"海城区"},{"code":"450503","name":"银海区"},{"code":"450512","name":"铁山港区"},{"code":"450521","name":"合浦县"}]},{"code":"450600","name":"防城港市","list":[{"code":"450602","name":"港口区"},{"code":"450603","name":"防城区"},{"code":"450621","name":"上思县"},{"code":"450681","name":"东兴市"}]},{"code":"450700","name":"钦州市","list":[{"code":"450702","name":"钦南区"},{"code":"450703","name":"钦北区"},{"code":"450721","name":"灵山县"},{"code":"450722","name":"浦北县"}]},{"code":"450800","name":"贵港市","list":[{"code":"450802","name":"港北区"},{"code":"450803","name":"港南区"},{"code":"450804","name":"覃塘区"},{"code":"450821","name":"平南县"},{"code":"450881","name":"桂平市"}]},{"code":"450900","name":"玉林市","list":[{"code":"450902","name":"玉州区"},{"code":"450903","name":"福绵区"},{"code":"450921","name":"容县"},{"code":"450922","name":"陆川县"},{"code":"450923","name":"博白县"},{"code":"450924","name":"兴业县"},{"code":"450981","name":"北流市"}]},{"code":"451000","name":"百色市","list":[{"code":"451002","name":"右江区"},{"code":"451003","name":"田阳区"},{"code":"451022","name":"田东县"},{"code":"451024","name":"德保县"},{"code":"451026","name":"那坡县"},{"code":"451027","name":"凌云县"},{"code":"451028","name":"乐业县"},{"code":"451029","name":"田林县"},{"code":"451030","name":"西林县"},{"code":"451031","name":"隆林各族自治县"},{"code":"451081","name":"靖西市"},{"code":"451082","name":"平果市"}]},{"code":"451100","name":"贺州市","list":[{"code":"451102","name":"八步区"},{"code":"451103","name":"平桂区"},{"code":"451121","name":"昭平县"},{"code":"451122","name":"钟山县"},{"code":"451123","name":"富川瑶族自治县"}]},{"code":"451200","name":"河池市","list":[{"code":"451202","name":"金城江区"},{"code":"451203","name":"宜州区"},{"code":"451221","name":"南丹县"},{"code":"451222","name":"天峨县"},{"code":"451223","name":"凤山县"},{"code":"451224","name":"东兰县"},{"code":"451225","name":"罗城仫佬族自治县"},{"code":"451226","name":"环江毛南族自治县"},{"code":"451227","name":"巴马瑶族自治县"},{"code":"451228","name":"都安瑶族自治县"},{"code":"451229","name":"大化瑶族自治县"}]},{"code":"451300","name":"来宾市","list":[{"code":"451302","name":"兴宾区"},{"code":"451321","name":"忻城县"},{"code":"451322","name":"象州县"},{"code":"451323","name":"武宣县"},{"code":"451324","name":"金秀瑶族自治县"},{"code":"451381","name":"合山市"}]},{"code":"451400","name":"崇左市","list":[{"code":"451402","name":"江州区"},{"code":"451421","name":"扶绥县"},{"code":"451422","name":"宁明县"},{"code":"451423","name":"龙州县"},{"code":"451424","name":"大新县"},{"code":"451425","name":"天等县"},{"code":"451481","name":"凭祥市"}]}]},{"code":"460000","name":"海南省","list":[{"code":"460100","name":"海口市","list":[{"code":"460105","name":"秀英区"},{"code":"460106","name":"龙华区"},{"code":"460107","name":"琼山区"},{"code":"460108","name":"美兰区"}]},{"code":"460200","name":"三亚市","list":[{"code":"460202","name":"海棠区"},{"code":"460203","name":"吉阳区"},{"code":"460204","name":"天涯区"},{"code":"460205","name":"崖州区"}]},{"code":"460300","name":"三沙市","list":[{"code":"460300619","name":"滨湄滩"},{"code":"460300620","name":"玉琢礁"},{"code":"460300621","name":"盘石屿"},{"code":"460300622","name":"羚羊礁"},{"code":"460300624","name":"全富岛"},{"code":"460300625","name":"银屿"},{"code":"460300626","name":"排洪滩"},{"code":"460300627","name":"波洑暗沙"},{"code":"460300628","name":"美溪暗沙"},{"code":"460300629","name":"海鸠暗沙"},{"code":"460300630","name":"中北暗沙"},{"code":"460300631","name":"漫步暗沙"},{"code":"460300632","name":"永兴岛"},{"code":"460300633","name":"浪花礁"},{"code":"460300634","name":"隐矶滩"},{"code":"460300635","name":"比微暗沙"},{"code":"460300636","name":"东岛"},{"code":"460300637","name":"湛涵滩"},{"code":"460300638","name":"华光礁"},{"code":"460300639","name":"中建岛"},{"code":"460300640","name":"金银岛"},{"code":"460300641","name":"甘泉岛"},{"code":"460300642","name":"北礁"},{"code":"460300643","name":"布德暗沙"},{"code":"460300644","name":"指掌暗沙"},{"code":"460300645","name":"鲁班暗沙"},{"code":"460300646","name":"美滨暗沙"},{"code":"460300647","name":"本固暗沙"},{"code":"460300648","name":"西门暗沙"},{"code":"460300649","name":"控湃暗沙"},{"code":"460300650","name":"涛静暗沙"},{"code":"460300651","name":"果淀暗沙"},{"code":"460300652","name":"排波暗沙"},{"code":"460300653","name":"石塘暗沙"},{"code":"460300654","name":"武勇暗沙"},{"code":"460300655","name":"安定连礁"},{"code":"460300656","name":"华夏暗沙"},{"code":"460300657","name":"济猛暗沙"},{"code":"460300658","name":"南扉暗沙"},{"code":"460300659","name":"屏南暗沙"},{"code":"460300660","name":"乐西暗沙"},{"code":"460300661","name":"黄岩岛(民主礁)"},{"code":"460300662","name":"石屿"},{"code":"460300663","name":"七连屿"},{"code":"460300664","name":"小现礁"},{"code":"460300665","name":"永南暗沙"},{"code":"460300666","name":"神狐暗沙"},{"code":"460300667","name":"咸舍屿"},{"code":"460300668","name":"筐仔沙洲"},{"code":"460300669","name":"红草门"},{"code":"460300670","name":"银砾滩"},{"code":"460300671","name":"北边廊"},{"code":"460300672","name":"高尖石"},{"code":"460300673","name":"西渡滩"},{"code":"460300674","name":"嵩焘滩"},{"code":"460300675","name":"鸭公岛"},{"code":"460300676","name":"宪法暗沙"},{"code":"460300677","name":"一统暗沙"},{"code":"460300678","name":"中南暗沙"},{"code":"460300679","name":"珊瑚东暗沙"},{"code":"460300683","name":"彬礁"},{"code":"460300684","name":"南方浅滩"},{"code":"460300685","name":"忠孝滩"},{"code":"460300686","name":"勇士滩"},{"code":"460300687","name":"海马滩"},{"code":"460300691","name":"火星礁"},{"code":"460300692","name":"和平暗沙"},{"code":"460300693","name":"大渊滩"},{"code":"460300694","name":"安塘滩"},{"code":"460300695","name":"马欢岛"},{"code":"460300696","name":"费信岛"},{"code":"460300697","name":"五方西"},{"code":"460300698","name":"五方北"},{"code":"460300699","name":"五方头"},{"code":"460300700","name":"五方尾"},{"code":"460300701","name":"五方南"},{"code":"460300702","name":"南安礁"},{"code":"460300703","name":"康西暗沙"},{"code":"460300704","name":"北安礁"},{"code":"460300705","name":"北康暗沙"},{"code":"460300706","name":"法显暗沙"},{"code":"460300707","name":"盟谊暗沙"},{"code":"460300708","name":"南通礁"},{"code":"460300709","name":"海宁礁"},{"code":"460300710","name":"琼台礁"},{"code":"460300711","name":"海安礁"},{"code":"460300712","name":"谭门礁"},{"code":"460300713","name":"隐波暗沙"},{"code":"460300714","name":"南康暗沙"},{"code":"460300715","name":"欢乐暗沙"},{"code":"460300716","name":"紫滩"},{"code":"460300717","name":"浔江暗沙"},{"code":"460300718","name":"半路礁"},{"code":"460300719","name":"日积礁"},{"code":"460300720","name":"南威岛"},{"code":"460300721","name":"中礁"},{"code":"460300722","name":"东礁"},{"code":"460300723","name":"华阳礁"},{"code":"460300724","name":"永暑礁"},{"code":"460300725","name":"毕生礁"},{"code":"460300726","name":"石盘仔"},{"code":"460300727","name":"奥南暗沙"},{"code":"460300728","name":"蓬勃堡"},{"code":"460300729","name":"金盾暗沙"},{"code":"460300730","name":"常骏暗沙"},{"code":"460300731","name":"南薇滩"},{"code":"460300732","name":"安波沙洲"},{"code":"460300733","name":"鸟鱼锭石"},{"code":"460300734","name":"光星礁"},{"code":"460300735","name":"光星仔礁"},{"code":"460300736","name":"弹丸礁"},{"code":"460300737","name":"安渡滩"},{"code":"460300738","name":"破浪礁"},{"code":"460300739","name":"南海礁"},{"code":"460300740","name":"簸箕礁"},{"code":"460300741","name":"榆亚暗沙"},{"code":"460300742","name":"六门礁"},{"code":"460300743","name":"南华礁"},{"code":"460300744","name":"无乜礁"},{"code":"460300745","name":"司令礁"},{"code":"460300746","name":"南乐暗沙"},{"code":"460300747","name":"半月礁"},{"code":"460300748","name":"舰长礁"},{"code":"460300749","name":"皇路礁"},{"code":"460300750","name":"曾母暗沙"},{"code":"460300751","name":"南屏礁"},{"code":"460300752","name":"永登暗沙"},{"code":"460300763","name":"西礁"},{"code":"460300764","name":"碎浪暗沙"},{"code":"460300765","name":"保卫暗沙"},{"code":"460300766","name":"普宁暗沙"},{"code":"460300767","name":"金吾暗沙"},{"code":"460300768","name":"都护暗沙"},{"code":"460300769","name":"朱应滩"},{"code":"460300770","name":"李准滩"},{"code":"460300771","name":"人骏滩"},{"code":"460300772","name":"广雅滩"},{"code":"460300773","name":"奥援暗沙"},{"code":"460300774","name":"隐遁暗沙"},{"code":"460300775","name":"尹庆群礁"},{"code":"460300776","name":"康泰滩"},{"code":"460300777","name":"玉诺礁"},{"code":"460300778","name":"校尉暗沙"},{"code":"460300779","name":"双礁"},{"code":"460300780","name":"指向礁"},{"code":"460300781","name":"南华水道"},{"code":"460300782","name":"石龙岩"},{"code":"460300783","name":"立新礁"},{"code":"460300784","name":"红石暗沙"},{"code":"460300785","name":"郑和群礁"},{"code":"460300786","name":"北恒礁"},{"code":"460300787","name":"恒礁"},{"code":"460300788","name":"莪兰暗沙"},{"code":"460300789","name":"泛爱暗沙"},{"code":"460300790","name":"孔明礁"},{"code":"460300791","name":"伏波礁"},{"code":"460300792","name":"海康暗沙"},{"code":"460300793","name":"康乐礁"},{"code":"460300794","name":"息波礁"},{"code":"460300795","name":"神仙暗沙"},{"code":"460300796","name":"仙后滩"},{"code":"460300797","name":"逍遥暗沙"},{"code":"460300798","name":"义净礁"},{"code":"460300799","name":"道明群礁"},{"code":"460300800","name":"九章群礁"},{"code":"460300804","name":"澄平礁"},{"code":"460300805","name":"双子群礁"},{"code":"460300806","name":"乐斯暗沙"},{"code":"460300807","name":"铁峙礁"},{"code":"460300808","name":"梅九礁"},{"code":"460300809","name":"铁线礁"},{"code":"460300810","name":"渚碧礁"},{"code":"460300811","name":"双黄沙洲"},{"code":"460300812","name":"库归礁"},{"code":"460300813","name":"西月岛"},{"code":"460300814","name":"长滩"},{"code":"460300815","name":"火艾礁"},{"code":"460300816","name":"南薰礁"},{"code":"460300817","name":"小南薰礁"},{"code":"460300818","name":"鸿庥岛"},{"code":"460300819","name":"安达礁"},{"code":"460300820","name":"舶兰礁"},{"code":"460300821","name":"安乐礁"},{"code":"460300822","name":"长线礁"},{"code":"460300823","name":"主权礁"},{"code":"460300824","name":"牛轭礁"},{"code":"460300825","name":"染青东礁"},{"code":"460300826","name":"染青沙洲"},{"code":"460300827","name":"龙虾礁"},{"code":"460300828","name":"扁参礁"},{"code":"460300829","name":"漳溪礁"},{"code":"460300830","name":"屈原礁"},{"code":"460300831","name":"琼礁"},{"code":"460300832","name":"赤瓜礁"},{"code":"460300833","name":"鬼喊礁"},{"code":"460300834","name":"华礁"},{"code":"460300835","name":"吉阳礁"},{"code":"460300836","name":"东门礁"},{"code":"460300837","name":"西门礁"},{"code":"460300838","name":"景宏岛"},{"code":"460300839","name":"南门礁"},{"code":"460300840","name":"大现礁"},{"code":"460300841","name":"福禄寺礁"},{"code":"460300842","name":"太平岛"},{"code":"460300843","name":"敦谦沙洲"},{"code":"460300844","name":"三角礁"},{"code":"460300845","name":"禄沙礁"},{"code":"460300846","name":"美济礁"},{"code":"460300847","name":"仁爱礁"},{"code":"460300848","name":"牛车轮礁"},{"code":"460300849","name":"仙宾礁"},{"code":"460300850","name":"钟山礁"},{"code":"460300851","name":"片礁"},{"code":"460300852","name":"信义礁"},{"code":"460300853","name":"海口礁"},{"code":"460300854","name":"乙辛石"},{"code":"460300855","name":"仙娥礁"},{"code":"460300856","name":"西卫滩"},{"code":"460300857","name":"万安滩"}]},{"code":"460400","name":"儋州市","list":[{"code":"460400001","name":"三都街道"},{"code":"460400100","name":"那大镇"},{"code":"460400101","name":"和庆镇"},{"code":"460400102","name":"南丰镇"},{"code":"460400103","name":"大成镇"},{"code":"460400104","name":"雅星镇"},{"code":"460400105","name":"兰洋镇"},{"code":"460400106","name":"光村镇"},{"code":"460400107","name":"木棠镇"},{"code":"460400108","name":"海头镇"},{"code":"460400109","name":"峨蔓镇"},{"code":"460400111","name":"王五镇"},{"code":"460400112","name":"白马井镇"},{"code":"460400113","name":"中和镇"},{"code":"460400114","name":"排浦镇"},{"code":"460400115","name":"东成镇"},{"code":"460400116","name":"新州镇"},{"code":"460400400","name":"西培农场"},{"code":"460400404","name":"西联农场"},{"code":"460400405","name":"蓝洋农场"},{"code":"460400407","name":"八一农场"}]},{"code":"469001","name":"五指山市","list":[{"code":"469001100","name":"通什镇"},{"code":"469001101","name":"南圣镇"},{"code":"469001102","name":"毛阳镇"},{"code":"469001103","name":"番阳镇"},{"code":"469001200","name":"畅好乡"},{"code":"469001201","name":"毛道乡"},{"code":"469001202","name":"水满乡"}]},{"code":"469002","name":"琼海市","list":[{"code":"469002100","name":"嘉积镇"},{"code":"469002101","name":"万泉镇"},{"code":"469002102","name":"石壁镇"},{"code":"469002103","name":"中原镇"},{"code":"469002104","name":"博鳌镇"},{"code":"469002105","name":"阳江镇"},{"code":"469002106","name":"龙江镇"},{"code":"469002107","name":"潭门镇"},{"code":"469002108","name":"塔洋镇"},{"code":"469002109","name":"长坡镇"},{"code":"469002110","name":"大路镇"},{"code":"469002111","name":"会山镇"},{"code":"469002400","name":"东太农场"},{"code":"469002402","name":"东红农场"},{"code":"469002403","name":"东升农场"}]},{"code":"469005","name":"文昌市","list":[{"code":"469005100","name":"文城镇"},{"code":"469005101","name":"重兴镇"},{"code":"469005102","name":"蓬莱镇"},{"code":"469005103","name":"会文镇"},{"code":"469005104","name":"东路镇"},{"code":"469005105","name":"潭牛镇"},{"code":"469005106","name":"东阁镇"},{"code":"469005107","name":"文教镇"},{"code":"469005108","name":"东郊镇"},{"code":"469005109","name":"龙楼镇"},{"code":"469005110","name":"昌洒镇"},{"code":"469005111","name":"翁田镇"},{"code":"469005112","name":"抱罗镇"},{"code":"469005113","name":"冯坡镇"},{"code":"469005114","name":"锦山镇"},{"code":"469005115","name":"铺前镇"},{"code":"469005116","name":"公坡镇"},{"code":"469005400","name":"东路农场"},{"code":"469005401","name":"南阳农场"},{"code":"469005402","name":"国营罗豆农场"}]},{"code":"469006","name":"万宁市","list":[{"code":"469006100","name":"万城镇"},{"code":"469006101","name":"龙滚镇"},{"code":"469006102","name":"和乐镇"},{"code":"469006103","name":"后安镇"},{"code":"469006104","name":"大茂镇"},{"code":"469006105","name":"东澳镇"},{"code":"469006106","name":"礼纪镇"},{"code":"469006107","name":"长丰镇"},{"code":"469006108","name":"山根镇"},{"code":"469006109","name":"北大镇"},{"code":"469006110","name":"南桥镇"},{"code":"469006111","name":"三更罗镇"},{"code":"469006400","name":"东兴农场"},{"code":"469006401","name":"东和农场"},{"code":"469006402","name":"兴隆华侨农场"},{"code":"469006403","name":"六连林场"}]},{"code":"469007","name":"东方市","list":[{"code":"469007100","name":"八所镇"},{"code":"469007101","name":"东河镇"},{"code":"469007102","name":"大田镇"},{"code":"469007103","name":"感城镇"},{"code":"469007104","name":"板桥镇"},{"code":"469007105","name":"三家镇"},{"code":"469007106","name":"四更镇"},{"code":"469007107","name":"新龙镇"},{"code":"469007200","name":"天安乡"},{"code":"469007201","name":"江边乡"},{"code":"469007400","name":"广坝农场"},{"code":"469007401","name":"东方华侨农场"}]},{"code":"469021","name":"定安县","list":[{"code":"469021100","name":"定城镇"},{"code":"469021101","name":"新竹镇"},{"code":"469021102","name":"龙湖镇"},{"code":"469021103","name":"黄竹镇"},{"code":"469021104","name":"雷鸣镇"},{"code":"469021105","name":"龙门镇"},{"code":"469021106","name":"龙河镇"},{"code":"469021107","name":"岭口镇"},{"code":"469021108","name":"翰林镇"},{"code":"469021109","name":"富文镇"},{"code":"469021400","name":"中瑞农场"},{"code":"469021401","name":"南海农场"},{"code":"469021402","name":"金鸡岭农场"}]},{"code":"469022","name":"屯昌县","list":[{"code":"469022100","name":"屯城镇"},{"code":"469022101","name":"新兴镇"},{"code":"469022102","name":"枫木镇"},{"code":"469022103","name":"乌坡镇"},{"code":"469022104","name":"南吕镇"},{"code":"469022105","name":"南坤镇"},{"code":"469022106","name":"坡心镇"},{"code":"469022107","name":"西昌镇"}]},{"code":"469023","name":"澄迈县","list":[{"code":"469023100","name":"金江镇"},{"code":"469023101","name":"老城镇"},{"code":"469023102","name":"瑞溪镇"},{"code":"469023103","name":"永发镇"},{"code":"469023104","name":"加乐镇"},{"code":"469023105","name":"文儒镇"},{"code":"469023106","name":"中兴镇"},{"code":"469023107","name":"仁兴镇"},{"code":"469023108","name":"福山镇"},{"code":"469023109","name":"桥头镇"},{"code":"469023110","name":"大丰镇"},{"code":"469023400","name":"红光农场"},{"code":"469023402","name":"西达农场"},{"code":"469023405","name":"国营金安农场"}]},{"code":"469024","name":"临高县","list":[{"code":"469024100","name":"临城镇"},{"code":"469024101","name":"波莲镇"},{"code":"469024102","name":"东英镇"},{"code":"469024103","name":"博厚镇"},{"code":"469024104","name":"皇桐镇"},{"code":"469024105","name":"多文镇"},{"code":"469024106","name":"和舍镇"},{"code":"469024107","name":"南宝镇"},{"code":"469024108","name":"新盈镇"},{"code":"469024109","name":"调楼镇"},{"code":"469024110","name":"加来镇"}]},{"code":"469025","name":"白沙黎族自治县","list":[{"code":"469025100","name":"牙叉镇"},{"code":"469025101","name":"七坊镇"},{"code":"469025102","name":"邦溪镇"},{"code":"469025103","name":"打安镇"},{"code":"469025200","name":"细水乡"},{"code":"469025201","name":"元门乡"},{"code":"469025202","name":"南开乡"},{"code":"469025203","name":"阜龙乡"},{"code":"469025204","name":"青松乡"},{"code":"469025205","name":"金波乡"},{"code":"469025206","name":"荣邦乡"},{"code":"469025401","name":"白沙农场"},{"code":"469025404","name":"龙江农场"},{"code":"469025408","name":"邦溪农场"}]},{"code":"469026","name":"昌江黎族自治县","list":[{"code":"469026100","name":"石碌镇"},{"code":"469026101","name":"叉河镇"},{"code":"469026102","name":"十月田镇"},{"code":"469026103","name":"乌烈镇"},{"code":"469026104","name":"昌化镇"},{"code":"469026105","name":"海尾镇"},{"code":"469026106","name":"七叉镇"},{"code":"469026200","name":"王下乡"}]},{"code":"469027","name":"乐东黎族自治县","list":[{"code":"469027100","name":"抱由镇"},{"code":"469027101","name":"万冲镇"},{"code":"469027102","name":"大安镇"},{"code":"469027103","name":"志仲镇"},{"code":"469027104","name":"千家镇"},{"code":"469027105","name":"九所镇"},{"code":"469027106","name":"利国镇"},{"code":"469027107","name":"黄流镇"},{"code":"469027108","name":"佛罗镇"},{"code":"469027109","name":"尖峰镇"},{"code":"469027110","name":"莺歌海镇"},{"code":"469027401","name":"山荣农场"},{"code":"469027402","name":"乐光农场"},{"code":"469027405","name":"保国农场"}]},{"code":"469028","name":"陵水黎族自治县","list":[{"code":"469028100","name":"椰林镇"},{"code":"469028101","name":"光坡镇"},{"code":"469028102","name":"三才镇"},{"code":"469028103","name":"英州镇"},{"code":"469028104","name":"隆广镇"},{"code":"469028105","name":"文罗镇"},{"code":"469028106","name":"本号镇"},{"code":"469028107","name":"新村镇"},{"code":"469028108","name":"黎安镇"},{"code":"469028200","name":"提蒙乡"},{"code":"469028201","name":"群英乡"},{"code":"469028400","name":"岭门农场"},{"code":"469028401","name":"南平农场"}]},{"code":"469029","name":"保亭黎族苗族自治县","list":[{"code":"469029100","name":"保城镇"},{"code":"469029101","name":"什玲镇"},{"code":"469029102","name":"加茂镇"},{"code":"469029103","name":"响水镇"},{"code":"469029104","name":"新政镇"},{"code":"469029105","name":"三道镇"},{"code":"469029200","name":"六弓乡"},{"code":"469029201","name":"南林乡"},{"code":"469029202","name":"毛感乡"},{"code":"469029401","name":"新星农场"},{"code":"469029403","name":"金江农场"},{"code":"469029405","name":"三道农场"}]},{"code":"469030","name":"琼中黎族苗族自治县","list":[{"code":"469030100","name":"营根镇"},{"code":"469030101","name":"湾岭镇"},{"code":"469030102","name":"黎母山镇"},{"code":"469030103","name":"和平镇"},{"code":"469030104","name":"长征镇"},{"code":"469030105","name":"红毛镇"},{"code":"469030106","name":"中平镇"},{"code":"469030200","name":"吊罗山乡"},{"code":"469030201","name":"上安乡"},{"code":"469030202","name":"什运乡"},{"code":"469030406","name":"加钗农场"},{"code":"469030407","name":"长征农场"}]}]},{"code":"500000","name":"重庆市","list":[{"code":"500100","name":"重庆市","list":[{"code":"500101","name":"万州区"},{"code":"500102","name":"涪陵区"},{"code":"500103","name":"渝中区"},{"code":"500104","name":"大渡口区"},{"code":"500105","name":"江北区"},{"code":"500106","name":"沙坪坝区"},{"code":"500107","name":"九龙坡区"},{"code":"500108","name":"南岸区"},{"code":"500109","name":"北碚区"},{"code":"500110","name":"綦江区"},{"code":"500111","name":"大足区"},{"code":"500112","name":"渝北区"},{"code":"500113","name":"巴南区"},{"code":"500114","name":"黔江区"},{"code":"500115","name":"长寿区"},{"code":"500116","name":"江津区"},{"code":"500117","name":"合川区"},{"code":"500118","name":"永川区"},{"code":"500119","name":"南川区"},{"code":"500120","name":"璧山区"},{"code":"500151","name":"铜梁区"},{"code":"500152","name":"潼南区"},{"code":"500153","name":"荣昌区"},{"code":"500154","name":"开州区"},{"code":"500155","name":"梁平区"},{"code":"500156","name":"武隆区"}]},{"code":"500200","name":"重庆市","list":[{"code":"500229","name":"城口县"},{"code":"500230","name":"丰都县"},{"code":"500231","name":"垫江县"},{"code":"500233","name":"忠县"},{"code":"500235","name":"云阳县"},{"code":"500236","name":"奉节县"},{"code":"500237","name":"巫山县"},{"code":"500238","name":"巫溪县"},{"code":"500240","name":"石柱土家族自治县"},{"code":"500241","name":"秀山土家族苗族自治县"},{"code":"500242","name":"酉阳土家族苗族自治县"},{"code":"500243","name":"彭水苗族土家族自治县"}]}]},{"code":"510000","name":"四川省","list":[{"code":"510100","name":"成都市","list":[{"code":"510104","name":"锦江区"},{"code":"510105","name":"青羊区"},{"code":"510106","name":"金牛区"},{"code":"510107","name":"武侯区"},{"code":"510108","name":"成华区"},{"code":"510112","name":"龙泉驿区"},{"code":"510113","name":"青白江区"},{"code":"510114","name":"新都区"},{"code":"510115","name":"温江区"},{"code":"510116","name":"双流区"},{"code":"510117","name":"郫都区"},{"code":"510118","name":"新津区"},{"code":"510121","name":"金堂县"},{"code":"510129","name":"大邑县"},{"code":"510131","name":"蒲江县"},{"code":"510181","name":"都江堰市"},{"code":"510182","name":"彭州市"},{"code":"510183","name":"邛崃市"},{"code":"510184","name":"崇州市"},{"code":"510185","name":"简阳市"}]},{"code":"510300","name":"自贡市","list":[{"code":"510302","name":"自流井区"},{"code":"510303","name":"贡井区"},{"code":"510304","name":"大安区"},{"code":"510311","name":"沿滩区"},{"code":"510321","name":"荣县"},{"code":"510322","name":"富顺县"}]},{"code":"510400","name":"攀枝花市","list":[{"code":"510402","name":"东区"},{"code":"510403","name":"西区"},{"code":"510411","name":"仁和区"},{"code":"510421","name":"米易县"},{"code":"510422","name":"盐边县"}]},{"code":"510500","name":"泸州市","list":[{"code":"510502","name":"江阳区"},{"code":"510503","name":"纳溪区"},{"code":"510504","name":"龙马潭区"},{"code":"510521","name":"泸县"},{"code":"510522","name":"合江县"},{"code":"510524","name":"叙永县"},{"code":"510525","name":"古蔺县"}]},{"code":"510600","name":"德阳市","list":[{"code":"510603","name":"旌阳区"},{"code":"510604","name":"罗江区"},{"code":"510623","name":"中江县"},{"code":"510681","name":"广汉市"},{"code":"510682","name":"什邡市"},{"code":"510683","name":"绵竹市"}]},{"code":"510700","name":"绵阳市","list":[{"code":"510703","name":"涪城区"},{"code":"510704","name":"游仙区"},{"code":"510705","name":"安州区"},{"code":"510722","name":"三台县"},{"code":"510723","name":"盐亭县"},{"code":"510725","name":"梓潼县"},{"code":"510726","name":"北川羌族自治县"},{"code":"510727","name":"平武县"},{"code":"510781","name":"江油市"}]},{"code":"510800","name":"广元市","list":[{"code":"510802","name":"利州区"},{"code":"510811","name":"昭化区"},{"code":"510812","name":"朝天区"},{"code":"510821","name":"旺苍县"},{"code":"510822","name":"青川县"},{"code":"510823","name":"剑阁县"},{"code":"510824","name":"苍溪县"}]},{"code":"510900","name":"遂宁市","list":[{"code":"510903","name":"船山区"},{"code":"510904","name":"安居区"},{"code":"510921","name":"蓬溪县"},{"code":"510923","name":"大英县"},{"code":"510981","name":"射洪市"}]},{"code":"511000","name":"内江市","list":[{"code":"511002","name":"市中区"},{"code":"511011","name":"东兴区"},{"code":"511024","name":"威远县"},{"code":"511025","name":"资中县"},{"code":"511083","name":"隆昌市"}]},{"code":"511100","name":"乐山市","list":[{"code":"511102","name":"市中区"},{"code":"511111","name":"沙湾区"},{"code":"511112","name":"五通桥区"},{"code":"511113","name":"金口河区"},{"code":"511123","name":"犍为县"},{"code":"511124","name":"井研县"},{"code":"511126","name":"夹江县"},{"code":"511129","name":"沐川县"},{"code":"511132","name":"峨边彝族自治县"},{"code":"511133","name":"马边彝族自治县"},{"code":"511181","name":"峨眉山市"}]},{"code":"511300","name":"南充市","list":[{"code":"511302","name":"顺庆区"},{"code":"511303","name":"高坪区"},{"code":"511304","name":"嘉陵区"},{"code":"511321","name":"南部县"},{"code":"511322","name":"营山县"},{"code":"511323","name":"蓬安县"},{"code":"511324","name":"仪陇县"},{"code":"511325","name":"西充县"},{"code":"511381","name":"阆中市"}]},{"code":"511400","name":"眉山市","list":[{"code":"511402","name":"东坡区"},{"code":"511403","name":"彭山区"},{"code":"511421","name":"仁寿县"},{"code":"511423","name":"洪雅县"},{"code":"511424","name":"丹棱县"},{"code":"511425","name":"青神县"}]},{"code":"511500","name":"宜宾市","list":[{"code":"511502","name":"翠屏区"},{"code":"511503","name":"南溪区"},{"code":"511504","name":"叙州区"},{"code":"511523","name":"江安县"},{"code":"511524","name":"长宁县"},{"code":"511525","name":"高县"},{"code":"511526","name":"珙县"},{"code":"511527","name":"筠连县"},{"code":"511528","name":"兴文县"},{"code":"511529","name":"屏山县"}]},{"code":"511600","name":"广安市","list":[{"code":"511602","name":"广安区"},{"code":"511603","name":"前锋区"},{"code":"511621","name":"岳池县"},{"code":"511622","name":"武胜县"},{"code":"511623","name":"邻水县"},{"code":"511681","name":"华蓥市"}]},{"code":"511700","name":"达州市","list":[{"code":"511702","name":"通川区"},{"code":"511703","name":"达川区"},{"code":"511722","name":"宣汉县"},{"code":"511723","name":"开江县"},{"code":"511724","name":"大竹县"},{"code":"511725","name":"渠县"},{"code":"511781","name":"万源市"}]},{"code":"511800","name":"雅安市","list":[{"code":"511802","name":"雨城区"},{"code":"511803","name":"名山区"},{"code":"511822","name":"荥经县"},{"code":"511823","name":"汉源县"},{"code":"511824","name":"石棉县"},{"code":"511825","name":"天全县"},{"code":"511826","name":"芦山县"},{"code":"511827","name":"宝兴县"}]},{"code":"511900","name":"巴中市","list":[{"code":"511902","name":"巴州区"},{"code":"511903","name":"恩阳区"},{"code":"511921","name":"通江县"},{"code":"511922","name":"南江县"},{"code":"511923","name":"平昌县"}]},{"code":"512000","name":"资阳市","list":[{"code":"512002","name":"雁江区"},{"code":"512021","name":"安岳县"},{"code":"512022","name":"乐至县"}]},{"code":"513200","name":"阿坝藏族羌族自治州","list":[{"code":"513201","name":"马尔康市"},{"code":"513221","name":"汶川县"},{"code":"513222","name":"理县"},{"code":"513223","name":"茂县"},{"code":"513224","name":"松潘县"},{"code":"513225","name":"九寨沟县"},{"code":"513226","name":"金川县"},{"code":"513227","name":"小金县"},{"code":"513228","name":"黑水县"},{"code":"513230","name":"壤塘县"},{"code":"513231","name":"阿坝县"},{"code":"513232","name":"若尔盖县"},{"code":"513233","name":"红原县"}]},{"code":"513300","name":"甘孜藏族自治州","list":[{"code":"513301","name":"康定市"},{"code":"513322","name":"泸定县"},{"code":"513323","name":"丹巴县"},{"code":"513324","name":"九龙县"},{"code":"513325","name":"雅江县"},{"code":"513326","name":"道孚县"},{"code":"513327","name":"炉霍县"},{"code":"513328","name":"甘孜县"},{"code":"513329","name":"新龙县"},{"code":"513330","name":"德格县"},{"code":"513331","name":"白玉县"},{"code":"513332","name":"石渠县"},{"code":"513333","name":"色达县"},{"code":"513334","name":"理塘县"},{"code":"513335","name":"巴塘县"},{"code":"513336","name":"乡城县"},{"code":"513337","name":"稻城县"},{"code":"513338","name":"得荣县"}]},{"code":"513400","name":"凉山彝族自治州","list":[{"code":"513401","name":"西昌市"},{"code":"513402","name":"会理市"},{"code":"513422","name":"木里藏族自治县"},{"code":"513423","name":"盐源县"},{"code":"513424","name":"德昌县"},{"code":"513426","name":"会东县"},{"code":"513427","name":"宁南县"},{"code":"513428","name":"普格县"},{"code":"513429","name":"布拖县"},{"code":"513430","name":"金阳县"},{"code":"513431","name":"昭觉县"},{"code":"513432","name":"喜德县"},{"code":"513433","name":"冕宁县"},{"code":"513434","name":"越西县"},{"code":"513435","name":"甘洛县"},{"code":"513436","name":"美姑县"},{"code":"513437","name":"雷波县"}]}]},{"code":"520000","name":"贵州省","list":[{"code":"520100","name":"贵阳市","list":[{"code":"520102","name":"南明区"},{"code":"520103","name":"云岩区"},{"code":"520111","name":"花溪区"},{"code":"520112","name":"乌当区"},{"code":"520113","name":"白云区"},{"code":"520115","name":"观山湖区"},{"code":"520121","name":"开阳县"},{"code":"520122","name":"息烽县"},{"code":"520123","name":"修文县"},{"code":"520181","name":"清镇市"}]},{"code":"520200","name":"六盘水市","list":[{"code":"520201","name":"钟山区"},{"code":"520203","name":"六枝特区"},{"code":"520204","name":"水城区"},{"code":"520281","name":"盘州市"}]},{"code":"520300","name":"遵义市","list":[{"code":"520302","name":"红花岗区"},{"code":"520303","name":"汇川区"},{"code":"520304","name":"播州区"},{"code":"520322","name":"桐梓县"},{"code":"520323","name":"绥阳县"},{"code":"520324","name":"正安县"},{"code":"520325","name":"道真仡佬族苗族自治县"},{"code":"520326","name":"务川仡佬族苗族自治县"},{"code":"520327","name":"凤冈县"},{"code":"520328","name":"湄潭县"},{"code":"520329","name":"余庆县"},{"code":"520330","name":"习水县"},{"code":"520381","name":"赤水市"},{"code":"520382","name":"仁怀市"}]},{"code":"520400","name":"安顺市","list":[{"code":"520402","name":"西秀区"},{"code":"520403","name":"平坝区"},{"code":"520422","name":"普定县"},{"code":"520423","name":"镇宁布依族苗族自治县"},{"code":"520424","name":"关岭布依族苗族自治县"},{"code":"520425","name":"紫云苗族布依族自治县"}]},{"code":"520500","name":"毕节市","list":[{"code":"520502","name":"七星关区"},{"code":"520521","name":"大方县"},{"code":"520523","name":"金沙县"},{"code":"520524","name":"织金县"},{"code":"520525","name":"纳雍县"},{"code":"520526","name":"威宁彝族回族苗族自治县"},{"code":"520527","name":"赫章县"},{"code":"520581","name":"黔西市"}]},{"code":"520600","name":"铜仁市","list":[{"code":"520602","name":"碧江区"},{"code":"520603","name":"万山区"},{"code":"520621","name":"江口县"},{"code":"520622","name":"玉屏侗族自治县"},{"code":"520623","name":"石阡县"},{"code":"520624","name":"思南县"},{"code":"520625","name":"印江土家族苗族自治县"},{"code":"520626","name":"德江县"},{"code":"520627","name":"沿河土家族自治县"},{"code":"520628","name":"松桃苗族自治县"}]},{"code":"522300","name":"黔西南布依族苗族自治州","list":[{"code":"522301","name":"兴义市"},{"code":"522302","name":"兴仁市"},{"code":"522323","name":"普安县"},{"code":"522324","name":"晴隆县"},{"code":"522325","name":"贞丰县"},{"code":"522326","name":"望谟县"},{"code":"522327","name":"册亨县"},{"code":"522328","name":"安龙县"}]},{"code":"522600","name":"黔东南苗族侗族自治州","list":[{"code":"522601","name":"凯里市"},{"code":"522622","name":"黄平县"},{"code":"522623","name":"施秉县"},{"code":"522624","name":"三穗县"},{"code":"522625","name":"镇远县"},{"code":"522626","name":"岑巩县"},{"code":"522627","name":"天柱县"},{"code":"522628","name":"锦屏县"},{"code":"522629","name":"剑河县"},{"code":"522630","name":"台江县"},{"code":"522631","name":"黎平县"},{"code":"522632","name":"榕江县"},{"code":"522633","name":"从江县"},{"code":"522634","name":"雷山县"},{"code":"522635","name":"麻江县"},{"code":"522636","name":"丹寨县"}]},{"code":"522700","name":"黔南布依族苗族自治州","list":[{"code":"522701","name":"都匀市"},{"code":"522702","name":"福泉市"},{"code":"522722","name":"荔波县"},{"code":"522723","name":"贵定县"},{"code":"522725","name":"瓮安县"},{"code":"522726","name":"独山县"},{"code":"522727","name":"平塘县"},{"code":"522728","name":"罗甸县"},{"code":"522729","name":"长顺县"},{"code":"522730","name":"龙里县"},{"code":"522731","name":"惠水县"},{"code":"522732","name":"三都水族自治县"}]}]},{"code":"530000","name":"云南省","list":[{"code":"530100","name":"昆明市","list":[{"code":"530102","name":"五华区"},{"code":"530103","name":"盘龙区"},{"code":"530111","name":"官渡区"},{"code":"530112","name":"西山区"},{"code":"530113","name":"东川区"},{"code":"530114","name":"呈贡区"},{"code":"530115","name":"晋宁区"},{"code":"530124","name":"富民县"},{"code":"530125","name":"宜良县"},{"code":"530126","name":"石林彝族自治县"},{"code":"530127","name":"嵩明县"},{"code":"530128","name":"禄劝彝族苗族自治县"},{"code":"530129","name":"寻甸回族彝族自治县"},{"code":"530181","name":"安宁市"}]},{"code":"530300","name":"曲靖市","list":[{"code":"530302","name":"麒麟区"},{"code":"530303","name":"沾益区"},{"code":"530304","name":"马龙区"},{"code":"530322","name":"陆良县"},{"code":"530323","name":"师宗县"},{"code":"530324","name":"罗平县"},{"code":"530325","name":"富源县"},{"code":"530326","name":"会泽县"},{"code":"530381","name":"宣威市"}]},{"code":"530400","name":"玉溪市","list":[{"code":"530402","name":"红塔区"},{"code":"530403","name":"江川区"},{"code":"530423","name":"通海县"},{"code":"530424","name":"华宁县"},{"code":"530425","name":"易门县"},{"code":"530426","name":"峨山彝族自治县"},{"code":"530427","name":"新平彝族傣族自治县"},{"code":"530428","name":"元江哈尼族彝族傣族自治县"},{"code":"530481","name":"澄江市"}]},{"code":"530500","name":"保山市","list":[{"code":"530502","name":"隆阳区"},{"code":"530521","name":"施甸县"},{"code":"530523","name":"龙陵县"},{"code":"530524","name":"昌宁县"},{"code":"530581","name":"腾冲市"}]},{"code":"530600","name":"昭通市","list":[{"code":"530602","name":"昭阳区"},{"code":"530621","name":"鲁甸县"},{"code":"530622","name":"巧家县"},{"code":"530623","name":"盐津县"},{"code":"530624","name":"大关县"},{"code":"530625","name":"永善县"},{"code":"530626","name":"绥江县"},{"code":"530627","name":"镇雄县"},{"code":"530628","name":"彝良县"},{"code":"530629","name":"威信县"},{"code":"530681","name":"水富市"}]},{"code":"530700","name":"丽江市","list":[{"code":"530702","name":"古城区"},{"code":"530721","name":"玉龙纳西族自治县"},{"code":"530722","name":"永胜县"},{"code":"530723","name":"华坪县"},{"code":"530724","name":"宁蒗彝族自治县"}]},{"code":"530800","name":"普洱市","list":[{"code":"530802","name":"思茅区"},{"code":"530821","name":"宁洱哈尼族彝族自治县"},{"code":"530822","name":"墨江哈尼族自治县"},{"code":"530823","name":"景东彝族自治县"},{"code":"530824","name":"景谷傣族彝族自治县"},{"code":"530825","name":"镇沅彝族哈尼族拉祜族自治县"},{"code":"530826","name":"江城哈尼族彝族自治县"},{"code":"530827","name":"孟连傣族拉祜族佤族自治县"},{"code":"530828","name":"澜沧拉祜族自治县"},{"code":"530829","name":"西盟佤族自治县"}]},{"code":"530900","name":"临沧市","list":[{"code":"530902","name":"临翔区"},{"code":"530921","name":"凤庆县"},{"code":"530922","name":"云县"},{"code":"530923","name":"永德县"},{"code":"530924","name":"镇康县"},{"code":"530925","name":"双江拉祜族佤族布朗族傣族自治县"},{"code":"530926","name":"耿马傣族佤族自治县"},{"code":"530927","name":"沧源佤族自治县"}]},{"code":"532300","name":"楚雄彝族自治州","list":[{"code":"532301","name":"楚雄市"},{"code":"532302","name":"禄丰市"},{"code":"532322","name":"双柏县"},{"code":"532323","name":"牟定县"},{"code":"532324","name":"南华县"},{"code":"532325","name":"姚安县"},{"code":"532326","name":"大姚县"},{"code":"532327","name":"永仁县"},{"code":"532328","name":"元谋县"},{"code":"532329","name":"武定县"}]},{"code":"532500","name":"红河哈尼族彝族自治州","list":[{"code":"532501","name":"个旧市"},{"code":"532502","name":"开远市"},{"code":"532503","name":"蒙自市"},{"code":"532504","name":"弥勒市"},{"code":"532523","name":"屏边苗族自治县"},{"code":"532524","name":"建水县"},{"code":"532525","name":"石屏县"},{"code":"532527","name":"泸西县"},{"code":"532528","name":"元阳县"},{"code":"532529","name":"红河县"},{"code":"532530","name":"金平苗族瑶族傣族自治县"},{"code":"532531","name":"绿春县"},{"code":"532532","name":"河口瑶族自治县"}]},{"code":"532600","name":"文山壮族苗族自治州","list":[{"code":"532601","name":"文山市"},{"code":"532622","name":"砚山县"},{"code":"532623","name":"西畴县"},{"code":"532624","name":"麻栗坡县"},{"code":"532625","name":"马关县"},{"code":"532626","name":"丘北县"},{"code":"532627","name":"广南县"},{"code":"532628","name":"富宁县"}]},{"code":"532800","name":"西双版纳傣族自治州","list":[{"code":"532801","name":"景洪市"},{"code":"532822","name":"勐海县"},{"code":"532823","name":"勐腊县"}]},{"code":"532900","name":"大理白族自治州","list":[{"code":"532901","name":"大理市"},{"code":"532922","name":"漾濞彝族自治县"},{"code":"532923","name":"祥云县"},{"code":"532924","name":"宾川县"},{"code":"532925","name":"弥渡县"},{"code":"532926","name":"南涧彝族自治县"},{"code":"532927","name":"巍山彝族回族自治县"},{"code":"532928","name":"永平县"},{"code":"532929","name":"云龙县"},{"code":"532930","name":"洱源县"},{"code":"532931","name":"剑川县"},{"code":"532932","name":"鹤庆县"}]},{"code":"533100","name":"德宏傣族景颇族自治州","list":[{"code":"533102","name":"瑞丽市"},{"code":"533103","name":"芒市"},{"code":"533122","name":"梁河县"},{"code":"533123","name":"盈江县"},{"code":"533124","name":"陇川县"}]},{"code":"533300","name":"怒江傈僳族自治州","list":[{"code":"533301","name":"泸水市"},{"code":"533323","name":"福贡县"},{"code":"533324","name":"贡山独龙族怒族自治县"},{"code":"533325","name":"兰坪白族普米族自治县"}]},{"code":"533400","name":"迪庆藏族自治州","list":[{"code":"533401","name":"香格里拉市"},{"code":"533422","name":"德钦县"},{"code":"533423","name":"维西傈僳族自治县"}]}]},{"code":"540000","name":"西藏自治区","list":[{"code":"540100","name":"拉萨市","list":[{"code":"540102","name":"城关区"},{"code":"540103","name":"堆龙德庆区"},{"code":"540104","name":"达孜区"},{"code":"540121","name":"林周县"},{"code":"540122","name":"当雄县"},{"code":"540123","name":"尼木县"},{"code":"540124","name":"曲水县"},{"code":"540127","name":"墨竹工卡县"}]},{"code":"540200","name":"日喀则市","list":[{"code":"540202","name":"桑珠孜区"},{"code":"540221","name":"南木林县"},{"code":"540222","name":"江孜县"},{"code":"540223","name":"定日县"},{"code":"540224","name":"萨迦县"},{"code":"540225","name":"拉孜县"},{"code":"540226","name":"昂仁县"},{"code":"540227","name":"谢通门县"},{"code":"540228","name":"白朗县"},{"code":"540229","name":"仁布县"},{"code":"540230","name":"康马县"},{"code":"540231","name":"定结县"},{"code":"540232","name":"仲巴县"},{"code":"540233","name":"亚东县"},{"code":"540234","name":"吉隆县"},{"code":"540235","name":"聂拉木县"},{"code":"540236","name":"萨嘎县"},{"code":"540237","name":"岗巴县"}]},{"code":"540300","name":"昌都市","list":[{"code":"540302","name":"卡若区"},{"code":"540321","name":"江达县"},{"code":"540322","name":"贡觉县"},{"code":"540323","name":"类乌齐县"},{"code":"540324","name":"丁青县"},{"code":"540325","name":"察雅县"},{"code":"540326","name":"八宿县"},{"code":"540327","name":"左贡县"},{"code":"540328","name":"芒康县"},{"code":"540329","name":"洛隆县"},{"code":"540330","name":"边坝县"}]},{"code":"540400","name":"林芝市","list":[{"code":"540402","name":"巴宜区"},{"code":"540421","name":"工布江达县"},{"code":"540422","name":"米林市"},{"code":"540423","name":"墨脱县"},{"code":"540424","name":"波密县"},{"code":"540425","name":"察隅县"},{"code":"540426","name":"朗县"}]},{"code":"540500","name":"山南市","list":[{"code":"540502","name":"乃东区"},{"code":"540521","name":"扎囊县"},{"code":"540522","name":"贡嘎县"},{"code":"540523","name":"桑日县"},{"code":"540524","name":"琼结县"},{"code":"540525","name":"曲松县"},{"code":"540526","name":"措美县"},{"code":"540527","name":"洛扎县"},{"code":"540528","name":"加查县"},{"code":"540529","name":"隆子县"},{"code":"540530","name":"错那市"},{"code":"540531","name":"浪卡子县"}]},{"code":"540600","name":"那曲市","list":[{"code":"540602","name":"色尼区"},{"code":"540621","name":"嘉黎县"},{"code":"540622","name":"比如县"},{"code":"540623","name":"聂荣县"},{"code":"540624","name":"安多县"},{"code":"540625","name":"申扎县"},{"code":"540626","name":"索县"},{"code":"540627","name":"班戈县"},{"code":"540628","name":"巴青县"},{"code":"540629","name":"尼玛县"},{"code":"540630","name":"双湖县"}]},{"code":"542500","name":"阿里地区","list":[{"code":"542521","name":"普兰县"},{"code":"542522","name":"札达县"},{"code":"542523","name":"噶尔县"},{"code":"542524","name":"日土县"},{"code":"542525","name":"革吉县"},{"code":"542526","name":"改则县"},{"code":"542527","name":"措勤县"}]}]},{"code":"610000","name":"陕西省","list":[{"code":"610100","name":"西安市","list":[{"code":"610102","name":"新城区"},{"code":"610103","name":"碑林区"},{"code":"610104","name":"莲湖区"},{"code":"610111","name":"灞桥区"},{"code":"610112","name":"未央区"},{"code":"610113","name":"雁塔区"},{"code":"610114","name":"阎良区"},{"code":"610115","name":"临潼区"},{"code":"610116","name":"长安区"},{"code":"610117","name":"高陵区"},{"code":"610118","name":"鄠邑区"},{"code":"610122","name":"蓝田县"},{"code":"610124","name":"周至县"}]},{"code":"610200","name":"铜川市","list":[{"code":"610202","name":"王益区"},{"code":"610203","name":"印台区"},{"code":"610204","name":"耀州区"},{"code":"610222","name":"宜君县"}]},{"code":"610300","name":"宝鸡市","list":[{"code":"610302","name":"渭滨区"},{"code":"610303","name":"金台区"},{"code":"610304","name":"陈仓区"},{"code":"610305","name":"凤翔区"},{"code":"610323","name":"岐山县"},{"code":"610324","name":"扶风县"},{"code":"610326","name":"眉县"},{"code":"610327","name":"陇县"},{"code":"610328","name":"千阳县"},{"code":"610329","name":"麟游县"},{"code":"610330","name":"凤县"},{"code":"610331","name":"太白县"}]},{"code":"610400","name":"咸阳市","list":[{"code":"610402","name":"秦都区"},{"code":"610403","name":"杨陵区"},{"code":"610404","name":"渭城区"},{"code":"610422","name":"三原县"},{"code":"610423","name":"泾阳县"},{"code":"610424","name":"乾县"},{"code":"610425","name":"礼泉县"},{"code":"610426","name":"永寿县"},{"code":"610428","name":"长武县"},{"code":"610429","name":"旬邑县"},{"code":"610430","name":"淳化县"},{"code":"610431","name":"武功县"},{"code":"610481","name":"兴平市"},{"code":"610482","name":"彬州市"}]},{"code":"610500","name":"渭南市","list":[{"code":"610502","name":"临渭区"},{"code":"610503","name":"华州区"},{"code":"610522","name":"潼关县"},{"code":"610523","name":"大荔县"},{"code":"610524","name":"合阳县"},{"code":"610525","name":"澄城县"},{"code":"610526","name":"蒲城县"},{"code":"610527","name":"白水县"},{"code":"610528","name":"富平县"},{"code":"610581","name":"韩城市"},{"code":"610582","name":"华阴市"}]},{"code":"610600","name":"延安市","list":[{"code":"610602","name":"宝塔区"},{"code":"610603","name":"安塞区"},{"code":"610621","name":"延长县"},{"code":"610622","name":"延川县"},{"code":"610625","name":"志丹县"},{"code":"610626","name":"吴起县"},{"code":"610627","name":"甘泉县"},{"code":"610628","name":"富县"},{"code":"610629","name":"洛川县"},{"code":"610630","name":"宜川县"},{"code":"610631","name":"黄龙县"},{"code":"610632","name":"黄陵县"},{"code":"610681","name":"子长市"}]},{"code":"610700","name":"汉中市","list":[{"code":"610702","name":"汉台区"},{"code":"610703","name":"南郑区"},{"code":"610722","name":"城固县"},{"code":"610723","name":"洋县"},{"code":"610724","name":"西乡县"},{"code":"610725","name":"勉县"},{"code":"610726","name":"宁强县"},{"code":"610727","name":"略阳县"},{"code":"610728","name":"镇巴县"},{"code":"610729","name":"留坝县"},{"code":"610730","name":"佛坪县"}]},{"code":"610800","name":"榆林市","list":[{"code":"610802","name":"榆阳区"},{"code":"610803","name":"横山区"},{"code":"610822","name":"府谷县"},{"code":"610824","name":"靖边县"},{"code":"610825","name":"定边县"},{"code":"610826","name":"绥德县"},{"code":"610827","name":"米脂县"},{"code":"610828","name":"佳县"},{"code":"610829","name":"吴堡县"},{"code":"610830","name":"清涧县"},{"code":"610831","name":"子洲县"},{"code":"610881","name":"神木市"}]},{"code":"610900","name":"安康市","list":[{"code":"610902","name":"汉滨区"},{"code":"610921","name":"汉阴县"},{"code":"610922","name":"石泉县"},{"code":"610923","name":"宁陕县"},{"code":"610924","name":"紫阳县"},{"code":"610925","name":"岚皋县"},{"code":"610926","name":"平利县"},{"code":"610927","name":"镇坪县"},{"code":"610929","name":"白河县"},{"code":"610981","name":"旬阳市"}]},{"code":"611000","name":"商洛市","list":[{"code":"611002","name":"商州区"},{"code":"611021","name":"洛南县"},{"code":"611022","name":"丹凤县"},{"code":"611023","name":"商南县"},{"code":"611024","name":"山阳县"},{"code":"611025","name":"镇安县"},{"code":"611026","name":"柞水县"}]}]},{"code":"620000","name":"甘肃省","list":[{"code":"620100","name":"兰州市","list":[{"code":"620102","name":"城关区"},{"code":"620103","name":"七里河区"},{"code":"620104","name":"西固区"},{"code":"620105","name":"安宁区"},{"code":"620111","name":"红古区"},{"code":"620121","name":"永登县"},{"code":"620122","name":"皋兰县"},{"code":"620123","name":"榆中县"}]},{"code":"620200","name":"嘉峪关市","list":[{"code":"620200002","name":"新华街道"},{"code":"620200004","name":"建设街道"},{"code":"620200007","name":"峪苑街道"},{"code":"620200008","name":"朝阳街道"},{"code":"620200009","name":"前进街道"},{"code":"620200010","name":"胜利街道"},{"code":"620200011","name":"五一街道"},{"code":"620200100","name":"新城镇"},{"code":"620200101","name":"峪泉镇"},{"code":"620200102","name":"文殊镇"}]},{"code":"620300","name":"金昌市","list":[{"code":"620302","name":"金川区"},{"code":"620321","name":"永昌县"}]},{"code":"620400","name":"白银市","list":[{"code":"620402","name":"白银区"},{"code":"620403","name":"平川区"},{"code":"620421","name":"靖远县"},{"code":"620422","name":"会宁县"},{"code":"620423","name":"景泰县"}]},{"code":"620500","name":"天水市","list":[{"code":"620502","name":"秦州区"},{"code":"620503","name":"麦积区"},{"code":"620521","name":"清水县"},{"code":"620522","name":"秦安县"},{"code":"620523","name":"甘谷县"},{"code":"620524","name":"武山县"},{"code":"620525","name":"张家川回族自治县"}]},{"code":"620600","name":"武威市","list":[{"code":"620602","name":"凉州区"},{"code":"620621","name":"民勤县"},{"code":"620622","name":"古浪县"},{"code":"620623","name":"天祝藏族自治县"}]},{"code":"620700","name":"张掖市","list":[{"code":"620702","name":"甘州区"},{"code":"620721","name":"肃南裕固族自治县"},{"code":"620722","name":"民乐县"},{"code":"620723","name":"临泽县"},{"code":"620724","name":"高台县"},{"code":"620725","name":"山丹县"}]},{"code":"620800","name":"平凉市","list":[{"code":"620802","name":"崆峒区"},{"code":"620821","name":"泾川县"},{"code":"620822","name":"灵台县"},{"code":"620823","name":"崇信县"},{"code":"620825","name":"庄浪县"},{"code":"620826","name":"静宁县"},{"code":"620881","name":"华亭市"}]},{"code":"620900","name":"酒泉市","list":[{"code":"620902","name":"肃州区"},{"code":"620921","name":"金塔县"},{"code":"620922","name":"瓜州县"},{"code":"620923","name":"肃北蒙古族自治县"},{"code":"620924","name":"阿克塞哈萨克族自治县"},{"code":"620981","name":"玉门市"},{"code":"620982","name":"敦煌市"}]},{"code":"621000","name":"庆阳市","list":[{"code":"621002","name":"西峰区"},{"code":"621021","name":"庆城县"},{"code":"621022","name":"环县"},{"code":"621023","name":"华池县"},{"code":"621024","name":"合水县"},{"code":"621025","name":"正宁县"},{"code":"621026","name":"宁县"},{"code":"621027","name":"镇原县"}]},{"code":"621100","name":"定西市","list":[{"code":"621102","name":"安定区"},{"code":"621121","name":"通渭县"},{"code":"621122","name":"陇西县"},{"code":"621123","name":"渭源县"},{"code":"621124","name":"临洮县"},{"code":"621125","name":"漳县"},{"code":"621126","name":"岷县"}]},{"code":"621200","name":"陇南市","list":[{"code":"621202","name":"武都区"},{"code":"621221","name":"成县"},{"code":"621222","name":"文县"},{"code":"621223","name":"宕昌县"},{"code":"621224","name":"康县"},{"code":"621225","name":"西和县"},{"code":"621226","name":"礼县"},{"code":"621227","name":"徽县"},{"code":"621228","name":"两当县"}]},{"code":"622900","name":"临夏回族自治州","list":[{"code":"622901","name":"临夏市"},{"code":"622921","name":"临夏县"},{"code":"622922","name":"康乐县"},{"code":"622923","name":"永靖县"},{"code":"622924","name":"广河县"},{"code":"622925","name":"和政县"},{"code":"622926","name":"东乡族自治县"},{"code":"622927","name":"积石山保安族东乡族撒拉族自治县"}]},{"code":"623000","name":"甘南藏族自治州","list":[{"code":"623001","name":"合作市"},{"code":"623021","name":"临潭县"},{"code":"623022","name":"卓尼县"},{"code":"623023","name":"舟曲县"},{"code":"623024","name":"迭部县"},{"code":"623025","name":"玛曲县"},{"code":"623026","name":"碌曲县"},{"code":"623027","name":"夏河县"}]}]},{"code":"630000","name":"青海省","list":[{"code":"630100","name":"西宁市","list":[{"code":"630102","name":"城东区"},{"code":"630103","name":"城中区"},{"code":"630104","name":"城西区"},{"code":"630105","name":"城北区"},{"code":"630106","name":"湟中区"},{"code":"630121","name":"大通回族土族自治县"},{"code":"630123","name":"湟源县"}]},{"code":"630200","name":"海东市","list":[{"code":"630202","name":"乐都区"},{"code":"630203","name":"平安区"},{"code":"630222","name":"民和回族土族自治县"},{"code":"630223","name":"互助土族自治县"},{"code":"630224","name":"化隆回族自治县"},{"code":"630225","name":"循化撒拉族自治县"}]},{"code":"632200","name":"海北藏族自治州","list":[{"code":"632221","name":"门源回族自治县"},{"code":"632222","name":"祁连县"},{"code":"632223","name":"海晏县"},{"code":"632224","name":"刚察县"}]},{"code":"632300","name":"黄南藏族自治州","list":[{"code":"632301","name":"同仁市"},{"code":"632322","name":"尖扎县"},{"code":"632323","name":"泽库县"},{"code":"632324","name":"河南蒙古族自治县"}]},{"code":"632500","name":"海南藏族自治州","list":[{"code":"632521","name":"共和县"},{"code":"632522","name":"同德县"},{"code":"632523","name":"贵德县"},{"code":"632524","name":"兴海县"},{"code":"632525","name":"贵南县"}]},{"code":"632600","name":"果洛藏族自治州","list":[{"code":"632621","name":"玛沁县"},{"code":"632622","name":"班玛县"},{"code":"632623","name":"甘德县"},{"code":"632624","name":"达日县"},{"code":"632625","name":"久治县"},{"code":"632626","name":"玛多县"}]},{"code":"632700","name":"玉树藏族自治州","list":[{"code":"632701","name":"玉树市"},{"code":"632722","name":"杂多县"},{"code":"632723","name":"称多县"},{"code":"632724","name":"治多县"},{"code":"632725","name":"囊谦县"},{"code":"632726","name":"曲麻莱县"}]},{"code":"632800","name":"海西蒙古族藏族自治州","list":[{"code":"632801","name":"格尔木市"},{"code":"632802","name":"德令哈市"},{"code":"632803","name":"茫崖市"},{"code":"632821","name":"乌兰县"},{"code":"632822","name":"都兰县"},{"code":"632823","name":"天峻县"},{"code":"632800105","name":"大柴旦镇"},{"code":"632800106","name":"锡铁山镇"}]}]},{"code":"640000","name":"宁夏回族自治区","list":[{"code":"640100","name":"银川市","list":[{"code":"640104","name":"兴庆区"},{"code":"640105","name":"西夏区"},{"code":"640106","name":"金凤区"},{"code":"640121","name":"永宁县"},{"code":"640122","name":"贺兰县"},{"code":"640181","name":"灵武市"}]},{"code":"640200","name":"石嘴山市","list":[{"code":"640202","name":"大武口区"},{"code":"640205","name":"惠农区"},{"code":"640221","name":"平罗县"}]},{"code":"640300","name":"吴忠市","list":[{"code":"640302","name":"利通区"},{"code":"640303","name":"红寺堡区"},{"code":"640323","name":"盐池县"},{"code":"640324","name":"同心县"},{"code":"640381","name":"青铜峡市"}]},{"code":"640400","name":"固原市","list":[{"code":"640402","name":"原州区"},{"code":"640422","name":"西吉县"},{"code":"640423","name":"隆德县"},{"code":"640424","name":"泾源县"},{"code":"640425","name":"彭阳县"}]},{"code":"640500","name":"中卫市","list":[{"code":"640502","name":"沙坡头区"},{"code":"640521","name":"中宁县"},{"code":"640522","name":"海原县"}]}]},{"code":"650000","name":"新疆维吾尔自治区","list":[{"code":"650100","name":"乌鲁木齐市","list":[{"code":"650102","name":"天山区"},{"code":"650103","name":"沙依巴克区"},{"code":"650104","name":"新市区"},{"code":"650105","name":"水磨沟区"},{"code":"650106","name":"头屯河区"},{"code":"650107","name":"达坂城区"},{"code":"650109","name":"米东区"},{"code":"650121","name":"乌鲁木齐县"}]},{"code":"650200","name":"克拉玛依市","list":[{"code":"650202","name":"独山子区"},{"code":"650203","name":"克拉玛依区"},{"code":"650204","name":"白碱滩区"},{"code":"650205","name":"乌尔禾区"}]},{"code":"650400","name":"吐鲁番市","list":[{"code":"650402","name":"高昌区"},{"code":"650421","name":"鄯善县"},{"code":"650422","name":"托克逊县"}]},{"code":"650500","name":"哈密市","list":[{"code":"650502","name":"伊州区"},{"code":"650521","name":"巴里坤哈萨克自治县"},{"code":"650522","name":"伊吾县"}]},{"code":"652300","name":"昌吉回族自治州","list":[{"code":"652301","name":"昌吉市"},{"code":"652302","name":"阜康市"},{"code":"652323","name":"呼图壁县"},{"code":"652324","name":"玛纳斯县"},{"code":"652325","name":"奇台县"},{"code":"652327","name":"吉木萨尔县"},{"code":"652328","name":"木垒哈萨克自治县"}]},{"code":"652700","name":"博尔塔拉蒙古自治州","list":[{"code":"652701","name":"博乐市"},{"code":"652702","name":"阿拉山口市"},{"code":"652722","name":"精河县"},{"code":"652723","name":"温泉县"}]},{"code":"652800","name":"巴音郭楞蒙古自治州","list":[{"code":"652801","name":"库尔勒市"},{"code":"652822","name":"轮台县"},{"code":"652823","name":"尉犁县"},{"code":"652824","name":"若羌县"},{"code":"652825","name":"且末县"},{"code":"652826","name":"焉耆回族自治县"},{"code":"652827","name":"和静县"},{"code":"652828","name":"和硕县"},{"code":"652829","name":"博湖县"}]},{"code":"652900","name":"阿克苏地区","list":[{"code":"652901","name":"阿克苏市"},{"code":"652902","name":"库车市"},{"code":"652922","name":"温宿县"},{"code":"652924","name":"沙雅县"},{"code":"652925","name":"新和县"},{"code":"652926","name":"拜城县"},{"code":"652927","name":"乌什县"},{"code":"652928","name":"阿瓦提县"},{"code":"652929","name":"柯坪县"}]},{"code":"653000","name":"克孜勒苏柯尔克孜自治州","list":[{"code":"653001","name":"阿图什市"},{"code":"653022","name":"阿克陶县"},{"code":"653023","name":"阿合奇县"},{"code":"653024","name":"乌恰县"}]},{"code":"653100","name":"喀什地区","list":[{"code":"653101","name":"喀什市"},{"code":"653121","name":"疏附县"},{"code":"653122","name":"疏勒县"},{"code":"653123","name":"英吉沙县"},{"code":"653124","name":"泽普县"},{"code":"653125","name":"莎车县"},{"code":"653126","name":"叶城县"},{"code":"653127","name":"麦盖提县"},{"code":"653128","name":"岳普湖县"},{"code":"653129","name":"伽师县"},{"code":"653130","name":"巴楚县"},{"code":"653131","name":"塔什库尔干塔吉克自治县"}]},{"code":"653200","name":"和田地区","list":[{"code":"653201","name":"和田市"},{"code":"653221","name":"和田县"},{"code":"653222","name":"墨玉县"},{"code":"653223","name":"皮山县"},{"code":"653224","name":"洛浦县"},{"code":"653225","name":"策勒县"},{"code":"653226","name":"于田县"},{"code":"653227","name":"民丰县"}]},{"code":"654000","name":"伊犁哈萨克自治州","list":[{"code":"654002","name":"伊宁市"},{"code":"654003","name":"奎屯市"},{"code":"654004","name":"霍尔果斯市"},{"code":"654021","name":"伊宁县"},{"code":"654022","name":"察布查尔锡伯自治县"},{"code":"654023","name":"霍城县"},{"code":"654024","name":"巩留县"},{"code":"654025","name":"新源县"},{"code":"654026","name":"昭苏县"},{"code":"654027","name":"特克斯县"},{"code":"654028","name":"尼勒克县"}]},{"code":"654200","name":"塔城地区","list":[{"code":"654201","name":"塔城市"},{"code":"654202","name":"乌苏市"},{"code":"654203","name":"沙湾市"},{"code":"654221","name":"额敏县"},{"code":"654224","name":"托里县"},{"code":"654225","name":"裕民县"},{"code":"654226","name":"和布克赛尔蒙古自治县"}]},{"code":"654300","name":"阿勒泰地区","list":[{"code":"654301","name":"阿勒泰市"},{"code":"654321","name":"布尔津县"},{"code":"654322","name":"富蕴县"},{"code":"654323","name":"福海县"},{"code":"654324","name":"哈巴河县"},{"code":"654325","name":"青河县"},{"code":"654326","name":"吉木乃县"}]},{"code":"659000","name":"胡杨河市","list":[{"code":"659010","name":"胡杨河市"}]},{"code":"659001","name":"石河子市","list":[{"code":"659001001","name":"新城街道"},{"code":"659001002","name":"向阳街道"},{"code":"659001003","name":"红山街道"},{"code":"659001004","name":"老街街道"},{"code":"659001005","name":"东城街道"},{"code":"659001100","name":"北泉镇"},{"code":"659001101","name":"石河子镇"},{"code":"659001500","name":"兵团一五二团"}]},{"code":"659002","name":"阿拉尔市","list":[{"code":"659002001","name":"金银川路街道"},{"code":"659002002","name":"幸福路街道"},{"code":"659002003","name":"青松路街道"},{"code":"659002004","name":"南口街道"},{"code":"659002100","name":"金银川镇"},{"code":"659002101","name":"新井子镇"},{"code":"659002102","name":"甘泉镇"},{"code":"659002103","name":"永宁镇"},{"code":"659002201","name":"托喀依乡"},{"code":"659002500","name":"兵团七团"},{"code":"659002501","name":"兵团八团"},{"code":"659002503","name":"兵团十团"},{"code":"659002504","name":"兵团十一团"},{"code":"659002505","name":"兵团十二团"},{"code":"659002506","name":"兵团十三团"},{"code":"659002507","name":"兵团十四团"},{"code":"659002509","name":"兵团十六团"},{"code":"659002510","name":"九团"}]},{"code":"659003","name":"图木舒克市","list":[{"code":"659003002","name":"前海街道"},{"code":"659003100","name":"草湖镇"},{"code":"659003504","name":"兵团四十四团"},{"code":"659003509","name":"兵团四十九团"},{"code":"659003510","name":"兵团五十团"},{"code":"659003511","name":"兵团五十一团"},{"code":"659003513","name":"兵团五十三团"}]},{"code":"659004","name":"五家渠市","list":[{"code":"659004001","name":"军垦路街道"},{"code":"659004002","name":"青湖路街道"},{"code":"659004003","name":"人民路街道"},{"code":"659004500","name":"兵团一零一团"},{"code":"659004501","name":"五家渠经济技术开区"},{"code":"659004502","name":"兵团一零三团"}]},{"code":"659005","name":"北屯市","list":[{"code":"659005500","name":"兵团一八八团"},{"code":"659005501","name":"兵团一八七团"},{"code":"659005502","name":"兵团一八三团"}]},{"code":"659006","name":"铁门关市","list":[{"code":"659006100","name":"博古其镇"},{"code":"659006101","name":"双丰镇"}]},{"code":"659007","name":"双河市","list":[{"code":"659007500","name":"兵团八十九团"},{"code":"659007501","name":"兵团八十六团"},{"code":"659007502","name":"兵团八十四团"},{"code":"659007503","name":"兵团八十一团"},{"code":"659007504","name":"兵团九十团"},{"code":"659007505","name":"兵团八十五团"}]},{"code":"659008","name":"可克达拉市","list":[{"code":"659008500","name":"兵团六十八团"},{"code":"659008501","name":"兵团六十六团(中心团场)"},{"code":"659008502","name":"兵团六十七团"},{"code":"659008503","name":"兵团六十三团"},{"code":"659008504","name":"兵团六十四团"}]},{"code":"659009","name":"昆玉市","list":[{"code":"659009000","name":"昆玉市"}]},{"code":"659100","name":"新星市","list":[{"code":"659111","name":"新星市"}]}]},{"code":"990000","name":"苏鲁交界","list":[{"code":"999900","name":"海域","list":[{"code":"999900997","name":"达山岛(达念山)"},{"code":"999900998","name":"车牛山"},{"code":"999900999","name":"平岛(平山岛)"}]}]}] \ No newline at end of file diff --git a/public/static/plugs/jquery/artplayer.min.js b/public/static/plugs/jquery/artplayer.min.js new file mode 100644 index 0000000..c16021c --- /dev/null +++ b/public/static/plugs/jquery/artplayer.min.js @@ -0,0 +1,7 @@ +/*! + * artplayer.js v5.0.9 + * Github: https://github.com/zhw2590582/ArtPlayer + * (c) 2017-2023 Harvey Zack + * Released under the MIT License. + */ +!function(e,t,r,a,o){var n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},i="function"==typeof n[a]&&n[a],s=i.cache||{},l="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function c(t,r){if(!s[t]){if(!e[t]){var o="function"==typeof n[a]&&n[a];if(!r&&o)return o(t,!0);if(i)return i(t,!0);if(l&&"string"==typeof t)return l(t);var p=new Error("Cannot find module '"+t+"'");throw p.code="MODULE_NOT_FOUND",p}d.resolve=function(r){var a=e[t][1][r];return null!=a?a:r},d.cache={};var u=s[t]=new c.Module(t);e[t][0].call(u.exports,d,u,u.exports,this)}return s[t].exports;function d(e){var t=d.resolve(e);return!1===t?{}:c(t)}}c.isParcelRequire=!0,c.Module=function(e){this.id=e,this.bundle=c,this.exports={}},c.modules=e,c.cache=s,c.parent=i,c.register=function(t,r){e[t]=[function(e,t){t.exports=r},{}]},Object.defineProperty(c,"root",{get:function(){return n[a]}}),n[a]=c;for(var p=0;pt.call(this,this))),X.DEBUG){const e=e=>console.log(`[ART.${this.id}] -> ${e}`);e("Version@"+X.version),e("Env@"+X.env),e("Build@"+X.build);for(let t=0;te("Event@"+t.type)))}Z.push(this)}static get instances(){return Z}static get version(){return"5.0.9"}static get env(){return"production"}static get build(){return"2023-05-14 11:10:25"}static get config(){return h.default}static get utils(){return p}static get scheme(){return d.default}static get Emitter(){return c.default}static get validator(){return s.default}static get kindOf(){return s.default.kindOf}static get html(){return g.default.html}static get option(){return{id:"",container:"#artplayer",url:"",poster:"",type:"",theme:"#f00",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:"",number:60,column:10,width:0,height:0},subtitle:{url:"",type:"",style:{},escape:!0,encoding:"utf-8",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:p.isSafari?"auto":"metadata"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}destroy(e=!0){this.events.destroy(),this.template.destroy(e),Z.splice(Z.indexOf(this),1),this.isDestroy=!0,this.emit("destroy")}}if(r.default=X,X.DEBUG=!1,X.CONTEXTMENU=!0,X.NOTICE_TIME=2e3,X.SETTING_WIDTH=250,X.SETTING_ITEM_WIDTH=200,X.SETTING_ITEM_HEIGHT=35,X.RESIZE_TIME=200,X.SCROLL_TIME=200,X.SCROLL_GAP=50,X.AUTO_PLAYBACK_MAX=10,X.AUTO_PLAYBACK_MIN=5,X.AUTO_PLAYBACK_TIMEOUT=3e3,X.RECONNECT_TIME_MAX=5,X.RECONNECT_SLEEP_TIME=1e3,X.CONTROL_HIDE_TIME=3e3,X.DBCLICK_TIME=300,X.DBCLICK_FULLSCREEN=!0,X.MOBILE_DBCLICK_PLAY=!0,X.MOBILE_CLICK_PLAY=!1,X.AUTO_ORIENTATION_TIME=200,X.INFO_LOOP_TIME=1e3,X.FAST_FORWARD_VALUE=3,X.FAST_FORWARD_TIME=1e3,X.TOUCH_MOVE_RATIO=.5,X.VOLUME_STEP=.1,X.SEEK_STEP=5,X.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],X.ASPECT_RATIO=["default","4:3","16:9"],X.FLIP=["normal","horizontal","vertical"],X.FULLSCREEN_WEB_IN_BODY=!1,"undefined"!=typeof document&&!document.getElementById("artplayer-style")){const e=p.createElement("style");e.id="artplayer-style",e.textContent=n.default,document.head.appendChild(e)}"undefined"!=typeof window&&(window.Artplayer=X)},{"bundle-text:./style/index.less":"0016T","option-validator":"bAWi2","./utils/emitter":"66mFZ","./utils":"71aH7","./scheme":"AKEiO","./config":"lyjeQ","./template":"X13Zf","./i18n":"3jKkj","./player":"a90nx","./control":"8Z0Uf","./contextmenu":"2KYsr","./info":"02ajl","./subtitle":"eSWto","./events":"jo4S1","./hotkey":"6NoFy","./layer":"6G6hZ","./loading":"3dsEe","./notice":"dWGTw","./mask":"5POkG","./icons":"6OeNg","./setting":"3eYNH","./storage":"2aaJe","./plugins":"8MTUM","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"0016T":[function(e,t,r){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#fff3;--art-hover-color:#ffffff80;--art-loaded-color:#fff3;--art-loop-color:#ffffffbf;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-loop-width:2px;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#00000080;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{width:100%;height:100%;zoom:1;text-align:left;direction:ltr;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;outline:0;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box;margin:0;padding:0}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{max-width:100%;vertical-align:top}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;width:100%;height:100%;cursor:pointer;position:absolute;inset:0}.art-poster{z-index:11;width:100%;height:100%;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;width:100%;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;width:100%;height:100%;pointer-events:none;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;width:100%;height:100%;pointer-events:none;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;width:100%;height:100%;pointer-events:none;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;width:100%;height:100%;pointer-events:none;justify-content:center;align-items:center;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player .art-bottom{z-index:60;width:100%;height:100%;opacity:0;pointer-events:none;justify-content:flex-end;gap:var(--art-bottom-gap);padding:0 var(--art-padding);transition:opacity var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{height:50%;width:100%;transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;width:100%;height:100%;width:0%;background-color:var(--art-hover-color);display:none;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;width:100%;height:100%;width:0%;background-color:var(--art-loaded-color);position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;width:100%;height:100%;width:0%;background-color:var(--art-theme);position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;width:100%;height:100%;pointer-events:none;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;width:100%;height:100%;pointer-events:auto;width:var(--art-highlight-width);transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);position:absolute;inset:0 auto 0 0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;bottom:10px;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom .art-progress .art-control-loop{z-index:0;width:100%;height:100%;pointer-events:none;display:none;position:absolute;inset:0}.art-bottom .art-progress .art-control-loop .art-loop-point{z-index:0;width:100%;height:100%;width:var(--art-loop-width);background-color:var(--art-loop-color);transform:translateX(calc(var(--art-loop-width)/-2))scaleY(1.5);position:absolute;inset:0 0 0 0%}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{height:100%;flex:1;justify-content:center;align-items:center;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{height:100%;width:100%;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{width:100%;cursor:pointer;flex:1;justify-content:center;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{width:2px;border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;width:100%;height:100%;background-color:var(--art-theme);position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;width:100%;height:100%;height:auto;padding:var(--art-padding);pointer-events:none;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);transform-origin:100% 100%;max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transform:scale(var(--art-settings-scale));transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{min-width:32px;height:24px;justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{height:3px;width:80px;appearance:none;background-color:#fff3;outline:none}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{width:250px;text-overflow:ellipsis;white-space:nowrap;user-select:all;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;width:320px;height:180px;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;width:100%;height:100%;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-droging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-mini-progress-bar{z-index:0;width:100%;height:100%;height:var(--art-mini-progress-height);background-color:var(--art-theme);display:flex;position:absolute;inset:auto 0 0}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-bottom{display:none!important}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-lock .art-layer-mini-progress-bar{display:flex!important}.art-video-player.art-control-show .art-layer-mini-progress-bar{display:none}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{width:100%;flex-shrink:0;justify-content:center;align-items:center;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:"";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:before,[aria-label=""]:after,[data-hint=""]:before,[data-hint=""]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],bAWi2:[function(e,t,r){t.exports=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return"undefined";if(null===r)return"null";var o=e(r);if("boolean"===o)return"boolean";if("string"===o)return"string";if("number"===o)return"number";if("symbol"===o)return"symbol";if("function"===o)return function(e){return"GeneratorFunction"===a(e)}(r)?"generatorfunction":"function";if(function(e){return Array.isArray?Array.isArray(e):e instanceof Array}(r))return"array";if(function(e){return!(!e.constructor||"function"!=typeof e.constructor.isBuffer)&&e.constructor.isBuffer(e)}(r))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(r))return"arguments";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(r))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(r))return"error";if(function(e){return e instanceof RegExp||"string"==typeof e.flags&&"boolean"==typeof e.ignoreCase&&"boolean"==typeof e.multiline&&"boolean"==typeof e.global}(r))return"regexp";switch(a(r)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if(function(e){return"function"==typeof e.throw&&"function"==typeof e.return&&"function"==typeof e.next}(r))return"generator";switch(o=t.call(r)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return o.slice(8,-1).toLowerCase().replace(/\s/g,"")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2n)),a.export(r,"queryAll",(()=>i)),a.export(r,"addClass",(()=>s)),a.export(r,"removeClass",(()=>l)),a.export(r,"hasClass",(()=>c)),a.export(r,"append",(()=>p)),a.export(r,"remove",(()=>u)),a.export(r,"setStyle",(()=>d)),a.export(r,"setStyles",(()=>f)),a.export(r,"getStyle",(()=>h)),a.export(r,"sublings",(()=>m)),a.export(r,"inverseClass",(()=>g)),a.export(r,"tooltip",(()=>v)),a.export(r,"isInViewport",(()=>y)),a.export(r,"includeFromEvent",(()=>b)),a.export(r,"replaceElement",(()=>x)),a.export(r,"createElement",(()=>w)),a.export(r,"getIcon",(()=>j));var o=e("./compatibility");function n(e,t=document){return t.querySelector(e)}function i(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function c(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML("beforeend",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function f(e,t){for(const r in t)d(e,r,t[r]);return e}function h(e,t,r=!0){const a=window.getComputedStyle(e,null).getPropertyValue(t);return r?parseFloat(a):a}function m(e){return Array.from(e.parentElement.children).filter((t=>t!==e))}function g(e,t){m(e).forEach((e=>l(e,t))),s(e,t)}function v(e,t,r="top"){o.isMobile||(e.setAttribute("aria-label",t),s(e,"hint--rounded"),s(e,`hint--${r}`))}function y(e,t=0){const r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,n=r.top-t<=a&&r.top+r.height+t>=0,i=r.left-t<=o+t&&r.left+r.width+t>=0;return n&&i}function b(e,t){return e.composedPath&&e.composedPath().indexOf(t)>-1}function x(e,t){return t.parentNode.replaceChild(e,t),e}function w(e){return document.createElement(e)}function j(e="",t=""){const r=w("i");return s(r,"art-icon"),s(r,`art-icon-${e}`),p(r,t),r}},{"./compatibility":"6ZTr6","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"6ZTr6":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r),a.export(r,"userAgent",(()=>o)),a.export(r,"isSafari",(()=>n)),a.export(r,"isWechat",(()=>i)),a.export(r,"isIE",(()=>s)),a.export(r,"isAndroid",(()=>l)),a.export(r,"isIOS",(()=>c)),a.export(r,"isIOS13",(()=>p)),a.export(r,"isMobile",(()=>u));const o="undefined"!=typeof navigator?navigator.userAgent:"",n=/^((?!chrome|android).)*safari/i.test(o),i=/MicroMessenger/i.test(o),s=/MSIE|Trident/i.test(o),l=/android/i.test(o),c=/iPad|iPhone|iPod/i.test(o)&&!window.MSStream,p=c||o.includes("Macintosh")&&navigator.maxTouchPoints>=1,u=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(o)||p},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],hwmZz:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r),a.export(r,"ArtPlayerError",(()=>o)),a.export(r,"errorHandle",(()=>n));class o extends Error{constructor(e,t){super(e),"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name="ArtPlayerError"}}function n(e,t){if(!e)throw new o(t);return e}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],inzwq:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");function o(e){return"WEBVTT \r\n\r\n".concat((t=e,t.replace(/(\d\d:\d\d:\d\d)[,.](\d+)/g,((e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=r+"00"),2===r.length&&(a=r+"0"),`${t},${a}`}))).replace(/\{\\([ibu])\}/g,"").replace(/\{\\([ibu])1\}/g,"<$1>").replace(/\{([ibu])\}/g,"<$1>").replace(/\{\/([ibu])\}/g,"").replace(/(\d\d:\d\d:\d\d),(\d\d\d)/g,"$1.$2").replace(/{[\s\S]*?}/g,"").concat("\r\n\r\n"));var t}function n(e){return URL.createObjectURL(new Blob([e],{type:"text/vtt"}))}function i(e){const t=new RegExp("Dialogue:\\s\\d,(\\d+:\\d\\d:\\d\\d.\\d\\d),(\\d+:\\d\\d:\\d\\d.\\d\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\s\\S]*)$","i");function r(e=""){return e.split(/[:.]/).map(((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?"0":":0")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`})).join("")}return`WEBVTT\n\n${e.split(/\r?\n/).map((e=>{const a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/{[\s\S]*?}/g,"").replace(/(\\N)/g,"\n").trim().split(/\r?\n/).map((e=>e.trim())).join("\n")}:null})).filter((e=>e)).map(((e,t)=>e?`${t+1}\n${e.start} --\x3e ${e.end}\n${e.text}`:"")).filter((e=>e.trim())).join("\n\n")}`}a.defineInteropFlag(r),a.export(r,"srtToVtt",(()=>o)),a.export(r,"vttToBlob",(()=>n)),a.export(r,"assToVtt",(()=>i))},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"6b7Ip":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");function o(e){return e.includes("?")?o(e.split("?")[0]):e.includes("#")?o(e.split("#")[0]):e.trim().toLowerCase().split(".").pop()}function n(e,t){const r=document.createElement("a");r.style.display="none",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}a.defineInteropFlag(r),a.export(r,"getExt",(()=>o)),a.export(r,"download",(()=>n))},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5NSdr":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r),a.export(r,"def",(()=>o)),a.export(r,"has",(()=>i)),a.export(r,"get",(()=>s)),a.export(r,"mergeDeep",(()=>l));const o=Object.defineProperty,{hasOwnProperty:n}=Object.prototype;function i(e,t){return n.call(e,t)}function s(e,t){return Object.getOwnPropertyDescriptor(e,t)}function l(...e){const t=e=>e&&"object"==typeof e&&!Array.isArray(e);return e.reduce(((e,r)=>(Object.keys(r).forEach((a=>{const o=e[a],n=r[a];Array.isArray(o)&&Array.isArray(n)?e[a]=o.concat(...n):t(o)&&t(n)?e[a]=l(o,n):e[a]=n})),e)),{})}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],epmNy:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");function o(e=0){return new Promise((t=>setTimeout(t,e)))}function n(e,t){let r;return function(...a){clearTimeout(r),r=setTimeout((()=>(r=null,e.apply(this,a))),t)}}function i(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout((function(){r=!1}),t))}}a.defineInteropFlag(r),a.export(r,"sleep",(()=>o)),a.export(r,"debounce",(()=>n)),a.export(r,"throttle",(()=>i))},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],gapRl:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");function o(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function n(e){return e.charAt(0).toUpperCase()+e.slice(1)}function i(e){return["string","number"].includes(typeof e)}function s(e){const t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map((e=>e<10?`0${e}`:String(e))).join(":")}function l(e){return e.replace(/[&<>'"]/g,(e=>({"&":"&","<":"<",">":">","'":"'",'"':"""}[e]||e)))}a.defineInteropFlag(r),a.export(r,"clamp",(()=>o)),a.export(r,"capitalize",(()=>n)),a.export(r,"isStringOrNumber",(()=>i)),a.export(r,"secondToTime",(()=>s)),a.export(r,"escape",(()=>l))},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],AKEiO:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r),a.export(r,"ComponentOption",(()=>d));var o=e("../utils");const n="array",i="boolean",s="string",l="number",c="object",p="function";function u(e,t,r){return(0,o.errorHandle)(t===s||t===l||e instanceof Element,`${r.join(".")} require '${s}' or 'Element' type`)}const d={html:u,disable:`?${i}`,name:`?${s}`,index:`?${l}`,style:`?${c}`,click:`?${p}`,mounted:`?${p}`,tooltip:`?${s}|${l}`,width:`?${l}`,selector:`?${n}`,onSelect:`?${p}`,switch:`?${i}`,onSwitch:`?${p}`,range:`?${n}`,onRange:`?${p}`,onChange:`?${p}`};r.default={id:s,container:u,url:s,poster:s,type:s,theme:s,lang:s,volume:l,isLive:i,muted:i,autoplay:i,autoSize:i,autoMini:i,loop:i,flip:i,playbackRate:i,aspectRatio:i,screenshot:i,setting:i,hotkey:i,pip:i,mutex:i,backdrop:i,fullscreen:i,fullscreenWeb:i,subtitleOffset:i,miniProgressBar:i,useSSR:i,playsInline:i,lock:i,fastForward:i,autoPlayback:i,autoOrientation:i,airplay:i,plugins:[p],layers:[d],contextmenu:[d],settings:[d],controls:[{...d,position:(e,t,r)=>{const a=["top","left","right"];return(0,o.errorHandle)(a.includes(e),`${r.join(".")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${i}`,html:s,url:s}],highlight:[{time:l,text:s}],thumbnails:{url:s,number:l,column:l,width:l,height:l},subtitle:{url:s,type:s,style:c,escape:i,encoding:s,onVttLoad:p},moreVideoAttr:c,i18n:c,icons:c,cssVar:c,customType:c}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],lyjeQ:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default={propertys:["audioTracks","autoplay","buffered","controller","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","error","loop","mediaGroup","muted","networkState","paused","playbackRate","played","preload","readyState","seekable","seeking","src","startDate","textTracks","videoTracks","volume"],methods:["addTextTrack","canPlayType","load","play","pause"],events:["abort","canplay","canplaythrough","durationchange","emptied","ended","error","loadeddata","loadedmetadata","loadstart","pause","play","playing","progress","ratechange","seeked","seeking","stalled","suspend","timeupdate","volumechange","waiting"],prototypes:["width","height","videoWidth","videoHeight","poster","webkitDecodedFrameCount","webkitDroppedFrameCount","playsInline","webkitSupportsFullscreen","webkitDisplayingFullscreen","onenterpictureinpicture","onleavepictureinpicture","disablePictureInPicture","cancelVideoFrameCallback","requestVideoFrameCallback","getVideoPlaybackQuality","requestPictureInPicture","webkitEnterFullScreen","webkitEnterFullscreen","webkitExitFullScreen","webkitExitFullscreen"]}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],X13Zf:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("./utils");class o{constructor(e){this.art=e;const{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,a.query)(t.container),(0,a.errorHandle)(this.$container,`No container element found by ${t.container}`));const o=this.$container.tagName.toLowerCase();(0,a.errorHandle)("div"===o,`Unsupported container element type, only support 'div' but got '${o}'`),(0,a.errorHandle)(r.instances.every((e=>e.template.$container!==this.$container)),"Cannot mount multiple instances on the same dom element"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.$original=this.$container.cloneNode(!0),this.init()}static get html(){return'
    Player version:
    5.0.9
    Video url:
    Video volume:
    Video time:
    Video duration:
    Video resolution:
    x
    [x]
    '}query(e){return(0,a.query)(e,this.$container)}init(){const{option:e}=this.art;e.useSSR||(this.$container.innerHTML=o.html),this.$player=this.query(".art-video-player"),this.$video=this.query(".art-video"),this.$track=this.query("track"),this.$poster=this.query(".art-poster"),this.$subtitle=this.query(".art-subtitle"),this.$danmuku=this.query(".art-danmuku"),this.$bottom=this.query(".art-bottom"),this.$progress=this.query(".art-progress"),this.$controls=this.query(".art-controls"),this.$controlsLeft=this.query(".art-controls-left"),this.$controlsCenter=this.query(".art-controls-center"),this.$controlsRight=this.query(".art-controls-right"),this.$layer=this.query(".art-layers"),this.$loading=this.query(".art-loading"),this.$notice=this.query(".art-notice"),this.$noticeInner=this.query(".art-notice-inner"),this.$mask=this.query(".art-mask"),this.$state=this.query(".art-state"),this.$setting=this.query(".art-settings"),this.$info=this.query(".art-info"),this.$infoPanel=this.query(".art-info-panel"),this.$infoClose=this.query(".art-info-close"),this.$contextmenu=this.query(".art-contextmenus"),e.backdrop&&(0,a.addClass)(this.$player,"art-backdrop"),a.isMobile&&(0,a.addClass)(this.$player,"art-mobile")}destroy(e){e?(0,a.replaceElement)(this.$original,this.$container):(0,a.addClass)(this.$player,"art-destroy")}}r.default=o},{"./utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"3jKkj":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils"),n=e("./zh-cn.json"),i=a.interopDefault(n),s=e("./zh-tw.json"),l=a.interopDefault(s),c=e("./pl.json"),p=a.interopDefault(c),u=e("./cs.json"),d=a.interopDefault(u),f=e("./es.json"),h=a.interopDefault(f),m=e("./fa.json"),g=a.interopDefault(m),v=e("./fr.json"),y=a.interopDefault(v),b=e("./id.json"),x=a.interopDefault(b),w=e("./ru.json"),j=a.interopDefault(w);r.default=class{constructor(e){this.art=e,this.languages={"zh-cn":i.default,"zh-tw":l.default,pl:p.default,cs:d.default,es:h.default,fa:g.default,fr:y.default,id:x.default,ru:j.default},this.update(e.option.i18n)}init(){const e=this.art.option.lang.toLowerCase();this.language=this.languages[e]||{}}get(e){return this.language[e]||e}update(e){this.languages=(0,o.mergeDeep)(this.languages,e),this.init()}}},{"../utils":"71aH7","./zh-cn.json":"lNQi5","./zh-tw.json":"eRpom","./pl.json":"iEpPa","./cs.json":"dBgp3","./es.json":"dNIrL","./fa.json":"7Plhe","./fr.json":"kGNjI","./id.json":"6MQTw","./ru.json":"7LASr","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],lNQi5:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"统计信息","Close":"关闭","Video Load Failed":"加载失败","Volume":"音量","Play":"播放","Pause":"暂停","Rate":"速度","Mute":"静音","Video Flip":"画面翻转","Horizontal":"水平","Vertical":"垂直","Reconnect":"重新连接","Show Setting":"显示设置","Hide Setting":"隐藏设置","Screenshot":"截图","Play Speed":"播放速度","Aspect Ratio":"画面比例","Default":"默认","Normal":"正常","Open":"打开","Switch Video":"切换","Switch Subtitle":"切换字幕","Fullscreen":"全屏","Exit Fullscreen":"退出全屏","Web Fullscreen":"网页全屏","Exit Web Fullscreen":"退出网页全屏","Mini Player":"迷你播放器","PIP Mode":"开启画中画","Exit PIP Mode":"退出画中画","PIP Not Supported":"不支持画中画","Fullscreen Not Supported":"不支持全屏","Subtitle Offset":"字幕偏移","Last Seen":"上次看到","Jump Play":"跳转播放","AirPlay":"隔空播放","AirPlay Not Available":"隔空播放不可用"}')},{}],eRpom:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"統計訊息","Close":"關閉","Video Load Failed":"載入失敗","Volume":"音量","Play":"播放","Pause":"暫停","Rate":"速度","Mute":"靜音","Video Flip":"畫面翻轉","Horizontal":"水平","Vertical":"垂直","Reconnect":"重新連接","Show Setting":"顯示设置","Hide Setting":"隱藏设置","Screenshot":"截圖","Play Speed":"播放速度","Aspect Ratio":"畫面比例","Default":"默認","Normal":"正常","Open":"打開","Switch Video":"切換","Switch Subtitle":"切換字幕","Fullscreen":"全屏","Exit Fullscreen":"退出全屏","Web Fullscreen":"網頁全屏","Exit Web Fullscreen":"退出網頁全屏","Mini Player":"迷你播放器","PIP Mode":"開啟畫中畫","Exit PIP Mode":"退出畫中畫","PIP Not Supported":"不支持畫中畫","Fullscreen Not Supported":"不支持全屏","Subtitle Offset":"字幕偏移","Last Seen":"上次看到","Jump Play":"跳轉播放","AirPlay":"隔空播放","AirPlay Not Available":"隔空播放不可用"}')},{}],iEpPa:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Informacje o wideo","Close":"Zamknij","Video Load Failed":"Błąd ładowania wideo","Volume":"Głośność","Play":"Odtwórz","Pause":"Wstrzymaj","Rate":"Oceń","Mute":"Wycisz","Video Flip":"Rotacja wideo","Horizontal":"Pozioma","Vertical":"Pionowa","Reconnect":"Połącz ponownie","Show Setting":"Pokaż ustawienia","Hide Setting":"Ukryj ustawienia","Screenshot":"Zrzut ekranu","Play Speed":"Prędkość odtwarzania","Aspect Ratio":"Współczynnik proporcji","Default":"Domyślny","Normal":"Normalny","Open":"Otwórz","Switch Video":"Przełącz wideo","Switch Subtitle":"Przełącz napisy","Fullscreen":"Pełny ekran","Exit Fullscreen":"Zamknij pełny ekran","Web Fullscreen":"Tryb pełnej strony","Exit Web Fullscreen":"Zamknij tryb pełnej strony","Mini Player":"Miniodtwarzacz","PIP Mode":"Tryb PiP","Exit PIP Mode":"Zamknij tryb PiP","PIP Not Supported":"Tryb PiP nieobsługiwany","Fullscreen Not Supported":"Pełny ekran nieobsługiwany","Subtitle Offset":"Przesunięcie napisów","Last Seen":"Ostatnio widziany","Jump Play":"Skocz do gry","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay nie jest dostępny"}')},{}],dBgp3:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Info o videu","Close":"Zavřít","Video Load Failed":"Nahrání videa selhalo","Volume":"Hlasitost","Play":"Přehrát","Pause":"Pozastavit","Rate":"Hodnocení","Mute":"Ztlumit","Video Flip":"Otočit video","Horizontal":"Horizontálně","Vertical":"Vertikálně","Reconnect":"Opětovné připojení","Show Setting":"Zobrazit nastavení","Hide Setting":"Skrýt nastavení","Screenshot":"Snímek obrazovky","Play Speed":"Rychlost přehrávání","Aspect Ratio":"Poměr stran","Default":"Výchozí","Normal":"Normální","Open":"Otevřít","Switch Video":"Přepnout video","Switch Subtitle":"Přepnout titulky","Fullscreen":"Celá obrazovka","Exit Fullscreen":"Opustit režim celé obrazovky","Web Fullscreen":"Celá stránka","Exit Web Fullscreen":"Zavřít režim celé stránky","Mini Player":"Mini přehrávač","PIP Mode":"Režim PIP","Exit PIP Mode":"Opustit režim PIP","PIP Not Supported":"Režim PIP není podporován","Fullscreen Not Supported":"Režim celé obrazovky není podporován","Subtitle Offset":"Posun titulků","Last Seen":"Naposledy viděn","Jump Play":"Hra na skok","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay není k dispozici"}')},{}],dNIrL:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Información del video","Close":"Cerrar","Video Load Failed":"Falló carga de video","Volume":"Volumen","Play":"Reproduciendo","Pause":"Pausa","Rate":"Velocidad","Mute":"Silencio","Video Flip":"Rotar video","Horizontal":"Horizontal","Vertical":"Vertical","Reconnect":"Reconectando","Show Setting":"Mostrar ajustes","Hide Setting":"Ocultar ajustes","Screenshot":"Captura de Pantalla","Play Speed":"Velocidad de reproducción","Aspect Ratio":"Relación de aspecto","Default":"Por defecto","Normal":"Normal","Open":"Abrir","Switch Video":"Cambiar video","Switch Subtitle":"Cambiar subtítulo","Fullscreen":"Pantalla completa","Exit Fullscreen":"Salir de Pantalla completa","Web Fullscreen":"Pantalla completa Web","Exit Web Fullscreen":"Salir de Pantalla completa","Mini Player":"Mini reproductor","PIP Mode":"Modo PiP","Exit PIP Mode":"Cerrar modo PiP","PIP Not Supported":"Modo PiP no compatible","Fullscreen Not Supported":"Pantalla completa no soportada","Subtitle Offset":"Ajuste subtítulo","Last Seen":"Visto última vez","Jump Play":"Saltar","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay no disponible"}')},{}],"7Plhe":[function(e,t,r){t.exports=JSON.parse('{"Video Info":"اطلاعات ویدیو","Close":"بستن","Video Load Failed":"بارگذاری ناموفق","Play":"پخش","Volume":"میزان صدا","Pause":"توقف","Rate":"نرخ","Mute":"سکوت","Video Flip":"چرخش تصویر","Horizontal":"افقی","Vertical":"عمودی","Reconnect":"اتصال مجدد","Show Setting":"تنظیمات","Hide Setting":"بستن تنظیمات","Screenshot":"عکس از صفحه","Play Speed":"سرعت پخش","Aspect Ratio":"نسبت تصویر","Default":"حالت پیشفرض","Normal":" حالت عادی","Open":"بازکردن","Switch Video":"تغییر ویدیو","Switch Subtitle":"نغییر زیرنویس","Fullscreen":"تمام صفحه","Exit Fullscreen":"کوچک کردن","Web Fullscreen":"حالت تئاتر","Exit Web Fullscreen":"خروج از حالت تئاتر","Mini Player":"حالت پخش کوچک","PIP Mode":" مینی پلیر","Exit PIP Mode":"خروج از مینی پلیر","PIP Not Supported":"عدم پشتیبانی از مینی پلیر","Fullscreen Not Supported":"عدم پشتیبانی از حالت تمام صفحه","Subtitle Offset":"افست زیرنویس","Last Seen":"آخرین بازدید","Jump Play":"جامپ پلی","AirPlay":"ایر پلی","AirPlay Not Available":"عدم پشتیبانی از ایرپلی"}')},{}],kGNjI:[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Informations de la vidéo","Close":"Fermer","Video Load Failed":"Téléchargement de la vidéo échoué","Volume":"Volume","Play":"Lire","Pause":"Pause","Rate":"Vitesse","Mute":"Muet","Video Flip":"Rotation de la vidéo","Horizontal":"Horizontal","Vertical":"Vertical","Reconnect":"Reconnexion","Show Setting":"Afficher les paramètres","Hide Setting":"Cacher les paramètres","Screenshot":"Capture d\'écran","Play Speed":"Vitesse de lecture","Aspect Ratio":"Rapport d\'aspect","Default":"Défaut","Normal":"Normal","Open":"Ouvrir","Switch Video":"Basculer la vidéo","Switch Subtitle":"Basculer le sous-titre","Fullscreen":"Plein écran","Exit Fullscreen":"Quitter le plein écran","Web Fullscreen":"Plein écran Web","Exit Web Fullscreen":"Quitter le plein écran Web","Mini Player":"Mini lecteur","PIP Mode":"Mode PiP","Exit PIP Mode":"Fermer le mode PiP","PIP Not Supported":"Mode PiP non supporté","Fullscreen Not Supported":"Plein écran non supporté","Subtitle Offset":"Réglage des sous-titres","Last Seen":"Dernière position","Jump Play":"Continuer","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay non disponible"}')},{}],"6MQTw":[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Informasi Video","Close":"Tutup","Video Load Failed":"Gagal Memuat Video","Volume":"Volume","Play":"Putar","Pause":"Jeda","Rate":"Kecepatan","Mute":"Senyap","Video Flip":"Memutar Video","Horizontal":"Horizontal","Vertical":"Vertikal","Reconnect":"Menyambung Kembali","Show Setting":"Tampilkan Pengaturan","Hide Setting":"Sembunyikan Pengaturan","Screenshot":"Tangkapan Layar","Play Speed":"Kecepatan Putar","Aspect Ratio":"Rasio Aspek","Default":"Default","Normal":"Normal","Open":"Buka","Switch Video":"Ganti Video","Switch Subtitle":"Ganti Subtitle","Fullscreen":"Layar Penuh","Exit Fullscreen":"Keluar dari Layar Penuh","Web Fullscreen":"Layar Penuh Web","Exit Web Fullscreen":"Keluar dari Layar Penuh Web","Mini Player":"Pemutar Mini","PIP Mode":"Mode PIP","Exit PIP Mode":"Keluar dari Mode PIP","PIP Not Supported":"PIP Tidak Didukung","Fullscreen Not Supported":"Layar Penuh Tidak Didukung","Subtitle Offset":"Pergeseran Subtitle","Last Seen":"Terakhir Dilihat","Jump Play":"Lompat Putar","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay Tidak Tersedia"}')},{}],"7LASr":[function(e,t,r){t.exports=JSON.parse('{"Video Info":"Информация","Close":"Закрыть","Video Load Failed":"Ошибка загрузки видео","Volume":"Громкость","Play":"Играть","Pause":"Пауза","Rate":"Скорость","Mute":"Заглушить","Video Flip":"Развернуть видео","Horizontal":"Горизонтально","Vertical":"Вертикально","Reconnect":"Переподключенине","Show Setting":"Показать настройки","Hide Setting":"Скрыть настройки","Screenshot":"Скриншот","Play Speed":"Скорость воспроизведения","Aspect Ratio":"Соотношение сторон","Default":"По-умолчанию","Normal":"Нормальный","Open":"Открыть","Switch Video":"Переключить видео","Switch Subtitle":"Переключить субтитры","Fullscreen":"Полноэкранный режим","Exit Fullscreen":"Выход из полноэкранного режима","Web Fullscreen":"На все окно браузера","Exit Web Fullscreen":"Выход из режима полного окна","Mini Player":"Мини проигрыватель","PIP Mode":"Картинка в картинке","Exit PIP Mode":"Закрыть картинку в картинке","PIP Not Supported":"Картинка в картинке не поддерживается","Fullscreen Not Supported":"Полноэкранный режим не поддерживается","Subtitle Offset":"Настройка субтитров","Last Seen":"Последнее просмотренное","Jump Play":"Перейти","AirPlay":"AirPlay","AirPlay Not Available":"AirPlay недоступен"}')},{}],a90nx:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("./urlMix"),n=a.interopDefault(o),i=e("./attrMix"),s=a.interopDefault(i),l=e("./playMix"),c=a.interopDefault(l),p=e("./pauseMix"),u=a.interopDefault(p),d=e("./toggleMix"),f=a.interopDefault(d),h=e("./seekMix"),m=a.interopDefault(h),g=e("./volumeMix"),v=a.interopDefault(g),y=e("./currentTimeMix"),b=a.interopDefault(y),x=e("./durationMix"),w=a.interopDefault(x),j=e("./switchMix"),k=a.interopDefault(j),S=e("./playbackRateMix"),I=a.interopDefault(S),C=e("./aspectRatioMix"),P=a.interopDefault(C),$=e("./screenshotMix"),M=a.interopDefault($),T=e("./fullscreenMix"),E=a.interopDefault(T),F=e("./fullscreenWebMix"),A=a.interopDefault(F),z=e("./pipMix"),H=a.interopDefault(z),D=e("./loadedMix"),R=a.interopDefault(D),O=e("./playedMix"),L=a.interopDefault(O),V=e("./playingMix"),N=a.interopDefault(V),Y=e("./autoSizeMix"),_=a.interopDefault(Y),W=e("./rectMix"),q=a.interopDefault(W),B=e("./flipMix"),U=a.interopDefault(B),K=e("./miniMix"),G=a.interopDefault(K),Z=e("./loopMix"),X=a.interopDefault(Z),J=e("./posterMix"),Q=a.interopDefault(J),ee=e("./autoHeightMix"),te=a.interopDefault(ee),re=e("./cssVarMix"),ae=a.interopDefault(re),oe=e("./themeMix"),ne=a.interopDefault(oe),ie=e("./typeMix"),se=a.interopDefault(ie),le=e("./stateMix"),ce=a.interopDefault(le),pe=e("./subtitleOffsetMix"),ue=a.interopDefault(pe),de=e("./airplayMix"),fe=a.interopDefault(de),he=e("./qualityMix"),me=a.interopDefault(he),ge=e("./optionInit"),ve=a.interopDefault(ge),ye=e("./eventInit"),be=a.interopDefault(ye);r.default=class{constructor(e){(0,n.default)(e),(0,s.default)(e),(0,c.default)(e),(0,u.default)(e),(0,f.default)(e),(0,m.default)(e),(0,v.default)(e),(0,b.default)(e),(0,w.default)(e),(0,k.default)(e),(0,I.default)(e),(0,P.default)(e),(0,M.default)(e),(0,E.default)(e),(0,A.default)(e),(0,H.default)(e),(0,R.default)(e),(0,L.default)(e),(0,N.default)(e),(0,_.default)(e),(0,q.default)(e),(0,U.default)(e),(0,G.default)(e),(0,X.default)(e),(0,Q.default)(e),(0,te.default)(e),(0,ae.default)(e),(0,ne.default)(e),(0,se.default)(e),(0,ce.default)(e),(0,ue.default)(e),(0,fe.default)(e),(0,me.default)(e),(0,be.default)(e),(0,ve.default)(e)}}},{"./urlMix":"kQoac","./attrMix":"deCma","./playMix":"fOJuP","./pauseMix":"fzHAy","./toggleMix":"cBHxQ","./seekMix":"koAPr","./volumeMix":"6eyuR","./currentTimeMix":"faaWv","./durationMix":"5y91K","./switchMix":"iceD8","./playbackRateMix":"keKwh","./aspectRatioMix":"jihET","./screenshotMix":"36kPY","./fullscreenMix":"2GYOJ","./fullscreenWebMix":"5aYAP","./pipMix":"7EnIB","./loadedMix":"3N9mP","./playedMix":"et96R","./playingMix":"9DzzM","./autoSizeMix":"i1LDY","./rectMix":"IqARI","./flipMix":"7E7Vs","./miniMix":"gpugx","./loopMix":"f1hVG","./posterMix":"1SuFS","./autoHeightMix":"8x4te","./cssVarMix":"1CaTA","./themeMix":"2FqhO","./typeMix":"1fQQs","./stateMix":"iBOQW","./subtitleOffsetMix":"6vlBV","./airplayMix":"eftqT","./qualityMix":"5SdyX","./optionInit":"fCWZK","./eventInit":"f8Lv3","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],kQoac:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{option:t,template:{$video:r}}=e;(0,a.def)(e,"url",{get:()=>r.src,async set(o){if(o){const n=e.url,i=t.type||(0,a.getExt)(o),s=t.customType[i];i&&s?(await(0,a.sleep)(),e.loading.show=!0,s.call(e,r,o,e)):(URL.revokeObjectURL(n),r.src=o),n!==e.url&&(e.option.url=o,e.isReady&&n&&e.once("video:canplay",(()=>{e.emit("restart",o)})))}else await(0,a.sleep)(),e.loading.show=!0}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],deCma:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$video:t}}=e;(0,a.def)(e,"attr",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],fOJuP:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,notice:r,option:o,constructor:{instances:n},template:{$video:i}}=e;(0,a.def)(e,"play",{value:async function(){const a=await i.play();if(r.show=t.get("Play"),e.emit("play"),o.mutex)for(let t=0;te.playing?e.pause():e.play()})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],koAPr:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{notice:t}=e;(0,a.def)(e,"seek",{set(r){e.currentTime=r,e.emit("seek",e.currentTime),e.duration&&(t.show=`${(0,a.secondToTime)(e.currentTime)} / ${(0,a.secondToTime)(e.duration)}`)}}),(0,a.def)(e,"forward",{set(t){e.seek=e.currentTime+t}}),(0,a.def)(e,"backward",{set(t){e.seek=e.currentTime-t}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"6eyuR":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$video:t},i18n:r,notice:o,storage:n}=e;(0,a.def)(e,"volume",{get:()=>t.volume||0,set:e=>{t.volume=(0,a.clamp)(e,0,1),o.show=`${r.get("Volume")}: ${parseInt(100*t.volume,10)}`,0!==t.volume&&n.set("volume",t.volume)}}),(0,a.def)(e,"muted",{get:()=>t.muted,set:e=>{t.muted=e}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],faaWv:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{$video:t}=e.template;(0,a.def)(e,"currentTime",{get:()=>t.currentTime||0,set:r=>{r=parseFloat(r),Number.isNaN(r)||(t.currentTime=(0,a.clamp)(r,0,e.duration))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5y91K":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"duration",{get:()=>{const{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],iceD8:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){function t(t,r){return new Promise(((a,o)=>{if(t===e.url)return;const{playing:n,aspectRatio:i,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show="",e.once("video:error",o),e.once("video:canplay",(async()=>{e.playbackRate=s,e.aspectRatio=i,e.currentTime=r,n&&await e.play(),e.notice.show="",a()}))}))}(0,a.def)(e,"switchQuality",{value:r=>t(r,e.currentTime)}),(0,a.def)(e,"switchUrl",{value:e=>t(e,0)}),(0,a.def)(e,"switch",{set:e.switchUrl})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],keKwh:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$video:t},i18n:r,notice:o}=e;(0,a.def)(e,"playbackRate",{get:()=>t.playbackRate,set(a){if(a){if(a===t.playbackRate)return;t.playbackRate=a,o.show=`${r.get("Rate")}: ${1===a?r.get("Normal"):`${a}x`}`}else e.playbackRate=1}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],jihET:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,notice:r,template:{$video:o,$player:n}}=e;(0,a.def)(e,"aspectRatio",{get:()=>n.dataset.aspectRatio||"default",set(i){if(i||(i="default"),"default"===i)(0,a.setStyle)(o,"width",null),(0,a.setStyle)(o,"height",null),(0,a.setStyle)(o,"margin",null),delete n.dataset.aspectRatio;else{const e=i.split(":").map(Number),{clientWidth:t,clientHeight:r}=n,s=t/r,l=e[0]/e[1];s>l?((0,a.setStyle)(o,"width",l*r+"px"),(0,a.setStyle)(o,"height","100%"),(0,a.setStyle)(o,"margin","0 auto")):((0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height",t/l+"px"),(0,a.setStyle)(o,"margin","auto 0")),n.dataset.aspectRatio=i}r.show=`${t.get("Aspect Ratio")}: ${"default"===i?t.get("Default"):i}`,e.emit("aspectRatio",i)}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"36kPY":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{notice:t,template:{$video:r}}=e,o=(0,a.createElement)("canvas");(0,a.def)(e,"getDataURL",{value:()=>new Promise(((e,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext("2d").drawImage(r,0,0),e(o.toDataURL("image/png"))}catch(e){t.show=e,a(e)}}))}),(0,a.def)(e,"getBlobUrl",{value:()=>new Promise(((e,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext("2d").drawImage(r,0,0),o.toBlob((t=>{e(URL.createObjectURL(t))}))}catch(e){t.show=e,a(e)}}))}),(0,a.def)(e,"screenshot",{value:async()=>{const t=await e.getDataURL();return(0,a.download)(t,`artplayer_${(0,a.secondToTime)(r.currentTime)}.png`),e.emit("screenshot",t),t}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"2GYOJ":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../libs/screenfull"),n=a.interopDefault(o),i=e("../utils");r.default=function(e){const{i18n:t,notice:r,template:{$video:a,$player:o}}=e;e.once("video:loadedmetadata",(()=>{n.default.isEnabled?(e=>{n.default.on("change",(()=>{e.emit("fullscreen",n.default.isFullscreen)})),(0,i.def)(e,"fullscreen",{get:()=>n.default.isFullscreen,async set(t){t?(e.state="fullscreen",await n.default.request(o),(0,i.addClass)(o,"art-fullscreen")):(await n.default.exit(),(0,i.removeClass)(o,"art-fullscreen")),e.emit("resize")}})})(e):document.fullscreenEnabled||a.webkitSupportsFullscreen?(e=>{(0,i.def)(e,"fullscreen",{get:()=>a.webkitDisplayingFullscreen,set(t){t?(e.state="fullscreen",a.webkitEnterFullscreen(),e.emit("fullscreen",!0)):(a.webkitExitFullscreen(),e.emit("fullscreen",!1)),e.emit("resize")}})})(e):(0,i.def)(e,"fullscreen",{get:()=>!1,set(){r.show=t.get("Fullscreen Not Supported")}}),(0,i.def)(e,"fullscreen",(0,i.get)(e,"fullscreen"))}))}},{"../libs/screenfull":"8v40z","../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"8v40z":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);const a=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],o=(()=>{if("undefined"==typeof document)return!1;const e=a[0],t={};for(const r of a){if(r[1]in document){for(const[a,o]of r.entries())t[e[a]]=o;return t}}return!1})(),n={change:o.fullscreenchange,error:o.fullscreenerror};let i={request:(e=document.documentElement,t)=>new Promise(((r,a)=>{const n=()=>{i.off("change",n),r()};i.on("change",n);const s=e[o.requestFullscreen](t);s instanceof Promise&&s.then(n).catch(a)})),exit:()=>new Promise(((e,t)=>{if(!i.isFullscreen)return void e();const r=()=>{i.off("change",r),e()};i.on("change",r);const a=document[o.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)})),toggle:(e,t)=>i.isFullscreen?i.exit():i.request(e,t),onchange(e){i.on("change",e)},onerror(e){i.on("error",e)},on(e,t){const r=n[e];r&&document.addEventListener(r,t,!1)},off(e,t){const r=n[e];r&&document.removeEventListener(r,t,!1)},raw:o};Object.defineProperties(i,{isFullscreen:{get:()=>Boolean(document[o.fullscreenElement])},element:{enumerable:!0,get:()=>document[o.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>Boolean(document[o.fullscreenEnabled])}}),o||(i={isEnabled:!1}),r.default=i},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5aYAP":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{constructor:t,template:{$container:r,$player:o}}=e;let n="";(0,a.def)(e,"fullscreenWeb",{get:()=>(0,a.hasClass)(o,"art-fullscreen-web"),set(i){i?(n=o.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(document.body,o),e.state="fullscreenWeb",(0,a.setStyle)(o,"width","100%"),(0,a.setStyle)(o,"height","100%"),(0,a.addClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,a.append)(r,o),n&&(o.style.cssText=n,n=""),(0,a.removeClass)(o,"art-fullscreen-web"),e.emit("fullscreenWeb",!1)),e.emit("resize")}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"7EnIB":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,notice:r,template:{$video:o}}=e;document.pictureInPictureEnabled?function(e){const{template:{$video:t},proxy:r,notice:o}=e;t.disablePictureInPicture=!1,(0,a.def)(e,"pip",{get:()=>document.pictureInPictureElement,set(r){r?(e.state="pip",t.requestPictureInPicture().catch((e=>{throw o.show=e,e}))):document.exitPictureInPicture().catch((e=>{throw o.show=e,e}))}}),r(t,"enterpictureinpicture",(()=>{e.emit("pip",!0)})),r(t,"leavepictureinpicture",(()=>{e.emit("pip",!1)}))}(e):o.webkitSupportsPresentationMode?function(e){const{$video:t}=e.template;t.webkitSetPresentationMode("inline"),(0,a.def)(e,"pip",{get:()=>"picture-in-picture"===t.webkitPresentationMode,set(r){r?(e.state="pip",t.webkitSetPresentationMode("picture-in-picture"),e.emit("pip",!0)):(t.webkitSetPresentationMode("inline"),e.emit("pip",!1))}})}(e):(0,a.def)(e,"pip",{get:()=>!1,set(){r.show=t.get("PIP Not Supported")}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"3N9mP":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{$video:t}=e.template;(0,a.def)(e,"loaded",{get:()=>e.loadedTime/t.duration}),(0,a.def)(e,"loadedTime",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],et96R:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"played",{get:()=>e.currentTime/e.duration})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"9DzzM":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{$video:t}=e.template;(0,a.def)(e,"playing",{get:()=>!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],i1LDY:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{$container:t,$player:r,$video:o}=e.template;(0,a.def)(e,"autoSize",{value(){const{videoWidth:n,videoHeight:i}=o,{width:s,height:l}=t.getBoundingClientRect(),c=n/i;if(s/l>c){const e=l*c/s*100;(0,a.setStyle)(r,"width",`${e}%`),(0,a.setStyle)(r,"height","100%")}else{const e=s/c/l*100;(0,a.setStyle)(r,"width","100%"),(0,a.setStyle)(r,"height",`${e}%`)}e.emit("autoSize",{width:e.width,height:e.height})}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],IqARI:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"rect",{get:()=>e.template.$player.getBoundingClientRect()});const t=["bottom","height","left","right","top","width"];for(let r=0;re.rect[o]})}(0,a.def)(e,"x",{get:()=>e.left+window.pageXOffset}),(0,a.def)(e,"y",{get:()=>e.top+window.pageYOffset})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"7E7Vs":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$player:t},i18n:r,notice:o}=e;(0,a.def)(e,"flip",{get:()=>t.dataset.flip||"normal",set(n){n||(n="normal"),"normal"===n?delete t.dataset.flip:t.dataset.flip=n,o.show=`${r.get("Video Flip")}: ${r.get((0,a.capitalize)(n))}`,e.emit("flip",n)}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],gpugx:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{icons:t,proxy:r,storage:o,template:{$player:n,$video:i}}=e;let s=!1,l=0,c=0;function p(){const{$mini:t}=e.template;t&&((0,a.removeClass)(n,"art-mini"),(0,a.setStyle)(t,"display","none"),n.prepend(i),e.emit("mini",!1))}function u(t,r){e.playing?((0,a.setStyle)(t,"display","none"),(0,a.setStyle)(r,"display","flex")):((0,a.setStyle)(t,"display","flex"),(0,a.setStyle)(r,"display","none"))}function d(){const{$mini:t}=e.template,r=t.getBoundingClientRect(),n=window.innerHeight-r.height-50,i=window.innerWidth-r.width-50;o.set("top",n),o.set("left",i),(0,a.setStyle)(t,"top",`${n}px`),(0,a.setStyle)(t,"left",`${i}px`)}(0,a.def)(e,"mini",{get:()=>(0,a.hasClass)(n,"art-mini"),set(f){if(f){e.state="mini",(0,a.addClass)(n,"art-mini");const f=function(){const{$mini:n}=e.template;if(n)return(0,a.append)(n,i),(0,a.setStyle)(n,"display","flex");{const n=(0,a.createElement)("div");(0,a.addClass)(n,"art-mini-popup"),(0,a.append)(document.body,n),e.template.$mini=n,(0,a.append)(n,i);const d=(0,a.append)(n,'
    ');(0,a.append)(d,t.close),r(d,"click",p);const f=(0,a.append)(n,'
    '),h=(0,a.append)(f,t.play),m=(0,a.append)(f,t.pause);return r(h,"click",(()=>e.play())),r(m,"click",(()=>e.pause())),u(h,m),e.on("video:playing",(()=>u(h,m))),e.on("video:pause",(()=>u(h,m))),e.on("video:timeupdate",(()=>u(h,m))),r(n,"mousedown",(e=>{s=0===e.button,l=e.pageX,c=e.pageY})),e.on("document:mousemove",(e=>{if(s){(0,a.addClass)(n,"art-mini-droging");const t=e.pageX-l,r=e.pageY-c;(0,a.setStyle)(n,"transform",`translate(${t}px, ${r}px)`)}})),e.on("document:mouseup",(()=>{if(s){s=!1,(0,a.removeClass)(n,"art-mini-droging");const e=n.getBoundingClientRect();o.set("left",e.left),o.set("top",e.top),(0,a.setStyle)(n,"left",`${e.left}px`),(0,a.setStyle)(n,"top",`${e.top}px`),(0,a.setStyle)(n,"transform",null)}})),n}}(),h=o.get("top"),m=o.get("left");h&&m?((0,a.setStyle)(f,"top",`${h}px`),(0,a.setStyle)(f,"left",`${m}px`),(0,a.isInViewport)(f)||d()):d(),e.emit("mini",!0)}else p()}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],f1hVG:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){let t=[];(0,a.def)(e,"loop",{get:()=>t,set:r=>{if(Array.isArray(r)&&"number"==typeof r[0]&&"number"==typeof r[1]){const o=(0,a.clamp)(r[0],0,Math.min(r[1],e.duration)),n=(0,a.clamp)(r[1],o,e.duration);t=n-o>=1?[o,n]:[]}else t=[];e.emit("loop",t)}}),e.on("video:timeupdate",(()=>{t.length&&(e.currentTimet[1])&&(e.seek=t[0])}))}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"1SuFS":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$poster:t}}=e;(0,a.def)(e,"poster",{get:()=>{try{return t.style.backgroundImage.match(/"(.*)"/)[1]}catch(e){return""}},set(e){(0,a.setStyle)(t,"backgroundImage",`url(${e})`)}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"8x4te":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{template:{$container:t,$video:r}}=e;(0,a.def)(e,"autoHeight",{value(){const{clientWidth:o}=t,{videoHeight:n,videoWidth:i}=r,s=n*(o/i);(0,a.setStyle)(t,"height",s+"px"),e.emit("autoHeight",s)}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"1CaTA":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{$player:t}=e.template;(0,a.def)(e,"cssVar",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"2FqhO":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"theme",{get:()=>e.cssVar("--art-theme"),set(t){e.cssVar("--art-theme",t)}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"1fQQs":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"type",{get:()=>e.option.type,set(t){e.option.type=t}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],iBOQW:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const t=["mini","pip","fullscreen","fullscreenWeb"];(0,a.def)(e,"state",{get:()=>t.find((t=>e[t]))||"standard",set(r){for(let a=0;a{s=[]})),(0,a.def)(e,"subtitleOffset",{get:()=>i,set(a){if(o.$track&&o.$track.track){const l=Array.from(o.$track.track.cues);i=t(a,-5,5);for(let r=0;r{switch(e.availability){case"available":i=!0;break;case"not-available":i=!1}})):i=!1,(0,a.def)(e,"airplay",{value(){i?(n.webkitShowPlaybackTargetPicker(),e.emit("airplay")):r.show=t.get("AirPlay Not Available")}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5SdyX":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){(0,a.def)(e,"quality",{set(t){const{controls:r,notice:a,i18n:o}=e,n=t.find((e=>e.default))||t[0];r.update({name:"quality",position:"right",index:10,style:{marginRight:"10px"},html:n?n.html:"",selector:t,async onSelect(t){await e.switchQuality(t.url),a.show=`${o.get("Switch Video")}: ${t.html}`}})}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],fCWZK:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{option:t,storage:r,template:{$video:o,$poster:n}}=e;for(const r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(o.volume=(0,a.clamp)(t.volume,0,1));const i=r.get("volume");"number"==typeof i&&(o.volume=(0,a.clamp)(i,0,1)),t.poster&&(0,a.setStyle)(n,"backgroundImage",`url(${t.poster})`),t.autoplay&&(o.autoplay=t.autoplay),t.playsInline&&(o.playsInline=!0,o["webkit-playsinline"]=!0),t.theme&&(t.cssVar["--art-theme"]=t.theme);for(const r in t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],f8Lv3:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../config"),n=a.interopDefault(o),i=e("../utils");r.default=function(e){const{i18n:t,notice:r,option:a,constructor:o,proxy:s,template:{$player:l,$video:c,$poster:p}}=e;let u=0;for(let t=0;t{e.emit(`video:${t.type}`,t)}));e.on("video:canplay",(()=>{u=0,e.loading.show=!1})),e.once("video:canplay",(()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit("ready")})),e.on("video:ended",(()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)})),e.on("video:error",(async n=>{u{e.emit("resize"),i.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)})),e.on("video:loadstart",(()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0})),e.on("video:pause",(()=>{e.controls.show=!0,e.mask.show=!0})),e.on("video:play",(()=>{e.mask.show=!1,(0,i.setStyle)(p,"display","none")})),e.on("video:playing",(()=>{e.mask.show=!1})),e.on("video:progress",(()=>{e.playing&&(e.loading.show=!1)})),e.on("video:seeked",(()=>{e.loading.show=!1})),e.on("video:seeking",(()=>{e.loading.show=!0,e.mask.show=!1})),e.on("video:timeupdate",(()=>{e.mask.show=!1})),e.on("video:waiting",(()=>{e.loading.show=!0,e.mask.show=!1}))}},{"../config":"lyjeQ","../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"8Z0Uf":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils"),n=e("../utils/component"),i=a.interopDefault(n),s=e("./fullscreen"),l=a.interopDefault(s),c=e("./fullscreenWeb"),p=a.interopDefault(c),u=e("./pip"),d=a.interopDefault(u),f=e("./playAndPause"),h=a.interopDefault(f),m=e("./progress"),g=a.interopDefault(m),v=e("./time"),y=a.interopDefault(v),b=e("./volume"),x=a.interopDefault(b),w=e("./setting"),j=a.interopDefault(w),k=e("./thumbnails"),S=a.interopDefault(k),I=e("./screenshot"),C=a.interopDefault(I),P=e("./loop"),$=a.interopDefault(P),M=e("./airplay"),T=a.interopDefault(M);class E extends i.default{constructor(e){super(e),this.name="control";const{proxy:t,constructor:r,template:{$player:a}}=e;let n=Date.now();t(a,["click","mousemove","touchstart","touchmove"],(()=>{this.show=!0,(0,o.removeClass)(a,"art-hide-cursor"),(0,o.addClass)(a,"art-hover"),n=Date.now()})),e.on("video:timeupdate",(()=>{!e.isInput&&e.playing&&this.show&&Date.now()-n>=r.CONTROL_HIDE_TIME&&(this.show=!1,(0,o.addClass)(a,"art-hide-cursor"),(0,o.removeClass)(a,"art-hover"))})),this.init()}init(){const{option:e}=this.art;e.isLive||this.add((0,g.default)({name:"progress",position:"top",index:10})),!e.thumbnails.url||e.isLive||o.isMobile||this.add((0,S.default)({name:"thumbnails",position:"top",index:20})),this.add((0,$.default)({name:"loop",position:"top",index:30})),this.add((0,h.default)({name:"playAndPause",position:"left",index:10})),this.add((0,x.default)({name:"volume",position:"left",index:20})),e.isLive||this.add((0,y.default)({name:"time",position:"left",index:30})),e.quality.length&&(0,o.sleep)().then((()=>{this.art.quality=e.quality})),e.screenshot&&!o.isMobile&&this.add((0,C.default)({name:"screenshot",position:"right",index:20})),e.setting&&this.add((0,j.default)({name:"setting",position:"right",index:30})),e.pip&&this.add((0,d.default)({name:"pip",position:"right",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,T.default)({name:"airplay",position:"right",index:50})),e.fullscreenWeb&&this.add((0,p.default)({name:"fullscreenWeb",position:"right",index:60})),e.fullscreen&&this.add((0,l.default)({name:"fullscreen",position:"right",index:70}));for(let t=0;tNumber(e.dataset.index)>=Number(n.dataset.index)));p?p.insertAdjacentElement("beforebegin",n):(0,o.append)(this.$parent,n),t.html&&(0,o.append)(n,t.html),t.style&&(0,o.setStyles)(n,t.style),t.tooltip&&(0,o.tooltip)(n,t.tooltip);const u=[];if(t.click){const e=this.art.events.proxy(n,"click",(e=>{e.preventDefault(),t.click.call(this.art,this,e)}));u.push(e)}return t.selector&&["left","right"].includes(t.position)&&this.addSelector(t,n,u),this[r]=n,this.cache.set(r,{$ref:n,events:u,option:t}),t.mounted&&t.mounted.call(this.art,n),n}addSelector(e,t,r){const{hover:a,proxy:i}=this.art.events;(0,o.addClass)(t,"art-control-selector");const s=(0,o.createElement)("div");(0,o.addClass)(s,"art-selector-value"),(0,o.append)(s,e.html),t.innerText="",(0,o.append)(t,s);const l=e.selector.map(((e,t)=>`
    ${e.html}
    `)).join(""),c=(0,o.createElement)("div");(0,o.addClass)(c,"art-selector-list"),(0,o.append)(c,l),(0,o.append)(t,c);const p=()=>{const e=(0,o.getStyle)(t,"width")/2-(0,o.getStyle)(c,"width")/2;c.style.left=`${e}px`};a(t,p);const u=i(c,"click",(async t=>{const r=(t.composedPath()||[]).find((e=>(0,o.hasClass)(e,"art-selector-item")));if(!r)return;(0,o.inverseClass)(r,"art-current");const a=Number(r.dataset.index),i=e.selector[a]||{};if(s.innerText=r.innerText,e.onSelect){const a=await e.onSelect.call(this.art,i,r,t);(0,n.isStringOrNumber)(a)&&(s.innerHTML=a)}p()}));r.push(u)}remove(e){const t=this.cache.get(e);(0,i.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;e({...e,tooltip:t.i18n.get("Fullscreen"),mounted:e=>{const{proxy:r,icons:o,i18n:n}=t,i=(0,a.append)(e,o.fullscreenOn),s=(0,a.append)(e,o.fullscreenOff);(0,a.setStyle)(s,"display","none"),r(e,"click",(()=>{t.fullscreen=!t.fullscreen})),t.on("fullscreen",(t=>{t?((0,a.tooltip)(e,n.get("Exit Fullscreen")),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(s,"display","inline-flex")):((0,a.tooltip)(e,n.get("Fullscreen")),(0,a.setStyle)(i,"display","inline-flex"),(0,a.setStyle)(s,"display","none"))}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"03jeB":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,tooltip:t.i18n.get("Web Fullscreen"),mounted:e=>{const{proxy:r,icons:o,i18n:n}=t,i=(0,a.append)(e,o.fullscreenWebOn),s=(0,a.append)(e,o.fullscreenWebOff);(0,a.setStyle)(s,"display","none"),r(e,"click",(()=>{t.fullscreenWeb=!t.fullscreenWeb})),t.on("fullscreenWeb",(t=>{t?((0,a.tooltip)(e,n.get("Exit Web Fullscreen")),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(s,"display","inline-flex")):((0,a.tooltip)(e,n.get("Web Fullscreen")),(0,a.setStyle)(i,"display","inline-flex"),(0,a.setStyle)(s,"display","none"))}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],u8l8e:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,tooltip:t.i18n.get("PIP Mode"),mounted:e=>{const{proxy:r,icons:o,i18n:n}=t;(0,a.append)(e,o.pip),r(e,"click",(()=>{t.pip=!t.pip})),t.on("pip",(t=>{(0,a.tooltip)(e,n.get(t?"Exit PIP Mode":"PIP Mode"))}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],ebXtb:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,mounted:e=>{const{proxy:r,icons:o,i18n:n}=t,i=(0,a.append)(e,o.play),s=(0,a.append)(e,o.pause);function l(){(0,a.setStyle)(i,"display","flex"),(0,a.setStyle)(s,"display","none")}function c(){(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(s,"display","flex")}(0,a.tooltip)(i,n.get("Play")),(0,a.tooltip)(s,n.get("Pause")),r(i,"click",(()=>{t.play()})),r(s,"click",(()=>{t.pause()})),t.playing?c():l(),t.on("video:playing",(()=>{c()})),t.on("video:pause",(()=>{l()}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],bgoVP:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r),a.export(r,"getPosFromEvent",(()=>n)),a.export(r,"setCurrentTime",(()=>i));var o=e("../utils");function n(e,t){const{$progress:r}=e.template,{left:a}=r.getBoundingClientRect(),n=o.isMobile?t.touches[0].clientX:t.clientX,i=(0,o.clamp)(n-a,0,r.clientWidth),s=i/r.clientWidth*e.duration;return{second:s,time:(0,o.secondToTime)(s),width:i,percentage:(0,o.clamp)(i/r.clientWidth,0,1)}}function i(e,t){if(e.isRotate){const r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit("setBar","played",r),e.seek=a}else{const{second:r,percentage:a}=n(e,t);e.emit("setBar","played",a),e.seek=r}}r.default=function(e){return t=>{const{icons:r,option:a,proxy:s}=t;return{...e,html:'
    ',mounted:e=>{let l=!1;const c=(0,o.query)(".art-progress-hover",e),p=(0,o.query)(".art-progress-loaded",e),u=(0,o.query)(".art-progress-played",e),d=(0,o.query)(".art-progress-highlight",e),f=(0,o.query)(".art-progress-indicator",e),h=(0,o.query)(".art-progress-tip",e);function m(e,t){"loaded"===e&&(0,o.setStyle)(p,"width",100*t+"%"),"played"===e&&((0,o.setStyle)(u,"width",100*t+"%"),(0,o.setStyle)(f,"left",100*t+"%"))}r.indicator?(0,o.append)(f,r.indicator):(0,o.setStyle)(f,"backgroundColor","var(--art-theme)"),t.on("video:loadedmetadata",(()=>{for(let e=0;e`;(0,o.append)(d,i)}})),m("loaded",t.loaded),t.on("setBar",((e,t)=>{m(e,t)})),t.on("video:progress",(()=>{m("loaded",t.loaded)})),t.on("video:timeupdate",(()=>{m("played",t.played)})),t.on("video:ended",(()=>{m("played",1)})),o.isMobile||(s(e,"click",(e=>{e.target!==f&&i(t,e)})),s(e,"mousemove",(r=>{!function(e){const{width:r}=n(t,e);(0,o.setStyle)(c,"width",`${r}px`),(0,o.setStyle)(c,"display","flex")}(r),(0,o.setStyle)(h,"display","flex"),(0,o.includeFromEvent)(r,d)?function(r){const{width:a}=n(t,r),{text:i}=r.target.dataset;h.innerHTML=i;const s=h.clientWidth;a<=s/2?(0,o.setStyle)(h,"left",0):a>e.clientWidth-s/2?(0,o.setStyle)(h,"left",e.clientWidth-s+"px"):(0,o.setStyle)(h,"left",a-s/2+"px")}(r):function(r){const{width:a,time:i}=n(t,r);h.innerHTML=i;const s=h.clientWidth;a<=s/2?(0,o.setStyle)(h,"left",0):a>e.clientWidth-s/2?(0,o.setStyle)(h,"left",e.clientWidth-s+"px"):(0,o.setStyle)(h,"left",a-s/2+"px")}(r)})),s(e,"mouseleave",(()=>{(0,o.setStyle)(h,"display","none"),(0,o.setStyle)(c,"display","none")})),s(e,"mousedown",(e=>{l=0===e.button})),t.on("document:mousemove",(e=>{if(l){const{second:r,percentage:a}=n(t,e);m("played",a),t.seek=r}})),t.on("document:mouseup",(()=>{l&&(l=!1)})))}}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],ikc2j:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,style:a.isMobile?{fontSize:"12px",padding:"0 5px"}:{cursor:"auto",padding:"0 10px"},mounted:e=>{function r(){const r=`${(0,a.secondToTime)(t.currentTime)} / ${(0,a.secondToTime)(t.duration)}`;r!==e.innerText&&(e.innerText=r)}r();const o=["video:loadedmetadata","video:timeupdate","video:progress"];for(let e=0;e({...e,mounted:e=>{const{proxy:r,icons:o}=t,n=(0,a.append)(e,o.volume),i=(0,a.append)(e,o.volumeClose),s=(0,a.append)(e,'
    '),l=(0,a.append)(s,'
    '),c=(0,a.append)(l,'
    '),p=(0,a.append)(l,'
    '),u=(0,a.append)(p,'
    '),d=(0,a.append)(u,'
    '),f=(0,a.append)(p,'
    ');function h(e){const{top:t,height:r}=p.getBoundingClientRect();return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,a.setStyle)(n,"display","none"),(0,a.setStyle)(i,"display","flex"),(0,a.setStyle)(f,"top","100%"),(0,a.setStyle)(d,"top","100%"),c.innerText=0;else{const e=100*t.volume;(0,a.setStyle)(n,"display","flex"),(0,a.setStyle)(i,"display","none"),(0,a.setStyle)(f,"top",100-e+"%"),(0,a.setStyle)(d,"top",100-e+"%"),c.innerText=Math.floor(e)}}if(m(),t.on("video:volumechange",m),r(n,"click",(()=>{t.muted=!0})),r(i,"click",(()=>{t.muted=!1})),a.isMobile)(0,a.setStyle)(s,"display","none");else{let e=!1;r(p,"mousedown",(r=>{e=0===r.button,t.volume=h(r)})),t.on("document:mousemove",(r=>{e&&(t.muted=!1,t.volume=h(r))})),t.on("document:mouseup",(()=>{e&&(e=!1)}))}}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"03o9l":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,tooltip:t.i18n.get("Show Setting"),mounted:e=>{const{proxy:r,icons:o,i18n:n}=t;(0,a.append)(e,o.setting),r(e,"click",(()=>{t.setting.toggle(),t.setting.updateStyle()})),t.on("setting",(t=>{(0,a.tooltip)(e,n.get(t?"Hide Setting":"Show Setting"))}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],eCVx2:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils"),o=e("./progress");r.default=function(e){return t=>({...e,mounted:e=>{const{option:r,template:{$progress:n,$video:i},events:{proxy:s,loadImg:l}}=t;let c=null,p=!1,u=!1;s(n,"mousemove",(async s=>{if(!p){p=!0;const e=await l(r.thumbnails.url);c=e,u=!0}u&&((0,a.setStyle)(e,"display","flex"),function(s){const{width:l}=(0,o.getPosFromEvent)(t,s),{url:p,number:u,column:d,width:f,height:h}=r.thumbnails,m=f||c.naturalWidth/d,g=h||m/(i.videoWidth/i.videoHeight),v=n.clientWidth/u,y=Math.floor(l/v),b=Math.ceil(y/d)-1,x=y%d||d-1;(0,a.setStyle)(e,"backgroundImage",`url(${p})`),(0,a.setStyle)(e,"height",`${g}px`),(0,a.setStyle)(e,"width",`${m}px`),(0,a.setStyle)(e,"backgroundPosition",`-${x*m}px -${b*g}px`),l<=m/2?(0,a.setStyle)(e,"left",0):l>n.clientWidth-m/2?(0,a.setStyle)(e,"left",n.clientWidth-m+"px"):(0,a.setStyle)(e,"left",l-m/2+"px")}(s))})),s(n,"mouseleave",(()=>{(0,a.setStyle)(e,"display","none")})),t.on("hover",(t=>{t||(0,a.setStyle)(e,"display","none")}))}})}},{"../utils":"71aH7","./progress":"bgoVP","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"4KCF5":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,tooltip:t.i18n.get("Screenshot"),mounted:e=>{const{proxy:r,icons:o}=t;(0,a.append)(e,o.screenshot),r(e,"click",(()=>{t.screenshot()}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"2hIff":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,mounted:e=>{const r=(0,a.append)(e,''),o=(0,a.append)(e,'');t.on("loop",(n=>{n&&n.length?((0,a.setStyle)(e,"display","flex"),(0,a.setStyle)(r,"left",`calc(${n[0]/t.duration*100}% - ${r.clientWidth}px)`),(0,a.setStyle)(o,"left",n[1]/t.duration*100+"%")):(0,a.setStyle)(e,"display","none")}))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"4IS2d":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>({...e,tooltip:t.i18n.get("AirPlay"),mounted:e=>{const{proxy:r,icons:o}=t;(0,a.append)(e,o.airplay),r(e,"click",(()=>t.airplay()))}})}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"2KYsr":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils"),n=e("../utils/component"),i=a.interopDefault(n),s=e("./playbackRate"),l=a.interopDefault(s),c=e("./aspectRatio"),p=a.interopDefault(c),u=e("./flip"),d=a.interopDefault(u),f=e("./info"),h=a.interopDefault(f),m=e("./version"),g=a.interopDefault(m),v=e("./close"),y=a.interopDefault(v);class b extends i.default{constructor(e){super(e),this.name="contextmenu",this.$parent=e.template.$contextmenu,o.isMobile||this.init()}init(){const{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,l.default)({name:"playbackRate",index:10})),e.aspectRatio&&this.add((0,p.default)({name:"aspectRatio",index:20})),e.flip&&this.add((0,d.default)({name:"flip",index:30})),this.add((0,h.default)({name:"info",index:40})),this.add((0,g.default)({name:"version",index:50})),this.add((0,y.default)({name:"close",index:60}));for(let t=0;t{if(e.preventDefault(),!this.art.constructor.CONTEXTMENU)return;this.show=!0;const t=e.clientX,n=e.clientY,{height:i,width:s,left:l,top:c}=r.getBoundingClientRect(),{height:p,width:u}=a.getBoundingClientRect();let d=t-l,f=n-c;t+u>l+s&&(d=s-u),n+p>c+i&&(f=i-p),(0,o.setStyles)(a,{top:`${f}px`,left:`${d}px`})})),t(r,"click",(e=>{(0,o.includeFromEvent)(e,a)||(this.show=!1)})),this.art.on("blur",(()=>{this.show=!1}))}}r.default=b},{"../utils":"71aH7","../utils/component":"18nVI","./playbackRate":"69eLi","./aspectRatio":"lUefg","./flip":"kysiM","./info":"gqIgJ","./version":"kRU7C","./close":"jQ8Pm","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"69eLi":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>{const{i18n:r,constructor:{PLAYBACK_RATE:o}}=t,n=o.map((e=>`${1===e?r.get("Normal"):e.toFixed(1)}`)).join("");return{...e,html:`${r.get("Play Speed")}: ${n}`,click:(e,r)=>{const{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{const r=(0,a.query)('[data-value="1"]',e);r&&(0,a.inverseClass)(r,"art-current"),t.on("video:ratechange",(()=>{const r=(0,a.queryAll)("span",e).find((e=>Number(e.dataset.value)===t.playbackRate));r&&(0,a.inverseClass)(r,"art-current")}))}}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],lUefg:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>{const{i18n:r,constructor:{ASPECT_RATIO:o}}=t,n=o.map((e=>`${"default"===e?r.get("Default"):e}`)).join("");return{...e,html:`${r.get("Aspect Ratio")}: ${n}`,click:(e,r)=>{const{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{const r=(0,a.query)('[data-value="default"]',e);r&&(0,a.inverseClass)(r,"art-current"),t.on("aspectRatio",(t=>{const r=(0,a.queryAll)("span",e).find((e=>e.dataset.value===t));r&&(0,a.inverseClass)(r,"art-current")}))}}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],kysiM:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){return t=>{const{i18n:r,constructor:{FLIP:o}}=t,n=o.map((e=>`${r.get((0,a.capitalize)(e))}`)).join("");return{...e,html:`${r.get("Video Flip")}: ${n}`,click:(e,r)=>{const{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{const r=(0,a.query)('[data-value="normal"]',e);r&&(0,a.inverseClass)(r,"art-current"),t.on("flip",(t=>{const r=(0,a.queryAll)("span",e).find((e=>e.dataset.value===t));r&&(0,a.inverseClass)(r,"art-current")}))}}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],gqIgJ:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e){return t=>({...e,html:t.i18n.get("Video Info"),click:e=>{t.info.show=!0,e.show=!1}})}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],kRU7C:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e){return{...e,html:'ArtPlayer 5.0.9'}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],jQ8Pm:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e){return t=>({...e,html:t.i18n.get("Close"),click:e=>{e.show=!1}})}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"02ajl":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("./utils"),n=e("./utils/component"),i=a.interopDefault(n);class s extends i.default{constructor(e){super(e),this.name="info",o.isMobile||this.init()}init(){const{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:n}}=this.art;e(a,"click",(()=>{this.show=!1}));let i=null;const s=(0,o.queryAll)("[data-video]",r)||[];this.art.on("destroy",(()=>clearTimeout(i))),function e(){for(let e=0;enull,this.init(e.option.subtitle);let t=!1;e.on("video:timeupdate",(()=>{if(!this.url)return;const e=this.art.template.$video.webkitDisplayingFullscreen;"boolean"==typeof e&&e!==t&&(t=e,this.createTrack(e?"subtitles":"metadata",this.url))}))}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video.textTracks[0]}get activeCue(){return this.textTrack.activeCues[0]}style(e,t){const{$subtitle:r}=this.art.template;return"object"==typeof e?(0,o.setStyles)(r,e):(0,o.setStyle)(r,e,t)}update(){const{$subtitle:e}=this.art.template;e.innerHTML="",this.activeCue&&(this.art.option.subtitle.escape?e.innerHTML=this.activeCue.text.split(/\r?\n/).map((e=>`

    ${(0,o.escape)(e)}

    `)).join(""):e.innerHTML=this.activeCue.text,this.art.emit("subtitleUpdate",this.activeCue.text))}async switch(e,t={}){const{i18n:r,notice:a,option:o}=this.art,n={...o.subtitle,...t,url:e},i=await this.init(n);return t.name&&(a.show=`${r.get("Switch Subtitle")}: ${t.name}`),i}createTrack(e,t){const{template:r,proxy:a}=this.art,{$video:n,$track:i}=r,s=(0,o.createElement)("track");s.default=!0,s.kind=e,s.src=t,s.track.mode="hidden",this.eventDestroy(),(0,o.remove)(i),(0,o.append)(n,s),r.$track=s,this.eventDestroy=a(this.textTrack,"cuechange",(()=>this.update()))}async init(e){const{notice:t,template:{$subtitle:r}}=this.art;if((0,l.default)(e,p.default.subtitle),e.url)return this.style(e.style),fetch(e.url).then((e=>e.arrayBuffer())).then((t=>{const r=new TextDecoder(e.encoding).decode(t);switch(this.art.emit("subtitleLoad",e.url),e.type||(0,o.getExt)(e.url)){case"srt":{const t=(0,o.srtToVtt)(r),a=e.onVttLoad(t);return(0,o.vttToBlob)(a)}case"ass":{const t=(0,o.assToVtt)(r),a=e.onVttLoad(t);return(0,o.vttToBlob)(a)}case"vtt":{const t=e.onVttLoad(r);return(0,o.vttToBlob)(t)}default:return e.url}})).then((e=>(r.innerHTML="",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack("metadata",e),this.art.emit("subtitleSwitch",e)),e))).catch((e=>{throw t.show=e,e}))}}r.default=u},{"./utils":"71aH7","./utils/component":"18nVI","option-validator":"bAWi2","./scheme":"AKEiO","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],jo4S1:[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils/error"),n=e("./clickInit"),i=a.interopDefault(n),s=e("./hoverInit"),l=a.interopDefault(s),c=e("./moveInit"),p=a.interopDefault(c),u=e("./resizeInit"),d=a.interopDefault(u),f=e("./gestureInit"),h=a.interopDefault(f),m=e("./viewInit"),g=a.interopDefault(m),v=e("./documentInit"),y=a.interopDefault(v);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),this.loadImg=this.loadImg.bind(this),(0,i.default)(e,this),(0,l.default)(e,this),(0,p.default)(e,this),(0,d.default)(e,this),(0,h.default)(e,this),(0,g.default)(e,this),(0,y.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map((t=>this.proxy(e,t,r,a)));e.addEventListener(t,r,a);const o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,"mouseenter",t),r&&this.proxy(e,"mouseleave",r)}loadImg(e){return new Promise(((t,r)=>{let a;if(e instanceof HTMLImageElement)a=e;else{if("string"!=typeof e)return r(new(0,o.ArtPlayerError)("Unable to get Image"));a=new Image,a.src=e}if(a.complete)return t(a);this.proxy(a,"load",(()=>t(a))),this.proxy(a,"error",(()=>r(new(0,o.ArtPlayerError)(`Failed to load Image: ${a.src}`))))}))}remove(e){const t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;e{(0,a.includeFromEvent)(t,o)?(e.isInput="INPUT"===t.target.tagName,e.isFocus=!0,e.emit("focus",t)):(e.isInput=!1,e.isFocus=!1,e.emit("blur",t))}));let i=0;t.proxy(n,"click",(t=>{const o=Date.now(),{MOBILE_CLICK_PLAY:n,DBCLICK_TIME:s,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r;o-i<=s?(e.emit("dblclick",t),a.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen)):(e.emit("click",t),a.isMobile?!e.isLock&&n&&e.toggle():e.toggle()),i=o}))}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"4jWHi":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e,t){const{$player:r}=e.template;t.hover(r,(t=>{(0,a.addClass)(r,"art-hover"),e.emit("hover",!0,t)}),(t=>{(0,a.removeClass)(r,"art-hover"),e.emit("hover",!1,t)}))}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],eqaUm:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e,t){const{$player:r}=e.template;t.proxy(r,"mousemove",(t=>{e.emit("mousemove",t)}))}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],eDXPO:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e,t){const{option:r,constructor:o}=e;e.on("resize",(()=>{const{aspectRatio:t,notice:a}=e;"standard"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=""}));const n=(0,a.debounce)((()=>e.emit("resize")),o.RESIZE_TIME);t.proxy(window,["orientationchange","resize"],(()=>n())),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,"change",(()=>n()))}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"95GtS":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils"),o=e("../control/progress");function n(e,t,r,a){var o=t-a,n=r-e,i=0;if(Math.abs(n)<2&&Math.abs(o)<2)return i;var s=function(e,t){return 180*Math.atan2(t,e)/Math.PI}(n,o);return s>=-45&&s<45?i=4:s>=45&&s<135?i=1:s>=-135&&s<-45?i=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(i=3),i}r.default=function(e,t){if(a.isMobile&&!e.option.isLive){const{$video:r,$progress:i}=e.template;let s=null,l=!1,c=0,p=0,u=0;const d=t=>{if(1===t.touches.length&&!e.isLock){s===i&&(0,o.setCurrentTime)(e,t),l=!0;const{pageX:r,pageY:a}=t.touches[0];c=r,p=a,u=e.currentTime}},f=t=>{if(1===t.touches.length&&l&&e.duration){const{pageX:o,pageY:i}=t.touches[0],l=n(c,p,o,i),d=[3,4].includes(l),f=[1,2].includes(l);if(d&&!e.isRotate||f&&e.isRotate){const t=(0,a.clamp)((o-c)/e.width,-1,1),n=(0,a.clamp)((i-p)/e.height,-1,1),l=e.isRotate?n:t,d=s===r?e.constructor.TOUCH_MOVE_RATIO:1,f=(0,a.clamp)(u+e.duration*l*d,0,e.duration);e.seek=f,e.emit("setBar","played",(0,a.clamp)(f/e.duration,0,1)),e.notice.show=`${(0,a.secondToTime)(f)} / ${(0,a.secondToTime)(e.duration)}`}}},h=()=>{l&&(c=0,p=0,u=0,l=!1,s=null)};t.proxy(i,"touchstart",(e=>{s=i,d(e)})),t.proxy(r,"touchstart",(e=>{s=r,d(e)})),t.proxy(r,"touchmove",f),t.proxy(i,"touchmove",f),t.proxy(document,"touchend",h)}}},{"../utils":"71aH7","../control/progress":"bgoVP","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],InUBx:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e,t){const{option:r,constructor:o,template:{$container:n}}=e,i=(0,a.throttle)((()=>{e.emit("view",(0,a.isInViewport)(n,o.SCROLL_GAP))}),o.SCROLL_TIME);t.proxy(window,"scroll",(()=>i())),e.on("view",(t=>{r.autoMini&&(e.mini=!t)}))}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],hoLfM:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e,t){t.proxy(document,"mousemove",(t=>{e.emit("document:mousemove",t)})),t.proxy(document,"mouseup",(t=>{e.emit("document:mouseup",t)}))}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"6NoFy":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("./utils");r.default=class{constructor(e){this.art=e,this.keys={},e.option.hotkey&&!a.isMobile&&this.init()}init(){const{proxy:e,constructor:t}=this.art;this.add(27,(()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)})),this.add(32,(()=>{this.art.toggle()})),this.add(37,(()=>{this.art.backward=t.SEEK_STEP})),this.add(38,(()=>{this.art.volume+=t.VOLUME_STEP})),this.add(39,(()=>{this.art.forward=t.SEEK_STEP})),this.add(40,(()=>{this.art.volume-=t.VOLUME_STEP})),e(window,"keydown",(e=>{if(this.art.isFocus){const t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==r&&"true"!==r){const t=this.keys[e.keyCode];if(t){e.preventDefault();for(let r=0;r{o.innerText="",(0,a.removeClass)(r,"art-notice-show")}),t.NOTICE_TIME)):(0,a.removeClass)(r,"art-notice-show")}}},{"./utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"5POkG":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("./utils"),n=e("./utils/component"),i=a.interopDefault(n);class s extends i.default{constructor(e){super(e),this.name="mask";const{template:t,icons:r,events:a}=e,n=(0,o.append)(t.$state,r.state),i=(0,o.append)(t.$state,r.error);(0,o.setStyle)(i,"display","none"),e.on("destroy",(()=>{(0,o.setStyle)(n,"display","none"),(0,o.setStyle)(i,"display",null)})),a.proxy(t.$state,"click",(()=>e.play()))}}r.default=s},{"./utils":"71aH7","./utils/component":"18nVI","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"6OeNg":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils"),n=e("bundle-text:./loading.svg"),i=a.interopDefault(n),s=e("bundle-text:./state.svg"),l=a.interopDefault(s),c=e("bundle-text:./check.svg"),p=a.interopDefault(c),u=e("bundle-text:./play.svg"),d=a.interopDefault(u),f=e("bundle-text:./pause.svg"),h=a.interopDefault(f),m=e("bundle-text:./volume.svg"),g=a.interopDefault(m),v=e("bundle-text:./volume-close.svg"),y=a.interopDefault(v),b=e("bundle-text:./screenshot.svg"),x=a.interopDefault(b),w=e("bundle-text:./setting.svg"),j=a.interopDefault(w),k=e("bundle-text:./arrow-left.svg"),S=a.interopDefault(k),I=e("bundle-text:./arrow-right.svg"),C=a.interopDefault(I),P=e("bundle-text:./playback-rate.svg"),$=a.interopDefault(P),M=e("bundle-text:./aspect-ratio.svg"),T=a.interopDefault(M),E=e("bundle-text:./config.svg"),F=a.interopDefault(E),A=e("bundle-text:./pip.svg"),z=a.interopDefault(A),H=e("bundle-text:./lock.svg"),D=a.interopDefault(H),R=e("bundle-text:./unlock.svg"),O=a.interopDefault(R),L=e("bundle-text:./fullscreen-off.svg"),V=a.interopDefault(L),N=e("bundle-text:./fullscreen-on.svg"),Y=a.interopDefault(N),_=e("bundle-text:./fullscreen-web-off.svg"),W=a.interopDefault(_),q=e("bundle-text:./fullscreen-web-on.svg"),B=a.interopDefault(q),U=e("bundle-text:./switch-on.svg"),K=a.interopDefault(U),G=e("bundle-text:./switch-off.svg"),Z=a.interopDefault(G),X=e("bundle-text:./flip.svg"),J=a.interopDefault(X),Q=e("bundle-text:./error.svg"),ee=a.interopDefault(Q),te=e("bundle-text:./close.svg"),re=a.interopDefault(te),ae=e("bundle-text:./airplay.svg"),oe=a.interopDefault(ae);r.default=class{constructor(e){const t={loading:i.default,state:l.default,play:d.default,pause:h.default,check:p.default,volume:g.default,volumeClose:y.default,screenshot:x.default,setting:j.default,pip:z.default,arrowLeft:S.default,arrowRight:C.default,playbackRate:$.default,aspectRatio:T.default,config:F.default,lock:D.default,flip:J.default,unlock:O.default,fullscreenOff:V.default,fullscreenOn:Y.default,fullscreenWebOff:W.default,fullscreenWebOn:B.default,switchOn:K.default,switchOff:Z.default,error:ee.default,close:re.default,airplay:oe.default,...e.option.icons};for(const e in t)(0,o.def)(this,e,{get:()=>(0,o.getIcon)(e,t[e])})}}},{"../utils":"71aH7","bundle-text:./loading.svg":"7tDub","bundle-text:./state.svg":"1ElZc","bundle-text:./check.svg":"lmgoP","bundle-text:./play.svg":"lVWoQ","bundle-text:./pause.svg":"5Mnax","bundle-text:./volume.svg":"w3eIa","bundle-text:./volume-close.svg":"rHjo1","bundle-text:./screenshot.svg":"2KcqM","bundle-text:./setting.svg":"8rQMV","bundle-text:./arrow-left.svg":"kqGBE","bundle-text:./arrow-right.svg":"aFjpC","bundle-text:./playback-rate.svg":"lx7ZM","bundle-text:./aspect-ratio.svg":"2sEjf","bundle-text:./config.svg":"fQTgE","bundle-text:./pip.svg":"2CaxO","bundle-text:./lock.svg":"aCGnW","bundle-text:./unlock.svg":"bTrAV","bundle-text:./fullscreen-off.svg":"bA3p0","bundle-text:./fullscreen-on.svg":"fTuY8","bundle-text:./fullscreen-web-off.svg":"tvKf4","bundle-text:./fullscreen-web-on.svg":"1F1oB","bundle-text:./switch-on.svg":"7qNHs","bundle-text:./switch-off.svg":"28aV8","bundle-text:./flip.svg":"1uXI6","bundle-text:./error.svg":"9f4dh","bundle-text:./close.svg":"4nTtS","bundle-text:./airplay.svg":"cDPXC","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"7tDub":[function(e,t,r){t.exports=''},{}],"1ElZc":[function(e,t,r){t.exports=''},{}],lmgoP:[function(e,t,r){t.exports=''},{}],lVWoQ:[function(e,t,r){t.exports=''},{}],"5Mnax":[function(e,t,r){t.exports=''},{}],w3eIa:[function(e,t,r){t.exports=''},{}],rHjo1:[function(e,t,r){t.exports=''},{}],"2KcqM":[function(e,t,r){t.exports=''},{}],"8rQMV":[function(e,t,r){t.exports=''},{}],kqGBE:[function(e,t,r){t.exports=''},{}],aFjpC:[function(e,t,r){t.exports=''},{}],lx7ZM:[function(e,t,r){t.exports=''},{}],"2sEjf":[function(e,t,r){t.exports=''},{}],fQTgE:[function(e,t,r){t.exports=''},{}],"2CaxO":[function(e,t,r){t.exports=''},{}],aCGnW:[function(e,t,r){t.exports=''},{}],bTrAV:[function(e,t,r){t.exports=''},{}],bA3p0:[function(e,t,r){t.exports=''},{}],fTuY8:[function(e,t,r){t.exports=''},{}],tvKf4:[function(e,t,r){t.exports=''},{}],"1F1oB":[function(e,t,r){t.exports=''},{}],"7qNHs":[function(e,t,r){t.exports=''},{}],"28aV8":[function(e,t,r){t.exports=''},{}],"1uXI6":[function(e,t,r){t.exports=''},{}],"9f4dh":[function(e,t,r){t.exports=''},{}],"4nTtS":[function(e,t,r){t.exports=''},{}],cDPXC:[function(e,t,r){t.exports=''},{}],"3eYNH":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("./flip"),n=a.interopDefault(o),i=e("./aspectRatio"),s=a.interopDefault(i),l=e("./playbackRate"),c=a.interopDefault(l),p=e("./subtitleOffset"),u=a.interopDefault(p),d=e("../utils/component"),f=a.interopDefault(d),h=e("../utils/error"),m=e("../utils");class g extends f.default{constructor(e){super(e);const{option:t,controls:r,template:{$setting:a}}=e;this.name="setting",this.$parent=a,this.option=[],this.events=[],this.cache=new Map,t.setting&&(this.init(),e.on("blur",(()=>{this.show&&(this.show=!1,this.render(this.option))})),e.on("focus",(e=>{const t=(0,m.includeFromEvent)(e,r.setting),a=(0,m.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render(this.option))})))}static makeRecursion(e,t,r){for(let a=0;a'),i=(0,m.createElement)("div");(0,m.addClass)(i,"art-setting-item-left-icon"),(0,m.append)(i,t.arrowLeft),(0,m.append)(n,i),(0,m.append)(n,e.$parentItem.html);const s=r(o,"click",(()=>this.render(e.$parentList)));return this.events.push(s),o}creatItem(e,t){const{icons:r,proxy:a,constructor:o}=this.art,n=(0,m.createElement)("div");(0,m.addClass)(n,"art-setting-item"),(0,m.setStyle)(n,"height",`${o.SETTING_ITEM_HEIGHT}px`),(0,m.isStringOrNumber)(t.name)&&(n.dataset.name=t.name),(0,m.isStringOrNumber)(t.value)&&(n.dataset.value=t.value);const i=(0,m.append)(n,'
    '),s=(0,m.append)(n,'
    '),l=(0,m.createElement)("div");switch((0,m.addClass)(l,"art-setting-item-left-icon"),e){case"switch":case"range":(0,m.append)(l,(0,m.isStringOrNumber)(t.icon)||t.icon instanceof Element?t.icon:r.config);break;case"selector":t.selector&&t.selector.length?(0,m.append)(l,(0,m.isStringOrNumber)(t.icon)||t.icon instanceof Element?t.icon:r.config):(0,m.append)(l,r.check)}(0,m.append)(i,l),t.$icon=l,(0,m.def)(t,"icon",{configurable:!0,get:()=>l.innerHTML,set(e){(0,m.isStringOrNumber)(e)&&(l.innerHTML=e)}});const c=(0,m.createElement)("div");(0,m.addClass)(c,"art-setting-item-left-text"),(0,m.append)(c,t.html||""),(0,m.append)(i,c),t.$html=c,(0,m.def)(t,"html",{configurable:!0,get:()=>c.innerHTML,set(e){(0,m.isStringOrNumber)(e)&&(c.innerHTML=e)}});const p=(0,m.createElement)("div");switch((0,m.addClass)(p,"art-setting-item-right-tooltip"),(0,m.append)(p,t.tooltip||""),(0,m.append)(s,p),t.$tooltip=p,(0,m.def)(t,"tooltip",{configurable:!0,get:()=>p.innerHTML,set(e){(0,m.isStringOrNumber)(e)&&(p.innerHTML=e)}}),e){case"switch":{const e=(0,m.createElement)("div");(0,m.addClass)(e,"art-setting-item-right-icon");const a=(0,m.append)(e,r.switchOn),o=(0,m.append)(e,r.switchOff);(0,m.setStyle)(t.switch?o:a,"display","none"),(0,m.append)(s,e),t.$switch=t.switch,(0,m.def)(t,"switch",{configurable:!0,get:()=>t.$switch,set(e){t.$switch=e,e?((0,m.setStyle)(o,"display","none"),(0,m.setStyle)(a,"display",null)):((0,m.setStyle)(o,"display",null),(0,m.setStyle)(a,"display","none"))}});break}case"range":{const e=(0,m.createElement)("div");(0,m.addClass)(e,"art-setting-item-right-icon");const r=(0,m.append)(e,'');r.value=t.range[0]||0,r.min=t.range[1]||0,r.max=t.range[2]||10,r.step=t.range[3]||1,(0,m.addClass)(r,"art-setting-range"),(0,m.append)(s,e),t.$range=r,(0,m.def)(t,"range",{configurable:!0,get:()=>r.valueAsNumber,set(e){r.value=Number(e)}})}break;case"selector":if(t.selector&&t.selector.length){const e=(0,m.createElement)("div");(0,m.addClass)(e,"art-setting-item-right-icon"),(0,m.append)(e,r.arrowRight),(0,m.append)(s,e)}}switch(e){case"switch":if(t.onSwitch){const e=a(n,"click",(async e=>{t.switch=await t.onSwitch.call(this.art,t,n,e)}));this.events.push(e)}break;case"range":if(t.$range){if(t.onRange){const e=a(t.$range,"change",(async e=>{t.tooltip=await t.onRange.call(this.art,t,n,e)}));this.events.push(e)}if(t.onChange){const e=a(t.$range,"input",(async e=>{t.tooltip=await t.onChange.call(this.art,t,n,e)}));this.events.push(e)}}break;case"selector":{const e=a(n,"click",(async e=>{if(t.selector&&t.selector.length)this.render(t.selector,t.width);else{(0,m.inverseClass)(n,"art-current");for(let e=0;ec?((0,m.setStyle)(o,"left",null),(0,m.setStyle)(o,"right",null)):((0,m.setStyle)(o,"left",`${p}px`),(0,m.setStyle)(o,"right","auto"))}}render(e,t){const{constructor:r}=this.art;if(this.cache.has(e)){const t=this.cache.get(e);(0,m.inverseClass)(t,"art-current"),(0,m.setStyle)(this.$parent,"width",`${t.dataset.width}px`),(0,m.setStyle)(this.$parent,"height",`${t.dataset.height}px`),this.updateStyle(Number(t.dataset.width))}else{const a=(0,m.createElement)("div");(0,m.addClass)(a,"art-setting-panel"),a.dataset.width=t||r.SETTING_WIDTH,a.dataset.height=e.length*r.SETTING_ITEM_HEIGHT,e[0]&&e[0].$parentItem&&((0,m.append)(a,this.creatHeader(e[0])),a.dataset.height=Number(a.dataset.height)+r.SETTING_ITEM_HEIGHT);for(let t=0;te.dataset.value===o));n&&(0,a.inverseClass)(n,"art-current")}return{width:o,name:"flip",html:t.get("Video Flip"),tooltip:t.get((0,a.capitalize)(e.flip)),icon:r.flip,selector:n.map((r=>({value:r,name:`aspect-ratio-${r}`,default:r===e.flip,html:t.get((0,a.capitalize)(r))}))),onSelect:t=>(e.flip=t.value,t.html),mounted:(t,r)=>{i(t,r.$tooltip,e.flip),e.on("flip",(()=>{i(t,r.$tooltip,e.flip)}))}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"84NBV":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:o,ASPECT_RATIO:n}}=e;function i(e){return"default"===e?t.get("Default"):e}function s(e,t,r){t&&(t.innerText=i(r));const o=(0,a.queryAll)(".art-setting-item",e).find((e=>e.dataset.value===r));o&&(0,a.inverseClass)(o,"art-current")}return{width:o,name:"aspect-ratio",html:t.get("Aspect Ratio"),icon:r.aspectRatio,tooltip:i(e.aspectRatio),selector:n.map((t=>({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)}))),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:(t,r)=>{s(t,r.$tooltip,e.aspectRatio),e.on("aspectRatio",(()=>{s(t,r.$tooltip,e.aspectRatio)}))}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],aetWt:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:o,PLAYBACK_RATE:n}}=e;function i(e){return 1===e?t.get("Normal"):e.toFixed(1)}function s(e,t,r){t&&(t.innerText=i(r));const o=(0,a.queryAll)(".art-setting-item",e).find((e=>Number(e.dataset.value)===r));o&&(0,a.inverseClass)(o,"art-current")}return{width:o,name:"playback-rate",html:t.get("Play Speed"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:n.map((t=>({value:t,name:`aspect-ratio-${t}`,default:t===e.playbackRate,html:i(t)}))),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:(t,r)=>{s(t,r.$tooltip,e.playbackRate),e.on("video:ratechange",(()=>{s(t,r.$tooltip,e.playbackRate)}))}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],fIBkO:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r),r.default=function(e){const{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:"subtitle-offset",html:t.get("Subtitle Offset"),icon:r.subtitle,tooltip:"0s",range:[0,-5,5,.1],onChange:t=>(e.subtitleOffset=t.range,t.range+"s")}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"2aaJe":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);r.default=class{constructor(){this.name="artplayer_settings",this.settings={}}get(e){try{const t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch(t){return e?this.settings[e]:this.settings}}set(e,t){try{const r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch(r){this.settings[e]=t}}del(e){try{const t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch(t){delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch(e){this.settings={}}}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"8MTUM":[function(e,t,r){var a=e("@parcel/transformer-js/src/esmodule-helpers.js");a.defineInteropFlag(r);var o=e("../utils"),n=e("./miniProgressBar"),i=a.interopDefault(n),s=e("./autoOrientation"),l=a.interopDefault(s),c=e("./autoPlayback"),p=a.interopDefault(c),u=e("./fastForward"),d=a.interopDefault(u),f=e("./lock"),h=a.interopDefault(f);r.default=class{constructor(e){this.art=e,this.id=0;const{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(i.default),t.lock&&o.isMobile&&this.add(h.default),t.autoPlayback&&!t.isLive&&this.add(p.default),t.autoOrientation&&o.isMobile&&this.add(l.default),t.fastForward&&o.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;e{e.layers.add({name:"mini-progress-bar",mounted(t){e.on("destroy",(()=>{t.style.display="none"})),e.on("video:timeupdate",(()=>{t.style.width=100*e.played+"%"})),e.on("setBar",((e,r)=>{"played"===e&&(t.style.width=100*r+"%")}))}})})),{name:"mini-progress-bar"}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],ePEg5:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{constructor:t,template:{$player:r,$video:o}}=e;return e.on("fullscreenWeb",(n=>{if(n){const{videoWidth:n,videoHeight:i}=o,{clientWidth:s,clientHeight:l}=document.documentElement;(n>i&&sl)&&setTimeout((()=>{(0,a.setStyle)(r,"width",`${l}px`),(0,a.setStyle)(r,"height",`${s}px`),(0,a.setStyle)(r,"transform-origin","0 0"),(0,a.setStyle)(r,"transform",`rotate(90deg) translate(0, -${s}px)`),(0,a.addClass)(r,"art-auto-orientation"),e.isRotate=!0,e.emit("resize")}),t.AUTO_ORIENTATION_TIME)}else(0,a.hasClass)(r,"art-auto-orientation")&&((0,a.removeClass)(r,"art-auto-orientation"),e.isRotate=!1,e.emit("resize"))})),e.on("fullscreen",(async e=>{const t=screen.orientation.type;if(e){const{videoWidth:e,videoHeight:n}=o,{clientWidth:i,clientHeight:s}=document.documentElement;if(e>n&&is){const e=t.startsWith("portrait")?"landscape":"portrait";await screen.orientation.lock(e),(0,a.addClass)(r,"art-auto-orientation-fullscreen")}}else(0,a.hasClass)(r,"art-auto-orientation-fullscreen")&&(await screen.orientation.lock(t),(0,a.removeClass)(r,"art-auto-orientation-fullscreen"))})),{name:"autoOrientation",get state(){return(0,a.hasClass)(r,"art-auto-orientation")}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],cVO99:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{i18n:t,icons:r,storage:o,constructor:n,proxy:i,template:{$poster:s}}=e,l=e.layers.add({name:"auto-playback",html:'
    '}),c=(0,a.query)(".art-auto-playback-last",l),p=(0,a.query)(".art-auto-playback-jump",l),u=(0,a.query)(".art-auto-playback-close",l);return e.on("video:timeupdate",(()=>{if(e.playing){const t=o.get("times")||{},r=Object.keys(t);r.length>n.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,o.set("times",t)}})),e.on("ready",(()=>{const d=(o.get("times")||{})[e.option.id||e.option.url];d&&d>=n.AUTO_PLAYBACK_MIN&&((0,a.append)(u,r.close),(0,a.setStyle)(l,"display","flex"),c.innerText=`${t.get("Last Seen")} ${(0,a.secondToTime)(d)}`,p.innerText=t.get("Jump Play"),i(u,"click",(()=>{(0,a.setStyle)(l,"display","none")})),i(p,"click",(()=>{e.seek=d,e.play(),(0,a.setStyle)(s,"display","none"),(0,a.setStyle)(l,"display","none")})),e.once("video:timeupdate",(()=>{setTimeout((()=>{(0,a.setStyle)(l,"display","none")}),n.AUTO_PLAYBACK_TIMEOUT)})))})),{name:"auto-playback",get times(){return o.get("times")||{}},clear:()=>o.del("times"),delete(e){const t=o.get("times")||{};return delete t[e],o.set("times",t),t}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],hFDwt:[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{constructor:t,proxy:r,template:{$player:o,$video:n}}=e;let i=null,s=!1,l=1;const c=()=>{clearTimeout(i),s&&(s=!1,e.playbackRate=l,(0,a.removeClass)(o,"art-fast-forward"))};return r(n,"touchstart",(r=>{1===r.touches.length&&e.playing&&!e.isLock&&(i=setTimeout((()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,a.addClass)(o,"art-fast-forward")}),t.FAST_FORWARD_TIME))})),r(document,"touchmove",c),r(document,"touchend",c),{name:"fastForward",get state(){return(0,a.hasClass)(o,"art-fast-forward")}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}],"1hsTH":[function(e,t,r){e("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(r);var a=e("../utils");r.default=function(e){const{layers:t,icons:r,template:{$player:o}}=e;return t.add({name:"lock",mounted(t){const o=(0,a.append)(t,r.lock),n=(0,a.append)(t,r.unlock);(0,a.setStyle)(o,"display","none"),e.on("lock",(e=>{e?((0,a.setStyle)(o,"display","inline-flex"),(0,a.setStyle)(n,"display","none")):((0,a.setStyle)(o,"display","none"),(0,a.setStyle)(n,"display","inline-flex"))}))},click(){(0,a.hasClass)(o,"art-lock")?((0,a.removeClass)(o,"art-lock"),this.isLock=!1,e.emit("lock",!1)):((0,a.addClass)(o,"art-lock"),this.isLock=!0,e.emit("lock",!0))}}),{name:"lock",get state(){return(0,a.hasClass)(o,"art-lock")}}}},{"../utils":"71aH7","@parcel/transformer-js/src/esmodule-helpers.js":"9pCYc"}]},["5lTcX"],"5lTcX","parcelRequire4dc0"); \ No newline at end of file diff --git a/public/static/plugs/jquery/autocompleter.css b/public/static/plugs/jquery/autocompleter.css new file mode 100644 index 0000000..29a66b7 --- /dev/null +++ b/public/static/plugs/jquery/autocompleter.css @@ -0,0 +1,79 @@ +.autocompleter { + left: 0; + top: 37px; + min-width: 100%; + z-index: 100; + background: #fff; + position: absolute; +} + +.autocompleter, .autocompleter-hint { + position: absolute +} + +.autocompleter-focus .autocompleter-list { + border: 1px solid #c9c9c9; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +.autocompleter-list { + margin: 0; + padding: 0; + text-align: left; + list-style: none; + box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.autocompleter-item { + color: #444; + cursor: pointer; + padding: 6px 12px; +} + +.autocompleter-item strong { + color: #00B83F; + font-weight: 400; +} + +.autocompleter-item span { + color: #aaa +} + +.autocompleter-item:hover, +.autocompleter-item-selected { + color: #fff; + background: #009688 !important; +} + +.autocompleter-item:hover span, +.autocompleter-item:hover strong, +.autocompleter-item-selected span, +.autocompleter-item-selected strong { + color: #fff; +} + +.autocompleter-hint { + left: 0; + top: -56px; + width: 100%; + color: #ccc; + display: none; + font-size: 24px; + text-align: left; + font-weight: 400; + padding: 12px 12px 12px 13px; +} + +.autocompleter-hint span { + color: transparent +} + +.autocompleter-hint-show { + display: block +} + +.autocompleter-closed { + display: none +} \ No newline at end of file diff --git a/public/static/plugs/jquery/autocompleter.min.js b/public/static/plugs/jquery/autocompleter.min.js new file mode 100644 index 0000000..d92a1cb --- /dev/null +++ b/public/static/plugs/jquery/autocompleter.min.js @@ -0,0 +1,8 @@ +/** + * jquery-autocompleter v0.3.0 - 2018-03-08 + * Easy customisable and with localStorage cache support. + * http://github.com/ArtemFitiskin/jquery-autocompleter + * + * @license (c) 2018 Artem Fitiskin MIT Licensed + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(t,o){var a=0,l=[9,13,17,19,20,27,33,34,35,36,37,39,44,92,113,114,115,118,119,120,122,123,144,145],n=["source","empty","limit","cache","cacheExpires","focusOpen","selectFirst","changeWhenSelect","highlightMatches","ignoredKeyCode","customLabel","customValue","template","offset","combine","callback","minLength","delay"],r=o.navigator.userAgent||o.navigator.vendor||o.opera,c=/Firefox/i.test(r),u=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(r),i=c&&u,s=null,p=null,m="autocompleterCache",d=function(){var e=void 0!==o.localStorage;if(e)try{localStorage.setItem("autocompleter","autocompleter"),localStorage.removeItem("autocompleter")}catch(t){e=!1}return e}(),f={source:null,asLocal:!1,empty:!0,limit:10,minLength:0,delay:0,customClass:[],cache:!0,cacheExpires:86400,focusOpen:!0,hint:!1,selectFirst:!1,changeWhenSelect:!0,highlightMatches:!1,ignoredKeyCode:[],customLabel:!1,customValue:!1,template:!1,offset:!1,combine:null,callback:t.noop},h={defaults:function(o){return f=t.extend(f,o||{}),"object"!==e(this)||t(this)},option:function(e){return t(this).each(function(o,a){var l=t(a).next(".autocompleter").data("autocompleter");for(var r in e)-1!==t.inArray(r,n)&&(l[r]=e[r])})},open:function(){return t(this).each(function(e,o){var a=t(o).next(".autocompleter").data("autocompleter");a&&S(null,a)})},close:function(){return t(this).each(function(e,o){var a=t(o).next(".autocompleter").data("autocompleter");a&&k(null,a)})},clearCache:function(){O()},destroy:function(){return t(this).each(function(e,o){var a=t(o).next(".autocompleter").data("autocompleter");a&&(a.jqxhr&&a.jqxhr.abort(),a.$autocompleter.hasClass("open")&&a.$autocompleter.find(".autocompleter-selected").trigger("click.autocompleter"),a.originalAutocomplete?a.$node.attr("autocomplete",a.originalAutocomplete):a.$node.removeAttr("autocomplete"),a.$node.off(".autocompleter").removeClass("autocompleter-node"),a.$autocompleter.off(".autocompleter").remove())})}};function v(e,o){if(!e.hasClass("autocompleter-node")){"string"!=typeof(o=t.extend({},o,e.data("autocompleter-options"))).source||".json"!==o.source.slice(-5)&&!0!==o.asLocal||t.ajax({url:o.source,type:"GET",dataType:"json",async:!1}).done(function(e){o.source=e});var l='
    ';o.hint&&(l+='
    '),l+='
      ',l+="
      ",e.addClass("autocompleter-node").after(l);var n=e.next(".autocompleter").eq(0),r=e.attr("autocomplete");e.attr("autocomplete","off");var c=t.extend({$node:e,$autocompleter:n,$selected:null,$list:null,index:-1,hintText:!1,source:!1,jqxhr:!1,response:null,focused:!1,query:"",originalAutocomplete:r,guid:a++},o);c.$autocompleter.on("mousedown.autocompleter",".autocompleter-item",c,E).data("autocompleter",c),c.$node.on("keyup.autocompleter",c,x).on("keydown.autocompleter",c,C).on("focus.autocompleter",c,w).on("blur.autocompleter",c,q).on("mousedown.autocompleter",c,j)}}function y(e){clearTimeout(p),e.query=t.trim(e.$node.val()),!e.empty&&0===e.query.length||e.minLength&&e.query.length1e3*t)&&a)}(this.url,o.cacheExpires);t&&(e.abort(),b(t,o))}}}).done(function(e){o.offset&&(e=function(e,t){t=t.split(".");for(;e&&t.length;)e=e[t.shift()];return e}(e,o.offset)),o.cache&&function(e,t){if(!d)return;if(e&&t){D[e]={value:t,timestamp:+new Date};try{localStorage.setItem(m,JSON.stringify(D))}catch(e){var o=e.code||e.number||e.message;if(22!==o)throw e;O()}}}(this.url,e),b(e,o)}).always(function(){o.$autocompleter.removeClass("autocompleter-ajax")})}}function g(e){e.response=null,e.$list=null,e.$selected=null,e.index=0,e.$autocompleter.find(".autocompleter-list").empty(),e.$autocompleter.find(".autocompleter-hint").removeClass("autocompleter-hint-show").empty(),e.hintText=!1,k(null,e)}function b(e,o){!function(e,o){for(var a="",l=0,n=e.length;l$&"):u;var s=o.customValue&&e[l][o.customValue]?e[l][o.customValue]:e[l].value;if(o.template){var p=o.template.replace(/({{ label }})/gi,u);for(var m in e[l])if(e[l].hasOwnProperty(m)){var d=new RegExp("{{ "+m+" }}","gi");p=p.replace(d,e[l][m])}u=p}a+=s?'
    • '+u+"
    • ":'
    • '+u+"
    • "}if(e.length&&o.hint){var f=o.customLabel&&e[0][o.customLabel]?e[0][o.customLabel]:e[0].label,h=f.substr(0,o.query.length).toUpperCase()===o.query.toUpperCase()&&f;if(h&&o.query!==f){var v=new RegExp(o.query,"i"),y=h.replace(v,""+o.query+"");o.$autocompleter.find(".autocompleter-hint").addClass("autocompleter-hint-show").html(y),o.hintText=y}}o.response=e,o.$autocompleter.find(".autocompleter-list").html(a),o.$selected=o.$autocompleter.find(".autocompleter-item-selected").length?o.$autocompleter.find(".autocompleter-item-selected"):null,o.$list=e.length?o.$autocompleter.find(".autocompleter-item"):null,o.index=o.$selected?o.$list.index(o.$selected):-1,o.$autocompleter.find(".autocompleter-item").each(function(e,a){t(a).data(o.response[e])})}(e,o),o.$autocompleter.hasClass("autocompleter-focus")&&S(null,o)}function x(e){var o=e.data,a=e.keyCode?e.keyCode:e.which;if(40!==a&&38!==a||!o.$autocompleter.hasClass("autocompleter-show"))-1===t.inArray(a,l)&&-1===t.inArray(a,o.ignoredKeyCode)&&y(o);else{var n,r,c=o.$list.length;c&&(c>1?o.index===c-1?(n=o.changeWhenSelect?-1:0,r=o.index-1):0===o.index?(n=o.index+1,r=o.changeWhenSelect?-1:c-1):-1===o.index?(n=0,r=c-1):(n=o.index+1,r=o.index-1):-1===o.index?(n=0,r=0):(r=-1,n=-1),o.index=40===a?n:r,o.$list.removeClass("autocompleter-item-selected"),-1!==o.index&&o.$list.eq(o.index).addClass("autocompleter-item-selected"),o.$selected=o.$autocompleter.find(".autocompleter-item-selected").length?o.$autocompleter.find(".autocompleter-item-selected"):null,o.changeWhenSelect&&A(o))}}function C(e){var t=e.data,o=e.keyCode?e.keyCode:e.which;if(40===o||38===o)e.preventDefault(),e.stopPropagation();else if(39===o){if(t.hint&&t.hintText&&t.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")){e.preventDefault(),e.stopPropagation();var a=!!t.$autocompleter.find(".autocompleter-item").length&&t.$autocompleter.find(".autocompleter-item").eq(0).attr("data-label");a&&(t.query=a,function(e){A(e),T(e),y(e)}(t))}}else 13===o&&t.$autocompleter.hasClass("autocompleter-show")&&t.$selected&&E(e)}function w(e,t){if(!t){var o=e.data;o.$autocompleter.addClass("autocompleter-focus"),o.$node.prop("disabled")||o.$autocompleter.hasClass("autocompleter-show")||o.focusOpen&&(y(o),o.focused=!0,setTimeout(function(){o.focused=!1},500))}}function q(e,t){e.preventDefault(),e.stopPropagation();var o=e.data;t||(o.$autocompleter.removeClass("autocompleter-focus"),k(e))}function j(e){if("mousedown"!==e.type||-1===t.inArray(e.which,[2,3])){var a=e.data;if(a.$list&&!a.focused&&!a.$node.is(":disabled"))if(u&&!i){var l=a.$select[0];if(o.document.createEvent){var n=o.document.createEvent("MouseEvents");n.initMouseEvent("mousedown",!1,!0,o,0,0,0,0,0,!1,!1,!1,!1,0,null),l.dispatchEvent(n)}else l.fireEvent&&l.fireEvent("onmousedown")}else a.$autocompleter.hasClass("autocompleter-closed")?S(e):a.$autocompleter.hasClass("autocompleter-show")&&k(e)}}function S(e,t){var o=e?e.data:t;!o.$node.prop("disabled")&&!o.$autocompleter.hasClass("autocompleter-show")&&o.$list&&o.$list.length&&(o.$autocompleter.removeClass("autocompleter-closed").addClass("autocompleter-show"),s.on("click.autocompleter-"+o.guid,":not(.autocompleter-item)",o,L))}function L(e){t(e.target).hasClass("autocompleter-node")||0===t(e.currentTarget).parents(".autocompleter").length&&k(e)}function k(e,t){var o=e?e.data:t;o.$autocompleter.hasClass("autocompleter-show")&&(o.$autocompleter.removeClass("autocompleter-show").addClass("autocompleter-closed"),s.off(".autocompleter-"+o.guid))}function E(e){if("mousedown"!==e.type||-1===t.inArray(e.which,[2,3])){var o=e.data;e.preventDefault(),e.stopPropagation(),"mousedown"===e.type&&t(this).length&&(o.$selected=t(this),o.index=o.$list.index(o.$selected)),o.$node.prop("disabled")||(k(e),function(e){A(e),T(e),g(e)}(o),"click"===e.type&&o.$node.trigger("focus",[!0]))}}function A(e){e.$selected?(e.hintText&&e.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")&&e.$autocompleter.find(".autocompleter-hint").removeClass("autocompleter-hint-show"),e.$node.val(e.$selected.attr("data-value")?e.$selected.attr("data-value"):e.$selected.attr("data-label"))):(e.hintText&&!e.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")&&e.$autocompleter.find(".autocompleter-hint").addClass("autocompleter-hint-show"),e.$node.val(e.query))}function T(e){e.callback.call(e.$autocompleter,e.$node.val(),e.index,e.response[e.index]),e.$node.trigger("change")}function P(){if(d)return JSON.parse(localStorage.getItem(m)||"{}")}function O(){try{localStorage.removeItem(m),D=P()}catch(e){throw e}}var D=P();t.fn.autocompleter=function(o){return h[o]?h[o].apply(this,Array.prototype.slice.call(arguments,1)):"object"!==(void 0===o?"undefined":e(o))&&o?this:function(e){e=t.extend({},f,e||{}),null===s&&(s=t("body"));for(var o=t(this),a=0,l=o.length;a>8-i%1*8)){if(n=a.charCodeAt(i+=.75),n>255)throw new t("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");o=o<<8|n}return d}),r.atob||(r.atob=function(r){var o=String(r).replace(/=+$/,"");if(o.length%4==1)throw new t("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,a,i=0,c=0,d="";a=o.charAt(c++);~a&&(n=i%4?64*n+a:a,i++%4)?d+=String.fromCharCode(255&n>>(-2*i&6)):0)a=e.indexOf(a);return d})}(); \ No newline at end of file diff --git a/public/static/plugs/jquery/compressor.min.js b/public/static/plugs/jquery/compressor.min.js new file mode 100644 index 0000000..8c00bc0 --- /dev/null +++ b/public/static/plugs/jquery/compressor.min.js @@ -0,0 +1,10 @@ +/*! + * Compressor.js v1.2.1 + * https://fengyuanchen.github.io/compressorjs + * + * Copyright 2018-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2023-02-28T14:09:41.732Z + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Compressor=t()}(this,function(){"use strict";function t(t,e){var r,i=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,r)),i}function n(i){for(var e=1;es.convertSize&&0<=s.convertTypes.indexOf(s.mimeType)&&(s.mimeType="image/jpeg"),"image/jpeg"===s.mimeType);h.fillStyle=m=U?"#fff":m,h.fillRect(0,0,y,w),s.beforeDraw&&s.beforeDraw.call(this,h,c),this.aborted||(h.save(),h.translate(y/2,w/2),h.rotate(t*Math.PI/180),h.scale(r,e),h.drawImage.apply(h,[l].concat(p)),h.restore(),s.drew&&s.drew.call(this,h,c),this.aborted)||(f=function(e){var i,t,r;n.aborted||(i=function(e){return n.done({naturalWidth:a,naturalHeight:o,result:e})},e&&U&&s.retainExif&&n.exif&&0i.size&&a.mimeType===i.type&&!(a.width>t||a.height>r||a.minWidth>t||a.minHeight>r||a.maxWidth=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)}); \ No newline at end of file diff --git a/public/static/plugs/jquery/jquery.min.js b/public/static/plugs/jquery/jquery.min.js new file mode 100644 index 0000000..e836475 --- /dev/null +++ b/public/static/plugs/jquery/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
      a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:l.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,v.closeAll("loading");break;case 4:r||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||v.closeAll("tips")}a.vessel(r,function(e,t,i){l.append(e[0]),r?2==o.type||4==o.type?h("body").append(e[1]):d.parents("."+u[0])[0]||(d.data("display",d.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+u[0]+s).find("."+u[5]).before(t)):l.append(e[1]),h("#"+u.MOVE)[0]||l.append(f.moveElem=i),a.layero=h("#"+u[0]+s),a.shadeo=h("#"+u.SHADE+s),o.scrollbar||f.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==v.ie&&a.layero.find("iframe").attr("src",d[0]),4==o.type?a.tips():(a.offset(),parseInt(f.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),v.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||f.events.resize[a.index]||(f.events.resize[a.index]=function(){a.resize()},g.on("resize",f.events.resize[a.index])),o.time<=0||setTimeout(function(){v.close(a.index)},o.time),a.move().callback(),c(a.layero),a.layero.data("config",o)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=h("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=g.height()&&(n[1]=g.height(),e("."+u[5])):e("."+u[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(g.height()-n[1])/2,e.offsetLeft=(g.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=g.width()-n[0]:"b"===t.offset?e.offsetTop=g.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=g.width()-n[0]):"rb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=g.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?g.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?g.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=g.scrollTop(),e.offsetLeft+=g.scrollLeft()),"min"===i.data("maxminStatus")&&(e.offsetTop=g.height()-(i.find(u[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},t.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==v.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=h(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?f.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&v.close(n.index)},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}):v.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):v.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&v.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&v.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){v.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&v.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(v.restore(n.index),o.restore&&o.restore(a,n.index,n)):(v.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(f.end[n.index]=o.end),o.beforeEnd&&(f.beforeEnd[n.index]=h.proxy(o.beforeEnd,o,a,n.index,n))},f.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&h("."+u[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){v.zIndex=this.config.zIndex,v.setTop=function(e){return v.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){v.zIndex++,e.css("z-index",v.zIndex+1)}),v.zIndex}},f.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===f.type[2]?i.children("iframe"):i,n=[e[0].style.width||f.getStyle(e[0],"width"),e[0].style.height||f.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,f.getStyle(t[0],"height"))},f.setScrollbar=function(e){u.html.css("overflow","hidden").attr("layer-full",e)},f.restScrollbar=function(e){u.html.attr("layer-full")==e&&(u.html[0].style[u.html[0].style.removeProperty?"removeProperty":"removeAttribute"]("overflow"),u.html.removeAttr("layer-full"))},f.promiseLikeResolve=function(e){var t=h.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},(p.layer=v).getChildFrame=function(e,t){return t=t||h("."+u[4]).attr("times"),h("#"+u[0]+t).find("iframe").contents().find(e)},v.getFrameIndex=function(e){return h("#"+e).parents("."+u[4]).attr("times")},v.iframeAuto=function(e){var t,i,n;e&&(t=v.getChildFrame("html",e).outerHeight(),i=(e=h("#"+u[0]+e)).find(u[1]).outerHeight()||0,n=e.find("."+u[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},v.iframeSrc=function(e,t){h("#"+u[0]+e).find("iframe").attr("src",t)},v.style=function(e,t,i){var e=h("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;e.attr("minLeft");a!==f.type[3]&&a!==f.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===f.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},v.min=function(e,t){var i,n,a,o,s,r,l=h("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&v.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=h("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*f.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},f.record(l),0g.width()&&(o=g.width()-180-(f.minStackArr.edgeIndex=f.minStackArr.edgeIndex||0,f.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=g.height()-n,a||f.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),v.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),f.restScrollbar(e),c.hide())},v.restore=function(e){var t=h("#"+u[0]+e),i=h("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),v.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?f.restScrollbar(e):f.setScrollbar(e),r!==m&&(n.removeData(l),(o===f.type[2]?n.children("iframe"):n).css({height:r})),i.show()},v.full=function(t){var i=h("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&v.restore(t),i.data("maxminStatus","max"),f.record(i),u.html.attr("layer-full")||f.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");v.style(t,{top:e?0:g.scrollTop(),left:e?0:g.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},v.title=function(e,t){h("#"+u[0]+(t||v.index)).find(u[1]).html(e)},v.close=function(s,r){var e,t,l=(e=h("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):h("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},d=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(d)return l.removeClass("layer-anim "+o),l.hide();if(c===f.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===f.type[2])try{var n=h("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof f.end[s]&&f.end[s](),delete f.end[s],"function"==typeof r&&r(),f.events.resize[s]&&(g.off("resize",f.events.resize[s]),delete f.events.resize[s])},t=h("#"+u.SHADE+s);v.ie&&v.ie<10||!i.isOutAnim?t[d?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[d?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==v.ie&&f.reselect(),f.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(f.minStackIndex--,f.minStackArr.push(l.attr("minLeft"))),v.ie&&v.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},d||"function"!=typeof f.beforeEnd[s]?(delete f.beforeEnd[s],t()):f.promiseLikeResolve(f.beforeEnd[s]()).then(function(e){!1!==e&&(delete f.beforeEnd[s],t())},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}))},v.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+u[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&v.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},v.closeLast=function(i,e){var t,n=[],a=h.isArray(i);h("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=h(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0":'",s=i.success;return delete i.success,v.open(h.extend({type:1,btn:["\u786e\u5b9a","\u53d6\u6d88"],content:o,skin:"layui-layer-prompt"+x("prompt"),maxWidth:g.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?v.tips("\u6700\u591a\u8f93\u5165"+(i.maxlength||500)+"\u4e2a\u5b57\u7b26",a,{tips:1}):n&&n(t,e,a)}},i))},v.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,v.open(h.extend({type:1,skin:"layui-layer-tab"+x("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
        '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
      ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},v.photos=function(n,e,a){var s={};if((n=h.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof h),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return v.msg("\u6ca1\u6709\u56fe\u7247")}else{var c=h(n.photos),d=function(){o=[],c.find(n.img).each(function(e){var t=h(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(d(),0===o.length)return;if(e||c.on("click",n.img,function(){d();var e=h(this).attr("layer-index");v.photos(h.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&v.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,v.close(s.index),v.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),h(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=h(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":v.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},h.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=v.load(1,{shade:!("shade"in n)&&[.9,m,"unset"],scrollbar:!1});var t=o[r].src,f=function(e){v.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=v.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!n.full&&(t[0]'+i+''+(t=['
      '],1','','',"
      "].join("")),n.toolbar&&t.push(['
      ','','','','','','',"
      "].join("")),n.footer&&t.push(['"].join("")),t.push(""),t.join(""))+"",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,h(document).off("keyup",s.keyup)}},n))},u=function(){v.close(s.loadi),v.msg("\u5f53\u524d\u56fe\u7247\u5730\u5740\u5f02\u5e38\uff0c
      \u662f\u5426\u7ee7\u7eed\u67e5\u770b\u4e0b\u4e00\u5f20\uff1f",{time:3e4,btn:["\u4e0b\u4e00\u5f20","\u4e0d\u770b\u4e86"],yes:function(){1").addClass(r));layui.each(i.bars,function(t,e){var n=s('
    • ');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):u).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),o=n),l.append(n)}),c.find("."+r).remove(),"object"==typeof i.css&&l.css(i.css),c.append(l),o&&(e=function e(){return u.scrollTop()>=i.margin?t||(o.show(),t=1):t&&(o.hide(),t=0),e}()),u.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var o=arguments,r=(1]|&(?=#[a-zA-Z0-9]+)/g.test(t+="")?t.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):t},unescape:function(t){return t!==undefined&&null!==t||(t=""),(t+="").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/g,"'").replace(/\"/g,'"')},openWin:function(t){var e=(t=t||{}).window||window.open(t.url||"",t.target,t.specs);t.url||(e.document.open("text/html","replace"),e.document.write(t.content||""),e.document.close())},toVisibleArea:function(t){var e,n,i,o,r,a,c,u;(t=s.extend({margin:160,duration:200,type:"y"},t)).scrollElem[0]&&t.thisElem[0]&&(e=t.scrollElem,c=t.thisElem,i=(r="y"===t.type)?"top":"left",o=e[n=r?"scrollTop":"scrollLeft"](),r=e[r?"height":"width"](),a=e.offset()[i],u={},(c=c.offset()[i]-a)>r-t.margin||c."+v,T=function(e){var i=this;i.index=++h.index,i.config=c.extend({},i.config,h.config,e),i.init()};T.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},T.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},T.prototype.init=function(e,i){var t=this,n=t.config,a=c(n.elem);return 1",(t="href"in i?''+l+"":l,n?'
      '+t+("parent"===o?'':"group"===o&&d.isAllowSpread?'':"")+"
      ":'
      '+t+"
      "),"
    • "].join(""))).data("item",i),n&&(a=c('
      '),t=c("
        "),"parent"===o?(a.append(u(t,i[s.children])),l.append(a)):l.append(u(t,i[s.children]))),r.append(l))}),r},t=['
        ',"
        "].join(""),n=d.content||(n=c('
          '),0\u6682\u65e0\u6570\u636e'),n),a=g.findMainElem(d.id);"reloadData"===e&&a.length?(i=l.mainElem=a).html(n):((i=l.mainElem=c(t)).append(n),i.addClass(d.className),i.attr("style",d.style),l.remove(h.thisId),d.target.append(i),d.elem.data(f,!0),e=d.shade?'
          ':"",i.before(e),"mouseenter"===d.trigger&&i.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){l.delayRemove()})),l.position(),h.thisId=d.id,i.find(".layui-menu").on(o,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0n.width()&&(t.addClass(x),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(x),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+E);i.removeClass(x),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new T(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='
          '+(a.tips?'
          ":"")+'
          '+(a.range?'
          ':"")+"
          ",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='
          ')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('
          '),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['
          p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)',"",'','',"","","
          "].join("")),t=i.elem=x(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+T)[0].style.background,e.events()},s.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],n=e.elemPicker=x(['
          ','
          ','
          ','
          ','
          ','
          ',"
          ",'
          ','
          ',"
          ","
          ",'
          ','
          ','
          ',"
          ","
          ",i.predefine?(o=['
          '],layui.each(i.colors,function(e,i){o.push(['
          ','
          ',"
          "].join(""))}),o.push("
          "),o.join("")):"",'
          ','
          ','',"
          ",'
          ','','',"","
          "].join(""));e.elemColorBox.find("."+T)[0];x(c)[0]&&x(c).data("index")==e.index?e.removePicker(s.thisElemInd):(e.removePicker(s.thisElemInd),x("body").append(n)),r.thisId=i.id,s.thisElemInd=e.index,s.thisColor=t.style.background,e.position(),e.pickerEvents()},s.prototype.removePicker=function(e){var i=this.config,e=x("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete r.thisId,"function"==typeof i.close)&&i.close(this.color),this},s.prototype.position=function(){var e=this,i=e.config;return P.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},s.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+T)),t=i.elemPicker.find("."+X),n=o[0].style.backgroundColor;n?(e=j(L(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(n):"rgba"===o?(o=L(n),3===(n.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+Y).css("left",280)):(t.find("input").val(n),n=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+Y).css("left",n)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+H(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+Y).css("left",280))},s.prototype.side=function(){var r=this,l=r.config,c=r.elemColorBox.find("."+T),a=c.attr("lay-type"),s=r.elemPicker.find(".layui-colorpicker-side"),o=r.elemPicker.find("."+I),d=r.elemPicker.find("."+E),t=r.elemPicker.find("."+M),u=r.elemPicker.find("."+D),f=r.elemPicker.find("."+Y),p=o[0].offsetTop/180*360,h=100-(t[0].offsetTop+3)/180*100,g=(t[0].offsetLeft+3)/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,m=r.elemColorBox.find("."+B),e=r.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,t){r.select(e,i,o);var n=F({h:e,s:i,b:o}),e=H({h:e,s:i,b:o}),i=r.elemPicker.find("."+X).find("input");m.addClass(C).removeClass(w),c[0].style.background="rgb("+n.r+", "+n.g+", "+n.b+")","torgb"===a?i.val("rgb("+n.r+", "+n.g+", "+n.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+n.r+", "+n.g+", "+n.b+", "+t+")"),c[0].style.background="rgba("+n.r+", "+n.g+", "+n.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+n.r+", "+n.g+", "+n.b+", 0), rgb("+n.r+", "+n.g+", "+n.b+"))"):i.val("#"+e),l.change&&l.change(x.trim(r.elemPicker.find("."+X).find("input").val()))},i=x(['
          '].join("")),b=function(e){x("#LAY-colorpicker-moving")[0]||x("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},n=!0,k=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,n=(e.clientY===undefined?i:e).clientY;k&&layui.stope(e),b(function(e){var i=t+(e.clientY-n),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(p=i,g,h,v),e.preventDefault(),n&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var r=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=r+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,n=d[0].offsetWidth,n=(o=n<(o=o<0?0:o)?n:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;y(p,g=n,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),o=e.clientX-x(this).offset().left+W.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;y(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),n&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,n=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=t+(e.clientX-n),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientX-x(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(p,g,h,v=i),e.preventDefault(),n&&f.trigger("mousedown",e)}),e.each(function(){x(this).on("click",function(){x(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=j(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})}),P.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:u,eventType:"mousedown"},{elem:d,eventType:"mousedown"}],function(e,t){P.touchSwipe(t.elem,{onTouchStart:function(){k=n=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),k=n=!0}})})},s.prototype.select=function(e,i,o,t){this.config;var n=H({h:e,s:100,b:100}),e=(H({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,r=this.elemPicker.find("."+E)[0];this.elemPicker.find("."+I).css("top",e),r.style.background="#"+n,this.elemPicker.find("."+M).css({top:o/r.offsetHeight*100+"%",left:i/r.offsetWidth*100+"%"})},s.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+T),d=c.elemPicker.find("."+X+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(C).addClass(w),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,n,r,l=x.trim(d.val());-1>16,g:(65280&n)>>8,b:255&n},t=j(r),s[0].style.background=o="#"+H(t),c.elemColorBox.find("."+B).removeClass(w).addClass(C)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=x(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=x(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},s.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),x(c)[0]&&(e.val(),e.side())})},a.on(i,function(e){var i,o,t;r.thisId&&(i=n.getThis(r.thisId))&&(o=i.config,t=i.elemColorBox.find("."+T),x(e.target).hasClass(l)||x(e.target).parents("."+l)[0]||x(e.target).hasClass(c.replace(/\./g,""))||x(e.target).parents(c)[0]||i.elemPicker&&(i.color?(e=j(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(C).addClass(w),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),W.on("resize",function(){if(r.thisId){var e=n.getThis(r.thisId);if(e)return!(!e.elemPicker||!x(c)[0])&&void e.position()}}),n.that={},n.getThis=function(e){var i=n.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},r.render=function(e){e=new s(e);return n.call(e)},e(t,r)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),r="element",y="layui-this",f="layui-show",o=".layui-tab-title",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,r,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(o),n=l.children(".layui-tab-bar"),e=e.children(".layui-tab-content"),s=""+(i.title||"unnaming")+"";return n[0]?n.before(s):l.append(s),e.append('
          "+(i.content||"")+"
          "),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),w.tabAuto(i.change?"change":null),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(o).find('>li[lay-id="'+i+'"]');return w.tabDelete(null,t),this},i.prototype.tabChange=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(o).find('>li[lay-id="'+i+'"]');return w.tabClick.call(t[0],{liElem:t,force:a}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));w.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),p="layui-nav-item",b="layui-nav-bar",v="layui-nav-tree",m="layui-nav-child",g="layui-nav-more",C="layui-anim layui-anim-upbit",w={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),o=a.attr("lay-id"),c="index"in t?t.index:a.parent().children("li").index(a);if(!t.force){var t=a.siblings("."+y);if(!1===layui.event.call(this,r,"tabBeforeChange("+s+")",{elem:e,from:{index:a.parent().children("li").index(t),id:t.attr("lay-id")},to:{index:c,id:o}}))return}l||n||(a.addClass(y).siblings().removeClass(y),(o?t=(t=i.filter('[lay-id="'+o+'"]')).length?t:i.eq(c):i.eq(c)).addClass(f).siblings().removeClass(f)),layui.event.call(this,r,"tab("+s+")",{elem:e,index:c,id:o})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter"),s=i.attr("lay-id");!1!==layui.event.call(i[0],r,"tabBeforeDelete("+n+")",{elem:e,index:a,id:s})&&(i.hasClass(y)&&(i.next()[0]&&i.next().is("li")?w.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&w.tabClick.call(i.prev()[0],null,a-1)),i.remove(),(s?i=(i=l.filter('[lay-id="'+s+'"]')).length?i:l.eq(a):l.eq(a)).remove(),setTimeout(function(){w.tabAuto()},50),layui.event.call(this,r,"tabDelete("+n+")",{elem:e,index:a,id:s}))},tabAuto:function(l,t){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;(t||u(".layui-tab")).each(function(){var t=u(this),a=t.children(".layui-tab-title"),i=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),i=u(''),e=(c===window&&d.ie,t.attr("lay-allowclose"));e&&"false"!==e&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||"false"===i.attr("lay-allowclose")||((t=u('')).on("click",w.tabDelete),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(e=a.find("li").eq(0).height())+e/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(i),t.attr("overflow",""),i.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+m),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+y).removeClass(y),e.addClass(y)),i.hasClass(v)){var n=p+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+b).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(C),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+m).show().stop().slideUp(200,o)))}layui.event.call(this,r,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+f)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(f)),a[n?"addClass":"removeClass"](f),i.html(n?"":""),layui.event.call(this,r,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a="string"==typeof i&&i?'[lay-filter="'+i+'"]':"",e={tab:function(t){w.tabAuto.call({},t)},nav:function(t){var s={},o={},c={},r="layui-nav-title";(t||u(h+a)).each(function(t){var i=u(this),a=u(''),e=i.find("."+p),l=i.find("."+b)[0];l&&l.remove(),i.append(a),(i.hasClass(v)?e.find("dd,>."+r):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+m);i.hasClass(v)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(C),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(f),l.find("."+g).addClass(g+"d")},300))}.call(this,a,i,t)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){i.hasClass(v)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+m).removeClass(f),i.find("."+g).removeClass(g+"d")},300))}),i.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(v)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)}),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+m)[0]&&!t.children("."+g)[0]&&t.append(''),t.off("click",w.clickThis).on("click",w.clickThis)})})},breadcrumb:function(t){(t||u(".layui-breadcrumb"+a)).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(t){var e="layui-progress";(t||u("."+e+a)).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(t){(t||u(".layui-collapse"+a)).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",w.collapse).on("click",w.collapse)})})}};return t&&"object"==typeof i&&i instanceof u?e[t](i):e[t]?e[t]():layui.each(e,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",w.tabClick),u(window).on("resize",w.tabAuto),t(r,a)});layui.define(["lay","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,t=layui.layer,R=layui.device(),i="upload",s="layui_"+i+"_index",w={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=F.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},o=function(){var t=this,e=t.config.id;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:(o.that[e]=t).config}},r="layui-upload-file",l="layui-upload-form",E="layui-upload-iframe",L="layui-upload-choose",T="UPLOADING",D=function(e){var t=this;t.index=++w.index,t.config=F.extend({},t.config,w.config,e),t.render()};D.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},D.prototype.reload=function(e){var t=this;t.config=F.extend({},t.config,e),t.render(!0)},D.prototype.render=function(e){var t=this,i=t.config,n=F(i.elem);return 1"].join("")),n=t.elem.next();(n.hasClass(r)||n.hasClass(l))&&n.remove(),R.ie&&R.ie<10&&t.elem.wrap('
          '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),R.ie&&R.ie<10&&e.initIE()},D.prototype.initIE=function(){var i,e=this.config,t=F(''),n=F(['
          ',""].join(""));F("#"+E)[0]||F("body").append(t),e.elem.next().hasClass(l)||(this.elemFile.wrap(n),e.elem.next("."+l).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},D.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},D.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},D.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},D.prototype.upload=function(e,t){var i,n,a,o,r,u=this,f=u.config,s=f.text||{},l=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||l.files},d=function(){var a=0,o=0,r=c(),l=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},i=function(i){var n=new FormData,t=function(e){i.unified?layui.each(r,function(e,t){delete t[T]}):delete e[T]};if(layui.each(f.data,function(e,t){t="function"==typeof t?i.unified?t():t(i.index,i.file):t,n.append(e,t)}),i.unified)layui.each(r,function(e,t){t[T]||(t[T]=!0,n.append(f.field,t))});else{if(i.file[T])return;n.append(f.field,i.file),i.file[T]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,m(i.index,e),l(i.index),t(i.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(s.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
          ")),g(i.index,e.responseText,e),l(i.index),t(i.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),f.progress(t,(f.item||f.elem)[0],e,i.index))}),e}),F.ajax(e)};f.unified?i({unified:!0,index:0}):layui.each(r,function(e,t){i({index:e,file:t})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(D.timer),D.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){u.msg(s["cross-domain"]),clearInterval(D.timer),g()}e&&(clearInterval(D.timer),t.html(""),m(0,e))},30)},h=function(e){if("json"===f.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(t){return u.msg(s["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,t){u.elemFile.next("."+L).remove(),l.value="";var i=h(t);switch(i.status){case"CONVERTED":t=i.data;break;case"FORMAT_ERROR":return}"function"==typeof f.done&&f.done(t,e||0,function(e){u.upload(e)})},g=function(e,t,i){f.auto&&(l.value="");var n=h(t);switch(n.status){case"CONVERTED":t=n.data;break;case"FORMAT_ERROR":return}"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)},t,i)},v=f.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,t){n.push(t.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,t){var i={};i[e]=t,u.upload(i)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,t){u.files[e]=t}),u.files},resetFile:function(e,t,i){t=new File([t],i);u.files=u.files||{},u.files[e]=t},getChooseFiles:function(){return u.chooseFiles}},b={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",y=0===y.length?l.value.match(/[^\/\\]+\..+/g)||[]:y;if(0!==y.length){switch(f.accept){case"file":layui.each(y,function(e,t){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(t)))return i=!0});break;case"video":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return i=!0});break;case"audio":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(t)))return i=!0});break;default:layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(t)))return i=!0})}if(i)return u.msg(s["check-error"]||"\u9009\u62e9\u7684"+b+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==t&&!f.auto||(f.choose&&f.choose(x),"choose"!==t)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof s["limit-number"]?s["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6
          \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(01024*f.size&&(t=1<=(t=f.size/1024)?t.toFixed(2)+"MB":f.size+"KB",l.value="",o=t)}),o)return u.msg("function"==typeof s["limit-size"]?s["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);r=function(){if(R.ie)return(9'+e+"")},l=function(i){var n=!0;return layui.each(a.files,function(e,t){if(!(n=!(t.name===i.name)))return!0}),n},u=function(e){var i=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=w.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,t){i(t)}):i(e),e},f=function(e){var i;return(e=e||[]).length?a.files?(i=[],layui.each(e,function(e,t){l(t)&&i.push(u(t))}),i):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),R.ie&&R.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=F(this),t=f(t.originalEvent.dataTransfer.files);i.removeAttr("lay-over"),o(t),n.auto?a.upload():r(t)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():r(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(s)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(s,n.id))},w.util={parseSize:function(e,t){var i,n;return t=t||2,null!=e&&e?(i="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(i)/Math.log(1024)),(e=(e=i/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(t)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var t=F.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()}},o.that={},o.getThis=function(e){var t=o.that[e];return t||hint.error(e?i+" instance with ID '"+e+"' not found":"ID argument required"),t},w.render=function(e){e=new D(e);return o.call(e)},e(i,w)});layui.define(["lay","layer","util"],function(e){"use strict";var T=layui.$,p=layui.layer,N=layui.util,l=layui.hint(),$=(layui.device(),"form"),d=".layui-form",A="layui-this",j="layui-hide",S="layui-disabled",t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e))return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return T.extend(!0,this.config,e),this},t.prototype.verify=function(e){return T.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return T(d+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,$,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=T(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.checked=this.value==t+""}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;T(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var u=this,i=u.config,a=T(d+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),t=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),s=Number(e.attr("lay-precision")),o="click"!==t&&""===i,c="init"===t;isNaN(a)||("click"===t&&(a=!!T(this).index()?a-n:a+n),t=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},s=0<=s?s:Math.max(t(n),t(i)),o||(c||r<=(a=a<=l?l:a)&&(a=r),0===s?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=T((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(o)||r.wrap('
          '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");T(this).hasClass(S)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,$,"input-affix("+e+")",{elem:r[0],affix:s,options:i}))})},h={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(T(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(e){t.call(this,e,"init")},click:function(e){t.call(this,e,"click")},blur:function(e){t.call(this,e,"blur")}}};n()})},select:function(e){var p="\u8bf7\u9009\u62e9",C="layui-form-select",w="layui-select-none",_="layui-select-create-option",f="layui-select-panel-elem-data",e=e||a.find("select"),y=function(n,e,t,i,u,a){var l,d,r,s,o,c,h,p,f,y=T(this),v=e,m=v.find("input"),g=n.find("dl"),b=(g.children("dd"),g.children("dt")),k=this.selectedIndex,x="";t||(d="cs"===y.attr("lay-search")?{caseSensitive:!0}:lay.options(y,{attr:"lay-search"}),r=y.attr("lay-append-to")||"body",s=y.attr("lay-append-position"),o=!(!lay.ie||"10"!==lay.ie&&"11"!==lay.ie||!m.attr("placeholder")),c=function(){a&&(n.appendTo(r).css({width:v.width()+"px"}),(e=function(){lay.position(v[0],n[0],{position:s,allowBottomOut:!0,offset:[0,5]})})(),T(window).on("resize.lay_select_resize",e));var e=n.offset().top+n.outerHeight()+5-O.scrollTop(),t=g.outerHeight(),i=g.children("dd");k=y[0].selectedIndex,v.parent().addClass(C+"ed"),i.removeClass(j),b.removeClass(j),i.removeClass(A),0<=k&&i.eq(k).addClass(A),e+t>O.height()&&t<=e&&n.addClass(C+"up"),p(),o&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),l=lay.onClickOutside((a?n:g)[0],function(){h(),x&&m.val(x)},{ignore:v})},h=function(e){v.parent().removeClass(C+"ed "+C+"up"),m.blur(),u&&g.children("."+_).remove(),l&&l(),a&&(n.detach(),T(window).off("resize.lay_select_resize")),e||f(m.val(),function(e){var t=y[0].selectedIndex;e&&(x=T(y[0].options[t]).html(),0===t&&x===m.attr("placeholder")&&(x=""),m.val(x||""))})},p=function(){var e,t,i=g.children("dd."+A);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t").addClass(_).attr("lay-value",n).html(N.escape(n)),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('

          \u65e0\u5339\u914d\u9879

          '):g.find("."+w).remove()},"keyup"),""===n&&(y.val(""),g.find("."+A).removeClass(A),(y[0].options[0]||{}).value||g.children("dd:eq(0)").addClass(A),g.find("."+w).remove(),u)&&g.children("."+_).remove(),void p()))},50)).on("blur",function(e){var t=y[0].selectedIndex;x=T(y[0].options[t]).text(),0===t&&x===m.attr("placeholder")&&(x=""),setTimeout(function(){f(m.val(),function(e){x||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t=T(this),i=t.attr("lay-value"),a=y.attr("lay-filter");return t.hasClass(S)||(t.hasClass("layui-select-tips")?m.val(""):(m.val(t.text()),t.addClass(A)),u&&t.hasClass(_)&&(g.append(t.removeClass(_)),e=T("
          "].join(""));i.after(l),function(t,i){var a=T(this),e=a.attr("lay-skin")||"primary",n="switch"===e,e="primary"===e;t.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].indeterminate&&(a[0].indeterminate=!1),a[0].checked=!a[0].checked,layui.event.call(a[0],$,i[2]+"("+e+")",{elem:a[0],value:a[0].value,othis:t}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e;n&&(e=(t.next("*[lay-checkbox]")[0]?t.next().html():a.attr("title")||"").split("|"),t.children("div").html(!this.checked&&e[1]||e[0])),t.toggleClass(i[1],this.checked)}),e&&u.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?t.children(".layui-icon-ok").removeClass("layui-icon-ok").addClass(c.SUBTRA):t.children("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")})}.call(this,l,r)})},radio:function(e){var o="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=T(this),a=i.next("."+o),n=this.disabled,l=i.attr("lay-skin");if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();var a=N.escape(t.title||""),r=[],s=(i.next("[lay-radio]")[0]&&(a=(s=i.next()).html()||"",1",'',"
          "+a+"
          ","
          "].join("")));i.after(s),function(i){var a=T(this),n="layui-anim-scaleSpring";i.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],$,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(o+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(d).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(o+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,s)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?T(e).is(d)?(a=T(e),t()):e.each(function(e,t){var i=T(t);i.closest(d).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),u},t.prototype.syncAppearanceOnPropChanged=function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,h="layui-form-danger";return!(e=T(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var s=T(this),t=(s.attr("lay-verify")||"").split("|"),o=s.attr("lay-vertype"),c=T.trim(s.val());if(s.removeClass(h),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=s.attr("lay-reqtext")||i),n)return"tips"===o?p.tips(i,"string"!=typeof s.attr("lay-ignore")&&l?s.next():s,{tips:1}):"alert"===o?p.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&p.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?s.next().find("input"):r).focus()},7),s.addClass(h),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=T(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(d).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,$,"submit("+e+")",l))});var r=new t,t=T(document),O=T(window);T(function(){r.render()}),t.on("reset",d,function(){var e=T(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",d,i).on("click","*[lay-submit]",i),e($,r)});layui.define(["lay","laytpl","laypage","form","util"],function(s){"use strict";var f=layui.$,r=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return r(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
          "+i+"
          ").text():i},R="table",N="lay-"+R+"-id",t=".layui-table",W="layui-hide",y="layui-hide-v",h="layui-none",D="layui-table-view",o=".layui-table-header",L=".layui-table-body",I=".layui-table-fixed-r",P=".layui-table-pageview",E=".layui-table-sort",A="layui-table-checked",M="layui-table-edit",_="layui-table-hover",u="laytable-cell-group",F="layui-table-col-special",S="layui-table-tool-panel",H="layui-table-expanded",O="layui-table-disabled-transition",j="LAY_TABLE_MOVE_DICT",e=function(e){return['
          ',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},a=['',"","
          "].join(""),B=[,"{{# if(d.data.toolbar){ }}",'
          ','
          ','
          ',"
          ","{{# } }}",'
          ',"{{# if(d.data.loading){ }}",'
          ','
          ','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'',"{{# } }}","
          ","
          ","{{# } }}","{{# var left, right; }}",'
          ',e(),"
          ",'
          ',a,"
          ","{{# if(left){ }}",'
          ','
          ',e({fixed:!0}),"
          ",'
          ',a,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',e({fixed:"right"}),'
          ',"
          ",'
          ',a,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.totalRow){ }}",'
          ','','',"
          ","
          ","{{# } }}",'
          ','
          ',"
          "].join(""),d=f(window),z=f(document),n=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=d.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+D),n=t.elem=f("
          ");n.addClass((l=[D,D+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[N]=a.id,l)).html(m(B,{open:"{{",close:"}}"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(L),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(I),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page),t.events()},n.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},n.prototype.setInit=function(e){var n,a,d=this,r=d.config;if(r.clientWidth=r.width||(n=function(e){var t,a;e=e||r.elem.parent(),t=d.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&1===i.nodeType&&(!t||a)?n(i):t})(),"width"===e)return r.clientWidth;r.height=r.maxHeight||r.height,r.css&&-1===r.css.indexOf(D)&&(a=r.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+D+"-"+d.index+" "+t)}),r.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[r.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,d.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),r.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},n.prototype.renderToolbar=function(){var l,o=this,e=o.config,d=e.elem.attr("lay-filter"),t=['
          ','
          ','
          '].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
        • "+(t.fieldTitle||t.title||t.field)+"").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">
        • ')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](W),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+d+")",{col:i,config:n}))})}})}},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});x.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",e,{tips:3}):i({list:['
        • \u5bfc\u51fa CSV \u6587\u4ef6
        • '].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(o,a.id,null,e)})}})}},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data,e=(e.config,e.elem);if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});var t=window.open("about:blank","_blank"),e=[""].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+F).filter(function(e,t){return!f(t).children("."+u).length}).remove(),a.find("tbody>tr>td."+F).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('
          ')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
          ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](W),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+u)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(W)||0o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&h?y.width(o.getContentWidth(l)):y.width("auto"),o.setGroupWidth()},n.prototype.resize=function(){var e=this;e.layMain&&("isConnected"in e.layMain[0]?e.layMain[0].isConnected:f.contains(document.body,e.layMain[0]))&&(e.fullSize(),e.setColsWidth(),e.scrollPatch())},n.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},n.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+h),e=f('
          '+(e||"Error")+"
          ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(W),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(P).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},n.prototype.page=1,n.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),d=o.response,r=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[d.countName],t)};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[d.dataName]=k.cache[n.key],e[d.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[d.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[d.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[d.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),f.ajax({type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[d.statusName]!=d.statusCode?n.errorView(e[d.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+d.statusName+'": '+d.statusCode):(t=e[d.countName],(a=Math.ceil(t/o.limit)||1)','
          "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
          "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&d.push(e),"right"===l.fixed&&r.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+A+'"'),e=e.join(" "),y.push(""+i.join("")+""),h.push(""+d.join("")+""),p.push(""+r.join("")+""))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},n.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,d=t[i.response.dataName]||[],t=t[i.response.totalRowName],r=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(d,o,l,{trs:r,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(r.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,g.close(a.tipsIndex)};return k.cache[a.key]=d,a.layTotal[0==d.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](W),a.layPage.find(P)[!i.page||0==n||0===d.length&&1==l?"addClass":"removeClass"](y),0===d.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(W),o?u():(u(),a.renderTotal(d,t),a.layTotal&&a.layTotal.removeClass(W),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},n.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal=[],d=[],r.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l="totalRowDecimals"in t?t.totalRowDecimals:2,l=s[e]?parseFloat(s[e]||0).toFixed(l):"",l=(a=t.totalRowText||"",(n={LAY_COL:t})[e]=l,n=t.totalRow&&T.call(r,{item3:t,content:l,tplData:n})||a,i||n),n=(t.field&&r.dataTotal.push({field:t.field,total:f("
          "+l+"
          ").text()}),['','
          "+("string"==typeof(a=t.totalRow||c.totalRow)?m(a).render(f.extend({TOTAL_NUMS:i||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):l),"
          "].join(""));d.push(n)}),e=r.layTotal.find(".layui-table-patch"),r.layTotal.find("tbody").html(""+d.join("")+(e.length?e.get(0).outerHTML:"")+""))},n.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");i.render(e,t)},n.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},n.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},n.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},n.prototype.setRowChecked=function(i){var a,e,l,t,n,o,d,r=this,c=r.config,s="all"===i.index,u="array"===layui.type(i.index),y=s||u;y&&(r.layBox.addClass(O),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=r.layBody.children(".layui-table").children("tbody"),d=y?"tr":'tr[data-index="'+i.index+'"]',d=e.children(d),e=s?d:d.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=k.cache[r.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(A)),e.toggleClass(A,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(A))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),d=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(I),("radio"===i.type&&d.hasClass(W)?s.first():s).prop("checked",n(u.prop("checked"))),r.syncCheckAll(),y&&setTimeout(function(){r.layBox.removeClass(O)},100))},n.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(d=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,d=i,!1}));try{var d=d||l.field.data("field"),r=l.field.data("key");if(t.sortKey&&!l.pull&&d===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+r).find(E);t.layHeader.find("th").find(E).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+d+"' not matched")}t.sortKey={field:d,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,d,null,!0):"desc"===l.type?e=layui.sort(o,d,!0,!0):(e=layui.sort(o,k.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:d,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},n.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(W,!e)},n.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];r.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},n.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=d.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
          ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(L).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+S)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),z.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(r.allowResize=t.width()-e<=10,d.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(r.allowResize=!1,d.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);r.allowResize&&(t=a.data("key"),e.preventDefault(),r.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=a.data("minwidth")||s.cellMinWidth,r.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(j,r),w.eventMoveElem=a)}),w.docEvent||z.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(j)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+D).attr(N),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+D).attr(N),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),r={},d.css("cursor",""),a.scrollPatch(),t.removeData(j),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(E),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(E+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",y.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",y.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(_)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(_)}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",y.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(u),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+M)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+M,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=y.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+M,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(H)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),d=i.children(u),i="layui-table-cell-c",r=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['
          ',d.html(),"
          ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;atr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=r.options(this,{attr:a?"lay-data":null,errorText:d+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),r.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),d.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(d),d.click(),document.body.removeChild(d)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))})})),f("."+S).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.initIndexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),s(R,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,x=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",h="layui-table-tree",z="LAY_DATA_INDEX",m="LAY_DATA_INDEX_HISTORY",p="LAY_PARENT_INDEX",b="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,f=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},g=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&g(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),g(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(f,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName,t=t.id;return e=e||P.cache[t],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]=t[o]||n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a,n=this;return e?(a=(t=n.getOptions()).tree,t.id,a.customName,{data:e,dataIndex:e[z],getParentNode:function(){return n.getNodeByIndex(e[p])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[p])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=n.id,n=P.cache[n],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
          '),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",g.html('')):N(e[w.dataName])},error:function(e,t){y[V]="error","function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(h)||d.addClass(h),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z]),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z]),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z])})),null),y=c.name,p=o.indent||14;if(layui.each(e.find('td[data-field="'+y+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((f=f||{})[n]=!0),a[b]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+y+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
          ',a[H]?o.flexIconOpen:o.flexIconClose,"
          ",o.showIcon?'
          '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
          ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&f?(layui.each(f,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){x.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),x.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t,a){var n=j(e);if(n){var i,l=n.getOptions(),d=l.tree,r=d.customName.isParent,o=d.customName.children,c=l.elem.next(),u=[],s=P.cache[e],t=n.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),f=n.getNodeDataByIndex(t[p]),d=(n.updateCheckStatus(f),n.treeToFlat([t],t[d.customName.pid],t[p])),t=(layui.each(d,function(e,t){t=t[z];u.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete s[t]}),c.find(u.join(",")).remove(),n.initData());for(i in s)-1!==i.indexOf("-")&&i!==s[i][z]&&delete s[i];layui.each(n.treeToFlat(t),function(e,t){t[m]&&t[m]!==t[z]&&c.find('tr[lay-data-index="'+t[m]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(s,function(e,t){c.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),l.hasNumberCol&&v(n),f&&(d=c.find('tr[lay-data-index="'+f[z]+'"]'),a||(f[r]=!(!f[o]||!f[o].length)),n.updateNodeIcon({scopeEl:d,isExpand:f[H],isParent:f[r]})),B.resize(e)}},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][m],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[b]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(h)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(h)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(h)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),x.render(a.prop({checked:n,indeterminate:t[b]}))})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[b])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,x.render(i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o})),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[b]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[b]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[b])return a[b]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[b]=!n&&0')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('
          '+i.text.none+"
          "),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0"),c=p(['
          ','
          ','
          ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i[o.title]||i.label||s.text.defaultNodeName)+"":''+(i[o.title]||i.label||s.text.defaultNodeName)+"","
          ",s.edit?(a={add:'',update:'',del:''},n=['
          '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
          "):void 0):"","
          "].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('
          '));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append(''),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d[u.title]||"")+'" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
          ','
          ','","
          ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
            ',"
            "].join("")},p=['
            ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
            ','",'","
            ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
            "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["
          • ",'',"
          • "].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

            '+(t||"")+"

            ");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var o=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=o.extend({},n.config,e),n},on:function(e,n){return layui.onevent.call(this,r,e,n)}}),r="carousel",s="layui-this",u="layui-carousel-left",c="layui-carousel-right",m="layui-carousel-prev",h="layui-carousel-next",a="layui-carousel-arrow",d="layui-carousel-ind",n=function(e){var n=this;n.config=o.extend({},n.config,t.config,e),n.render()};n.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},n.prototype.render=function(){var e=this,n=e.config,i=o(n.elem);if(1*[carousel-item]>*"),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(s),e.indicator(),e.arrow(),e.autoplay(),1=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var n=this.config;n.index=n.index+(e=e||1),n.index>=this.elemItem.length&&(n.index=0)},n.prototype.subIndex=function(e){var n=this.config;n.index=n.index-(e=e||1),n.index<0&&(n.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,n=e.config,i=e.elemItem.length;n.autoplay&&(clearInterval(e.timer),1',''].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+a)[0]&&e.elem.find("."+a).remove(),1i.index?n.slide("add",e-i.index):e
              ',(n=[],layui.each(e.elemItem,function(e){n.push("")}),n.join("")),"
            "].join(""));i.elem.attr("lay-indicator",i.indicator),i.elem.find("."+d)[0]&&i.elem.find("."+d).remove(),1t[a?"height":"width"]()/3)&&o.slide(0a.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'
              "),n=1;n<=a.length;n++){var o='
            • ";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'
            • ":i+=o}i+="
            "+(a.text?''+a.value+"\u661f":"")+"";var l=a.elem,s=l.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),l.html(e.elemTemp),l.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var n=this.config,t=this.elemTemp,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value+"\u661f"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(o).removeClass(f)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})}),r.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(f).removeClass(v),n.half&&e&&a.addClass(o).removeClass(f)):a.addClass(h).removeClass(s),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value+"\u661f"),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},a.prototype.events=function(){},c.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(l,c)});layui.define("jquery",function(o){"use strict";var w=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,t,a,f,s,u,p,d,y,g=this,h=0,v=w((o=o||{}).elem);if(v[0])return c=w(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,t=o.moreText||"\u52a0\u8f7d\u66f4\u591a",a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),g._cleanup(v,c),s=o.scrollElem&&o.scrollElem!==document,p=w('"),v.find(".layui-flow-more")[0]||v[f?"prepend":"append"](p),d=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=w(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1'),"function"==typeof o.done&&o.done(++h,d)})(),p.find("a").on("click.flow",function(){w(this);n||i||y()}),o.isLazyimg&&(r=g.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=w(this),t=e.scrollTop();l&&clearTimeout(l),!n&&v.width()&&(l=setTimeout(function(){var o=(s?e:w(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&y()},100))}),g},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=w((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:w(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=w(s),o)p(o,e);else for(var n=0;n"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},W=layui.code?layui.code.index+1e4:0,R=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1',l.ln?['
            ',D.digit(t+1)+".","
            "].join(""):"",'
            ',e||" ","
            ",""].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++W,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code));lay.clipboard.writeText({text:t,done:function(){N.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){N.msg("\u590d\u5236\u5931\u8d25",{icon:2})}}),"function"==typeof l.onCopy&&l.onCopy(t)}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('
            '),C=x('
            '),r=x('
            '),_=x('
            '),u=x('
            '),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
          • ');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){I.render(e.find(".layui-form")),S.render()}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('
            '),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH
          • ')).html(l.title||l.text.code),o.prepend(_)),M=x('
            '),l.copy&&!l.preview&&((C=x(['','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append(''+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/public/static/plugs/layui_exts/excel.js b/public/static/plugs/layui_exts/excel.js new file mode 100644 index 0000000..34f9186 --- /dev/null +++ b/public/static/plugs/layui_exts/excel.js @@ -0,0 +1,10 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=343)}([function(e,t,r){var n=r(2),a=r(22),i=r(13),s=r(12),o=r(21),c=function(e,t,r){var l,f,u,h,d=e&c.F,p=e&c.G,g=e&c.S,m=e&c.P,v=e&c.B,b=p?n:g?n[t]||(n[t]={}):(n[t]||{}).prototype,w=p?a:a[t]||(a[t]={}),E=w.prototype||(w.prototype={});for(l in p&&(r=t),r)u=((f=!d&&b&&void 0!==b[l])?b:r)[l],h=v&&f?o(u,n):m&&"function"==typeof u?o(Function.call,u):u,b&&s(b,l,u,e&c.U),w[l]!=u&&i(w,l,h),m&&E[l]!=u&&(E[l]=u)};n.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,r){var n=r(4);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){var n=r(52)("wks"),a=r(41),i=r(2).Symbol,s="function"==typeof i;(e.exports=function(e){return n[e]||(n[e]=s&&i[e]||(s?i:a)("Symbol."+e))}).store=n},function(e,t,r){var n=r(19),a=Math.min;e.exports=function(e){return e>0?a(n(e),9007199254740991):0}},function(e,t,r){e.exports=!r(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(1),a=r(130),i=r(26),s=Object.defineProperty;t.f=r(7)?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),a)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){var n=r(25);e.exports=function(e){return Object(n(e))}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,r){var n=r(0),a=r(3),i=r(25),s=/"/g,o=function(e,t,r,n){var a=String(i(e)),o="<"+t;return""!==r&&(o+=" "+r+'="'+String(n).replace(s,""")+'"'),o+">"+a+""};e.exports=function(e,t){var r={};r[e]=t(o),n(n.P+n.F*a(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t,r){var n=r(2),a=r(13),i=r(17),s=r(41)("src"),o=r(339),c=(""+o).split("toString");r(22).inspectSource=function(e){return o.call(e)},(e.exports=function(e,t,r,o){var l="function"==typeof r;l&&(i(r,"name")||a(r,"name",t)),e[t]!==r&&(l&&(i(r,s)||a(r,s,e[t]?""+e[t]:c.join(String(t)))),e===n?e[t]=r:o?e[t]?e[t]=r:a(e,t,r):(delete e[t],a(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[s]||o.call(this)})},function(e,t,r){var n=r(8),a=r(42);e.exports=r(7)?function(e,t,r){return n.f(e,t,a(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(17),a=r(9),i=r(91)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=a(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,r){var n=r(50),a=r(42),i=r(16),s=r(26),o=r(17),c=r(130),l=Object.getOwnPropertyDescriptor;t.f=r(7)?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(o(e,t))return a(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(51),a=r(25);e.exports=function(e){return n(a(e))}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){"use strict";var n=r(3);e.exports=function(e,t){return!!e&&n(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,r){var n=r(10);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,a){return e.call(t,r,n,a)}}return function(){return e.apply(t,arguments)}}},function(e,t){var r=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=r)},function(e,t,r){var n=r(21),a=r(51),i=r(9),s=r(6),o=r(75);e.exports=function(e,t){var r=1==e,c=2==e,l=3==e,f=4==e,u=6==e,h=5==e||u,d=t||o;return function(t,o,p){for(var g,m,v=i(t),b=a(v),w=n(o,p,3),E=s(b.length),S=0,y=r?d(t,E):c?d(t,0):void 0;E>S;S++)if((h||S in b)&&(m=w(g=b[S],S,v),e))if(r)y[S]=m;else if(m)switch(e){case 3:return!0;case 5:return g;case 6:return S;case 2:y.push(g)}else if(f)return!1;return u?-1:l||f?f:y}}},function(e,t,r){var n=r(0),a=r(22),i=r(3);e.exports=function(e,t){var r=(a.Object||{})[e]||Object[e],s={};s[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",s)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(4);e.exports=function(e,t){if(!n(e))return e;var r,a;if(t&&"function"==typeof(r=e.toString)&&!n(a=r.call(e)))return a;if("function"==typeof(r=e.valueOf)&&!n(a=r.call(e)))return a;if(!t&&"function"==typeof(r=e.toString)&&!n(a=r.call(e)))return a;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){var n=r(107),a=r(0),i=r(52)("metadata"),s=i.store||(i.store=new(r(104))),o=function(e,t,r){var a=s.get(e);if(!a){if(!r)return;s.set(e,a=new n)}var i=a.get(t);if(!i){if(!r)return;a.set(t,i=new n)}return i};e.exports={store:s,map:o,has:function(e,t,r){var n=o(t,r,!1);return void 0!==n&&n.has(e)},get:function(e,t,r){var n=o(t,r,!1);return void 0===n?void 0:n.get(e)},set:function(e,t,r,n){o(r,n,!0).set(e,t)},keys:function(e,t){var r=o(e,t,!1),n=[];return r&&r.forEach(function(e,t){n.push(t)}),n},key:function(e){return void 0===e||"symbol"==typeof e?e:String(e)},exp:function(e){a(a.S,"Reflect",e)}}},function(e,t,r){"use strict";if(r(7)){var n=r(31),a=r(2),i=r(3),s=r(0),o=r(56),c=r(67),l=r(21),f=r(35),u=r(42),h=r(13),d=r(33),p=r(19),g=r(6),m=r(102),v=r(39),b=r(26),w=r(17),E=r(45),S=r(4),y=r(9),_=r(78),C=r(38),x=r(14),T=r(37).f,B=r(76),k=r(41),A=r(5),I=r(23),R=r(66),O=r(48),F=r(73),P=r(43),D=r(61),N=r(36),M=r(74),L=r(113),U=r(8),W=r(15),V=U.f,H=W.f,z=a.RangeError,X=a.TypeError,G=a.Uint8Array,j=Array.prototype,Y=c.ArrayBuffer,$=c.DataView,K=I(0),Z=I(2),J=I(3),Q=I(4),q=I(5),ee=I(6),te=R(!0),re=R(!1),ne=F.values,ae=F.keys,ie=F.entries,se=j.lastIndexOf,oe=j.reduce,ce=j.reduceRight,le=j.join,fe=j.sort,ue=j.slice,he=j.toString,de=j.toLocaleString,pe=A("iterator"),ge=A("toStringTag"),me=k("typed_constructor"),ve=k("def_constructor"),be=o.CONSTR,we=o.TYPED,Ee=o.VIEW,Se=I(1,function(e,t){return Te(O(e,e[ve]),t)}),ye=i(function(){return 1===new G(new Uint16Array([1]).buffer)[0]}),_e=!!G&&!!G.prototype.set&&i(function(){new G(1).set({})}),Ce=function(e,t){var r=p(e);if(r<0||r%t)throw z("Wrong offset!");return r},xe=function(e){if(S(e)&&we in e)return e;throw X(e+" is not a typed array!")},Te=function(e,t){if(!(S(e)&&me in e))throw X("It is not a typed array constructor!");return new e(t)},Be=function(e,t){return ke(O(e,e[ve]),t)},ke=function(e,t){for(var r=0,n=t.length,a=Te(e,n);n>r;)a[r]=t[r++];return a},Ae=function(e,t,r){V(e,t,{get:function(){return this._d[r]}})},Ie=function(e){var t,r,n,a,i,s,o=y(e),c=arguments.length,f=c>1?arguments[1]:void 0,u=void 0!==f,h=B(o);if(void 0!=h&&!_(h)){for(s=h.call(o),n=[],t=0;!(i=s.next()).done;t++)n.push(i.value);o=n}for(u&&c>2&&(f=l(f,arguments[2],2)),t=0,r=g(o.length),a=Te(this,r);r>t;t++)a[t]=u?f(o[t],t):o[t];return a},Re=function(){for(var e=0,t=arguments.length,r=Te(this,t);t>e;)r[e]=arguments[e++];return r},Oe=!!G&&i(function(){de.call(new G(1))}),Fe=function(){return de.apply(Oe?ue.call(xe(this)):xe(this),arguments)},Pe={copyWithin:function(e,t){return L.call(xe(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(xe(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return M.apply(xe(this),arguments)},filter:function(e){return Be(this,Z(xe(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return q(xe(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(xe(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){K(xe(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return re(xe(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(xe(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return le.apply(xe(this),arguments)},lastIndexOf:function(e){return se.apply(xe(this),arguments)},map:function(e){return Se(xe(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return oe.apply(xe(this),arguments)},reduceRight:function(e){return ce.apply(xe(this),arguments)},reverse:function(){for(var e,t=xe(this).length,r=Math.floor(t/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return fe.call(xe(this),e)},subarray:function(e,t){var r=xe(this),n=r.length,a=v(e,n);return new(O(r,r[ve]))(r.buffer,r.byteOffset+a*r.BYTES_PER_ELEMENT,g((void 0===t?n:v(t,n))-a))}},De=function(e,t){return Be(this,ue.call(xe(this),e,t))},Ne=function(e){xe(this);var t=Ce(arguments[1],1),r=this.length,n=y(e),a=g(n.length),i=0;if(a+t>r)throw z("Wrong length!");for(;i255?255:255&n),a.v[d](r*t+a.o,n,ye)}(this,r,e)},enumerable:!0})};w?(p=r(function(e,r,n,a){f(e,p,l,"_d");var i,s,o,c,u=0,d=0;if(S(r)){if(!(r instanceof Y||"ArrayBuffer"==(c=E(r))||"SharedArrayBuffer"==c))return we in r?ke(p,r):Ie.call(p,r);i=r,d=Ce(n,t);var v=r.byteLength;if(void 0===a){if(v%t)throw z("Wrong length!");if((s=v-d)<0)throw z("Wrong length!")}else if((s=g(a)*t)+d>v)throw z("Wrong length!");o=s/t}else o=m(r),i=new Y(s=o*t);for(h(e,"_d",{b:i,o:d,l:s,e:o,v:new $(i)});uw;w++)if((m=t?b(s(p=e[w])[0],p[1]):b(e[w]))===l||m===f)return m}else for(g=v.call(e);!(p=g.next()).done;)if((m=a(g,b,p.value,t))===l||m===f)return m}).BREAK=l,t.RETURN=f},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){"use strict";var n=r(2),a=r(8),i=r(7),s=r(5)("species");e.exports=function(e){var t=n[e];i&&t&&!t[s]&&a.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,r){var n=r(128),a=r(90).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,a)}},function(e,t,r){var n=r(1),a=r(127),i=r(90),s=r(91)("IE_PROTO"),o=function(){},c=function(){var e,t=r(93)("iframe"),n=i.length;for(t.style.display="none",r(89).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("