From 3f70a47f926c2e24e5faf69f4e93093789d22dee Mon Sep 17 00:00:00 2001 From: snowykami Date: Sat, 31 Aug 2024 11:08:18 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20docs=20from=20@=20LiteyukiStud?= =?UTF-8?q?io/LiteyukiBot@2f87b06c83dedd2cdb0ab4dd9091b1382598b49c=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .nojekyll | 0 404.html | 23 ++ assets/app.B6hFbXUP.js | 1 + assets/chunks/@localSearchIndexen.CgaiBpBo.js | 1 + .../chunks/@localSearchIndexroot.ButuspH0.js | 1 + assets/chunks/VPLocalSearchBox.CLGH5rWG.js | 7 + assets/chunks/framework.C3o_UkTa.js | 17 ++ assets/chunks/theme.rDkprPqD.js | 2 + assets/deploy_config.md.QRt04bcu.js | 31 +++ assets/deploy_config.md.QRt04bcu.lean.js | 1 + assets/deploy_fandq.md.BC91M77d.js | 1 + assets/deploy_fandq.md.BC91M77d.lean.js | 1 + assets/deploy_install.md.DaqD6Ylg.js | 8 + assets/deploy_install.md.DaqD6Ylg.lean.js | 1 + assets/dev_api_api.md.BjidfGYh.js | 1 + assets/dev_api_api.md.BjidfGYh.lean.js | 1 + assets/dev_api_bot_bot.md.CmVyYr_O.js | 211 ++++++++++++++++ assets/dev_api_bot_bot.md.CmVyYr_O.lean.js | 1 + assets/dev_api_bot_index.md.DudPhKae.js | 211 ++++++++++++++++ assets/dev_api_bot_index.md.DudPhKae.lean.js | 1 + assets/dev_api_bot_lifespan.md.B4hpMOqt.js | 114 +++++++++ .../dev_api_bot_lifespan.md.B4hpMOqt.lean.js | 1 + assets/dev_api_comm_channel.md.CNJvRyvp.js | 196 +++++++++++++++ .../dev_api_comm_channel.md.CNJvRyvp.lean.js | 1 + assets/dev_api_comm_comm.md.UNalIkKO.js | 1 + assets/dev_api_comm_comm.md.UNalIkKO.lean.js | 1 + assets/dev_api_comm_event.md.C9P63b1v.js | 1 + assets/dev_api_comm_event.md.C9P63b1v.lean.js | 1 + assets/dev_api_comm_index.md.Bztx56-h.js | 1 + assets/dev_api_comm_index.md.Bztx56-h.lean.js | 1 + assets/dev_api_comm_rpc.md.Ctatb5Fy.js | 1 + assets/dev_api_comm_rpc.md.Ctatb5Fy.lean.js | 1 + .../dev_api_comm_socks_channel.md.i5OohqUe.js | 26 ++ ...api_comm_socks_channel.md.i5OohqUe.lean.js | 1 + assets/dev_api_comm_storage.md.CquSLWbc.js | 144 +++++++++++ .../dev_api_comm_storage.md.CquSLWbc.lean.js | 1 + assets/dev_api_config.md.5YZEeFsT.js | 77 ++++++ assets/dev_api_config.md.5YZEeFsT.lean.js | 1 + assets/dev_api_core_core.md.D46kyvua.js | 1 + assets/dev_api_core_core.md.D46kyvua.lean.js | 1 + assets/dev_api_core_index.md.BN6y5dmE.js | 1 + assets/dev_api_core_index.md.BN6y5dmE.lean.js | 1 + assets/dev_api_core_manager.md.DiZst2H3.js | 92 +++++++ .../dev_api_core_manager.md.DiZst2H3.lean.js | 1 + assets/dev_api_dev_dev.md.CnxR9aZA.js | 1 + assets/dev_api_dev_dev.md.CnxR9aZA.lean.js | 1 + assets/dev_api_dev_index.md.CbQNGO4N.js | 1 + assets/dev_api_dev_index.md.CbQNGO4N.lean.js | 1 + assets/dev_api_dev_observer.md.rNRTx952.js | 44 ++++ .../dev_api_dev_observer.md.rNRTx952.lean.js | 1 + assets/dev_api_dev_plugin.md.B8-Pj2Gj.js | 12 + assets/dev_api_dev_plugin.md.B8-Pj2Gj.lean.js | 1 + assets/dev_api_exception.md.BdaZK_3x.js | 1 + assets/dev_api_exception.md.BdaZK_3x.lean.js | 1 + assets/dev_api_index.md.Bj6EsNxq.js | 1 + assets/dev_api_index.md.Bj6EsNxq.lean.js | 1 + assets/dev_api_log.md.C1VDikdj.js | 18 ++ assets/dev_api_log.md.C1VDikdj.lean.js | 1 + assets/dev_api_message_event.md.AxntDJi3.js | 36 +++ .../dev_api_message_event.md.AxntDJi3.lean.js | 1 + assets/dev_api_message_index.md.B1MCWTHF.js | 1 + .../dev_api_message_index.md.B1MCWTHF.lean.js | 1 + assets/dev_api_message_matcher.md.CrqC3-lV.js | 35 +++ ...ev_api_message_matcher.md.CrqC3-lV.lean.js | 1 + assets/dev_api_message_message.md.Cp-oF0Sy.js | 1 + ...ev_api_message_message.md.Cp-oF0Sy.lean.js | 1 + assets/dev_api_message_on.md.BdoE0DiT.js | 15 ++ assets/dev_api_message_on.md.BdoE0DiT.lean.js | 1 + assets/dev_api_message_rule.md.UByA3TJk.js | 1 + .../dev_api_message_rule.md.UByA3TJk.lean.js | 1 + assets/dev_api_message_session.md.ZRjlTcix.js | 1 + ...ev_api_message_session.md.ZRjlTcix.lean.js | 1 + assets/dev_api_mkdoc.md.BPGO1Znu.js | 161 ++++++++++++ assets/dev_api_mkdoc.md.BPGO1Znu.lean.js | 1 + assets/dev_api_plugin_index.md.3yEbVRtX.js | 7 + .../dev_api_plugin_index.md.3yEbVRtX.lean.js | 1 + assets/dev_api_plugin_load.md.Bb_Kxjiz.js | 83 ++++++ .../dev_api_plugin_load.md.Bb_Kxjiz.lean.js | 1 + assets/dev_api_plugin_manager.md.wxoQsnAr.js | 1 + ...dev_api_plugin_manager.md.wxoQsnAr.lean.js | 1 + assets/dev_api_plugin_model.md.CXJI2586.js | 1 + .../dev_api_plugin_model.md.CXJI2586.lean.js | 1 + assets/dev_api_plugin_plugin.md.CSWk8lsR.js | 7 + .../dev_api_plugin_plugin.md.CSWk8lsR.lean.js | 1 + .../dev_api_plugins_liteecho.md.CPFGVTjw.js | 1 + ...v_api_plugins_liteecho.md.CPFGVTjw.lean.js | 1 + ...plugins_plugin_loader_index.md.BKOtyJlM.js | 8 + ...ns_plugin_loader_index.md.BKOtyJlM.lean.js | 1 + ...plugin_loader_plugin_loader.md.Bfz2lNbM.js | 8 + ...n_loader_plugin_loader.md.Bfz2lNbM.lean.js | 1 + assets/dev_api_utils.md.BfOyfADO.js | 70 ++++++ assets/dev_api_utils.md.BfOyfADO.lean.js | 1 + assets/dev_comm.md.BaLcrxQn.js | 43 ++++ assets/dev_comm.md.BaLcrxQn.lean.js | 1 + assets/dev_lyfunc.md.DGSAE6Uz.js | 20 ++ assets/dev_lyfunc.md.DGSAE6Uz.lean.js | 1 + assets/dev_plugin.md.7WyHaDzB.js | 32 +++ assets/dev_plugin.md.7WyHaDzB.lean.js | 1 + assets/dev_resource.md.DU3Q8OBq.js | 13 + assets/dev_resource.md.DU3Q8OBq.lean.js | 1 + assets/en_deploy_config.md.CB-Epa0p.js | 29 +++ assets/en_deploy_config.md.CB-Epa0p.lean.js | 1 + assets/en_deploy_fandq.md.lp1l61Jw.js | 1 + assets/en_deploy_fandq.md.lp1l61Jw.lean.js | 1 + assets/en_deploy_install.md.BnEnd6Nu.js | 8 + assets/en_deploy_install.md.BnEnd6Nu.lean.js | 1 + assets/en_dev_api_api.md.D-5_3fUd.js | 1 + assets/en_dev_api_api.md.D-5_3fUd.lean.js | 1 + assets/en_dev_api_bot_bot.md.D0tmeTXy.js | 211 ++++++++++++++++ assets/en_dev_api_bot_bot.md.D0tmeTXy.lean.js | 1 + assets/en_dev_api_bot_index.md.LrWFTh2D.js | 211 ++++++++++++++++ .../en_dev_api_bot_index.md.LrWFTh2D.lean.js | 1 + assets/en_dev_api_bot_lifespan.md.EgH0pEuD.js | 114 +++++++++ ...n_dev_api_bot_lifespan.md.EgH0pEuD.lean.js | 1 + assets/en_dev_api_comm_channel.md.BLjPtV1B.js | 196 +++++++++++++++ ...n_dev_api_comm_channel.md.BLjPtV1B.lean.js | 1 + assets/en_dev_api_comm_comm.md.nImwmKaA.js | 1 + .../en_dev_api_comm_comm.md.nImwmKaA.lean.js | 1 + assets/en_dev_api_comm_event.md.B8tSNpPu.js | 1 + .../en_dev_api_comm_event.md.B8tSNpPu.lean.js | 1 + assets/en_dev_api_comm_index.md.DXB5jsIP.js | 1 + .../en_dev_api_comm_index.md.DXB5jsIP.lean.js | 1 + assets/en_dev_api_comm_rpc.md.Db5NdJbe.js | 1 + .../en_dev_api_comm_rpc.md.Db5NdJbe.lean.js | 1 + ..._dev_api_comm_socks_channel.md.kerI5Mmv.js | 26 ++ ...api_comm_socks_channel.md.kerI5Mmv.lean.js | 1 + assets/en_dev_api_comm_storage.md.CyNGUlpk.js | 144 +++++++++++ ...n_dev_api_comm_storage.md.CyNGUlpk.lean.js | 1 + assets/en_dev_api_config.md.paJM3SZQ.js | 77 ++++++ assets/en_dev_api_config.md.paJM3SZQ.lean.js | 1 + assets/en_dev_api_core_core.md.DspKdKLc.js | 1 + .../en_dev_api_core_core.md.DspKdKLc.lean.js | 1 + assets/en_dev_api_core_index.md.Cu0gmuqG.js | 1 + .../en_dev_api_core_index.md.Cu0gmuqG.lean.js | 1 + assets/en_dev_api_core_manager.md.Bs82V5ER.js | 92 +++++++ ...n_dev_api_core_manager.md.Bs82V5ER.lean.js | 1 + assets/en_dev_api_dev_dev.md.C7bp0nFK.js | 1 + assets/en_dev_api_dev_dev.md.C7bp0nFK.lean.js | 1 + assets/en_dev_api_dev_index.md.B_Clatcv.js | 1 + .../en_dev_api_dev_index.md.B_Clatcv.lean.js | 1 + assets/en_dev_api_dev_observer.md.DfB9VffK.js | 44 ++++ ...n_dev_api_dev_observer.md.DfB9VffK.lean.js | 1 + assets/en_dev_api_dev_plugin.md.dVSn90qu.js | 12 + .../en_dev_api_dev_plugin.md.dVSn90qu.lean.js | 1 + assets/en_dev_api_exception.md.DTnDyb4J.js | 1 + .../en_dev_api_exception.md.DTnDyb4J.lean.js | 1 + assets/en_dev_api_index.md.Da9OtAtQ.js | 1 + assets/en_dev_api_index.md.Da9OtAtQ.lean.js | 1 + assets/en_dev_api_log.md.BD04gPQH.js | 18 ++ assets/en_dev_api_log.md.BD04gPQH.lean.js | 1 + .../en_dev_api_message_event.md.DkU7HnIc.js | 36 +++ ..._dev_api_message_event.md.DkU7HnIc.lean.js | 1 + .../en_dev_api_message_index.md.DEGPA3Qg.js | 1 + ..._dev_api_message_index.md.DEGPA3Qg.lean.js | 1 + .../en_dev_api_message_matcher.md.fjcL64M7.js | 35 +++ ...ev_api_message_matcher.md.fjcL64M7.lean.js | 1 + .../en_dev_api_message_message.md.D0iZgCWF.js | 1 + ...ev_api_message_message.md.D0iZgCWF.lean.js | 1 + assets/en_dev_api_message_on.md.Bpf1nKZ0.js | 15 ++ .../en_dev_api_message_on.md.Bpf1nKZ0.lean.js | 1 + assets/en_dev_api_message_rule.md.L6rc-HBj.js | 1 + ...n_dev_api_message_rule.md.L6rc-HBj.lean.js | 1 + .../en_dev_api_message_session.md.DMwGauxy.js | 1 + ...ev_api_message_session.md.DMwGauxy.lean.js | 1 + assets/en_dev_api_mkdoc.md.EVvNGPKX.js | 161 ++++++++++++ assets/en_dev_api_mkdoc.md.EVvNGPKX.lean.js | 1 + assets/en_dev_api_plugin_index.md.7EqtiaFh.js | 7 + ...n_dev_api_plugin_index.md.7EqtiaFh.lean.js | 1 + assets/en_dev_api_plugin_load.md.BWXzuii9.js | 83 ++++++ ...en_dev_api_plugin_load.md.BWXzuii9.lean.js | 1 + .../en_dev_api_plugin_manager.md.Cq1g681t.js | 1 + ...dev_api_plugin_manager.md.Cq1g681t.lean.js | 1 + assets/en_dev_api_plugin_model.md.CeWxdiF_.js | 1 + ...n_dev_api_plugin_model.md.CeWxdiF_.lean.js | 1 + .../en_dev_api_plugin_plugin.md.C9viahSZ.js | 7 + ..._dev_api_plugin_plugin.md.C9viahSZ.lean.js | 1 + ...en_dev_api_plugins_liteecho.md.w4kQQyNd.js | 1 + ...v_api_plugins_liteecho.md.w4kQQyNd.lean.js | 1 + ...plugins_plugin_loader_index.md.DYxIyTd3.js | 8 + ...ns_plugin_loader_index.md.DYxIyTd3.lean.js | 1 + ...plugin_loader_plugin_loader.md.CX7_cGXK.js | 8 + ...n_loader_plugin_loader.md.CX7_cGXK.lean.js | 1 + assets/en_dev_api_utils.md.D2AasRls.js | 70 ++++++ assets/en_dev_api_utils.md.D2AasRls.lean.js | 1 + assets/en_dev_comm.md.Cn-onW1y.js | 43 ++++ assets/en_dev_comm.md.Cn-onW1y.lean.js | 1 + assets/en_dev_lyfunc.md.C5K1_qgM.js | 20 ++ assets/en_dev_lyfunc.md.C5K1_qgM.lean.js | 1 + assets/en_dev_plugin.md.Xb7vUDpJ.js | 32 +++ assets/en_dev_plugin.md.Xb7vUDpJ.lean.js | 1 + assets/en_dev_resource.md.CYdCh9wj.js | 13 + assets/en_dev_resource.md.CYdCh9wj.lean.js | 1 + assets/en_index.md.DVQGNFEI.js | 1 + assets/en_index.md.DVQGNFEI.lean.js | 1 + assets/en_store_plugin.md.DceXsbsh.js | 1 + assets/en_store_plugin.md.DceXsbsh.lean.js | 1 + assets/en_store_resource.md.DwD3Poel.js | 1 + assets/en_store_resource.md.DwD3Poel.lean.js | 1 + assets/en_usage_agreement.md.DzIdKK2Q.js | 1 + assets/en_usage_agreement.md.DzIdKK2Q.lean.js | 1 + assets/en_usage_basic.md.CxkJTStx.js | 1 + assets/en_usage_basic.md.CxkJTStx.lean.js | 1 + assets/en_usage_extra.md.CHJ4PN4s.js | 1 + assets/en_usage_extra.md.CHJ4PN4s.lean.js | 1 + assets/index.md.CQL2AFxv.js | 1 + assets/index.md.CQL2AFxv.lean.js | 1 + .../inter-italic-cyrillic-ext.r48I6akx.woff2 | Bin 0 -> 43112 bytes assets/inter-italic-cyrillic.By2_1cv3.woff2 | Bin 0 -> 31300 bytes assets/inter-italic-greek-ext.1u6EdAuj.woff2 | Bin 0 -> 17404 bytes assets/inter-italic-greek.DJ8dCoTZ.woff2 | Bin 0 -> 32564 bytes assets/inter-italic-latin-ext.CN1xVJS-.woff2 | Bin 0 -> 120840 bytes assets/inter-italic-latin.C2AdPX0b.woff2 | Bin 0 -> 74784 bytes assets/inter-italic-vietnamese.BSbpV94h.woff2 | Bin 0 -> 14884 bytes .../inter-roman-cyrillic-ext.BBPuwvHQ.woff2 | Bin 0 -> 40488 bytes assets/inter-roman-cyrillic.C5lxZ8CY.woff2 | Bin 0 -> 29164 bytes assets/inter-roman-greek-ext.CqjqNYQ-.woff2 | Bin 0 -> 16272 bytes assets/inter-roman-greek.BBVDIX6e.woff2 | Bin 0 -> 29920 bytes assets/inter-roman-latin-ext.4ZJIpNVo.woff2 | Bin 0 -> 110160 bytes assets/inter-roman-latin.Di8DUHzh.woff2 | Bin 0 -> 67792 bytes assets/inter-roman-vietnamese.BjW4sHH5.woff2 | Bin 0 -> 14072 bytes assets/store_plugin.md.BMBIhTm1.js | 1 + assets/store_plugin.md.BMBIhTm1.lean.js | 1 + assets/store_resource.md.CfhqcpPi.js | 1 + assets/store_resource.md.CfhqcpPi.lean.js | 1 + assets/style.BNCNLzKP.css | 1 + assets/usage_agreement.md.DBBkunJ_.js | 1 + assets/usage_agreement.md.DBBkunJ_.lean.js | 1 + assets/usage_basic.md.DJoTZ022.js | 1 + assets/usage_basic.md.DJoTZ022.lean.js | 1 + assets/usage_extra.md.AJu--2F9.js | 1 + assets/usage_extra.md.AJu--2F9.lean.js | 1 + deploy/config.html | 56 +++++ deploy/fandq.html | 26 ++ deploy/install.html | 33 +++ dev/api/api.html | 26 ++ dev/api/bot/bot.html | 236 ++++++++++++++++++ dev/api/bot/index.html | 236 ++++++++++++++++++ dev/api/bot/lifespan.html | 139 +++++++++++ dev/api/comm/channel.html | 221 ++++++++++++++++ dev/api/comm/comm.html | 26 ++ dev/api/comm/event.html | 28 +++ dev/api/comm/index.html | 26 ++ dev/api/comm/rpc.html | 31 +++ dev/api/comm/socks_channel.html | 51 ++++ dev/api/comm/storage.html | 169 +++++++++++++ dev/api/config.html | 102 ++++++++ dev/api/core/core.html | 26 ++ dev/api/core/index.html | 26 ++ dev/api/core/manager.html | 117 +++++++++ dev/api/dev/dev.html | 26 ++ dev/api/dev/index.html | 26 ++ dev/api/dev/observer.html | 69 +++++ dev/api/dev/plugin.html | 37 +++ dev/api/exception.html | 26 ++ dev/api/index.html | 26 ++ dev/api/log.html | 43 ++++ dev/api/message/event.html | 61 +++++ dev/api/message/index.html | 26 ++ dev/api/message/matcher.html | 60 +++++ dev/api/message/message.html | 26 ++ dev/api/message/on.html | 40 +++ dev/api/message/rule.html | 42 ++++ dev/api/message/session.html | 26 ++ dev/api/mkdoc.html | 186 ++++++++++++++ dev/api/plugin/index.html | 32 +++ dev/api/plugin/load.html | 108 ++++++++ dev/api/plugin/manager.html | 26 ++ dev/api/plugin/model.html | 27 ++ dev/api/plugin/plugin.html | 32 +++ dev/api/plugins/liteecho.html | 28 +++ dev/api/plugins/plugin_loader/index.html | 33 +++ .../plugins/plugin_loader/plugin_loader.html | 33 +++ dev/api/utils.html | 95 +++++++ dev/comm.html | 68 +++++ dev/lyfunc.html | 45 ++++ dev/plugin.html | 57 +++++ dev/resource.html | 38 +++ en/deploy/config.html | 54 ++++ en/deploy/fandq.html | 26 ++ en/deploy/install.html | 33 +++ en/dev/api/api.html | 26 ++ en/dev/api/bot/bot.html | 236 ++++++++++++++++++ en/dev/api/bot/index.html | 236 ++++++++++++++++++ en/dev/api/bot/lifespan.html | 139 +++++++++++ en/dev/api/comm/channel.html | 221 ++++++++++++++++ en/dev/api/comm/comm.html | 26 ++ en/dev/api/comm/event.html | 28 +++ en/dev/api/comm/index.html | 26 ++ en/dev/api/comm/rpc.html | 31 +++ en/dev/api/comm/socks_channel.html | 51 ++++ en/dev/api/comm/storage.html | 169 +++++++++++++ en/dev/api/config.html | 102 ++++++++ en/dev/api/core/core.html | 26 ++ en/dev/api/core/index.html | 26 ++ en/dev/api/core/manager.html | 117 +++++++++ en/dev/api/dev/dev.html | 26 ++ en/dev/api/dev/index.html | 26 ++ en/dev/api/dev/observer.html | 69 +++++ en/dev/api/dev/plugin.html | 37 +++ en/dev/api/exception.html | 26 ++ en/dev/api/index.html | 26 ++ en/dev/api/log.html | 43 ++++ en/dev/api/message/event.html | 61 +++++ en/dev/api/message/index.html | 26 ++ en/dev/api/message/matcher.html | 60 +++++ en/dev/api/message/message.html | 26 ++ en/dev/api/message/on.html | 40 +++ en/dev/api/message/rule.html | 42 ++++ en/dev/api/message/session.html | 26 ++ en/dev/api/mkdoc.html | 186 ++++++++++++++ en/dev/api/plugin/index.html | 32 +++ en/dev/api/plugin/load.html | 108 ++++++++ en/dev/api/plugin/manager.html | 26 ++ en/dev/api/plugin/model.html | 27 ++ en/dev/api/plugin/plugin.html | 32 +++ en/dev/api/plugins/liteecho.html | 28 +++ en/dev/api/plugins/plugin_loader/index.html | 33 +++ .../plugins/plugin_loader/plugin_loader.html | 33 +++ en/dev/api/utils.html | 95 +++++++ en/dev/comm.html | 68 +++++ en/dev/lyfunc.html | 45 ++++ en/dev/plugin.html | 57 +++++ en/dev/resource.html | 38 +++ en/index.html | 26 ++ en/store/plugin.html | 26 ++ en/store/resource.html | 26 ++ en/usage/agreement.html | 26 ++ en/usage/basic.html | 26 ++ en/usage/extra.html | 26 ++ favicon.ico | Bin 0 -> 67646 bytes hashmap.json | 1 + index.html | 26 ++ liteyuki.svg | 148 +++++++++++ sitemap.xml | 1 + store/plugin.html | 26 ++ store/resource.html | 26 ++ usage/agreement.html | 26 ++ usage/basic.html | 26 ++ usage/extra.html | 26 ++ 339 files changed, 9943 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/app.B6hFbXUP.js create mode 100644 assets/chunks/@localSearchIndexen.CgaiBpBo.js create mode 100644 assets/chunks/@localSearchIndexroot.ButuspH0.js create mode 100644 assets/chunks/VPLocalSearchBox.CLGH5rWG.js create mode 100644 assets/chunks/framework.C3o_UkTa.js create mode 100644 assets/chunks/theme.rDkprPqD.js create mode 100644 assets/deploy_config.md.QRt04bcu.js create mode 100644 assets/deploy_config.md.QRt04bcu.lean.js create mode 100644 assets/deploy_fandq.md.BC91M77d.js create mode 100644 assets/deploy_fandq.md.BC91M77d.lean.js create mode 100644 assets/deploy_install.md.DaqD6Ylg.js create mode 100644 assets/deploy_install.md.DaqD6Ylg.lean.js create mode 100644 assets/dev_api_api.md.BjidfGYh.js create mode 100644 assets/dev_api_api.md.BjidfGYh.lean.js create mode 100644 assets/dev_api_bot_bot.md.CmVyYr_O.js create mode 100644 assets/dev_api_bot_bot.md.CmVyYr_O.lean.js create mode 100644 assets/dev_api_bot_index.md.DudPhKae.js create mode 100644 assets/dev_api_bot_index.md.DudPhKae.lean.js create mode 100644 assets/dev_api_bot_lifespan.md.B4hpMOqt.js create mode 100644 assets/dev_api_bot_lifespan.md.B4hpMOqt.lean.js create mode 100644 assets/dev_api_comm_channel.md.CNJvRyvp.js create mode 100644 assets/dev_api_comm_channel.md.CNJvRyvp.lean.js create mode 100644 assets/dev_api_comm_comm.md.UNalIkKO.js create mode 100644 assets/dev_api_comm_comm.md.UNalIkKO.lean.js create mode 100644 assets/dev_api_comm_event.md.C9P63b1v.js create mode 100644 assets/dev_api_comm_event.md.C9P63b1v.lean.js create mode 100644 assets/dev_api_comm_index.md.Bztx56-h.js create mode 100644 assets/dev_api_comm_index.md.Bztx56-h.lean.js create mode 100644 assets/dev_api_comm_rpc.md.Ctatb5Fy.js create mode 100644 assets/dev_api_comm_rpc.md.Ctatb5Fy.lean.js create mode 100644 assets/dev_api_comm_socks_channel.md.i5OohqUe.js create mode 100644 assets/dev_api_comm_socks_channel.md.i5OohqUe.lean.js create mode 100644 assets/dev_api_comm_storage.md.CquSLWbc.js create mode 100644 assets/dev_api_comm_storage.md.CquSLWbc.lean.js create mode 100644 assets/dev_api_config.md.5YZEeFsT.js create mode 100644 assets/dev_api_config.md.5YZEeFsT.lean.js create mode 100644 assets/dev_api_core_core.md.D46kyvua.js create mode 100644 assets/dev_api_core_core.md.D46kyvua.lean.js create mode 100644 assets/dev_api_core_index.md.BN6y5dmE.js create mode 100644 assets/dev_api_core_index.md.BN6y5dmE.lean.js create mode 100644 assets/dev_api_core_manager.md.DiZst2H3.js create mode 100644 assets/dev_api_core_manager.md.DiZst2H3.lean.js create mode 100644 assets/dev_api_dev_dev.md.CnxR9aZA.js create mode 100644 assets/dev_api_dev_dev.md.CnxR9aZA.lean.js create mode 100644 assets/dev_api_dev_index.md.CbQNGO4N.js create mode 100644 assets/dev_api_dev_index.md.CbQNGO4N.lean.js create mode 100644 assets/dev_api_dev_observer.md.rNRTx952.js create mode 100644 assets/dev_api_dev_observer.md.rNRTx952.lean.js create mode 100644 assets/dev_api_dev_plugin.md.B8-Pj2Gj.js create mode 100644 assets/dev_api_dev_plugin.md.B8-Pj2Gj.lean.js create mode 100644 assets/dev_api_exception.md.BdaZK_3x.js create mode 100644 assets/dev_api_exception.md.BdaZK_3x.lean.js create mode 100644 assets/dev_api_index.md.Bj6EsNxq.js create mode 100644 assets/dev_api_index.md.Bj6EsNxq.lean.js create mode 100644 assets/dev_api_log.md.C1VDikdj.js create mode 100644 assets/dev_api_log.md.C1VDikdj.lean.js create mode 100644 assets/dev_api_message_event.md.AxntDJi3.js create mode 100644 assets/dev_api_message_event.md.AxntDJi3.lean.js create mode 100644 assets/dev_api_message_index.md.B1MCWTHF.js create mode 100644 assets/dev_api_message_index.md.B1MCWTHF.lean.js create mode 100644 assets/dev_api_message_matcher.md.CrqC3-lV.js create mode 100644 assets/dev_api_message_matcher.md.CrqC3-lV.lean.js create mode 100644 assets/dev_api_message_message.md.Cp-oF0Sy.js create mode 100644 assets/dev_api_message_message.md.Cp-oF0Sy.lean.js create mode 100644 assets/dev_api_message_on.md.BdoE0DiT.js create mode 100644 assets/dev_api_message_on.md.BdoE0DiT.lean.js create mode 100644 assets/dev_api_message_rule.md.UByA3TJk.js create mode 100644 assets/dev_api_message_rule.md.UByA3TJk.lean.js create mode 100644 assets/dev_api_message_session.md.ZRjlTcix.js create mode 100644 assets/dev_api_message_session.md.ZRjlTcix.lean.js create mode 100644 assets/dev_api_mkdoc.md.BPGO1Znu.js create mode 100644 assets/dev_api_mkdoc.md.BPGO1Znu.lean.js create mode 100644 assets/dev_api_plugin_index.md.3yEbVRtX.js create mode 100644 assets/dev_api_plugin_index.md.3yEbVRtX.lean.js create mode 100644 assets/dev_api_plugin_load.md.Bb_Kxjiz.js create mode 100644 assets/dev_api_plugin_load.md.Bb_Kxjiz.lean.js create mode 100644 assets/dev_api_plugin_manager.md.wxoQsnAr.js create mode 100644 assets/dev_api_plugin_manager.md.wxoQsnAr.lean.js create mode 100644 assets/dev_api_plugin_model.md.CXJI2586.js create mode 100644 assets/dev_api_plugin_model.md.CXJI2586.lean.js create mode 100644 assets/dev_api_plugin_plugin.md.CSWk8lsR.js create mode 100644 assets/dev_api_plugin_plugin.md.CSWk8lsR.lean.js create mode 100644 assets/dev_api_plugins_liteecho.md.CPFGVTjw.js create mode 100644 assets/dev_api_plugins_liteecho.md.CPFGVTjw.lean.js create mode 100644 assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.js create mode 100644 assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.lean.js create mode 100644 assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.js create mode 100644 assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.lean.js create mode 100644 assets/dev_api_utils.md.BfOyfADO.js create mode 100644 assets/dev_api_utils.md.BfOyfADO.lean.js create mode 100644 assets/dev_comm.md.BaLcrxQn.js create mode 100644 assets/dev_comm.md.BaLcrxQn.lean.js create mode 100644 assets/dev_lyfunc.md.DGSAE6Uz.js create mode 100644 assets/dev_lyfunc.md.DGSAE6Uz.lean.js create mode 100644 assets/dev_plugin.md.7WyHaDzB.js create mode 100644 assets/dev_plugin.md.7WyHaDzB.lean.js create mode 100644 assets/dev_resource.md.DU3Q8OBq.js create mode 100644 assets/dev_resource.md.DU3Q8OBq.lean.js create mode 100644 assets/en_deploy_config.md.CB-Epa0p.js create mode 100644 assets/en_deploy_config.md.CB-Epa0p.lean.js create mode 100644 assets/en_deploy_fandq.md.lp1l61Jw.js create mode 100644 assets/en_deploy_fandq.md.lp1l61Jw.lean.js create mode 100644 assets/en_deploy_install.md.BnEnd6Nu.js create mode 100644 assets/en_deploy_install.md.BnEnd6Nu.lean.js create mode 100644 assets/en_dev_api_api.md.D-5_3fUd.js create mode 100644 assets/en_dev_api_api.md.D-5_3fUd.lean.js create mode 100644 assets/en_dev_api_bot_bot.md.D0tmeTXy.js create mode 100644 assets/en_dev_api_bot_bot.md.D0tmeTXy.lean.js create mode 100644 assets/en_dev_api_bot_index.md.LrWFTh2D.js create mode 100644 assets/en_dev_api_bot_index.md.LrWFTh2D.lean.js create mode 100644 assets/en_dev_api_bot_lifespan.md.EgH0pEuD.js create mode 100644 assets/en_dev_api_bot_lifespan.md.EgH0pEuD.lean.js create mode 100644 assets/en_dev_api_comm_channel.md.BLjPtV1B.js create mode 100644 assets/en_dev_api_comm_channel.md.BLjPtV1B.lean.js create mode 100644 assets/en_dev_api_comm_comm.md.nImwmKaA.js create mode 100644 assets/en_dev_api_comm_comm.md.nImwmKaA.lean.js create mode 100644 assets/en_dev_api_comm_event.md.B8tSNpPu.js create mode 100644 assets/en_dev_api_comm_event.md.B8tSNpPu.lean.js create mode 100644 assets/en_dev_api_comm_index.md.DXB5jsIP.js create mode 100644 assets/en_dev_api_comm_index.md.DXB5jsIP.lean.js create mode 100644 assets/en_dev_api_comm_rpc.md.Db5NdJbe.js create mode 100644 assets/en_dev_api_comm_rpc.md.Db5NdJbe.lean.js create mode 100644 assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.js create mode 100644 assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.lean.js create mode 100644 assets/en_dev_api_comm_storage.md.CyNGUlpk.js create mode 100644 assets/en_dev_api_comm_storage.md.CyNGUlpk.lean.js create mode 100644 assets/en_dev_api_config.md.paJM3SZQ.js create mode 100644 assets/en_dev_api_config.md.paJM3SZQ.lean.js create mode 100644 assets/en_dev_api_core_core.md.DspKdKLc.js create mode 100644 assets/en_dev_api_core_core.md.DspKdKLc.lean.js create mode 100644 assets/en_dev_api_core_index.md.Cu0gmuqG.js create mode 100644 assets/en_dev_api_core_index.md.Cu0gmuqG.lean.js create mode 100644 assets/en_dev_api_core_manager.md.Bs82V5ER.js create mode 100644 assets/en_dev_api_core_manager.md.Bs82V5ER.lean.js create mode 100644 assets/en_dev_api_dev_dev.md.C7bp0nFK.js create mode 100644 assets/en_dev_api_dev_dev.md.C7bp0nFK.lean.js create mode 100644 assets/en_dev_api_dev_index.md.B_Clatcv.js create mode 100644 assets/en_dev_api_dev_index.md.B_Clatcv.lean.js create mode 100644 assets/en_dev_api_dev_observer.md.DfB9VffK.js create mode 100644 assets/en_dev_api_dev_observer.md.DfB9VffK.lean.js create mode 100644 assets/en_dev_api_dev_plugin.md.dVSn90qu.js create mode 100644 assets/en_dev_api_dev_plugin.md.dVSn90qu.lean.js create mode 100644 assets/en_dev_api_exception.md.DTnDyb4J.js create mode 100644 assets/en_dev_api_exception.md.DTnDyb4J.lean.js create mode 100644 assets/en_dev_api_index.md.Da9OtAtQ.js create mode 100644 assets/en_dev_api_index.md.Da9OtAtQ.lean.js create mode 100644 assets/en_dev_api_log.md.BD04gPQH.js create mode 100644 assets/en_dev_api_log.md.BD04gPQH.lean.js create mode 100644 assets/en_dev_api_message_event.md.DkU7HnIc.js create mode 100644 assets/en_dev_api_message_event.md.DkU7HnIc.lean.js create mode 100644 assets/en_dev_api_message_index.md.DEGPA3Qg.js create mode 100644 assets/en_dev_api_message_index.md.DEGPA3Qg.lean.js create mode 100644 assets/en_dev_api_message_matcher.md.fjcL64M7.js create mode 100644 assets/en_dev_api_message_matcher.md.fjcL64M7.lean.js create mode 100644 assets/en_dev_api_message_message.md.D0iZgCWF.js create mode 100644 assets/en_dev_api_message_message.md.D0iZgCWF.lean.js create mode 100644 assets/en_dev_api_message_on.md.Bpf1nKZ0.js create mode 100644 assets/en_dev_api_message_on.md.Bpf1nKZ0.lean.js create mode 100644 assets/en_dev_api_message_rule.md.L6rc-HBj.js create mode 100644 assets/en_dev_api_message_rule.md.L6rc-HBj.lean.js create mode 100644 assets/en_dev_api_message_session.md.DMwGauxy.js create mode 100644 assets/en_dev_api_message_session.md.DMwGauxy.lean.js create mode 100644 assets/en_dev_api_mkdoc.md.EVvNGPKX.js create mode 100644 assets/en_dev_api_mkdoc.md.EVvNGPKX.lean.js create mode 100644 assets/en_dev_api_plugin_index.md.7EqtiaFh.js create mode 100644 assets/en_dev_api_plugin_index.md.7EqtiaFh.lean.js create mode 100644 assets/en_dev_api_plugin_load.md.BWXzuii9.js create mode 100644 assets/en_dev_api_plugin_load.md.BWXzuii9.lean.js create mode 100644 assets/en_dev_api_plugin_manager.md.Cq1g681t.js create mode 100644 assets/en_dev_api_plugin_manager.md.Cq1g681t.lean.js create mode 100644 assets/en_dev_api_plugin_model.md.CeWxdiF_.js create mode 100644 assets/en_dev_api_plugin_model.md.CeWxdiF_.lean.js create mode 100644 assets/en_dev_api_plugin_plugin.md.C9viahSZ.js create mode 100644 assets/en_dev_api_plugin_plugin.md.C9viahSZ.lean.js create mode 100644 assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.js create mode 100644 assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.lean.js create mode 100644 assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.js create mode 100644 assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.lean.js create mode 100644 assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.js create mode 100644 assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.lean.js create mode 100644 assets/en_dev_api_utils.md.D2AasRls.js create mode 100644 assets/en_dev_api_utils.md.D2AasRls.lean.js create mode 100644 assets/en_dev_comm.md.Cn-onW1y.js create mode 100644 assets/en_dev_comm.md.Cn-onW1y.lean.js create mode 100644 assets/en_dev_lyfunc.md.C5K1_qgM.js create mode 100644 assets/en_dev_lyfunc.md.C5K1_qgM.lean.js create mode 100644 assets/en_dev_plugin.md.Xb7vUDpJ.js create mode 100644 assets/en_dev_plugin.md.Xb7vUDpJ.lean.js create mode 100644 assets/en_dev_resource.md.CYdCh9wj.js create mode 100644 assets/en_dev_resource.md.CYdCh9wj.lean.js create mode 100644 assets/en_index.md.DVQGNFEI.js create mode 100644 assets/en_index.md.DVQGNFEI.lean.js create mode 100644 assets/en_store_plugin.md.DceXsbsh.js create mode 100644 assets/en_store_plugin.md.DceXsbsh.lean.js create mode 100644 assets/en_store_resource.md.DwD3Poel.js create mode 100644 assets/en_store_resource.md.DwD3Poel.lean.js create mode 100644 assets/en_usage_agreement.md.DzIdKK2Q.js create mode 100644 assets/en_usage_agreement.md.DzIdKK2Q.lean.js create mode 100644 assets/en_usage_basic.md.CxkJTStx.js create mode 100644 assets/en_usage_basic.md.CxkJTStx.lean.js create mode 100644 assets/en_usage_extra.md.CHJ4PN4s.js create mode 100644 assets/en_usage_extra.md.CHJ4PN4s.lean.js create mode 100644 assets/index.md.CQL2AFxv.js create mode 100644 assets/index.md.CQL2AFxv.lean.js create mode 100644 assets/inter-italic-cyrillic-ext.r48I6akx.woff2 create mode 100644 assets/inter-italic-cyrillic.By2_1cv3.woff2 create mode 100644 assets/inter-italic-greek-ext.1u6EdAuj.woff2 create mode 100644 assets/inter-italic-greek.DJ8dCoTZ.woff2 create mode 100644 assets/inter-italic-latin-ext.CN1xVJS-.woff2 create mode 100644 assets/inter-italic-latin.C2AdPX0b.woff2 create mode 100644 assets/inter-italic-vietnamese.BSbpV94h.woff2 create mode 100644 assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 create mode 100644 assets/inter-roman-cyrillic.C5lxZ8CY.woff2 create mode 100644 assets/inter-roman-greek-ext.CqjqNYQ-.woff2 create mode 100644 assets/inter-roman-greek.BBVDIX6e.woff2 create mode 100644 assets/inter-roman-latin-ext.4ZJIpNVo.woff2 create mode 100644 assets/inter-roman-latin.Di8DUHzh.woff2 create mode 100644 assets/inter-roman-vietnamese.BjW4sHH5.woff2 create mode 100644 assets/store_plugin.md.BMBIhTm1.js create mode 100644 assets/store_plugin.md.BMBIhTm1.lean.js create mode 100644 assets/store_resource.md.CfhqcpPi.js create mode 100644 assets/store_resource.md.CfhqcpPi.lean.js create mode 100644 assets/style.BNCNLzKP.css create mode 100644 assets/usage_agreement.md.DBBkunJ_.js create mode 100644 assets/usage_agreement.md.DBBkunJ_.lean.js create mode 100644 assets/usage_basic.md.DJoTZ022.js create mode 100644 assets/usage_basic.md.DJoTZ022.lean.js create mode 100644 assets/usage_extra.md.AJu--2F9.js create mode 100644 assets/usage_extra.md.AJu--2F9.lean.js create mode 100644 deploy/config.html create mode 100644 deploy/fandq.html create mode 100644 deploy/install.html create mode 100644 dev/api/api.html create mode 100644 dev/api/bot/bot.html create mode 100644 dev/api/bot/index.html create mode 100644 dev/api/bot/lifespan.html create mode 100644 dev/api/comm/channel.html create mode 100644 dev/api/comm/comm.html create mode 100644 dev/api/comm/event.html create mode 100644 dev/api/comm/index.html create mode 100644 dev/api/comm/rpc.html create mode 100644 dev/api/comm/socks_channel.html create mode 100644 dev/api/comm/storage.html create mode 100644 dev/api/config.html create mode 100644 dev/api/core/core.html create mode 100644 dev/api/core/index.html create mode 100644 dev/api/core/manager.html create mode 100644 dev/api/dev/dev.html create mode 100644 dev/api/dev/index.html create mode 100644 dev/api/dev/observer.html create mode 100644 dev/api/dev/plugin.html create mode 100644 dev/api/exception.html create mode 100644 dev/api/index.html create mode 100644 dev/api/log.html create mode 100644 dev/api/message/event.html create mode 100644 dev/api/message/index.html create mode 100644 dev/api/message/matcher.html create mode 100644 dev/api/message/message.html create mode 100644 dev/api/message/on.html create mode 100644 dev/api/message/rule.html create mode 100644 dev/api/message/session.html create mode 100644 dev/api/mkdoc.html create mode 100644 dev/api/plugin/index.html create mode 100644 dev/api/plugin/load.html create mode 100644 dev/api/plugin/manager.html create mode 100644 dev/api/plugin/model.html create mode 100644 dev/api/plugin/plugin.html create mode 100644 dev/api/plugins/liteecho.html create mode 100644 dev/api/plugins/plugin_loader/index.html create mode 100644 dev/api/plugins/plugin_loader/plugin_loader.html create mode 100644 dev/api/utils.html create mode 100644 dev/comm.html create mode 100644 dev/lyfunc.html create mode 100644 dev/plugin.html create mode 100644 dev/resource.html create mode 100644 en/deploy/config.html create mode 100644 en/deploy/fandq.html create mode 100644 en/deploy/install.html create mode 100644 en/dev/api/api.html create mode 100644 en/dev/api/bot/bot.html create mode 100644 en/dev/api/bot/index.html create mode 100644 en/dev/api/bot/lifespan.html create mode 100644 en/dev/api/comm/channel.html create mode 100644 en/dev/api/comm/comm.html create mode 100644 en/dev/api/comm/event.html create mode 100644 en/dev/api/comm/index.html create mode 100644 en/dev/api/comm/rpc.html create mode 100644 en/dev/api/comm/socks_channel.html create mode 100644 en/dev/api/comm/storage.html create mode 100644 en/dev/api/config.html create mode 100644 en/dev/api/core/core.html create mode 100644 en/dev/api/core/index.html create mode 100644 en/dev/api/core/manager.html create mode 100644 en/dev/api/dev/dev.html create mode 100644 en/dev/api/dev/index.html create mode 100644 en/dev/api/dev/observer.html create mode 100644 en/dev/api/dev/plugin.html create mode 100644 en/dev/api/exception.html create mode 100644 en/dev/api/index.html create mode 100644 en/dev/api/log.html create mode 100644 en/dev/api/message/event.html create mode 100644 en/dev/api/message/index.html create mode 100644 en/dev/api/message/matcher.html create mode 100644 en/dev/api/message/message.html create mode 100644 en/dev/api/message/on.html create mode 100644 en/dev/api/message/rule.html create mode 100644 en/dev/api/message/session.html create mode 100644 en/dev/api/mkdoc.html create mode 100644 en/dev/api/plugin/index.html create mode 100644 en/dev/api/plugin/load.html create mode 100644 en/dev/api/plugin/manager.html create mode 100644 en/dev/api/plugin/model.html create mode 100644 en/dev/api/plugin/plugin.html create mode 100644 en/dev/api/plugins/liteecho.html create mode 100644 en/dev/api/plugins/plugin_loader/index.html create mode 100644 en/dev/api/plugins/plugin_loader/plugin_loader.html create mode 100644 en/dev/api/utils.html create mode 100644 en/dev/comm.html create mode 100644 en/dev/lyfunc.html create mode 100644 en/dev/plugin.html create mode 100644 en/dev/resource.html create mode 100644 en/index.html create mode 100644 en/store/plugin.html create mode 100644 en/store/resource.html create mode 100644 en/usage/agreement.html create mode 100644 en/usage/basic.html create mode 100644 en/usage/extra.html create mode 100644 favicon.ico create mode 100644 hashmap.json create mode 100644 index.html create mode 100644 liteyuki.svg create mode 100644 sitemap.xml create mode 100644 store/plugin.html create mode 100644 store/resource.html create mode 100644 usage/agreement.html create mode 100644 usage/basic.html create mode 100644 usage/extra.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..d54c3268 --- /dev/null +++ b/404.html @@ -0,0 +1,23 @@ + + + + + + 404 | 轻雪机器人 + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/assets/app.B6hFbXUP.js b/assets/app.B6hFbXUP.js new file mode 100644 index 00000000..95f2eb7a --- /dev/null +++ b/assets/app.B6hFbXUP.js @@ -0,0 +1 @@ +import{t as p}from"./chunks/theme.rDkprPqD.js";import{U as o,a5 as u,a6 as c,a7 as l,a8 as f,a9 as d,aa as m,ab as h,ac as g,ad as A,ae as y,d as P,u as v,y as C,x as b,af as w,ag as E,ah as R,ai as S}from"./chunks/framework.C3o_UkTa.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return C(()=>{b(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&w(),E(),R(),s.setup&&s.setup(),()=>S(s.Layout)}});async function x(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function D(){return g(T)}function _(){let e=o,a;return A(t=>{let n=y(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&x().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{x as createApp}; diff --git a/assets/chunks/@localSearchIndexen.CgaiBpBo.js b/assets/chunks/@localSearchIndexen.CgaiBpBo.js new file mode 100644 index 00000000..0c955f00 --- /dev/null +++ b/assets/chunks/@localSearchIndexen.CgaiBpBo.js @@ -0,0 +1 @@ +const e=`{"documentCount":321,"nextId":321,"documentIds":{"0":"/en/deploy/config.html#configurations","1":"/en/deploy/config.html#basic-configuration","2":"/en/deploy/config.html#other-configurations","3":"/en/deploy/config.html#example-configuration-of-onebot-implementation-side-connected-to-nonebot","4":"/en/deploy/config.html#other","5":"/en/deploy/fandq.html#faq","6":"/en/deploy/fandq.html#frequently-asked-questions","7":"/en/deploy/fandq.html#other-questions","8":"/en/deploy/fandq.html#recommended-solution-qq","9":"/en/deploy/fandq.html#recommended-solution-minecraft","10":"/en/deploy/fandq.html#acknowledgements","11":"/en/deploy/install.html#install","12":"/en/deploy/install.html#normal-installation","13":"/en/deploy/install.html#run-with-docker","14":"/en/deploy/install.html#use-trss-script","15":"/en/deploy/install.html#device-requirements","16":"/en/deploy/install.html#for-other-questions-please-refer-to-faq","17":"/en/dev/api/api.html#liteyuki","18":"/en/dev/api/api.html#var-version","19":"/en/dev/api/bot/bot.html#liteyuki-bot","20":"/en/dev/api/bot/bot.html#class-liteyukibot","21":"/en/dev/api/bot/bot.html#def-init-self-args-kwargs-none","22":"/en/dev/api/bot/bot.html#async-def-run-self","23":"/en/dev/api/bot/bot.html#def-run-self","24":"/en/dev/api/bot/bot.html#async-def-keep-alive-self","25":"/en/dev/api/bot/bot.html#def-handle-exit-self-signum-frame","26":"/en/dev/api/bot/bot.html#def-restart-self-delay-int-0","27":"/en/dev/api/bot/bot.html#def-restart-process-self-name-optional-str-none","28":"/en/dev/api/bot/bot.html#def-init-self-args-kwargs","29":"/en/dev/api/bot/bot.html#def-init-logger-self","30":"/en/dev/api/bot/bot.html#def-stop-self","31":"/en/dev/api/bot/bot.html#def-on-before-start-self-func-lifespan-func","32":"/en/dev/api/bot/bot.html#def-on-after-start-self-func-lifespan-func","33":"/en/dev/api/bot/bot.html#def-on-after-shutdown-self-func-lifespan-func","34":"/en/dev/api/bot/bot.html#def-on-before-process-shutdown-self-func-lifespan-func","35":"/en/dev/api/bot/bot.html#def-on-before-process-restart-self-func-lifespan-func","36":"/en/dev/api/bot/bot.html#def-on-after-restart-self-func-lifespan-func","37":"/en/dev/api/bot/bot.html#def-get-bot-liteyukibot","38":"/en/dev/api/bot/bot.html#def-get-config-key-str-default-any-none-any","39":"/en/dev/api/bot/bot.html#def-get-config-with-compat-key-str-compat-keys-tuple-str-default-any-none-any","40":"/en/dev/api/bot/bot.html#def-print-logo","41":"/en/dev/api/bot/#liteyuki-bot","42":"/en/dev/api/bot/#class-liteyukibot","43":"/en/dev/api/bot/#def-init-self-args-kwargs-none","44":"/en/dev/api/bot/#async-def-run-self","45":"/en/dev/api/bot/#def-run-self","46":"/en/dev/api/bot/#async-def-keep-alive-self","47":"/en/dev/api/bot/#def-handle-exit-self-signum-frame","48":"/en/dev/api/bot/#def-restart-self-delay-int-0","49":"/en/dev/api/bot/#def-restart-process-self-name-optional-str-none","50":"/en/dev/api/bot/#def-init-self-args-kwargs","51":"/en/dev/api/bot/#def-init-logger-self","52":"/en/dev/api/bot/#def-stop-self","53":"/en/dev/api/bot/#def-on-before-start-self-func-lifespan-func","54":"/en/dev/api/bot/#def-on-after-start-self-func-lifespan-func","55":"/en/dev/api/bot/#def-on-after-shutdown-self-func-lifespan-func","56":"/en/dev/api/bot/#def-on-before-process-shutdown-self-func-lifespan-func","57":"/en/dev/api/bot/#def-on-before-process-restart-self-func-lifespan-func","58":"/en/dev/api/bot/#def-on-after-restart-self-func-lifespan-func","59":"/en/dev/api/bot/#def-get-bot-liteyukibot","60":"/en/dev/api/bot/#def-get-config-key-str-default-any-none-any","61":"/en/dev/api/bot/#def-get-config-with-compat-key-str-compat-keys-tuple-str-default-any-none-any","62":"/en/dev/api/bot/#def-print-logo","63":"/en/dev/api/bot/lifespan.html#liteyuki-bot-lifespan","64":"/en/dev/api/bot/lifespan.html#class-lifespan","65":"/en/dev/api/bot/lifespan.html#def-init-self-none","66":"/en/dev/api/bot/lifespan.html#async-def-run-funcs-funcs-list-async-lifespan-func-process-lifespan-func-args-kwargs-none","67":"/en/dev/api/bot/lifespan.html#def-on-before-start-self-func-lifespan-func-lifespan-func","68":"/en/dev/api/bot/lifespan.html#def-on-after-start-self-func-lifespan-func-lifespan-func","69":"/en/dev/api/bot/lifespan.html#def-on-before-process-shutdown-self-func-lifespan-func-lifespan-func","70":"/en/dev/api/bot/lifespan.html#def-on-after-shutdown-self-func-lifespan-func-lifespan-func","71":"/en/dev/api/bot/lifespan.html#def-on-before-process-restart-self-func-lifespan-func-lifespan-func","72":"/en/dev/api/bot/lifespan.html#def-on-after-restart-self-func-lifespan-func-lifespan-func","73":"/en/dev/api/bot/lifespan.html#async-def-before-start-self-none","74":"/en/dev/api/bot/lifespan.html#async-def-after-start-self-none","75":"/en/dev/api/bot/lifespan.html#async-def-before-process-shutdown-self-none","76":"/en/dev/api/bot/lifespan.html#async-def-after-shutdown-self-none","77":"/en/dev/api/bot/lifespan.html#async-def-before-process-restart-self-none","78":"/en/dev/api/bot/lifespan.html#async-def-after-restart-self-none","79":"/en/dev/api/comm/channel.html#liteyuki-comm-channel","80":"/en/dev/api/comm/channel.html#class-channel-generic-t","81":"/en/dev/api/comm/channel.html#def-init-self-name-str-type-check-optional-bool-none","82":"/en/dev/api/comm/channel.html#def-get-generic-type-self-optional-type","83":"/en/dev/api/comm/channel.html#def-validate-structure-self-data-any-structure-type-bool","84":"/en/dev/api/comm/channel.html#def-send-self-data-t","85":"/en/dev/api/comm/channel.html#def-receive-self-t","86":"/en/dev/api/comm/channel.html#async-def-async-receive-self-t","87":"/en/dev/api/comm/channel.html#def-on-receive-self-filter-func-optional-filter-func-none-callable-callable-t-any-callable-t-any","88":"/en/dev/api/comm/channel.html#async-def-run-on-receive-funcs-self-data-any","89":"/en/dev/api/comm/channel.html#async-def-start-receive-loop-self","90":"/en/dev/api/comm/channel.html#var-active-channel","91":"/en/dev/api/comm/channel.html#var-publish-channel","92":"/en/dev/api/comm/channel.html#var-channel-deliver-active-channel","93":"/en/dev/api/comm/channel.html#def-set-channel-name-str-channel-channel","94":"/en/dev/api/comm/channel.html#def-set-channels-channels-dict-str-channel","95":"/en/dev/api/comm/channel.html#def-get-channel-name-str-channel","96":"/en/dev/api/comm/channel.html#def-get-channels-dict-str-channel","97":"/en/dev/api/comm/channel.html#def-on-set-channel-data-tuple-str-dict-str-any","98":"/en/dev/api/comm/channel.html#def-on-get-channel-data-tuple-str-dict-str-any","99":"/en/dev/api/comm/channel.html#def-on-get-channels-data-tuple-str-dict-str-any","100":"/en/dev/api/comm/comm.html#liteyuki-comm","101":"/en/dev/api/comm/#liteyuki-comm","102":"/en/dev/api/comm/event.html#liteyuki-comm-event","103":"/en/dev/api/comm/event.html#class-event","104":"/en/dev/api/comm/event.html#def-init-self-name-str-data-dict-str-any","105":"/en/dev/api/comm/rpc.html#liteyuki-comm-rpc","106":"/en/dev/api/comm/rpc.html#class-rpc","107":"/en/dev/api/comm/rpc.html#def-init-self-on-calling-on-calling-func-none","108":"/en/dev/api/comm/rpc.html#def-call-self-args-tuple-kwargs-dict-any","109":"/en/dev/api/comm/socks_channel.html#liteyuki-comm-socks-channel","110":"/en/dev/api/comm/socks_channel.html#class-sockschannel","111":"/en/dev/api/comm/socks_channel.html#def-init-self-name-str","112":"/en/dev/api/comm/socks_channel.html#def-send-self-data","113":"/en/dev/api/comm/socks_channel.html#def-receive-self","114":"/en/dev/api/comm/socks_channel.html#def-close-self","115":"/en/dev/api/comm/storage.html#liteyuki-comm-storage","116":"/en/dev/api/comm/storage.html#var-on-main-subscriber-receive-funcs","117":"/en/dev/api/comm/storage.html#var-on-sub-subscriber-receive-funcs","118":"/en/dev/api/comm/storage.html#class-keyvaluestore","119":"/en/dev/api/comm/storage.html#def-init-self","120":"/en/dev/api/comm/storage.html#def-set-self-key-str-value-any-none","121":"/en/dev/api/comm/storage.html#def-get-self-key-str-default-optional-any-none-optional-any","122":"/en/dev/api/comm/storage.html#def-delete-self-key-str-ignore-key-error-bool-true-none","123":"/en/dev/api/comm/storage.html#def-get-all-self-dict-str-any","124":"/en/dev/api/comm/storage.html#def-publish-self-channel-str-data-any-none","125":"/en/dev/api/comm/storage.html#def-on-subscriber-receive-self-channel-str-callable-on-receive-func-on-receive-func","126":"/en/dev/api/comm/storage.html#async-def-run-subscriber-receive-funcs-channel-str-data-any","127":"/en/dev/api/comm/storage.html#async-def-start-receive-loop-self","128":"/en/dev/api/comm/storage.html#class-globalkeyvaluestore","129":"/en/dev/api/comm/storage.html#def-get-instance-cls","130":"/en/dev/api/comm/storage.html#attr-instance-none","131":"/en/dev/api/comm/storage.html#attr-lock-threading-lock","132":"/en/dev/api/comm/storage.html#var-ref-count","133":"/en/dev/api/comm/storage.html#def-on-get-data-tuple-str-dict-str-any","134":"/en/dev/api/comm/storage.html#def-on-set-data-tuple-str-dict-str-any","135":"/en/dev/api/comm/storage.html#def-on-delete-data-tuple-str-dict-str-any","136":"/en/dev/api/comm/storage.html#def-on-get-all-data-tuple-str-dict-str-any","137":"/en/dev/api/config.html#liteyuki-config","138":"/en/dev/api/config.html#def-flat-config-config-dict-str-any-dict-str-any","139":"/en/dev/api/config.html#def-load-from-yaml-file-str-dict-str-any","140":"/en/dev/api/config.html#def-load-from-json-file-str-dict-str-any","141":"/en/dev/api/config.html#def-load-from-toml-file-str-dict-str-any","142":"/en/dev/api/config.html#def-load-from-files-files-str-no-warning-bool-false-dict-str-any","143":"/en/dev/api/config.html#def-load-configs-from-dirs-directories-str-no-waring-bool-false-dict-str-any","144":"/en/dev/api/config.html#def-load-config-in-default-no-waring-bool-false-dict-str-any","145":"/en/dev/api/core/core.html#liteyuki-core","146":"/en/dev/api/core/#liteyuki-core","147":"/en/dev/api/core/manager.html#liteyuki-core-manager","148":"/en/dev/api/core/manager.html#class-channeldeliver","149":"/en/dev/api/core/manager.html#def-init-self-active-channel-any-passive-channel-any-channel-deliver-active-channel-channel-any-channel-deliver-passive-channel-tuple-str-dict-publish-channel-tuple-str-any","150":"/en/dev/api/core/manager.html#class-processmanager","151":"/en/dev/api/core/manager.html#def-init-self-lifespan-lifespan","152":"/en/dev/api/core/manager.html#async-def-run-process-self-name-str","153":"/en/dev/api/core/manager.html#async-def-start-all-self","154":"/en/dev/api/core/manager.html#def-add-target-self-name-str-target-target-func-args-tuple-kwargs-none","155":"/en/dev/api/core/manager.html#def-join-all-self","156":"/en/dev/api/core/manager.html#def-terminate-self-name-str","157":"/en/dev/api/core/manager.html#def-terminate-all-self","158":"/en/dev/api/core/manager.html#def-is-process-alive-self-name-str-bool","159":"/en/dev/api/dev/dev.html#liteyuki-dev","160":"/en/dev/api/dev/#liteyuki-dev","161":"/en/dev/api/dev/observer.html#liteyuki-dev-observer","162":"/en/dev/api/dev/observer.html#var-callback-func","163":"/en/dev/api/dev/observer.html#var-filter-func","164":"/en/dev/api/dev/observer.html#def-debounce-wait","165":"/en/dev/api/dev/observer.html#class-codemodifiedhandler-filesystemeventhandler","166":"/en/dev/api/dev/observer.html#def-on-modified-self-event","167":"/en/dev/api/dev/observer.html#def-on-created-self-event","168":"/en/dev/api/dev/observer.html#def-on-deleted-self-event","169":"/en/dev/api/dev/observer.html#def-on-moved-self-event","170":"/en/dev/api/dev/observer.html#def-on-any-event-self-event","171":"/en/dev/api/dev/observer.html#def-on-file-system-event-directories-tuple-str-recursive-bool-true-event-filter-filter-func-none-callable-callback-func-callback-func","172":"/en/dev/api/dev/plugin.html#liteyuki-dev-plugin","173":"/en/dev/api/dev/plugin.html#def-run-plugins-module-path-str-path","174":"/en/dev/api/exception.html#liteyuki-exception","175":"/en/dev/api/exception.html#class-liteyukiexception-baseexception","176":"/en/dev/api/#liteyuki","177":"/en/dev/api/#var-version","178":"/en/dev/api/log.html#liteyuki-log","179":"/en/dev/api/log.html#def-get-format-level-str-str","180":"/en/dev/api/log.html#def-init-log-config-dict","181":"/en/dev/api/message/event.html#liteyuki-message-event","182":"/en/dev/api/message/event.html#class-messageevent","183":"/en/dev/api/message/event.html#def-init-self-bot-id-str-message-list-dict-str-any-str-message-type-str-raw-message-str-session-id-str-user-id-str-session-type-str-receive-channel-optional-channel-messageevent-none-data-optional-dict-str-any-none","184":"/en/dev/api/message/event.html#def-reply-self-message-str-dict-str-any","185":"/en/dev/api/message/#liteyuki-message","186":"/en/dev/api/message/matcher.html#liteyuki-message-matcher","187":"/en/dev/api/message/matcher.html#class-matcher","188":"/en/dev/api/message/matcher.html#def-init-self-rule-rule-priority-int-block-bool","189":"/en/dev/api/message/matcher.html#def-handle-self-callable-eventhandler-eventhandler","190":"/en/dev/api/message/matcher.html#async-def-run-self-event-messageevent-none","191":"/en/dev/api/message/message.html#liteyuki-message","192":"/en/dev/api/message/on.html#liteyuki-message-on","193":"/en/dev/api/message/on.html#def-add-matcher-matcher-matcher","194":"/en/dev/api/message/on.html#def-on-message-rule-rule-empty-rule-priority-int-0-block-bool-false-matcher","195":"/en/dev/api/message/on.html#def-on-keywords-keywords-list-str-rule-empty-rule-priority-int-0-block-bool-false-matcher","196":"/en/dev/api/message/rule.html#liteyuki-message-rule","197":"/en/dev/api/message/rule.html#var-rulehandlerfunc","198":"/en/dev/api/message/rule.html#class-rule","199":"/en/dev/api/message/rule.html#def-init-self-handler-rulehandlerfunc","200":"/en/dev/api/message/rule.html#def-or-self-other-rule-rule","201":"/en/dev/api/message/rule.html#def-and-self-other-rule-rule","202":"/en/dev/api/message/rule.html#async-def-call-self-event-messageevent-bool","203":"/en/dev/api/message/rule.html#async-def-empty-rule-event-messageevent-bool","204":"/en/dev/api/message/rule.html#async-def-is-su-rule-event-messageevent-bool","205":"/en/dev/api/message/session.html#liteyuki-message-session","206":"/en/dev/api/mkdoc.html#liteyuki-mkdoc","207":"/en/dev/api/mkdoc.html#class-deftype-enum","208":"/en/dev/api/mkdoc.html#attr-function-function","209":"/en/dev/api/mkdoc.html#attr-method-method","210":"/en/dev/api/mkdoc.html#attr-static-method-staticmethod","211":"/en/dev/api/mkdoc.html#attr-class-method-classmethod","212":"/en/dev/api/mkdoc.html#attr-property-property","213":"/en/dev/api/mkdoc.html#class-functioninfo-basemodel","214":"/en/dev/api/mkdoc.html#attr-name-str-no-default","215":"/en/dev/api/mkdoc.html#attr-args-list-tuple-str-str-no-default","216":"/en/dev/api/mkdoc.html#attr-return-type-str-no-default","217":"/en/dev/api/mkdoc.html#attr-docstring-str-no-default","218":"/en/dev/api/mkdoc.html#attr-source-code-str","219":"/en/dev/api/mkdoc.html#attr-type-deftype-no-default","220":"/en/dev/api/mkdoc.html#attr-is-async-bool-no-default","221":"/en/dev/api/mkdoc.html#class-attributeinfo-basemodel","222":"/en/dev/api/mkdoc.html#attr-name-str-no-default-1","223":"/en/dev/api/mkdoc.html#attr-type-str-no-default","224":"/en/dev/api/mkdoc.html#attr-value-any-none","225":"/en/dev/api/mkdoc.html#attr-docstring-str","226":"/en/dev/api/mkdoc.html#class-classinfo-basemodel","227":"/en/dev/api/mkdoc.html#attr-name-str-no-default-2","228":"/en/dev/api/mkdoc.html#attr-docstring-str-no-default-1","229":"/en/dev/api/mkdoc.html#attr-methods-list-functioninfo-no-default","230":"/en/dev/api/mkdoc.html#attr-attributes-list-attributeinfo-no-default","231":"/en/dev/api/mkdoc.html#attr-inherit-list-str-no-default","232":"/en/dev/api/mkdoc.html#class-moduleinfo-basemodel","233":"/en/dev/api/mkdoc.html#attr-module-path-str-no-default","234":"/en/dev/api/mkdoc.html#attr-functions-list-functioninfo-no-default","235":"/en/dev/api/mkdoc.html#attr-classes-list-classinfo-no-default","236":"/en/dev/api/mkdoc.html#attr-attributes-list-attributeinfo-no-default-1","237":"/en/dev/api/mkdoc.html#attr-docstring-str-no-default-2","238":"/en/dev/api/mkdoc.html#def-get-relative-path-base-path-str-target-path-str-str","239":"/en/dev/api/mkdoc.html#def-write-to-files-file-data-dict-str-str","240":"/en/dev/api/mkdoc.html#def-get-file-list-module-folder-str","241":"/en/dev/api/mkdoc.html#def-get-module-info-normal-file-path-str-ignore-private-bool-true-moduleinfo","242":"/en/dev/api/mkdoc.html#def-generate-markdown-module-info-moduleinfo-front-matter-none-lang-str-zh-cn-str","243":"/en/dev/api/mkdoc.html#def-generate-docs-module-folder-str-output-dir-str-with-top-bool-false-lang-str-zh-cn-ignored-paths-none","244":"/en/dev/api/mkdoc.html#var-no-module-name-pyfile-path","245":"/en/dev/api/plugin/#liteyuki-plugin","246":"/en/dev/api/plugin/#def-get-loaded-plugins-dict-str-plugin","247":"/en/dev/api/plugin/load.html#liteyuki-plugin-load","248":"/en/dev/api/plugin/load.html#def-load-plugin-module-path-str-path-optional-plugin","249":"/en/dev/api/plugin/load.html#def-load-plugins-plugin-dir-str-ignore-warning-bool-true-set-plugin","250":"/en/dev/api/plugin/load.html#def-format-display-name-display-name-str-plugin-type-plugintype-str","251":"/en/dev/api/plugin/manager.html#liteyuki-plugin-manager","252":"/en/dev/api/plugin/model.html#liteyuki-plugin-model","253":"/en/dev/api/plugin/model.html#class-plugintype-enum","254":"/en/dev/api/plugin/model.html#attr-application-application","255":"/en/dev/api/plugin/model.html#attr-service-service","256":"/en/dev/api/plugin/model.html#attr-module-module","257":"/en/dev/api/plugin/model.html#attr-unclassified-unclassified","258":"/en/dev/api/plugin/model.html#attr-test-test","259":"/en/dev/api/plugin/model.html#class-pluginmetadata-basemodel","260":"/en/dev/api/plugin/model.html#attr-name-str-no-default","261":"/en/dev/api/plugin/model.html#attr-description-str","262":"/en/dev/api/plugin/model.html#attr-usage-str","263":"/en/dev/api/plugin/model.html#attr-type-plugintype-plugintype-unclassified","264":"/en/dev/api/plugin/model.html#attr-author-str","265":"/en/dev/api/plugin/model.html#attr-homepage-str","266":"/en/dev/api/plugin/model.html#attr-extra-dict-str-any","267":"/en/dev/api/plugin/model.html#class-plugin-basemodel","268":"/en/dev/api/plugin/model.html#def-hash-self","269":"/en/dev/api/plugin/model.html#attr-model-config-arbitrary-types-allowed-true","270":"/en/dev/api/plugin/model.html#attr-name-str-no-default-1","271":"/en/dev/api/plugin/model.html#attr-module-moduletype-no-default","272":"/en/dev/api/plugin/model.html#attr-module-name-str-no-default","273":"/en/dev/api/plugin/model.html#attr-metadata-optional-pluginmetadata-none","274":"/en/dev/api/plugin/plugin.html#liteyuki-plugin","275":"/en/dev/api/plugin/plugin.html#def-get-loaded-plugins-dict-str-plugin","276":"/en/dev/api/plugins/liteecho.html#liteyuki-plugins-liteecho","277":"/en/dev/api/plugins/liteecho.html#async-def-liteecho-event-messageevent","278":"/en/dev/api/plugins/plugin_loader/#liteyuki-plugins-plugin-loader","279":"/en/dev/api/plugins/plugin_loader/#def-default-plugins-loader","280":"/en/dev/api/plugins/plugin_loader/plugin_loader.html#liteyuki-plugins-plugin-loader","281":"/en/dev/api/plugins/plugin_loader/plugin_loader.html#def-default-plugins-loader","282":"/en/dev/api/utils.html#liteyuki-utils","283":"/en/dev/api/utils.html#def-is-coroutine-callable-call-callable-any-bool","284":"/en/dev/api/utils.html#def-run-coroutine-coro-coroutine","285":"/en/dev/api/utils.html#def-run-coroutine-in-thread-coro-coroutine","286":"/en/dev/api/utils.html#def-path-to-module-name-path-path-str","287":"/en/dev/api/utils.html#def-async-wrapper-func-callable-any-callable-coroutine","288":"/en/dev/comm.html#channel-communication","289":"/en/dev/comm.html#introduction","290":"/en/dev/comm.html#example","291":"/en/dev/comm.html#共享内存通信","292":"/en/dev/comm.html#简介","293":"/en/dev/comm.html#示例","294":"/en/dev/lyfunc.html#轻雪函数","295":"/en/dev/lyfunc.html#函数文件","296":"/en/dev/lyfunc.html#命令文档","297":"/en/dev/lyfunc.html#示例","298":"/en/dev/lyfunc.html#api","299":"/en/dev/lyfunc.html#结束关键字","300":"/en/dev/plugin.html#简介","301":"/en/dev/plugin.html#开始","302":"/en/dev/plugin.html#创建插件","303":"/en/dev/plugin.html#编写逻辑部分","304":"/en/dev/plugin.html#加载插件","305":"/en/dev/plugin.html#方法1","306":"/en/dev/plugin.html#方法2","307":"/en/dev/resource.html#简介","308":"/en/dev/resource.html#加载资源包","309":"/en/usage/agreement.html#用户协议","310":"/en/usage/basic.html#基础插件","311":"/en/usage/basic.html#轻雪命令liteyuki-command","312":"/en/usage/basic.html#命令别名","313":"/en/usage/basic.html#插件-包管理器-liteyuki-pacman","314":"/en/usage/basic.html#命令别名-1","315":"/en/usage/basic.html#用户管理liteyuki-user","316":"/en/usage/extra.html#功能插件命令","317":"/en/usage/extra.html#轻雪天气liteyuki-weather","318":"/en/usage/extra.html#命令别名","319":"/en/usage/extra.html#统计信息liteyuki-statistics","320":"/en/usage/extra.html#命令别名-1"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,50],"1":[2,1,82],"2":[2,1,67],"3":[9,1,71],"4":[1,1,21],"5":[1,1,1],"6":[3,1,172],"7":[2,1,18],"8":[4,1,31],"9":[4,1,25],"10":[1,1,14],"11":[1,1,1],"12":[2,1,59],"13":[3,1,57],"14":[3,1,18],"15":[2,1,83],"16":[6,3,1],"17":[1,1,1],"18":[3,1,7],"19":[2,1,1],"20":[2,2,1],"21":[7,4,72],"22":[5,4,23],"23":[4,4,21],"24":[6,4,32],"25":[7,4,28],"26":[8,4,56],"27":[10,4,40],"28":[6,4,17],"29":[5,4,14],"30":[4,4,16],"31":[9,4,21],"32":[9,4,21],"33":[9,4,22],"34":[10,4,23],"35":[10,4,23],"36":[9,4,22],"37":[5,2,38],"38":[10,2,27],"39":[14,2,45],"40":[4,2,24],"41":[2,1,1],"42":[2,2,1],"43":[7,4,72],"44":[5,4,23],"45":[4,4,21],"46":[6,4,32],"47":[7,4,28],"48":[8,4,56],"49":[10,4,40],"50":[6,4,17],"51":[5,4,14],"52":[4,4,16],"53":[9,4,21],"54":[9,4,21],"55":[9,4,22],"56":[10,4,23],"57":[10,4,23],"58":[9,4,22],"59":[5,2,38],"60":[10,2,27],"61":[14,2,45],"62":[4,2,24],"63":[3,1,25],"64":[2,3,1],"65":[5,5,33],"66":[14,5,45],"67":[9,5,24],"68":[9,5,24],"69":[10,5,25],"70":[9,5,24],"71":[10,5,25],"72":[9,5,24],"73":[7,5,24],"74":[7,5,24],"75":[8,5,25],"76":[7,5,24],"77":[8,5,25],"78":[7,5,24],"79":[3,1,27],"80":[5,3,1],"81":[12,8,75],"82":[8,8,27],"83":[9,8,45],"84":[6,8,48],"85":[5,8,31],"86":[6,8,32],"87":[16,8,67],"88":[10,8,36],"89":[7,8,47],"90":[3,3,9],"91":[3,3,15],"92":[4,3,11],"93":[7,3,44],"94":[7,3,23],"95":[7,3,34],"96":[8,3,38],"97":[10,3,27],"98":[10,3,30],"99":[10,3,29],"100":[2,1,9],"101":[2,1,9],"102":[3,1,25],"103":[2,3,1],"104":[9,5,16],"105":[3,1,5],"106":[2,3,1],"107":[10,5,17],"108":[9,5,20],"109":[4,1,25],"110":[2,4,1],"111":[6,6,24],"112":[5,6,17],"113":[4,6,17],"114":[4,6,13],"115":[3,1,5],"116":[6,3,12],"117":[6,3,12],"118":[2,3,1],"119":[4,5,33],"120":[9,5,35],"121":[12,5,42],"122":[12,5,47],"123":[9,5,34],"124":[9,5,26],"125":[13,5,56],"126":[11,5,32],"127":[7,5,45],"128":[2,3,2],"129":[5,5,21],"130":[4,5,1],"131":[6,5,1],"132":[3,3,17],"133":[9,3,31],"134":[9,3,29],"135":[9,3,29],"136":[10,3,29],"137":[2,1,20],"138":[8,2,43],"139":[10,2,38],"140":[10,2,37],"141":[10,2,37],"142":[14,2,46],"143":[16,2,52],"144":[15,2,37],"145":[2,1,1],"146":[2,1,1],"147":[3,1,25],"148":[2,3,1],"149":[14,5,21],"150":[2,3,1],"151":[6,5,20],"152":[8,5,69],"153":[6,5,34],"154":[14,5,52],"155":[5,5,16],"156":[6,5,36],"157":[5,5,15],"158":[9,5,32],"159":[2,1,3],"160":[2,1,3],"161":[3,1,6],"162":[3,3,9],"163":[3,3,9],"164":[4,3,28],"165":[4,3,3],"166":[6,7,19],"167":[6,7,12],"168":[6,7,12],"169":[6,7,12],"170":[6,7,12],"171":[20,3,56],"172":[3,1,25],"173":[9,3,36],"174":[2,1,3],"175":[4,2,1],"176":[1,1,1],"177":[3,1,7],"178":[2,1,25],"179":[6,2,20],"180":[6,2,50],"181":[3,1,25],"182":[2,3,1],"183":[24,5,52],"184":[9,5,39],"185":[2,1,25],"186":[3,1,25],"187":[2,3,1],"188":[10,5,30],"189":[7,5,24],"190":[8,5,35],"191":[2,1,25],"192":[3,1,25],"193":[5,3,24],"194":[15,3,21],"195":[16,3,32],"196":[3,1,25],"197":[2,3,11],"198":[2,3,1],"199":[6,5,13],"200":[6,5,21],"201":[6,5,22],"202":[8,5,23],"203":[8,3,19],"204":[9,3,24],"205":[3,1,25],"206":[2,1,25],"207":[4,2,1],"208":[5,6,1],"209":[5,6,1],"210":[6,6,1],"211":[6,6,1],"212":[5,6,1],"213":[4,2,1],"214":[6,6,1],"215":[8,6,1],"216":[7,6,1],"217":[6,6,1],"218":[6,6,1],"219":[6,6,1],"220":[7,6,1],"221":[4,2,1],"222":[6,6,1],"223":[6,6,1],"224":[5,6,1],"225":[5,6,1],"226":[4,2,1],"227":[6,6,1],"228":[6,6,1],"229":[7,6,1],"230":[7,6,1],"231":[7,6,1],"232":[4,2,1],"233":[7,6,1],"234":[7,6,1],"235":[7,6,1],"236":[7,6,1],"237":[6,6,1],"238":[8,2,24],"239":[9,2,40],"240":[8,2,30],"241":[15,2,147],"242":[15,2,99],"243":[20,2,98],"244":[6,2,10],"245":[2,1,1],"246":[9,2,21],"247":[3,1,25],"248":[12,3,84],"249":[15,3,62],"250":[9,3,44],"251":[3,1,25],"252":[3,1,25],"253":[4,3,1],"254":[5,7,1],"255":[5,7,1],"256":[5,7,1],"257":[5,7,1],"258":[5,7,1],"259":[4,3,1],"260":[6,7,1],"261":[5,7,1],"262":[5,7,1],"263":[5,7,1],"264":[5,7,1],"265":[5,7,1],"266":[7,7,1],"267":[4,3,1],"268":[4,7,13],"269":[9,7,1],"270":[6,7,1],"271":[6,7,1],"272":[7,7,1],"273":[6,7,1],"274":[2,1,1],"275":[9,2,21],"276":[3,1,31],"277":[6,3,23],"278":[4,1,25],"279":[5,4,24],"280":[4,1,25],"281":[5,4,24],"282":[2,1,6],"283":[9,2,35],"284":[6,2,47],"285":[8,2,25],"286":[8,2,43],"287":[9,2,30],"288":[2,1,1],"289":[1,2,46],"290":[1,2,105],"291":[1,2,1],"292":[1,3,9],"293":[1,3,18],"294":[1,1,9],"295":[1,1,25],"296":[1,1,33],"297":[1,2,26],"298":[1,1,7],"299":[1,1,18],"300":[1,1,4],"301":[1,1,1],"302":[1,2,42],"303":[1,2,58],"304":[1,2,1],"305":[1,3,6],"306":[1,3,25],"307":[1,1,31],"308":[1,1,56],"309":[1,1,28],"310":[1,1,16],"311":[2,1,86],"312":[1,3,30],"313":[4,1,53],"314":[1,5,38],"315":[2,1,20],"316":[1,1,1],"317":[2,1,30],"318":[1,3,8],"319":[2,1,35],"320":[1,3,17]},"averageFieldLength":[5.803738317757008,3.5046728971962615,23.074766355140184],"storedFields":{"0":{"title":"Configurations","titles":[]},"1":{"title":"Basic Configuration","titles":["Configurations"]},"2":{"title":"Other configurations","titles":["Configurations"]},"3":{"title":"Example: Configuration of OneBot implementation side connected to NoneBot","titles":["Configurations"]},"4":{"title":"Other","titles":["Configurations"]},"5":{"title":"FAQ","titles":[]},"6":{"title":"Frequently Asked Questions","titles":["FAQ"]},"7":{"title":"Other questions","titles":["FAQ"]},"8":{"title":"Recommended Solution(QQ)","titles":["FAQ"]},"9":{"title":"Recommended Solution(Minecraft)","titles":["FAQ"]},"10":{"title":"Acknowledgements","titles":["FAQ"]},"11":{"title":"Install","titles":[]},"12":{"title":"Normal Installation","titles":["Install"]},"13":{"title":"Run with Docker","titles":["Install"]},"14":{"title":"Use TRSS Script","titles":["Install"]},"15":{"title":"Device Requirements","titles":["Install"]},"16":{"title":"For other questions, please refer to","titles":["Install","Device Requirements"]},"17":{"title":"liteyuki","titles":[]},"18":{"title":"var __version__","titles":["liteyuki"]},"19":{"title":"liteyuki.bot","titles":[]},"20":{"title":"class LiteyukiBot","titles":["liteyuki.bot"]},"21":{"title":"def __init__(self, *args, **kwargs) -> None","titles":["liteyuki.bot","class LiteyukiBot"]},"22":{"title":"async def _run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"23":{"title":"def run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"24":{"title":"async def keep_alive(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"25":{"title":"def _handle_exit(self, signum, frame)","titles":["liteyuki.bot","class LiteyukiBot"]},"26":{"title":"def restart(self, delay: int = 0)","titles":["liteyuki.bot","class LiteyukiBot"]},"27":{"title":"def restart_process(self, name: Optional[str] = None)","titles":["liteyuki.bot","class LiteyukiBot"]},"28":{"title":"def init(self, *args, **kwargs)","titles":["liteyuki.bot","class LiteyukiBot"]},"29":{"title":"def init_logger(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"30":{"title":"def stop(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"31":{"title":"def on_before_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"32":{"title":"def on_after_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"33":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"34":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"35":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"36":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"37":{"title":"def get_bot() -> LiteyukiBot","titles":["liteyuki.bot"]},"38":{"title":"def get_config(key: str, default: Any = None) -> Any","titles":["liteyuki.bot"]},"39":{"title":"def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any","titles":["liteyuki.bot"]},"40":{"title":"def print_logo()","titles":["liteyuki.bot"]},"41":{"title":"liteyuki.bot","titles":[]},"42":{"title":"class LiteyukiBot","titles":["liteyuki.bot"]},"43":{"title":"def __init__(self, *args, **kwargs) -> None","titles":["liteyuki.bot","class LiteyukiBot"]},"44":{"title":"async def _run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"45":{"title":"def run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"46":{"title":"async def keep_alive(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"47":{"title":"def _handle_exit(self, signum, frame)","titles":["liteyuki.bot","class LiteyukiBot"]},"48":{"title":"def restart(self, delay: int = 0)","titles":["liteyuki.bot","class LiteyukiBot"]},"49":{"title":"def restart_process(self, name: Optional[str] = None)","titles":["liteyuki.bot","class LiteyukiBot"]},"50":{"title":"def init(self, *args, **kwargs)","titles":["liteyuki.bot","class LiteyukiBot"]},"51":{"title":"def init_logger(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"52":{"title":"def stop(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"53":{"title":"def on_before_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"54":{"title":"def on_after_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"55":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"56":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"57":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"58":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"59":{"title":"def get_bot() -> LiteyukiBot","titles":["liteyuki.bot"]},"60":{"title":"def get_config(key: str, default: Any = None) -> Any","titles":["liteyuki.bot"]},"61":{"title":"def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any","titles":["liteyuki.bot"]},"62":{"title":"def print_logo()","titles":["liteyuki.bot"]},"63":{"title":"liteyuki.bot.lifespan","titles":[]},"64":{"title":"class Lifespan","titles":["liteyuki.bot.lifespan"]},"65":{"title":"def __init__(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"66":{"title":"async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"67":{"title":"def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"68":{"title":"def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"69":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"70":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"71":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"72":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"73":{"title":"async def before_start(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"74":{"title":"async def after_start(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"75":{"title":"async def before_process_shutdown(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"76":{"title":"async def after_shutdown(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"77":{"title":"async def before_process_restart(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"78":{"title":"async def after_restart(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"79":{"title":"liteyuki.comm.channel","titles":[]},"80":{"title":"class Channel(Generic[T])","titles":["liteyuki.comm.channel"]},"81":{"title":"def __init__(self, name: str, type_check: Optional[bool] = None)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"82":{"title":"def _get_generic_type(self) -> Optional[type]","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"83":{"title":"def _validate_structure(self, data: Any, structure: type) -> bool","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"84":{"title":"def send(self, data: T)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"85":{"title":"def receive(self) -> T","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"86":{"title":"async def async_receive(self) -> T","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"87":{"title":"def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"88":{"title":"async def _run_on_receive_funcs(self, data: Any)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"89":{"title":"async def start_receive_loop(self)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"90":{"title":"var active_channel","titles":["liteyuki.comm.channel"]},"91":{"title":"var publish_channel","titles":["liteyuki.comm.channel"]},"92":{"title":"var channel_deliver_active_channel","titles":["liteyuki.comm.channel"]},"93":{"title":"def set_channel(name: str, channel: Channel)","titles":["liteyuki.comm.channel"]},"94":{"title":"def set_channels(channels: dict[str, Channel])","titles":["liteyuki.comm.channel"]},"95":{"title":"def get_channel(name: str) -> Channel","titles":["liteyuki.comm.channel"]},"96":{"title":"def get_channels() -> dict[str, Channel]","titles":["liteyuki.comm.channel"]},"97":{"title":"def on_set_channel(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"98":{"title":"def on_get_channel(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"99":{"title":"def on_get_channels(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"100":{"title":"liteyuki.comm","titles":[]},"101":{"title":"liteyuki.comm","titles":[]},"102":{"title":"liteyuki.comm.event","titles":[]},"103":{"title":"class Event","titles":["liteyuki.comm.event"]},"104":{"title":"def __init__(self, name: str, data: dict[str, Any])","titles":["liteyuki.comm.event","class Event"]},"105":{"title":"liteyuki.comm.rpc","titles":[]},"106":{"title":"class RPC","titles":["liteyuki.comm.rpc"]},"107":{"title":"def __init__(self, on_calling: ON_CALLING_FUNC) -> None","titles":["liteyuki.comm.rpc","class RPC"]},"108":{"title":"def call(self, args: tuple, kwargs: dict) -> Any","titles":["liteyuki.comm.rpc","class RPC"]},"109":{"title":"liteyuki.comm.socks_channel","titles":[]},"110":{"title":"class SocksChannel","titles":["liteyuki.comm.socks_channel"]},"111":{"title":"def __init__(self, name: str)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"112":{"title":"def send(self, data)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"113":{"title":"def receive(self)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"114":{"title":"def close(self)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"115":{"title":"liteyuki.comm.storage","titles":[]},"116":{"title":"var _on_main_subscriber_receive_funcs","titles":["liteyuki.comm.storage"]},"117":{"title":"var _on_sub_subscriber_receive_funcs","titles":["liteyuki.comm.storage"]},"118":{"title":"class KeyValueStore","titles":["liteyuki.comm.storage"]},"119":{"title":"def __init__(self)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"120":{"title":"def set(self, key: str, value: Any) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"121":{"title":"def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"122":{"title":"def delete(self, key: str, ignore_key_error: bool = True) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"123":{"title":"def get_all(self) -> dict[str, Any]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"124":{"title":"def publish(self, channel_: str, data: Any) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"125":{"title":"def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"126":{"title":"async def run_subscriber_receive_funcs(channel_: str, data: Any)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"127":{"title":"async def start_receive_loop(self)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"128":{"title":"class GlobalKeyValueStore","titles":["liteyuki.comm.storage"]},"129":{"title":"def get_instance(cls)","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"130":{"title":"attr _instance = None","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"131":{"title":"attr _lock = threading.Lock()","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"132":{"title":"var _ref_count","titles":["liteyuki.comm.storage"]},"133":{"title":"def on_get(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"134":{"title":"def on_set(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"135":{"title":"def on_delete(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"136":{"title":"def on_get_all(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"137":{"title":"liteyuki.config","titles":[]},"138":{"title":"def flat_config(config: dict[str, Any]) -> dict[str, Any]","titles":["liteyuki.config"]},"139":{"title":"def load_from_yaml(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"140":{"title":"def load_from_json(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"141":{"title":"def load_from_toml(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"142":{"title":"def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"143":{"title":"def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"144":{"title":"def load_config_in_default(no_waring: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"145":{"title":"liteyuki.core","titles":[]},"146":{"title":"liteyuki.core","titles":[]},"147":{"title":"liteyuki.core.manager","titles":[]},"148":{"title":"class ChannelDeliver","titles":["liteyuki.core.manager"]},"149":{"title":"def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])","titles":["liteyuki.core.manager","class ChannelDeliver"]},"150":{"title":"class ProcessManager","titles":["liteyuki.core.manager"]},"151":{"title":"def __init__(self, lifespan: Lifespan)","titles":["liteyuki.core.manager","class ProcessManager"]},"152":{"title":"async def _run_process(self, name: str)","titles":["liteyuki.core.manager","class ProcessManager"]},"153":{"title":"async def start_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"154":{"title":"def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)","titles":["liteyuki.core.manager","class ProcessManager"]},"155":{"title":"def join_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"156":{"title":"def terminate(self, name: str)","titles":["liteyuki.core.manager","class ProcessManager"]},"157":{"title":"def terminate_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"158":{"title":"def is_process_alive(self, name: str) -> bool","titles":["liteyuki.core.manager","class ProcessManager"]},"159":{"title":"liteyuki.dev","titles":[]},"160":{"title":"liteyuki.dev","titles":[]},"161":{"title":"liteyuki.dev.observer","titles":[]},"162":{"title":"var CALLBACK_FUNC","titles":["liteyuki.dev.observer"]},"163":{"title":"var FILTER_FUNC","titles":["liteyuki.dev.observer"]},"164":{"title":"def debounce(wait)","titles":["liteyuki.dev.observer"]},"165":{"title":"class CodeModifiedHandler(FileSystemEventHandler)","titles":["liteyuki.dev.observer"]},"166":{"title":"def on_modified(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"167":{"title":"def on_created(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"168":{"title":"def on_deleted(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"169":{"title":"def on_moved(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"170":{"title":"def on_any_event(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"171":{"title":"def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]","titles":["liteyuki.dev.observer"]},"172":{"title":"liteyuki.dev.plugin","titles":[]},"173":{"title":"def run_plugins(*module_path: str | Path)","titles":["liteyuki.dev.plugin"]},"174":{"title":"liteyuki.exception","titles":[]},"175":{"title":"class LiteyukiException(BaseException)","titles":["liteyuki.exception"]},"176":{"title":"liteyuki","titles":[]},"177":{"title":"var __version__","titles":["liteyuki"]},"178":{"title":"liteyuki.log","titles":[]},"179":{"title":"def get_format(level: str) -> str","titles":["liteyuki.log"]},"180":{"title":"def init_log(config: dict)","titles":["liteyuki.log"]},"181":{"title":"liteyuki.message.event","titles":[]},"182":{"title":"class MessageEvent","titles":["liteyuki.message.event"]},"183":{"title":"def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)","titles":["liteyuki.message.event","class MessageEvent"]},"184":{"title":"def reply(self, message: str | dict[str, Any])","titles":["liteyuki.message.event","class MessageEvent"]},"185":{"title":"liteyuki.message","titles":[]},"186":{"title":"liteyuki.message.matcher","titles":[]},"187":{"title":"class Matcher","titles":["liteyuki.message.matcher"]},"188":{"title":"def __init__(self, rule: Rule, priority: int, block: bool)","titles":["liteyuki.message.matcher","class Matcher"]},"189":{"title":"def handle(self) -> Callable[[EventHandler], EventHandler]","titles":["liteyuki.message.matcher","class Matcher"]},"190":{"title":"async def run(self, event: MessageEvent) -> None","titles":["liteyuki.message.matcher","class Matcher"]},"191":{"title":"liteyuki.message","titles":[]},"192":{"title":"liteyuki.message.on","titles":[]},"193":{"title":"def add_matcher(matcher: Matcher)","titles":["liteyuki.message.on"]},"194":{"title":"def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher","titles":["liteyuki.message.on"]},"195":{"title":"def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher","titles":["liteyuki.message.on"]},"196":{"title":"liteyuki.message.rule","titles":[]},"197":{"title":"var RuleHandlerFunc","titles":["liteyuki.message.rule"]},"198":{"title":"class Rule","titles":["liteyuki.message.rule"]},"199":{"title":"def __init__(self, handler: RuleHandlerFunc)","titles":["liteyuki.message.rule","class Rule"]},"200":{"title":"def __or__(self, other: Rule) -> Rule","titles":["liteyuki.message.rule","class Rule"]},"201":{"title":"def __and__(self, other: Rule) -> Rule","titles":["liteyuki.message.rule","class Rule"]},"202":{"title":"async def __call__(self, event: MessageEvent) -> bool","titles":["liteyuki.message.rule","class Rule"]},"203":{"title":"async def empty_rule(event: MessageEvent) -> bool","titles":["liteyuki.message.rule"]},"204":{"title":"async def is_su_rule(event: MessageEvent) -> bool","titles":["liteyuki.message.rule"]},"205":{"title":"liteyuki.message.session","titles":[]},"206":{"title":"liteyuki.mkdoc","titles":[]},"207":{"title":"class DefType(Enum)","titles":["liteyuki.mkdoc"]},"208":{"title":"attr FUNCTION = 'function'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"209":{"title":"attr METHOD = 'method'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"210":{"title":"attr STATIC_METHOD = 'staticmethod'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"211":{"title":"attr CLASS_METHOD = 'classmethod'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"212":{"title":"attr PROPERTY = 'property'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"213":{"title":"class FunctionInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"214":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"215":{"title":"attr args: list[tuple[str, str]] = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"216":{"title":"attr return_type: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"217":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"218":{"title":"attr source_code: str = ''","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"219":{"title":"attr type: DefType = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"220":{"title":"attr is_async: bool = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"221":{"title":"class AttributeInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"222":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"223":{"title":"attr type: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"224":{"title":"attr value: Any = None","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"225":{"title":"attr docstring: str = ''","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"226":{"title":"class ClassInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"227":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"228":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"229":{"title":"attr methods: list[FunctionInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"230":{"title":"attr attributes: list[AttributeInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"231":{"title":"attr inherit: list[str] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"232":{"title":"class ModuleInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"233":{"title":"attr module_path: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"234":{"title":"attr functions: list[FunctionInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"235":{"title":"attr classes: list[ClassInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"236":{"title":"attr attributes: list[AttributeInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"237":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"238":{"title":"def get_relative_path(base_path: str, target_path: str) -> str","titles":["liteyuki.mkdoc"]},"239":{"title":"def write_to_files(file_data: dict[str, str])","titles":["liteyuki.mkdoc"]},"240":{"title":"def get_file_list(module_folder: str)","titles":["liteyuki.mkdoc"]},"241":{"title":"def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo","titles":["liteyuki.mkdoc"]},"242":{"title":"def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str","titles":["liteyuki.mkdoc"]},"243":{"title":"def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)","titles":["liteyuki.mkdoc"]},"244":{"title":"var no_module_name_pyfile_path","titles":["liteyuki.mkdoc"]},"245":{"title":"liteyuki.plugin","titles":[]},"246":{"title":"def get_loaded_plugins() -> dict[str, Plugin]","titles":["liteyuki.plugin"]},"247":{"title":"liteyuki.plugin.load","titles":[]},"248":{"title":"def load_plugin(module_path: str | Path) -> Optional[Plugin]","titles":["liteyuki.plugin.load"]},"249":{"title":"def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]","titles":["liteyuki.plugin.load"]},"250":{"title":"def format_display_name(display_name: str, plugin_type: PluginType) -> str","titles":["liteyuki.plugin.load"]},"251":{"title":"liteyuki.plugin.manager","titles":[]},"252":{"title":"liteyuki.plugin.model","titles":[]},"253":{"title":"class PluginType(Enum)","titles":["liteyuki.plugin.model"]},"254":{"title":"attr APPLICATION = 'application'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"255":{"title":"attr SERVICE = 'service'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"256":{"title":"attr MODULE = 'module'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"257":{"title":"attr UNCLASSIFIED = 'unclassified'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"258":{"title":"attr TEST = 'test'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"259":{"title":"class PluginMetadata(BaseModel)","titles":["liteyuki.plugin.model"]},"260":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"261":{"title":"attr description: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"262":{"title":"attr usage: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"263":{"title":"attr type: PluginType = PluginType.UNCLASSIFIED","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"264":{"title":"attr author: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"265":{"title":"attr homepage: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"266":{"title":"attr extra: dict[str, Any] = {}","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"267":{"title":"class Plugin(BaseModel)","titles":["liteyuki.plugin.model"]},"268":{"title":"def __hash__(self)","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"269":{"title":"attr model_config = {'arbitrary_types_allowed': True}","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"270":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"271":{"title":"attr module: ModuleType = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"272":{"title":"attr module_name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"273":{"title":"attr metadata: Optional[PluginMetadata] = None","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"274":{"title":"liteyuki.plugin","titles":[]},"275":{"title":"def get_loaded_plugins() -> dict[str, Plugin]","titles":["liteyuki.plugin"]},"276":{"title":"liteyuki.plugins.liteecho","titles":[]},"277":{"title":"async def liteecho(event: MessageEvent)","titles":["liteyuki.plugins.liteecho"]},"278":{"title":"liteyuki.plugins.plugin_loader","titles":[]},"279":{"title":"def default_plugins_loader()","titles":["liteyuki.plugins.plugin_loader"]},"280":{"title":"liteyuki.plugins.plugin_loader","titles":[]},"281":{"title":"def default_plugins_loader()","titles":["liteyuki.plugins.plugin_loader"]},"282":{"title":"liteyuki.utils","titles":[]},"283":{"title":"def is_coroutine_callable(call: Callable[..., Any]) -> bool","titles":["liteyuki.utils"]},"284":{"title":"def run_coroutine(*coro: Coroutine)","titles":["liteyuki.utils"]},"285":{"title":"def run_coroutine_in_thread(*coro: Coroutine)","titles":["liteyuki.utils"]},"286":{"title":"def path_to_module_name(path: Path) -> str","titles":["liteyuki.utils"]},"287":{"title":"def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]","titles":["liteyuki.utils"]},"288":{"title":"Channel Communication","titles":[]},"289":{"title":"Introduction","titles":["Channel Communication"]},"290":{"title":"Example","titles":["Channel Communication"]},"291":{"title":"共享内存通信","titles":["Channel Communication"]},"292":{"title":"简介","titles":["Channel Communication","共享内存通信"]},"293":{"title":"示例","titles":["Channel Communication","共享内存通信"]},"294":{"title":"轻雪函数","titles":[]},"295":{"title":"函数文件","titles":["轻雪函数"]},"296":{"title":"命令文档","titles":["轻雪函数"]},"297":{"title":"示例","titles":["轻雪函数","命令文档"]},"298":{"title":"API","titles":["轻雪函数"]},"299":{"title":"结束关键字","titles":["轻雪函数"]},"300":{"title":"简介","titles":[]},"301":{"title":"开始","titles":["简介"]},"302":{"title":"创建插件","titles":["简介","开始"]},"303":{"title":"编写逻辑部分","titles":["简介","开始"]},"304":{"title":"加载插件","titles":["简介","开始"]},"305":{"title":"方法1","titles":["简介","开始","加载插件"]},"306":{"title":"方法2","titles":["简介","开始","加载插件"]},"307":{"title":"简介","titles":[]},"308":{"title":"加载资源包","titles":["简介"]},"309":{"title":"用户协议","titles":[]},"310":{"title":"基础插件","titles":[]},"311":{"title":"轻雪命令liteyuki_command","titles":["基础插件"]},"312":{"title":"命令别名","titles":["基础插件","轻雪命令liteyuki_command"]},"313":{"title":"插件/包管理器 liteyuki_pacman","titles":["基础插件"]},"314":{"title":"命令别名","titles":["基础插件","插件/包管理器 liteyuki_pacman"]},"315":{"title":"用户管理liteyuki_user","titles":["基础插件"]},"316":{"title":"功能插件命令","titles":[]},"317":{"title":"轻雪天气liteyuki_weather","titles":["功能插件命令"]},"318":{"title":"命令别名","titles":["功能插件命令","轻雪天气liteyuki_weather"]},"319":{"title":"统计信息liteyuki_statistics","titles":["功能插件命令"]},"320":{"title":"命令别名","titles":["功能插件命令","统计信息liteyuki_statistics"]}},"dirtCount":0,"index":[["或",{"2":{"319":2}}],["或插件路径",{"2":{"248":2}}],["秒",{"2":{"319":2}}],["小时",{"2":{"319":2}}],["天",{"2":{"319":2}}],["天气",{"2":{"317":1,"318":1}}],["格式",{"2":{"319":1}}],["格式为onebot",{"2":{"311":1}}],["统计时间范围为duration",{"2":{"319":1}}],["统计周期为period",{"2":{"319":1}}],["统计信息",{"2":{"319":1}}],["统计信息liteyuki",{"0":{"319":1},"1":{"320":1}}],["功能",{"2":{"319":1}}],["功能插件命令",{"0":{"316":1},"1":{"317":1,"318":1,"319":1,"320":1}}],["绑定城市",{"2":{"318":1}}],["绑定查询城市",{"2":{"317":1}}],["个人全局生效",{"2":{"317":1}}],["个人信息",{"2":{"315":1}}],["海淀",{"2":{"317":1}}],["北京",{"2":{"317":1}}],["支持中英文",{"2":{"317":2}}],["支持中英文城市名",{"2":{"317":1}}],["支持多个关键词查询",{"2":{"317":1}}],["支持绑定城市",{"2":{"317":1}}],["支持单行注释",{"2":{"295":1}}],["受限于nonebot2钩子函数的依赖注入参数",{"2":{"314":1}}],["帮助",{"2":{"314":1}}],["列表",{"2":{"314":1}}],["列出所有资源包",{"2":{"313":1}}],["列出所有插件",{"2":{"313":1}}],["更改",{"2":{"314":1}}],["更新",{"2":{"314":1}}],["更新插件商店索引",{"2":{"313":1}}],["更新轻雪",{"2":{"311":1,"312":1}}],["全局停用",{"2":{"314":1}}],["全局启用",{"2":{"313":1,"314":1}}],["搜索",{"2":{"314":1}}],["卸载",{"2":{"314":2}}],["卸载资源包",{"2":{"313":1}}],["卸载插件",{"2":{"313":1}}],["私聊所有人可用",{"2":{"313":2}}],["私聊通常为用户id",{"2":{"183":1}}],["当前bot",{"2":{"319":1}}],["当前群聊",{"2":{"319":1}}],["当前会话启用",{"2":{"313":1}}],["当前的轻雪实例",{"2":{"37":2,"59":2}}],["包管理器",{"0":{"313":1},"1":{"314":1}}],["包括子task",{"2":{"296":1}}],["切换图片模式",{"2":{"312":1}}],["状态",{"2":{"312":1}}],["别名",{"2":{"312":1,"314":1,"315":1,"318":1,"320":1}}],["群号",{"2":{"311":1}}],["群聊",{"2":{"312":1}}],["群聊仅群主",{"2":{"311":1,"313":2}}],["群聊通常为群id",{"2":{"183":1}}],["管理员",{"2":{"311":1,"313":2}}],["停用插件",{"2":{"313":2}}],["停用",{"2":{"312":1,"314":1}}],["停用机器人",{"2":{"311":1}}],["停止后",{"2":{"76":2}}],["停止前",{"2":{"75":2}}],["停止",{"2":{"65":2}}],["停止轻雪",{"2":{"27":2,"30":2,"49":2,"52":2}}],["该功能需要commit",{"2":{"311":1}}],["该模块封装通道实现",{"2":{"292":1}}],["该模块用于存放一些开发工具",{"2":{"159":1,"160":1}}],["该模块用于常用配置文件的加载",{"2":{"137":1}}],["该模块用于轻雪主进程和nonebot子进程之间的通信",{"2":{"100":1,"101":1}}],["推荐私聊使用",{"2":{"311":1}}],["推荐在编写html时同时更改对应js代码",{"2":{"307":1}}],["查询目标地实时天气",{"2":{"317":1}}],["查询实时天气",{"2":{"317":1}}],["查询",{"2":{"312":1,"315":1}}],["查询配置项",{"2":{"311":1}}],["查看用户信息菜单",{"2":{"315":1}}],["查看插件帮助",{"2":{"313":1}}],["查看轻雪文档",{"2":{"311":1}}],["查看统计信息和状态",{"2":{"311":1}}],["查看当前bot",{"2":{"311":1}}],["和风天气的天气key",{"2":{"317":1}}],["和",{"2":{"311":1}}],["和10是不一样的",{"2":{"311":1}}],["和config目录下的所有配置文件",{"2":{"144":2}}],["输入值会被执行以转换为正确的类型",{"2":{"311":1}}],["输出",{"2":{"295":1}}],["输出文件夹",{"2":{"243":2}}],["输出文件",{"2":{"239":2}}],["版本",{"2":{"311":1}}],["❌",{"2":{"311":11}}],["超级用户可用",{"2":{"311":1,"313":2}}],["超级用户",{"2":{"311":10,"313":10}}],["重载",{"2":{"314":1}}],["重载所有资源包",{"2":{"313":1}}],["重载资源",{"2":{"312":1}}],["重载轻雪",{"2":{"311":1}}],["重启轻雪",{"2":{"312":1}}],["重启轻雪即可加载插件",{"2":{"305":1}}],["重启轻雪本体",{"2":{"26":2,"48":2}}],["重启后",{"2":{"78":2}}],["重启前",{"2":{"77":2}}],["重启",{"2":{"65":2}}],["举例",{"2":{"311":1}}],["权限",{"2":{"311":1,"313":2,"315":1}}],["说明",{"2":{"311":1,"313":2,"315":1}}],["~代替",{"2":{"310":1}}],["~可以使用插件",{"2":{"310":1}}],["安装插件",{"2":{"313":1}}],["安装",{"2":{"310":1,"314":1}}],["安装的插件",{"2":{"248":2}}],["命令",{"2":{"311":1,"312":1,"313":2,"314":1,"315":2,"317":1,"318":1,"319":1,"320":1}}],["命令别名",{"0":{"312":1,"314":1,"318":1,"320":1},"2":{"310":1,"315":1}}],["命令文档",{"0":{"296":1},"1":{"297":1}}],["且通过安全的方式传输到轻雪的服务器",{"2":{"309":1}}],["且通道标识为",{"2":{"290":1}}],["系统信息及python信息",{"2":{"309":1}}],["内存",{"2":{"309":1}}],["内存共享是线程安全的",{"2":{"292":1}}],["内存共享使得代码编写更加简洁",{"2":{"292":1}}],["分钟",{"2":{"319":2}}],["分发",{"2":{"309":1}}],["分工明确",{"2":{"137":1}}],["修改优先级",{"2":{"313":1}}],["修改",{"2":{"309":1}}],["本项目不会收集用户的任何隐私信息",{"2":{"309":1}}],["本项目遵循mit协议",{"2":{"309":1}}],["本模块用于实现rpc",{"2":{"105":1}}],["本模块定义了一个通用的通道类",{"2":{"79":1}}],["同时用户也应该自行选择可用的资源包",{"2":{"308":1}}],["同步接收数据",{"2":{"85":2}}],["第三方资源包开发者需要注意版本兼容性",{"2":{"308":1}}],["对于主动推送的插件不生效",{"2":{"314":1}}],["对于不同资源包的不同文件",{"2":{"308":1}}],["对外启动方法",{"2":{"153":2}}],["└─",{"2":{"308":1}}],["└───",{"2":{"308":1}}],["└─resource",{"2":{"308":2}}],["├─templates",{"2":{"308":1}}],["├─metadata",{"2":{"308":2}}],["正常的路径应该是这样的",{"2":{"308":1}}],["只需要将其解压到根目录resources目录下即可",{"2":{"308":1}}],["以上内容仅用于项目的优化",{"2":{"309":1}}],["以避免出现无法预料的问题",{"2":{"307":1}}],["以下我们会编写一个简单的插件",{"2":{"303":1}}],["错位等无法预料的事情发生",{"2":{"307":1}}],["异常",{"2":{"307":1}}],["异步任务结束关键字",{"2":{"299":1}}],["异步等待",{"2":{"296":1}}],["异步包装器",{"2":{"287":2}}],["异步接收数据",{"2":{"86":2}}],["欢迎各位投稿资源包到轻雪资源商店",{"2":{"307":1}}],["部分异常信息",{"2":{"309":1}}],["部分内容制作需要一点点前端基础",{"2":{"307":1}}],["部分来源于",{"2":{"282":1}}],["讲起打包成一个新的资源包",{"2":{"307":1}}],["仅需按照原有路径进行文件替换即可",{"2":{"307":1}}],["那么加载b包后",{"2":{"308":1}}],["那么你能够很快就上手",{"2":{"307":1}}],["那么当前所有函数包的task都会被截停销毁",{"2":{"299":1}}],["如果你接触过minecraft的资源包",{"2":{"307":1}}],["如果你想同时输出多行内容可以尝试换行符",{"2":{"295":1}}],["主题包中的html渲染使用js来规定数据的渲染位置",{"2":{"307":1}}],["主题商店提供了一些资源包供你选择",{"2":{"307":1}}],["主进程中",{"2":{"290":1}}],["主进程中通过get",{"2":{"290":1}}],["主进程订阅者接收函数",{"2":{"116":1}}],["主进程创建单例",{"2":{"91":1,"92":1}}],["资源",{"2":{"307":1}}],["资源包管理",{"2":{"313":1}}],["资源包的结构会随着轻雪的更新而有变动",{"2":{"308":1}}],["资源包的制作很简单",{"2":{"307":1}}],["资源包加载遵循一个优先级",{"2":{"308":1}}],["资源包描述",{"2":{"308":1}}],["资源包名称",{"2":{"308":1}}],["资源包通常是以",{"2":{"308":1}}],["资源包",{"2":{"307":1,"314":1}}],["它允许你一定程度上自定义轻雪的外观",{"2":{"307":1}}],["它允许你在轻雪中运行一些自定义的由数据驱动的命令",{"2":{"294":1}}],["字体包",{"2":{"307":1}}],["字符串",{"2":{"242":2}}],["亦可根据用途称为主题包",{"2":{"307":1}}],["保存后轻雪会自动重载nonebot进程",{"2":{"306":1}}],["保持轻雪运行",{"2":{"24":2,"46":2}}],["我们在src",{"2":{"306":1}}],["然后运行python",{"2":{"306":1}}],["方法2",{"0":{"306":1}}],["方法1",{"0":{"305":1}}],["用户管理liteyuki",{"0":{"315":1}}],["用户协议",{"0":{"309":1}}],["用observer的on",{"2":{"303":1}}],["用于统计bot接收到的消息",{"2":{"319":1}}],["用于开发nonebot时进行文件系统变更重载",{"2":{"303":1}}],["用于结束当前已完成function的执行",{"2":{"299":1}}],["用于回复消息",{"2":{"183":1}}],["用于获取和唯一标识",{"2":{"154":2}}],["用于进程间通信",{"2":{"79":1}}],["排除的文件扩展名",{"2":{"303":1}}],["因此插件主要是一些后台任务或者与聊天机器人的通信",{"2":{"303":1}}],["定义插件元数据",{"2":{"302":1}}],["定义变量",{"2":{"296":1}}],["导入轻雪bot和日志",{"2":{"303":1}}],["导入文件系统事件",{"2":{"303":1}}],["导入文件系统观察器",{"2":{"303":1}}],["导入文件夹下多个插件",{"2":{"249":2}}],["导入逻辑部分",{"2":{"302":1}}],["即后加载的资源包会覆盖前面的资源包",{"2":{"308":1}}],["即可创建一个插件",{"2":{"302":1}}],["即不等待",{"2":{"296":1}}],["首先创建一个文件夹",{"2":{"302":1}}],["编写逻辑部分",{"0":{"303":1}}],["编写轻雪函数推荐你使用vs",{"2":{"299":1}}],["编辑时的语法高亮可采取shell格式",{"2":{"295":1}}],["有一个task任务没有完成而await被执行了",{"2":{"299":1}}],["的情况是效率提升的关键",{"2":{"299":1}}],["单线程走到底",{"2":{"299":1}}],["单位s",{"2":{"296":1}}],["避免出现",{"2":{"299":1}}],["所有人",{"2":{"311":1,"313":1,"315":3}}],["所有进程",{"2":{"27":2,"49":2}}],["所以在编写lyfunction时也要注意异步的调用",{"2":{"299":1}}],["由于liteyukibot基于异步运行",{"2":{"299":1}}],["理论上所有基于onebotv11的api都可调用",{"2":{"298":1}}],["则该文件夹不会被识别为资源包",{"2":{"308":1}}],["则需要删除await",{"2":{"297":1}}],["则传入泛型默认开启",{"2":{"81":2}}],["无需手动创建实例",{"2":{"306":1}}],["无需手动初始化bot",{"2":{"173":2}}],["无限戳",{"2":{"297":1}}],["执行",{"2":{"297":1}}],["疯狂戳好友",{"2":{"297":1}}],["否则会导致渲染失败或渲染结果不理想",{"2":{"307":1}}],["否则task对象会被销毁",{"2":{"296":1}}],["否则默认关闭",{"2":{"81":2}}],["需要在最后调用",{"2":{"296":1}}],["需要在对应进程都调度一次",{"2":{"89":2}}],["等待所有异步任务结束",{"2":{"296":1}}],["等待接收数据",{"2":{"86":1}}],["结束关键字",{"0":{"299":1}}],["结束函数关键字",{"2":{"296":1}}],["结构",{"2":{"83":2}}],["使用通用日期简写",{"2":{"319":2}}],["使用此项目代表你已经同意以上协议",{"2":{"309":1}}],["使用开发工具快速运行插件",{"2":{"306":1}}],["使用",{"2":{"297":1}}],["使用新的task执行命令",{"2":{"296":1}}],["使用watchdog监控文件变化并重启bot",{"2":{"161":1}}],["也支持句末注释",{"2":{"295":1}}],["例如npm",{"2":{"310":1}}],["例如nonebot插件中",{"2":{"290":1}}],["例如你在a中定义了templates",{"2":{"308":1}}],["例如html",{"2":{"307":1}}],["例如main",{"2":{"306":1}}],["例如watchdog",{"2":{"302":1,"305":1}}],["例如",{"2":{"295":2,"308":1,"317":1}}],["例如test",{"2":{"295":1,"306":1}}],["函数文件放在资源包的functions目录下",{"2":{"295":1}}],["函数文件",{"0":{"295":1}}],["属于资源包的一部分",{"2":{"294":1}}],["类似于minecraft的mcfunction",{"2":{"294":1}}],["类似于redis",{"2":{"115":1}}],["是可以相对引用的",{"2":{"308":1}}],["是轻雪的一个功能",{"2":{"294":1}}],["是否为协程可调用对象",{"2":{"283":2}}],["是否忽略警告",{"2":{"249":2}}],["是否忽略键不存在的错误",{"2":{"122":2}}],["是否包含顶层文件夹",{"2":{"243":2}}],["是否阻断后续优先级更低的匹配器",{"2":{"188":2}}],["是否递归监听子目录",{"2":{"171":2}}],["是否通过验证",{"2":{"83":2}}],["是否开启类型检查",{"2":{"81":2}}],["示例",{"0":{"293":1,"297":1}}],["线程锁会自动保护共享内存的读写操作",{"2":{"292":1}}],["相比于普通进程通信",{"2":{"292":1}}],["相对路径",{"2":{"239":2}}],["简介",{"0":{"292":1,"300":1,"307":1},"1":{"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"308":1}}],["共享内存通信",{"0":{"291":1},"1":{"292":1,"293":1}}],["共享内存模块",{"2":{"115":1}}],["被动模式",{"2":{"290":1}}],["每隔0",{"2":{"297":1}}],["每行一个命令",{"2":{"295":1}}],["每次接收到字符串数据时都会运行",{"2":{"290":1}}],["每3秒发送一次消息",{"2":{"290":1}}],["每个配置文件给一个或一类服务提供配置",{"2":{"137":1}}],["创建入口文件",{"2":{"306":1}}],["创建插件",{"0":{"302":1}}],["创建子进程的同时会初始化一个被动通道和一个主动通道",{"2":{"290":1}}],["创建asyncio",{"2":{"153":2}}],["路径a",{"2":{"286":2}}],["转换路径为模块名",{"2":{"286":2}}],["可用",{"2":{"311":1}}],["可用参数",{"2":{"311":1}}],["可以在配置文件中把auto",{"2":{"309":1}}],["可以在a的index",{"2":{"308":1}}],["可以在此基础上进行修改",{"2":{"307":1}}],["可以很高程度地扩展轻雪的功能",{"2":{"300":1}}],["可以是本地插件或是通过",{"2":{"248":2}}],["可递归",{"2":{"296":1}}],["可调用对象",{"2":{"283":2}}],["判断是否为协程可调用对象",{"2":{"283":2}}],["一个",{"2":{"302":1}}],["一个键不要多次出现",{"2":{"137":1}}],["一些常用的工具类",{"2":{"282":1}}],["应在初始化时调用",{"2":{"279":2,"281":2}}],["根据不同类型插件设置颜色",{"2":{"250":2}}],["参数列表",{"2":{"311":2}}],["参数为调用set",{"2":{"290":1}}],["参数",{"2":{"248":1,"249":1,"310":1,"319":1}}],["参考\`liteyuki",{"2":{"173":1}}],["参考liteyuki",{"2":{"173":1}}],["加载",{"2":{"314":1}}],["加载资源包",{"0":{"308":1},"2":{"313":1}}],["加载插件",{"0":{"304":1},"1":{"305":1,"306":1}}],["加载插件加载器",{"2":{"21":1,"43":1}}],["加载单个插件",{"2":{"248":2}}],["插件停用只能阻断传入响应",{"2":{"314":1}}],["插件管理",{"2":{"313":1,"314":1}}],["插件",{"0":{"313":1},"1":{"314":1}}],["插件信息",{"2":{"309":1}}],["插件描述",{"2":{"302":1}}],["插件版本",{"2":{"302":1}}],["插件类型",{"2":{"250":2,"302":1}}],["插件名称",{"2":{"248":2,"250":2,"302":1}}],["插件字典",{"2":{"246":2,"275":2}}],["插件路径",{"2":{"173":2}}],["去头路径",{"2":{"244":1}}],["忽略的路径",{"2":{"243":2}}],["忽略私有函数和类",{"2":{"241":2}}],["模块名",{"2":{"286":2}}],["模块文件夹",{"2":{"243":2}}],["模块信息",{"2":{"241":2,"242":2}}],["源代码",{"2":{"242":1,"293":1}}],["语言包等",{"2":{"307":1}}],["语言",{"2":{"242":2,"243":2}}],["自定义选项title",{"2":{"242":2}}],["自动调用",{"2":{"28":2,"50":2}}],["你在a包中定义了一个index",{"2":{"308":1}}],["你自己制作的资源包也应该遵循这个规则",{"2":{"308":1}}],["你也可以自己制作资源包",{"2":{"307":1}}],["你的插件代码",{"2":{"302":1}}],["你可以选择开启auto",{"2":{"309":1}}],["你可以自由使用",{"2":{"309":1}}],["你可以自定义一些信息",{"2":{"308":1}}],["你可以在多个线程中读写共享内存",{"2":{"292":1}}],["你可以通过storage模块实现内存共享通信",{"2":{"292":1}}],["你可在此自定义生成的markdown格式",{"2":{"242":2}}],["你应该使用其他储存方式",{"2":{"137":1}}],["生成文档",{"2":{"243":2}}],["生成模块的markdown",{"2":{"242":2}}],["生命周期管理",{"2":{"21":1,"43":1}}],["文件内容为一系列的命令",{"2":{"295":1}}],["文件名以",{"2":{"295":1}}],["文件夹路径",{"2":{"249":2}}],["文件路径",{"2":{"241":2}}],["文件数据",{"2":{"239":2}}],["目标路径",{"2":{"238":2}}],["基础插件",{"0":{"310":1},"1":{"311":1,"312":1,"313":1,"314":1,"315":1}}],["基础路径",{"2":{"238":2}}],["基于ipc",{"2":{"105":1}}],["添加配置项",{"2":{"311":1}}],["添加sleep",{"2":{"297":1}}],["添加处理函数",{"2":{"189":2}}],["添加进程",{"2":{"154":2}}],["优先级",{"2":{"188":2}}],["规则函数签名",{"2":{"197":1}}],["规则",{"2":{"188":2}}],["匹配器",{"2":{"188":2}}],["回复消息",{"2":{"184":2}}],["附加数据",{"2":{"183":1}}],["原始消息",{"2":{"183":1}}],["消息类型",{"2":{"183":1}}],["消息段数组",{"2":{"183":1}}],["消息",{"2":{"183":1}}],["机器人id",{"2":{"183":1}}],["轻雪天气liteyuki",{"0":{"317":1},"1":{"318":1}}],["轻雪文档",{"2":{"312":1}}],["轻雪命令liteyuki",{"0":{"311":1},"1":{"312":1}}],["轻雪会收集以下内容",{"2":{"309":1}}],["轻雪原版资源包请查看liteyukibot",{"2":{"307":1}}],["轻雪主进程不涉及聊天部分",{"2":{"303":1}}],["轻雪插件是轻雪内置的一部分功能",{"2":{"300":1}}],["轻雪函数",{"0":{"294":1},"1":{"295":1,"296":1,"297":1,"298":1,"299":1},"2":{"294":1}}],["轻雪框架提供了一个内存共享通信的接口",{"2":{"292":1}}],["轻雪抽象消息事件",{"2":{"183":2}}],["轻雪生命周期管理",{"2":{"65":2}}],["⭕",{"2":{"180":1}}],["⚠️",{"2":{"180":1}}],["✅",{"2":{"180":1}}],["ℹ️信息",{"2":{"290":4}}],["ℹ️",{"2":{"180":1}}],["🐛",{"2":{"180":1}}],["在群聊启用",{"2":{"311":1}}],["在普通图片和markdown大图之间切换",{"2":{"311":1}}],["在b中定义了templates",{"2":{"308":1}}],["在配置文件中的liteyuki",{"2":{"305":1}}],["在设备上执行命令",{"2":{"296":1}}],["在发信器输出",{"2":{"295":1}}],["在任意进程中均可使用",{"2":{"293":1}}],["在子进程中",{"2":{"290":1}}],["在轻雪插件中",{"2":{"290":1}}],["在新线程中运行协程",{"2":{"285":2}}],["在语言加载完成后执行",{"2":{"180":2}}],["在主进程中运行",{"2":{"127":2}}],["上午12",{"2":{"252":1}}],["上午11",{"2":{"147":1}}],["上午6",{"2":{"206":1}}],["上午9",{"2":{"178":1}}],["上午5",{"2":{"172":1}}],["返回true则执行回调函数",{"2":{"171":2}}],["事件过滤器",{"2":{"171":2}}],["事件循环",{"2":{"21":1,"43":1}}],["监听目录们",{"2":{"171":2}}],["防抖函数",{"2":{"164":2}}],["防止获取空指针",{"2":{"132":1}}],["位置1为filesystemevent",{"2":{"162":1,"163":1}}],["启用",{"2":{"312":1,"314":1}}],["启用插件后",{"2":{"306":1}}],["启用该模块需要在配置文件中设置dev",{"2":{"161":1}}],["启动所有进程",{"2":{"153":2}}],["启动发布订阅接收器循环",{"2":{"127":2}}],["启动后控制台输出",{"2":{"290":1}}],["启动后",{"2":{"74":2}}],["启动前",{"2":{"73":2}}],["启动",{"2":{"65":2}}],["启动逻辑",{"2":{"22":2,"44":2}}],["此模块用于注册观察者函数",{"2":{"161":1}}],["检查进程是否存活",{"2":{"158":2}}],["终止进程并从进程字典中删除",{"2":{"156":2}}],["进程函数关键字参数",{"2":{"154":2}}],["进程函数参数",{"2":{"154":2}}],["进程函数",{"2":{"154":2}}],["进程名",{"2":{"154":2}}],["进程名称",{"2":{"27":2,"49":2}}],["请阅读插件主页的说明",{"2":{"314":1}}],["请确保您所编写的html代码能被bot解析",{"2":{"307":1}}],["请注意",{"2":{"307":1}}],["请创建task",{"2":{"152":2}}],["请不要将需要动态加载的内容写入配置文件",{"2":{"137":1}}],["并且应该在metadata",{"2":{"308":1}}],["并且不用修改源代码",{"2":{"307":1}}],["并在其中写入一些代码",{"2":{"306":1}}],["并在其中写入以下代码",{"2":{"306":1}}],["并在其中创建一个",{"2":{"302":1}}],["并遵循其许可进行修改",{"2":{"282":1}}],["并添加到进程字典中",{"2":{"152":2}}],["并发运行异步函数",{"2":{"66":2}}],["开始",{"0":{"301":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1}}],["开始接收数据",{"2":{"89":2}}],["开启后自动监控进程",{"2":{"152":2}}],["项目目录下的配置文件优先",{"2":{"144":2}}],["项目目录下的配置文件优先级高于config目录下的配置文件",{"2":{"137":1}}],["项目目录下的config",{"2":{"144":2}}],["按照读取文件的优先级反向覆盖",{"2":{"143":2}}],["不带key返回配置项列表",{"2":{"311":1}}],["不包含任何隐私信息",{"2":{"309":1}}],["不含隐私部分",{"2":{"309":1}}],["不含插件数据",{"2":{"309":1}}],["不同adapter",{"2":{"298":1}}],["不递归",{"2":{"143":2}}],["不要出现过多的嵌套",{"2":{"137":1}}],["从一个标准的轻雪项目加载配置文件",{"2":{"144":2}}],["从目录下加载配置文件",{"2":{"143":2}}],["从指定文件加载配置项",{"2":{"142":2}}],["但请注意甄别第三方插件的安全性",{"2":{"309":1}}],["但请保证以上三个字段",{"2":{"308":1}}],["但是请保留原作者信息",{"2":{"309":1}}],["但是更加轻量级并且线程安全",{"2":{"115":1}}],["但若出现非单function的情况",{"2":{"299":1}}],["但需单独起篇幅",{"2":{"294":1}}],["但也包含原有的键值对",{"2":{"138":2}}],["扁平化后的配置文件",{"2":{"138":2}}],["扁平化配置文件",{"2":{"138":2}}],["扁平化编写",{"2":{"137":1}}],["注意不要嵌套文件夹",{"2":{"308":1}}],["注意冲突时的优先级",{"2":{"137":1}}],["注册一个函数在nonebot启动后运行",{"2":{"290":1}}],["注册一个函数在轻雪启动后运行",{"2":{"290":1}}],["注册文件系统变化监听器",{"2":{"171":2}}],["注册重启时的函数",{"2":{"71":2}}],["注册重启后的函数",{"2":{"36":2,"58":2,"72":2}}],["注册停止前的函数",{"2":{"69":2}}],["注册停止后的函数",{"2":{"33":2,"55":2,"70":2}}],["注册进程重启前的函数",{"2":{"35":2,"57":2}}],["注册进程停止前的函数",{"2":{"34":2,"56":2}}],["注册启动时的函数",{"2":{"67":2,"68":2}}],["注册启动后的函数",{"2":{"32":2,"54":2}}],["注册启动前的函数",{"2":{"31":2,"53":2}}],["尽量不要冲突",{"2":{"137":1}}],["多配置文件编写原则",{"2":{"137":1}}],["引用计数",{"2":{"132":1}}],["若不存在则返回空",{"2":{"311":1}}],["若不存在则创建于config",{"2":{"311":1}}],["若存在则返回",{"2":{"311":1}}],["若存在则覆盖",{"2":{"311":1}}],["若存在则会覆盖",{"2":{"311":1}}],["若你不希望提供这些信息",{"2":{"309":1}}],["若没有metadata",{"2":{"308":1}}],["若要戳20s后停止",{"2":{"297":1}}],["若函数中启动了其他task",{"2":{"296":1}}],["若有子进程订阅则推送给子进程",{"2":{"127":2}}],["若为空",{"2":{"81":2}}],["运行环境的设备信息",{"2":{"309":1}}],["运行在主进程中",{"2":{"300":1}}],["运行协程",{"2":{"284":2}}],["运行处理函数",{"2":{"190":2}}],["运行插件",{"2":{"173":2}}],["运行订阅者接收函数",{"2":{"126":2}}],["运行接收函数",{"2":{"88":2}}],["订阅者接收消息时的回调",{"2":{"125":2}}],["频道",{"2":{"124":2,"125":2,"126":2}}],["发布消息",{"2":{"124":2}}],["发送函数为同步函数",{"2":{"84":2}}],["发送数据",{"2":{"84":2,"112":2}}],["删除键值对",{"2":{"122":2}}],["值",{"2":{"120":2,"121":2}}],["键值对",{"2":{"123":2}}],["键",{"2":{"120":2,"121":2,"122":2}}],["设置用户信息或打开属性设置菜单",{"2":{"315":1}}],["设置",{"2":{"312":1,"315":1}}],["设置共享内存",{"2":{"293":1}}],["设置后的插件名称",{"2":{"250":2}}],["设置插件名称颜色",{"2":{"250":2}}],["设置键值对",{"2":{"120":2}}],["设置通道实例",{"2":{"93":2,"94":2}}],["关闭通道",{"2":{"114":2}}],["8",{"2":{"109":1,"139":1,"140":1,"141":1,"172":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"239":1,"241":1,"276":1,"277":1,"278":1,"280":1}}],["调用机器人函数",{"2":{"311":1}}],["调用机器人api",{"2":{"311":1}}],["调用重启进程方法",{"2":{"303":1}}],["调用函数",{"2":{"296":1}}],["调用bot",{"2":{"296":1}}],["调用",{"2":{"108":2}}],["通过关键词搜索插件",{"2":{"313":1}}],["通过装饰器注册一个函数在接收到消息时运行",{"2":{"290":1}}],["通常是目录不存在或目录为空",{"2":{"249":2}}],["通常为纯文本的格式",{"2":{"183":1}}],["通常会默认传入chan",{"2":{"154":2}}],["通信",{"2":{"105":1}}],["通道实例",{"2":{"93":2}}],["通道名称",{"2":{"93":2,"94":2,"95":2}}],["通道传递通道",{"2":{"91":1,"92":1}}],["通道id",{"2":{"81":2,"111":2}}],["依赖关系",{"2":{"100":1,"101":1}}],["子进程中获取通道直接导入进程全局单例即可",{"2":{"290":1}}],["子进程中导入单例active",{"2":{"290":1}}],["子进程订阅者接收函数",{"2":{"117":1}}],["子进程初始化时实例化",{"2":{"91":1,"92":1}}],["子进程可用的主动和被动通道",{"2":{"90":1}}],["装饰一个函数在接收到数据后执行",{"2":{"87":2,"171":2}}],["装饰器",{"2":{"87":2,"125":2,"171":2,"189":4}}],["为可选参数",{"2":{"310":1}}],["为必填参数",{"2":{"310":1}}],["为none则不过滤",{"2":{"87":2}}],["为子进程重启时调用",{"2":{"35":2,"57":2}}],["为子进程停止时调用",{"2":{"34":2,"56":2}}],["过滤函数",{"2":{"87":2}}],["接收频道",{"2":{"183":1}}],["接收数据",{"2":{"113":2}}],["接收数据并执行函数",{"2":{"87":2}}],["接收到数据",{"2":{"86":1}}],["会触发最大递归深度限制",{"2":{"297":1}}],["会话负载信息",{"2":{"309":1}}],["会话类型",{"2":{"183":1}}],["会话id",{"2":{"183":1}}],["会阻塞",{"2":{"152":2}}],["会阻塞线程",{"2":{"85":2}}],["会自动判断key版本",{"2":{"317":1}}],["会自动判断主进程和子进程",{"2":{"89":2}}],["会自动识别文件格式",{"2":{"142":2}}],["会挂起等待",{"2":{"86":2}}],["没有异步的必要",{"2":{"84":2}}],["zip格式压缩的",{"2":{"308":1}}],["zip",{"2":{"83":1}}],["zh",{"0":{"242":1,"243":1},"2":{"2":1,"242":2,"243":1}}],["数据",{"2":{"83":2,"84":2,"88":2,"112":2,"113":2,"124":2,"126":2}}],["验证数据结构",{"2":{"83":2}}],["泛型类型",{"2":{"82":2}}],["下午3",{"2":{"109":1}}],["下午12",{"2":{"276":1}}],["下午10",{"2":{"102":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"278":1,"280":1}}],["下午11",{"2":{"79":1,"247":1,"251":1}}],["下午8",{"2":{"63":1}}],["7",{"2":{"63":1,"79":1,"102":1,"147":1,"178":1,"247":1,"251":1,"252":1}}],["|$$$$$",{"2":{"40":1,"62":1}}],["|$$",{"2":{"40":5,"62":5}}],["|",{"0":{"66":1,"173":1,"183":1,"184":1,"248":1},"2":{"40":45,"62":45,"66":1,"173":1,"183":1,"184":1,"248":1}}],["+",{"2":{"40":2,"62":2,"242":2,"286":1}}],["+=",{"2":{"26":1,"48":1,"87":1,"242":15}}],["x26",{"2":{"195":1,"242":4}}],["x1b",{"2":{"40":2,"62":2}}],["x3c",{"2":{"26":1,"40":1,"48":1,"62":1,"180":5,"193":1,"242":8,"248":2,"250":4,"296":6,"317":2,"319":2}}],["兼容键",{"2":{"39":2,"61":2}}],["兼容旧版本",{"2":{"39":2,"61":2}}],["默认普通图片",{"2":{"311":1}}],["默认开启",{"2":{"309":1}}],["默认插件加载器",{"2":{"279":2,"281":2}}],["默认执行扁平化选项",{"2":{"142":2,"143":2}}],["默认值",{"2":{"38":2,"39":2,"60":2,"61":2,"121":2}}],["默认为none",{"2":{"27":2,"49":2}}],["获取用户信息",{"2":{"315":1}}],["获取唯一的轻雪bot实例",{"2":{"303":1}}],["获取共享内存",{"2":{"293":1}}],["获取主动通道",{"2":{"290":1}}],["获取被动通道",{"2":{"290":1}}],["获取已加载的插件",{"2":{"246":2,"275":2}}],["获取函数和类",{"2":{"241":2}}],["获取相对路径",{"2":{"238":2}}],["获取所有键值对",{"2":{"123":2}}],["获取键值对",{"2":{"121":2}}],["获取通道实例",{"2":{"95":2,"96":2}}],["获取通道传递泛型类型",{"2":{"82":2}}],["获取配置",{"2":{"38":2,"39":2,"60":2,"61":2}}],["获取轻雪实例",{"2":{"37":2,"59":2}}],["未实现",{"2":{"33":2,"36":2,"55":2,"58":2}}],["505468b及以后的lagrange",{"2":{"311":1}}],["59",{"2":{"247":1,"251":1}}],["55",{"2":{"196":1}}],["52",{"2":{"192":1}}],["51",{"2":{"186":1}}],["54",{"2":{"109":1}}],["5",{"2":{"24":1,"46":1,"137":1}}],["外部启动接口",{"2":{"23":2,"45":2}}],["信号处理",{"2":{"21":1,"25":2,"43":1,"47":2}}],["初始化通道",{"2":{"81":2,"111":2}}],["初始化轻雪",{"2":{"28":2,"50":2}}],["初始化轻雪实例",{"2":{"21":2,"43":2}}],["初始化",{"2":{"21":1,"43":1}}],["=none",{"2":{"27":1,"49":1,"81":1,"87":1,"121":1,"183":2}}],["==",{"2":{"26":3,"48":3,"89":1,"96":1,"97":2,"98":2,"99":1,"127":1,"132":1,"133":2,"134":2,"135":2,"136":1,"152":2,"179":1,"241":4,"242":2,"286":1}}],["=",{"0":{"26":1,"27":1,"38":1,"39":1,"48":1,"49":1,"60":1,"61":1,"81":1,"87":1,"121":1,"122":1,"130":1,"131":1,"142":1,"143":1,"144":1,"154":2,"171":2,"183":2,"194":3,"195":3,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"241":1,"242":2,"243":3,"249":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"21":7,"26":6,"27":2,"43":7,"48":6,"49":2,"65":7,"66":2,"81":10,"83":1,"84":1,"85":1,"86":2,"87":1,"89":2,"93":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":2,"107":1,"111":4,"119":6,"120":2,"121":2,"122":1,"123":1,"125":2,"127":1,"129":1,"133":3,"134":2,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":5,"151":3,"152":4,"154":5,"156":1,"164":3,"171":2,"173":4,"180":1,"183":10,"184":1,"188":5,"194":1,"199":1,"240":1,"241":17,"242":16,"243":13,"248":12,"249":6,"250":5,"283":1,"284":2,"286":1,"287":1,"290":5,"293":1,"302":1,"303":2}}],["常规操作",{"2":{"21":1,"43":1}}],[">=",{"2":{"188":1}}],[">",{"2":{"21":1,"37":1,"38":1,"39":1,"43":1,"59":1,"60":1,"61":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"85":1,"86":1,"87":3,"95":1,"96":1,"107":1,"108":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":2,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"158":1,"164":1,"171":2,"179":1,"189":2,"190":1,"194":1,"195":1,"200":2,"201":2,"202":1,"203":1,"204":1,"238":1,"241":1,"242":3,"243":1,"246":1,"248":1,"249":1,"250":3,"275":1,"283":1,"286":2,"287":1,"317":2}}],["配置项",{"2":{"317":1}}],["配置项目",{"2":{"138":2}}],["配置了命令别名的命令可以使用别名代替原命令",{"2":{"310":1}}],["配置文件尽量扁平化",{"2":{"137":1}}],["配置值",{"2":{"38":2,"39":2,"60":2,"61":2}}],["配置键",{"2":{"38":2,"39":2,"60":2,"61":2}}],["配置",{"2":{"21":3,"43":3,"312":1}}],["31",{"2":{"276":1}}],["34m",{"2":{"40":1,"62":1}}],["3",{"2":{"18":1,"137":1,"177":1,"249":1,"290":1}}],["300~500mb",{"2":{"15":1}}],["6",{"2":{"18":1,"177":1}}],["测试版本号",{"2":{"18":1,"177":1}}],["$$$$",{"2":{"40":1,"62":1}}],["$$$$$",{"2":{"40":1,"62":1}}],["$$$$$$$$",{"2":{"40":4,"62":4}}],["$$$$$$",{"2":{"40":5,"62":5}}],["$$",{"2":{"40":54,"62":54}}],["$",{"2":{"13":3}}],["kill",{"2":{"156":1}}],["k",{"2":{"83":4,"138":2,"242":2}}],["keyword",{"2":{"195":2}}],["keywords为城市名",{"2":{"317":2}}],["keywords",{"0":{"195":2},"2":{"195":5,"313":1,"317":2}}],["keyerror",{"2":{"122":1,"152":1}}],["keyvaluestore",{"0":{"118":1},"1":{"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1},"2":{"129":1}}],["keys",{"0":{"39":1,"61":1},"2":{"39":4,"61":4}}],["key",{"0":{"38":1,"39":1,"60":1,"61":1,"120":1,"121":1,"122":2},"2":{"38":4,"39":11,"60":4,"61":11,"120":7,"121":7,"122":13,"133":3,"134":3,"135":3,"138":2,"293":2,"311":4,"315":2,"317":1}}],["keyboardinterrupt",{"2":{"23":1,"24":1,"45":1,"46":1}}],["keep",{"0":{"24":1,"46":1},"2":{"22":1,"24":1,"44":1,"46":1}}],["kwargs=none",{"2":{"154":1}}],["kwargs=self",{"2":{"152":1}}],["kwargs",{"0":{"21":1,"28":1,"43":1,"50":1,"66":1,"108":1,"154":1},"2":{"21":4,"28":1,"43":4,"50":1,"66":3,"108":2,"154":5,"164":2,"287":2,"311":2}}],["kritor",{"2":{"8":1}}],["know",{"2":{"6":2}}],["qq群号",{"2":{"319":1}}],["qq",{"0":{"8":1},"2":{"7":1,"8":3}}],["question",{"2":{"6":1}}],["questions",{"0":{"6":1,"7":1,"16":1}}],["quot",{"2":{"3":2,"299":2,"311":2,"317":4}}],["js",{"2":{"8":1}}],["json",{"0":{"140":1},"2":{"0":2,"140":5,"142":2,"144":1}}],["join",{"0":{"155":1},"2":{"7":1,"26":1,"48":1,"143":1,"155":2,"156":1,"240":1,"242":4,"243":1,"249":2,"286":2}}],["g",{"2":{"250":1,"320":1}}],["group",{"2":{"183":2,"311":9,"312":1,"313":2,"319":3,"320":1}}],["group775840726",{"2":{"7":1}}],["green>",{"2":{"180":1}}],["gather",{"2":{"66":1,"284":1}}],["getattr",{"2":{"283":1}}],["get",{"0":{"37":1,"38":1,"39":1,"59":1,"60":1,"61":1,"82":1,"95":1,"96":1,"98":1,"99":1,"121":1,"123":1,"129":1,"133":1,"136":1,"179":1,"238":1,"240":1,"241":1,"246":1,"275":1},"2":{"27":2,"37":2,"38":3,"39":5,"49":2,"59":2,"60":3,"61":5,"66":1,"81":2,"82":2,"84":1,"86":1,"95":2,"96":2,"97":1,"98":4,"99":3,"120":1,"121":4,"122":1,"123":2,"129":1,"132":1,"133":3,"135":1,"136":3,"152":1,"153":1,"173":1,"179":1,"180":2,"238":1,"240":1,"241":5,"243":3,"244":1,"246":1,"248":3,"249":1,"275":1,"279":2,"281":2,"284":1,"290":8,"293":1,"303":2,"311":3,"312":1,"315":2}}],["generic",{"0":{"80":1,"82":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1},"2":{"81":2,"82":1,"84":1}}],["generate",{"0":{"242":1,"243":1},"2":{"0":1,"242":1,"243":3}}],["gensokyo",{"2":{"8":1}}],["globalkeyvaluestore",{"0":{"128":1},"1":{"129":1,"130":1,"131":1}}],["global",{"2":{"21":1,"43":1,"87":1,"313":2,"314":2}}],["gt",{"0":{"21":1,"37":1,"38":1,"39":1,"43":1,"59":1,"60":1,"61":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"85":1,"86":1,"87":1,"95":1,"96":1,"107":1,"108":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"158":1,"171":1,"179":1,"189":1,"190":1,"194":1,"195":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"241":1,"242":1,"246":1,"248":1,"249":1,"250":1,"275":1,"283":1,"286":1,"287":1},"2":{"100":3,"101":3,"138":1,"188":1,"286":1,"310":1,"311":7,"313":10,"315":2}}],["go",{"2":{"8":2,"289":1}}],["github",{"2":{"7":1,"12":1,"13":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["git",{"2":{"6":1,"12":2,"13":1,"15":2}}],["\`pathlib",{"2":{"248":1}}],["\`path",{"2":{"248":1}}],["\`pip\`",{"2":{"248":1}}],["\`",{"2":{"3":1,"242":14,"248":1}}],["validate",{"0":{"83":1},"2":{"83":4,"84":1}}],["value=ast",{"2":{"241":1}}],["values",{"2":{"153":1}}],["valueerror",{"2":{"81":2,"93":1}}],["value2",{"2":{"2":1}}],["value1",{"2":{"2":1}}],["value",{"0":{"120":1,"224":1},"2":{"2":1,"3":3,"120":6,"134":3,"138":3,"241":6,"242":3,"293":2,"311":2,"315":1}}],["var=value",{"2":{"296":1}}],["var2=value2",{"2":{"296":1}}],["var1=value1>",{"2":{"296":1}}],["var",{"0":{"18":1,"90":1,"91":1,"92":1,"116":1,"117":1,"132":1,"162":1,"163":1,"177":1,"197":1,"244":1},"2":{"242":2}}],["version=",{"2":{"302":1}}],["version",{"0":{"18":1,"177":1},"2":{"15":1,"308":1}}],["venv",{"2":{"12":4}}],["v",{"2":{"13":2,"138":2,"242":2}}],["view",{"2":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["virtual",{"2":{"6":1,"12":3}}],["visit",{"2":{"3":1}}],["v11协议api",{"2":{"311":2}}],["v11",{"2":{"3":1,"298":1}}],["2s戳两次",{"2":{"297":1}}],["22",{"2":{"276":1}}],["27",{"2":{"147":1,"178":1}}],["25",{"2":{"109":1}}],["21",{"2":{"79":1}}],["26",{"2":{"79":1,"102":1}}],["24",{"2":{"63":1,"252":1}}],["23",{"2":{"63":1,"206":1,"247":1,"251":1}}],["20代替空格",{"2":{"311":1}}],["20和end",{"2":{"297":1}}],["2024",{"2":{"63":2,"79":2,"102":2,"109":2,"147":2,"172":2,"178":2,"181":2,"185":2,"186":2,"191":2,"192":2,"196":2,"205":2,"206":2,"247":2,"251":2,"252":2,"276":2,"278":2,"280":2}}],["2020",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["20216",{"2":{"1":1,"3":1,"13":4}}],["20",{"2":{"15":1}}],["2019+",{"2":{"15":1}}],["2",{"2":{"2":1,"137":1,"152":1,"297":1,"308":1}}],["object",{"2":{"289":1}}],["observer",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"171":1,"303":2}}],["occurred",{"2":{"284":1}}],["occupy",{"2":{"15":1}}],["os",{"2":{"142":1,"143":3,"238":1,"239":4,"240":2,"241":1,"243":2,"249":9,"303":2}}],["outlook",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["output",{"0":{"243":1},"2":{"2":1,"243":6}}],["option",{"2":{"310":1}}],["optional",{"0":{"27":1,"49":1,"81":1,"82":1,"87":1,"121":2,"183":2,"248":1,"273":1},"2":{"27":1,"49":1,"81":1,"82":3,"87":1,"119":2,"121":3,"183":2,"248":1}}],["opt",{"2":{"248":3}}],["open",{"2":{"26":1,"48":1,"139":1,"140":1,"141":1,"239":1,"241":1}}],["openshamrock",{"2":{"8":1}}],["order",{"2":{"243":1}}],["orig",{"2":{"82":2}}],["or",{"0":{"200":1},"2":{"4":1,"6":2,"15":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":2,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":3,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":5,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["of",{"0":{"3":1},"2":{"6":3,"9":1,"13":1,"15":1,"84":1,"93":1,"248":1}}],["other",{"0":{"2":1,"4":1,"7":1,"16":1,"200":1,"201":1},"2":{"2":1,"3":1,"9":1,"15":2,"183":1,"200":2,"201":2,"289":3}}],["one",{"2":{"6":1,"290":1}}],["onebotv11",{"2":{"8":4}}],["onebot",{"0":{"3":1},"2":{"2":2,"3":2,"4":1,"6":2,"8":1,"298":1,"311":1}}],["only",{"2":{"0":1,"6":1,"87":1,"290":1}}],["on",{"0":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"87":1,"88":1,"97":1,"98":1,"99":1,"107":2,"116":1,"117":1,"125":3,"133":1,"134":1,"135":1,"136":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"192":1,"194":1,"195":1},"1":{"193":1,"194":1,"195":1},"2":{"0":1,"3":1,"6":1,"7":1,"8":4,"12":1,"15":3,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":3,"32":3,"33":3,"34":3,"35":3,"36":3,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":3,"54":3,"55":3,"56":3,"57":3,"58":3,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":3,"82":1,"83":1,"84":1,"85":1,"86":1,"87":5,"88":4,"89":4,"93":1,"94":1,"95":1,"96":2,"97":4,"98":4,"99":3,"104":1,"107":5,"108":2,"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":12,"126":2,"127":1,"129":1,"132":1,"133":4,"134":4,"135":4,"136":3,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":3,"167":3,"168":3,"169":3,"170":3,"171":3,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"192":1,"193":1,"194":2,"195":5,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"276":1,"277":2,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"290":6,"303":1}}],["45m",{"2":{"319":2}}],["44",{"2":{"185":1,"191":1}}],["47",{"2":{"102":1,"181":1,"205":1}}],["41",{"2":{"13":1}}],["40",{"2":{"13":1}}],["4",{"2":{"1":1,"137":1}}],["utils",{"0":{"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1}}],["utf",{"2":{"139":1,"140":1,"141":1,"239":1,"241":1}}],["ubuntu",{"2":{"15":1}}],["unload",{"2":{"313":1,"314":1}}],["until",{"2":{"284":2}}],["unclassified",{"0":{"257":2,"263":1}}],["unparse",{"2":{"241":10}}],["unknown",{"2":{"152":1}}],["unsupported",{"2":{"142":1}}],["underlying",{"2":{"10":1}}],["uninstall",{"2":{"6":2,"313":1,"314":1}}],["usage",{"0":{"262":1}}],["using",{"2":{"6":2,"13":1}}],["user",{"0":{"183":1,"315":1},"2":{"183":3,"184":2,"204":1,"297":3}}],["used",{"2":{"87":1,"290":1}}],["use",{"0":{"14":1},"2":{"1":1,"3":2,"4":2,"6":6,"8":1,"12":4,"13":1,"14":1,"15":2,"39":1,"61":1,"248":1}}],["updates",{"2":{"1":1}}],["update",{"2":{"1":2,"2":2,"6":1,"15":2,"142":3,"143":1,"144":1,"311":1,"312":1,"313":1,"314":1}}],["flat",{"0":{"138":1},"2":{"138":2,"139":1,"140":1,"141":1}}],["flag",{"2":{"65":1}}],["f",{"2":{"26":1,"27":2,"39":1,"48":1,"49":2,"61":1,"81":4,"84":1,"89":2,"93":2,"138":1,"139":1,"140":1,"141":1,"142":2,"143":1,"152":4,"156":2,"158":1,"239":2,"242":19,"243":1,"248":5,"249":9,"250":1,"284":1,"290":2,"303":1}}],["friend",{"2":{"297":2}}],["front",{"0":{"242":1},"2":{"242":6,"243":3}}],["from",{"0":{"139":1,"140":1,"141":1,"142":1,"143":1},"2":{"85":1,"139":4,"140":4,"141":4,"142":4,"143":2,"144":2,"289":1,"290":4,"302":1,"303":3}}],["frame",{"0":{"25":1,"47":1},"2":{"25":3,"47":3}}],["framework",{"2":{"10":1,"289":1}}],["frequently",{"0":{"6":1}}],["future",{"2":{"284":1}}],["func=none",{"2":{"171":1}}],["func=lambda",{"2":{"96":1,"97":2,"98":2,"99":1,"290":1}}],["funcs",{"0":{"66":2,"88":1,"116":1,"117":1,"126":1},"2":{"65":6,"66":5,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"87":1,"88":3,"89":1,"125":6,"126":2,"127":1}}],["func",{"0":{"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"66":2,"67":3,"68":3,"69":3,"70":3,"71":3,"72":3,"87":2,"107":1,"125":2,"154":1,"162":1,"163":1,"171":3,"287":1},"2":{"31":5,"32":5,"33":5,"34":5,"35":5,"36":5,"53":5,"54":5,"55":5,"56":5,"57":5,"58":5,"65":6,"66":6,"67":9,"68":9,"69":9,"70":9,"71":9,"72":9,"81":2,"87":20,"88":6,"89":1,"107":1,"116":1,"117":1,"125":8,"126":2,"154":1,"164":2,"171":7,"241":2,"242":9,"283":2,"287":5,"296":1}}],["function实现语法高亮",{"2":{"299":1}}],["functiondef",{"2":{"241":3}}],["functioninfo",{"0":{"213":1,"229":1,"234":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1},"2":{"241":2}}],["functions=",{"2":{"241":1}}],["functions",{"0":{"234":1},"2":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"241":1,"242":1}}],["function",{"0":{"208":2},"2":{"6":2,"15":2,"89":1,"241":3,"290":1,"294":1,"296":1,"297":2,"311":3}}],["full",{"2":{"6":1,"290":1}}],["failed",{"2":{"6":2,"248":1}}],["faq",{"0":{"5":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1}}],["false时例如docs",{"2":{"243":2}}],["false",{"0":{"142":1,"143":1,"144":1,"194":1,"195":1,"243":1},"2":{"2":4,"81":2,"83":4,"111":1,"119":2,"283":1}}],["folder",{"0":{"240":1,"243":1},"2":{"240":2,"243":5,"244":1}}],["following",{"2":{"2":1}}],["found",{"2":{"84":1,"93":1,"142":1,"143":1,"152":1,"156":1,"158":1}}],["font",{"2":{"10":1}}],["fonts",{"2":{"1":1}}],["format=get",{"2":{"180":1}}],["formats",{"2":{"143":1}}],["format",{"0":{"179":1,"250":1},"2":{"142":1,"179":3,"180":1,"248":2,"250":1}}],["for",{"0":{"16":1},"2":{"1":1,"3":2,"6":2,"8":1,"27":1,"39":1,"49":1,"61":1,"66":1,"81":1,"83":3,"88":2,"89":2,"94":1,"126":1,"138":2,"142":1,"143":2,"153":3,"155":1,"157":1,"171":1,"190":1,"193":1,"195":1,"239":1,"240":2,"241":12,"242":9,"243":3,"249":2,"279":2,"281":2,"284":2,"289":1,"290":1,"302":1}}],["filter=lambda",{"2":{"303":1}}],["filter",{"0":{"87":2,"163":1,"171":2},"2":{"87":8,"96":1,"97":2,"98":2,"99":1,"171":6,"290":1}}],["file",{"0":{"139":1,"140":1,"141":1,"171":1,"239":1,"240":1,"241":1},"2":{"3":1,"6":1,"63":1,"79":1,"102":1,"109":1,"139":5,"140":5,"141":5,"142":12,"143":3,"147":1,"171":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"239":4,"240":7,"241":9,"243":6,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1,"303":3}}],["filesystemeventhandler",{"0":{"165":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1}}],["filesystemevent",{"2":{"162":1,"163":1,"171":1,"303":2}}],["files",{"0":{"142":2,"239":1},"2":{"0":4,"142":3,"143":1,"144":1,"239":1,"240":2,"243":1}}],["fill",{"2":{"1":1,"3":1}}],["fields",{"2":{"0":1,"3":2}}],["first",{"2":{"0":1,"6":1,"241":2}}],["b包也定义了一个index",{"2":{"308":1}}],["block",{"0":{"188":1,"194":1,"195":1},"2":{"188":5,"194":2,"195":2}}],["blue>",{"2":{"180":1}}],["break",{"2":{"152":1,"193":1}}],["browser",{"2":{"6":1}}],["b",{"2":{"138":3,"243":4,"286":4,"320":1}}],["body",{"2":{"241":1}}],["bool=false",{"2":{"142":1,"143":1,"144":1,"194":1,"195":1,"243":1}}],["bool=true",{"2":{"122":1,"171":1,"241":1,"249":1}}],["bool",{"0":{"81":1,"83":1,"122":1,"142":1,"143":1,"144":1,"158":1,"171":1,"188":1,"194":1,"195":1,"202":1,"203":1,"204":1,"220":1,"241":1,"243":1,"249":1,"283":1},"2":{"81":1,"83":3,"158":1,"163":1,"188":1,"197":1,"200":1,"201":1,"202":1,"203":1,"204":1,"283":3}}],["bot",{"0":{"19":1,"37":1,"41":1,"59":1,"63":1,"183":1},"1":{"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"1":1,"2":1,"6":2,"9":1,"12":1,"15":1,"21":2,"37":4,"38":1,"39":4,"43":2,"59":4,"60":1,"61":4,"173":2,"183":4,"184":2,"290":4,"295":1,"303":2,"311":1,"319":3,"320":1}}],["build",{"2":{"13":2}}],["but",{"2":{"3":1,"6":1,"290":1}}],["bind",{"2":{"318":1}}],["binding",{"2":{"1":1}}],["bin",{"2":{"12":1}}],["bases",{"2":{"241":1}}],["base",{"0":{"238":1},"2":{"238":4,"241":2}}],["basemodel",{"0":{"213":1,"221":1,"226":1,"232":1,"259":1,"267":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1}}],["baseexception",{"0":{"175":1}}],["based",{"2":{"8":4}}],["bash",{"2":{"12":1}}],["basically",{"2":{"3":1}}],["basic",{"0":{"1":1}}],["before",{"0":{"31":1,"34":1,"35":1,"53":1,"56":1,"57":1,"67":1,"69":1,"71":1,"73":1,"75":1,"77":1},"2":{"22":1,"31":2,"34":2,"35":2,"44":1,"53":2,"56":2,"57":2,"65":3,"67":2,"69":2,"71":2,"73":3,"75":3,"77":3,"152":3}}],["below",{"2":{"6":1}}],["been",{"2":{"6":1}}],["between",{"2":{"6":1}}],["be",{"2":{"3":1,"6":2,"15":1,"39":1,"61":1,"84":1,"87":1,"93":1,"166":1,"290":1}}],["by",{"2":{"3":1,"4":1,"6":2,"290":1}}],["14s",{"2":{"319":2}}],["1h",{"2":{"319":2}}],["1d",{"2":{"319":2}}],["1145141919810",{"2":{"311":1}}],["11",{"2":{"278":1,"280":1}}],["19",{"2":{"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1}}],["1919810",{"2":{"1":1}}],["18",{"2":{"172":1}}],["12",{"2":{"147":1,"178":1}}],["127",{"2":{"1":1,"3":1}}],["10",{"2":{"18":1,"177":1,"311":1}}],["10+",{"2":{"12":1,"15":1}}],["1gb",{"2":{"15":2}}],["1vcpu",{"2":{"15":1}}],["1",{"2":{"1":1,"2":1,"3":1,"26":2,"27":2,"48":2,"49":2,"87":1,"97":2,"98":2,"99":1,"127":2,"133":3,"134":2,"135":1,"136":1,"137":1,"138":3,"152":2,"165":1,"166":1,"242":6,"243":1,"248":4,"286":2,"302":1,"308":2}}],["03",{"2":{"290":2}}],["0000",{"2":{"290":3}}],["00",{"2":{"290":18}}],["02",{"2":{"252":1,"278":1,"280":1}}],["04",{"2":{"172":1}}],["04+",{"2":{"15":1}}],["0m",{"2":{"40":1,"62":1}}],["0",{"0":{"26":1,"48":1,"194":1,"195":1},"2":{"1":2,"3":2,"21":1,"24":1,"25":1,"26":1,"43":1,"46":1,"47":1,"48":1,"65":1,"82":1,"83":1,"89":1,"96":1,"97":2,"98":2,"99":1,"127":1,"132":2,"133":2,"134":2,"135":2,"136":1,"152":2,"188":2,"241":1,"242":7,"297":1,"302":2,"308":2}}],["html中用",{"2":{"308":1}}],["html",{"2":{"308":1}}],["html文件会被覆盖",{"2":{"308":1}}],["html文件",{"2":{"308":2}}],["https",{"2":{"12":1,"13":1}}],["hint",{"2":{"81":1,"241":1,"242":1}}],["handlers",{"2":{"188":1,"189":1,"190":1}}],["handler",{"0":{"199":1},"2":{"171":3,"189":5,"190":2,"199":3,"200":4,"201":4,"202":2}}],["handle",{"0":{"25":1,"47":1,"189":1},"2":{"6":1,"21":2,"25":1,"43":2,"47":1,"189":1,"276":1,"277":1}}],["hash",{"0":{"268":1},"2":{"268":2}}],["hasattr",{"2":{"82":1}}],["has",{"2":{"6":1}}],["have",{"2":{"3":1,"6":3,"7":1,"13":1,"15":1}}],["homepage",{"0":{"265":1}}],["how",{"2":{"6":2}}],["host",{"2":{"1":1}}],["hello",{"2":{"295":5,"311":1}}],["help",{"2":{"6":2,"313":1,"314":1}}],["here",{"2":{"3":2}}],["header",{"2":{"1":1,"6":1}}],["echo",{"2":{"295":3}}],["e",{"2":{"122":2,"248":1,"250":1,"284":2}}],["emsp",{"2":{"242":4}}],["email",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["empty",{"0":{"194":1,"195":1,"203":1},"2":{"1":1,"203":1,"248":1,"249":1}}],["else",{"2":{"26":1,"27":1,"37":1,"48":1,"49":1,"59":1,"66":1,"81":1,"87":2,"88":1,"93":1,"95":1,"96":1,"120":1,"121":1,"122":1,"123":1,"125":2,"139":1,"140":1,"141":1,"152":1,"179":1,"180":5,"193":1,"241":9,"242":10,"243":2,"248":2,"284":1,"286":1}}],["elif",{"2":{"26":2,"48":2,"81":1,"83":3,"87":1,"142":4,"152":1,"241":5,"248":2,"249":1}}],["event装饰器监听文件系统事件",{"2":{"303":1}}],["events",{"2":{"303":1}}],["eventhandler",{"0":{"189":2},"2":{"188":1,"189":4}}],["event",{"0":{"102":1,"103":1,"166":1,"167":1,"168":1,"169":1,"170":2,"171":2,"181":1,"190":1,"202":1,"203":1,"204":1,"277":1},"1":{"103":1,"104":2,"182":1,"183":1,"184":1},"2":{"21":4,"24":1,"30":1,"43":4,"46":1,"52":1,"100":1,"101":1,"102":1,"166":1,"167":2,"168":2,"169":2,"170":3,"171":9,"181":1,"184":2,"190":5,"195":2,"200":3,"201":3,"202":2,"203":1,"204":2,"277":3,"284":2,"303":8}}],["every",{"2":{"1":1}}],["errors=true",{"2":{"243":1}}],["errors",{"2":{"6":1}}],["error",{"0":{"122":1},"2":{"6":1,"122":4,"180":2,"284":1}}],["extra",{"0":{"266":1}}],["extensions",{"2":{"303":2}}],["extend",{"2":{"173":1}}],["external",{"2":{"1":1}}],["exclude",{"2":{"303":2}}],["exc",{"2":{"190":1,"248":1}}],["exception模块包含了liteyuki运行中的所有错误",{"2":{"174":1}}],["exception",{"0":{"174":1},"1":{"175":1},"2":{"190":1,"248":1,"284":2}}],["except",{"2":{"23":1,"24":1,"45":1,"46":1,"122":1,"190":1,"248":1,"284":2}}],["executor",{"2":{"86":1}}],["executable",{"2":{"6":1,"15":1,"26":3,"48":3}}],["exist",{"2":{"249":1}}],["exists",{"2":{"81":2,"93":1,"142":1,"143":1,"239":1,"249":2}}],["exit",{"0":{"25":1,"47":1},"2":{"21":2,"25":2,"26":1,"43":2,"47":2,"48":1}}],["example",{"0":{"3":1,"290":1},"2":{"6":2}}],["end",{"2":{"296":1}}],["endswith",{"2":{"142":3,"143":1,"240":1,"249":1,"303":1}}],["enum",{"0":{"207":1,"253":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1,"254":1,"255":1,"256":1,"257":1,"258":1}}],["enumerate",{"2":{"193":1}}],["encoding=",{"2":{"139":1,"140":1,"141":1,"239":1,"241":1}}],["encountered",{"2":{"9":1}}],["enforcing",{"2":{"81":1}}],["environment",{"2":{"12":4}}],["environments",{"2":{"3":1,"6":1,"15":1}}],["enter",{"2":{"6":1}}],["ensure",{"2":{"1":1,"284":1}}],["enable",{"2":{"1":1,"311":2,"312":1,"313":2,"314":2}}],["msg",{"2":{"311":1}}],["mcfunction",{"2":{"295":2}}],["mkdir",{"2":{"243":1}}],["mkdoc",{"0":{"206":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1},"2":{"206":1}}],["md",{"2":{"243":15}}],["m",{"2":{"12":1,"15":1,"193":2,"250":1,"320":1}}],["minimum",{"2":{"15":1}}],["minecraftonebot",{"2":{"9":1}}],["minecraft",{"0":{"9":1},"2":{"9":1}}],["misans",{"2":{"10":1}}],["must",{"2":{"84":1,"93":1,"166":1}}],["much",{"2":{"6":1}}],["multiple",{"2":{"0":1,"15":1}}],["my",{"2":{"6":1}}],["member",{"2":{"311":1}}],["memory",{"2":{"15":1,"119":3,"132":1,"133":3,"134":3,"135":3,"136":2,"153":1,"154":1,"289":1,"293":3}}],["meta",{"2":{"248":4,"302":1}}],["metadata",{"0":{"273":1},"2":{"248":13}}],["method",{"0":{"209":2,"210":1,"211":1},"2":{"241":5,"242":13}}],["methods=",{"2":{"241":1}}],["methods",{"0":{"229":1},"2":{"3":1,"241":1,"242":1}}],["means",{"2":{"6":1}}],["message=",{"2":{"184":1,"311":1}}],["message=message",{"2":{"184":1}}],["messageevent",{"0":{"182":1,"183":1,"190":1,"202":1,"203":1,"204":1,"277":1},"1":{"183":1,"184":1},"2":{"183":1,"184":1,"190":1,"195":1,"197":1,"200":1,"201":1,"202":1,"203":1,"204":1,"277":1}}],["messages",{"2":{"6":2,"289":2}}],["message",{"0":{"181":1,"183":3,"184":1,"185":1,"186":1,"191":1,"192":1,"194":1,"196":1,"205":1},"1":{"182":1,"183":1,"184":1,"187":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"4":1,"6":1,"183":12,"184":6,"194":1,"195":2,"277":1,"319":1,"320":1}}],["merge",{"2":{"0":1}}],["match",{"2":{"250":1}}],["matcher",{"0":{"186":1,"187":1,"193":3,"194":1,"195":1},"1":{"187":1,"188":2,"189":2,"190":2},"2":{"186":1,"193":9,"194":6,"195":1}}],["matter=none",{"2":{"242":1}}],["matter",{"0":{"242":1},"2":{"242":5,"243":3}}],["markdown",{"0":{"242":1},"2":{"242":3,"243":1}}],["maplemono",{"2":{"10":1}}],["makedirs",{"2":{"239":1}}],["make",{"2":{"6":2}}],["mainprocess",{"2":{"289":1}}],["main",{"0":{"116":1},"2":{"6":1,"12":1,"37":1,"59":1,"81":4,"87":4,"88":2,"89":1,"93":1,"95":1,"96":1,"119":1,"120":1,"121":1,"122":1,"123":1,"125":5,"126":1,"127":1,"289":1,"290":6,"306":1}}],["manager",{"0":{"147":1,"251":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"21":2,"22":1,"26":1,"27":1,"43":2,"44":1,"48":1,"49":1,"147":1,"251":1}}],["manage",{"2":{"14":1}}],["management",{"2":{"14":1}}],["many",{"2":{"6":1}}],["manually",{"2":{"2":1,"81":1}}],["may",{"2":{"3":1}}],["moved",{"0":{"169":1},"2":{"169":1}}],["more",{"2":{"2":1,"14":1,"15":1}}],["moduletype",{"0":{"271":1}}],["module=module",{"2":{"248":1}}],["moduleinfo",{"0":{"232":1,"241":1,"242":1},"1":{"233":1,"234":1,"235":1,"236":1,"237":1},"2":{"241":2,"242":1}}],["module",{"0":{"173":1,"233":1,"240":1,"241":1,"242":1,"243":1,"244":1,"248":1,"256":2,"271":1,"272":1,"286":1},"2":{"173":4,"240":2,"241":11,"242":6,"243":26,"244":1,"248":27,"249":9,"250":1,"268":1,"286":1}}],["modified",{"0":{"166":1},"2":{"13":1,"166":2,"167":1,"168":1,"169":1,"170":1,"171":4}}],["modify",{"2":{"0":2}}],["modes",{"2":{"290":1}}],["model",{"0":{"252":1,"269":1},"1":{"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"252":1}}],["mode为true",{"2":{"161":1}}],["mode",{"2":{"2":5,"6":3,"290":5,"311":2,"312":1}}],["most",{"2":{"0":1}}],["lt",{"2":{"310":1,"311":7,"313":10,"315":2}}],["lyf结尾",{"2":{"295":1}}],["lyfunction语法",{"2":{"311":1}}],["lyfunction",{"2":{"295":1}}],["len",{"2":{"83":2,"89":1}}],["least",{"2":{"15":2}}],["level=0",{"2":{"180":1}}],["level",{"0":{"179":1},"2":{"1":3,"179":2,"180":6}}],["lsposed",{"2":{"8":1}}],["llonebot",{"2":{"8":1}}],["laptop",{"2":{"243":2}}],["lang",{"0":{"242":1,"243":1},"2":{"242":4,"243":3}}],["language",{"2":{"2":2}}],["last",{"2":{"164":4}}],["lambda",{"2":{"132":1,"133":2,"134":2,"135":2,"136":1}}],["lagrange",{"2":{"8":2}}],["locks",{"2":{"122":1}}],["lock",{"0":{"131":2},"2":{"120":3,"121":3,"122":3,"129":1}}],["local",{"2":{"1":1}}],["loop",{"0":{"89":1,"127":1},"2":{"21":4,"30":1,"43":4,"52":1,"66":2,"81":1,"86":3,"89":3,"119":2,"127":2,"153":2,"284":10}}],["log0000",{"2":{"290":1}}],["logger",{"0":{"29":1,"51":1},"2":{"21":1,"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"39":1,"43":1,"45":1,"46":1,"47":1,"48":1,"50":1,"51":1,"61":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":2,"89":2,"139":1,"140":1,"141":1,"142":2,"143":1,"152":3,"156":2,"158":1,"180":7,"248":3,"249":3,"284":1,"290":3,"303":2}}],["logo",{"0":{"40":1,"62":1},"2":{"21":1,"40":1,"43":1,"62":1}}],["logic",{"2":{"6":1}}],["login",{"2":{"6":2}}],["logs",{"2":{"2":1}}],["log",{"0":{"178":1,"180":1},"1":{"179":1,"180":1},"2":{"1":4,"6":1,"29":1,"51":1,"178":1,"180":3,"290":1}}],["loaded",{"0":{"246":1,"275":1},"2":{"246":1,"275":1}}],["loader",{"0":{"278":1,"279":1,"280":1,"281":1},"1":{"279":1,"281":1},"2":{"21":1,"43":1,"279":1,"281":1}}],["loading",{"2":{"139":1,"140":1,"141":1}}],["load",{"0":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"247":1,"248":1,"249":1},"1":{"248":1,"249":1,"250":1},"2":{"0":1,"2":2,"21":1,"43":1,"139":4,"140":4,"141":4,"142":4,"143":2,"144":3,"173":3,"247":1,"248":3,"249":2,"279":2,"281":2,"313":1,"314":1}}],["like",{"2":{"289":1}}],["life",{"2":{"65":1}}],["lifespan=self",{"2":{"21":1,"43":1}}],["lifespan",{"0":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"63":1,"64":1,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"151":2},"1":{"64":1,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2},"2":{"21":3,"22":2,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"43":3,"44":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"63":1,"65":6,"66":2,"67":4,"68":4,"69":4,"70":4,"71":4,"72":4,"151":4,"152":3}}],["liteecho",{"0":{"276":1,"277":1},"1":{"277":1},"2":{"276":2,"277":2,"311":1}}],["liteloader",{"2":{"8":1}}],["liteyukiexception",{"0":{"175":1}}],["liteyukistudio",{"2":{"12":1,"13":1,"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["liteyuki",{"0":{"17":1,"19":1,"41":1,"63":1,"79":1,"100":1,"101":1,"102":1,"105":1,"109":1,"115":1,"137":1,"145":1,"146":1,"147":1,"159":1,"160":1,"161":1,"172":1,"174":1,"176":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"245":1,"247":1,"251":1,"252":1,"274":1,"276":1,"278":1,"280":1,"282":1,"313":1},"1":{"18":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"104":1,"106":1,"107":1,"108":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"175":1,"177":1,"179":1,"180":1,"182":1,"183":1,"184":1,"187":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"246":1,"248":1,"249":1,"250":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"314":1},"2":{"1":6,"2":4,"3":2,"4":2,"6":6,"12":1,"14":1,"15":1,"21":2,"23":1,"24":1,"37":1,"43":2,"45":1,"46":1,"59":1,"173":2,"248":5,"279":3,"281":3,"289":1,"290":12,"293":2,"294":1,"302":1,"303":4,"306":1,"307":1,"311":4,"312":3}}],["liteyukibot",{"0":{"20":1,"37":1,"42":1,"59":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"0":5,"9":1,"12":2,"13":6,"14":1,"26":1,"37":3,"48":1,"59":3,"173":1,"289":1}}],["linux",{"2":{"8":1,"12":1,"14":1,"15":1,"26":1,"48":1}}],["limited",{"2":{"4":1}}],["listdir",{"2":{"143":1,"249":2}}],["listen",{"2":{"289":1}}],["listening",{"2":{"1":1}}],["listed",{"2":{"6":1}}],["list",{"0":{"66":1,"183":1,"195":1,"215":1,"229":1,"230":1,"231":1,"234":1,"235":1,"236":1,"240":1},"2":{"1":4,"65":6,"66":1,"81":2,"83":2,"116":1,"117":1,"183":1,"188":1,"193":3,"195":1,"240":4,"241":4,"243":3,"311":1,"313":2,"314":1}}],["switch",{"2":{"311":2,"312":1}}],["sync",{"2":{"287":2}}],["sys",{"2":{"25":1,"26":3,"47":1,"48":3,"180":1}}],["system",{"0":{"171":1},"2":{"15":2,"26":4,"48":4,"171":1,"303":2}}],["src",{"2":{"279":1,"281":1,"303":5}}],["schedule",{"2":{"171":1}}],["script",{"0":{"14":1},"2":{"14":1}}],["scripts",{"2":{"12":1}}],["sm",{"2":{"153":2}}],["shinjuku",{"2":{"317":1}}],["shellstatistic",{"2":{"319":1}}],["shellbind",{"2":{"317":1}}],["shellweather",{"2":{"317":1}}],["shellmain",{"2":{"308":1}}],["shellvar",{"2":{"296":1}}],["shellcmd",{"2":{"295":1}}],["shell",{"2":{"295":1,"297":1}}],["shutil",{"2":{"243":1}}],["shutdown",{"0":{"33":1,"34":1,"55":1,"56":1,"69":1,"70":1,"75":1,"76":1},"2":{"33":2,"34":2,"55":2,"56":2,"65":2,"69":2,"70":2,"75":3,"76":3,"152":2}}],["show",{"2":{"180":6}}],["should",{"2":{"81":1}}],["shared",{"2":{"119":3,"132":1,"133":3,"134":3,"135":3,"136":2,"153":1,"154":1,"289":1,"293":3}}],["snowykami",{"2":{"63":2,"79":2,"102":2,"109":2,"147":2,"172":2,"178":2,"181":2,"185":2,"186":2,"191":2,"192":2,"196":2,"205":2,"206":2,"247":2,"251":2,"252":2,"276":2,"278":2,"280":2}}],["sleep",{"2":{"24":1,"26":1,"46":1,"48":1,"290":1,"296":1,"297":1}}],["simple",{"2":{"302":1}}],["signature",{"2":{"287":2}}],["signal",{"2":{"21":6,"25":1,"43":6,"47":1}}],["signum",{"0":{"25":1,"47":1},"2":{"25":3,"47":3}}],["sigterm",{"2":{"21":1,"43":1}}],["sigint",{"2":{"21":1,"43":1}}],["sides",{"2":{"3":1,"6":1}}],["side",{"0":{"3":1},"2":{"6":4}}],["style",{"2":{"308":2}}],["stem",{"2":{"286":2}}],["stdout",{"2":{"180":1}}],["store",{"2":{"119":1,"120":1,"121":1,"122":2,"123":1}}],["storage",{"0":{"115":1},"1":{"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"100":2,"101":2,"293":2}}],["stopping",{"2":{"23":1,"24":1,"25":1,"45":1,"46":1,"47":1,"152":1}}],["stop",{"0":{"30":1,"52":1},"2":{"21":1,"24":2,"25":1,"30":3,"43":1,"46":2,"47":1,"52":3}}],["strip",{"2":{"277":2}}],["str=",{"2":{"242":1,"243":1}}],["structure",{"0":{"83":2},"2":{"83":17,"84":1}}],["str",{"0":{"27":1,"38":1,"39":2,"49":1,"60":1,"61":2,"81":1,"93":1,"94":1,"95":1,"96":1,"97":2,"98":2,"99":2,"104":2,"111":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"133":2,"134":2,"135":2,"136":2,"138":2,"139":2,"140":2,"141":2,"142":2,"143":2,"144":1,"149":2,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"179":2,"183":9,"184":2,"195":1,"214":1,"215":2,"216":1,"217":1,"218":1,"222":1,"223":1,"225":1,"227":1,"228":1,"231":1,"233":1,"237":1,"238":3,"239":2,"240":1,"241":1,"242":2,"243":3,"246":1,"248":1,"249":1,"250":2,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1,"270":1,"272":1,"275":1,"286":1},"2":{"21":1,"27":1,"38":1,"39":2,"43":1,"49":1,"60":1,"61":2,"81":2,"91":2,"93":1,"94":1,"95":1,"96":2,"97":2,"98":2,"99":2,"104":2,"111":1,"116":1,"117":1,"119":5,"120":1,"121":1,"122":1,"123":4,"124":1,"125":1,"126":1,"133":2,"134":2,"135":2,"136":2,"138":2,"139":2,"140":2,"141":2,"142":2,"143":2,"144":1,"149":2,"151":2,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"179":2,"183":11,"184":2,"195":1,"204":1,"238":3,"239":2,"240":1,"241":1,"242":1,"243":4,"246":3,"248":1,"249":1,"250":4,"275":3,"286":3,"290":1}}],["stat",{"2":{"320":1}}],["statistic",{"2":{"320":1}}],["statistics",{"0":{"319":1},"1":{"320":1}}],["static",{"0":{"210":1},"2":{"241":1}}],["staticmethod",{"0":{"210":1},"2":{"65":1,"66":1,"125":1,"126":1,"241":1}}],["status",{"2":{"311":1,"312":1}}],["standard",{"2":{"6":2}}],["startup",{"2":{"290":2}}],["startswith",{"2":{"241":3,"276":1,"277":1}}],["started",{"2":{"6":1}}],["start",{"0":{"31":1,"32":1,"53":1,"54":1,"67":1,"68":1,"73":1,"74":1,"89":1,"127":1,"153":1},"2":{"1":2,"6":3,"12":1,"22":3,"26":2,"31":2,"32":2,"44":3,"48":2,"53":2,"54":2,"65":2,"67":2,"68":2,"73":3,"74":3,"89":1,"127":2,"152":4,"153":3,"285":1,"290":1}}],["starting",{"2":{"0":1,"89":1}}],["s",{"2":{"15":1,"83":2}}],["split",{"2":{"248":4}}],["space",{"2":{"15":1}}],["specified",{"2":{"248":1}}],["specific",{"2":{"15":1}}],["specify",{"2":{"6":1}}],["sockschannel",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1}}],["socks",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1}}],["software",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["source",{"0":{"218":1},"2":{"12":1,"15":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":3,"242":7,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["solution",{"0":{"8":1,"9":1}}],["some",{"2":{"1":1,"6":2}}],["search",{"2":{"313":1,"314":1}}],["service",{"0":{"255":2},"2":{"250":1,"302":1}}],["server",{"2":{"1":1,"3":1,"9":1,"15":1}}],["sep",{"2":{"241":3}}],["session",{"0":{"183":2,"205":1},"2":{"183":8,"184":5,"205":1}}],["set",{"0":{"93":1,"94":1,"97":1,"120":1,"134":1,"249":1},"2":{"21":1,"24":1,"30":1,"43":1,"46":1,"52":1,"81":1,"93":2,"94":2,"96":1,"97":3,"120":2,"133":1,"134":3,"249":2,"284":1,"293":1,"311":2,"312":1,"315":2}}],["self",{"0":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"65":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"127":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"166":1,"167":1,"168":1,"169":1,"170":1,"183":1,"184":1,"188":1,"189":1,"190":1,"199":1,"200":1,"201":1,"202":1,"268":1},"2":{"21":14,"22":5,"23":2,"24":3,"25":2,"26":4,"27":2,"28":2,"29":1,"30":3,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"43":14,"44":5,"45":2,"46":3,"47":2,"48":4,"49":2,"50":2,"51":1,"52":3,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"65":8,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":3,"74":3,"75":3,"76":3,"77":3,"78":3,"81":14,"82":3,"83":4,"84":6,"85":3,"86":2,"87":3,"88":3,"89":8,"104":3,"107":2,"108":2,"111":5,"112":1,"113":1,"114":1,"119":7,"120":3,"121":3,"122":4,"123":3,"124":2,"125":1,"127":4,"149":6,"151":4,"152":8,"153":3,"154":2,"155":2,"156":3,"157":3,"158":3,"166":1,"167":2,"168":2,"169":2,"170":2,"183":10,"184":3,"188":5,"189":2,"190":3,"199":2,"200":2,"201":2,"202":3,"241":1,"242":1,"268":2}}],["send",{"0":{"84":1,"112":1},"2":{"6":1,"27":2,"49":2,"81":2,"84":4,"93":1,"95":1,"96":1,"98":1,"99":1,"111":1,"112":1,"120":1,"121":1,"122":1,"123":1,"124":1,"127":1,"133":1,"136":1,"184":1,"289":1,"290":3,"311":1}}],["summary>",{"2":{"242":3}}],["summary>源代码",{"2":{"242":1}}],["su",{"0":{"204":1},"2":{"204":1,"276":1,"277":1}}],["succeeded",{"2":{"248":1}}],["success",{"2":{"156":1,"180":2,"248":2}}],["such",{"2":{"6":1}}],["subscribe",{"2":{"125":1}}],["subscriber",{"0":{"116":1,"117":1,"125":1,"126":1},"2":{"125":7,"126":2,"127":1}}],["sub",{"0":{"117":1},"2":{"37":1,"59":1,"81":2,"87":1,"88":1,"119":1,"125":4,"127":1}}],["submit",{"2":{"7":1}}],["sure",{"2":{"6":2}}],["supported",{"2":{"4":1,"143":1}}],["supports",{"2":{"0":1,"8":5}}],["superuser",{"2":{"1":1}}],["superusers",{"2":{"0":1,"1":1,"6":1,"204":1}}],["same",{"2":{"3":2}}],["safe",{"2":{"2":2,"6":3,"139":1}}],["num为每页显示数量",{"2":{"313":2}}],["num",{"2":{"313":2}}],["number",{"2":{"13":2}}],["nliteyuki",{"2":{"295":1}}],["n\`\`\`",{"2":{"242":2}}],["n\`\`\`python",{"2":{"242":2}}],["n",{"2":{"40":10,"62":10,"242":52,"243":2}}],["name>",{"2":{"296":2}}],["name=module",{"2":{"248":3}}],["name=target",{"2":{"241":2}}],["name=class",{"2":{"241":1}}],["name=node",{"2":{"241":2}}],["name=f",{"2":{"154":2}}],["name=",{"2":{"90":1,"91":1,"119":3,"302":1}}],["name",{"0":{"27":1,"49":1,"81":1,"93":1,"95":1,"104":1,"111":1,"152":1,"154":1,"156":1,"158":1,"214":1,"222":1,"227":1,"244":1,"250":2,"260":1,"270":1,"272":1,"286":1},"2":{"27":7,"49":7,"81":12,"89":2,"93":8,"94":2,"95":6,"97":3,"98":3,"104":3,"111":5,"152":14,"153":2,"154":6,"155":1,"156":7,"157":2,"158":6,"241":11,"242":7,"243":2,"248":20,"249":9,"250":7,"268":1,"286":1,"290":2,"311":4,"313":8}}],["ntqq",{"2":{"8":1}}],["npm",{"2":{"6":1,"313":7,"314":1}}],["new",{"2":{"21":1,"43":1,"138":3,"284":1}}],["necessary",{"2":{"6":1}}],["needs",{"2":{"290":1}}],["need",{"2":{"0":1,"2":1,"6":1}}],["nonlocal",{"2":{"164":1}}],["nonedog",{"2":{"302":1}}],["none",{"0":{"21":1,"27":1,"38":1,"39":1,"43":1,"49":1,"60":1,"61":1,"65":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"87":1,"107":1,"120":1,"121":1,"122":1,"124":1,"130":1,"154":1,"171":1,"183":2,"190":1,"224":1,"242":1,"243":1,"273":1},"2":{"21":1,"27":1,"37":1,"43":1,"49":1,"59":1,"65":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":3,"82":1,"84":1,"86":1,"87":1,"107":1,"111":2,"120":1,"122":1,"124":1,"129":2,"139":1,"140":1,"141":1,"154":1,"162":1,"164":1,"171":1,"183":1,"190":1,"197":2,"202":1,"241":3,"243":1,"248":4,"249":1,"283":1}}],["nonebot2",{"2":{"4":2,"10":1}}],["nonebot",{"0":{"3":1},"2":{"1":2,"2":2,"3":1,"10":1,"282":1,"290":3,"302":1,"303":4,"306":1}}],["nohup",{"2":{"26":2,"48":2,"296":1,"297":1}}],["nodes",{"2":{"241":2}}],["node",{"2":{"8":1,"15":1,"241":42}}],["notimplementederror",{"2":{"166":1}}],["not",{"2":{"1":1,"2":1,"4":1,"6":4,"15":2,"24":1,"27":1,"37":1,"46":1,"49":1,"59":1,"81":1,"83":3,"84":2,"87":4,"89":1,"93":1,"122":1,"125":3,"127":1,"139":1,"140":1,"141":1,"142":3,"143":3,"152":2,"156":2,"158":2,"171":2,"190":1,"239":1,"241":8,"248":1,"249":8,"303":2}}],["normal>",{"2":{"180":1}}],["normal",{"0":{"12":1,"241":1},"2":{"1":1,"241":1,"243":1}}],["no",{"0":{"142":1,"143":1,"144":1,"214":1,"215":1,"216":1,"217":1,"219":1,"220":1,"222":1,"223":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"244":1,"260":1,"270":1,"271":1,"272":1},"2":{"1":1,"89":1,"92":1,"142":3,"143":3,"144":3,"241":3,"242":1,"243":2}}],["nickname",{"2":{"0":1,"1":2,"6":3}}],["ignored",{"0":{"243":1},"2":{"152":1,"243":8}}],["ignore",{"0":{"122":1,"241":1,"249":1},"2":{"122":4,"241":6,"243":1,"249":6}}],["id仅超级用户可用",{"2":{"311":1}}],["id=user",{"2":{"297":2}}],["id=1234567",{"2":{"311":2}}],["id=123456",{"2":{"297":1}}],["id=self",{"2":{"184":3}}],["id",{"0":{"183":3},"2":{"87":5,"88":4,"183":11,"184":3,"204":1,"241":6,"297":2,"311":2,"313":1,"319":4}}],["ids",{"2":{"81":2,"87":2,"88":2,"89":1}}],["impossible",{"2":{"289":1}}],["import",{"2":{"132":1,"248":1,"290":5,"293":1,"302":2,"303":3,"306":1}}],["implemented",{"2":{"166":1,"290":1}}],["implement",{"2":{"6":1,"290":1}}],["implementation",{"0":{"3":1},"2":{"3":1,"6":4,"8":1}}],["image",{"2":{"13":1,"311":2,"312":1}}],["i",{"2":{"6":2,"193":2,"290":6}}],["icon=f",{"2":{"180":5}}],["icon",{"2":{"1":2,"180":7,"242":2,"243":2}}],["isclass",{"2":{"283":1}}],["iscoroutinefunction",{"2":{"283":2}}],["isroutine",{"2":{"283":1}}],["isfile",{"2":{"249":1,"303":1}}],["isdir",{"2":{"249":2}}],["isinstance",{"2":{"83":8,"93":1,"138":1,"241":13,"248":1,"290":1}}],["issues",{"2":{"9":2}}],["issue",{"2":{"7":1}}],["is",{"0":{"158":1,"204":1,"220":1,"283":1},"2":{"1":3,"2":1,"3":3,"4":1,"6":2,"12":1,"15":1,"21":1,"23":1,"24":2,"27":1,"37":2,"43":1,"45":1,"46":2,"49":1,"59":2,"66":1,"81":6,"84":1,"87":5,"88":1,"89":1,"93":1,"95":1,"96":1,"119":2,"120":1,"121":1,"122":1,"123":1,"125":3,"127":1,"129":2,"139":1,"140":1,"141":1,"154":1,"156":1,"158":2,"171":1,"183":1,"202":1,"204":1,"241":2,"242":2,"243":1,"248":1,"249":2,"283":1,"284":1,"289":2,"290":3}}],["if",{"2":{"1":2,"2":4,"3":1,"6":2,"7":1,"13":2,"15":2,"26":2,"27":1,"37":2,"39":2,"48":2,"49":1,"59":2,"61":2,"66":1,"81":5,"82":1,"83":4,"84":3,"85":1,"87":6,"88":1,"89":1,"93":3,"95":1,"96":1,"120":1,"121":1,"122":3,"123":1,"125":5,"127":2,"129":2,"138":1,"139":1,"140":1,"141":1,"142":2,"143":3,"152":2,"154":1,"156":2,"158":1,"164":1,"171":1,"179":1,"180":5,"183":1,"184":1,"190":1,"193":1,"202":1,"239":1,"240":1,"241":20,"242":10,"243":4,"248":2,"249":9,"283":2,"284":1,"286":1}}],["index",{"2":{"242":2,"243":1,"308":1}}],["inherit=",{"2":{"241":1}}],["inherit",{"0":{"231":1},"2":{"242":5}}],["inspect",{"2":{"283":4,"287":1}}],["insert",{"2":{"193":1}}],["instance",{"0":{"129":1,"130":1},"2":{"21":2,"37":4,"43":2,"59":4,"84":1,"93":1,"129":5}}],["installed",{"2":{"15":1}}],["installation",{"0":{"12":1},"2":{"6":2}}],["install",{"0":{"11":1},"1":{"12":1,"13":1,"14":1,"15":1,"16":1},"2":{"6":3,"12":3,"13":1,"15":2,"310":1,"313":1,"314":1}}],["instead",{"2":{"6":2,"13":1,"39":1,"61":1}}],["inner",{"2":{"81":2}}],["initialized",{"2":{"37":1,"59":1,"81":2}}],["initializing",{"2":{"21":1,"43":1}}],["init",{"0":{"21":1,"28":1,"29":1,"43":1,"50":1,"51":1,"65":1,"81":1,"104":1,"107":1,"111":1,"119":1,"149":1,"151":1,"180":1,"183":1,"188":1,"199":1},"2":{"21":2,"28":2,"29":2,"43":2,"50":2,"51":2,"65":1,"81":1,"104":1,"107":1,"111":1,"119":1,"149":1,"151":1,"180":1,"183":1,"185":1,"188":1,"191":1,"199":1,"241":1,"243":2,"249":2,"278":1,"280":1,"286":1,"302":3}}],["including",{"2":{"15":1}}],["inter",{"2":{"289":1}}],["interpreter",{"2":{"6":1}}],["interpreters",{"2":{"6":2}}],["introduction",{"0":{"289":1}}],["int=0",{"2":{"26":1,"48":1,"194":1,"195":1}}],["int",{"0":{"26":1,"48":1,"188":1,"194":1,"195":1},"2":{"65":1,"81":2,"188":1}}],["intact",{"2":{"6":1}}],["invalidgitrepositoryerror",{"2":{"6":1}}],["information",{"2":{"3":1}}],["info",{"0":{"241":1,"242":1},"2":{"1":1,"21":1,"23":1,"24":1,"25":1,"26":1,"43":1,"45":1,"46":1,"47":1,"48":1,"152":2,"180":3,"241":12,"242":6,"243":5,"290":2}}],["in",{"0":{"144":1,"285":1},"2":{"0":3,"1":1,"2":1,"3":2,"6":3,"27":1,"37":1,"39":3,"49":1,"59":1,"61":3,"66":1,"81":5,"83":4,"86":1,"87":1,"88":2,"93":1,"94":1,"122":1,"125":3,"126":1,"127":1,"138":2,"142":1,"143":2,"144":1,"152":1,"153":3,"155":1,"156":1,"157":1,"158":1,"171":1,"173":1,"190":1,"193":1,"195":2,"204":1,"239":1,"240":2,"241":13,"242":9,"243":5,"249":2,"279":2,"281":2,"284":2,"285":1,"289":1,"303":1}}],["iter",{"2":{"241":2}}],["items",{"2":{"0":1,"6":1,"94":1,"138":2,"239":1,"242":1,"243":1}}],["itself",{"2":{"6":1,"9":1}}],["it",{"2":{"0":1,"2":2,"3":1,"6":5,"12":1,"289":2}}],["r>",{"2":{"248":2}}],["rv",{"2":{"243":2}}],["rk",{"2":{"243":2}}],["rmtree",{"2":{"243":1}}],["rpm",{"2":{"313":5,"314":1}}],["rp",{"2":{"239":4}}],["rpc",{"0":{"105":1,"106":1},"1":{"106":1,"107":2,"108":2},"2":{"100":1,"101":1}}],["rule=is",{"2":{"276":1,"277":1}}],["rule=empty",{"2":{"194":1,"195":1}}],["rulehandlerfunc",{"0":{"197":1,"199":1},"2":{"199":1}}],["rule",{"0":{"188":2,"194":3,"195":2,"196":1,"198":1,"200":2,"201":2,"203":1,"204":1},"1":{"197":1,"198":1,"199":2,"200":2,"201":2,"202":2,"203":1,"204":1},"2":{"188":6,"190":1,"194":3,"195":5,"196":1,"200":3,"201":3,"202":1,"203":3,"204":2,"276":1,"277":1}}],["running",{"2":{"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"86":1,"89":1,"119":2,"284":2,"289":1}}],["runtimeerror",{"2":{"37":2,"59":2,"84":1,"85":1,"87":1,"125":1,"127":1,"284":1}}],["run",{"0":{"13":1,"22":1,"23":1,"44":1,"45":1,"66":1,"88":1,"126":1,"152":1,"173":1,"190":1,"284":1,"285":1},"2":{"0":1,"12":1,"13":2,"15":1,"22":1,"23":3,"44":1,"45":3,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"88":1,"89":1,"126":1,"127":1,"152":1,"153":1,"173":2,"190":1,"284":3,"285":1,"306":2}}],["raw",{"0":{"183":1},"2":{"183":4,"184":1,"195":1,"277":1}}],["raise",{"2":{"37":2,"59":2,"81":3,"84":2,"85":1,"87":1,"93":2,"122":1,"125":1,"127":1,"152":1,"166":1}}],["rights",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["root",{"2":{"13":1,"240":2}}],["r",{"2":{"12":1,"15":1,"139":1,"140":1,"141":1,"241":1}}],["readme",{"2":{"243":2}}],["read",{"2":{"241":1}}],["reload",{"2":{"311":1,"312":2,"313":1,"314":1}}],["reloading",{"2":{"303":1}}],["rel",{"2":{"243":4,"286":5}}],["relpath",{"2":{"238":1}}],["relative",{"0":{"238":1},"2":{"238":1,"243":1,"244":1,"286":1}}],["red>",{"2":{"180":1}}],["remove",{"2":{"180":1}}],["ref",{"0":{"132":1}}],["refer",{"0":{"16":1},"2":{"6":1}}],["reference",{"2":{"3":1}}],["return",{"0":{"216":1},"2":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":2,"38":2,"39":4,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":2,"60":2,"61":4,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"82":3,"83":9,"85":1,"86":1,"87":7,"89":1,"95":2,"96":2,"108":1,"113":1,"121":3,"123":3,"125":3,"129":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"156":1,"158":1,"164":3,"171":4,"179":2,"189":3,"190":1,"194":1,"195":2,"200":2,"201":2,"202":2,"203":1,"204":1,"238":1,"240":1,"241":4,"242":4,"246":2,"248":2,"249":1,"250":2,"268":1,"275":2,"283":4,"286":3,"287":3}}],["returns",{"2":{"24":1,"25":1,"26":1,"27":1,"28":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"46":1,"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"87":1,"95":1,"96":1,"113":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"152":1,"156":1,"158":1,"171":1,"180":1,"184":1,"189":1,"190":1,"241":5,"242":1,"246":1,"250":1,"275":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["registered",{"2":{"89":1}}],["register",{"2":{"21":1,"43":1}}],["reply",{"0":{"184":1},"2":{"184":3,"277":1}}],["replace",{"2":{"13":1,"241":3,"242":4,"243":8}}],["repo",{"2":{"13":1}}],["report设定为false",{"2":{"309":1}}],["reports",{"2":{"6":1}}],["report",{"2":{"1":2,"6":2,"309":1}}],["required",{"2":{"81":1}}],["requires",{"2":{"15":1}}],["requirements",{"0":{"15":1},"1":{"16":1},"2":{"12":1,"15":1}}],["requests",{"2":{"1":1}}],["resources",{"2":{"307":1,"308":1,"312":1}}],["resolve",{"2":{"286":2}}],["reserved",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["response",{"2":{"6":2}}],["respond",{"2":{"6":1}}],["restarting",{"2":{"26":1,"48":1,"152":1}}],["restart",{"0":{"26":1,"27":1,"35":1,"36":1,"48":1,"49":1,"57":1,"58":1,"71":1,"72":1,"77":1,"78":1},"2":{"0":1,"21":1,"26":3,"27":1,"35":2,"36":2,"43":1,"48":3,"49":1,"57":2,"58":2,"65":2,"71":2,"72":2,"77":3,"78":3,"152":1,"303":2}}],["reverse",{"2":{"3":2}}],["receiving",{"2":{"290":1}}],["received",{"2":{"25":1,"47":1,"152":1}}],["receive",{"0":{"85":1,"86":1,"87":1,"88":1,"89":1,"113":1,"116":1,"117":1,"125":3,"126":1,"127":1,"183":1},"2":{"1":1,"81":3,"85":2,"86":2,"87":4,"88":3,"89":7,"95":1,"96":2,"97":2,"98":2,"99":1,"113":1,"116":1,"117":1,"119":2,"121":1,"123":1,"125":11,"126":2,"127":4,"132":1,"133":2,"134":2,"135":2,"136":1,"152":1,"153":2,"183":4,"184":3,"290":11}}],["recursive=recursive",{"2":{"171":1}}],["recursive",{"0":{"171":1},"2":{"171":3}}],["recv",{"2":{"81":2,"85":2,"95":5,"96":5,"98":3,"99":3,"111":1,"121":5,"123":5,"133":3,"136":3}}],["recommended",{"0":{"8":1,"9":1},"2":{"3":1,"6":1,"12":1,"14":1,"15":2}}],["city",{"2":{"317":1,"318":1}}],["css相对路径引用b中的css",{"2":{"308":1}}],["css",{"2":{"307":1,"308":1}}],["cwd",{"2":{"286":1}}],["cfg",{"2":{"173":4}}],["current|bot",{"2":{"319":1}}],["current|group",{"2":{"319":1}}],["current",{"2":{"164":3,"319":2,"320":1}}],["custom",{"2":{"2":4}}],["customize",{"2":{"2":1}}],["c",{"2":{"63":1,"79":1,"102":1,"109":1,"138":3,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"250":1,"251":1,"252":1,"276":1,"278":1,"280":1,"284":4,"286":4,"320":1}}],["cmd",{"2":{"26":5,"48":5,"295":2,"296":1}}],["cpu",{"2":{"15":1,"309":1}}],["cd",{"2":{"12":1,"13":1}}],["cls",{"0":{"129":1},"2":{"129":6,"241":1,"242":11}}],["close",{"0":{"114":1},"2":{"114":1,"284":1}}],["closed",{"2":{"81":1,"84":2,"85":2,"89":1,"111":1}}],["clone",{"2":{"12":2,"13":2}}],["cloning",{"2":{"6":1}}],["classdef",{"2":{"241":3}}],["classes=",{"2":{"241":1}}],["classes",{"0":{"235":1},"2":{"241":1,"242":1}}],["classinfo",{"0":{"226":1,"235":1},"1":{"227":1,"228":1,"229":1,"230":1,"231":1},"2":{"241":1}}],["classmethod",{"0":{"211":1},"2":{"128":1,"129":1,"241":1}}],["class",{"0":{"20":1,"42":1,"64":1,"80":1,"103":1,"106":1,"110":1,"118":1,"128":1,"148":1,"150":1,"165":1,"175":1,"182":1,"187":1,"198":1,"207":1,"211":1,"213":1,"221":1,"226":1,"232":1,"253":1,"259":1,"267":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"130":1,"131":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"166":1,"167":1,"168":1,"169":1,"170":1,"183":1,"184":1,"188":1,"189":1,"190":1,"199":1,"200":1,"201":1,"202":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"82":2,"241":24,"242":2}}],["client",{"2":{"8":1}}],["cqhttp",{"2":{"8":1}}],["child",{"2":{"241":2,"289":1}}],["chromium",{"2":{"15":1}}],["channel时的通道标识",{"2":{"290":1}}],["channel即可",{"2":{"290":1}}],["channel及passive",{"2":{"290":1}}],["channel函数获取通道对象",{"2":{"290":2}}],["channel=none",{"2":{"184":1}}],["channeldeliver",{"0":{"148":1},"1":{"149":1},"2":{"154":1}}],["channelv2",{"2":{"109":1}}],["channels",{"0":{"94":2,"96":1,"99":1},"2":{"94":5,"96":2,"98":1,"99":3,"153":1}}],["channel",{"0":{"79":1,"80":1,"90":1,"91":1,"92":2,"93":3,"94":1,"95":2,"96":1,"97":1,"98":1,"109":1,"124":1,"125":1,"126":1,"149":8,"183":2,"288":1},"1":{"80":1,"81":2,"82":2,"83":2,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"110":1,"111":1,"112":1,"113":1,"114":1,"289":1,"290":1,"291":1,"292":1,"293":1},"2":{"27":2,"49":2,"79":1,"81":7,"84":1,"85":1,"90":3,"91":3,"92":2,"93":19,"94":4,"95":8,"96":9,"97":11,"98":7,"99":2,"100":2,"101":2,"119":4,"121":1,"123":1,"124":5,"125":9,"126":4,"127":2,"149":12,"152":1,"154":12,"183":5,"184":2,"289":3,"290":14}}],["chan",{"2":{"27":4,"49":4,"95":5,"96":5,"98":3,"99":3,"119":2,"120":1,"121":6,"122":1,"123":6,"124":1,"127":1,"132":1,"133":5,"134":2,"135":2,"136":4,"152":2,"153":2,"154":2,"290":2}}],["changed",{"2":{"303":1}}],["change",{"2":{"12":1,"13":1,"313":1,"314":1}}],["chat",{"2":{"6":1,"7":1,"9":1}}],["check",{"0":{"81":1},"2":{"1":1,"6":1,"81":9,"84":1}}],["cn",{"0":{"242":1,"243":1},"2":{"2":1,"242":2,"243":1}}],["color",{"2":{"250":7}}],["colors=true",{"2":{"248":3}}],["color=",{"2":{"180":5}}],["copy",{"2":{"138":1}}],["copyright",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["count",{"0":{"132":1},"2":{"21":1,"26":2,"43":1,"48":2}}],["code插件liteyuki",{"2":{"299":1}}],["code=ast",{"2":{"241":2}}],["codemodifiedhandler",{"0":{"165":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"171":1}}],["code",{"0":{"218":1},"2":{"15":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":4,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":7,"243":3,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["coro",{"0":{"284":1,"285":1},"2":{"284":6,"285":3}}],["coroutine",{"0":{"283":1,"284":2,"285":2,"287":1},"2":{"66":1,"87":2,"125":1,"197":1,"283":1,"284":2,"285":3,"287":3}}],["core",{"0":{"145":1,"146":1,"147":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"8":1}}],["correctly",{"2":{"6":2}}],["come",{"2":{"289":1}}],["combined",{"2":{"200":2,"201":2}}],["com",{"2":{"12":1,"13":1,"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["compat",{"0":{"39":2,"61":2},"2":{"39":9,"61":9}}],["complete",{"2":{"284":2}}],["completion",{"2":{"2":2}}],["complies",{"2":{"6":1}}],["computer",{"2":{"6":1}}],["communicate",{"2":{"289":1}}],["communication",{"0":{"288":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1},"2":{"3":1,"289":1}}],["comm",{"0":{"79":1,"100":1,"101":1,"102":1,"105":1,"109":1,"115":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"104":1,"106":1,"107":1,"108":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"290":2,"293":2}}],["command>",{"2":{"296":2}}],["command",{"0":{"311":1},"1":{"312":1},"2":{"1":4,"6":5,"10":1}}],["content",{"2":{"241":2,"242":17,"243":2}}],["continue",{"2":{"143":1,"152":1,"241":1,"243":1,"249":3}}],["container",{"2":{"13":1}}],["contact",{"2":{"6":1}}],["conn",{"2":{"81":4,"84":1,"85":1,"111":2}}],["connect",{"2":{"6":1}}],["connected",{"0":{"3":1}}],["convenient",{"2":{"14":1}}],["confirm",{"2":{"6":1}}],["configs",{"0":{"143":1},"2":{"143":1,"144":1}}],["config=self",{"2":{"29":1,"51":1}}],["configured",{"2":{"3":1}}],["configuration",{"0":{"1":1,"3":1},"2":{"0":5,"1":1,"2":2,"3":1,"6":2}}],["configurations",{"0":{"0":1,"2":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"2":1}}],["config",{"0":{"38":1,"39":1,"60":1,"61":1,"137":1,"138":2,"144":1,"180":1,"269":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1},"2":{"0":5,"2":2,"21":2,"29":1,"38":2,"39":6,"43":2,"51":1,"60":2,"61":6,"138":10,"139":7,"140":7,"141":7,"142":7,"143":4,"144":9,"173":1,"180":3,"279":2,"281":2,"311":4,"312":1}}],["conflict",{"2":{"6":1}}],["conflicts",{"2":{"6":1,"12":1}}],["console",{"2":{"1":1}}],["created",{"0":{"167":1},"2":{"167":1}}],["create",{"2":{"0":1,"12":1,"88":2,"126":1,"153":3}}],["case",{"2":{"250":4}}],["cases",{"2":{"0":1}}],["category",{"2":{"242":2,"243":2}}],["calling",{"0":{"107":2},"2":{"107":4,"108":1}}],["callback",{"0":{"162":1,"171":2},"2":{"87":1,"88":2,"171":4,"290":1}}],["callable",{"0":{"87":3,"125":1,"171":1,"189":1,"283":2,"287":2},"2":{"66":1,"87":7,"125":2,"151":1,"162":1,"163":1,"171":1,"189":1,"197":1,"283":2,"287":6}}],["call",{"0":{"108":1,"202":1,"283":1},"2":{"21":1,"26":2,"43":1,"48":2,"108":1,"164":4,"202":1,"283":8,"290":1}}],["cache",{"2":{"13":2}}],["cannot",{"2":{"6":1,"84":1,"85":1,"125":1,"127":1}}],["can",{"2":{"0":2,"4":1,"6":2,"7":1,"12":1,"37":1,"59":1,"87":1,"289":1,"290":1}}],["duration>",{"2":{"319":1}}],["duration",{"2":{"319":2,"320":1}}],["duplex",{"2":{"290":1}}],["driver",{"2":{"290":4}}],["d",{"2":{"83":4,"132":2,"133":4,"134":4,"135":4,"136":2,"286":4,"320":1}}],["daemon=true",{"2":{"152":1,"285":1}}],["data=",{"2":{"184":1}}],["data",{"0":{"83":1,"84":1,"88":1,"97":1,"98":1,"99":1,"104":1,"112":1,"124":1,"126":1,"133":1,"134":1,"135":1,"136":1,"183":1,"239":1},"2":{"83":12,"84":7,"85":2,"86":2,"87":5,"88":5,"89":2,"96":2,"97":7,"98":7,"99":4,"104":3,"112":3,"113":2,"124":5,"125":3,"126":4,"127":6,"133":4,"134":3,"135":2,"136":2,"152":4,"183":7,"239":6,"243":5,"290":7}}],["darwin",{"2":{"26":1,"48":1}}],["day",{"2":{"1":1}}],["dog",{"2":{"302":1,"303":1}}],["dot",{"2":{"241":1}}],["docs",{"0":{"243":1},"2":{"243":5,"311":1,"312":1}}],["docstring=method",{"2":{"241":1}}],["docstring=module",{"2":{"241":1}}],["docstring=class",{"2":{"241":1}}],["docstring=function",{"2":{"241":1}}],["docstring",{"0":{"217":1,"225":1,"228":1,"237":1},"2":{"241":16,"242":12}}],["docker",{"0":{"13":1},"2":{"13":4}}],["documentation",{"2":{"6":1,"9":1}}],["don",{"2":{"6":1,"7":1,"9":1}}],["download",{"2":{"6":1}}],["does",{"2":{"6":4,"249":1}}],["do",{"2":{"6":1,"15":1}}],["diagnose=false",{"2":{"180":1}}],["dict",{"0":{"94":1,"96":1,"97":1,"98":1,"99":1,"104":1,"108":1,"123":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"180":1,"183":2,"184":1,"239":1,"246":1,"266":1,"275":1},"2":{"21":1,"43":1,"83":2,"91":1,"94":1,"96":2,"97":1,"98":1,"99":1,"104":1,"108":1,"116":1,"117":1,"119":2,"123":4,"133":1,"134":1,"135":1,"136":1,"138":3,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":3,"180":1,"183":3,"184":1,"239":1,"243":1,"246":3,"248":6,"275":3}}],["disable",{"2":{"311":1,"312":1,"313":2,"314":2}}],["disk",{"2":{"15":1}}],["display",{"0":{"250":2},"2":{"1":1,"248":7,"250":5}}],["different",{"2":{"3":2,"6":1}}],["dir",{"0":{"243":1,"249":1},"2":{"243":6,"249":17,"279":2,"281":2}}],["dirname",{"2":{"239":2}}],["directories=",{"2":{"303":1}}],["directories",{"0":{"143":1,"171":1},"2":{"143":2,"171":4}}],["directory",{"2":{"0":4,"1":1,"2":1,"12":1,"13":2,"143":6,"171":2,"249":1}}],["directly",{"2":{"15":1}}],["direct",{"2":{"6":1,"289":1}}],["dirs",{"0":{"143":1},"2":{"1":1,"143":1,"144":1,"240":1,"279":1,"281":1}}],["details>",{"2":{"242":4}}],["detailed",{"2":{"2":1,"3":1}}],["debounce",{"0":{"164":1},"2":{"164":1,"165":1,"166":1}}],["debug",{"2":{"2":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":2,"89":1,"139":1,"140":1,"141":1,"179":2,"180":2,"303":1}}],["deepcopy",{"2":{"138":1}}],["decorator",{"2":{"87":2,"125":2,"164":2,"171":2,"189":2,"241":13,"290":1}}],["del",{"2":{"122":2}}],["deleted",{"0":{"168":1},"2":{"168":1}}],["delete",{"0":{"122":1,"135":1},"2":{"122":2,"134":1,"135":3}}],["deliver",{"0":{"92":1,"149":2},"2":{"93":1,"95":1,"96":2,"97":2,"98":2,"99":1,"149":6,"154":6}}],["delivery",{"2":{"4":1,"154":1}}],["delay",{"0":{"26":1,"48":1},"2":{"26":2,"48":2}}],["deftype",{"0":{"207":1,"219":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1},"2":{"241":4,"242":1}}],["def",{"0":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1},"2":{"22":1,"24":1,"44":1,"46":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"87":2,"88":1,"89":1,"97":1,"98":1,"99":1,"125":2,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"152":2,"153":1,"164":2,"166":1,"171":2,"189":1,"190":1,"195":1,"200":1,"201":1,"202":1,"203":1,"204":1,"241":4,"242":2,"277":1,"287":1,"290":3,"303":1}}],["default",{"0":{"38":1,"39":1,"60":1,"61":1,"121":1,"144":1,"214":1,"215":1,"216":1,"217":1,"219":1,"220":1,"222":1,"223":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"260":1,"270":1,"271":1,"272":1,"279":1,"281":1},"2":{"1":1,"2":3,"3":1,"18":1,"38":4,"39":4,"60":4,"61":4,"90":1,"91":1,"92":2,"116":1,"117":1,"121":6,"132":1,"133":3,"144":1,"162":1,"163":1,"173":1,"177":1,"179":1,"197":1,"244":1,"279":1,"281":1}}],["deprecated",{"2":{"39":1,"61":1}}],["depth=1",{"2":{"12":1,"13":1}}],["deploy",{"2":{"6":1}}],["depend",{"2":{"15":1}}],["dependency",{"2":{"12":1}}],["dependencies",{"2":{"12":1,"15":1}}],["depends",{"2":{"3":1,"15":1}}],["depending",{"2":{"0":1}}],["description=",{"2":{"302":1}}],["description",{"0":{"261":1},"2":{"3":1,"18":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"100":1,"101":1,"102":1,"105":1,"108":1,"109":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"132":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"147":1,"152":1,"153":1,"154":1,"156":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"171":1,"172":1,"173":1,"174":1,"177":1,"178":1,"180":1,"181":1,"183":1,"184":1,"185":1,"186":1,"188":1,"189":1,"190":1,"191":1,"192":1,"196":1,"197":1,"205":1,"206":1,"238":1,"239":1,"241":1,"242":1,"243":1,"244":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"275":1,"276":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"308":1}}],["device",{"0":{"15":1},"1":{"16":1},"2":{"15":1}}],["developer",{"2":{"302":1}}],["developers",{"2":{"9":1}}],["develop",{"2":{"9":1}}],["development",{"2":{"2":3}}],["dev",{"0":{"159":1,"160":1,"161":1,"172":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1},"2":{"2":1,"303":1,"306":1}}],["two",{"2":{"290":1}}],["types",{"0":{"269":1}}],["type=plugintype",{"2":{"302":1}}],["type=attr",{"2":{"241":1}}],["type=ast",{"2":{"241":3}}],["type=def",{"2":{"241":1}}],["type=deftype",{"2":{"241":1}}],["type=self",{"2":{"184":2}}],["typealias",{"2":{"162":1,"163":1,"197":1}}],["typeerror",{"2":{"81":1,"84":1,"93":1}}],["type",{"0":{"81":1,"82":2,"83":1,"183":2,"216":1,"219":1,"223":1,"250":1,"263":1},"2":{"81":12,"82":4,"83":2,"84":7,"90":1,"91":1,"92":1,"93":1,"116":1,"117":1,"162":1,"163":1,"183":9,"184":2,"197":1,"241":11,"242":13,"248":2,"250":5}}],["target",{"0":{"154":3,"238":1},"2":{"154":6,"238":4,"241":5}}],["target=run",{"2":{"285":1}}],["target=self",{"2":{"152":1}}],["target=os",{"2":{"26":1,"48":1}}],["targets",{"2":{"151":1,"152":4,"153":1,"154":1,"155":1,"157":1,"158":1,"241":2}}],["task",{"2":{"88":2,"126":1,"153":5}}],["tasks",{"2":{"66":2}}],["tuple=",{"2":{"154":1}}],["tuple",{"0":{"39":1,"61":1,"97":1,"98":1,"99":1,"108":1,"133":1,"134":1,"135":1,"136":1,"149":2,"154":1,"171":1,"215":1},"2":{"39":1,"61":1,"83":2,"91":1,"97":1,"98":1,"99":1,"108":1,"119":3,"133":1,"134":1,"135":1,"136":1,"149":2,"151":2,"171":1}}],["title",{"2":{"243":2}}],["time>",{"2":{"296":1}}],["timeout",{"2":{"156":1}}],["time",{"2":{"24":1,"26":1,"46":1,"48":1,"63":1,"79":1,"102":1,"109":1,"147":1,"164":9,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["tip",{"2":{"12":1,"13":1,"299":1,"308":1,"310":1}}],["test",{"0":{"258":2},"2":{"250":1}}],["text",{"2":{"242":3}}],["terminated",{"2":{"156":1}}],["terminate",{"0":{"156":1,"157":1},"2":{"21":1,"26":1,"43":1,"48":1,"152":2,"156":2,"157":2}}],["telegram",{"2":{"6":1}}],["txt",{"2":{"12":1,"15":1}}],["transfer",{"2":{"289":1}}],["traceback",{"2":{"190":1,"248":1}}],["tree",{"2":{"241":3}}],["try",{"2":{"23":1,"24":1,"45":1,"46":1,"122":1,"190":1,"248":1,"284":1}}],["trss",{"0":{"14":1},"2":{"8":1,"14":1}}],["true时例如docs",{"2":{"243":2}}],["true",{"0":{"122":1,"171":1,"241":1,"249":1,"269":1},"2":{"1":3,"2":4,"6":1,"85":1,"89":1,"127":1,"152":1,"180":1,"202":1,"203":1,"243":1,"290":2}}],["t",{"0":{"80":1,"84":1,"85":1,"86":1,"87":2},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1},"2":{"6":1,"7":1,"9":1,"13":1,"37":1,"59":1,"84":1,"85":1,"86":1,"87":5}}],["through",{"2":{"289":2}}],["thread",{"0":{"285":1},"2":{"26":1,"48":1,"285":2}}],["threading",{"0":{"131":1},"2":{"21":1,"26":1,"43":1,"48":1,"285":1}}],["that",{"2":{"6":2,"289":1,"290":1}}],["this",{"2":{"6":3}}],["then",{"2":{"6":1,"12":1}}],["therefore",{"2":{"289":1}}],["there",{"2":{"1":1,"6":1,"15":1}}],["these",{"2":{"0":1}}],["the",{"2":{"0":6,"1":1,"2":4,"3":6,"4":2,"6":20,"9":2,"10":3,"12":3,"13":2,"15":4,"248":1,"289":1,"290":2}}],["tokyo",{"2":{"317":1}}],["token",{"2":{"2":2}}],["top",{"0":{"243":1},"2":{"243":4}}],["too",{"2":{"6":1}}],["to",{"0":{"3":1,"16":1,"239":1,"286":1},"2":{"0":1,"1":6,"2":3,"3":2,"4":1,"6":17,"12":6,"13":1,"14":2,"15":5,"84":1,"239":1,"243":1,"248":7,"249":2,"286":2,"289":3,"290":2}}],["toml",{"0":{"141":1},"2":{"0":2,"141":5,"142":2,"144":1}}],["world",{"2":{"295":5}}],["w",{"2":{"239":1}}],["write",{"0":{"239":1},"2":{"239":2,"243":1}}],["wrapper",{"0":{"287":1},"2":{"66":1,"87":2,"125":4,"154":1,"164":2,"171":2,"287":4}}],["watchdog",{"2":{"303":1,"306":1}}],["watch",{"2":{"302":1,"303":1}}],["walk",{"2":{"240":1,"241":1}}],["wait",{"0":{"164":1},"2":{"164":2}}],["waring=no",{"2":{"144":1}}],["waring",{"0":{"143":1,"144":1},"2":{"143":3,"144":3}}],["warning=no",{"2":{"143":1,"144":1}}],["warning",{"0":{"142":1,"249":1},"2":{"15":2,"39":1,"61":1,"89":1,"142":5,"143":1,"152":1,"156":1,"158":1,"180":2,"248":1,"249":9,"299":1,"314":1}}],["way",{"2":{"14":1}}],["want",{"2":{"1":1}}],["weather",{"0":{"317":1},"1":{"318":1},"2":{"317":1,"318":1}}],["we",{"2":{"9":1}}],["websocket",{"2":{"3":2}}],["windows10+",{"2":{"15":1}}],["windows",{"2":{"13":1,"15":2,"26":1,"48":1}}],["without",{"2":{"15":1}}],["with",{"0":{"13":1,"39":1,"61":1,"243":1},"2":{"6":2,"13":1,"39":1,"61":1,"120":1,"121":1,"122":1,"129":1,"239":1,"241":1,"242":5,"243":4,"289":1,"290":1}}],["will",{"2":{"0":3,"2":3,"6":1,"15":2,"39":1,"61":1}}],["while",{"2":{"24":1,"46":1,"85":1,"89":1,"127":1,"152":1,"290":2}}],["which",{"2":{"6":2,"14":1}}],["why",{"2":{"6":1}}],["whether",{"2":{"1":3,"2":1}}],["when",{"2":{"0":2}}],["ws",{"2":{"3":2}}],["poke",{"2":{"297":4}}],["port",{"2":{"1":2,"13":2}}],["publish=publish",{"2":{"154":1}}],["publish",{"0":{"91":1,"124":1,"149":1},"2":{"91":1,"119":2,"124":2,"127":2,"149":3}}],["pwd",{"2":{"13":3}}],["p",{"2":{"13":1,"320":1}}],["pipe",{"2":{"81":2}}],["pip",{"2":{"12":1,"15":1,"248":1}}],["period\`",{"2":{"320":1}}],["period>",{"2":{"319":1}}],["period",{"2":{"319":2}}],["persists",{"2":{"6":1}}],["personal",{"2":{"0":1}}],["permission",{"2":{"6":1}}],["py即可启动插件",{"2":{"306":1}}],["pyo",{"2":{"303":1}}],["pycache",{"2":{"303":1}}],["pyc",{"2":{"303":1}}],["pycharm",{"2":{"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["py文件",{"2":{"302":1}}],["py文件或一个包含",{"2":{"302":1}}],["py的文件夹即可被识别为插件",{"2":{"302":1}}],["pyfile",{"0":{"244":1},"2":{"243":8,"244":1}}],["pyi",{"2":{"240":1,"241":1}}],["py",{"2":{"6":1,"12":1,"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":2,"186":1,"191":2,"192":1,"196":1,"205":1,"206":1,"240":1,"241":1,"243":1,"247":1,"249":3,"251":1,"252":1,"276":1,"278":2,"280":2,"293":1,"302":1,"303":1,"306":2,"308":1}}],["python格式",{"2":{"295":1}}],["pythonfrom",{"2":{"290":1,"293":1,"302":1,"306":1}}],["pythonimport",{"2":{"290":1,"303":1}}],["pythonasync",{"2":{"22":1,"24":1,"44":1,"46":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"88":1,"89":1,"127":1,"152":1,"153":1,"190":1,"202":1}}],["pythondef",{"2":{"21":1,"23":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"45":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"93":1,"94":1,"95":1,"96":1,"104":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["python3",{"2":{"12":1,"15":1}}],["python",{"2":{"6":5,"12":2,"15":3,"66":1,"97":1,"98":1,"99":1,"126":1,"129":1,"133":1,"134":1,"135":1,"136":1,"166":1,"203":1,"204":1,"241":2,"277":1}}],["page为页数",{"2":{"313":2}}],["page",{"2":{"313":2}}],["pacman",{"0":{"313":1},"1":{"314":1}}],["pack",{"2":{"308":2,"313":3}}],["param",{"2":{"310":1}}],["parts",{"2":{"286":2}}],["parent",{"2":{"241":4}}],["parse",{"2":{"241":1}}],["parser",{"2":{"10":1}}],["parsed",{"2":{"6":1}}],["parsing",{"2":{"1":1}}],["pass",{"2":{"112":1,"113":1,"114":1}}],["passive=channel",{"2":{"154":1}}],["passive=chan",{"2":{"154":1}}],["passive",{"0":{"149":2},"2":{"93":1,"95":1,"96":2,"97":2,"98":2,"99":1,"119":2,"120":1,"121":1,"122":1,"123":1,"132":1,"133":2,"134":2,"135":2,"136":1,"149":6,"154":6,"290":15}}],["pathlib",{"2":{"248":1}}],["paths=none",{"2":{"243":1}}],["paths",{"0":{"243":1},"2":{"243":5}}],["path=dot",{"2":{"241":1}}],["path",{"0":{"173":2,"233":1,"238":3,"241":1,"244":1,"248":2,"286":3},"2":{"6":2,"13":1,"15":3,"142":1,"143":2,"173":5,"238":10,"239":3,"240":1,"241":7,"243":22,"244":2,"248":19,"249":26,"286":12,"303":5}}],["platform",{"2":{"26":3,"48":3}}],["platforms",{"2":{"6":1}}],["playwright",{"2":{"6":2}}],["plugintype",{"0":{"250":1,"253":1,"263":2},"1":{"254":1,"255":1,"256":1,"257":1,"258":1},"2":{"250":5,"302":1}}],["pluginmetadata",{"0":{"259":1,"273":1},"1":{"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1},"2":{"248":4,"302":2}}],["plugin\`",{"2":{"248":1}}],["plugin\`的函数签名",{"2":{"173":1}}],["plugin的函数签名",{"2":{"173":1}}],["plugin",{"0":{"172":1,"245":1,"246":1,"247":1,"248":2,"249":2,"250":1,"251":1,"252":1,"267":1,"274":1,"275":1,"278":1,"280":1},"1":{"173":1,"246":1,"248":1,"249":1,"250":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"275":1,"279":1,"281":1},"2":{"1":3,"4":1,"6":3,"8":1,"10":1,"21":2,"43":2,"172":1,"246":3,"248":15,"249":6,"250":5,"275":3,"279":6,"281":6,"289":1,"302":4,"305":1,"306":2,"313":5}}],["plugins下创建一个文件",{"2":{"306":1}}],["plugins中添加你的插件路径",{"2":{"305":1}}],["plugins",{"0":{"173":1,"246":1,"249":1,"275":1,"276":1,"278":1,"279":1,"280":1,"281":1},"1":{"277":1,"279":1,"281":1},"2":{"1":1,"2":2,"6":2,"15":3,"21":1,"43":1,"173":6,"246":2,"248":3,"249":9,"275":2,"279":4,"281":4,"303":1,"306":2}}],["please",{"0":{"16":1},"2":{"1":2,"2":1,"3":2,"6":4,"9":1,"13":2,"15":1}}],["priority",{"0":{"188":1,"194":1,"195":1},"2":{"188":5,"193":2,"194":2,"195":2}}],["prioritize",{"2":{"9":1}}],["private",{"0":{"241":1},"2":{"183":2,"241":6}}],["print",{"0":{"40":1,"62":1},"2":{"21":1,"40":2,"43":1,"62":2,"86":2,"190":1,"243":1,"248":1}}],["profile",{"2":{"315":4}}],["property",{"0":{"212":2},"2":{"241":2}}],["provides",{"2":{"10":3,"14":1,"289":1}}],["provided",{"2":{"3":1,"6":1}}],["problematic",{"2":{"6":1}}],["problem",{"2":{"6":1}}],["problems",{"2":{"1":1}}],["processmanager",{"0":{"150":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"21":2,"43":2}}],["process",{"0":{"27":1,"34":1,"35":1,"49":1,"56":1,"57":1,"66":1,"69":1,"71":1,"75":1,"77":1,"152":1,"158":1},"2":{"21":2,"22":1,"26":1,"27":4,"34":2,"35":2,"37":2,"43":2,"44":1,"48":1,"49":4,"56":2,"57":2,"59":2,"65":2,"66":1,"69":2,"71":2,"75":2,"77":2,"81":4,"87":3,"88":1,"93":1,"95":1,"96":1,"120":1,"121":1,"122":1,"123":1,"125":3,"127":2,"151":1,"152":14,"153":1,"155":2,"156":7,"158":2,"289":2,"290":8,"303":2}}],["processes",{"2":{"6":1,"15":1,"25":1,"27":1,"47":1,"49":1,"151":1,"152":1,"156":2,"158":1,"289":4}}],["processing",{"2":{"6":1}}],["protocol",{"2":{"3":1,"6":1,"8":6}}],["production",{"2":{"3":1}}],["project",{"2":{"0":1,"6":2,"9":2,"12":1,"13":1}}],["prefix",{"2":{"1":1}}],["preference",{"2":{"0":1}}],["y",{"2":{"250":1}}],["y>",{"2":{"250":1}}],["y>name",{"2":{"250":1}}],["yellow>",{"2":{"180":1}}],["yunzai",{"2":{"8":1}}],["yml格式的所有合法内容",{"2":{"311":1}}],["yml文件",{"2":{"308":1}}],["yml中填写一些信息",{"2":{"308":1}}],["yml",{"2":{"0":2,"142":1,"144":1,"308":2,"311":1}}],["you",{"2":{"0":4,"1":1,"2":1,"3":1,"4":1,"6":6,"7":2,"12":1,"13":2,"15":2,"289":1}}],["your",{"2":{"0":1,"13":1,"15":1,"248":4}}],["yamlweather",{"2":{"317":1}}],["yamlname",{"2":{"308":1}}],["yaml",{"0":{"139":1},"2":{"0":2,"1":1,"2":2,"139":5,"142":2,"144":1}}],["a包中的index",{"2":{"308":1}}],["application",{"0":{"254":2},"2":{"250":1}}],["append",{"2":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"87":2,"125":2,"189":1,"193":1,"240":1,"241":5}}],["api格式为onebot",{"2":{"311":1}}],["api文档",{"2":{"298":1}}],["api也有差别",{"2":{"298":1}}],["api",{"0":{"298":1},"2":{"243":10,"296":3,"297":2,"311":3}}],["await",{"2":{"22":4,"44":4,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"87":2,"89":2,"125":1,"127":2,"152":4,"190":2,"200":2,"201":2,"202":1,"290":1,"296":1,"297":1,"299":1}}],["arbitrary",{"0":{"269":1}}],["arg",{"2":{"241":13,"242":16}}],["argv",{"2":{"26":1,"48":1}}],["arguments",{"2":{"21":1,"25":1,"27":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"38":1,"39":1,"43":1,"47":1,"49":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"83":1,"84":1,"87":1,"88":1,"93":1,"94":1,"95":1,"111":1,"112":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"138":1,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"184":1,"188":1,"190":1,"238":1,"239":1,"241":1,"242":1,"243":1,"248":1,"249":1,"250":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["args=coro",{"2":{"285":1}}],["args=self",{"2":{"152":1}}],["args=",{"2":{"26":1,"48":1,"241":2}}],["args",{"0":{"21":1,"28":1,"43":1,"50":1,"66":1,"108":1,"154":1,"215":1},"2":{"21":4,"25":1,"26":2,"27":1,"28":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"38":1,"39":1,"43":4,"47":1,"48":2,"49":1,"50":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"66":4,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"88":1,"93":1,"94":1,"95":1,"108":2,"111":1,"112":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"138":1,"152":1,"154":5,"156":1,"158":1,"164":2,"171":1,"173":1,"183":1,"184":1,"188":1,"190":1,"238":1,"239":1,"241":9,"242":9,"243":1,"250":1,"283":1,"284":1,"285":1,"286":1,"287":3,"311":4}}],["arch",{"2":{"14":1}}],["are",{"2":{"1":1,"6":2,"13":1,"15":1,"289":1}}],["abs",{"2":{"243":4}}],["absolute",{"2":{"13":1}}],["able",{"2":{"15":1}}],["about",{"2":{"6":1}}],["active和",{"2":{"290":1}}],["active和chan",{"2":{"154":2}}],["active=channel",{"2":{"154":1}}],["active=chan",{"2":{"154":1}}],["active",{"0":{"90":1,"92":1,"149":2},"2":{"27":6,"49":6,"90":1,"119":2,"124":1,"127":1,"149":6,"152":3,"154":4,"290":13}}],["activate",{"2":{"12":4}}],["acknowledgements",{"0":{"10":1}}],["account",{"2":{"7":1}}],["according",{"2":{"6":1}}],["accesstoken",{"2":{"3":2}}],["access",{"2":{"2":2}}],["author",{"0":{"264":1},"2":{"6":1,"63":1,"79":1,"102":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["auto",{"2":{"1":2,"2":2}}],["automatically",{"2":{"0":1,"1":2}}],["after",{"0":{"32":1,"33":1,"36":1,"54":1,"55":1,"58":1,"68":1,"70":1,"72":1,"74":1,"76":1,"78":1},"2":{"6":2,"22":1,"32":2,"33":2,"36":2,"44":1,"54":2,"55":2,"58":2,"65":3,"68":2,"70":2,"72":2,"74":3,"76":3,"78":3,"290":1}}],["avoid",{"2":{"6":1,"12":1}}],["available",{"2":{"1":1}}],["a",{"2":{"3":1,"6":4,"7":1,"8":3,"9":1,"12":2,"14":1,"84":1,"85":1,"138":3,"243":4,"249":1,"286":2,"289":1,"290":1,"302":1}}],["annassign",{"2":{"241":1}}],["annotation",{"2":{"241":6}}],["an",{"2":{"6":1,"7":1,"84":1,"93":1}}],["any=none",{"2":{"38":1,"39":1,"60":1,"61":1}}],["any",{"0":{"38":2,"39":2,"60":2,"61":2,"83":1,"87":2,"88":1,"97":1,"98":1,"99":1,"104":1,"108":1,"120":1,"121":2,"123":1,"124":1,"126":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":4,"170":1,"183":2,"184":1,"224":1,"266":1,"283":1,"287":1},"2":{"2":1,"4":1,"21":1,"38":3,"39":3,"43":1,"60":3,"61":3,"83":1,"87":5,"88":1,"91":1,"92":1,"95":1,"96":1,"97":1,"98":1,"99":1,"104":1,"108":1,"119":3,"120":1,"121":5,"123":4,"124":1,"125":1,"126":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":4,"170":1,"183":3,"184":1,"195":1,"241":7,"243":1,"283":1,"287":1}}],["and",{"0":{"201":1},"2":{"0":6,"4":1,"6":7,"9":1,"12":2,"15":2,"83":1,"84":1,"171":1,"201":2,"241":7,"242":1,"249":3,"289":3,"290":2,"303":2}}],["adapter",{"2":{"3":1,"4":2}}],["advanced",{"2":{"2":1}}],["add",{"0":{"154":1,"193":1},"2":{"2":1,"154":1,"180":1,"193":1,"194":1,"249":1}}],["address",{"2":{"1":1,"3":2}}],["amp",{"2":{"13":2}}],["am",{"2":{"1":1,"290":6}}],["attributes=",{"2":{"241":2}}],["attributes",{"0":{"230":1,"236":1},"2":{"241":2,"242":2}}],["attributeinfo",{"0":{"221":1,"230":1,"236":1},"1":{"222":1,"223":1,"224":1,"225":1},"2":{"241":2}}],["attr",{"0":{"130":1,"131":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"241":2,"242":14}}],["atexit",{"2":{"21":1,"43":1}}],["at",{"2":{"1":1,"15":2}}],["already",{"2":{"81":2,"93":1}}],["alive",{"0":{"24":1,"46":1,"158":1},"2":{"22":1,"24":1,"44":1,"46":1,"156":1,"158":2}}],["alconna",{"2":{"1":2,"2":2,"10":1}}],["allowed",{"0":{"269":1}}],["allow",{"2":{"2":2}}],["all",{"0":{"123":1,"136":1,"153":1,"155":1,"157":1},"2":{"0":1,"2":1,"21":1,"22":1,"25":1,"26":1,"43":1,"44":1,"47":1,"48":1,"63":1,"79":1,"83":3,"102":1,"109":1,"123":2,"135":1,"136":3,"147":1,"153":1,"155":1,"157":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["assign",{"2":{"241":2}}],["ast",{"2":{"241":29}}],["asynchronous",{"2":{"287":2}}],["async=isinstance",{"2":{"241":2}}],["asyncfunctiondef",{"2":{"241":3}}],["async",{"0":{"22":1,"24":1,"44":1,"46":1,"66":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":2,"88":1,"89":1,"126":1,"127":1,"152":1,"153":1,"190":1,"202":1,"203":1,"204":1,"220":1,"277":1,"287":1},"2":{"66":3,"86":1,"87":1,"89":1,"116":1,"117":1,"125":1,"126":1,"127":1,"152":1,"195":1,"200":1,"201":1,"203":1,"204":1,"242":4,"277":1,"287":2,"290":2}}],["asyncio",{"2":{"21":2,"23":1,"43":2,"45":1,"66":2,"86":1,"88":2,"126":1,"153":3,"284":5,"290":2}}],["ask",{"2":{"9":1}}],["asked",{"0":{"6":1}}],["as",{"2":{"0":1,"3":1,"6":2,"122":1,"239":1,"241":1,"248":1,"284":1}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.ButuspH0.js b/assets/chunks/@localSearchIndexroot.ButuspH0.js new file mode 100644 index 00000000..7436961f --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.ButuspH0.js @@ -0,0 +1 @@ +const e=`{"documentCount":321,"nextId":321,"documentIds":{"0":"/deploy/config.html#配置","1":"/deploy/config.html#基础配置项","2":"/deploy/config.html#其他配置","3":"/deploy/config.html#示例-与nonebot对接的onebot实现端配置","4":"/deploy/config.html#其他","5":"/deploy/fandq.html#答疑","6":"/deploy/fandq.html#常见问题","7":"/deploy/fandq.html#其他问题","8":"/deploy/fandq.html#推荐方案-qq","9":"/deploy/fandq.html#推荐方案-minecraft","10":"/deploy/fandq.html#鸣谢","11":"/deploy/install.html#安装","12":"/deploy/install.html#常规部署","13":"/deploy/install.html#使用docker构建","14":"/deploy/install.html#使用trss-scripts部署","15":"/deploy/install.html#装置要求","16":"/deploy/install.html#其他问题请移步至答疑","17":"/dev/api/api.html#liteyuki","18":"/dev/api/api.html#var-version","19":"/dev/api/bot/bot.html#liteyuki-bot","20":"/dev/api/bot/bot.html#class-liteyukibot","21":"/dev/api/bot/bot.html#def-init-self-args-kwargs-none","22":"/dev/api/bot/bot.html#async-def-run-self","23":"/dev/api/bot/bot.html#def-run-self","24":"/dev/api/bot/bot.html#async-def-keep-alive-self","25":"/dev/api/bot/bot.html#def-handle-exit-self-signum-frame","26":"/dev/api/bot/bot.html#def-restart-self-delay-int-0","27":"/dev/api/bot/bot.html#def-restart-process-self-name-optional-str-none","28":"/dev/api/bot/bot.html#def-init-self-args-kwargs","29":"/dev/api/bot/bot.html#def-init-logger-self","30":"/dev/api/bot/bot.html#def-stop-self","31":"/dev/api/bot/bot.html#def-on-before-start-self-func-lifespan-func","32":"/dev/api/bot/bot.html#def-on-after-start-self-func-lifespan-func","33":"/dev/api/bot/bot.html#def-on-after-shutdown-self-func-lifespan-func","34":"/dev/api/bot/bot.html#def-on-before-process-shutdown-self-func-lifespan-func","35":"/dev/api/bot/bot.html#def-on-before-process-restart-self-func-lifespan-func","36":"/dev/api/bot/bot.html#def-on-after-restart-self-func-lifespan-func","37":"/dev/api/bot/bot.html#def-get-bot-liteyukibot","38":"/dev/api/bot/bot.html#def-get-config-key-str-default-any-none-any","39":"/dev/api/bot/bot.html#def-get-config-with-compat-key-str-compat-keys-tuple-str-default-any-none-any","40":"/dev/api/bot/bot.html#def-print-logo","41":"/dev/api/bot/#liteyuki-bot","42":"/dev/api/bot/#class-liteyukibot","43":"/dev/api/bot/#def-init-self-args-kwargs-none","44":"/dev/api/bot/#async-def-run-self","45":"/dev/api/bot/#def-run-self","46":"/dev/api/bot/#async-def-keep-alive-self","47":"/dev/api/bot/#def-handle-exit-self-signum-frame","48":"/dev/api/bot/#def-restart-self-delay-int-0","49":"/dev/api/bot/#def-restart-process-self-name-optional-str-none","50":"/dev/api/bot/#def-init-self-args-kwargs","51":"/dev/api/bot/#def-init-logger-self","52":"/dev/api/bot/#def-stop-self","53":"/dev/api/bot/#def-on-before-start-self-func-lifespan-func","54":"/dev/api/bot/#def-on-after-start-self-func-lifespan-func","55":"/dev/api/bot/#def-on-after-shutdown-self-func-lifespan-func","56":"/dev/api/bot/#def-on-before-process-shutdown-self-func-lifespan-func","57":"/dev/api/bot/#def-on-before-process-restart-self-func-lifespan-func","58":"/dev/api/bot/#def-on-after-restart-self-func-lifespan-func","59":"/dev/api/bot/#def-get-bot-liteyukibot","60":"/dev/api/bot/#def-get-config-key-str-default-any-none-any","61":"/dev/api/bot/#def-get-config-with-compat-key-str-compat-keys-tuple-str-default-any-none-any","62":"/dev/api/bot/#def-print-logo","63":"/dev/api/bot/lifespan.html#liteyuki-bot-lifespan","64":"/dev/api/bot/lifespan.html#class-lifespan","65":"/dev/api/bot/lifespan.html#def-init-self-none","66":"/dev/api/bot/lifespan.html#async-def-run-funcs-funcs-list-async-lifespan-func-process-lifespan-func-args-kwargs-none","67":"/dev/api/bot/lifespan.html#def-on-before-start-self-func-lifespan-func-lifespan-func","68":"/dev/api/bot/lifespan.html#def-on-after-start-self-func-lifespan-func-lifespan-func","69":"/dev/api/bot/lifespan.html#def-on-before-process-shutdown-self-func-lifespan-func-lifespan-func","70":"/dev/api/bot/lifespan.html#def-on-after-shutdown-self-func-lifespan-func-lifespan-func","71":"/dev/api/bot/lifespan.html#def-on-before-process-restart-self-func-lifespan-func-lifespan-func","72":"/dev/api/bot/lifespan.html#def-on-after-restart-self-func-lifespan-func-lifespan-func","73":"/dev/api/bot/lifespan.html#async-def-before-start-self-none","74":"/dev/api/bot/lifespan.html#async-def-after-start-self-none","75":"/dev/api/bot/lifespan.html#async-def-before-process-shutdown-self-none","76":"/dev/api/bot/lifespan.html#async-def-after-shutdown-self-none","77":"/dev/api/bot/lifespan.html#async-def-before-process-restart-self-none","78":"/dev/api/bot/lifespan.html#async-def-after-restart-self-none","79":"/dev/api/comm/channel.html#liteyuki-comm-channel","80":"/dev/api/comm/channel.html#class-channel-generic-t","81":"/dev/api/comm/channel.html#def-init-self-name-str-type-check-optional-bool-none","82":"/dev/api/comm/channel.html#def-get-generic-type-self-optional-type","83":"/dev/api/comm/channel.html#def-validate-structure-self-data-any-structure-type-bool","84":"/dev/api/comm/channel.html#def-send-self-data-t","85":"/dev/api/comm/channel.html#def-receive-self-t","86":"/dev/api/comm/channel.html#async-def-async-receive-self-t","87":"/dev/api/comm/channel.html#def-on-receive-self-filter-func-optional-filter-func-none-callable-callable-t-any-callable-t-any","88":"/dev/api/comm/channel.html#async-def-run-on-receive-funcs-self-data-any","89":"/dev/api/comm/channel.html#async-def-start-receive-loop-self","90":"/dev/api/comm/channel.html#var-active-channel","91":"/dev/api/comm/channel.html#var-publish-channel","92":"/dev/api/comm/channel.html#var-channel-deliver-active-channel","93":"/dev/api/comm/channel.html#def-set-channel-name-str-channel-channel","94":"/dev/api/comm/channel.html#def-set-channels-channels-dict-str-channel","95":"/dev/api/comm/channel.html#def-get-channel-name-str-channel","96":"/dev/api/comm/channel.html#def-get-channels-dict-str-channel","97":"/dev/api/comm/channel.html#def-on-set-channel-data-tuple-str-dict-str-any","98":"/dev/api/comm/channel.html#def-on-get-channel-data-tuple-str-dict-str-any","99":"/dev/api/comm/channel.html#def-on-get-channels-data-tuple-str-dict-str-any","100":"/dev/api/comm/comm.html#liteyuki-comm","101":"/dev/api/comm/event.html#liteyuki-comm-event","102":"/dev/api/comm/event.html#class-event","103":"/dev/api/comm/event.html#def-init-self-name-str-data-dict-str-any","104":"/dev/api/comm/#liteyuki-comm","105":"/dev/api/comm/rpc.html#liteyuki-comm-rpc","106":"/dev/api/comm/rpc.html#class-rpc","107":"/dev/api/comm/rpc.html#def-init-self-on-calling-on-calling-func-none","108":"/dev/api/comm/rpc.html#def-call-self-args-tuple-kwargs-dict-any","109":"/dev/api/comm/socks_channel.html#liteyuki-comm-socks-channel","110":"/dev/api/comm/socks_channel.html#class-sockschannel","111":"/dev/api/comm/socks_channel.html#def-init-self-name-str","112":"/dev/api/comm/socks_channel.html#def-send-self-data","113":"/dev/api/comm/socks_channel.html#def-receive-self","114":"/dev/api/comm/socks_channel.html#def-close-self","115":"/dev/api/comm/storage.html#liteyuki-comm-storage","116":"/dev/api/comm/storage.html#var-on-main-subscriber-receive-funcs","117":"/dev/api/comm/storage.html#var-on-sub-subscriber-receive-funcs","118":"/dev/api/comm/storage.html#class-keyvaluestore","119":"/dev/api/comm/storage.html#def-init-self","120":"/dev/api/comm/storage.html#def-set-self-key-str-value-any-none","121":"/dev/api/comm/storage.html#def-get-self-key-str-default-optional-any-none-optional-any","122":"/dev/api/comm/storage.html#def-delete-self-key-str-ignore-key-error-bool-true-none","123":"/dev/api/comm/storage.html#def-get-all-self-dict-str-any","124":"/dev/api/comm/storage.html#def-publish-self-channel-str-data-any-none","125":"/dev/api/comm/storage.html#def-on-subscriber-receive-self-channel-str-callable-on-receive-func-on-receive-func","126":"/dev/api/comm/storage.html#async-def-run-subscriber-receive-funcs-channel-str-data-any","127":"/dev/api/comm/storage.html#async-def-start-receive-loop-self","128":"/dev/api/comm/storage.html#class-globalkeyvaluestore","129":"/dev/api/comm/storage.html#def-get-instance-cls","130":"/dev/api/comm/storage.html#attr-instance-none","131":"/dev/api/comm/storage.html#attr-lock-threading-lock","132":"/dev/api/comm/storage.html#var-ref-count","133":"/dev/api/comm/storage.html#def-on-get-data-tuple-str-dict-str-any","134":"/dev/api/comm/storage.html#def-on-set-data-tuple-str-dict-str-any","135":"/dev/api/comm/storage.html#def-on-delete-data-tuple-str-dict-str-any","136":"/dev/api/comm/storage.html#def-on-get-all-data-tuple-str-dict-str-any","137":"/dev/api/config.html#liteyuki-config","138":"/dev/api/config.html#def-flat-config-config-dict-str-any-dict-str-any","139":"/dev/api/config.html#def-load-from-yaml-file-str-dict-str-any","140":"/dev/api/config.html#def-load-from-json-file-str-dict-str-any","141":"/dev/api/config.html#def-load-from-toml-file-str-dict-str-any","142":"/dev/api/config.html#def-load-from-files-files-str-no-warning-bool-false-dict-str-any","143":"/dev/api/config.html#def-load-configs-from-dirs-directories-str-no-waring-bool-false-dict-str-any","144":"/dev/api/config.html#def-load-config-in-default-no-waring-bool-false-dict-str-any","145":"/dev/api/core/core.html#liteyuki-core","146":"/dev/api/core/#liteyuki-core","147":"/dev/api/core/manager.html#liteyuki-core-manager","148":"/dev/api/core/manager.html#class-channeldeliver","149":"/dev/api/core/manager.html#def-init-self-active-channel-any-passive-channel-any-channel-deliver-active-channel-channel-any-channel-deliver-passive-channel-tuple-str-dict-publish-channel-tuple-str-any","150":"/dev/api/core/manager.html#class-processmanager","151":"/dev/api/core/manager.html#def-init-self-lifespan-lifespan","152":"/dev/api/core/manager.html#async-def-run-process-self-name-str","153":"/dev/api/core/manager.html#async-def-start-all-self","154":"/dev/api/core/manager.html#def-add-target-self-name-str-target-target-func-args-tuple-kwargs-none","155":"/dev/api/core/manager.html#def-join-all-self","156":"/dev/api/core/manager.html#def-terminate-self-name-str","157":"/dev/api/core/manager.html#def-terminate-all-self","158":"/dev/api/core/manager.html#def-is-process-alive-self-name-str-bool","159":"/dev/api/dev/dev.html#liteyuki-dev","160":"/dev/api/dev/#liteyuki-dev","161":"/dev/api/dev/observer.html#liteyuki-dev-observer","162":"/dev/api/dev/observer.html#var-callback-func","163":"/dev/api/dev/observer.html#var-filter-func","164":"/dev/api/dev/observer.html#def-debounce-wait","165":"/dev/api/dev/observer.html#class-codemodifiedhandler-filesystemeventhandler","166":"/dev/api/dev/observer.html#def-on-modified-self-event","167":"/dev/api/dev/observer.html#def-on-created-self-event","168":"/dev/api/dev/observer.html#def-on-deleted-self-event","169":"/dev/api/dev/observer.html#def-on-moved-self-event","170":"/dev/api/dev/observer.html#def-on-any-event-self-event","171":"/dev/api/dev/observer.html#def-on-file-system-event-directories-tuple-str-recursive-bool-true-event-filter-filter-func-none-callable-callback-func-callback-func","172":"/dev/api/dev/plugin.html#liteyuki-dev-plugin","173":"/dev/api/dev/plugin.html#def-run-plugins-module-path-str-path","174":"/dev/api/exception.html#liteyuki-exception","175":"/dev/api/exception.html#class-liteyukiexception-baseexception","176":"/dev/api/#liteyuki","177":"/dev/api/#var-version","178":"/dev/api/log.html#liteyuki-log","179":"/dev/api/log.html#def-get-format-level-str-str","180":"/dev/api/log.html#def-init-log-config-dict","181":"/dev/api/message/event.html#liteyuki-message-event","182":"/dev/api/message/event.html#class-messageevent","183":"/dev/api/message/event.html#def-init-self-bot-id-str-message-list-dict-str-any-str-message-type-str-raw-message-str-session-id-str-user-id-str-session-type-str-receive-channel-optional-channel-messageevent-none-data-optional-dict-str-any-none","184":"/dev/api/message/event.html#def-reply-self-message-str-dict-str-any","185":"/dev/api/message/#liteyuki-message","186":"/dev/api/message/matcher.html#liteyuki-message-matcher","187":"/dev/api/message/matcher.html#class-matcher","188":"/dev/api/message/matcher.html#def-init-self-rule-rule-priority-int-block-bool","189":"/dev/api/message/matcher.html#def-handle-self-callable-eventhandler-eventhandler","190":"/dev/api/message/matcher.html#async-def-run-self-event-messageevent-none","191":"/dev/api/message/message.html#liteyuki-message","192":"/dev/api/message/on.html#liteyuki-message-on","193":"/dev/api/message/on.html#def-add-matcher-matcher-matcher","194":"/dev/api/message/on.html#def-on-message-rule-rule-empty-rule-priority-int-0-block-bool-false-matcher","195":"/dev/api/message/on.html#def-on-keywords-keywords-list-str-rule-empty-rule-priority-int-0-block-bool-false-matcher","196":"/dev/api/message/rule.html#liteyuki-message-rule","197":"/dev/api/message/rule.html#var-rulehandlerfunc","198":"/dev/api/message/rule.html#class-rule","199":"/dev/api/message/rule.html#def-init-self-handler-rulehandlerfunc","200":"/dev/api/message/rule.html#def-or-self-other-rule-rule","201":"/dev/api/message/rule.html#def-and-self-other-rule-rule","202":"/dev/api/message/rule.html#async-def-call-self-event-messageevent-bool","203":"/dev/api/message/rule.html#async-def-empty-rule-event-messageevent-bool","204":"/dev/api/message/rule.html#async-def-is-su-rule-event-messageevent-bool","205":"/dev/api/message/session.html#liteyuki-message-session","206":"/dev/api/mkdoc.html#liteyuki-mkdoc","207":"/dev/api/mkdoc.html#class-deftype-enum","208":"/dev/api/mkdoc.html#attr-function-function","209":"/dev/api/mkdoc.html#attr-method-method","210":"/dev/api/mkdoc.html#attr-static-method-staticmethod","211":"/dev/api/mkdoc.html#attr-class-method-classmethod","212":"/dev/api/mkdoc.html#attr-property-property","213":"/dev/api/mkdoc.html#class-functioninfo-basemodel","214":"/dev/api/mkdoc.html#attr-name-str-no-default","215":"/dev/api/mkdoc.html#attr-args-list-tuple-str-str-no-default","216":"/dev/api/mkdoc.html#attr-return-type-str-no-default","217":"/dev/api/mkdoc.html#attr-docstring-str-no-default","218":"/dev/api/mkdoc.html#attr-source-code-str","219":"/dev/api/mkdoc.html#attr-type-deftype-no-default","220":"/dev/api/mkdoc.html#attr-is-async-bool-no-default","221":"/dev/api/mkdoc.html#class-attributeinfo-basemodel","222":"/dev/api/mkdoc.html#attr-name-str-no-default-1","223":"/dev/api/mkdoc.html#attr-type-str-no-default","224":"/dev/api/mkdoc.html#attr-value-any-none","225":"/dev/api/mkdoc.html#attr-docstring-str","226":"/dev/api/mkdoc.html#class-classinfo-basemodel","227":"/dev/api/mkdoc.html#attr-name-str-no-default-2","228":"/dev/api/mkdoc.html#attr-docstring-str-no-default-1","229":"/dev/api/mkdoc.html#attr-methods-list-functioninfo-no-default","230":"/dev/api/mkdoc.html#attr-attributes-list-attributeinfo-no-default","231":"/dev/api/mkdoc.html#attr-inherit-list-str-no-default","232":"/dev/api/mkdoc.html#class-moduleinfo-basemodel","233":"/dev/api/mkdoc.html#attr-module-path-str-no-default","234":"/dev/api/mkdoc.html#attr-functions-list-functioninfo-no-default","235":"/dev/api/mkdoc.html#attr-classes-list-classinfo-no-default","236":"/dev/api/mkdoc.html#attr-attributes-list-attributeinfo-no-default-1","237":"/dev/api/mkdoc.html#attr-docstring-str-no-default-2","238":"/dev/api/mkdoc.html#def-get-relative-path-base-path-str-target-path-str-str","239":"/dev/api/mkdoc.html#def-write-to-files-file-data-dict-str-str","240":"/dev/api/mkdoc.html#def-get-file-list-module-folder-str","241":"/dev/api/mkdoc.html#def-get-module-info-normal-file-path-str-ignore-private-bool-true-moduleinfo","242":"/dev/api/mkdoc.html#def-generate-markdown-module-info-moduleinfo-front-matter-none-lang-str-zh-cn-str","243":"/dev/api/mkdoc.html#def-generate-docs-module-folder-str-output-dir-str-with-top-bool-false-lang-str-zh-cn-ignored-paths-none","244":"/dev/api/mkdoc.html#var-no-module-name-pyfile-path","245":"/dev/api/plugin/#liteyuki-plugin","246":"/dev/api/plugin/#def-get-loaded-plugins-dict-str-plugin","247":"/dev/api/plugin/load.html#liteyuki-plugin-load","248":"/dev/api/plugin/load.html#def-load-plugin-module-path-str-path-optional-plugin","249":"/dev/api/plugin/load.html#def-load-plugins-plugin-dir-str-ignore-warning-bool-true-set-plugin","250":"/dev/api/plugin/load.html#def-format-display-name-display-name-str-plugin-type-plugintype-str","251":"/dev/api/plugin/manager.html#liteyuki-plugin-manager","252":"/dev/api/plugin/model.html#liteyuki-plugin-model","253":"/dev/api/plugin/model.html#class-plugintype-enum","254":"/dev/api/plugin/model.html#attr-application-application","255":"/dev/api/plugin/model.html#attr-service-service","256":"/dev/api/plugin/model.html#attr-module-module","257":"/dev/api/plugin/model.html#attr-unclassified-unclassified","258":"/dev/api/plugin/model.html#attr-test-test","259":"/dev/api/plugin/model.html#class-pluginmetadata-basemodel","260":"/dev/api/plugin/model.html#attr-name-str-no-default","261":"/dev/api/plugin/model.html#attr-description-str","262":"/dev/api/plugin/model.html#attr-usage-str","263":"/dev/api/plugin/model.html#attr-type-plugintype-plugintype-unclassified","264":"/dev/api/plugin/model.html#attr-author-str","265":"/dev/api/plugin/model.html#attr-homepage-str","266":"/dev/api/plugin/model.html#attr-extra-dict-str-any","267":"/dev/api/plugin/model.html#class-plugin-basemodel","268":"/dev/api/plugin/model.html#def-hash-self","269":"/dev/api/plugin/model.html#attr-model-config-arbitrary-types-allowed-true","270":"/dev/api/plugin/model.html#attr-name-str-no-default-1","271":"/dev/api/plugin/model.html#attr-module-moduletype-no-default","272":"/dev/api/plugin/model.html#attr-module-name-str-no-default","273":"/dev/api/plugin/model.html#attr-metadata-optional-pluginmetadata-none","274":"/dev/api/plugin/plugin.html#liteyuki-plugin","275":"/dev/api/plugin/plugin.html#def-get-loaded-plugins-dict-str-plugin","276":"/dev/api/plugins/liteecho.html#liteyuki-plugins-liteecho","277":"/dev/api/plugins/liteecho.html#async-def-liteecho-event-messageevent","278":"/dev/api/plugins/plugin_loader/#liteyuki-plugins-plugin-loader","279":"/dev/api/plugins/plugin_loader/#def-default-plugins-loader","280":"/dev/api/plugins/plugin_loader/plugin_loader.html#liteyuki-plugins-plugin-loader","281":"/dev/api/plugins/plugin_loader/plugin_loader.html#def-default-plugins-loader","282":"/dev/api/utils.html#liteyuki-utils","283":"/dev/api/utils.html#def-is-coroutine-callable-call-callable-any-bool","284":"/dev/api/utils.html#def-run-coroutine-coro-coroutine","285":"/dev/api/utils.html#def-run-coroutine-in-thread-coro-coroutine","286":"/dev/api/utils.html#def-path-to-module-name-path-path-str","287":"/dev/api/utils.html#def-async-wrapper-func-callable-any-callable-coroutine","288":"/dev/comm.html#通道通信","289":"/dev/comm.html#简介","290":"/dev/comm.html#示例","291":"/dev/comm.html#共享内存通信","292":"/dev/comm.html#简介-1","293":"/dev/comm.html#示例-1","294":"/dev/lyfunc.html#轻雪函数","295":"/dev/lyfunc.html#函数文件","296":"/dev/lyfunc.html#命令文档","297":"/dev/lyfunc.html#示例","298":"/dev/lyfunc.html#api","299":"/dev/lyfunc.html#结束关键字","300":"/dev/plugin.html#简介","301":"/dev/plugin.html#开始","302":"/dev/plugin.html#创建插件","303":"/dev/plugin.html#编写逻辑部分","304":"/dev/plugin.html#加载插件","305":"/dev/plugin.html#方法1","306":"/dev/plugin.html#方法2","307":"/dev/resource.html#简介","308":"/dev/resource.html#加载资源包","309":"/usage/agreement.html#用户协议","310":"/usage/basic.html#基础插件","311":"/usage/basic.html#轻雪命令liteyuki-command","312":"/usage/basic.html#命令别名","313":"/usage/basic.html#插件-包管理器-liteyuki-pacman","314":"/usage/basic.html#命令别名-1","315":"/usage/basic.html#用户管理liteyuki-user","316":"/usage/extra.html#功能插件命令","317":"/usage/extra.html#轻雪天气liteyuki-weather","318":"/usage/extra.html#命令别名","319":"/usage/extra.html#统计信息liteyuki-statistics","320":"/usage/extra.html#命令别名-1"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,16],"1":[1,1,51],"2":[1,1,48],"3":[2,1,28],"4":[1,1,3],"5":[1,1,1],"6":[1,1,55],"7":[1,1,2],"8":[3,1,30],"9":[3,1,6],"10":[1,1,8],"11":[1,1,1],"12":[1,1,44],"13":[1,1,35],"14":[2,1,7],"15":[1,1,39],"16":[1,2,1],"17":[1,1,1],"18":[3,1,7],"19":[2,1,1],"20":[2,2,1],"21":[7,4,69],"22":[5,4,20],"23":[4,4,18],"24":[6,4,29],"25":[7,4,25],"26":[8,4,53],"27":[10,4,37],"28":[6,4,14],"29":[5,4,11],"30":[4,4,13],"31":[9,4,19],"32":[9,4,19],"33":[9,4,20],"34":[10,4,21],"35":[10,4,21],"36":[9,4,20],"37":[5,2,35],"38":[10,2,24],"39":[14,2,42],"40":[4,2,21],"41":[2,1,1],"42":[2,2,1],"43":[7,4,69],"44":[5,4,20],"45":[4,4,18],"46":[6,4,29],"47":[7,4,25],"48":[8,4,53],"49":[10,4,37],"50":[6,4,14],"51":[5,4,11],"52":[4,4,13],"53":[9,4,19],"54":[9,4,19],"55":[9,4,20],"56":[10,4,21],"57":[10,4,21],"58":[9,4,20],"59":[5,2,35],"60":[10,2,24],"61":[14,2,42],"62":[4,2,21],"63":[3,1,25],"64":[2,3,1],"65":[5,5,30],"66":[14,5,42],"67":[9,5,22],"68":[9,5,22],"69":[10,5,23],"70":[9,5,22],"71":[10,5,23],"72":[9,5,22],"73":[7,5,21],"74":[7,5,21],"75":[8,5,22],"76":[7,5,21],"77":[8,5,22],"78":[7,5,21],"79":[3,1,27],"80":[5,3,1],"81":[12,8,73],"82":[8,8,24],"83":[9,8,43],"84":[6,8,45],"85":[5,8,28],"86":[6,8,29],"87":[16,8,65],"88":[10,8,34],"89":[7,8,45],"90":[3,3,9],"91":[3,3,15],"92":[4,3,11],"93":[7,3,41],"94":[7,3,20],"95":[7,3,31],"96":[8,3,36],"97":[10,3,25],"98":[10,3,28],"99":[10,3,27],"100":[2,1,9],"101":[3,1,25],"102":[2,3,1],"103":[9,5,13],"104":[2,1,9],"105":[3,1,5],"106":[2,3,1],"107":[10,5,15],"108":[9,5,18],"109":[4,1,25],"110":[2,4,1],"111":[6,6,21],"112":[5,6,14],"113":[4,6,14],"114":[4,6,10],"115":[3,1,5],"116":[6,3,12],"117":[6,3,12],"118":[2,3,1],"119":[4,5,30],"120":[9,5,32],"121":[12,5,39],"122":[12,5,44],"123":[9,5,31],"124":[9,5,23],"125":[13,5,54],"126":[11,5,30],"127":[7,5,42],"128":[2,3,2],"129":[5,5,18],"130":[4,5,1],"131":[6,5,1],"132":[3,3,17],"133":[9,3,29],"134":[9,3,27],"135":[9,3,27],"136":[10,3,27],"137":[2,1,20],"138":[8,2,40],"139":[10,2,35],"140":[10,2,34],"141":[10,2,34],"142":[14,2,43],"143":[16,2,49],"144":[15,2,34],"145":[2,1,1],"146":[2,1,1],"147":[3,1,25],"148":[2,3,1],"149":[14,5,18],"150":[2,3,1],"151":[6,5,17],"152":[8,5,66],"153":[6,5,31],"154":[14,5,49],"155":[5,5,13],"156":[6,5,33],"157":[5,5,12],"158":[9,5,29],"159":[2,1,3],"160":[2,1,3],"161":[3,1,6],"162":[3,3,9],"163":[3,3,9],"164":[4,3,25],"165":[4,3,3],"166":[6,7,17],"167":[6,7,10],"168":[6,7,10],"169":[6,7,10],"170":[6,7,10],"171":[20,3,55],"172":[3,1,25],"173":[9,3,33],"174":[2,1,3],"175":[4,2,1],"176":[1,1,1],"177":[3,1,7],"178":[2,1,25],"179":[6,2,17],"180":[6,2,47],"181":[3,1,25],"182":[2,3,1],"183":[24,5,49],"184":[9,5,36],"185":[2,1,25],"186":[3,1,25],"187":[2,3,1],"188":[10,5,27],"189":[7,5,21],"190":[8,5,32],"191":[2,1,25],"192":[3,1,25],"193":[5,3,21],"194":[15,3,19],"195":[16,3,30],"196":[3,1,25],"197":[2,3,11],"198":[2,3,1],"199":[6,5,10],"200":[6,5,19],"201":[6,5,19],"202":[8,5,20],"203":[8,3,16],"204":[9,3,21],"205":[3,1,25],"206":[2,1,25],"207":[4,2,1],"208":[5,6,1],"209":[5,6,1],"210":[6,6,1],"211":[6,6,1],"212":[5,6,1],"213":[4,2,1],"214":[6,6,1],"215":[8,6,1],"216":[7,6,1],"217":[6,6,1],"218":[6,6,1],"219":[6,6,1],"220":[7,6,1],"221":[4,2,1],"222":[6,6,1],"223":[6,6,1],"224":[5,6,1],"225":[5,6,1],"226":[4,2,1],"227":[6,6,1],"228":[6,6,1],"229":[7,6,1],"230":[7,6,1],"231":[7,6,1],"232":[4,2,1],"233":[7,6,1],"234":[7,6,1],"235":[7,6,1],"236":[7,6,1],"237":[6,6,1],"238":[8,2,21],"239":[9,2,37],"240":[8,2,27],"241":[15,2,145],"242":[15,2,97],"243":[20,2,96],"244":[6,2,10],"245":[2,1,1],"246":[9,2,18],"247":[3,1,25],"248":[12,3,80],"249":[15,3,58],"250":[9,3,41],"251":[3,1,25],"252":[3,1,25],"253":[4,3,1],"254":[5,7,1],"255":[5,7,1],"256":[5,7,1],"257":[5,7,1],"258":[5,7,1],"259":[4,3,1],"260":[6,7,1],"261":[5,7,1],"262":[5,7,1],"263":[5,7,1],"264":[5,7,1],"265":[5,7,1],"266":[7,7,1],"267":[4,3,1],"268":[4,7,10],"269":[9,7,1],"270":[6,7,1],"271":[6,7,1],"272":[7,7,1],"273":[6,7,1],"274":[2,1,1],"275":[9,2,18],"276":[3,1,31],"277":[6,3,21],"278":[4,1,25],"279":[5,4,21],"280":[4,1,25],"281":[5,4,21],"282":[2,1,6],"283":[9,2,32],"284":[6,2,44],"285":[8,2,22],"286":[8,2,40],"287":[9,2,27],"288":[1,1,1],"289":[1,1,12],"290":[1,1,83],"291":[1,1,1],"292":[1,2,9],"293":[1,2,18],"294":[1,1,9],"295":[1,1,25],"296":[1,1,33],"297":[1,2,26],"298":[1,1,7],"299":[1,1,18],"300":[1,1,4],"301":[1,1,1],"302":[1,2,42],"303":[1,2,58],"304":[1,2,1],"305":[1,3,6],"306":[1,3,25],"307":[1,1,31],"308":[1,1,56],"309":[1,1,28],"310":[1,1,16],"311":[2,1,86],"312":[1,3,30],"313":[4,1,53],"314":[1,5,38],"315":[2,1,20],"316":[1,1,1],"317":[2,1,30],"318":[1,3,8],"319":[2,1,35],"320":[1,3,17]},"averageFieldLength":[5.725856697819316,3.485981308411215,20.401869158878498],"storedFields":{"0":{"title":"配置","titles":[]},"1":{"title":"基础配置项","titles":["配置"]},"2":{"title":"其他配置","titles":["配置"]},"3":{"title":"示例:与NoneBot对接的OneBot实现端配置","titles":["配置"]},"4":{"title":"其他","titles":["配置"]},"5":{"title":"答疑","titles":[]},"6":{"title":"常见问题","titles":["答疑"]},"7":{"title":"其他问题","titles":["答疑"]},"8":{"title":"推荐方案(QQ)","titles":["答疑"]},"9":{"title":"推荐方案(Minecraft)","titles":["答疑"]},"10":{"title":"鸣谢","titles":["答疑"]},"11":{"title":"安装","titles":[]},"12":{"title":"常规部署","titles":["安装"]},"13":{"title":"使用Docker构建","titles":["安装"]},"14":{"title":"使用TRSS Scripts部署","titles":["安装"]},"15":{"title":"装置要求","titles":["安装"]},"16":{"title":"其他问题请移步至","titles":["安装","装置要求"]},"17":{"title":"liteyuki","titles":[]},"18":{"title":"var __version__","titles":["liteyuki"]},"19":{"title":"liteyuki.bot","titles":[]},"20":{"title":"class LiteyukiBot","titles":["liteyuki.bot"]},"21":{"title":"def __init__(self, *args, **kwargs) -> None","titles":["liteyuki.bot","class LiteyukiBot"]},"22":{"title":"async def _run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"23":{"title":"def run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"24":{"title":"async def keep_alive(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"25":{"title":"def _handle_exit(self, signum, frame)","titles":["liteyuki.bot","class LiteyukiBot"]},"26":{"title":"def restart(self, delay: int = 0)","titles":["liteyuki.bot","class LiteyukiBot"]},"27":{"title":"def restart_process(self, name: Optional[str] = None)","titles":["liteyuki.bot","class LiteyukiBot"]},"28":{"title":"def init(self, *args, **kwargs)","titles":["liteyuki.bot","class LiteyukiBot"]},"29":{"title":"def init_logger(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"30":{"title":"def stop(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"31":{"title":"def on_before_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"32":{"title":"def on_after_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"33":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"34":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"35":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"36":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"37":{"title":"def get_bot() -> LiteyukiBot","titles":["liteyuki.bot"]},"38":{"title":"def get_config(key: str, default: Any = None) -> Any","titles":["liteyuki.bot"]},"39":{"title":"def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any","titles":["liteyuki.bot"]},"40":{"title":"def print_logo()","titles":["liteyuki.bot"]},"41":{"title":"liteyuki.bot","titles":[]},"42":{"title":"class LiteyukiBot","titles":["liteyuki.bot"]},"43":{"title":"def __init__(self, *args, **kwargs) -> None","titles":["liteyuki.bot","class LiteyukiBot"]},"44":{"title":"async def _run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"45":{"title":"def run(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"46":{"title":"async def keep_alive(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"47":{"title":"def _handle_exit(self, signum, frame)","titles":["liteyuki.bot","class LiteyukiBot"]},"48":{"title":"def restart(self, delay: int = 0)","titles":["liteyuki.bot","class LiteyukiBot"]},"49":{"title":"def restart_process(self, name: Optional[str] = None)","titles":["liteyuki.bot","class LiteyukiBot"]},"50":{"title":"def init(self, *args, **kwargs)","titles":["liteyuki.bot","class LiteyukiBot"]},"51":{"title":"def init_logger(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"52":{"title":"def stop(self)","titles":["liteyuki.bot","class LiteyukiBot"]},"53":{"title":"def on_before_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"54":{"title":"def on_after_start(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"55":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"56":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"57":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"58":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC)","titles":["liteyuki.bot","class LiteyukiBot"]},"59":{"title":"def get_bot() -> LiteyukiBot","titles":["liteyuki.bot"]},"60":{"title":"def get_config(key: str, default: Any = None) -> Any","titles":["liteyuki.bot"]},"61":{"title":"def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any","titles":["liteyuki.bot"]},"62":{"title":"def print_logo()","titles":["liteyuki.bot"]},"63":{"title":"liteyuki.bot.lifespan","titles":[]},"64":{"title":"class Lifespan","titles":["liteyuki.bot.lifespan"]},"65":{"title":"def __init__(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"66":{"title":"async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"67":{"title":"def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"68":{"title":"def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"69":{"title":"def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"70":{"title":"def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"71":{"title":"def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"72":{"title":"def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC","titles":["liteyuki.bot.lifespan","class Lifespan"]},"73":{"title":"async def before_start(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"74":{"title":"async def after_start(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"75":{"title":"async def before_process_shutdown(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"76":{"title":"async def after_shutdown(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"77":{"title":"async def before_process_restart(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"78":{"title":"async def after_restart(self) -> None","titles":["liteyuki.bot.lifespan","class Lifespan"]},"79":{"title":"liteyuki.comm.channel","titles":[]},"80":{"title":"class Channel(Generic[T])","titles":["liteyuki.comm.channel"]},"81":{"title":"def __init__(self, name: str, type_check: Optional[bool] = None)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"82":{"title":"def _get_generic_type(self) -> Optional[type]","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"83":{"title":"def _validate_structure(self, data: Any, structure: type) -> bool","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"84":{"title":"def send(self, data: T)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"85":{"title":"def receive(self) -> T","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"86":{"title":"async def async_receive(self) -> T","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"87":{"title":"def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"88":{"title":"async def _run_on_receive_funcs(self, data: Any)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"89":{"title":"async def start_receive_loop(self)","titles":["liteyuki.comm.channel","class Channel(Generic[T])"]},"90":{"title":"var active_channel","titles":["liteyuki.comm.channel"]},"91":{"title":"var publish_channel","titles":["liteyuki.comm.channel"]},"92":{"title":"var channel_deliver_active_channel","titles":["liteyuki.comm.channel"]},"93":{"title":"def set_channel(name: str, channel: Channel)","titles":["liteyuki.comm.channel"]},"94":{"title":"def set_channels(channels: dict[str, Channel])","titles":["liteyuki.comm.channel"]},"95":{"title":"def get_channel(name: str) -> Channel","titles":["liteyuki.comm.channel"]},"96":{"title":"def get_channels() -> dict[str, Channel]","titles":["liteyuki.comm.channel"]},"97":{"title":"def on_set_channel(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"98":{"title":"def on_get_channel(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"99":{"title":"def on_get_channels(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.channel"]},"100":{"title":"liteyuki.comm","titles":[]},"101":{"title":"liteyuki.comm.event","titles":[]},"102":{"title":"class Event","titles":["liteyuki.comm.event"]},"103":{"title":"def __init__(self, name: str, data: dict[str, Any])","titles":["liteyuki.comm.event","class Event"]},"104":{"title":"liteyuki.comm","titles":[]},"105":{"title":"liteyuki.comm.rpc","titles":[]},"106":{"title":"class RPC","titles":["liteyuki.comm.rpc"]},"107":{"title":"def __init__(self, on_calling: ON_CALLING_FUNC) -> None","titles":["liteyuki.comm.rpc","class RPC"]},"108":{"title":"def call(self, args: tuple, kwargs: dict) -> Any","titles":["liteyuki.comm.rpc","class RPC"]},"109":{"title":"liteyuki.comm.socks_channel","titles":[]},"110":{"title":"class SocksChannel","titles":["liteyuki.comm.socks_channel"]},"111":{"title":"def __init__(self, name: str)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"112":{"title":"def send(self, data)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"113":{"title":"def receive(self)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"114":{"title":"def close(self)","titles":["liteyuki.comm.socks_channel","class SocksChannel"]},"115":{"title":"liteyuki.comm.storage","titles":[]},"116":{"title":"var _on_main_subscriber_receive_funcs","titles":["liteyuki.comm.storage"]},"117":{"title":"var _on_sub_subscriber_receive_funcs","titles":["liteyuki.comm.storage"]},"118":{"title":"class KeyValueStore","titles":["liteyuki.comm.storage"]},"119":{"title":"def __init__(self)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"120":{"title":"def set(self, key: str, value: Any) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"121":{"title":"def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"122":{"title":"def delete(self, key: str, ignore_key_error: bool = True) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"123":{"title":"def get_all(self) -> dict[str, Any]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"124":{"title":"def publish(self, channel_: str, data: Any) -> None","titles":["liteyuki.comm.storage","class KeyValueStore"]},"125":{"title":"def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]","titles":["liteyuki.comm.storage","class KeyValueStore"]},"126":{"title":"async def run_subscriber_receive_funcs(channel_: str, data: Any)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"127":{"title":"async def start_receive_loop(self)","titles":["liteyuki.comm.storage","class KeyValueStore"]},"128":{"title":"class GlobalKeyValueStore","titles":["liteyuki.comm.storage"]},"129":{"title":"def get_instance(cls)","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"130":{"title":"attr _instance = None","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"131":{"title":"attr _lock = threading.Lock()","titles":["liteyuki.comm.storage","class GlobalKeyValueStore"]},"132":{"title":"var _ref_count","titles":["liteyuki.comm.storage"]},"133":{"title":"def on_get(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"134":{"title":"def on_set(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"135":{"title":"def on_delete(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"136":{"title":"def on_get_all(data: tuple[str, dict[str, Any]])","titles":["liteyuki.comm.storage"]},"137":{"title":"liteyuki.config","titles":[]},"138":{"title":"def flat_config(config: dict[str, Any]) -> dict[str, Any]","titles":["liteyuki.config"]},"139":{"title":"def load_from_yaml(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"140":{"title":"def load_from_json(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"141":{"title":"def load_from_toml(file_: str) -> dict[str, Any]","titles":["liteyuki.config"]},"142":{"title":"def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"143":{"title":"def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"144":{"title":"def load_config_in_default(no_waring: bool = False) -> dict[str, Any]","titles":["liteyuki.config"]},"145":{"title":"liteyuki.core","titles":[]},"146":{"title":"liteyuki.core","titles":[]},"147":{"title":"liteyuki.core.manager","titles":[]},"148":{"title":"class ChannelDeliver","titles":["liteyuki.core.manager"]},"149":{"title":"def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])","titles":["liteyuki.core.manager","class ChannelDeliver"]},"150":{"title":"class ProcessManager","titles":["liteyuki.core.manager"]},"151":{"title":"def __init__(self, lifespan: Lifespan)","titles":["liteyuki.core.manager","class ProcessManager"]},"152":{"title":"async def _run_process(self, name: str)","titles":["liteyuki.core.manager","class ProcessManager"]},"153":{"title":"async def start_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"154":{"title":"def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)","titles":["liteyuki.core.manager","class ProcessManager"]},"155":{"title":"def join_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"156":{"title":"def terminate(self, name: str)","titles":["liteyuki.core.manager","class ProcessManager"]},"157":{"title":"def terminate_all(self)","titles":["liteyuki.core.manager","class ProcessManager"]},"158":{"title":"def is_process_alive(self, name: str) -> bool","titles":["liteyuki.core.manager","class ProcessManager"]},"159":{"title":"liteyuki.dev","titles":[]},"160":{"title":"liteyuki.dev","titles":[]},"161":{"title":"liteyuki.dev.observer","titles":[]},"162":{"title":"var CALLBACK_FUNC","titles":["liteyuki.dev.observer"]},"163":{"title":"var FILTER_FUNC","titles":["liteyuki.dev.observer"]},"164":{"title":"def debounce(wait)","titles":["liteyuki.dev.observer"]},"165":{"title":"class CodeModifiedHandler(FileSystemEventHandler)","titles":["liteyuki.dev.observer"]},"166":{"title":"def on_modified(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"167":{"title":"def on_created(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"168":{"title":"def on_deleted(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"169":{"title":"def on_moved(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"170":{"title":"def on_any_event(self, event)","titles":["liteyuki.dev.observer","class CodeModifiedHandler(FileSystemEventHandler)"]},"171":{"title":"def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]","titles":["liteyuki.dev.observer"]},"172":{"title":"liteyuki.dev.plugin","titles":[]},"173":{"title":"def run_plugins(*module_path: str | Path)","titles":["liteyuki.dev.plugin"]},"174":{"title":"liteyuki.exception","titles":[]},"175":{"title":"class LiteyukiException(BaseException)","titles":["liteyuki.exception"]},"176":{"title":"liteyuki","titles":[]},"177":{"title":"var __version__","titles":["liteyuki"]},"178":{"title":"liteyuki.log","titles":[]},"179":{"title":"def get_format(level: str) -> str","titles":["liteyuki.log"]},"180":{"title":"def init_log(config: dict)","titles":["liteyuki.log"]},"181":{"title":"liteyuki.message.event","titles":[]},"182":{"title":"class MessageEvent","titles":["liteyuki.message.event"]},"183":{"title":"def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)","titles":["liteyuki.message.event","class MessageEvent"]},"184":{"title":"def reply(self, message: str | dict[str, Any])","titles":["liteyuki.message.event","class MessageEvent"]},"185":{"title":"liteyuki.message","titles":[]},"186":{"title":"liteyuki.message.matcher","titles":[]},"187":{"title":"class Matcher","titles":["liteyuki.message.matcher"]},"188":{"title":"def __init__(self, rule: Rule, priority: int, block: bool)","titles":["liteyuki.message.matcher","class Matcher"]},"189":{"title":"def handle(self) -> Callable[[EventHandler], EventHandler]","titles":["liteyuki.message.matcher","class Matcher"]},"190":{"title":"async def run(self, event: MessageEvent) -> None","titles":["liteyuki.message.matcher","class Matcher"]},"191":{"title":"liteyuki.message","titles":[]},"192":{"title":"liteyuki.message.on","titles":[]},"193":{"title":"def add_matcher(matcher: Matcher)","titles":["liteyuki.message.on"]},"194":{"title":"def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher","titles":["liteyuki.message.on"]},"195":{"title":"def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher","titles":["liteyuki.message.on"]},"196":{"title":"liteyuki.message.rule","titles":[]},"197":{"title":"var RuleHandlerFunc","titles":["liteyuki.message.rule"]},"198":{"title":"class Rule","titles":["liteyuki.message.rule"]},"199":{"title":"def __init__(self, handler: RuleHandlerFunc)","titles":["liteyuki.message.rule","class Rule"]},"200":{"title":"def __or__(self, other: Rule) -> Rule","titles":["liteyuki.message.rule","class Rule"]},"201":{"title":"def __and__(self, other: Rule) -> Rule","titles":["liteyuki.message.rule","class Rule"]},"202":{"title":"async def __call__(self, event: MessageEvent) -> bool","titles":["liteyuki.message.rule","class Rule"]},"203":{"title":"async def empty_rule(event: MessageEvent) -> bool","titles":["liteyuki.message.rule"]},"204":{"title":"async def is_su_rule(event: MessageEvent) -> bool","titles":["liteyuki.message.rule"]},"205":{"title":"liteyuki.message.session","titles":[]},"206":{"title":"liteyuki.mkdoc","titles":[]},"207":{"title":"class DefType(Enum)","titles":["liteyuki.mkdoc"]},"208":{"title":"attr FUNCTION = 'function'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"209":{"title":"attr METHOD = 'method'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"210":{"title":"attr STATIC_METHOD = 'staticmethod'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"211":{"title":"attr CLASS_METHOD = 'classmethod'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"212":{"title":"attr PROPERTY = 'property'","titles":["liteyuki.mkdoc","class DefType(Enum)"]},"213":{"title":"class FunctionInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"214":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"215":{"title":"attr args: list[tuple[str, str]] = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"216":{"title":"attr return_type: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"217":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"218":{"title":"attr source_code: str = ''","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"219":{"title":"attr type: DefType = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"220":{"title":"attr is_async: bool = NO_DEFAULT","titles":["liteyuki.mkdoc","class FunctionInfo(BaseModel)"]},"221":{"title":"class AttributeInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"222":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"223":{"title":"attr type: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"224":{"title":"attr value: Any = None","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"225":{"title":"attr docstring: str = ''","titles":["liteyuki.mkdoc","class AttributeInfo(BaseModel)"]},"226":{"title":"class ClassInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"227":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"228":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"229":{"title":"attr methods: list[FunctionInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"230":{"title":"attr attributes: list[AttributeInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"231":{"title":"attr inherit: list[str] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ClassInfo(BaseModel)"]},"232":{"title":"class ModuleInfo(BaseModel)","titles":["liteyuki.mkdoc"]},"233":{"title":"attr module_path: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"234":{"title":"attr functions: list[FunctionInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"235":{"title":"attr classes: list[ClassInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"236":{"title":"attr attributes: list[AttributeInfo] = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"237":{"title":"attr docstring: str = NO_DEFAULT","titles":["liteyuki.mkdoc","class ModuleInfo(BaseModel)"]},"238":{"title":"def get_relative_path(base_path: str, target_path: str) -> str","titles":["liteyuki.mkdoc"]},"239":{"title":"def write_to_files(file_data: dict[str, str])","titles":["liteyuki.mkdoc"]},"240":{"title":"def get_file_list(module_folder: str)","titles":["liteyuki.mkdoc"]},"241":{"title":"def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo","titles":["liteyuki.mkdoc"]},"242":{"title":"def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str","titles":["liteyuki.mkdoc"]},"243":{"title":"def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)","titles":["liteyuki.mkdoc"]},"244":{"title":"var no_module_name_pyfile_path","titles":["liteyuki.mkdoc"]},"245":{"title":"liteyuki.plugin","titles":[]},"246":{"title":"def get_loaded_plugins() -> dict[str, Plugin]","titles":["liteyuki.plugin"]},"247":{"title":"liteyuki.plugin.load","titles":[]},"248":{"title":"def load_plugin(module_path: str | Path) -> Optional[Plugin]","titles":["liteyuki.plugin.load"]},"249":{"title":"def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]","titles":["liteyuki.plugin.load"]},"250":{"title":"def format_display_name(display_name: str, plugin_type: PluginType) -> str","titles":["liteyuki.plugin.load"]},"251":{"title":"liteyuki.plugin.manager","titles":[]},"252":{"title":"liteyuki.plugin.model","titles":[]},"253":{"title":"class PluginType(Enum)","titles":["liteyuki.plugin.model"]},"254":{"title":"attr APPLICATION = 'application'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"255":{"title":"attr SERVICE = 'service'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"256":{"title":"attr MODULE = 'module'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"257":{"title":"attr UNCLASSIFIED = 'unclassified'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"258":{"title":"attr TEST = 'test'","titles":["liteyuki.plugin.model","class PluginType(Enum)"]},"259":{"title":"class PluginMetadata(BaseModel)","titles":["liteyuki.plugin.model"]},"260":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"261":{"title":"attr description: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"262":{"title":"attr usage: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"263":{"title":"attr type: PluginType = PluginType.UNCLASSIFIED","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"264":{"title":"attr author: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"265":{"title":"attr homepage: str = ''","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"266":{"title":"attr extra: dict[str, Any] = {}","titles":["liteyuki.plugin.model","class PluginMetadata(BaseModel)"]},"267":{"title":"class Plugin(BaseModel)","titles":["liteyuki.plugin.model"]},"268":{"title":"def __hash__(self)","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"269":{"title":"attr model_config = {'arbitrary_types_allowed': True}","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"270":{"title":"attr name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"271":{"title":"attr module: ModuleType = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"272":{"title":"attr module_name: str = NO_DEFAULT","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"273":{"title":"attr metadata: Optional[PluginMetadata] = None","titles":["liteyuki.plugin.model","class Plugin(BaseModel)"]},"274":{"title":"liteyuki.plugin","titles":[]},"275":{"title":"def get_loaded_plugins() -> dict[str, Plugin]","titles":["liteyuki.plugin"]},"276":{"title":"liteyuki.plugins.liteecho","titles":[]},"277":{"title":"async def liteecho(event: MessageEvent)","titles":["liteyuki.plugins.liteecho"]},"278":{"title":"liteyuki.plugins.plugin_loader","titles":[]},"279":{"title":"def default_plugins_loader()","titles":["liteyuki.plugins.plugin_loader"]},"280":{"title":"liteyuki.plugins.plugin_loader","titles":[]},"281":{"title":"def default_plugins_loader()","titles":["liteyuki.plugins.plugin_loader"]},"282":{"title":"liteyuki.utils","titles":[]},"283":{"title":"def is_coroutine_callable(call: Callable[..., Any]) -> bool","titles":["liteyuki.utils"]},"284":{"title":"def run_coroutine(*coro: Coroutine)","titles":["liteyuki.utils"]},"285":{"title":"def run_coroutine_in_thread(*coro: Coroutine)","titles":["liteyuki.utils"]},"286":{"title":"def path_to_module_name(path: Path) -> str","titles":["liteyuki.utils"]},"287":{"title":"def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]","titles":["liteyuki.utils"]},"288":{"title":"通道通信","titles":[]},"289":{"title":"简介","titles":["通道通信"]},"290":{"title":"示例","titles":["通道通信"]},"291":{"title":"共享内存通信","titles":["通道通信"]},"292":{"title":"简介","titles":["通道通信","共享内存通信"]},"293":{"title":"示例","titles":["通道通信","共享内存通信"]},"294":{"title":"轻雪函数","titles":[]},"295":{"title":"函数文件","titles":["轻雪函数"]},"296":{"title":"命令文档","titles":["轻雪函数"]},"297":{"title":"示例","titles":["轻雪函数","命令文档"]},"298":{"title":"API","titles":["轻雪函数"]},"299":{"title":"结束关键字","titles":["轻雪函数"]},"300":{"title":"简介","titles":[]},"301":{"title":"开始","titles":["简介"]},"302":{"title":"创建插件","titles":["简介","开始"]},"303":{"title":"编写逻辑部分","titles":["简介","开始"]},"304":{"title":"加载插件","titles":["简介","开始"]},"305":{"title":"方法1","titles":["简介","开始","加载插件"]},"306":{"title":"方法2","titles":["简介","开始","加载插件"]},"307":{"title":"简介","titles":[]},"308":{"title":"加载资源包","titles":["简介"]},"309":{"title":"用户协议","titles":[]},"310":{"title":"基础插件","titles":[]},"311":{"title":"轻雪命令liteyuki_command","titles":["基础插件"]},"312":{"title":"命令别名","titles":["基础插件","轻雪命令liteyuki_command"]},"313":{"title":"插件/包管理器 liteyuki_pacman","titles":["基础插件"]},"314":{"title":"命令别名","titles":["基础插件","插件/包管理器 liteyuki_pacman"]},"315":{"title":"用户管理liteyuki_user","titles":["基础插件"]},"316":{"title":"功能插件命令","titles":[]},"317":{"title":"轻雪天气liteyuki_weather","titles":["功能插件命令"]},"318":{"title":"命令别名","titles":["功能插件命令","轻雪天气liteyuki_weather"]},"319":{"title":"统计信息liteyuki_statistics","titles":["功能插件命令"]},"320":{"title":"命令别名","titles":["功能插件命令","统计信息liteyuki_statistics"]}},"dirtCount":0,"index":[["秒",{"2":{"319":2}}],["小时",{"2":{"319":2}}],["天",{"2":{"319":2}}],["天气",{"2":{"317":1,"318":1}}],["格式",{"2":{"319":1}}],["格式为onebot",{"2":{"311":1}}],["统计时间范围为duration",{"2":{"319":1}}],["统计周期为period",{"2":{"319":1}}],["统计信息",{"2":{"319":1}}],["统计信息liteyuki",{"0":{"319":1},"1":{"320":1}}],["功能",{"2":{"319":1}}],["功能插件命令",{"0":{"316":1},"1":{"317":1,"318":1,"319":1,"320":1}}],["个人全局生效",{"2":{"317":1}}],["个人信息",{"2":{"315":1}}],["绑定城市",{"2":{"318":1}}],["绑定查询城市",{"2":{"317":1}}],["绑定端口",{"2":{"1":1}}],["海淀",{"2":{"317":1}}],["北京",{"2":{"317":1}}],["受限于nonebot2钩子函数的依赖注入参数",{"2":{"314":1}}],["帮助",{"2":{"314":1}}],["列表",{"2":{"314":1}}],["列出所有资源包",{"2":{"313":1}}],["列出所有插件",{"2":{"313":1}}],["更改",{"2":{"314":1}}],["更新",{"2":{"314":1}}],["更新插件商店索引",{"2":{"313":1}}],["更新轻雪",{"2":{"311":1,"312":1}}],["更新轻雪失败",{"2":{"6":1}}],["全局停用",{"2":{"314":1}}],["全局启用",{"2":{"313":1,"314":1}}],["搜索",{"2":{"314":1}}],["卸载",{"2":{"314":2}}],["卸载资源包",{"2":{"313":1}}],["卸载插件",{"2":{"313":1}}],["私聊所有人可用",{"2":{"313":2}}],["私聊通常为用户id",{"2":{"183":1}}],["当前bot",{"2":{"319":1}}],["当前群聊",{"2":{"319":1}}],["当前会话启用",{"2":{"313":1}}],["当前的轻雪实例",{"2":{"37":2,"59":2}}],["包管理器",{"0":{"313":1},"1":{"314":1}}],["包括子task",{"2":{"296":1}}],["包括chromium",{"2":{"15":1}}],["切换图片模式",{"2":{"312":1}}],["切换到bot目录下",{"2":{"12":1}}],["状态",{"2":{"312":1}}],["别名",{"2":{"312":1,"314":1,"315":1,"318":1,"320":1}}],["别用你那b",{"2":{"15":1}}],["群号",{"2":{"311":1}}],["群聊",{"2":{"312":1}}],["群聊仅群主",{"2":{"311":1,"313":2}}],["群聊通常为群id",{"2":{"183":1}}],["管理员",{"2":{"311":1,"313":2}}],["停用插件",{"2":{"313":2}}],["停用",{"2":{"312":1,"314":1}}],["停用机器人",{"2":{"311":1}}],["停止后",{"2":{"76":2}}],["停止前",{"2":{"75":2}}],["停止",{"2":{"65":2}}],["停止轻雪",{"2":{"27":2,"30":2,"49":2,"52":2}}],["查询目标地实时天气",{"2":{"317":1}}],["查询实时天气",{"2":{"317":1}}],["查询",{"2":{"312":1,"315":1}}],["查询配置项",{"2":{"311":1}}],["查看用户信息菜单",{"2":{"315":1}}],["查看插件帮助",{"2":{"313":1}}],["查看轻雪文档",{"2":{"311":1}}],["查看统计信息和状态",{"2":{"311":1}}],["查看当前bot",{"2":{"311":1}}],["版本",{"2":{"311":1}}],["❌",{"2":{"311":11}}],["超级用户可用",{"2":{"311":1,"313":2}}],["超级用户",{"2":{"311":10,"313":10}}],["超级用户列表",{"2":{"1":1}}],["重载",{"2":{"314":1}}],["重载所有资源包",{"2":{"313":1}}],["重载资源",{"2":{"312":1}}],["重载轻雪",{"2":{"311":1}}],["重启轻雪",{"2":{"312":1}}],["重启轻雪即可加载插件",{"2":{"305":1}}],["重启轻雪本体",{"2":{"26":2,"48":2}}],["重启后",{"2":{"78":2}}],["重启前",{"2":{"77":2}}],["重启",{"2":{"65":2}}],["举例",{"2":{"311":1}}],["权限",{"2":{"311":1,"313":2,"315":1}}],["~代替",{"2":{"310":1}}],["~可以使用插件",{"2":{"310":1}}],["命令",{"2":{"311":1,"312":1,"313":2,"314":1,"315":2,"317":1,"318":1,"319":1,"320":1}}],["命令别名",{"0":{"312":1,"314":1,"318":1,"320":1},"2":{"310":1,"315":1}}],["命令文档",{"0":{"296":1},"1":{"297":1}}],["系统信息及python信息",{"2":{"309":1}}],["分钟",{"2":{"319":2}}],["分发",{"2":{"309":1}}],["分工明确",{"2":{"137":1}}],["修改优先级",{"2":{"313":1}}],["修改",{"2":{"309":1}}],["同时用户也应该自行选择可用的资源包",{"2":{"308":1}}],["同步接收数据",{"2":{"85":2}}],["第三方资源包开发者需要注意版本兼容性",{"2":{"308":1}}],["└─",{"2":{"308":1}}],["└───",{"2":{"308":1}}],["└─resource",{"2":{"308":2}}],["├─templates",{"2":{"308":1}}],["├─metadata",{"2":{"308":2}}],["正常的路径应该是这样的",{"2":{"308":1}}],["只需要将其解压到根目录resources目录下即可",{"2":{"308":1}}],["只负责处理和回应消息",{"2":{"6":1}}],["错位等无法预料的事情发生",{"2":{"307":1}}],["异常",{"2":{"307":1}}],["异步任务结束关键字",{"2":{"299":1}}],["异步等待",{"2":{"296":1}}],["异步包装器",{"2":{"287":2}}],["异步接收数据",{"2":{"86":2}}],["欢迎各位投稿资源包到轻雪资源商店",{"2":{"307":1}}],["部分异常信息",{"2":{"309":1}}],["部分内容制作需要一点点前端基础",{"2":{"307":1}}],["部分来源于",{"2":{"282":1}}],["讲起打包成一个新的资源包",{"2":{"307":1}}],["仅需按照原有路径进行文件替换即可",{"2":{"307":1}}],["资源",{"2":{"307":1}}],["资源包管理",{"2":{"313":1}}],["资源包的结构会随着轻雪的更新而有变动",{"2":{"308":1}}],["资源包的制作很简单",{"2":{"307":1}}],["资源包加载遵循一个优先级",{"2":{"308":1}}],["资源包描述",{"2":{"308":1}}],["资源包名称",{"2":{"308":1}}],["资源包通常是以",{"2":{"308":1}}],["资源包",{"2":{"307":1,"314":1}}],["它允许你一定程度上自定义轻雪的外观",{"2":{"307":1}}],["它允许你在轻雪中运行一些自定义的由数据驱动的命令",{"2":{"294":1}}],["亦可根据用途称为主题包",{"2":{"307":1}}],["保存后轻雪会自动重载nonebot进程",{"2":{"306":1}}],["保持轻雪运行",{"2":{"24":2,"46":2}}],["我们在src",{"2":{"306":1}}],["我们专门为minecraft开发的服务器bot",{"2":{"9":1}}],["方法2",{"0":{"306":1}}],["方法1",{"0":{"305":1}}],["用户管理liteyuki",{"0":{"315":1}}],["用户协议",{"0":{"309":1}}],["用observer的on",{"2":{"303":1}}],["用于统计bot接收到的消息",{"2":{"319":1}}],["用于开发nonebot时进行文件系统变更重载",{"2":{"303":1}}],["用于结束当前已完成function的执行",{"2":{"299":1}}],["用于回复消息",{"2":{"183":1}}],["用于获取和唯一标识",{"2":{"154":2}}],["用于进程间通信",{"2":{"79":1}}],["排除的文件扩展名",{"2":{"303":1}}],["因此插件主要是一些后台任务或者与聊天机器人的通信",{"2":{"303":1}}],["因此无法通过内存共享和直接对象传递的方式进行通信",{"2":{"289":1}}],["定义插件元数据",{"2":{"302":1}}],["定义变量",{"2":{"296":1}}],["导入轻雪bot和日志",{"2":{"303":1}}],["导入文件系统事件",{"2":{"303":1}}],["导入文件系统观察器",{"2":{"303":1}}],["导入文件夹下多个插件",{"2":{"249":2}}],["导入逻辑部分",{"2":{"302":1}}],["首先创建一个文件夹",{"2":{"302":1}}],["首次运行后生成config",{"2":{"0":1}}],["编写逻辑部分",{"0":{"303":1}}],["编写轻雪函数推荐你使用vs",{"2":{"299":1}}],["编辑时的语法高亮可采取shell格式",{"2":{"295":1}}],["那么加载b包后",{"2":{"308":1}}],["那么你能够很快就上手",{"2":{"307":1}}],["那么当前所有函数包的task都会被截停销毁",{"2":{"299":1}}],["那么将会被解析为nickname而不是命令",{"2":{"6":1}}],["的情况是效率提升的关键",{"2":{"299":1}}],["单线程走到底",{"2":{"299":1}}],["单位s",{"2":{"296":1}}],["避免出现",{"2":{"299":1}}],["所有人",{"2":{"311":1,"313":1,"315":3}}],["所有进程",{"2":{"27":2,"49":2}}],["所以在编写lyfunction时也要注意异步的调用",{"2":{"299":1}}],["由于liteyukibot基于异步运行",{"2":{"299":1}}],["理论上所有基于onebotv11的api都可调用",{"2":{"298":1}}],["则该文件夹不会被识别为资源包",{"2":{"308":1}}],["则需要删除await",{"2":{"297":1}}],["则传入泛型默认开启",{"2":{"81":2}}],["无需手动创建实例",{"2":{"306":1}}],["无需手动初始化bot",{"2":{"173":2}}],["无限戳",{"2":{"297":1}}],["执行",{"2":{"297":1}}],["疯狂戳好友",{"2":{"297":1}}],["否则会导致渲染失败或渲染结果不理想",{"2":{"307":1}}],["否则task对象会被销毁",{"2":{"296":1}}],["否则默认关闭",{"2":{"81":2}}],["等待所有异步任务结束",{"2":{"296":1}}],["等待接收数据",{"2":{"86":1}}],["结束关键字",{"0":{"299":1}}],["结束函数关键字",{"2":{"296":1}}],["结构",{"2":{"83":2}}],["也支持句末注释",{"2":{"295":1}}],["也可以监听其他进程的消息",{"2":{"289":1}}],["支持中英文",{"2":{"317":2}}],["支持中英文城市名",{"2":{"317":1}}],["支持多个关键词查询",{"2":{"317":1}}],["支持绑定城市",{"2":{"317":1}}],["支持单行注释",{"2":{"295":1}}],["支持onebotv11标准",{"2":{"9":1}}],["函数文件放在资源包的functions目录下",{"2":{"295":1}}],["函数文件",{"0":{"295":1}}],["属于资源包的一部分",{"2":{"294":1}}],["是可以相对引用的",{"2":{"308":1}}],["是轻雪的一个功能",{"2":{"294":1}}],["是否为协程可调用对象",{"2":{"283":2}}],["是否忽略警告",{"2":{"249":2}}],["是否忽略键不存在的错误",{"2":{"122":2}}],["是否包含顶层文件夹",{"2":{"243":2}}],["是否阻断后续优先级更低的匹配器",{"2":{"188":2}}],["是否递归监听子目录",{"2":{"171":2}}],["是否通过验证",{"2":{"83":2}}],["是否开启类型检查",{"2":{"81":2}}],["是否允许更新",{"2":{"2":1}}],["是否自动更新轻雪",{"2":{"1":1}}],["是否自动上报问题给轻雪服务器",{"2":{"1":1}}],["是否显示日志等级图标",{"2":{"1":1}}],["线程锁会自动保护共享内存的读写操作",{"2":{"292":1}}],["相比于普通进程通信",{"2":{"292":1}}],["相对路径",{"2":{"239":2}}],["共享内存通信",{"0":{"291":1},"1":{"292":1,"293":1}}],["共享内存模块",{"2":{"115":1}}],["被动模式",{"2":{"290":1}}],["被动模式由chan",{"2":{"290":1}}],["且通过安全的方式传输到轻雪的服务器",{"2":{"309":1}}],["且通道标识为",{"2":{"290":1}}],["且遵守了相关字体开源协议",{"2":{"10":1}}],["创建入口文件",{"2":{"306":1}}],["创建插件",{"0":{"302":1}}],["创建子进程的同时会初始化一个被动通道和一个主动通道",{"2":{"290":1}}],["创建asyncio",{"2":{"153":2}}],["实现",{"2":{"290":1}}],["实现端本身不负责处理响应逻辑",{"2":{"6":1}}],["主题包中的html渲染使用js来规定数据的渲染位置",{"2":{"307":1}}],["主题商店提供了一些资源包供你选择",{"2":{"307":1}}],["主动模式需调用chan",{"2":{"290":1}}],["主进程中",{"2":{"290":1}}],["主进程中通过get",{"2":{"290":1}}],["主进程接收到消息后重启对应子进程",{"2":{"289":1}}],["主进程订阅者接收函数",{"2":{"116":1}}],["主进程创建单例",{"2":{"91":1,"92":1}}],["即后加载的资源包会覆盖前面的资源包",{"2":{"308":1}}],["即可创建一个插件",{"2":{"302":1}}],["即不等待",{"2":{"296":1}}],["即被动模式和主动模式",{"2":{"290":1}}],["即轻雪作为服务端",{"2":{"3":1}}],["有一个task任务没有完成而await被执行了",{"2":{"299":1}}],["有两种接收模式",{"2":{"290":1}}],["有的插件安装后报错无法启动",{"2":{"6":1}}],["这时可以通过通道对主进程发送消息",{"2":{"289":1}}],["这里给出一个参考值",{"2":{"3":1}}],["里",{"2":{"289":1}}],["简介",{"0":{"289":1,"292":1,"300":1,"307":1},"1":{"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"308":1}}],["路径a",{"2":{"286":2}}],["转换路径为模块名",{"2":{"286":2}}],["判断是否为协程可调用对象",{"2":{"283":2}}],["一个",{"2":{"302":1}}],["一个键不要多次出现",{"2":{"137":1}}],["一些常用的工具类",{"2":{"282":1}}],["应在初始化时调用",{"2":{"279":2,"281":2}}],["根据不同类型插件设置颜色",{"2":{"250":2}}],["可用",{"2":{"311":1}}],["可用参数",{"2":{"311":1}}],["可以在配置文件中把auto",{"2":{"309":1}}],["可以在a的index",{"2":{"308":1}}],["可以在此基础上进行修改",{"2":{"307":1}}],["可以很高程度地扩展轻雪的功能",{"2":{"300":1}}],["可以是本地插件或是通过",{"2":{"248":2}}],["可递归",{"2":{"296":1}}],["可调用对象",{"2":{"283":2}}],["可使用ws",{"2":{"8":1}}],["插件停用只能阻断传入响应",{"2":{"314":1}}],["插件管理",{"2":{"313":1,"314":1}}],["插件",{"0":{"313":1},"1":{"314":1}}],["插件信息",{"2":{"309":1}}],["插件描述",{"2":{"302":1}}],["插件版本",{"2":{"302":1}}],["插件类型",{"2":{"250":2,"302":1}}],["插件名称",{"2":{"248":2,"250":2,"302":1}}],["插件字典",{"2":{"246":2,"275":2}}],["插件路径",{"2":{"173":2}}],["去头路径",{"2":{"244":1}}],["忽略的路径",{"2":{"243":2}}],["忽略私有函数和类",{"2":{"241":2}}],["模块名",{"2":{"286":2}}],["模块文件夹",{"2":{"243":2}}],["模块信息",{"2":{"241":2,"242":2}}],["\`pathlib",{"2":{"248":1}}],["\`path",{"2":{"248":1}}],["\`pip\`",{"2":{"248":1}}],["\`",{"2":{"242":14,"248":1}}],["字体包",{"2":{"307":1}}],["字符串",{"2":{"242":2}}],["字段",{"2":{"3":1}}],["语言包等",{"2":{"307":1}}],["语言",{"2":{"242":2,"243":2}}],["文件内容为一系列的命令",{"2":{"295":1}}],["文件名以",{"2":{"295":1}}],["文件夹路径",{"2":{"249":2}}],["文件路径",{"2":{"241":2}}],["文件数据",{"2":{"239":2}}],["输入值会被执行以转换为正确的类型",{"2":{"311":1}}],["输入playwright",{"2":{"6":1}}],["输出",{"2":{"295":1}}],["输出文件夹",{"2":{"243":2}}],["输出文件",{"2":{"239":2}}],["目标路径",{"2":{"238":2}}],["目前可用性较低",{"2":{"8":1}}],["目前markdown消息支持lagrange",{"2":{"8":1}}],["添加配置项",{"2":{"311":1}}],["添加sleep",{"2":{"297":1}}],["添加处理函数",{"2":{"189":2}}],["添加进程",{"2":{"154":2}}],["优先级",{"2":{"188":2}}],["规则函数签名",{"2":{"197":1}}],["规则",{"2":{"188":2}}],["匹配器",{"2":{"188":2}}],["回复消息",{"2":{"184":2}}],["附加数据",{"2":{"183":1}}],["原始消息",{"2":{"183":1}}],["原生实现",{"2":{"8":1}}],["消息类型",{"2":{"183":1}}],["消息段数组",{"2":{"183":1}}],["消息",{"2":{"183":1}}],["机器人id",{"2":{"183":1}}],["机器人昵称列表",{"2":{"1":1}}],["⭕",{"2":{"180":1}}],["⚠️",{"2":{"180":1}}],["✅",{"2":{"180":1}}],["ℹ️信息",{"2":{"290":4}}],["ℹ️",{"2":{"180":1}}],["🐛",{"2":{"180":1}}],["上午12",{"2":{"252":1}}],["上午11",{"2":{"147":1}}],["上午6",{"2":{"206":1}}],["上午9",{"2":{"178":1}}],["上午5",{"2":{"172":1}}],["事件过滤器",{"2":{"171":2}}],["事件循环",{"2":{"21":1,"43":1}}],["防抖函数",{"2":{"164":2}}],["防止获取空指针",{"2":{"132":1}}],["位置1为filesystemevent",{"2":{"162":1,"163":1}}],["启用",{"2":{"312":1,"314":1}}],["启用插件后",{"2":{"306":1}}],["启用该模块需要在配置文件中设置dev",{"2":{"161":1}}],["启动所有进程",{"2":{"153":2}}],["启动发布订阅接收器循环",{"2":{"127":2}}],["启动后控制台输出",{"2":{"290":1}}],["启动后",{"2":{"74":2}}],["启动前",{"2":{"73":2}}],["启动",{"2":{"65":2}}],["启动逻辑",{"2":{"22":2,"44":2}}],["启动容器",{"2":{"13":1}}],["启动bot",{"2":{"12":1}}],["启动时会加载项目目录下config",{"2":{"0":1}}],["此模块用于注册观察者函数",{"2":{"161":1}}],["检查进程是否存活",{"2":{"158":2}}],["终止进程并从进程字典中删除",{"2":{"156":2}}],["对于主动推送的插件不生效",{"2":{"314":1}}],["对于不同资源包的不同文件",{"2":{"308":1}}],["对外启动方法",{"2":{"153":2}}],["对公开放时建议设置",{"2":{"2":1}}],["项目目录下的配置文件优先",{"2":{"144":2}}],["项目目录下的配置文件优先级高于config目录下的配置文件",{"2":{"137":1}}],["项目目录下的config",{"2":{"144":2}}],["按照读取文件的优先级反向覆盖",{"2":{"143":2}}],["从一个标准的轻雪项目加载配置文件",{"2":{"144":2}}],["从目录下加载配置文件",{"2":{"143":2}}],["从指定文件加载配置项",{"2":{"142":2}}],["但请注意甄别第三方插件的安全性",{"2":{"309":1}}],["但请保证以上三个字段",{"2":{"308":1}}],["但若出现非单function的情况",{"2":{"299":1}}],["但需单独起篇幅",{"2":{"294":1}}],["但一个通道只能使用一种",{"2":{"290":1}}],["但也包含原有的键值对",{"2":{"138":2}}],["但是请保留原作者信息",{"2":{"309":1}}],["但是更加轻量级并且线程安全",{"2":{"115":1}}],["但是bot昵称有一个help",{"2":{"6":1}}],["但是基本上都是一样的",{"2":{"3":1}}],["但是部分内容会被覆盖",{"2":{"1":1}}],["扁平化后的配置文件",{"2":{"138":2}}],["扁平化配置文件",{"2":{"138":2}}],["扁平化编写",{"2":{"137":1}}],["注意不要嵌套文件夹",{"2":{"308":1}}],["注意冲突时的优先级",{"2":{"137":1}}],["注册一个函数在nonebot启动后运行",{"2":{"290":1}}],["注册一个函数在轻雪启动后运行",{"2":{"290":1}}],["注册文件系统变化监听器",{"2":{"171":2}}],["注册重启时的函数",{"2":{"71":2}}],["注册重启后的函数",{"2":{"36":2,"58":2,"72":2}}],["注册停止前的函数",{"2":{"69":2}}],["注册停止后的函数",{"2":{"33":2,"55":2,"70":2}}],["注册进程重启前的函数",{"2":{"35":2,"57":2}}],["注册进程停止前的函数",{"2":{"34":2,"56":2}}],["注册启动时的函数",{"2":{"67":2,"68":2}}],["注册启动后的函数",{"2":{"32":2,"54":2}}],["注册启动前的函数",{"2":{"31":2,"53":2}}],["45m",{"2":{"319":2}}],["44",{"2":{"185":1,"191":1}}],["4",{"2":{"137":1}}],["47",{"2":{"101":1,"181":1,"205":1}}],["每隔0",{"2":{"297":1}}],["每行一个命令",{"2":{"295":1}}],["每次接收到字符串数据时都会运行",{"2":{"290":1}}],["每3秒发送一次消息",{"2":{"290":1}}],["每个配置文件给一个或一类服务提供配置",{"2":{"137":1}}],["每天4点检查更新",{"2":{"1":1}}],["尽量不要冲突",{"2":{"137":1}}],["多配置文件编写原则",{"2":{"137":1}}],["引用计数",{"2":{"132":1}}],["运行环境的设备信息",{"2":{"309":1}}],["运行在主进程中",{"2":{"300":1}}],["运行协程",{"2":{"284":2}}],["运行处理函数",{"2":{"190":2}}],["运行插件",{"2":{"173":2}}],["运行订阅者接收函数",{"2":{"126":2}}],["运行接收函数",{"2":{"88":2}}],["订阅者接收消息时的回调",{"2":{"125":2}}],["频道",{"2":{"124":2,"125":2,"126":2}}],["发布消息",{"2":{"124":2}}],["发送函数为同步函数",{"2":{"84":2}}],["发送数据",{"2":{"84":2,"112":2}}],["删除键值对",{"2":{"122":2}}],["值",{"2":{"120":2,"121":2}}],["键值对",{"2":{"123":2}}],["键",{"2":{"120":2,"121":2,"122":2}}],["类似于minecraft的mcfunction",{"2":{"294":1}}],["类似于redis",{"2":{"115":1}}],["类型",{"2":{"90":1,"91":1,"92":1,"116":1,"117":1,"162":1,"163":1,"197":1}}],["关闭通道",{"2":{"114":2}}],["8",{"2":{"109":1,"139":1,"140":1,"141":1,"172":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"239":1,"241":1,"276":1,"277":1,"278":1,"280":1}}],["调用机器人函数",{"2":{"311":1}}],["调用机器人api",{"2":{"311":1}}],["调用重启进程方法",{"2":{"303":1}}],["调用函数",{"2":{"296":1}}],["调用bot",{"2":{"296":1}}],["调用",{"2":{"108":2}}],["通过关键词搜索插件",{"2":{"313":1}}],["通过装饰器注册一个函数在接收到消息时运行",{"2":{"290":1}}],["通常是目录不存在或目录为空",{"2":{"249":2}}],["通常为纯文本的格式",{"2":{"183":1}}],["通常会默认传入chan",{"2":{"154":2}}],["通信",{"2":{"105":1}}],["通道是全双工的",{"2":{"290":1}}],["通道通信",{"0":{"288":1},"1":{"289":1,"290":1,"291":1,"292":1,"293":1}}],["通道实例",{"2":{"93":2}}],["通道名称",{"2":{"93":2,"94":2,"95":2}}],["通道传递通道",{"2":{"91":1,"92":1}}],["通道id",{"2":{"81":2,"111":2}}],["依赖关系",{"2":{"100":1,"104":1}}],["设置用户信息或打开属性设置菜单",{"2":{"315":1}}],["设置",{"2":{"312":1,"315":1}}],["设置共享内存",{"2":{"293":1}}],["设置后的插件名称",{"2":{"250":2}}],["设置插件名称颜色",{"2":{"250":2}}],["设置键值对",{"2":{"120":2}}],["设置通道实例",{"2":{"93":2,"94":2}}],["设备上python环境太乱了",{"2":{"6":1}}],["子进程中获取通道直接导入进程全局单例即可",{"2":{"290":1}}],["子进程中导入单例active",{"2":{"290":1}}],["子进程订阅者接收函数",{"2":{"117":1}}],["子进程初始化时实例化",{"2":{"91":1,"92":1}}],["子进程可用的主动和被动通道",{"2":{"90":1}}],["装饰回调函数实现",{"2":{"290":1}}],["装饰一个函数在接收到数据后执行",{"2":{"87":2,"171":2}}],["装饰器",{"2":{"87":2,"125":2,"171":2,"189":4}}],["装置要求",{"0":{"15":1},"1":{"16":1}}],["过滤函数",{"2":{"87":2}}],["接收频道",{"2":{"183":1}}],["接收数据",{"2":{"113":2}}],["接收数据并执行函数",{"2":{"87":2}}],["接收到数据",{"2":{"86":1}}],["会触发最大递归深度限制",{"2":{"297":1}}],["会话负载信息",{"2":{"309":1}}],["会话类型",{"2":{"183":1}}],["会话id",{"2":{"183":1}}],["会阻塞",{"2":{"152":2}}],["会阻塞线程",{"2":{"85":2}}],["会自动判断key版本",{"2":{"317":1}}],["会自动判断主进程和子进程",{"2":{"89":2}}],["会自动识别文件格式",{"2":{"142":2}}],["会挂起等待",{"2":{"86":2}}],["没有异步的必要",{"2":{"84":2}}],["zip格式压缩的",{"2":{"308":1}}],["zip",{"2":{"83":1}}],["zh",{"0":{"242":1,"243":1},"2":{"2":1,"242":2,"243":1}}],["数据",{"2":{"83":2,"84":2,"88":2,"112":2,"113":2,"124":2,"126":2}}],["验证数据结构",{"2":{"83":2}}],["泛型类型",{"2":{"82":2}}],["并且应该在metadata",{"2":{"308":1}}],["并且不用修改源代码",{"2":{"307":1}}],["并在其中写入一些代码",{"2":{"306":1}}],["并在其中写入以下代码",{"2":{"306":1}}],["并在其中创建一个",{"2":{"302":1}}],["并遵循其许可进行修改",{"2":{"282":1}}],["并添加到进程字典中",{"2":{"152":2}}],["并发运行异步函数",{"2":{"66":2}}],["并使用克隆而非直接下载的方式部署轻雪",{"2":{"6":1}}],["下午3",{"2":{"109":1}}],["下午12",{"2":{"276":1}}],["下午10",{"2":{"101":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"278":1,"280":1}}],["下午11",{"2":{"79":1,"247":1,"251":1}}],["下午8",{"2":{"63":1}}],["下面已经列出一些推荐的实现端",{"2":{"6":1}}],["7",{"2":{"63":1,"79":1,"101":1,"147":1,"178":1,"247":1,"251":1,"252":1}}],["|$$$$$",{"2":{"40":1,"62":1}}],["|$$",{"2":{"40":5,"62":5}}],["|",{"0":{"66":1,"173":1,"183":1,"184":1,"248":1},"2":{"40":45,"62":45,"66":1,"173":1,"183":1,"184":1,"248":1}}],["+",{"2":{"40":2,"62":2,"242":2,"286":1}}],["+=",{"2":{"26":1,"48":1,"87":1,"242":15}}],["x26",{"2":{"195":1,"242":4}}],["x1b",{"2":{"40":2,"62":2}}],["x3c",{"2":{"26":1,"40":1,"48":1,"62":1,"180":5,"193":1,"242":8,"248":2,"250":4,"296":6,"317":2,"319":2}}],["兼容键",{"2":{"39":2,"61":2}}],["兼容旧版本",{"2":{"39":2,"61":2}}],["获取用户信息",{"2":{"315":1}}],["获取唯一的轻雪bot实例",{"2":{"303":1}}],["获取共享内存",{"2":{"293":1}}],["获取主动通道",{"2":{"290":1}}],["获取被动通道",{"2":{"290":1}}],["获取已加载的插件",{"2":{"246":2,"275":2}}],["获取函数和类",{"2":{"241":2}}],["获取相对路径",{"2":{"238":2}}],["获取所有键值对",{"2":{"123":2}}],["获取键值对",{"2":{"121":2}}],["获取通道实例",{"2":{"95":2,"96":2}}],["获取通道传递泛型类型",{"2":{"82":2}}],["获取配置",{"2":{"38":2,"39":2,"60":2,"61":2}}],["获取轻雪实例",{"2":{"37":2,"59":2}}],["返回true则执行回调函数",{"2":{"171":2}}],["返回",{"2":{"37":1,"38":1,"39":1,"59":1,"60":1,"61":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"82":1,"83":1,"87":1,"113":1,"121":1,"123":1,"125":1,"138":1,"171":1,"189":1,"241":1,"242":1,"246":1,"250":1,"275":1,"283":1,"286":1,"287":1}}],["为可选参数",{"2":{"310":1}}],["为必填参数",{"2":{"310":1}}],["为none则不过滤",{"2":{"87":2}}],["为子进程重启时调用",{"2":{"35":2,"57":2}}],["为子进程停止时调用",{"2":{"34":2,"56":2}}],["为什么我启动后机器人没有反应",{"2":{"6":1}}],["未实现",{"2":{"33":2,"36":2,"55":2,"58":2}}],["自定义选项title",{"2":{"242":2}}],["自动调用",{"2":{"28":2,"50":2}}],["自己整一个websocket客户端",{"2":{"8":1}}],["进程函数关键字参数",{"2":{"154":2}}],["进程函数参数",{"2":{"154":2}}],["进程函数",{"2":{"154":2}}],["进程名",{"2":{"154":2}}],["进程名称",{"2":{"27":2,"49":2}}],["进入轻雪目录",{"2":{"13":1}}],["join",{"0":{"155":1},"2":{"26":1,"48":1,"143":1,"155":2,"156":1,"240":1,"242":4,"243":1,"249":2,"286":2}}],["js",{"2":{"8":1}}],["json",{"0":{"140":1},"2":{"0":1,"140":5,"142":2,"144":1}}],["json和toml作为配置文件",{"2":{"0":1}}],["future",{"2":{"284":1}}],["func=none",{"2":{"171":1}}],["func=lambda",{"2":{"96":1,"97":2,"98":2,"99":1,"290":1}}],["function实现语法高亮",{"2":{"299":1}}],["functiondef",{"2":{"241":3}}],["functioninfo",{"0":{"213":1,"229":1,"234":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1},"2":{"241":2}}],["function",{"0":{"208":2},"2":{"89":1,"241":3,"294":1,"296":1,"297":2,"311":3}}],["functions=",{"2":{"241":1}}],["functions",{"0":{"234":1},"2":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"241":1,"242":1}}],["funcs",{"0":{"66":2,"88":1,"116":1,"117":1,"126":1},"2":{"65":6,"66":5,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"87":1,"88":3,"89":1,"125":6,"126":2,"127":1}}],["func",{"0":{"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"66":2,"67":3,"68":3,"69":3,"70":3,"71":3,"72":3,"87":2,"107":1,"125":2,"154":1,"162":1,"163":1,"171":3,"287":1},"2":{"31":5,"32":5,"33":5,"34":5,"35":5,"36":5,"53":5,"54":5,"55":5,"56":5,"57":5,"58":5,"65":6,"66":6,"67":9,"68":9,"69":9,"70":9,"71":9,"72":9,"81":2,"87":20,"88":6,"89":1,"107":1,"116":1,"117":1,"125":8,"126":2,"154":1,"164":2,"171":7,"241":2,"242":9,"283":2,"287":5,"296":1}}],["failed",{"2":{"248":1}}],["false时例如docs",{"2":{"243":2}}],["false",{"0":{"142":1,"143":1,"144":1,"194":1,"195":1,"243":1},"2":{"2":4,"81":2,"83":4,"111":1,"119":2,"283":1}}],["first",{"2":{"241":2}}],["filter=lambda",{"2":{"303":1}}],["filter",{"0":{"87":2,"163":1,"171":2},"2":{"87":8,"96":1,"97":2,"98":2,"99":1,"171":6,"290":1}}],["filesystemeventhandler",{"0":{"165":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1}}],["filesystemevent",{"2":{"162":1,"163":1,"171":1,"303":2}}],["files",{"0":{"142":2,"239":1},"2":{"142":3,"143":1,"144":1,"239":1,"240":2,"243":1}}],["file",{"0":{"139":1,"140":1,"141":1,"171":1,"239":1,"240":1,"241":1},"2":{"63":1,"79":1,"101":1,"109":1,"139":5,"140":5,"141":5,"142":12,"143":3,"147":1,"171":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"239":4,"240":7,"241":9,"243":6,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1,"303":3}}],["flat",{"0":{"138":1},"2":{"138":2,"139":1,"140":1,"141":1}}],["flag",{"2":{"65":1}}],["friend",{"2":{"297":2}}],["front",{"0":{"242":1},"2":{"242":6,"243":3}}],["from",{"0":{"139":1,"140":1,"141":1,"142":1,"143":1},"2":{"85":1,"139":4,"140":4,"141":4,"142":4,"143":2,"144":2,"290":4,"302":1,"303":3}}],["frame",{"0":{"25":1,"47":1},"2":{"25":3,"47":3}}],["folder",{"0":{"240":1,"243":1},"2":{"240":2,"243":5,"244":1}}],["found",{"2":{"84":1,"93":1,"142":1,"143":1,"152":1,"156":1,"158":1}}],["format=get",{"2":{"180":1}}],["formats",{"2":{"143":1}}],["format",{"0":{"179":1,"250":1},"2":{"142":1,"179":3,"180":1,"248":2,"250":1}}],["for",{"2":{"27":1,"39":1,"49":1,"61":1,"66":1,"81":1,"83":3,"88":2,"89":2,"94":1,"126":1,"138":2,"142":1,"143":2,"153":3,"155":1,"157":1,"171":1,"190":1,"193":1,"195":1,"239":1,"240":2,"241":12,"242":9,"243":3,"249":2,"279":2,"281":2,"284":2,"302":1}}],["f",{"2":{"26":1,"27":2,"39":1,"48":1,"49":2,"61":1,"81":4,"84":1,"89":2,"93":2,"138":1,"139":1,"140":1,"141":1,"142":2,"143":1,"152":4,"156":2,"158":1,"239":2,"242":19,"243":1,"248":5,"249":9,"250":1,"284":1,"290":2,"303":1}}],["505468b及以后的lagrange",{"2":{"311":1}}],["59",{"2":{"247":1,"251":1}}],["55",{"2":{"196":1}}],["52",{"2":{"192":1}}],["51",{"2":{"186":1}}],["54",{"2":{"109":1}}],["5",{"2":{"24":1,"46":1,"137":1}}],["外部启动接口",{"2":{"23":2,"45":2}}],["kill",{"2":{"156":1}}],["k",{"2":{"83":4,"138":2,"242":2}}],["keyword",{"2":{"195":2}}],["keywords为城市名",{"2":{"317":2}}],["keywords",{"0":{"195":2},"2":{"195":5,"313":1,"317":2}}],["keyerror",{"2":{"122":1,"152":1}}],["keyvaluestore",{"0":{"118":1},"1":{"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1},"2":{"129":1}}],["keys",{"0":{"39":1,"61":1},"2":{"39":4,"61":4}}],["key",{"0":{"38":1,"39":1,"60":1,"61":1,"120":1,"121":1,"122":2},"2":{"38":4,"39":11,"60":4,"61":11,"120":7,"121":7,"122":13,"133":3,"134":3,"135":3,"138":2,"293":2,"311":4,"315":2,"317":1}}],["keyboardinterrupt",{"2":{"23":1,"24":1,"45":1,"46":1}}],["keep",{"0":{"24":1,"46":1},"2":{"22":1,"24":1,"44":1,"46":1}}],["kwargs=none",{"2":{"154":1}}],["kwargs=self",{"2":{"152":1}}],["kwargs",{"0":{"21":1,"28":1,"43":1,"50":1,"66":1,"108":1,"154":1},"2":{"21":4,"28":1,"43":4,"50":1,"66":3,"108":2,"154":5,"164":2,"287":2,"311":2}}],["echo",{"2":{"295":3}}],["emsp",{"2":{"242":4}}],["empty",{"0":{"194":1,"195":1,"203":1},"2":{"203":1,"248":1,"249":1}}],["email",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["enable",{"2":{"311":2,"312":1,"313":2,"314":2}}],["end",{"2":{"296":1}}],["endswith",{"2":{"142":3,"143":1,"240":1,"249":1,"303":1}}],["ensure",{"2":{"284":1}}],["enum",{"0":{"207":1,"253":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1,"254":1,"255":1,"256":1,"257":1,"258":1}}],["enumerate",{"2":{"193":1}}],["encoding=",{"2":{"139":1,"140":1,"141":1,"239":1,"241":1}}],["enforcing",{"2":{"81":1}}],["e",{"2":{"122":2,"248":1,"250":1,"284":2}}],["errors=true",{"2":{"243":1}}],["error",{"0":{"122":1},"2":{"122":4,"180":2,"284":1}}],["else",{"2":{"26":1,"27":1,"37":1,"48":1,"49":1,"59":1,"66":1,"81":1,"87":2,"88":1,"93":1,"95":1,"96":1,"120":1,"121":1,"122":1,"123":1,"125":2,"139":1,"140":1,"141":1,"152":1,"179":1,"180":5,"193":1,"241":9,"242":10,"243":2,"248":2,"284":1,"286":1}}],["elif",{"2":{"26":2,"48":2,"81":1,"83":3,"87":1,"142":4,"152":1,"241":5,"248":2,"249":1}}],["extensions",{"2":{"303":2}}],["extend",{"2":{"173":1}}],["extra",{"0":{"266":1}}],["exclude",{"2":{"303":2}}],["exc",{"2":{"190":1,"248":1}}],["exception模块包含了liteyuki运行中的所有错误",{"2":{"174":1}}],["exception",{"0":{"174":1},"1":{"175":1},"2":{"190":1,"248":1,"284":2}}],["except",{"2":{"23":1,"24":1,"45":1,"46":1,"122":1,"190":1,"248":1,"284":2}}],["executor",{"2":{"86":1}}],["executable",{"2":{"26":3,"48":3}}],["exist",{"2":{"249":1}}],["exists",{"2":{"81":2,"93":1,"142":1,"143":1,"239":1,"249":2}}],["exit",{"0":{"25":1,"47":1},"2":{"21":2,"25":2,"26":1,"43":2,"47":2,"48":1}}],["event装饰器监听文件系统事件",{"2":{"303":1}}],["events",{"2":{"303":1}}],["eventhandler",{"0":{"189":2},"2":{"188":1,"189":4}}],["event",{"0":{"101":1,"102":1,"166":1,"167":1,"168":1,"169":1,"170":2,"171":2,"181":1,"190":1,"202":1,"203":1,"204":1,"277":1},"1":{"102":1,"103":2,"182":1,"183":1,"184":1},"2":{"21":4,"24":1,"30":1,"43":4,"46":1,"52":1,"100":1,"101":1,"104":1,"166":1,"167":2,"168":2,"169":2,"170":3,"171":9,"181":1,"184":2,"190":5,"195":2,"200":3,"201":3,"202":2,"203":1,"204":2,"277":3,"284":2,"303":8}}],["信号处理",{"2":{"21":1,"25":2,"43":1,"47":2}}],["加载",{"2":{"314":1}}],["加载资源包",{"0":{"308":1},"2":{"313":1}}],["加载插件",{"0":{"304":1},"1":{"305":1,"306":1}}],["加载插件加载器",{"2":{"21":1,"43":1}}],["加载单个插件",{"2":{"248":2}}],["加入qq群775840726",{"2":{"7":1}}],["生成文档",{"2":{"243":2}}],["生成模块的markdown",{"2":{"242":2}}],["生命周期管理",{"2":{"21":1,"43":1}}],["生产环境中推荐反向websocket",{"2":{"3":1}}],["初始化通道",{"2":{"81":2,"111":2}}],["初始化轻雪",{"2":{"28":2,"50":2}}],["初始化轻雪实例",{"2":{"21":2,"43":2}}],["初始化",{"2":{"21":1,"43":1}}],["=none",{"2":{"27":1,"49":1,"81":1,"87":1,"121":1,"183":2}}],["==",{"2":{"26":3,"48":3,"89":1,"96":1,"97":2,"98":2,"99":1,"127":1,"132":1,"133":2,"134":2,"135":2,"136":1,"152":2,"179":1,"241":4,"242":2,"286":1}}],["=",{"0":{"26":1,"27":1,"38":1,"39":1,"48":1,"49":1,"60":1,"61":1,"81":1,"87":1,"121":1,"122":1,"130":1,"131":1,"142":1,"143":1,"144":1,"154":2,"171":2,"183":2,"194":3,"195":3,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"241":1,"242":2,"243":3,"249":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"21":7,"26":6,"27":2,"43":7,"48":6,"49":2,"65":7,"66":2,"81":10,"83":1,"84":1,"85":1,"86":2,"87":1,"89":2,"93":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":2,"107":1,"111":4,"119":6,"120":2,"121":2,"122":1,"123":1,"125":2,"127":1,"129":1,"133":3,"134":2,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":5,"151":3,"152":4,"154":5,"156":1,"164":3,"171":2,"173":4,"180":1,"183":10,"184":1,"188":5,"194":1,"199":1,"240":1,"241":17,"242":16,"243":13,"248":12,"249":6,"250":5,"283":1,"284":2,"286":1,"287":1,"290":5,"293":1,"302":1,"303":2}}],[">=",{"2":{"188":1}}],[">",{"2":{"21":1,"37":1,"38":1,"39":1,"43":1,"59":1,"60":1,"61":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"85":1,"86":1,"87":3,"95":1,"96":1,"107":1,"108":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":2,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"158":1,"164":1,"171":2,"179":1,"189":2,"190":1,"194":1,"195":1,"200":2,"201":2,"202":1,"203":1,"204":1,"238":1,"241":1,"242":3,"243":1,"246":1,"248":1,"249":1,"250":3,"275":1,"283":1,"286":2,"287":1,"317":2}}],["在群聊启用",{"2":{"311":1}}],["在普通图片和markdown大图之间切换",{"2":{"311":1}}],["在b中定义了templates",{"2":{"308":1}}],["在配置文件中的liteyuki",{"2":{"305":1}}],["在设备上执行命令",{"2":{"296":1}}],["在发信器输出",{"2":{"295":1}}],["在任意进程中均可使用",{"2":{"293":1}}],["在子进程中",{"2":{"290":1}}],["在轻雪插件中",{"2":{"290":1}}],["在新线程中运行协程",{"2":{"285":2}}],["在语言加载完成后执行",{"2":{"180":2}}],["在主进程中运行",{"2":{"127":2}}],["在github上查看",{"2":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["在安全模式下你可以使用npm",{"2":{"6":1}}],["或插件路径",{"2":{"248":2}}],["或",{"2":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"319":2}}],["源代码",{"2":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":2,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"293":1}}],["参考\`liteyuki",{"2":{"173":1}}],["参考liteyuki",{"2":{"173":1}}],["参考值",{"2":{"3":1}}],["参数列表",{"2":{"311":2}}],["参数为调用set",{"2":{"290":1}}],["参数",{"2":{"21":1,"25":1,"27":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"38":1,"39":1,"43":1,"47":1,"49":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"83":1,"84":1,"87":1,"88":1,"93":1,"94":1,"95":1,"111":1,"112":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"138":1,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"184":1,"188":1,"190":1,"238":1,"239":1,"241":1,"242":1,"243":1,"248":2,"249":2,"250":1,"283":1,"284":1,"285":1,"286":1,"287":1,"310":1,"319":1}}],["31",{"2":{"276":1}}],["34m",{"2":{"40":1,"62":1}}],["3",{"2":{"18":1,"137":1,"177":1,"249":1,"290":1}}],["6",{"2":{"18":1,"177":1}}],["测试版本号",{"2":{"18":1,"177":1}}],["至少1gb空间",{"2":{"15":1}}],["至少1vcpu",{"2":{"15":1}}],["硬盘",{"2":{"15":1}}],["及",{"2":{"15":1}}],["内存共享是线程安全的",{"2":{"292":1}}],["内存共享使得代码编写更加简洁",{"2":{"292":1}}],["内存",{"2":{"15":1,"309":1}}],["不带key返回配置项列表",{"2":{"311":1}}],["不包含任何隐私信息",{"2":{"309":1}}],["不含隐私部分",{"2":{"309":1}}],["不含插件数据",{"2":{"309":1}}],["不同adapter",{"2":{"298":1}}],["不同的实现端给出的字段可能不同",{"2":{"3":1}}],["不递归",{"2":{"143":2}}],["不要出现过多的嵌套",{"2":{"137":1}}],["不是liteyukibot官方提供的功能",{"2":{"14":1}}],["该功能需要commit",{"2":{"311":1}}],["该功能由trss提供支持",{"2":{"14":1}}],["该模块封装通道实现",{"2":{"292":1}}],["该模块用于存放一些开发工具",{"2":{"159":1,"160":1}}],["该模块用于常用配置文件的加载",{"2":{"137":1}}],["该模块用于轻雪主进程和nonebot子进程之间的通信",{"2":{"100":1,"104":1}}],["该步骤为必要项",{"2":{"12":1}}],["weather",{"0":{"317":1},"1":{"318":1},"2":{"317":1,"318":1}}],["world",{"2":{"295":5}}],["w",{"2":{"239":1}}],["write",{"0":{"239":1},"2":{"239":2,"243":1}}],["wrapper",{"0":{"287":1},"2":{"66":1,"87":2,"125":4,"154":1,"164":2,"171":2,"287":4}}],["watchdog",{"2":{"303":1,"306":1}}],["watch",{"2":{"302":1,"303":1}}],["walk",{"2":{"240":1,"241":1}}],["wait",{"0":{"164":1},"2":{"164":2}}],["waring=no",{"2":{"144":1}}],["waring",{"0":{"143":1,"144":1},"2":{"143":3,"144":3}}],["warning=no",{"2":{"143":1,"144":1}}],["warning",{"0":{"142":1,"249":1},"2":{"15":2,"39":1,"61":1,"89":1,"142":5,"143":1,"152":1,"156":1,"158":1,"180":2,"248":1,"249":9,"299":1,"314":1}}],["will",{"2":{"39":1,"61":1}}],["with",{"0":{"39":1,"61":1,"243":1},"2":{"39":1,"61":1,"120":1,"121":1,"122":1,"129":1,"239":1,"241":1,"242":5,"243":4}}],["windows",{"2":{"15":1,"26":1,"48":1}}],["windows系统版本最低windows10+",{"2":{"15":1}}],["windows请使用项目绝对目录",{"2":{"13":1}}],["while",{"2":{"24":1,"46":1,"85":1,"89":1,"127":1,"152":1,"290":2}}],["ws",{"2":{"3":2}}],["$$$$",{"2":{"40":1,"62":1}}],["$$$$$",{"2":{"40":1,"62":1}}],["$$$$$$$$",{"2":{"40":4,"62":4}}],["$$$$$$",{"2":{"40":5,"62":5}}],["$$",{"2":{"40":54,"62":54}}],["$",{"2":{"13":2}}],["构建镜像",{"2":{"13":1}}],["克隆项目",{"2":{"13":1}}],["克隆项目到本地",{"2":{"12":1}}],["使用通用日期简写",{"2":{"319":2}}],["使用此项目代表你已经同意以上协议",{"2":{"309":1}}],["使用开发工具快速运行插件",{"2":{"306":1}}],["使用",{"2":{"297":1}}],["使用新的task执行命令",{"2":{"296":1}}],["使用watchdog监控文件变化并重启bot",{"2":{"161":1}}],["使用trss",{"0":{"14":1}}],["使用docker构建",{"0":{"13":1}}],["使用其他项目连接请先自行查阅文档",{"2":{"9":1}}],["b包也定义了一个index",{"2":{"308":1}}],["block",{"0":{"188":1,"194":1,"195":1},"2":{"188":5,"194":2,"195":2}}],["blue>",{"2":{"180":1}}],["bases",{"2":{"241":1}}],["base",{"0":{"238":1},"2":{"238":4,"241":2}}],["basemodel",{"0":{"213":1,"221":1,"226":1,"232":1,"259":1,"267":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1}}],["baseexception",{"0":{"175":1}}],["bash",{"2":{"12":1}}],["break",{"2":{"152":1,"193":1}}],["b",{"2":{"138":3,"243":4,"286":4,"320":1}}],["body",{"2":{"241":1}}],["bool=false",{"2":{"142":1,"143":1,"144":1,"194":1,"195":1,"243":1}}],["bool=true",{"2":{"122":1,"171":1,"241":1,"249":1}}],["bool",{"0":{"81":1,"83":1,"122":1,"142":1,"143":1,"144":1,"158":1,"171":1,"188":1,"194":1,"195":1,"202":1,"203":1,"204":1,"220":1,"241":1,"243":1,"249":1,"283":1},"2":{"81":1,"83":3,"158":1,"163":1,"188":1,"197":1,"200":1,"201":1,"202":1,"203":1,"204":1,"283":3}}],["bot",{"0":{"19":1,"37":1,"41":1,"59":1,"63":1,"183":1},"1":{"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"21":2,"37":4,"38":1,"39":4,"43":2,"59":4,"60":1,"61":4,"173":2,"183":4,"184":2,"290":4,"295":1,"303":2,"311":1,"319":3,"320":1}}],["bot无其他插件会占用300~500mb",{"2":{"15":1}}],["be",{"2":{"39":1,"61":1,"84":1,"87":1,"93":1,"166":1}}],["before",{"0":{"31":1,"34":1,"35":1,"53":1,"56":1,"57":1,"67":1,"69":1,"71":1,"73":1,"75":1,"77":1},"2":{"22":1,"31":2,"34":2,"35":2,"44":1,"53":2,"56":2,"57":2,"65":3,"67":2,"69":2,"71":2,"73":3,"75":3,"77":3,"152":3}}],["build",{"2":{"13":1}}],["bind",{"2":{"318":1}}],["bin",{"2":{"12":1}}],["help",{"2":{"313":1,"314":1}}],["hello",{"2":{"295":5,"311":1}}],["html中用",{"2":{"308":1}}],["html",{"2":{"308":1}}],["html文件会被覆盖",{"2":{"308":1}}],["html文件",{"2":{"308":2}}],["https",{"2":{"12":1,"13":1}}],["homepage",{"0":{"265":1}}],["host",{"2":{"1":1}}],["hash",{"0":{"268":1},"2":{"268":2}}],["hasattr",{"2":{"82":1}}],["handlers",{"2":{"188":1,"189":1,"190":1}}],["handler",{"0":{"199":1},"2":{"171":3,"189":5,"190":2,"199":3,"200":4,"201":4,"202":2}}],["handle",{"0":{"25":1,"47":1,"189":1},"2":{"21":2,"25":1,"43":2,"47":1,"189":1,"276":1,"277":1}}],["hint",{"2":{"81":1,"241":1,"242":1}}],["环境",{"2":{"12":1}}],["和风天气的天气key",{"2":{"317":1}}],["和10是不一样的",{"2":{"311":1}}],["和config目录下的所有配置文件",{"2":{"144":2}}],["和",{"2":{"12":1,"311":1}}],["常规操作",{"2":{"21":1,"43":1}}],["常规部署",{"0":{"12":1}}],["常见问题",{"0":{"6":1}}],["安装插件",{"2":{"313":1}}],["安装的插件",{"2":{"248":2}}],["安装依赖",{"2":{"12":1}}],["安装",{"0":{"11":1},"1":{"12":1,"13":1,"14":1,"15":1,"16":1},"2":{"12":1,"13":1,"310":1,"314":1}}],["安全模式",{"2":{"2":1}}],["鸣谢",{"0":{"10":1}}],["然后运行python",{"2":{"306":1}}],["然后使用",{"2":{"12":1}}],["然后给轻雪传输数据",{"2":{"8":1}}],["然后用",{"2":{"6":1}}],["看着qq的消息",{"2":{"8":1}}],["人工实现的onebot协议",{"2":{"8":1}}],["需要在最后调用",{"2":{"296":1}}],["需要在对应进程都调度一次",{"2":{"89":2}}],["需要官方机器人权限",{"2":{"8":1}}],["需要安装ntqq",{"2":{"8":1}}],["g",{"2":{"250":1,"320":1}}],["group",{"2":{"183":2,"311":9,"312":1,"313":2,"319":3,"320":1}}],["green>",{"2":{"180":1}}],["gather",{"2":{"66":1,"284":1}}],["generate",{"0":{"242":1,"243":1},"2":{"242":1,"243":3}}],["generic",{"0":{"80":1,"82":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1},"2":{"81":2,"82":1,"84":1}}],["gensokyo",{"2":{"8":1}}],["getattr",{"2":{"283":1}}],["get",{"0":{"37":1,"38":1,"39":1,"59":1,"60":1,"61":1,"82":1,"95":1,"96":1,"98":1,"99":1,"121":1,"123":1,"129":1,"133":1,"136":1,"179":1,"238":1,"240":1,"241":1,"246":1,"275":1},"2":{"27":2,"37":2,"38":3,"39":5,"49":2,"59":2,"60":3,"61":5,"66":1,"81":2,"82":2,"84":1,"86":1,"95":2,"96":2,"97":1,"98":4,"99":3,"120":1,"121":4,"122":1,"123":2,"129":1,"132":1,"133":3,"135":1,"136":3,"152":1,"153":1,"173":1,"179":1,"180":2,"238":1,"240":1,"241":5,"243":3,"244":1,"246":1,"248":3,"249":1,"275":1,"279":2,"281":2,"284":1,"290":8,"293":1,"303":2,"311":3,"312":1,"315":2}}],["globalkeyvaluestore",{"0":{"128":1},"1":{"129":1,"130":1,"131":1}}],["global",{"2":{"21":1,"43":1,"87":1,"313":2,"314":2}}],["gt",{"0":{"21":1,"37":1,"38":1,"39":1,"43":1,"59":1,"60":1,"61":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"85":1,"86":1,"87":1,"95":1,"96":1,"107":1,"108":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"158":1,"171":1,"179":1,"189":1,"190":1,"194":1,"195":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"241":1,"242":1,"246":1,"248":1,"249":1,"250":1,"275":1,"283":1,"286":1,"287":1},"2":{"100":3,"104":3,"138":1,"188":1,"286":1,"310":1,"311":7,"313":10,"315":2}}],["github",{"2":{"12":1,"13":1}}],["git",{"2":{"12":2,"13":1}}],["golang",{"2":{"8":1}}],["go语言实现的onebot11实现端",{"2":{"8":1}}],["go",{"2":{"8":1}}],["occurred",{"2":{"284":1}}],["output",{"0":{"243":1},"2":{"243":6}}],["outlook",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["other",{"0":{"200":1,"201":1},"2":{"183":1,"200":2,"201":2}}],["observer",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"171":1,"303":2}}],["os",{"2":{"142":1,"143":3,"238":1,"239":4,"240":2,"241":1,"243":2,"249":9,"303":2}}],["of",{"2":{"84":1,"93":1,"248":1}}],["order",{"2":{"243":1}}],["or",{"0":{"200":1},"2":{"83":1,"200":2,"241":4}}],["orig",{"2":{"82":2}}],["only",{"2":{"87":1}}],["on",{"0":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"87":1,"88":1,"97":1,"98":1,"99":1,"107":2,"116":1,"117":1,"125":3,"133":1,"134":1,"135":1,"136":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"192":1,"194":1,"195":1},"1":{"193":1,"194":1,"195":1},"2":{"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":2,"87":4,"88":3,"89":3,"96":1,"97":3,"98":3,"99":2,"107":4,"108":1,"116":1,"117":1,"125":11,"126":1,"132":1,"133":3,"134":3,"135":3,"136":2,"166":2,"167":2,"168":2,"169":2,"170":2,"171":2,"192":1,"194":1,"195":4,"276":1,"277":1,"290":6,"303":1}}],["onebot",{"2":{"2":1,"3":1,"8":2,"298":1,"311":1}}],["option",{"2":{"310":1}}],["optional",{"0":{"27":1,"49":1,"81":1,"82":1,"87":1,"121":2,"183":2,"248":1,"273":1},"2":{"27":1,"49":1,"81":1,"82":3,"87":1,"119":2,"121":3,"183":2,"248":1}}],["opt",{"2":{"248":3}}],["open",{"2":{"26":1,"48":1,"139":1,"140":1,"141":1,"239":1,"241":1}}],["openshamrock",{"2":{"8":1}}],["基础插件",{"0":{"310":1},"1":{"311":1,"312":1,"313":1,"314":1,"315":1}}],["基础路径",{"2":{"238":2}}],["基础配置项",{"0":{"1":1}}],["基于ipc",{"2":{"105":1}}],["基于",{"2":{"8":1}}],["基于node",{"2":{"8":1}}],["基于ntqq的onebot实现",{"2":{"8":1}}],["基于lsposed的onebot11实现",{"2":{"8":1}}],["qq群号",{"2":{"319":1}}],["qq官方机器人api",{"2":{"8":1}}],["qq",{"0":{"8":1}}],["quot",{"2":{"3":2,"299":2,"311":2,"317":4}}],["推荐私聊使用",{"2":{"311":1}}],["推荐在编写html时同时更改对应js代码",{"2":{"307":1}}],["推荐ubuntu",{"2":{"15":1}}],["推荐使用arch",{"2":{"14":1}}],["推荐使用虚拟环境来运行轻雪",{"2":{"12":1}}],["推荐使用反向ws协议进行通信",{"2":{"3":1}}],["推荐方案",{"0":{"8":1,"9":1}}],["仍然出现问题",{"2":{"6":1}}],["将消息按照onebot标准处理好上报给轻雪",{"2":{"6":1}}],["提供",{"2":{"6":1}}],["登录功能由实现端",{"2":{"6":1}}],["本项目不会收集用户的任何隐私信息",{"2":{"309":1}}],["本项目不负责实现登录功能",{"2":{"6":1}}],["本项目遵循mit协议",{"2":{"309":1}}],["本模块用于实现rpc",{"2":{"105":1}}],["本模块定义了一个通用的通道类",{"2":{"79":1}}],["本机默认为127",{"2":{"3":1}}],["例如npm",{"2":{"310":1}}],["例如nonebot插件中",{"2":{"290":1}}],["例如你在a中定义了templates",{"2":{"308":1}}],["例如html",{"2":{"307":1}}],["例如main",{"2":{"306":1}}],["例如watchdog",{"2":{"302":1,"305":1}}],["例如",{"2":{"295":2,"308":1,"317":1}}],["例如test",{"2":{"295":1,"306":1}}],["例如子进程接收到用户信息需要重启机器人",{"2":{"289":1}}],["例如qq",{"2":{"6":1}}],["例如一个命令是help",{"2":{"6":1}}],["怎么登录聊天平台",{"2":{"6":1}}],["报错invalidgitrepositoryerror",{"2":{"6":1}}],["冲突",{"2":{"6":1}}],["确认插件必要配置项完好后",{"2":{"6":1}}],["确认命令头没有和nickname",{"2":{"6":1}}],["确认你有权限使用命令并按照正确的命令发送",{"2":{"6":1}}],["其中",{"2":{"6":1}}],["其他插件框架进程是伴随的子进程",{"2":{"289":1}}],["其他插件占用视具体插件而定",{"2":{"15":1}}],["其他插件自带的调试功能也将开启",{"2":{"2":1}}],["其他问题请移步至",{"0":{"16":1}}],["其他问题",{"0":{"7":1}}],["其他",{"0":{"4":1}}],["其他nonebot插件的配置项",{"2":{"2":1}}],["其他配置",{"0":{"2":1}}],["r>",{"2":{"248":2}}],["rv",{"2":{"243":2}}],["rk",{"2":{"243":2}}],["rmtree",{"2":{"243":1}}],["rpm",{"2":{"313":5,"314":1}}],["rp",{"2":{"239":4}}],["rpc",{"0":{"105":1,"106":1},"1":{"106":1,"107":2,"108":2},"2":{"100":1,"104":1}}],["rule=is",{"2":{"276":1,"277":1}}],["rule=empty",{"2":{"194":1,"195":1}}],["rulehandlerfunc",{"0":{"197":1,"199":1},"2":{"199":1}}],["rule",{"0":{"188":2,"194":3,"195":2,"196":1,"198":1,"200":2,"201":2,"203":1,"204":1},"1":{"197":1,"198":1,"199":2,"200":2,"201":2,"202":2,"203":1,"204":1},"2":{"188":6,"190":1,"194":3,"195":5,"196":1,"200":3,"201":3,"202":1,"203":3,"204":2,"276":1,"277":1}}],["running",{"2":{"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"86":1,"89":1,"119":2,"284":2}}],["runtimeerror",{"2":{"37":2,"59":2,"84":1,"85":1,"87":1,"125":1,"127":1,"284":1}}],["run",{"0":{"22":1,"23":1,"44":1,"45":1,"66":1,"88":1,"126":1,"152":1,"173":1,"190":1,"284":1,"285":1},"2":{"13":1,"22":1,"23":3,"44":1,"45":3,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"88":1,"89":1,"126":1,"127":1,"152":1,"153":1,"173":2,"190":1,"284":3,"285":1,"306":2}}],["raw",{"0":{"183":1},"2":{"183":4,"184":1,"195":1,"277":1}}],["raise",{"2":{"37":2,"59":2,"81":3,"84":2,"85":1,"87":1,"93":2,"122":1,"125":1,"127":1,"152":1,"166":1}}],["rights",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["root",{"2":{"13":1,"240":2}}],["readme",{"2":{"243":2}}],["read",{"2":{"241":1}}],["reload",{"2":{"311":1,"312":2,"313":1,"314":1}}],["reloading",{"2":{"303":1}}],["rel",{"2":{"243":4,"286":5}}],["relpath",{"2":{"238":1}}],["relative",{"0":{"238":1},"2":{"238":1,"243":1,"244":1,"286":1}}],["replace",{"2":{"241":3,"242":4,"243":8}}],["reply",{"0":{"184":1},"2":{"184":3,"277":1}}],["report设定为false",{"2":{"309":1}}],["report",{"2":{"1":1,"309":1}}],["red>",{"2":{"180":1}}],["remove",{"2":{"180":1}}],["ref",{"0":{"132":1}}],["required",{"2":{"81":1}}],["requirements",{"2":{"6":1,"12":1,"15":1}}],["recursive=recursive",{"2":{"171":1}}],["recursive",{"0":{"171":1},"2":{"171":3}}],["receive",{"0":{"85":1,"86":1,"87":1,"88":1,"89":1,"113":1,"116":1,"117":1,"125":3,"126":1,"127":1,"183":1},"2":{"81":3,"85":2,"86":2,"87":4,"88":3,"89":7,"95":1,"96":2,"97":2,"98":2,"99":1,"113":1,"116":1,"117":1,"119":2,"121":1,"123":1,"125":11,"126":2,"127":4,"132":1,"133":2,"134":2,"135":2,"136":1,"152":1,"153":2,"183":4,"184":3,"290":11}}],["received",{"2":{"25":1,"47":1,"152":1}}],["recv",{"2":{"81":2,"85":2,"95":5,"96":5,"98":3,"99":3,"111":1,"121":5,"123":5,"133":3,"136":3}}],["resources",{"2":{"307":1,"308":1,"312":1}}],["resolve",{"2":{"286":2}}],["reserved",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["restarting",{"2":{"26":1,"48":1,"152":1}}],["restart",{"0":{"26":1,"27":1,"35":1,"36":1,"48":1,"49":1,"57":1,"58":1,"71":1,"72":1,"77":1,"78":1},"2":{"21":1,"26":3,"27":1,"35":2,"36":2,"43":1,"48":3,"49":1,"57":2,"58":2,"65":2,"71":2,"72":2,"77":3,"78":3,"152":1,"303":2}}],["return",{"0":{"216":1},"2":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":3,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":3,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"82":2,"83":8,"85":1,"86":1,"87":6,"89":1,"95":2,"96":2,"108":1,"121":2,"123":2,"125":2,"129":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"156":1,"158":1,"164":3,"171":3,"179":2,"189":2,"190":1,"194":1,"195":2,"200":2,"201":2,"202":2,"203":1,"204":1,"238":1,"240":1,"241":3,"242":3,"246":1,"248":2,"249":1,"250":1,"268":1,"275":1,"283":3,"286":2,"287":2}}],["returns",{"2":{"24":1,"25":1,"26":1,"27":1,"28":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"46":1,"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"82":1,"83":1,"87":1,"95":1,"96":1,"113":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"152":1,"156":1,"158":1,"171":1,"180":1,"184":1,"189":1,"190":1,"241":5,"242":1,"246":1,"250":1,"275":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["registered",{"2":{"89":1}}],["register",{"2":{"21":1,"43":1}}],["r",{"2":{"6":1,"12":1,"15":1,"139":1,"140":1,"141":1,"241":1}}],["msg",{"2":{"311":1}}],["mcfunction",{"2":{"295":2}}],["mkdir",{"2":{"243":1}}],["mkdoc",{"0":{"206":1},"1":{"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1},"2":{"206":1}}],["md",{"2":{"243":15}}],["member",{"2":{"311":1}}],["memory",{"2":{"119":3,"132":1,"133":3,"134":3,"135":3,"136":2,"153":1,"154":1,"293":3}}],["meta",{"2":{"248":4,"302":1}}],["metadata",{"0":{"273":1},"2":{"248":13}}],["methods=",{"2":{"241":1}}],["methods",{"0":{"229":1},"2":{"241":1,"242":1}}],["method",{"0":{"209":2,"210":1,"211":1},"2":{"241":5,"242":13}}],["message=",{"2":{"184":1,"311":1}}],["message=message",{"2":{"184":1}}],["messageevent",{"0":{"182":1,"183":1,"190":1,"202":1,"203":1,"204":1,"277":1},"1":{"183":1,"184":1},"2":{"183":1,"184":1,"190":1,"195":1,"197":1,"200":1,"201":1,"202":1,"203":1,"204":1,"277":1}}],["message",{"0":{"181":1,"183":3,"184":1,"185":1,"186":1,"191":1,"192":1,"194":1,"196":1,"205":1},"1":{"182":1,"183":1,"184":1,"187":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"183":12,"184":6,"194":1,"195":2,"277":1,"319":1,"320":1}}],["moved",{"0":{"169":1},"2":{"169":1}}],["moduletype",{"0":{"271":1}}],["module=module",{"2":{"248":1}}],["moduleinfo",{"0":{"232":1,"241":1,"242":1},"1":{"233":1,"234":1,"235":1,"236":1,"237":1},"2":{"241":2,"242":1}}],["module",{"0":{"173":1,"233":1,"240":1,"241":1,"242":1,"243":1,"244":1,"248":1,"256":2,"271":1,"272":1,"286":1},"2":{"173":4,"240":2,"241":11,"242":6,"243":26,"244":1,"248":27,"249":9,"250":1,"268":1,"286":1}}],["modified",{"0":{"166":1},"2":{"166":2,"167":1,"168":1,"169":1,"170":1,"171":4}}],["model",{"0":{"252":1,"269":1},"1":{"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"252":1}}],["mode为true",{"2":{"161":1}}],["mode",{"2":{"2":2,"6":1,"311":2,"312":1}}],["must",{"2":{"84":1,"93":1,"166":1}}],["match",{"2":{"250":1}}],["matcher",{"0":{"186":1,"187":1,"193":3,"194":1,"195":1},"1":{"187":1,"188":2,"189":2,"190":2},"2":{"186":1,"193":9,"194":6,"195":1}}],["matter=none",{"2":{"242":1}}],["matter",{"0":{"242":1},"2":{"242":5,"243":3}}],["markdown",{"0":{"242":1},"2":{"242":3,"243":1}}],["makedirs",{"2":{"239":1}}],["manually",{"2":{"81":1}}],["manager",{"0":{"147":1,"251":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"21":2,"22":1,"26":1,"27":1,"43":2,"44":1,"48":1,"49":1,"147":1,"251":1}}],["maplemono提供的字体",{"2":{"10":1}}],["mainprocess",{"2":{"289":1}}],["main",{"0":{"116":1},"2":{"6":1,"12":1,"37":1,"59":1,"81":4,"87":4,"88":2,"89":1,"93":1,"95":1,"96":1,"119":1,"120":1,"121":1,"122":1,"123":1,"125":5,"126":1,"127":1,"290":6,"306":1}}],["misans",{"2":{"10":1}}],["minecraftonebot",{"2":{"9":1}}],["minecraft",{"0":{"9":1}}],["m",{"2":{"6":1,"12":1,"15":1,"193":2,"250":1,"320":1}}],["答疑",{"0":{"5":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1}}],["要使用其他通信方式请访问onebot",{"2":{"3":1}}],["如果你接触过minecraft的资源包",{"2":{"307":1}}],["如果你想同时输出多行内容可以尝试换行符",{"2":{"295":1}}],["如果你没有安装git直接下载源代码运行",{"2":{"15":1}}],["如果你给轻雪配置了accesstoken",{"2":{"3":1}}],["如果装置上有多个环境",{"2":{"15":1}}],["如需自定义请手动添加",{"2":{"2":1}}],["version=",{"2":{"302":1}}],["version",{"0":{"18":1,"177":1},"2":{"308":1}}],["venv来创建虚拟环境",{"2":{"12":1}}],["venv",{"2":{"12":3}}],["validate",{"0":{"83":1},"2":{"83":4,"84":1}}],["value=ast",{"2":{"241":1}}],["values",{"2":{"153":1}}],["value",{"0":{"120":1,"224":1},"2":{"120":6,"134":3,"138":3,"241":6,"242":3,"293":2,"311":2,"315":1}}],["valueerror",{"2":{"81":2,"93":1}}],["value2",{"2":{"2":1}}],["value1",{"2":{"2":1}}],["var=value",{"2":{"296":1}}],["var2=value2",{"2":{"296":1}}],["var1=value1>",{"2":{"296":1}}],["var",{"0":{"18":1,"90":1,"91":1,"92":1,"116":1,"117":1,"132":1,"162":1,"163":1,"177":1,"197":1,"244":1},"2":{"242":2}}],["v",{"2":{"13":2,"138":2,"242":2}}],["v11协议api",{"2":{"311":2}}],["v11",{"2":{"3":1,"298":1}}],["地址取决于配置文件",{"2":{"3":1}}],["地址",{"2":{"3":1}}],["反向websocket",{"2":{"3":1}}],["协议端",{"2":{"6":1}}],["协议",{"2":{"3":1}}],["说明",{"2":{"3":1,"18":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"63":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"100":1,"101":1,"104":1,"105":1,"108":1,"109":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"132":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"147":1,"152":1,"153":1,"154":1,"156":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"171":1,"172":1,"173":1,"174":1,"177":1,"178":1,"180":1,"181":1,"183":1,"184":1,"185":1,"186":1,"188":1,"189":1,"190":1,"191":1,"192":1,"196":1,"197":1,"205":1,"206":1,"238":1,"239":1,"241":1,"242":1,"243":1,"244":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"275":1,"276":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"311":1,"313":2,"315":1}}],["与nonebot对接的onebot实现端配置",{"0":{"3":1}}],["示例",{"0":{"3":1,"290":1,"293":1,"297":1}}],["监听目录们",{"2":{"171":2}}],["监听地址",{"2":{"1":1}}],["监视文件变化并自动重载",{"2":{"2":1}}],["开始",{"0":{"301":1},"1":{"302":1,"303":1,"304":1,"305":1,"306":1}}],["开始接收数据",{"2":{"89":2}}],["开发者模式",{"2":{"2":1}}],["开发者选项",{"2":{"2":1}}],["开启后自动监控进程",{"2":{"152":2}}],["开启后将会启动监视者",{"2":{"2":1}}],["开启后将不会加载任何第三方nonebot插件",{"2":{"2":1}}],["开启会自动重载bot或者资源",{"2":{"2":1}}],["2s戳两次",{"2":{"297":1}}],["22",{"2":{"276":1}}],["27",{"2":{"147":1,"178":1}}],["25",{"2":{"109":1}}],["21",{"2":{"79":1}}],["26",{"2":{"79":1,"101":1}}],["24",{"2":{"63":1,"252":1}}],["23",{"2":{"63":1,"206":1,"247":1,"251":1}}],["20代替空格",{"2":{"311":1}}],["20和end",{"2":{"297":1}}],["2024",{"2":{"63":2,"79":2,"101":2,"109":2,"147":2,"172":2,"178":2,"181":2,"185":2,"186":2,"191":2,"192":2,"196":2,"205":2,"206":2,"247":2,"251":2,"252":2,"276":2,"278":2,"280":2}}],["2020",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["20216中的20216替换为你的端口号",{"2":{"13":1}}],["20216",{"2":{"1":1,"3":2,"13":2}}],["20",{"2":{"15":1}}],["2019+",{"2":{"15":1}}],["2",{"2":{"2":1,"137":1,"152":1,"297":1,"308":1}}],["建议1gb以上",{"2":{"15":1}}],["建议开启",{"2":{"2":1}}],["建议迁移到liteyuki下",{"2":{"1":1}}],["默认普通图片",{"2":{"311":1}}],["默认开启",{"2":{"309":1}}],["默认插件加载器",{"2":{"279":2,"281":2}}],["默认执行扁平化选项",{"2":{"142":2,"143":2}}],["默认为none",{"2":{"27":2,"49":2}}],["默认为本机",{"2":{"1":1}}],["默认值",{"2":{"18":1,"38":2,"39":2,"60":2,"61":2,"90":1,"91":1,"92":1,"116":1,"117":1,"121":2,"132":1,"162":1,"163":1,"177":1,"197":1,"244":1}}],["默认false",{"2":{"2":1}}],["默认语言",{"2":{"2":1}}],["city",{"2":{"317":1,"318":1}}],["css相对路径引用b中的css",{"2":{"308":1}}],["css",{"2":{"307":1,"308":1}}],["cwd",{"2":{"286":1}}],["cfg",{"2":{"173":4}}],["current|bot",{"2":{"319":1}}],["current|group",{"2":{"319":1}}],["current",{"2":{"164":3,"319":2,"320":1}}],["custom",{"2":{"2":4}}],["created",{"0":{"167":1},"2":{"167":1}}],["create",{"2":{"88":2,"126":1,"153":3}}],["child",{"2":{"241":2}}],["check",{"0":{"81":1},"2":{"81":9,"84":1}}],["change",{"2":{"313":1,"314":1}}],["changed",{"2":{"303":1}}],["channel时的通道标识",{"2":{"290":1}}],["channel即可",{"2":{"290":1}}],["channel及passive",{"2":{"290":1}}],["channel函数获取通道对象",{"2":{"290":2}}],["channel=none",{"2":{"184":1}}],["channeldeliver",{"0":{"148":1},"1":{"149":1},"2":{"154":1}}],["channelv2",{"2":{"109":1}}],["channels",{"0":{"94":2,"96":1,"99":1},"2":{"94":5,"96":2,"98":1,"99":3,"153":1}}],["channel",{"0":{"79":1,"80":1,"90":1,"91":1,"92":2,"93":3,"94":1,"95":2,"96":1,"97":1,"98":1,"109":1,"124":1,"125":1,"126":1,"149":8,"183":2},"1":{"80":1,"81":2,"82":2,"83":2,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"110":1,"111":1,"112":1,"113":1,"114":1},"2":{"27":2,"49":2,"79":1,"81":7,"84":1,"85":1,"90":3,"91":3,"92":2,"93":19,"94":4,"95":8,"96":9,"97":11,"98":7,"99":2,"100":2,"104":2,"119":4,"121":1,"123":1,"124":5,"125":9,"126":4,"127":2,"149":12,"152":1,"154":12,"183":5,"184":2,"290":12}}],["chan",{"2":{"27":4,"49":4,"95":5,"96":5,"98":3,"99":3,"119":2,"120":1,"121":6,"122":1,"123":6,"124":1,"127":1,"132":1,"133":5,"134":2,"135":2,"136":4,"152":2,"153":2,"154":2}}],["c",{"2":{"63":1,"79":1,"101":1,"109":1,"138":3,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"250":1,"251":1,"252":1,"276":1,"278":1,"280":1,"284":4,"286":4,"320":1}}],["cmd",{"2":{"26":5,"48":5,"295":2,"296":1}}],["case",{"2":{"250":4}}],["category",{"2":{"242":2,"243":2}}],["cannot",{"2":{"84":1,"85":1,"125":1,"127":1}}],["can",{"2":{"37":1,"59":1,"87":1}}],["calling",{"0":{"107":2},"2":{"107":4,"108":1}}],["callback",{"0":{"162":1,"171":2},"2":{"87":1,"88":2,"171":4}}],["callable",{"0":{"87":3,"125":1,"171":1,"189":1,"283":2,"287":2},"2":{"66":1,"87":7,"125":2,"151":1,"162":1,"163":1,"171":1,"189":1,"197":1,"283":2,"287":6}}],["call",{"0":{"108":1,"202":1,"283":1},"2":{"21":1,"26":2,"43":1,"48":2,"108":1,"164":4,"202":1,"283":8}}],["cache",{"2":{"13":2}}],["cls",{"0":{"129":1},"2":{"129":6,"241":1,"242":11}}],["close",{"0":{"114":1},"2":{"114":1,"284":1}}],["closed",{"2":{"81":1,"84":2,"85":2,"89":1,"111":1}}],["clone",{"2":{"12":1,"13":1}}],["classdef",{"2":{"241":3}}],["classes=",{"2":{"241":1}}],["classes",{"0":{"235":1},"2":{"241":1,"242":1}}],["classinfo",{"0":{"226":1,"235":1},"1":{"227":1,"228":1,"229":1,"230":1,"231":1},"2":{"241":1}}],["classmethod",{"0":{"211":1},"2":{"128":1,"129":1,"241":1}}],["class",{"0":{"20":1,"42":1,"64":1,"80":1,"102":1,"106":1,"110":1,"118":1,"128":1,"148":1,"150":1,"165":1,"175":1,"182":1,"187":1,"198":1,"207":1,"211":1,"213":1,"221":1,"226":1,"232":1,"253":1,"259":1,"267":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"130":1,"131":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"166":1,"167":1,"168":1,"169":1,"170":1,"183":1,"184":1,"188":1,"189":1,"190":1,"199":1,"200":1,"201":1,"202":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"82":2,"241":24,"242":2}}],["cpu",{"2":{"15":1,"309":1}}],["centos",{"2":{"15":1}}],["cd",{"2":{"12":1,"13":1}}],["cqhttp",{"2":{"8":1}}],["color",{"2":{"250":7}}],["colors=true",{"2":{"248":3}}],["color=",{"2":{"180":5}}],["code插件liteyuki",{"2":{"299":1}}],["code=ast",{"2":{"241":2}}],["code",{"0":{"218":1},"2":{"171":3,"242":6,"243":2}}],["codemodifiedhandler",{"0":{"165":1},"1":{"166":1,"167":1,"168":1,"169":1,"170":1},"2":{"171":1}}],["coro",{"0":{"284":1,"285":1},"2":{"284":6,"285":3}}],["coroutine",{"0":{"283":1,"284":2,"285":2,"287":1},"2":{"66":1,"87":2,"125":1,"197":1,"283":1,"284":2,"285":3,"287":3}}],["core",{"0":{"145":1,"146":1,"147":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1}}],["copy",{"2":{"138":1}}],["copyright",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["content",{"2":{"241":2,"242":17,"243":2}}],["continue",{"2":{"143":1,"152":1,"241":1,"243":1,"249":3}}],["conn",{"2":{"81":4,"84":1,"85":1,"111":2}}],["configs",{"0":{"143":1},"2":{"143":1,"144":1}}],["config=self",{"2":{"29":1,"51":1}}],["config",{"0":{"38":1,"39":1,"60":1,"61":1,"137":1,"138":2,"144":1,"180":1,"269":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1},"2":{"2":2,"21":2,"29":1,"38":2,"39":6,"43":2,"51":1,"60":2,"61":6,"138":10,"139":7,"140":7,"141":7,"142":7,"143":4,"144":9,"173":1,"180":3,"279":2,"281":2,"311":4,"312":1}}],["count",{"0":{"132":1},"2":{"21":1,"26":2,"43":1,"48":2}}],["combined",{"2":{"200":2,"201":2}}],["comm",{"0":{"79":1,"100":1,"101":1,"104":1,"105":1,"109":1,"115":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"106":1,"107":1,"108":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"290":2,"293":2}}],["command>",{"2":{"296":2}}],["command",{"0":{"311":1},"1":{"312":1},"2":{"1":2}}],["complete",{"2":{"284":2}}],["completion",{"2":{"2":1}}],["compat",{"0":{"39":2,"61":2},"2":{"39":9,"61":9}}],["com",{"2":{"12":1,"13":1,"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["cn",{"0":{"242":1,"243":1},"2":{"2":1,"242":2,"243":1}}],["duration>",{"2":{"319":1}}],["duration",{"2":{"319":2,"320":1}}],["driver",{"2":{"290":4}}],["dog",{"2":{"302":1,"303":1}}],["does",{"2":{"249":1}}],["dot",{"2":{"241":1}}],["docs",{"0":{"243":1},"2":{"243":5,"311":1,"312":1}}],["docstring=method",{"2":{"241":1}}],["docstring=module",{"2":{"241":1}}],["docstring=class",{"2":{"241":1}}],["docstring=function",{"2":{"241":1}}],["docstring",{"0":{"217":1,"225":1,"228":1,"237":1},"2":{"241":16,"242":12}}],["docker",{"2":{"13":3}}],["d",{"2":{"83":4,"132":2,"133":4,"134":4,"135":4,"136":2,"286":4,"320":1}}],["daemon=true",{"2":{"152":1,"285":1}}],["data=",{"2":{"184":1}}],["data",{"0":{"83":1,"84":1,"88":1,"97":1,"98":1,"99":1,"103":1,"112":1,"124":1,"126":1,"133":1,"134":1,"135":1,"136":1,"183":1,"239":1},"2":{"83":12,"84":7,"85":2,"86":2,"87":5,"88":5,"89":2,"96":2,"97":7,"98":7,"99":4,"103":3,"112":3,"113":2,"124":5,"125":3,"126":4,"127":6,"133":4,"134":3,"135":2,"136":2,"152":4,"183":7,"239":6,"243":5,"290":7}}],["darwin",{"2":{"26":1,"48":1}}],["disable",{"2":{"311":1,"312":1,"313":2,"314":2}}],["display",{"0":{"250":2},"2":{"248":7,"250":5}}],["diagnose=false",{"2":{"180":1}}],["dir",{"0":{"243":1,"249":1},"2":{"243":6,"249":17,"279":2,"281":2}}],["dirname",{"2":{"239":2}}],["directory",{"2":{"143":6,"171":2,"249":1}}],["directories=",{"2":{"303":1}}],["directories",{"0":{"143":1,"171":1},"2":{"143":2,"171":4}}],["dirs",{"0":{"143":1},"2":{"1":1,"143":1,"144":1,"240":1,"279":1,"281":1}}],["dict",{"0":{"94":1,"96":1,"97":1,"98":1,"99":1,"103":1,"108":1,"123":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"180":1,"183":2,"184":1,"239":1,"246":1,"266":1,"275":1},"2":{"21":1,"43":1,"83":2,"91":1,"94":1,"96":2,"97":1,"98":1,"99":1,"103":1,"108":1,"116":1,"117":1,"119":2,"123":4,"133":1,"134":1,"135":1,"136":1,"138":3,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":3,"180":1,"183":3,"184":1,"239":1,"243":1,"246":3,"248":6,"275":3}}],["description=",{"2":{"302":1}}],["description",{"0":{"261":1},"2":{"308":1}}],["details>",{"2":{"242":4}}],["debounce",{"0":{"164":1},"2":{"164":1,"165":1,"166":1}}],["debug",{"2":{"2":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":2,"89":1,"139":1,"140":1,"141":1,"179":2,"180":2,"303":1}}],["deepcopy",{"2":{"138":1}}],["del",{"2":{"122":2}}],["deleted",{"0":{"168":1},"2":{"168":1}}],["delete",{"0":{"122":1,"135":1},"2":{"122":2,"134":1,"135":3}}],["delivery",{"2":{"154":1}}],["deliver",{"0":{"92":1,"149":2},"2":{"93":1,"95":1,"96":2,"97":2,"98":2,"99":1,"149":6,"154":6}}],["delay",{"0":{"26":1,"48":1},"2":{"26":2,"48":2}}],["decorator",{"2":{"87":2,"125":2,"164":2,"171":2,"189":2,"241":13}}],["deprecated",{"2":{"39":1,"61":1}}],["depth=1",{"2":{"12":1,"13":1}}],["deftype",{"0":{"207":1,"219":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1},"2":{"241":4,"242":1}}],["def",{"0":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1},"2":{"22":1,"24":1,"44":1,"46":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"87":2,"88":1,"89":1,"97":1,"98":1,"99":1,"125":2,"126":1,"127":1,"129":1,"133":1,"134":1,"135":1,"136":1,"152":2,"153":1,"164":2,"166":1,"171":2,"189":1,"190":1,"195":1,"200":1,"201":1,"202":1,"203":1,"204":1,"241":4,"242":2,"277":1,"287":1,"290":3,"303":1}}],["default",{"0":{"38":1,"39":1,"60":1,"61":1,"121":1,"144":1,"214":1,"215":1,"216":1,"217":1,"219":1,"220":1,"222":1,"223":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"260":1,"270":1,"271":1,"272":1,"279":1,"281":1},"2":{"2":1,"38":4,"39":4,"60":4,"61":4,"92":1,"121":6,"133":3,"144":1,"173":1,"179":1,"279":1,"281":1}}],["developer",{"2":{"302":1}}],["dev",{"0":{"159":1,"160":1,"161":1,"172":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1},"2":{"2":1,"303":1,"306":1}}],["访问令牌",{"2":{"2":1}}],["a包中的index",{"2":{"308":1}}],["am",{"2":{"290":6}}],["arbitrary",{"0":{"269":1}}],["arg",{"2":{"241":13,"242":16}}],["argv",{"2":{"26":1,"48":1}}],["args=coro",{"2":{"285":1}}],["args=self",{"2":{"152":1}}],["args=",{"2":{"26":1,"48":1,"241":2}}],["args",{"0":{"21":1,"28":1,"43":1,"50":1,"66":1,"108":1,"154":1,"215":1},"2":{"21":4,"25":1,"26":2,"27":1,"28":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"38":1,"39":1,"43":4,"47":1,"48":2,"49":1,"50":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"60":1,"61":1,"66":4,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"88":1,"93":1,"94":1,"95":1,"108":2,"111":1,"112":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"138":1,"152":1,"154":5,"156":1,"158":1,"164":2,"171":1,"173":1,"183":1,"184":1,"188":1,"190":1,"238":1,"239":1,"241":9,"242":9,"243":1,"250":1,"283":1,"284":1,"285":1,"286":1,"287":3,"311":4}}],["abs",{"2":{"243":4}}],["application",{"0":{"254":2},"2":{"250":1}}],["append",{"2":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"87":2,"125":2,"189":1,"193":1,"240":1,"241":5}}],["api格式为onebot",{"2":{"311":1}}],["api文档",{"2":{"298":1}}],["api也有差别",{"2":{"298":1}}],["api",{"0":{"298":1},"2":{"243":10,"296":3,"297":2,"311":3}}],["add",{"0":{"154":1,"193":1},"2":{"154":1,"180":1,"193":1,"194":1,"249":1}}],["adapter获取详细信息",{"2":{"3":1}}],["attributes=",{"2":{"241":2}}],["attributes",{"0":{"230":1,"236":1},"2":{"241":2,"242":2}}],["attributeinfo",{"0":{"221":1,"230":1,"236":1},"1":{"222":1,"223":1,"224":1,"225":1},"2":{"241":2}}],["attr",{"0":{"130":1,"131":1,"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"254":1,"255":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"241":2,"242":14}}],["atexit",{"2":{"21":1,"43":1}}],["assign",{"2":{"241":2}}],["ast",{"2":{"241":29}}],["as",{"2":{"122":1,"239":1,"241":1,"248":1,"284":1}}],["asynchronous",{"2":{"287":2}}],["async=isinstance",{"2":{"241":2}}],["asyncfunctiondef",{"2":{"241":3}}],["async",{"0":{"22":1,"24":1,"44":1,"46":1,"66":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":2,"88":1,"89":1,"126":1,"127":1,"152":1,"153":1,"190":1,"202":1,"203":1,"204":1,"220":1,"277":1,"287":1},"2":{"66":3,"86":1,"87":1,"89":1,"116":1,"117":1,"125":1,"126":1,"127":1,"152":1,"195":1,"200":1,"201":1,"203":1,"204":1,"242":4,"277":1,"287":2,"290":2}}],["asyncio",{"2":{"21":2,"23":1,"43":2,"45":1,"66":2,"86":1,"88":2,"126":1,"153":3,"284":5,"290":2}}],["a",{"2":{"84":1,"85":1,"138":3,"243":4,"249":1,"286":2,"302":1}}],["annassign",{"2":{"241":1}}],["annotation",{"2":{"241":6}}],["an",{"2":{"84":1,"93":1}}],["and",{"0":{"201":1},"2":{"83":1,"84":1,"171":1,"201":2,"241":7,"242":1,"249":3,"303":2}}],["any=none",{"2":{"38":1,"39":1,"60":1,"61":1}}],["any",{"0":{"38":2,"39":2,"60":2,"61":2,"83":1,"87":2,"88":1,"97":1,"98":1,"99":1,"103":1,"108":1,"120":1,"121":2,"123":1,"124":1,"126":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":4,"170":1,"183":2,"184":1,"224":1,"266":1,"283":1,"287":1},"2":{"21":1,"38":3,"39":3,"43":1,"60":3,"61":3,"83":1,"87":5,"88":1,"91":1,"92":1,"95":1,"96":1,"97":1,"98":1,"99":1,"103":1,"108":1,"119":3,"120":1,"121":5,"123":4,"124":1,"125":1,"126":1,"133":1,"134":1,"135":1,"136":1,"138":2,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":4,"170":1,"183":3,"184":1,"195":1,"241":7,"243":1,"283":1,"287":1}}],["author",{"0":{"264":1},"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["auto",{"2":{"1":2,"2":1}}],["after",{"0":{"32":1,"33":1,"36":1,"54":1,"55":1,"58":1,"68":1,"70":1,"72":1,"74":1,"76":1,"78":1},"2":{"22":1,"32":2,"33":2,"36":2,"44":1,"54":2,"55":2,"58":2,"65":3,"68":2,"70":2,"72":2,"74":3,"76":3,"78":3,"290":1}}],["await",{"2":{"22":4,"44":4,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"87":2,"89":2,"125":1,"127":2,"152":4,"190":2,"200":2,"201":2,"202":1,"290":1,"296":1,"297":1,"299":1}}],["active和",{"2":{"290":1}}],["active和chan",{"2":{"154":2}}],["active=channel",{"2":{"154":1}}],["active=chan",{"2":{"154":1}}],["active",{"0":{"90":1,"92":1,"149":2},"2":{"27":6,"49":6,"90":1,"119":2,"124":1,"127":1,"149":6,"152":3,"154":4,"290":11}}],["activate激活",{"2":{"12":1}}],["activate来激活虚拟环境",{"2":{"12":1}}],["accesstoken",{"2":{"3":1}}],["access",{"2":{"2":1}}],["already",{"2":{"81":2,"93":1}}],["alive",{"0":{"24":1,"46":1,"158":1},"2":{"22":1,"24":1,"44":1,"46":1,"156":1,"158":2}}],["all",{"0":{"123":1,"136":1,"153":1,"155":1,"157":1},"2":{"21":1,"22":1,"25":1,"26":1,"43":1,"44":1,"47":1,"48":1,"63":1,"79":1,"83":3,"101":1,"109":1,"123":2,"135":1,"136":3,"147":1,"153":1,"155":1,"157":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["allowed",{"0":{"269":1}}],["allow",{"2":{"2":1}}],["alconna提供的命令解析功能",{"2":{"10":1}}],["alconna是否自动补全指令",{"2":{"2":1}}],["alconna",{"2":{"2":1}}],["高级nonebot配置",{"2":{"2":1}}],["以上内容仅用于项目的优化",{"2":{"309":1}}],["以避免出现无法预料的问题",{"2":{"307":1}}],["以避免依赖冲突",{"2":{"12":1}}],["以下我们会编写一个简单的插件",{"2":{"303":1}}],["以下为默认值",{"2":{"2":1}}],["以前的最外层配置项仍可为nonebot服务",{"2":{"1":1}}],["period\`",{"2":{"320":1}}],["period>",{"2":{"319":1}}],["period",{"2":{"319":2}}],["poke",{"2":{"297":4}}],["port",{"2":{"1":1}}],["page为页数",{"2":{"313":2}}],["page",{"2":{"313":2}}],["pacman",{"0":{"313":1},"1":{"314":1}}],["pack",{"2":{"308":2,"313":3}}],["param",{"2":{"310":1}}],["parts",{"2":{"286":2}}],["parent",{"2":{"241":4}}],["parse",{"2":{"241":1}}],["pass",{"2":{"112":1,"113":1,"114":1}}],["passive=channel",{"2":{"154":1}}],["passive=chan",{"2":{"154":1}}],["passive",{"0":{"149":2},"2":{"93":1,"95":1,"96":2,"97":2,"98":2,"99":1,"119":2,"120":1,"121":1,"122":1,"123":1,"132":1,"133":2,"134":2,"135":2,"136":1,"149":6,"154":6,"290":13}}],["pathlib",{"2":{"248":1}}],["paths=none",{"2":{"243":1}}],["paths",{"0":{"243":1},"2":{"243":5}}],["path=dot",{"2":{"241":1}}],["path",{"0":{"173":2,"233":1,"238":3,"241":1,"244":1,"248":2,"286":3},"2":{"6":3,"13":1,"15":1,"142":1,"143":2,"173":5,"238":10,"239":3,"240":1,"241":7,"243":22,"244":2,"248":19,"249":26,"286":12,"303":5}}],["publish=publish",{"2":{"154":1}}],["publish",{"0":{"91":1,"124":1,"149":1},"2":{"91":1,"119":2,"124":2,"127":2,"149":3}}],["profile",{"2":{"315":4}}],["property",{"0":{"212":2},"2":{"241":2}}],["processes",{"2":{"25":1,"27":1,"47":1,"49":1,"151":1,"152":1,"156":2,"158":1}}],["processmanager",{"0":{"150":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"21":2,"43":2}}],["process",{"0":{"27":1,"34":1,"35":1,"49":1,"56":1,"57":1,"66":1,"69":1,"71":1,"75":1,"77":1,"152":1,"158":1},"2":{"21":2,"22":1,"26":1,"27":4,"34":2,"35":2,"37":2,"43":2,"44":1,"48":1,"49":4,"56":2,"57":2,"59":2,"65":2,"66":1,"69":2,"71":2,"75":2,"77":2,"81":4,"87":3,"88":1,"93":1,"95":1,"96":1,"120":1,"121":1,"122":1,"123":1,"125":3,"127":2,"151":1,"152":14,"153":1,"155":2,"156":7,"158":2,"290":8,"303":2}}],["priority",{"0":{"188":1,"194":1,"195":1},"2":{"188":5,"193":2,"194":2,"195":2}}],["private",{"0":{"241":1},"2":{"183":2,"241":6}}],["print",{"0":{"40":1,"62":1},"2":{"21":1,"40":2,"43":1,"62":2,"86":2,"190":1,"243":1,"248":1}}],["pwd",{"2":{"13":3}}],["p",{"2":{"13":1,"320":1}}],["platform",{"2":{"26":3,"48":3}}],["playwright安装失败",{"2":{"6":1}}],["plugintype",{"0":{"250":1,"253":1,"263":2},"1":{"254":1,"255":1,"256":1,"257":1,"258":1},"2":{"250":5,"302":1}}],["pluginmetadata",{"0":{"259":1,"273":1},"1":{"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1},"2":{"248":4,"302":2}}],["plugin\`",{"2":{"248":1}}],["plugin\`的函数签名",{"2":{"173":1}}],["plugin的函数签名",{"2":{"173":1}}],["plugin进行通信",{"2":{"8":1}}],["plugin",{"0":{"172":1,"245":1,"246":1,"247":1,"248":2,"249":2,"250":1,"251":1,"252":1,"267":1,"274":1,"275":1,"278":1,"280":1},"1":{"173":1,"246":1,"248":1,"249":1,"250":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"275":1,"279":1,"281":1},"2":{"1":1,"10":1,"21":2,"43":2,"172":1,"246":3,"248":15,"249":6,"250":5,"275":3,"279":6,"281":6,"302":4,"305":1,"306":2,"313":5}}],["plugins下创建一个文件",{"2":{"306":1}}],["plugins中添加你的插件路径",{"2":{"305":1}}],["plugins",{"0":{"173":1,"246":1,"249":1,"275":1,"276":1,"278":1,"279":1,"280":1,"281":1},"1":{"277":1,"279":1,"281":1},"2":{"1":1,"21":1,"43":1,"173":6,"246":2,"248":3,"249":9,"275":2,"279":4,"281":4,"303":1,"306":2}}],["py即可启动插件",{"2":{"306":1}}],["pyo",{"2":{"303":1}}],["pycache",{"2":{"303":1}}],["pyc",{"2":{"303":1}}],["pycharm",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["py文件",{"2":{"302":1}}],["py文件或一个包含",{"2":{"302":1}}],["py的文件夹即可被识别为插件",{"2":{"302":1}}],["pyfile",{"0":{"244":1},"2":{"243":8,"244":1}}],["pyi",{"2":{"240":1,"241":1}}],["py",{"2":{"12":1,"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":2,"186":1,"191":2,"192":1,"196":1,"205":1,"206":1,"240":1,"241":1,"243":1,"247":1,"249":3,"251":1,"252":1,"276":1,"278":2,"280":2,"293":1,"302":1,"303":1,"306":2,"308":1}}],["py来启动bot",{"2":{"6":1}}],["python格式",{"2":{"295":1}}],["pythonfrom",{"2":{"290":1,"293":1,"302":1,"306":1}}],["pythonimport",{"2":{"290":1,"303":1}}],["pythonasync",{"2":{"22":1,"24":1,"44":1,"46":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"86":1,"88":1,"89":1,"127":1,"152":1,"153":1,"190":1,"202":1}}],["pythondef",{"2":{"21":1,"23":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"43":1,"45":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"65":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"81":1,"82":1,"83":1,"84":1,"85":1,"87":1,"93":1,"94":1,"95":1,"96":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"149":1,"151":1,"154":1,"155":1,"156":1,"157":1,"158":1,"164":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"179":1,"180":1,"183":1,"184":1,"188":1,"189":1,"193":1,"194":1,"195":1,"199":1,"200":1,"201":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"246":1,"248":1,"249":1,"250":1,"268":1,"275":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1}}],["python为你的python可执行文件路径",{"2":{"15":1}}],["python3",{"2":{"12":1}}],["python是你要用来运行bot的可执行文件",{"2":{"6":1}}],["python",{"2":{"6":2,"12":1,"15":1,"66":1,"97":1,"98":1,"99":1,"126":1,"129":1,"133":1,"134":1,"135":1,"136":1,"166":1,"203":1,"204":1,"241":2,"277":1}}],["pipe",{"2":{"81":2}}],["pip",{"2":{"6":1,"12":1,"15":1,"248":1}}],["pip和python不对应怎么办",{"2":{"6":1}}],["utils",{"0":{"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1}}],["utf",{"2":{"139":1,"140":1,"141":1,"239":1,"241":1}}],["usage",{"0":{"262":1}}],["user",{"0":{"183":1,"315":1},"2":{"183":3,"184":2,"204":1,"297":3}}],["used",{"2":{"87":1}}],["use",{"2":{"1":1,"39":1,"61":1,"248":1}}],["unload",{"2":{"313":1,"314":1}}],["uninstall",{"2":{"313":1,"314":1}}],["uninstall卸载问题插件",{"2":{"6":1}}],["until",{"2":{"284":2}}],["unclassified",{"0":{"257":2,"263":1}}],["unparse",{"2":{"241":10}}],["unknown",{"2":{"152":1}}],["unsupported",{"2":{"142":1}}],["update",{"2":{"1":1,"2":1,"142":3,"143":1,"144":1,"311":1,"312":1,"313":1,"314":1}}],["某些控制台字体不可用",{"2":{"1":1}}],["the",{"2":{"248":1}}],["thread",{"0":{"285":1},"2":{"26":1,"48":1,"285":2}}],["threading",{"0":{"131":1},"2":{"21":1,"26":1,"43":1,"48":1,"285":1}}],["test",{"0":{"258":2},"2":{"250":1}}],["text",{"2":{"242":3}}],["terminated",{"2":{"156":1}}],["terminate",{"0":{"156":1,"157":1},"2":{"21":1,"26":1,"43":1,"48":1,"152":2,"156":2,"157":2}}],["types",{"0":{"269":1}}],["type=plugintype",{"2":{"302":1}}],["type=attr",{"2":{"241":1}}],["type=ast",{"2":{"241":3}}],["type=def",{"2":{"241":1}}],["type=deftype",{"2":{"241":1}}],["type=self",{"2":{"184":2}}],["typealias",{"2":{"162":1,"163":1,"197":1}}],["typeerror",{"2":{"81":1,"84":1,"93":1}}],["type",{"0":{"81":1,"82":2,"83":1,"183":2,"216":1,"219":1,"223":1,"250":1,"263":1},"2":{"81":12,"82":4,"83":2,"84":7,"93":1,"183":9,"184":2,"241":11,"242":13,"248":2,"250":5}}],["target",{"0":{"154":3,"238":1},"2":{"154":6,"238":4,"241":5}}],["target=run",{"2":{"285":1}}],["target=self",{"2":{"152":1}}],["target=os",{"2":{"26":1,"48":1}}],["targets",{"2":{"151":1,"152":4,"153":1,"154":1,"155":1,"157":1,"158":1,"241":2}}],["task",{"2":{"88":2,"126":1,"153":5}}],["tasks",{"2":{"66":2}}],["tuple=",{"2":{"154":1}}],["tuple",{"0":{"39":1,"61":1,"97":1,"98":1,"99":1,"108":1,"133":1,"134":1,"135":1,"136":1,"149":2,"154":1,"171":1,"215":1},"2":{"39":1,"61":1,"83":2,"91":1,"97":1,"98":1,"99":1,"108":1,"119":3,"133":1,"134":1,"135":1,"136":1,"149":2,"151":2,"171":1}}],["title",{"2":{"243":2}}],["time>",{"2":{"296":1}}],["timeout",{"2":{"156":1}}],["time",{"2":{"24":1,"26":1,"46":1,"48":1,"63":1,"79":1,"101":1,"109":1,"147":1,"164":9,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["tip",{"2":{"12":1,"13":1,"299":1,"308":1,"310":1}}],["t",{"0":{"80":1,"84":1,"85":1,"86":1,"87":2},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1},"2":{"13":1,"37":1,"59":1,"84":1,"85":1,"86":1,"87":5}}],["txt",{"2":{"12":1}}],["txt来安装依赖",{"2":{"6":1,"15":1}}],["tree",{"2":{"241":3}}],["traceback",{"2":{"190":1,"248":1}}],["try",{"2":{"23":1,"24":1,"45":1,"46":1,"122":1,"190":1,"248":1,"284":1}}],["trss",{"2":{"8":1,"14":1}}],["true时例如docs",{"2":{"243":2}}],["true下启动轻雪",{"2":{"6":1}}],["true",{"0":{"122":1,"171":1,"241":1,"249":1,"269":1},"2":{"1":3,"2":1,"85":1,"89":1,"127":1,"152":1,"180":1,"202":1,"203":1,"243":1,"290":2}}],["tokyo",{"2":{"317":1}}],["token",{"2":{"2":1}}],["top",{"0":{"243":1},"2":{"243":4}}],["toml",{"0":{"141":1},"2":{"141":5,"142":2,"144":1}}],["toml和config目录下的所有配置文件",{"2":{"0":1}}],["to",{"0":{"239":1,"286":1},"2":{"6":3,"13":1,"15":2,"84":1,"239":1,"243":1,"248":7,"249":2,"286":2}}],["image",{"2":{"311":2,"312":1}}],["implemented",{"2":{"166":1}}],["import",{"2":{"132":1,"248":1,"290":5,"293":1,"302":2,"303":3,"306":1}}],["iter",{"2":{"241":2}}],["items",{"2":{"94":1,"138":2,"239":1,"242":1,"243":1}}],["i",{"2":{"193":2,"290":6}}],["ignored",{"0":{"243":1},"2":{"152":1,"243":8}}],["ignore",{"0":{"122":1,"241":1,"249":1},"2":{"122":4,"241":6,"243":1,"249":6}}],["id仅超级用户可用",{"2":{"311":1}}],["id=user",{"2":{"297":2}}],["id=1234567",{"2":{"311":2}}],["id=123456",{"2":{"297":1}}],["id=self",{"2":{"184":3}}],["id",{"0":{"183":3},"2":{"87":5,"88":4,"183":11,"184":3,"204":1,"241":6,"297":2,"311":2,"313":1,"319":4}}],["ids",{"2":{"81":2,"87":2,"88":2,"89":1}}],["if",{"2":{"26":2,"27":1,"37":2,"39":2,"48":2,"49":1,"59":2,"61":2,"66":1,"81":5,"82":1,"83":4,"84":3,"85":1,"87":6,"88":1,"89":1,"93":3,"95":1,"96":1,"120":1,"121":1,"122":3,"123":1,"125":5,"127":2,"129":2,"138":1,"139":1,"140":1,"141":1,"142":2,"143":3,"152":2,"154":1,"156":2,"158":1,"164":1,"171":1,"179":1,"180":5,"183":1,"184":1,"190":1,"193":1,"202":1,"239":1,"240":1,"241":20,"242":10,"243":4,"248":2,"249":9,"283":2,"284":1,"286":1}}],["isclass",{"2":{"283":1}}],["iscoroutinefunction",{"2":{"283":2}}],["isroutine",{"2":{"283":1}}],["isfile",{"2":{"249":1,"303":1}}],["isdir",{"2":{"249":2}}],["isinstance",{"2":{"83":8,"93":1,"138":1,"241":13,"248":1,"290":1}}],["is",{"0":{"158":1,"204":1,"220":1,"283":1},"2":{"21":1,"23":1,"24":2,"27":1,"37":2,"43":1,"45":1,"46":2,"49":1,"59":2,"66":1,"81":6,"84":1,"87":5,"88":1,"89":1,"93":1,"95":1,"96":1,"119":2,"120":1,"121":1,"122":1,"123":1,"125":3,"127":1,"129":2,"139":1,"140":1,"141":1,"154":1,"156":1,"158":2,"171":1,"183":1,"202":1,"204":1,"241":2,"242":2,"243":1,"248":1,"249":2,"283":1,"284":1}}],["index",{"2":{"242":2,"243":1,"308":1}}],["inherit=",{"2":{"241":1}}],["inherit",{"0":{"231":1},"2":{"242":5}}],["inspect",{"2":{"283":4,"287":1}}],["insert",{"2":{"193":1}}],["instead",{"2":{"39":1,"61":1}}],["instance",{"0":{"129":1,"130":1},"2":{"21":2,"37":4,"43":2,"59":4,"84":1,"93":1,"129":5}}],["install安装浏览器",{"2":{"6":1}}],["install",{"2":{"6":1,"12":1,"15":1,"310":1,"313":1,"314":1}}],["inner",{"2":{"81":2}}],["in",{"0":{"144":1,"285":1},"2":{"27":1,"37":1,"39":3,"49":1,"59":1,"61":3,"66":1,"81":5,"83":4,"86":1,"87":1,"88":2,"93":1,"94":1,"122":1,"125":3,"126":1,"127":1,"138":2,"142":1,"143":2,"144":1,"152":1,"153":3,"155":1,"156":1,"157":1,"158":1,"171":1,"173":1,"190":1,"193":1,"195":2,"204":1,"239":1,"240":2,"241":13,"242":9,"243":5,"249":2,"279":2,"281":2,"284":2,"285":1,"303":1}}],["int=0",{"2":{"26":1,"48":1,"194":1,"195":1}}],["int",{"0":{"26":1,"48":1,"188":1,"194":1,"195":1},"2":{"65":1,"81":2,"188":1}}],["initialized",{"2":{"37":1,"59":1,"81":2}}],["initializing",{"2":{"21":1,"43":1}}],["init",{"0":{"21":1,"28":1,"29":1,"43":1,"50":1,"51":1,"65":1,"81":1,"103":1,"107":1,"111":1,"119":1,"149":1,"151":1,"180":1,"183":1,"188":1,"199":1},"2":{"21":2,"28":2,"29":2,"43":2,"50":2,"51":2,"65":1,"81":1,"103":1,"107":1,"111":1,"119":1,"149":1,"151":1,"180":1,"183":1,"185":1,"188":1,"191":1,"199":1,"241":1,"243":2,"249":2,"278":1,"280":1,"286":1,"302":3}}],["info",{"0":{"241":1,"242":1},"2":{"1":1,"21":1,"23":1,"24":1,"25":1,"26":1,"43":1,"45":1,"46":1,"47":1,"48":1,"152":2,"180":3,"241":12,"242":6,"243":5,"290":2}}],["icon=f",{"2":{"180":5}}],["icon",{"2":{"1":1,"180":7,"242":2,"243":2}}],["日志等级",{"2":{"1":1}}],["lt",{"2":{"310":1,"311":7,"313":10,"315":2}}],["lyf结尾",{"2":{"295":1}}],["lyfunction语法",{"2":{"311":1}}],["lyfunction",{"2":{"295":1}}],["len",{"2":{"83":2,"89":1}}],["level=0",{"2":{"180":1}}],["level",{"0":{"179":1},"2":{"1":1,"179":2,"180":6}}],["locks",{"2":{"122":1}}],["lock",{"0":{"131":2},"2":{"120":3,"121":3,"122":3,"129":1}}],["loaded",{"0":{"246":1,"275":1},"2":{"246":1,"275":1}}],["loader",{"0":{"278":1,"279":1,"280":1,"281":1},"1":{"279":1,"281":1},"2":{"21":1,"43":1,"279":1,"281":1}}],["loading",{"2":{"139":1,"140":1,"141":1}}],["load",{"0":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"247":1,"248":1,"249":1},"1":{"248":1,"249":1,"250":1},"2":{"21":1,"43":1,"139":4,"140":4,"141":4,"142":4,"143":2,"144":3,"173":3,"247":1,"248":3,"249":2,"279":2,"281":2,"313":1,"314":1}}],["loop",{"0":{"89":1,"127":1},"2":{"21":4,"30":1,"43":4,"52":1,"66":2,"81":1,"86":3,"89":3,"119":2,"127":2,"153":2,"284":10}}],["log0000",{"2":{"290":1}}],["logger",{"0":{"29":1,"51":1},"2":{"21":1,"23":1,"24":1,"25":1,"26":1,"28":1,"29":1,"39":1,"43":1,"45":1,"46":1,"47":1,"48":1,"50":1,"51":1,"61":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":2,"89":2,"139":1,"140":1,"141":1,"142":2,"143":1,"152":3,"156":2,"158":1,"180":7,"248":3,"249":3,"284":1,"290":3,"303":2}}],["logo",{"0":{"40":1,"62":1},"2":{"21":1,"40":1,"43":1,"62":1}}],["log",{"0":{"178":1,"180":1},"1":{"179":1,"180":1},"2":{"1":2,"29":1,"51":1,"178":1,"180":3,"290":1}}],["liteecho",{"0":{"276":1,"277":1},"1":{"277":1},"2":{"276":2,"277":2,"311":1}}],["liteyukiexception",{"0":{"175":1}}],["liteyuki轻雪机器人管理脚本",{"2":{"14":1}}],["liteyukibot代替$",{"2":{"13":1}}],["liteyukibot",{"0":{"20":1,"37":1,"42":1,"59":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"12":2,"13":5,"26":1,"37":3,"48":1,"59":3,"173":1}}],["liteyukistudio",{"2":{"12":1,"13":1,"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["liteyuki",{"0":{"17":1,"19":1,"41":1,"63":1,"79":1,"100":1,"101":1,"104":1,"105":1,"109":1,"115":1,"137":1,"145":1,"146":1,"147":1,"159":1,"160":1,"161":1,"172":1,"174":1,"176":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"245":1,"247":1,"251":1,"252":1,"274":1,"276":1,"278":1,"280":1,"282":1,"313":1},"1":{"18":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"106":1,"107":1,"108":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"175":1,"177":1,"179":1,"180":1,"182":1,"183":1,"184":1,"187":1,"188":1,"189":1,"190":1,"193":1,"194":1,"195":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"246":1,"248":1,"249":1,"250":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"275":1,"277":1,"279":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"314":1},"2":{"1":2,"2":1,"21":2,"23":1,"24":1,"37":1,"43":2,"45":1,"46":1,"59":1,"173":2,"248":5,"279":3,"281":3,"290":12,"293":2,"294":1,"302":1,"303":4,"306":1,"307":1,"311":4,"312":3}}],["listdir",{"2":{"143":1,"249":2}}],["list",{"0":{"66":1,"183":1,"195":1,"215":1,"229":1,"230":1,"231":1,"234":1,"235":1,"236":1,"240":1},"2":{"65":6,"66":1,"81":2,"83":2,"116":1,"117":1,"183":1,"188":1,"193":3,"195":1,"240":4,"241":4,"243":3,"311":1,"313":2,"314":1}}],["life",{"2":{"65":1}}],["lifespan=self",{"2":{"21":1,"43":1}}],["lifespan",{"0":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"63":1,"64":1,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"151":2},"1":{"64":1,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2},"2":{"21":3,"22":2,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"43":3,"44":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"63":1,"65":6,"66":2,"67":4,"68":4,"69":4,"70":4,"71":4,"72":4,"151":4,"152":3}}],["linux系统要支持python3",{"2":{"15":1}}],["linux",{"2":{"14":1,"26":1,"48":1}}],["linux下使用source",{"2":{"12":1}}],["llonebot",{"2":{"8":1}}],["laptop",{"2":{"243":2}}],["lang",{"0":{"242":1,"243":1},"2":{"242":4,"243":3}}],["language",{"2":{"2":1}}],["last",{"2":{"164":4}}],["lambda",{"2":{"132":1,"133":2,"134":2,"135":2,"136":1}}],["lagrange",{"2":{"8":1}}],["写在外层的配置项将会被覆盖",{"2":{"1":1}}],["switch",{"2":{"311":2,"312":1}}],["simple",{"2":{"302":1}}],["signature",{"2":{"287":2}}],["signal",{"2":{"21":6,"25":1,"43":6,"47":1}}],["signum",{"0":{"25":1,"47":1},"2":{"25":3,"47":3}}],["sigterm",{"2":{"21":1,"43":1}}],["sigint",{"2":{"21":1,"43":1}}],["sync",{"2":{"287":2}}],["system",{"0":{"171":1},"2":{"26":4,"48":4,"171":1,"303":2}}],["sys",{"2":{"25":1,"26":3,"47":1,"48":3,"180":1}}],["src",{"2":{"279":1,"281":1,"303":5}}],["specified",{"2":{"248":1}}],["split",{"2":{"248":4}}],["schedule",{"2":{"171":1}}],["scripts部署",{"0":{"14":1}}],["scripts",{"2":{"12":1}}],["sm",{"2":{"153":2}}],["source",{"0":{"218":1},"2":{"241":2,"242":6}}],["sockschannel",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1}}],["socks",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1}}],["software",{"2":{"63":1,"79":1,"101":1,"109":1,"147":1,"172":1,"178":1,"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1,"247":1,"251":1,"252":1,"276":1,"278":1,"280":1}}],["s",{"2":{"83":2}}],["shinjuku",{"2":{"317":1}}],["shellstatistic",{"2":{"319":1}}],["shellbind",{"2":{"317":1}}],["shellweather",{"2":{"317":1}}],["shellmain",{"2":{"308":1}}],["shellvar",{"2":{"296":1}}],["shellcmd",{"2":{"295":1}}],["shell",{"2":{"295":1,"297":1}}],["shutil",{"2":{"243":1}}],["shutdown",{"0":{"33":1,"34":1,"55":1,"56":1,"69":1,"70":1,"75":1,"76":1},"2":{"33":2,"34":2,"55":2,"56":2,"65":2,"69":2,"70":2,"75":3,"76":3,"152":2}}],["show",{"2":{"180":6}}],["should",{"2":{"81":1}}],["shared",{"2":{"119":3,"132":1,"133":3,"134":3,"135":3,"136":2,"153":1,"154":1,"293":3}}],["snowykami",{"2":{"63":2,"79":2,"101":2,"109":2,"147":2,"172":2,"178":2,"181":2,"185":2,"186":2,"191":2,"192":2,"196":2,"205":2,"206":2,"247":2,"251":2,"252":2,"276":2,"278":2,"280":2}}],["succeeded",{"2":{"248":1}}],["success",{"2":{"156":1,"180":2,"248":2}}],["summary>",{"2":{"242":3}}],["summary>源代码",{"2":{"242":1}}],["su",{"0":{"204":1},"2":{"204":1,"276":1,"277":1}}],["supported",{"2":{"143":1}}],["superusers",{"2":{"1":1,"204":1}}],["subscribe",{"2":{"125":1}}],["subscriber",{"0":{"116":1,"117":1,"125":1,"126":1},"2":{"125":7,"126":2,"127":1}}],["sub",{"0":{"117":1},"2":{"37":1,"59":1,"81":2,"87":1,"88":1,"119":1,"125":4,"127":1}}],["sleep",{"2":{"24":1,"26":1,"46":1,"48":1,"290":1,"296":1,"297":1}}],["style",{"2":{"308":2}}],["stem",{"2":{"286":2}}],["stdout",{"2":{"180":1}}],["store",{"2":{"119":1,"120":1,"121":1,"122":2,"123":1}}],["storage",{"0":{"115":1},"1":{"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"100":2,"104":2,"293":2}}],["stopping",{"2":{"23":1,"24":1,"25":1,"45":1,"46":1,"47":1,"152":1}}],["stop",{"0":{"30":1,"52":1},"2":{"21":1,"24":2,"25":1,"30":3,"43":1,"46":2,"47":1,"52":3}}],["stat",{"2":{"320":1}}],["statistic",{"2":{"320":1}}],["statistics",{"0":{"319":1},"1":{"320":1}}],["static",{"0":{"210":1},"2":{"241":1}}],["staticmethod",{"0":{"210":1},"2":{"65":1,"66":1,"125":1,"126":1,"241":1}}],["status",{"2":{"311":1,"312":1}}],["startup",{"2":{"290":2}}],["startswith",{"2":{"241":3,"276":1,"277":1}}],["starting",{"2":{"89":1}}],["start或superusers",{"2":{"6":1}}],["start保证alconna解析正常",{"2":{"1":1}}],["start",{"0":{"31":1,"32":1,"53":1,"54":1,"67":1,"68":1,"73":1,"74":1,"89":1,"127":1,"153":1},"2":{"1":1,"22":3,"26":2,"31":2,"32":2,"44":3,"48":2,"53":2,"54":2,"65":2,"67":2,"68":2,"73":3,"74":3,"89":1,"127":2,"152":4,"153":3,"285":1,"290":1}}],["strip",{"2":{"277":2}}],["str=",{"2":{"242":1,"243":1}}],["structure",{"0":{"83":2},"2":{"83":17,"84":1}}],["str",{"0":{"27":1,"38":1,"39":2,"49":1,"60":1,"61":2,"81":1,"93":1,"94":1,"95":1,"96":1,"97":2,"98":2,"99":2,"103":2,"111":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"133":2,"134":2,"135":2,"136":2,"138":2,"139":2,"140":2,"141":2,"142":2,"143":2,"144":1,"149":2,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"179":2,"183":9,"184":2,"195":1,"214":1,"215":2,"216":1,"217":1,"218":1,"222":1,"223":1,"225":1,"227":1,"228":1,"231":1,"233":1,"237":1,"238":3,"239":2,"240":1,"241":1,"242":2,"243":3,"246":1,"248":1,"249":1,"250":2,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1,"270":1,"272":1,"275":1,"286":1},"2":{"21":1,"27":1,"38":1,"39":2,"43":1,"49":1,"60":1,"61":2,"81":2,"91":2,"93":1,"94":1,"95":1,"96":2,"97":2,"98":2,"99":2,"103":2,"111":1,"116":1,"117":1,"119":5,"120":1,"121":1,"122":1,"123":4,"124":1,"125":1,"126":1,"133":2,"134":2,"135":2,"136":2,"138":2,"139":2,"140":2,"141":2,"142":2,"143":2,"144":1,"149":2,"151":2,"152":1,"154":1,"156":1,"158":1,"171":1,"173":1,"179":2,"183":11,"184":2,"195":1,"204":1,"238":3,"239":2,"240":1,"241":1,"242":1,"243":4,"246":3,"248":1,"249":1,"250":4,"275":3,"286":3,"290":1}}],["search",{"2":{"313":1,"314":1}}],["service",{"0":{"255":2},"2":{"250":1,"302":1}}],["server",{"2":{"15":1}}],["sep",{"2":{"241":3}}],["session",{"0":{"183":2,"205":1},"2":{"183":8,"184":5,"205":1}}],["send",{"0":{"84":1,"112":1},"2":{"27":2,"49":2,"81":2,"84":4,"93":1,"95":1,"96":1,"98":1,"99":1,"111":1,"112":1,"120":1,"121":1,"122":1,"123":1,"124":1,"127":1,"133":1,"136":1,"184":1,"290":3,"311":1}}],["set",{"0":{"93":1,"94":1,"97":1,"120":1,"134":1,"249":1},"2":{"21":1,"24":1,"30":1,"43":1,"46":1,"52":1,"81":1,"93":2,"94":2,"96":1,"97":3,"120":2,"133":1,"134":3,"249":2,"284":1,"293":1,"311":2,"312":1,"315":2}}],["self",{"0":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"65":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"103":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"127":1,"149":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"166":1,"167":1,"168":1,"169":1,"170":1,"183":1,"184":1,"188":1,"189":1,"190":1,"199":1,"200":1,"201":1,"202":1,"268":1},"2":{"21":14,"22":5,"23":2,"24":3,"25":2,"26":4,"27":2,"28":2,"29":1,"30":3,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"43":14,"44":5,"45":2,"46":3,"47":2,"48":4,"49":2,"50":2,"51":1,"52":3,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"65":8,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":3,"74":3,"75":3,"76":3,"77":3,"78":3,"81":14,"82":3,"83":4,"84":6,"85":3,"86":2,"87":3,"88":3,"89":8,"103":3,"107":2,"108":2,"111":5,"112":1,"113":1,"114":1,"119":7,"120":3,"121":3,"122":4,"123":3,"124":2,"125":1,"127":4,"149":6,"151":4,"152":8,"153":3,"154":2,"155":2,"156":3,"157":3,"158":3,"166":1,"167":2,"168":2,"169":2,"170":2,"183":10,"184":3,"188":5,"189":2,"190":3,"199":2,"200":2,"201":2,"202":3,"241":1,"242":1,"268":2}}],["safe",{"2":{"2":1,"139":1}}],["num为每页显示数量",{"2":{"313":2}}],["num",{"2":{"313":2}}],["npm",{"2":{"313":7,"314":1}}],["nliteyuki",{"2":{"295":1}}],["n\`\`\`",{"2":{"242":2}}],["n\`\`\`python",{"2":{"242":2}}],["n",{"2":{"40":10,"62":10,"242":52,"243":2}}],["name>",{"2":{"296":2}}],["name=module",{"2":{"248":3}}],["name=target",{"2":{"241":2}}],["name=class",{"2":{"241":1}}],["name=node",{"2":{"241":2}}],["name=f",{"2":{"154":2}}],["name=",{"2":{"90":1,"91":1,"119":3,"302":1}}],["name",{"0":{"27":1,"49":1,"81":1,"93":1,"95":1,"103":1,"111":1,"152":1,"154":1,"156":1,"158":1,"214":1,"222":1,"227":1,"244":1,"250":2,"260":1,"270":1,"272":1,"286":1},"2":{"27":7,"49":7,"81":12,"89":2,"93":8,"94":2,"95":6,"97":3,"98":3,"103":3,"111":5,"152":14,"153":2,"154":6,"155":1,"156":7,"157":2,"158":6,"241":11,"242":7,"243":2,"248":20,"249":9,"250":7,"268":1,"286":1,"290":2,"311":4,"313":8}}],["new",{"2":{"21":1,"43":1,"138":3,"284":1}}],["nodes",{"2":{"241":2}}],["node",{"2":{"241":42}}],["node等进程",{"2":{"15":1}}],["normal",{"0":{"241":1},"2":{"241":1,"243":1}}],["normal>",{"2":{"180":1}}],["nonlocal",{"2":{"164":1}}],["nonedog",{"2":{"302":1}}],["none",{"0":{"21":1,"27":1,"38":1,"39":1,"43":1,"49":1,"60":1,"61":1,"65":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":1,"87":1,"107":1,"120":1,"121":1,"122":1,"124":1,"130":1,"154":1,"171":1,"183":2,"190":1,"224":1,"242":1,"243":1,"273":1},"2":{"21":1,"27":1,"37":1,"43":1,"49":1,"59":1,"65":1,"66":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"81":3,"82":1,"84":1,"86":1,"87":1,"107":1,"111":2,"120":1,"122":1,"124":1,"129":2,"139":1,"140":1,"141":1,"154":1,"162":1,"164":1,"171":1,"183":1,"190":1,"197":2,"202":1,"241":3,"243":1,"248":4,"249":1,"283":1}}],["nonebot2提供的框架支持",{"2":{"10":1}}],["nonebot",{"2":{"2":1,"10":1,"282":1,"290":3,"302":1,"303":4,"306":1}}],["nonebot机器人的配置",{"2":{"1":1}}],["no",{"0":{"142":1,"143":1,"144":1,"214":1,"215":1,"216":1,"217":1,"219":1,"220":1,"222":1,"223":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"234":1,"235":1,"236":1,"237":1,"244":1,"260":1,"270":1,"271":1,"272":1},"2":{"89":1,"92":1,"142":3,"143":3,"144":3,"241":3,"242":1,"243":2}}],["nohup",{"2":{"26":2,"48":2,"296":1,"297":1}}],["notimplementederror",{"2":{"166":1}}],["not",{"2":{"24":1,"27":1,"37":1,"46":1,"49":1,"59":1,"81":1,"83":3,"84":2,"87":4,"89":1,"93":1,"122":1,"125":3,"127":1,"139":1,"140":1,"141":1,"142":3,"143":3,"152":2,"156":2,"158":2,"171":2,"190":1,"239":1,"241":8,"248":1,"249":8,"303":2}}],["ntqq的onebot插件",{"2":{"8":1}}],["nickname",{"2":{"1":1}}],["若不存在则返回空",{"2":{"311":1}}],["若不存在则创建于config",{"2":{"311":1}}],["若存在则返回",{"2":{"311":1}}],["若存在则覆盖",{"2":{"311":1}}],["若存在则会覆盖",{"2":{"311":1}}],["若你不希望提供这些信息",{"2":{"309":1}}],["若你修改了端口号请将20216",{"2":{"13":1}}],["若要戳20s后停止",{"2":{"297":1}}],["若要接收外部请求请填写0",{"2":{"1":1}}],["若函数中启动了其他task",{"2":{"296":1}}],["若有子进程订阅则推送给子进程",{"2":{"127":2}}],["若有困难请联系对应开发者而不是liteyuki的开发者",{"2":{"9":1}}],["若为空",{"2":{"81":2}}],["若没有metadata",{"2":{"308":1}}],["若没有",{"2":{"1":1}}],["14s",{"2":{"319":2}}],["1h",{"2":{"319":2}}],["1d",{"2":{"319":2}}],["1145141919810",{"2":{"311":1}}],["11",{"2":{"278":1,"280":1}}],["19",{"2":{"181":1,"185":1,"186":1,"191":1,"192":1,"196":1,"205":1,"206":1}}],["1919810",{"2":{"1":1}}],["18",{"2":{"172":1}}],["12",{"2":{"147":1,"178":1}}],["127",{"2":{"1":1,"3":1}}],["10",{"2":{"18":1,"177":1,"311":1}}],["10+",{"2":{"12":1,"15":1}}],["1",{"2":{"1":1,"2":1,"3":2,"26":2,"27":2,"48":2,"49":2,"87":1,"97":2,"98":2,"99":1,"127":2,"133":3,"134":2,"135":1,"136":1,"137":1,"138":3,"152":2,"165":1,"166":1,"242":6,"243":1,"248":4,"286":2,"302":1,"308":2}}],["03",{"2":{"290":2}}],["0000",{"2":{"290":3}}],["00",{"2":{"290":18}}],["02",{"2":{"252":1,"278":1,"280":1}}],["04",{"2":{"172":1}}],["04+",{"2":{"15":1}}],["0m",{"2":{"40":1,"62":1}}],["0",{"0":{"26":1,"48":1,"194":1,"195":1},"2":{"1":5,"3":4,"21":1,"24":1,"25":1,"26":1,"43":1,"46":1,"47":1,"48":1,"65":1,"82":1,"83":1,"89":1,"96":1,"97":2,"98":2,"99":1,"127":1,"132":2,"133":2,"134":2,"135":2,"136":1,"152":2,"188":2,"241":1,"242":7,"297":1,"302":2,"308":2}}],["请阅读插件主页的说明",{"2":{"314":1}}],["请确保您所编写的html代码能被bot解析",{"2":{"307":1}}],["请注意",{"2":{"307":1}}],["请创建task",{"2":{"152":2}}],["请不要将需要动态加载的内容写入配置文件",{"2":{"137":1}}],["请联系插件作者或在安全模式safe",{"2":{"6":1}}],["请先查阅插件文档",{"2":{"6":1}}],["请正确安装git",{"2":{"6":1}}],["请检查配置文件的command",{"2":{"6":1}}],["请使用path",{"2":{"15":1}}],["请使用",{"2":{"6":1}}],["请在此填写相同的值",{"2":{"3":1}}],["请开启alconna",{"2":{"1":1}}],["请尽快迁移",{"2":{"1":1}}],["空命令头",{"2":{"1":1}}],["指令前缀",{"2":{"1":1}}],["轻雪天气liteyuki",{"0":{"317":1},"1":{"318":1}}],["轻雪文档",{"2":{"312":1}}],["轻雪命令liteyuki",{"0":{"311":1},"1":{"312":1}}],["轻雪会收集以下内容",{"2":{"309":1}}],["轻雪会自动合并这些配置文件",{"2":{"0":1}}],["轻雪原版资源包请查看liteyukibot",{"2":{"307":1}}],["轻雪主进程不涉及聊天部分",{"2":{"303":1}}],["轻雪函数",{"0":{"294":1},"1":{"295":1,"296":1,"297":1,"298":1,"299":1},"2":{"294":1}}],["轻雪框架提供了一个内存共享通信的接口",{"2":{"292":1}}],["轻雪提供了一个通道channel用于跨进程通信",{"2":{"289":1}}],["轻雪运行在主进程",{"2":{"289":1}}],["轻雪抽象消息事件",{"2":{"183":2}}],["轻雪生命周期管理",{"2":{"65":2}}],["轻雪的更新功能依赖git",{"2":{"15":1}}],["轻雪使用git进行版本管理",{"2":{"12":1}}],["轻雪不局限于onebot适配器",{"2":{"4":1}}],["轻雪调试",{"2":{"2":1}}],["轻雪插件是轻雪内置的一部分功能",{"2":{"300":1}}],["轻雪插件目录列表",{"2":{"1":1}}],["轻雪插件列表",{"2":{"1":1}}],["轻雪支持yaml",{"2":{"0":1}}],["y",{"2":{"250":1}}],["y>",{"2":{"250":1}}],["y>name",{"2":{"250":1}}],["your",{"2":{"248":4}}],["yellow>",{"2":{"180":1}}],["yunzai",{"2":{"8":1}}],["yamlweather",{"2":{"317":1}}],["yamlname",{"2":{"308":1}}],["yamlnonebot",{"2":{"1":1}}],["yaml",{"0":{"139":1},"2":{"0":1,"2":1,"139":5,"142":2,"144":1}}],["yml格式的所有合法内容",{"2":{"311":1}}],["yml文件",{"2":{"308":1}}],["yml中填写一些信息",{"2":{"308":1}}],["yml",{"2":{"0":1,"142":1,"144":1,"308":2,"311":1}}],["yml和config目录",{"2":{"0":1}}],["你在a包中定义了一个index",{"2":{"308":1}}],["你自己制作的资源包也应该遵循这个规则",{"2":{"308":1}}],["你也可以自己制作资源包",{"2":{"307":1}}],["你的插件代码",{"2":{"302":1}}],["你应该使用其他储存方式",{"2":{"137":1}}],["你将无法使用更新功能",{"2":{"15":1}}],["你需要使用onebot标准的实现端来连接到轻雪并将消息上报给轻雪",{"2":{"6":1}}],["你有这个问题说明你不是很了解这个项目",{"2":{"6":1}}],["你可以选择开启auto",{"2":{"309":1}}],["你可以自由使用",{"2":{"309":1}}],["你可以自定义一些信息",{"2":{"308":1}}],["你可以在多个线程中读写共享内存",{"2":{"292":1}}],["你可以通过storage模块实现内存共享通信",{"2":{"292":1}}],["你可以通过channel发送消息给其他进程",{"2":{"289":1}}],["你可以使用python",{"2":{"12":1}}],["你可以使用nonebot2支持的任何适配器或使用轻雪讯息传递插件",{"2":{"4":1}}],["你可在此自定义生成的markdown格式",{"2":{"242":2}}],["你可在config目录下创建多个配置文件",{"2":{"0":1}}],["你可修改配置项后重启轻雪",{"2":{"0":1}}],["你只需要修改superusers及nickname字段即可",{"2":{"0":1}}],["绝大多数情况下",{"2":{"0":1}}],["取决于你个人的喜好",{"2":{"0":1}}],["配置项",{"2":{"317":1}}],["配置项目",{"2":{"138":2}}],["配置了命令别名的命令可以使用别名代替原命令",{"2":{"310":1}}],["配置文件尽量扁平化",{"2":{"137":1}}],["配置值",{"2":{"38":2,"39":2,"60":2,"61":2}}],["配置键",{"2":{"38":2,"39":2,"60":2,"61":2}}],["配置",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"21":3,"43":3,"312":1}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.CLGH5rWG.js b/assets/chunks/VPLocalSearchBox.CLGH5rWG.js new file mode 100644 index 00000000..eb0efc17 --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.CLGH5rWG.js @@ -0,0 +1,7 @@ +var Ot=Object.defineProperty;var Rt=(a,e,t)=>e in a?Ot(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ce=(a,e,t)=>Rt(a,typeof e!="symbol"?e+"":e,t);import{X as et,s as ne,h as ve,aj as tt,ak as Ct,al as Mt,v as je,am as At,d as Lt,G as ye,an as st,ao as Dt,ap as zt,x as Pt,aq as Vt,y as Me,R as de,Q as we,ar as jt,as as $t,Y as Bt,U as Wt,a1 as Kt,o as Q,b as Jt,j as x,a2 as Ut,k as D,at as qt,au as Gt,av as Qt,c as Z,n as nt,e as _e,E as it,F as rt,a as he,t as fe,aw as Ht,p as Yt,l as Zt,ax as at,ay as Xt,a8 as es,ae as ts,az as ss,_ as ns}from"./framework.C3o_UkTa.js";import{u as is,c as rs}from"./theme.rDkprPqD.js";const as={en:()=>et(()=>import("./@localSearchIndexen.CgaiBpBo.js"),[]),root:()=>et(()=>import("./@localSearchIndexroot.ButuspH0.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var gt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ie=gt.join(","),bt=typeof Element>"u",re=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!bt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},ke=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},os=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},yt=function(e,t,s){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&re.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},wt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),c=o.length?o:i.children,l=a(c,!0,s);s.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=re.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),f=!ke(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&f){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},_t=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||os(e))&&!_t(e)?0:e.tabIndex},cs=function(e,t){var s=ie(e);return s<0&&t&&!_t(e)?0:s},ls=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},us=function(e){return xt(e)&&e.type==="hidden"},ds=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},hs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(re.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var c=e.parentElement,l=Ne(e);if(c&&!c.shadowRoot&&n(c)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!c&&l!==e.ownerDocument?e=l.host:e=c}e=o}if(ms(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return ot(e);return!1},bs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},ws=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,c=cs(o,i),l=i?a(n.candidates):o;c===0?i?t.push.apply(t,l):t.push(o):s.push({documentOrder:r,tabIndex:c,item:n,isScope:i,content:l})}),s.sort(ls).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},_s=function(e,t){t=t||{};var s;return t.getShadowRoot?s=wt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ys}):s=yt(e,t.includeContainer,$e.bind(null,t)),ws(s)},xs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=wt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=yt(e,t.includeContainer,Fe.bind(null,t)),s},ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,Ie)===!1?!1:$e(t,e)},Ss=gt.concat("iframe").join(","),Ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return re.call(e,Ss)===!1?!1:Fe(t,e)};/*! +* focus-trap 7.5.4 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function ct(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function lt(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Ns=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},ks=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},me=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Fs=function(e){return me(e)&&!e.shiftKey},Os=function(e){return me(e)&&e.shiftKey},dt=function(e){return setTimeout(e,0)},ht=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},pe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?m-1:0),E=1;E=0)u=s.activeElement;else{var d=i.tabbableGroups[0],m=d&&d.firstTabbableNode;u=m||h("fallbackFocus")}if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},f=function(){if(i.containerGroups=i.containers.map(function(u){var d=_s(u,r.tabbableOptions),m=xs(u,r.tabbableOptions),S=d.length>0?d[0]:void 0,E=d.length>0?d[d.length-1]:void 0,k=m.find(function(p){return ae(p)}),F=m.slice().reverse().find(function(p){return ae(p)}),M=!!d.find(function(p){return ie(p)>0});return{container:u,tabbableNodes:d,focusableNodes:m,posTabIndexesFound:M,firstTabbableNode:S,lastTabbableNode:E,firstDomTabbableNode:k,lastDomTabbableNode:F,nextTabbableNode:function(g){var N=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,O=d.indexOf(g);return O<0?N?m.slice(m.indexOf(g)+1).find(function(P){return ae(P)}):m.slice(0,m.indexOf(g)).reverse().find(function(P){return ae(P)}):d[O+(N?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function T(u){var d=u.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?T(d.shadowRoot):d},y=function T(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){T(v());return}u.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=u,Ns(u)&&u.select()}},_=function(u){var d=h("setReturnFocus",u);return d||(d===!1?!1:u)},w=function(u){var d=u.target,m=u.event,S=u.isBackward,E=S===void 0?!1:S;d=d||xe(m),f();var k=null;if(i.tabbableGroups.length>0){var F=l(d,m),M=F>=0?i.containerGroups[F]:void 0;if(F<0)E?k=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:k=i.tabbableGroups[0].firstTabbableNode;else if(E){var p=ht(i.tabbableGroups,function(I){var L=I.firstTabbableNode;return d===L});if(p<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d,!1))&&(p=F),p>=0){var g=p===0?i.tabbableGroups.length-1:p-1,N=i.tabbableGroups[g];k=ie(d)>=0?N.lastTabbableNode:N.lastDomTabbableNode}else me(m)||(k=M.nextTabbableNode(d,!1))}else{var O=ht(i.tabbableGroups,function(I){var L=I.lastTabbableNode;return d===L});if(O<0&&(M.container===d||Ae(d,r.tabbableOptions)&&!ae(d,r.tabbableOptions)&&!M.nextTabbableNode(d))&&(O=F),O>=0){var P=O===i.tabbableGroups.length-1?0:O+1,V=i.tabbableGroups[P];k=ie(d)>=0?V.firstTabbableNode:V.firstDomTabbableNode}else me(m)||(k=M.nextTabbableNode(d))}}else k=h("fallbackFocus");return k},R=function(u){var d=xe(u);if(!(l(d,u)>=0)){if(pe(r.clickOutsideDeactivates,u)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}pe(r.allowOutsideClick,u)||u.preventDefault()}},C=function(u){var d=xe(u),m=l(d,u)>=0;if(m||d instanceof Document)m&&(i.mostRecentlyFocusedNode=d);else{u.stopImmediatePropagation();var S,E=!0;if(i.mostRecentlyFocusedNode)if(ie(i.mostRecentlyFocusedNode)>0){var k=l(i.mostRecentlyFocusedNode),F=i.containerGroups[k].tabbableNodes;if(F.length>0){var M=F.findIndex(function(p){return p===i.mostRecentlyFocusedNode});M>=0&&(r.isKeyForward(i.recentNavEvent)?M+1=0&&(S=F[M-1],E=!1))}}else i.containerGroups.some(function(p){return p.tabbableNodes.some(function(g){return ie(g)>0})})||(E=!1);else E=!1;E&&(S=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(S||i.mostRecentlyFocusedNode||v())}i.recentNavEvent=void 0},J=function(u){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var m=w({event:u,isBackward:d});m&&(me(u)&&u.preventDefault(),y(m))},H=function(u){if(ks(u)&&pe(r.escapeDeactivates,u)!==!1){u.preventDefault(),o.deactivate();return}(r.isKeyForward(u)||r.isKeyBackward(u))&&J(u,r.isKeyBackward(u))},W=function(u){var d=xe(u);l(d,u)>=0||pe(r.clickOutsideDeactivates,u)||pe(r.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},j=function(){if(i.active)return ut.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?dt(function(){y(v())}):y(v()),s.addEventListener("focusin",C,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",W,{capture:!0,passive:!1}),s.addEventListener("keydown",H,{capture:!0,passive:!1}),o},$=function(){if(i.active)return s.removeEventListener("focusin",C,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",W,!0),s.removeEventListener("keydown",H,!0),o},Re=function(u){var d=u.some(function(m){var S=Array.from(m.removedNodes);return S.some(function(E){return E===i.mostRecentlyFocusedNode})});d&&y(v())},A=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Re):void 0,U=function(){A&&(A.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){A.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var d=c(u,"onActivate"),m=c(u,"onPostActivate"),S=c(u,"checkCanFocusTrap");S||f(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,d==null||d();var E=function(){S&&f(),j(),U(),m==null||m()};return S?(S(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(u){if(!i.active)return this;var d=lt({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,$(),i.active=!1,i.paused=!1,U(),ut.deactivateTrap(n,o);var m=c(d,"onDeactivate"),S=c(d,"onPostDeactivate"),E=c(d,"checkCanReturnFocus"),k=c(d,"returnFocus","returnFocusOnDeactivate");m==null||m();var F=function(){dt(function(){k&&y(_(i.nodeFocusedBeforeActivation)),S==null||S()})};return k&&E?(E(_(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(u){if(i.paused||!i.active)return this;var d=c(u,"onPause"),m=c(u,"onPostPause");return i.paused=!0,d==null||d(),$(),U(),m==null||m(),this},unpause:function(u){if(!i.paused||!i.active)return this;var d=c(u,"onUnpause"),m=c(u,"onPostUnpause");return i.paused=!1,d==null||d(),f(),j(),U(),m==null||m(),this},updateContainerElements:function(u){var d=[].concat(u).filter(Boolean);return i.containers=d.map(function(m){return typeof m=="string"?s.querySelector(m):m}),i.active&&f(),U(),this}},o.updateContainerElements(e),o};function Ms(a,e={}){let t;const{immediate:s,...n}=e,r=ne(!1),i=ne(!1),o=f=>t&&t.activate(f),c=f=>t&&t.deactivate(f),l=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},v=ve(()=>{const f=tt(a);return(Array.isArray(f)?f:[f]).map(b=>{const y=tt(b);return typeof y=="string"?y:Ct(y)}).filter(Mt)});return je(v,f=>{f.length&&(t=Cs(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),At(()=>c()),{hasFocus:r,isPaused:i,activate:o,deactivate:c,pause:l,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const c=()=>{--i<=0&&n(o)};i||c(),r.forEach(l=>{ce.matches(l,this.exclude)?c():this.onIframeReady(l,h=>{t(l)&&(o++,s(h)),c()},c)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,c)=>{o.val===s&&(r=c,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],c=[],l,h,v=()=>({prevNode:h,node:l}=this.getIteratorNode(i),l);for(;v();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(l,h,f,o),f=>{this.createInstanceOnIframe(f).forEachNode(e,b=>c.push(b),n)}),c.push(l);c.forEach(f=>{s(f)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const c=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,c):c()})}}let As=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),c=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&c!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(c)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(c)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,c=parseInt(e.start,10)-o;return c=c>i?i:c,n=c+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),c<0||n-c<0||c>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(c,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:c,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const c=e.nodes[o+1];if(typeof c>"u"||c.start>t){if(!n(i.node))return!1;const l=t-i.start,h=(s>i.end?i.end:s)-i.start,v=e.value.substr(0,i.start),f=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,h),e.value=v+f,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(c=>{c=c.node;let l;for(;(l=e.exec(c.textContent))!==null&&l[i]!=="";){if(!s(l[i],c))continue;let h=l.index;if(i!==0)for(let v=1;v{let c;for(;(c=e.exec(o.value))!==null&&c[i]!=="";){let l=c.index;if(i!==0)for(let v=1;vs(c[i],v),(v,f)=>{e.lastIndex=f,n(v)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,c)=>{let{start:l,end:h,valid:v}=this.checkWhitespaceRanges(o,i,r.value);v&&this.wrapRangeInMappedTextNode(r,l,h,f=>t(f,o,r.value.substring(l,h),c),f=>{s(f,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",c=l=>{let h=new RegExp(this.createRegExp(l),`gm${o}`),v=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(f,b)=>this.opt.filter(b,l,s,v),f=>{v++,s++,this.opt.each(f)},()=>{v===0&&this.opt.noMatch(l),r[i-1]===l?this.opt.done(s):c(r[r.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):c(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,c)=>this.opt.filter(r,i,o,c),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ls(a){const e=new As(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Te(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{l(s.next(h))}catch(v){i(v)}}function c(h){try{l(s.throw(h))}catch(v){i(v)}}function l(h){h.done?r(h.value):n(h.value).then(o,c)}l((s=s.apply(a,[])).next())})}const Ds="ENTRIES",St="KEYS",Et="VALUES",z="";class Le{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=oe(this._path);if(oe(t)===z)return{done:!1,value:this.result()};const s=e.get(oe(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=oe(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>oe(e)).filter(e=>e!==z).join("")}value(){return oe(this._path).node.get(z)}result(){switch(this._type){case Et:return this.value();case St:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const oe=a=>a[a.length-1],zs=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const c=r*i;e:for(const l of a.keys())if(l===z){const h=n[c-1];h<=t&&s.set(o,[a.get(l),h])}else{let h=r;for(let v=0;vt)continue e}Tt(a.get(l),e,t,s,n,h,i,o+l)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Oe(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Je(s);for(const i of n.keys())if(i!==z&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ps(this._tree,e)}entries(){return new Le(this,Ds)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return zs(this._tree,e,t)}get(e){const t=Be(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Be(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Le(this,St)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,De(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);return s.set(z,t(s.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);let n=s.get(z);return n===void 0&&s.set(z,n=t()),n}values(){return new Le(this,Et)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Oe=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==z&&e.startsWith(s))return t.push([a,s]),Oe(a.get(s),e.slice(s.length),t);return t.push([a,e]),Oe(void 0,"",t)},Be=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Be(a.get(t),e.slice(t.length))},De=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Oe(a,e);if(t!==void 0){if(t.delete(z),t.size===0)It(s);else if(t.size===1){const[n,r]=t.entries().next().value;Nt(s,n,r)}}},It=a=>{if(a.length===0)return;const[e,t]=Je(a);if(e.delete(t),e.size===0)It(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==z&&Nt(a.slice(0,-1),s,n)}},Nt=(a,e,t)=>{if(a.length===0)return;const[s,n]=Je(a);s.set(n+e,t),s.delete(n)},Je=a=>a[a.length-1],Ue="or",kt="and",Vs="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Ve:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},Pe),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ft),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},Ks),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ke,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const c=this.addDocumentId(o);this.saveStoredFields(c,e);for(const l of r){const h=t(e,l);if(h==null)continue;const v=s(h.toString(),l),f=this._fieldIds[l],b=new Set(v).size;this.addFieldLength(c,f,this._documentCount-1,b);for(const y of v){const _=n(y,l);if(Array.isArray(_))for(const w of _)this.addTerm(f,c,w);else _&&this.addTerm(f,c,_)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:c},l,h)=>(o.push(l),(h+1)%s===0?{chunk:[],promise:c.then(()=>new Promise(v=>setTimeout(v,0))).then(()=>this.addAll(o))}:{chunk:o,promise:c}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const c=this._idToShortId.get(o);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const l of r){const h=n(e,l);if(h==null)continue;const v=t(h.toString(),l),f=this._fieldIds[l],b=new Set(v).size;this.removeFieldLength(c,f,this._documentCount,b);for(const y of v){const _=s(y,l);if(Array.isArray(_))for(const w of _)this.removeTerm(f,c,w);else _&&this.removeTerm(f,c,_)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(o),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ke,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Te(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||We.batchSize,r=e.batchWait||We.batchWait;let i=1;for(const[o,c]of this._index){for(const[l,h]of c)for(const[v]of h)this._documentIds.has(v)||(h.size<=1?c.delete(l):h.delete(v));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(l=>setTimeout(l,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Ve.minDirtCount,s=s||Ve.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:c}]of s){const l=o.length||1,h={id:this._documentIds.get(r),score:i*l,terms:Object.keys(c),queryTerms:o,match:c};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(vt),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),c=s.get(o);c!=null?(c.score+=r,c.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:c}]of s)n.push({suggestion:r,terms:o,score:i/c});return n.sort(vt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Te(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(Pe.hasOwnProperty(e))return ze(Pe,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=Se(n),c._fieldLength=Se(r),c._storedFields=Se(i);for(const[l,h]of c._documentIds)c._idToShortId.set(h,l);for(const[l,h]of s){const v=new Map;for(const f of Object.keys(h)){let b=h[f];o===1&&(b=b.ds),v.set(parseInt(f,10),Se(b))}c._index.set(l,v)}return c}static loadJSAsync(e,t){return Te(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,c=this.instantiateMiniSearch(e,t);c._documentIds=yield Ee(n),c._fieldLength=yield Ee(r),c._storedFields=yield Ee(i);for(const[h,v]of c._documentIds)c._idToShortId.set(v,h);let l=0;for(const[h,v]of s){const f=new Map;for(const b of Object.keys(v)){let y=v[b];o===1&&(y=y.ds),f.set(parseInt(b,10),yield Ee(y))}++l%1e3===0&&(yield Ft(0)),c._index.set(h,f)}return c})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:c}=e;if(c!==1&&c!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const l=new le(t);return l._documentCount=s,l._nextId=n,l._idToShortId=new Map,l._fieldIds=r,l._avgFieldLength=i,l._dirtCount=o||0,l._index=new X,l}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const f=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,f));return this.combineResults(b,f.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:c}=i,v=o(e).flatMap(f=>c(f)).filter(f=>!!f).map(Ws(i)).map(f=>this.executeQuerySpec(f,i));return this.combineResults(v,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((_,w)=>Object.assign(Object.assign({},_),{[w]:ze(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:c}=s,{fuzzy:l,prefix:h}=Object.assign(Object.assign({},ft.weights),i),v=this._index.get(e.term),f=this.termResults(e.term,e.term,1,e.termBoost,v,n,r,c);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const _=e.fuzzy===!0?.2:e.fuzzy,w=_<1?Math.min(o,Math.round(e.term.length*_)):_;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[_,w]of b){const R=_.length-e.term.length;if(!R)continue;y==null||y.delete(_);const C=h*_.length/(_.length+.3*R);this.termResults(e.term,_,C,e.termBoost,w,n,r,c,f)}if(y)for(const _ of y.keys()){const[w,R]=y.get(_);if(!R)continue;const C=l*_.length/(_.length+R);this.termResults(e.term,_,C,e.termBoost,w,n,r,c,f)}return f}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ue){if(e.length===0)return new Map;const s=t.toLowerCase(),n=js[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,c,l=new Map){if(r==null)return l;for(const h of Object.keys(i)){const v=i[h],f=this._fieldIds[h],b=r.get(f);if(b==null)continue;let y=b.size;const _=this._avgFieldLength[f];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(f,w,t),y-=1;continue}const R=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!R)continue;const C=b.get(w),J=this._fieldLength.get(w)[f],H=Bs(C,y,this._documentCount,J,_,c),W=s*n*v*R*H,j=l.get(w);if(j){j.score+=W,Js(j.terms,e);const $=ze(j.match,t);$?$.push(h):j.match[t]=[h]}else l.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return l}addTerm(e,t,s){const n=this._index.fetch(s,mt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,mt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,js={[Ue]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),pt(s.terms,r)}}return a},[kt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);pt(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Vs]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},$s={k:1.2,b:.7,d:.5},Bs=(a,e,t,s,n,r)=>{const{k:i,b:o,d:c}=r;return Math.log(1+(t-e+.5)/(e+.5))*(c+a*(i+1)/(a+i*(1-o+o*s/n)))},Ws=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},Pe={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Us),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ft={combineWith:Ue,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:$s},Ks={combineWith:kt,prefix:(a,e,t)=>e===t.length-1},We={batchSize:1e3,batchWait:10},Ke={minDirtFactor:.1,minDirtCount:20},Ve=Object.assign(Object.assign({},We),Ke),Js=(a,e)=>{a.includes(e)||a.push(e)},pt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},vt=({score:a},{score:e})=>e-a,mt=()=>new Map,Se=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ee=a=>Te(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Ft(0));return e}),Ft=a=>new Promise(e=>setTimeout(e,a)),Us=/[\n\r\p{Z}\p{P}]+/u;class qs{constructor(e=10){Ce(this,"max");Ce(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const K=a=>(Yt("data-v-a5632211"),a=a(),Zt(),a),Gs=["aria-owns"],Qs={class:"shell"},Hs=["title"],Ys=K(()=>x("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)),Zs=[Ys],Xs={class:"search-actions before"},en=["title"],tn=K(()=>x("span",{class:"vpi-arrow-left local-search-icon"},null,-1)),sn=[tn],nn=["placeholder"],rn={class:"search-actions"},an=["title"],on=K(()=>x("span",{class:"vpi-layout-list local-search-icon"},null,-1)),cn=[on],ln=["disabled","title"],un=K(()=>x("span",{class:"vpi-delete local-search-icon"},null,-1)),dn=[un],hn=["id","role","aria-labelledby"],fn=["aria-selected"],pn=["href","aria-label","onMouseenter","onFocusin"],vn={class:"titles"},mn=K(()=>x("span",{class:"title-icon"},"#",-1)),gn=["innerHTML"],bn=K(()=>x("span",{class:"vpi-chevron-right local-search-icon"},null,-1)),yn={class:"title main"},wn=["innerHTML"],_n={key:0,class:"excerpt-wrapper"},xn={key:0,class:"excerpt",inert:""},Sn=["innerHTML"],En=K(()=>x("div",{class:"excerpt-gradient-bottom"},null,-1)),Tn=K(()=>x("div",{class:"excerpt-gradient-top"},null,-1)),In={key:0,class:"no-results"},Nn={class:"search-keyboard-shortcuts"},kn=["aria-label"],Fn=K(()=>x("span",{class:"vpi-arrow-up navigate-icon"},null,-1)),On=[Fn],Rn=["aria-label"],Cn=K(()=>x("span",{class:"vpi-arrow-down navigate-icon"},null,-1)),Mn=[Cn],An=["aria-label"],Ln=K(()=>x("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)),Dn=[Ln],zn=["aria-label"],Pn=Lt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var F,M;const t=e,s=ye(),n=ye(),r=ye(as),i=is(),{activate:o}=Ms(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:c,theme:l}=i,h=st(async()=>{var p,g,N,O,P,V,I,L,q;return at(le.loadJSON((N=await((g=(p=r.value)[c.value])==null?void 0:g.call(p)))==null?void 0:N.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((O=l.value.search)==null?void 0:O.provider)==="local"&&((V=(P=l.value.search.options)==null?void 0:P.miniSearch)==null?void 0:V.searchOptions)},...((I=l.value.search)==null?void 0:I.provider)==="local"&&((q=(L=l.value.search.options)==null?void 0:L.miniSearch)==null?void 0:q.options)}))}),f=ve(()=>{var p,g;return((p=l.value.search)==null?void 0:p.provider)==="local"&&((g=l.value.search.options)==null?void 0:g.disableQueryPersistence)===!0}).value?ne(""):Dt("vitepress:local-search-filter",""),b=zt("vitepress:local-search-detailed-list",((F=l.value.search)==null?void 0:F.provider)==="local"&&((M=l.value.search.options)==null?void 0:M.detailedView)===!0),y=ve(()=>{var p,g,N;return((p=l.value.search)==null?void 0:p.provider)==="local"&&(((g=l.value.search.options)==null?void 0:g.disableDetailedView)===!0||((N=l.value.search.options)==null?void 0:N.detailedView)===!1)}),_=ve(()=>{var g,N,O,P,V,I,L;const p=((g=l.value.search)==null?void 0:g.options)??l.value.algolia;return((V=(P=(O=(N=p==null?void 0:p.locales)==null?void 0:N[c.value])==null?void 0:O.translations)==null?void 0:P.button)==null?void 0:V.buttonText)||((L=(I=p==null?void 0:p.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});Pt(()=>{y.value&&(b.value=!1)});const w=ye([]),R=ne(!1);je(f,()=>{R.value=!1});const C=st(async()=>{if(n.value)return at(new Ls(n.value))},null),J=new qs(16);Vt(()=>[h.value,f.value,b.value],async([p,g,N],O,P)=>{var ge,qe,Ge,Qe;(O==null?void 0:O[0])!==p&&J.clear();let V=!1;if(P(()=>{V=!0}),!p)return;w.value=p.search(g).slice(0,16),R.value=!0;const I=N?await Promise.all(w.value.map(B=>H(B.id))):[];if(V)return;for(const{id:B,mod:ee}of I){const te=B.slice(0,B.indexOf("#"));let Y=J.get(te);if(Y)continue;Y=new Map,J.set(te,Y);const G=ee.default??ee;if(G!=null&&G.render||G!=null&&G.setup){const se=Xt(G);se.config.warnHandler=()=>{},se.provide(es,i),Object.defineProperties(se.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const He=document.createElement("div");se.mount(He),He.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ue=>{var Xe;const be=(Xe=ue.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Ye)return;let Ze="";for(;(ue=ue.nextElementSibling)&&!/^h[1-6]$/i.test(ue.tagName);)Ze+=ue.outerHTML;Y.set(Ye,Ze)}),se.unmount()}if(V)return}const L=new Set;if(w.value=w.value.map(B=>{const[ee,te]=B.id.split("#"),Y=J.get(ee),G=(Y==null?void 0:Y.get(te))??"";for(const se in B.match)L.add(se);return{...B,text:G}}),await de(),V)return;await new Promise(B=>{var ee;(ee=C.value)==null||ee.unmark({done:()=>{var te;(te=C.value)==null||te.markRegExp(k(L),{done:B})}})});const q=((ge=s.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const B of q)(qe=B.querySelector('mark[data-markjs="true"]'))==null||qe.scrollIntoView({block:"center"});(Qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(p){const g=ts(p.slice(0,p.indexOf("#")));try{if(!g)throw new Error(`Cannot find file for id: ${p}`);return{id:p,mod:await import(g)}}catch(N){return console.error(N),{id:p,mod:{}}}}const W=ne(),j=ve(()=>{var p;return((p=f.value)==null?void 0:p.length)<=0});function $(p=!0){var g,N;(g=W.value)==null||g.focus(),p&&((N=W.value)==null||N.select())}Me(()=>{$()});function Re(p){p.pointerType==="mouse"&&$()}const A=ne(-1),U=ne(!1);je(w,p=>{A.value=p.length?0:-1,T()});function T(){de(()=>{const p=document.querySelector(".result.selected");p==null||p.scrollIntoView({block:"nearest"})})}we("ArrowUp",p=>{p.preventDefault(),A.value--,A.value<0&&(A.value=w.value.length-1),U.value=!0,T()}),we("ArrowDown",p=>{p.preventDefault(),A.value++,A.value>=w.value.length&&(A.value=0),U.value=!0,T()});const u=jt();we("Enter",p=>{if(p.isComposing||p.target instanceof HTMLButtonElement&&p.target.type!=="submit")return;const g=w.value[A.value];if(p.target instanceof HTMLInputElement&&!g){p.preventDefault();return}g&&(u.go(g.id),t("close"))}),we("Escape",()=>{t("close")});const m=rs({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Me(()=>{window.history.pushState(null,"",null)}),$t("popstate",p=>{p.preventDefault(),t("close")});const S=Bt(Wt?document.body:null);Me(()=>{de(()=>{S.value=!0,de().then(()=>o())})}),Kt(()=>{S.value=!1});function E(){f.value="",de().then(()=>$(!1))}function k(p){return new RegExp([...p].sort((g,N)=>N.length-g.length).map(g=>`(${ss(g)})`).join("|"),"gi")}return(p,g)=>{var N,O,P,V;return Q(),Jt(Ht,{to:"body"},[x("div",{ref_key:"el",ref:s,role:"button","aria-owns":(N=w.value)!=null&&N.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[x("div",{class:"backdrop",onClick:g[0]||(g[0]=I=>p.$emit("close"))}),x("div",Qs,[x("form",{class:"search-bar",onPointerup:g[4]||(g[4]=I=>Re(I)),onSubmit:g[5]||(g[5]=Ut(()=>{},["prevent"]))},[x("label",{title:_.value,id:"localsearch-label",for:"localsearch-input"},Zs,8,Hs),x("div",Xs,[x("button",{class:"back-button",title:D(m)("modal.backButtonTitle"),onClick:g[1]||(g[1]=I=>p.$emit("close"))},sn,8,en)]),qt(x("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":g[2]||(g[2]=I=>Qt(f)?f.value=I:null),placeholder:_.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,nn),[[Gt,D(f)]]),x("div",rn,[y.value?_e("",!0):(Q(),Z("button",{key:0,class:nt(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(m)("modal.displayDetails"),onClick:g[3]||(g[3]=I=>A.value>-1&&(b.value=!D(b)))},cn,10,an)),x("button",{class:"clear-button",type:"reset",disabled:j.value,title:D(m)("modal.resetButtonTitle"),onClick:E},dn,8,ln)])],32),x("ul",{ref_key:"resultsEl",ref:n,id:(O=w.value)!=null&&O.length?"localsearch-list":void 0,role:(P=w.value)!=null&&P.length?"listbox":void 0,"aria-labelledby":(V=w.value)!=null&&V.length?"localsearch-label":void 0,class:"results",onMousemove:g[7]||(g[7]=I=>U.value=!1)},[(Q(!0),Z(rt,null,it(w.value,(I,L)=>(Q(),Z("li",{key:I.id,role:"option","aria-selected":A.value===L?"true":"false"},[x("a",{href:I.id,class:nt(["result",{selected:A.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:q=>!U.value&&(A.value=L),onFocusin:q=>A.value=L,onClick:g[6]||(g[6]=q=>p.$emit("close"))},[x("div",null,[x("div",vn,[mn,(Q(!0),Z(rt,null,it(I.titles,(q,ge)=>(Q(),Z("span",{key:ge,class:"title"},[x("span",{class:"text",innerHTML:q},null,8,gn),bn]))),128)),x("span",yn,[x("span",{class:"text",innerHTML:I.title},null,8,wn)])]),D(b)?(Q(),Z("div",_n,[I.text?(Q(),Z("div",xn,[x("div",{class:"vp-doc",innerHTML:I.text},null,8,Sn)])):_e("",!0),En,Tn])):_e("",!0)])],42,pn)],8,fn))),128)),D(f)&&!w.value.length&&R.value?(Q(),Z("li",In,[he(fe(D(m)("modal.noResultsText"))+' "',1),x("strong",null,fe(D(f)),1),he('" ')])):_e("",!0)],40,hn),x("div",Nn,[x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.navigateUpKeyAriaLabel")},On,8,kn),x("kbd",{"aria-label":D(m)("modal.footer.navigateDownKeyAriaLabel")},Mn,8,Rn),he(" "+fe(D(m)("modal.footer.navigateText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.selectKeyAriaLabel")},Dn,8,An),he(" "+fe(D(m)("modal.footer.selectText")),1)]),x("span",null,[x("kbd",{"aria-label":D(m)("modal.footer.closeKeyAriaLabel")},"esc",8,zn),he(" "+fe(D(m)("modal.footer.closeText")),1)])])])],8,Gs)])}}}),Kn=ns(Pn,[["__scopeId","data-v-a5632211"]]);export{Kn as default}; diff --git a/assets/chunks/framework.C3o_UkTa.js b/assets/chunks/framework.C3o_UkTa.js new file mode 100644 index 00000000..9a869c33 --- /dev/null +++ b/assets/chunks/framework.C3o_UkTa.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function wr(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const ne={},yt=[],Ae=()=>{},Mi=()=>!1,Kt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Er=e=>e.startsWith("onUpdate:"),fe=Object.assign,Cr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ii=Object.prototype.hasOwnProperty,z=(e,t)=>Ii.call(e,t),k=Array.isArray,_t=e=>Tn(e)==="[object Map]",Xs=e=>Tn(e)==="[object Set]",q=e=>typeof e=="function",ie=e=>typeof e=="string",Qe=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",Ys=e=>(Z(e)||q(e))&&q(e.then)&&q(e.catch),zs=Object.prototype.toString,Tn=e=>zs.call(e),Pi=e=>Tn(e).slice(8,-1),Js=e=>Tn(e)==="[object Object]",Sr=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bt=wr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),xn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ni=/-(\w)/g,Le=xn(e=>e.replace(Ni,(t,n)=>n?n.toUpperCase():"")),Fi=/\B([A-Z])/g,Ze=xn(e=>e.replace(Fi,"-$1").toLowerCase()),An=xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),fn=xn(e=>e?`on${An(e)}`:""),ze=(e,t)=>!Object.is(e,t),dn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},cr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},$i=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Qr;const Zs=()=>Qr||(Qr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Tr(e){if(k(e)){const t={};for(let n=0;n{if(n){const r=n.split(ji);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function xr(e){let t="";if(ie(e))t=e;else if(k(e))for(let n=0;n!!(e&&e.__v_isRef===!0),ki=e=>ie(e)?e:e==null?"":k(e)||Z(e)&&(e.toString===zs||!q(e.toString))?to(e)?ki(e.value):JSON.stringify(e,no,2):String(e),no=(e,t)=>to(t)?no(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[kn(r,o)+" =>"]=s,n),{})}:Xs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>kn(n))}:Qe(t)?kn(t):Z(t)&&!k(t)&&!Js(t)?String(t):t,kn=(e,t="")=>{var n;return Qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ee;class Ki{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ee,!t&&Ee&&(this.index=(Ee.scopes||(Ee.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ee;try{return Ee=this,t()}finally{Ee=n}}}on(){Ee=this}off(){Ee=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),tt()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Xe,n=ct;try{return Xe=!0,ct=this,this._runnings++,Zr(this),this.fn()}finally{es(this),this._runnings--,ct=n,Xe=t}}stop(){this.active&&(Zr(this),es(this),this.onStop&&this.onStop(),this.active=!1)}}function Gi(e){return e.value}function Zr(e){e._trackId++,e._depsLength=0}function es(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},yn=new WeakMap,at=Symbol(""),fr=Symbol("");function ve(e,t,n){if(Xe&&ct){let r=yn.get(e);r||yn.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=co(()=>r.delete(n))),io(ct,s)}}function Ve(e,t,n,r,s,o){const i=yn.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&k(e)){const c=Number(r);i.forEach((u,f)=>{(f==="length"||!Qe(f)&&f>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":k(e)?Sr(n)&&l.push(i.get("length")):(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"delete":k(e)||(l.push(i.get(at)),_t(e)&&l.push(i.get(fr)));break;case"set":_t(e)&&l.push(i.get(at));break}Rr();for(const c of l)c&&lo(c,4);Or()}function Xi(e,t){const n=yn.get(e);return n&&n.get(t)}const Yi=wr("__proto__,__v_isRef,__isVue"),ao=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Qe)),ts=zi();function zi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){et(),Rr();const r=J(this)[t].apply(this,n);return Or(),tt(),r}}),e}function Ji(e){Qe(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class uo{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw")return r===(s?o?ul:go:o?po:ho).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=k(t);if(!s){if(i&&z(ts,n))return Reflect.get(ts,n,r);if(n==="hasOwnProperty")return Ji}const l=Reflect.get(t,n,r);return(Qe(n)?ao.has(n):Yi(n))||(s||ve(t,"get",n),o)?l:he(l)?i&&Sr(n)?l:l.value:Z(l)?s?Ln(l):On(l):l}}class fo extends uo{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(!this._isShallow){const c=dt(o);if(!Tt(r)&&!dt(r)&&(o=J(o),r=J(r)),!k(t)&&he(o)&&!he(r))return c?!1:(o.value=r,!0)}const i=k(t)&&Sr(n)?Number(n)e,Rn=e=>Reflect.getPrototypeOf(e);function Jt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(ze(t,o)&&ve(s,"get",t),ve(s,"get",o));const{has:i}=Rn(s),l=r?Lr:n?Pr:jt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Qt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(ze(e,s)&&ve(r,"has",e),ve(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Zt(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",at),Reflect.get(e,"size",e)}function ns(e,t=!1){!t&&!Tt(e)&&!dt(e)&&(e=J(e));const n=J(this);return Rn(n).has.call(n,e)||(n.add(e),Ve(n,"add",e,e)),this}function rs(e,t,n=!1){!n&&!Tt(t)&&!dt(t)&&(t=J(t));const r=J(this),{has:s,get:o}=Rn(r);let i=s.call(r,e);i||(e=J(e),i=s.call(r,e));const l=o.call(r,e);return r.set(e,t),i?ze(t,l)&&Ve(r,"set",e,t):Ve(r,"add",e,t),this}function ss(e){const t=J(this),{has:n,get:r}=Rn(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&Ve(t,"delete",e,void 0),o}function os(){const e=J(this),t=e.size!==0,n=e.clear();return t&&Ve(e,"clear",void 0,void 0),n}function en(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?Lr:e?Pr:jt;return!e&&ve(l,"iterate",at),i.forEach((u,f)=>r.call(s,c(u),c(f),o))}}function tn(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=_t(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,u=s[e](...r),f=n?Lr:t?Pr:jt;return!t&&ve(o,"iterate",c?fr:at),{next(){const{value:h,done:m}=u.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function nl(){const e={get(o){return Jt(this,o)},get size(){return Zt(this)},has:Qt,add:ns,set:rs,delete:ss,clear:os,forEach:en(!1,!1)},t={get(o){return Jt(this,o,!1,!0)},get size(){return Zt(this)},has:Qt,add(o){return ns.call(this,o,!0)},set(o,i){return rs.call(this,o,i,!0)},delete:ss,clear:os,forEach:en(!1,!0)},n={get(o){return Jt(this,o,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!1)},r={get(o){return Jt(this,o,!0,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:en(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=tn(o,!1,!1),n[o]=tn(o,!0,!1),t[o]=tn(o,!1,!0),r[o]=tn(o,!0,!0)}),[e,n,t,r]}const[rl,sl,ol,il]=nl();function Mr(e,t){const n=t?e?il:ol:e?sl:rl;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(z(n,s)&&s in r?n:r,s,o)}const ll={get:Mr(!1,!1)},cl={get:Mr(!1,!0)},al={get:Mr(!0,!1)};const ho=new WeakMap,po=new WeakMap,go=new WeakMap,ul=new WeakMap;function fl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function dl(e){return e.__v_skip||!Object.isExtensible(e)?0:fl(Pi(e))}function On(e){return dt(e)?e:Ir(e,!1,Zi,ll,ho)}function hl(e){return Ir(e,!1,tl,cl,po)}function Ln(e){return Ir(e,!0,el,al,go)}function Ir(e,t,n,r,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=dl(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function vt(e){return dt(e)?vt(e.__v_raw):!!(e&&e.__v_isReactive)}function dt(e){return!!(e&&e.__v_isReadonly)}function Tt(e){return!!(e&&e.__v_isShallow)}function mo(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function hn(e){return Object.isExtensible(e)&&Qs(e,"__v_skip",!0),e}const jt=e=>Z(e)?On(e):e,Pr=e=>Z(e)?Ln(e):e;class yo{constructor(t,n,r,s){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Ar(()=>t(this._value),()=>It(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return(!t._cacheable||t.effect.dirty)&&ze(t._value,t._value=t.effect.run())&&It(t,4),Nr(t),t.effect._dirtyLevel>=2&&It(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function pl(e,t,n=!1){let r,s;const o=q(e);return o?(r=e,s=Ae):(r=e.get,s=e.set),new yo(r,s,o||!s,n)}function Nr(e){var t;Xe&&ct&&(e=J(e),io(ct,(t=e.dep)!=null?t:e.dep=co(()=>e.dep=void 0,e instanceof yo?e:void 0)))}function It(e,t=4,n,r){e=J(e);const s=e.dep;s&&lo(s,t)}function he(e){return!!(e&&e.__v_isRef===!0)}function oe(e){return _o(e,!1)}function Fr(e){return _o(e,!0)}function _o(e,t){return he(e)?e:new gl(e,t)}class gl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:jt(t)}get value(){return Nr(this),this._value}set value(t){const n=this.__v_isShallow||Tt(t)||dt(t);t=n?t:J(t),ze(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:jt(t),It(this,4))}}function bo(e){return he(e)?e.value:e}const ml={get:(e,t,n)=>bo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return he(s)&&!he(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function vo(e){return vt(e)?e:new Proxy(e,ml)}class yl{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Nr(this),()=>It(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function _l(e){return new yl(e)}class bl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Xi(J(this._object),this._key)}}class vl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function wl(e,t,n){return he(e)?e:q(e)?new vl(e):Z(e)&&arguments.length>1?El(e,t,n):oe(e)}function El(e,t,n){const r=e[t];return he(r)?r:new bl(e,t,n)}/** +* @vue/runtime-core v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Ye(e,t,n,r){try{return r?e(...r):e()}catch(s){Wt(s,t,n)}}function Re(e,t,n,r){if(q(e)){const s=Ye(e,t,n,r);return s&&Ys(s)&&s.catch(o=>{Wt(o,t,n)}),s}if(k(e)){const s=[];for(let o=0;o>>1,s=ge[r],o=Dt(s);oFe&&ge.splice(t,1)}function xl(e){k(e)?wt.push(...e):(!Ke||!Ke.includes(e,e.allowRecurse?it+1:it))&&wt.push(e),Eo()}function is(e,t,n=Vt?Fe+1:0){for(;nDt(n)-Dt(r));if(wt.length=0,Ke){Ke.push(...t);return}for(Ke=t,it=0;ite.id==null?1/0:e.id,Al=(e,t)=>{const n=Dt(e)-Dt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Co(e){dr=!1,Vt=!0,ge.sort(Al);try{for(Fe=0;Fe{r._d&&bs(-1);const o=bn(t);let i;try{i=e(...s)}finally{bn(o),r._d&&bs(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function au(e,t){if(ue===null)return e;const n=Vn(ue),r=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),Oo(()=>{e.isUnmounting=!0}),e}const Se=[Function,Array],So={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Se,onEnter:Se,onAfterEnter:Se,onEnterCancelled:Se,onBeforeLeave:Se,onLeave:Se,onAfterLeave:Se,onLeaveCancelled:Se,onBeforeAppear:Se,onAppear:Se,onAfterAppear:Se,onAppearCancelled:Se},To=e=>{const t=e.subTree;return t.component?To(t.component):t},Ll={name:"BaseTransition",props:So,setup(e,{slots:t}){const n=jn(),r=Ol();return()=>{const s=t.default&&Ao(t.default(),!0);if(!s||!s.length)return;let o=s[0];if(s.length>1){for(const m of s)if(m.type!==ye){o=m;break}}const i=J(e),{mode:l}=i;if(r.isLeaving)return Kn(o);const c=ls(o);if(!c)return Kn(o);let u=hr(c,i,r,n,m=>u=m);vn(c,u);const f=n.subTree,h=f&&ls(f);if(h&&h.type!==ye&&!lt(c,h)&&To(n).type!==ye){const m=hr(h,i,r,n);if(vn(h,m),l==="out-in"&&c.type!==ye)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Kn(o);l==="in-out"&&c.type!==ye&&(m.delayLeave=(_,w,O)=>{const U=xo(r,h);U[String(h.key)]=h,_[We]=()=>{w(),_[We]=void 0,delete u.delayedLeave},u.delayedLeave=O})}return o}}},Ml=Ll;function xo(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function hr(e,t,n,r,s){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:m,onLeave:_,onAfterLeave:w,onLeaveCancelled:O,onBeforeAppear:U,onAppear:W,onAfterAppear:H,onAppearCancelled:p}=t,y=String(e.key),I=xo(n,e),x=(M,b)=>{M&&Re(M,r,9,b)},F=(M,b)=>{const P=b[1];x(M,b),k(M)?M.every(S=>S.length<=1)&&P():M.length<=1&&P()},V={mode:i,persisted:l,beforeEnter(M){let b=c;if(!n.isMounted)if(o)b=U||c;else return;M[We]&&M[We](!0);const P=I[y];P&<(e,P)&&P.el[We]&&P.el[We](),x(b,[M])},enter(M){let b=u,P=f,S=h;if(!n.isMounted)if(o)b=W||u,P=H||f,S=p||h;else return;let K=!1;const ee=M[nn]=re=>{K||(K=!0,re?x(S,[M]):x(P,[M]),V.delayedLeave&&V.delayedLeave(),M[nn]=void 0)};b?F(b,[M,ee]):ee()},leave(M,b){const P=String(e.key);if(M[nn]&&M[nn](!0),n.isUnmounting)return b();x(m,[M]);let S=!1;const K=M[We]=ee=>{S||(S=!0,b(),ee?x(O,[M]):x(w,[M]),M[We]=void 0,I[P]===e&&delete I[P])};I[P]=e,_?F(_,[M,K]):K()},clone(M){const b=hr(M,t,n,r,s);return s&&s(b),b}};return V}function Kn(e){if(qt(e))return e=Je(e),e.children=null,e}function ls(e){if(!qt(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function vn(e,t){e.shapeFlag&6&&e.component?vn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ao(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;o!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function uu(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,u,f=0;const h=()=>(f++,c=null,m()),m=()=>{let _;return c||(_=c=t().catch(w=>{if(w=w instanceof Error?w:new Error(String(w)),l)return new Promise((O,U)=>{l(w,()=>O(h()),()=>U(w),f+1)});throw w}).then(w=>_!==c&&c?c:(w&&(w.__esModule||w[Symbol.toStringTag]==="Module")&&(w=w.default),u=w,w)))};return Hr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return u},setup(){const _=ae;if(u)return()=>Wn(u,_);const w=H=>{c=null,Wt(H,_,13,!r)};if(i&&_.suspense||Xt)return m().then(H=>()=>Wn(H,_)).catch(H=>(w(H),()=>r?le(r,{error:H}):null));const O=oe(!1),U=oe(),W=oe(!!s);return s&&setTimeout(()=>{W.value=!1},s),o!=null&&setTimeout(()=>{if(!O.value&&!U.value){const H=new Error(`Async component timed out after ${o}ms.`);w(H),U.value=H}},o),m().then(()=>{O.value=!0,_.parent&&qt(_.parent.vnode)&&(_.parent.effect.dirty=!0,In(_.parent.update))}).catch(H=>{w(H),U.value=H}),()=>{if(O.value&&u)return Wn(u,_);if(U.value&&r)return le(r,{error:U.value});if(n&&!W.value)return le(n)}}})}function Wn(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=le(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const qt=e=>e.type.__isKeepAlive;function Il(e,t){Ro(e,"a",t)}function Pl(e,t){Ro(e,"da",t)}function Ro(e,t,n=ae){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Nn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)qt(s.parent.vnode)&&Nl(r,t,n,s),s=s.parent}}function Nl(e,t,n,r){const s=Nn(t,e,r,!0);Fn(()=>{Cr(r[t],s)},n)}function Nn(e,t,n=ae,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{et();const l=Gt(n),c=Re(t,n,e,i);return l(),tt(),c});return r?s.unshift(o):s.push(o),o}}const De=e=>(t,n=ae)=>{(!Xt||e==="sp")&&Nn(e,(...r)=>t(...r),n)},Fl=De("bm"),At=De("m"),$l=De("bu"),Hl=De("u"),Oo=De("bum"),Fn=De("um"),jl=De("sp"),Vl=De("rtg"),Dl=De("rtc");function Ul(e,t=ae){Nn("ec",e,t)}const jr="components";function fu(e,t){return Mo(jr,e,!0,t)||e}const Lo=Symbol.for("v-ndc");function du(e){return ie(e)?Mo(jr,e,!1)||e:e||Lo}function Mo(e,t,n=!0,r=!1){const s=ue||ae;if(s){const o=s.type;if(e===jr){const l=Pc(o,!1);if(l&&(l===t||l===Le(t)||l===An(Le(t))))return o}const i=cs(s[e]||o[e],t)||cs(s.appContext[e],t);return!i&&r?o:i}}function cs(e,t){return e&&(e[t]||e[Le(t)]||e[An(Le(t))])}function hu(e,t,n,r){let s;const o=n;if(k(e)||ie(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lCn(t)?!(t.type===ye||t.type===be&&!Io(t.children)):!0)?e:null}function gu(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:fn(r)]=e[r];return n}const pr=e=>e?oi(e)?Vn(e):pr(e.parent):null,Pt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>pr(e.parent),$root:e=>pr(e.root),$emit:e=>e.emit,$options:e=>Vr(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,In(e.update)}),$nextTick:e=>e.n||(e.n=Mn.bind(e.proxy)),$watch:e=>gc.bind(e)}),qn=(e,t)=>e!==ne&&!e.__isScriptSetup&&z(e,t),Bl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const _=i[t];if(_!==void 0)switch(_){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(qn(r,t))return i[t]=1,r[t];if(s!==ne&&z(s,t))return i[t]=2,s[t];if((u=e.propsOptions[0])&&z(u,t))return i[t]=3,o[t];if(n!==ne&&z(n,t))return i[t]=4,n[t];gr&&(i[t]=0)}}const f=Pt[t];let h,m;if(f)return t==="$attrs"&&ve(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ne&&z(n,t))return i[t]=4,n[t];if(m=c.config.globalProperties,z(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return qn(s,t)?(s[t]=n,!0):r!==ne&&z(r,t)?(r[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==ne&&z(e,i)||qn(t,i)||(l=o[0])&&z(l,i)||z(r,i)||z(Pt,i)||z(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function mu(){return kl().slots}function kl(){const e=jn();return e.setupContext||(e.setupContext=li(e))}function as(e){return k(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let gr=!0;function Kl(e){const t=Vr(e),n=e.proxy,r=e.ctx;gr=!1,t.beforeCreate&&us(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:u,created:f,beforeMount:h,mounted:m,beforeUpdate:_,updated:w,activated:O,deactivated:U,beforeDestroy:W,beforeUnmount:H,destroyed:p,unmounted:y,render:I,renderTracked:x,renderTriggered:F,errorCaptured:V,serverPrefetch:M,expose:b,inheritAttrs:P,components:S,directives:K,filters:ee}=t;if(u&&Wl(u,r,null),i)for(const Y in i){const B=i[Y];q(B)&&(r[Y]=B.bind(n))}if(s){const Y=s.call(n,n);Z(Y)&&(e.data=On(Y))}if(gr=!0,o)for(const Y in o){const B=o[Y],de=q(B)?B.bind(n,n):q(B.get)?B.get.bind(n,n):Ae,Yt=!q(B)&&q(B.set)?B.set.bind(n):Ae,nt=se({get:de,set:Yt});Object.defineProperty(r,Y,{enumerable:!0,configurable:!0,get:()=>nt.value,set:Ie=>nt.value=Ie})}if(l)for(const Y in l)Po(l[Y],r,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(B=>{Jl(B,Y[B])})}f&&us(f,e,"c");function D(Y,B){k(B)?B.forEach(de=>Y(de.bind(n))):B&&Y(B.bind(n))}if(D(Fl,h),D(At,m),D($l,_),D(Hl,w),D(Il,O),D(Pl,U),D(Ul,V),D(Dl,x),D(Vl,F),D(Oo,H),D(Fn,y),D(jl,M),k(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(B=>{Object.defineProperty(Y,B,{get:()=>n[B],set:de=>n[B]=de})})}else e.exposed||(e.exposed={});I&&e.render===Ae&&(e.render=I),P!=null&&(e.inheritAttrs=P),S&&(e.components=S),K&&(e.directives=K)}function Wl(e,t,n=Ae){k(e)&&(e=mr(e));for(const r in e){const s=e[r];let o;Z(s)?"default"in s?o=St(s.from||r,s.default,!0):o=St(s.from||r):o=St(s),he(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function us(e,t,n){Re(k(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Po(e,t,n,r){const s=r.includes(".")?zo(n,r):()=>n[r];if(ie(e)){const o=t[e];q(o)&&$e(s,o)}else if(q(e))$e(s,e.bind(n));else if(Z(e))if(k(e))e.forEach(o=>Po(o,t,n,r));else{const o=q(e.handler)?e.handler.bind(n):t[e.handler];q(o)&&$e(s,o,e)}}function Vr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(u=>wn(c,u,i,!0)),wn(c,t,i)),Z(t)&&o.set(t,c),c}function wn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&wn(e,o,n,!0),s&&s.forEach(i=>wn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=ql[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const ql={data:fs,props:ds,emits:ds,methods:Mt,computed:Mt,beforeCreate:me,created:me,beforeMount:me,mounted:me,beforeUpdate:me,updated:me,beforeDestroy:me,beforeUnmount:me,destroyed:me,unmounted:me,activated:me,deactivated:me,errorCaptured:me,serverPrefetch:me,components:Mt,directives:Mt,watch:Xl,provide:fs,inject:Gl};function fs(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Gl(e,t){return Mt(mr(e),mr(t))}function mr(e){if(k(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(r&&r.proxy):t}}const Fo={},$o=()=>Object.create(Fo),Ho=e=>Object.getPrototypeOf(e)===Fo;function Ql(e,t,n,r=!1){const s={},o=$o();e.propsDefaults=Object.create(null),jo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:hl(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Zl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,_]=Vo(h,t,!0);fe(i,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return Z(e)&&r.set(e,yt),yt;if(k(o))for(let f=0;fe[0]==="_"||e==="$stable",Dr=e=>k(e)?e.map(xe):[xe(e)],tc=(e,t,n)=>{if(t._n)return t;const r=Rl((...s)=>Dr(t(...s)),n);return r._c=!1,r},Uo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Do(s))continue;const o=e[s];if(q(o))t[s]=tc(s,o,r);else if(o!=null){const i=Dr(o);t[s]=()=>i}}},Bo=(e,t)=>{const n=Dr(t);e.slots.default=()=>n},ko=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},nc=(e,t,n)=>{const r=e.slots=$o();if(e.vnode.shapeFlag&32){const s=t._;s?(ko(r,t,n),n&&Qs(r,"_",s,!0)):Uo(t,r)}else t&&Bo(e,t)},rc=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=ne;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:ko(s,t,n):(o=!t.$stable,Uo(t,s)),i=t}else t&&(Bo(e,t),i={default:1});if(o)for(const l in s)!Do(l)&&i[l]==null&&delete s[l]};function En(e,t,n,r,s=!1){if(k(e)){e.forEach((m,_)=>En(m,t&&(k(t)?t[_]:t),n,r,s));return}if(Et(r)&&!s)return;const o=r.shapeFlag&4?Vn(r.component):r.el,i=s?null:o,{i:l,r:c}=e,u=t&&t.r,f=l.refs===ne?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(ie(u)?(f[u]=null,z(h,u)&&(h[u]=null)):he(u)&&(u.value=null)),q(c))Ye(c,l,12,[i,f]);else{const m=ie(c),_=he(c);if(m||_){const w=()=>{if(e.f){const O=m?z(h,c)?h[c]:f[c]:c.value;s?k(O)&&Cr(O,o):k(O)?O.includes(o)||O.push(o):m?(f[c]=[o],z(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else m?(f[c]=i,z(h,c)&&(h[c]=i)):_&&(c.value=i,e.k&&(f[e.k]=i))};i?(w.id=-1,_e(w,n)):w()}}}const Ko=Symbol("_vte"),sc=e=>e.__isTeleport,Nt=e=>e&&(e.disabled||e.disabled===""),ps=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gs=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_r=(e,t)=>{const n=e&&e.to;return ie(n)?t?t(n):null:n},oc={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,u){const{mc:f,pc:h,pbc:m,o:{insert:_,querySelector:w,createText:O,createComment:U}}=u,W=Nt(t.props);let{shapeFlag:H,children:p,dynamicChildren:y}=t;if(e==null){const I=t.el=O(""),x=t.anchor=O("");_(I,n,r),_(x,n,r);const F=t.target=_r(t.props,w),V=qo(F,t,O,_);F&&(i==="svg"||ps(F)?i="svg":(i==="mathml"||gs(F))&&(i="mathml"));const M=(b,P)=>{H&16&&f(p,b,P,s,o,i,l,c)};W?M(n,x):F&&M(F,V)}else{t.el=e.el,t.targetStart=e.targetStart;const I=t.anchor=e.anchor,x=t.target=e.target,F=t.targetAnchor=e.targetAnchor,V=Nt(e.props),M=V?n:x,b=V?I:F;if(i==="svg"||ps(x)?i="svg":(i==="mathml"||gs(x))&&(i="mathml"),y?(m(e.dynamicChildren,y,M,s,o,i,l),Ur(e,t,!0)):c||h(e,t,M,b,s,o,i,l,!1),W)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):rn(t,n,I,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const P=t.target=_r(t.props,w);P&&rn(t,P,null,u,0)}else V&&rn(t,x,F,u,1)}Wo(t)},remove(e,t,n,{um:r,o:{remove:s}},o){const{shapeFlag:i,children:l,anchor:c,targetStart:u,targetAnchor:f,target:h,props:m}=e;if(h&&(s(u),s(f)),o&&s(c),i&16){const _=o||!Nt(m);for(let w=0;w{ms||(console.error("Hydration completed but contains mismatches."),ms=!0)},lc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",cc=e=>e.namespaceURI.includes("MathML"),sn=e=>{if(lc(e))return"svg";if(cc(e))return"mathml"},on=e=>e.nodeType===8;function ac(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:u}}=e,f=(p,y)=>{if(!y.hasChildNodes()){n(null,p,y),_n(),y._vnode=p;return}h(y.firstChild,p,null,null,null),_n(),y._vnode=p},h=(p,y,I,x,F,V=!1)=>{V=V||!!y.dynamicChildren;const M=on(p)&&p.data==="[",b=()=>O(p,y,I,x,F,M),{type:P,ref:S,shapeFlag:K,patchFlag:ee}=y;let re=p.nodeType;y.el=p,ee===-2&&(V=!1,y.dynamicChildren=null);let D=null;switch(P){case ut:re!==3?y.children===""?(c(y.el=s(""),i(p),p),D=p):D=b():(p.data!==y.children&&(gt(),p.data=y.children),D=o(p));break;case ye:H(p)?(D=o(p),W(y.el=p.content.firstChild,p,I)):re!==8||M?D=b():D=o(p);break;case Ft:if(M&&(p=o(p),re=p.nodeType),re===1||re===3){D=p;const Y=!y.children.length;for(let B=0;B{V=V||!!y.dynamicChildren;const{type:M,props:b,patchFlag:P,shapeFlag:S,dirs:K,transition:ee}=y,re=M==="input"||M==="option";if(re||P!==-1){K&&Ne(y,null,I,"created");let D=!1;if(H(p)){D=Xo(x,ee)&&I&&I.vnode.props&&I.vnode.props.appear;const B=p.content.firstChild;D&&ee.beforeEnter(B),W(B,p,I),y.el=p=B}if(S&16&&!(b&&(b.innerHTML||b.textContent))){let B=_(p.firstChild,y,p,I,x,F,V);for(;B;){gt();const de=B;B=B.nextSibling,l(de)}}else S&8&&p.textContent!==y.children&&(gt(),p.textContent=y.children);if(b){if(re||!V||P&48){const B=p.tagName.includes("-");for(const de in b)(re&&(de.endsWith("value")||de==="indeterminate")||Kt(de)&&!bt(de)||de[0]==="."||B)&&r(p,de,null,b[de],void 0,I)}else if(b.onClick)r(p,"onClick",null,b.onClick,void 0,I);else if(P&4&&vt(b.style))for(const B in b.style)b.style[B]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Te(Y,I,y),K&&Ne(y,null,I,"beforeMount"),((Y=b&&b.onVnodeMounted)||K||D)&&Qo(()=>{Y&&Te(Y,I,y),D&&ee.enter(p),K&&Ne(y,null,I,"mounted")},x)}return p.nextSibling},_=(p,y,I,x,F,V,M)=>{M=M||!!y.dynamicChildren;const b=y.children,P=b.length;for(let S=0;S{const{slotScopeIds:M}=y;M&&(F=F?F.concat(M):M);const b=i(p),P=_(o(p),y,b,I,x,F,V);return P&&on(P)&&P.data==="]"?o(y.anchor=P):(gt(),c(y.anchor=u("]"),b,P),P)},O=(p,y,I,x,F,V)=>{if(gt(),y.el=null,V){const P=U(p);for(;;){const S=o(p);if(S&&S!==P)l(S);else break}}const M=o(p),b=i(p);return l(p),n(null,y,b,M,I,x,sn(b),F),M},U=(p,y="[",I="]")=>{let x=0;for(;p;)if(p=o(p),p&&on(p)&&(p.data===y&&x++,p.data===I)){if(x===0)return o(p);x--}return p},W=(p,y,I)=>{const x=y.parentNode;x&&x.replaceChild(p,y);let F=I;for(;F;)F.vnode.el===y&&(F.vnode.el=F.subTree.el=p),F=F.parent},H=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[f,h]}const _e=Qo;function uc(e){return Go(e)}function fc(e){return Go(e,ac)}function Go(e,t){const n=Zs();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:u,setElementText:f,parentNode:h,nextSibling:m,setScopeId:_=Ae,insertStaticContent:w}=e,O=(a,d,g,C=null,v=null,T=null,L=void 0,A=null,R=!!d.dynamicChildren)=>{if(a===d)return;a&&!lt(a,d)&&(C=zt(a),Ie(a,v,T,!0),a=null),d.patchFlag===-2&&(R=!1,d.dynamicChildren=null);const{type:E,ref:N,shapeFlag:j}=d;switch(E){case ut:U(a,d,g,C);break;case ye:W(a,d,g,C);break;case Ft:a==null&&H(d,g,C,L);break;case be:S(a,d,g,C,v,T,L,A,R);break;default:j&1?I(a,d,g,C,v,T,L,A,R):j&6?K(a,d,g,C,v,T,L,A,R):(j&64||j&128)&&E.process(a,d,g,C,v,T,L,A,R,ht)}N!=null&&v&&En(N,a&&a.ref,T,d||a,!d)},U=(a,d,g,C)=>{if(a==null)r(d.el=l(d.children),g,C);else{const v=d.el=a.el;d.children!==a.children&&u(v,d.children)}},W=(a,d,g,C)=>{a==null?r(d.el=c(d.children||""),g,C):d.el=a.el},H=(a,d,g,C)=>{[a.el,a.anchor]=w(a.children,d,g,C,a.el,a.anchor)},p=({el:a,anchor:d},g,C)=>{let v;for(;a&&a!==d;)v=m(a),r(a,g,C),a=v;r(d,g,C)},y=({el:a,anchor:d})=>{let g;for(;a&&a!==d;)g=m(a),s(a),a=g;s(d)},I=(a,d,g,C,v,T,L,A,R)=>{d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),a==null?x(d,g,C,v,T,L,A,R):M(a,d,v,T,L,A,R)},x=(a,d,g,C,v,T,L,A)=>{let R,E;const{props:N,shapeFlag:j,transition:$,dirs:G}=a;if(R=a.el=i(a.type,T,N&&N.is,N),j&8?f(R,a.children):j&16&&V(a.children,R,null,C,v,Gn(a,T),L,A),G&&Ne(a,null,C,"created"),F(R,a,a.scopeId,L,C),N){for(const te in N)te!=="value"&&!bt(te)&&o(R,te,null,N[te],T,C);"value"in N&&o(R,"value",null,N.value,T),(E=N.onVnodeBeforeMount)&&Te(E,C,a)}G&&Ne(a,null,C,"beforeMount");const X=Xo(v,$);X&&$.beforeEnter(R),r(R,d,g),((E=N&&N.onVnodeMounted)||X||G)&&_e(()=>{E&&Te(E,C,a),X&&$.enter(R),G&&Ne(a,null,C,"mounted")},v)},F=(a,d,g,C,v)=>{if(g&&_(a,g),C)for(let T=0;T{for(let E=R;E{const A=d.el=a.el;let{patchFlag:R,dynamicChildren:E,dirs:N}=d;R|=a.patchFlag&16;const j=a.props||ne,$=d.props||ne;let G;if(g&&rt(g,!1),(G=$.onVnodeBeforeUpdate)&&Te(G,g,d,a),N&&Ne(d,a,g,"beforeUpdate"),g&&rt(g,!0),(j.innerHTML&&$.innerHTML==null||j.textContent&&$.textContent==null)&&f(A,""),E?b(a.dynamicChildren,E,A,g,C,Gn(d,v),T):L||B(a,d,A,null,g,C,Gn(d,v),T,!1),R>0){if(R&16)P(A,j,$,g,v);else if(R&2&&j.class!==$.class&&o(A,"class",null,$.class,v),R&4&&o(A,"style",j.style,$.style,v),R&8){const X=d.dynamicProps;for(let te=0;te{G&&Te(G,g,d,a),N&&Ne(d,a,g,"updated")},C)},b=(a,d,g,C,v,T,L)=>{for(let A=0;A{if(d!==g){if(d!==ne)for(const T in d)!bt(T)&&!(T in g)&&o(a,T,d[T],null,v,C);for(const T in g){if(bt(T))continue;const L=g[T],A=d[T];L!==A&&T!=="value"&&o(a,T,A,L,v,C)}"value"in g&&o(a,"value",d.value,g.value,v)}},S=(a,d,g,C,v,T,L,A,R)=>{const E=d.el=a?a.el:l(""),N=d.anchor=a?a.anchor:l("");let{patchFlag:j,dynamicChildren:$,slotScopeIds:G}=d;G&&(A=A?A.concat(G):G),a==null?(r(E,g,C),r(N,g,C),V(d.children||[],g,N,v,T,L,A,R)):j>0&&j&64&&$&&a.dynamicChildren?(b(a.dynamicChildren,$,g,v,T,L,A),(d.key!=null||v&&d===v.subTree)&&Ur(a,d,!0)):B(a,d,g,N,v,T,L,A,R)},K=(a,d,g,C,v,T,L,A,R)=>{d.slotScopeIds=A,a==null?d.shapeFlag&512?v.ctx.activate(d,g,C,L,R):ee(d,g,C,v,T,L,R):re(a,d,R)},ee=(a,d,g,C,v,T,L)=>{const A=a.component=Oc(a,C,v);if(qt(a)&&(A.ctx.renderer=ht),Lc(A,!1,L),A.asyncDep){if(v&&v.registerDep(A,D,L),!a.el){const R=A.subTree=le(ye);W(null,R,d,g)}}else D(A,a,d,g,v,T,L)},re=(a,d,g)=>{const C=d.component=a.component;if(vc(a,d,g))if(C.asyncDep&&!C.asyncResolved){Y(C,d,g);return}else C.next=d,Tl(C.update),C.effect.dirty=!0,C.update();else d.el=a.el,C.vnode=d},D=(a,d,g,C,v,T,L)=>{const A=()=>{if(a.isMounted){let{next:N,bu:j,u:$,parent:G,vnode:X}=a;{const pt=Yo(a);if(pt){N&&(N.el=X.el,Y(a,N,L)),pt.asyncDep.then(()=>{a.isUnmounted||A()});return}}let te=N,Q;rt(a,!1),N?(N.el=X.el,Y(a,N,L)):N=X,j&&dn(j),(Q=N.props&&N.props.onVnodeBeforeUpdate)&&Te(Q,G,N,X),rt(a,!0);const ce=Xn(a),Oe=a.subTree;a.subTree=ce,O(Oe,ce,h(Oe.el),zt(Oe),a,v,T),N.el=ce.el,te===null&&wc(a,ce.el),$&&_e($,v),(Q=N.props&&N.props.onVnodeUpdated)&&_e(()=>Te(Q,G,N,X),v)}else{let N;const{el:j,props:$}=d,{bm:G,m:X,parent:te}=a,Q=Et(d);if(rt(a,!1),G&&dn(G),!Q&&(N=$&&$.onVnodeBeforeMount)&&Te(N,te,d),rt(a,!0),j&&Bn){const ce=()=>{a.subTree=Xn(a),Bn(j,a.subTree,a,v,null)};Q?d.type.__asyncLoader().then(()=>!a.isUnmounted&&ce()):ce()}else{const ce=a.subTree=Xn(a);O(null,ce,g,C,a,v,T),d.el=ce.el}if(X&&_e(X,v),!Q&&(N=$&&$.onVnodeMounted)){const ce=d;_e(()=>Te(N,te,ce),v)}(d.shapeFlag&256||te&&Et(te.vnode)&&te.vnode.shapeFlag&256)&&a.a&&_e(a.a,v),a.isMounted=!0,d=g=C=null}},R=a.effect=new Ar(A,Ae,()=>In(E),a.scope),E=a.update=()=>{R.dirty&&R.run()};E.i=a,E.id=a.uid,rt(a,!0),E()},Y=(a,d,g)=>{d.component=a;const C=a.vnode.props;a.vnode=d,a.next=null,Zl(a,d.props,C,g),rc(a,d.children,g),et(),is(a),tt()},B=(a,d,g,C,v,T,L,A,R=!1)=>{const E=a&&a.children,N=a?a.shapeFlag:0,j=d.children,{patchFlag:$,shapeFlag:G}=d;if($>0){if($&128){Yt(E,j,g,C,v,T,L,A,R);return}else if($&256){de(E,j,g,C,v,T,L,A,R);return}}G&8?(N&16&&Rt(E,v,T),j!==E&&f(g,j)):N&16?G&16?Yt(E,j,g,C,v,T,L,A,R):Rt(E,v,T,!0):(N&8&&f(g,""),G&16&&V(j,g,C,v,T,L,A,R))},de=(a,d,g,C,v,T,L,A,R)=>{a=a||yt,d=d||yt;const E=a.length,N=d.length,j=Math.min(E,N);let $;for($=0;$N?Rt(a,v,T,!0,!1,j):V(d,g,C,v,T,L,A,R,j)},Yt=(a,d,g,C,v,T,L,A,R)=>{let E=0;const N=d.length;let j=a.length-1,$=N-1;for(;E<=j&&E<=$;){const G=a[E],X=d[E]=R?qe(d[E]):xe(d[E]);if(lt(G,X))O(G,X,g,null,v,T,L,A,R);else break;E++}for(;E<=j&&E<=$;){const G=a[j],X=d[$]=R?qe(d[$]):xe(d[$]);if(lt(G,X))O(G,X,g,null,v,T,L,A,R);else break;j--,$--}if(E>j){if(E<=$){const G=$+1,X=G$)for(;E<=j;)Ie(a[E],v,T,!0),E++;else{const G=E,X=E,te=new Map;for(E=X;E<=$;E++){const we=d[E]=R?qe(d[E]):xe(d[E]);we.key!=null&&te.set(we.key,E)}let Q,ce=0;const Oe=$-X+1;let pt=!1,Yr=0;const Ot=new Array(Oe);for(E=0;E=Oe){Ie(we,v,T,!0);continue}let Pe;if(we.key!=null)Pe=te.get(we.key);else for(Q=X;Q<=$;Q++)if(Ot[Q-X]===0&<(we,d[Q])){Pe=Q;break}Pe===void 0?Ie(we,v,T,!0):(Ot[Pe-X]=E+1,Pe>=Yr?Yr=Pe:pt=!0,O(we,d[Pe],g,null,v,T,L,A,R),ce++)}const zr=pt?dc(Ot):yt;for(Q=zr.length-1,E=Oe-1;E>=0;E--){const we=X+E,Pe=d[we],Jr=we+1{const{el:T,type:L,transition:A,children:R,shapeFlag:E}=a;if(E&6){nt(a.component.subTree,d,g,C);return}if(E&128){a.suspense.move(d,g,C);return}if(E&64){L.move(a,d,g,ht);return}if(L===be){r(T,d,g);for(let j=0;jA.enter(T),v);else{const{leave:j,delayLeave:$,afterLeave:G}=A,X=()=>r(T,d,g),te=()=>{j(T,()=>{X(),G&&G()})};$?$(T,X,te):te()}else r(T,d,g)},Ie=(a,d,g,C=!1,v=!1)=>{const{type:T,props:L,ref:A,children:R,dynamicChildren:E,shapeFlag:N,patchFlag:j,dirs:$,cacheIndex:G}=a;if(j===-2&&(v=!1),A!=null&&En(A,null,g,a,!0),G!=null&&(d.renderCache[G]=void 0),N&256){d.ctx.deactivate(a);return}const X=N&1&&$,te=!Et(a);let Q;if(te&&(Q=L&&L.onVnodeBeforeUnmount)&&Te(Q,d,a),N&6)Li(a.component,g,C);else{if(N&128){a.suspense.unmount(g,C);return}X&&Ne(a,null,d,"beforeUnmount"),N&64?a.type.remove(a,d,g,ht,C):E&&!E.hasOnce&&(T!==be||j>0&&j&64)?Rt(E,d,g,!1,!0):(T===be&&j&384||!v&&N&16)&&Rt(R,d,g),C&&Gr(a)}(te&&(Q=L&&L.onVnodeUnmounted)||X)&&_e(()=>{Q&&Te(Q,d,a),X&&Ne(a,null,d,"unmounted")},g)},Gr=a=>{const{type:d,el:g,anchor:C,transition:v}=a;if(d===be){Oi(g,C);return}if(d===Ft){y(a);return}const T=()=>{s(g),v&&!v.persisted&&v.afterLeave&&v.afterLeave()};if(a.shapeFlag&1&&v&&!v.persisted){const{leave:L,delayLeave:A}=v,R=()=>L(g,T);A?A(a.el,T,R):R()}else T()},Oi=(a,d)=>{let g;for(;a!==d;)g=m(a),s(a),a=g;s(d)},Li=(a,d,g)=>{const{bum:C,scope:v,update:T,subTree:L,um:A,m:R,a:E}=a;ys(R),ys(E),C&&dn(C),v.stop(),T&&(T.active=!1,Ie(L,a,d,g)),A&&_e(A,d),_e(()=>{a.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Rt=(a,d,g,C=!1,v=!1,T=0)=>{for(let L=T;L{if(a.shapeFlag&6)return zt(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=m(a.anchor||a.el),g=d&&d[Ko];return g?m(g):d};let Dn=!1;const Xr=(a,d,g)=>{a==null?d._vnode&&Ie(d._vnode,null,null,!0):O(d._vnode||null,a,d,null,null,null,g),d._vnode=a,Dn||(Dn=!0,is(),_n(),Dn=!1)},ht={p:O,um:Ie,m:nt,r:Gr,mt:ee,mc:V,pc:B,pbc:b,n:zt,o:e};let Un,Bn;return t&&([Un,Bn]=t(ht)),{render:Xr,hydrate:Un,createApp:zl(Xr,Un)}}function Gn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function rt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Xo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ur(e,t,n=!1){const r=e.children,s=t.children;if(k(r)&&k(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function Yo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Yo(t)}function ys(e){if(e)for(let t=0;tSt(hc);function Br(e,t){return $n(e,null,t)}function _u(e,t){return $n(e,null,{flush:"post"})}const ln={};function $e(e,t,n){return $n(e,t,n)}function $n(e,t,{immediate:n,deep:r,flush:s,once:o,onTrack:i,onTrigger:l}=ne){if(t&&o){const x=t;t=(...F)=>{x(...F),I()}}const c=ae,u=x=>r===!0?x:Ge(x,r===!1?1:void 0);let f,h=!1,m=!1;if(he(e)?(f=()=>e.value,h=Tt(e)):vt(e)?(f=()=>u(e),h=!0):k(e)?(m=!0,h=e.some(x=>vt(x)||Tt(x)),f=()=>e.map(x=>{if(he(x))return x.value;if(vt(x))return u(x);if(q(x))return Ye(x,c,2)})):q(e)?t?f=()=>Ye(e,c,2):f=()=>(_&&_(),Re(e,c,3,[w])):f=Ae,t&&r){const x=f;f=()=>Ge(x())}let _,w=x=>{_=p.onStop=()=>{Ye(x,c,4),_=p.onStop=void 0}},O;if(Xt)if(w=Ae,t?n&&Re(t,c,3,[f(),m?[]:void 0,w]):f(),s==="sync"){const x=pc();O=x.__watcherHandles||(x.__watcherHandles=[])}else return Ae;let U=m?new Array(e.length).fill(ln):ln;const W=()=>{if(!(!p.active||!p.dirty))if(t){const x=p.run();(r||h||(m?x.some((F,V)=>ze(F,U[V])):ze(x,U)))&&(_&&_(),Re(t,c,3,[x,U===ln?void 0:m&&U[0]===ln?[]:U,w]),U=x)}else p.run()};W.allowRecurse=!!t;let H;s==="sync"?H=W:s==="post"?H=()=>_e(W,c&&c.suspense):(W.pre=!0,c&&(W.id=c.uid),H=()=>In(W));const p=new Ar(f,Ae,H),y=ro(),I=()=>{p.stop(),y&&Cr(y.effects,p)};return t?n?W():U=p.run():s==="post"?_e(p.run.bind(p),c&&c.suspense):p.run(),O&&O.push(I),I}function gc(e,t,n){const r=this.proxy,s=ie(e)?e.includes(".")?zo(r,e):()=>r[e]:e.bind(r,r);let o;q(t)?o=t:(o=t.handler,n=t);const i=Gt(this),l=$n(s,o.bind(r),n);return i(),l}function zo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{Ge(r,t,n)});else if(Js(e)){for(const r in e)Ge(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Ge(e[r],t,n)}return e}const mc=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${Ze(t)}Modifiers`];function yc(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ne;let s=n;const o=t.startsWith("update:"),i=o&&mc(r,t.slice(7));i&&(i.trim&&(s=n.map(f=>ie(f)?f.trim():f)),i.number&&(s=n.map(cr)));let l,c=r[l=fn(t)]||r[l=fn(Le(t))];!c&&o&&(c=r[l=fn(Ze(t))]),c&&Re(c,e,6,s);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(u,e,6,s)}}function Jo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!q(e)){const c=u=>{const f=Jo(u,t,!0);f&&(l=!0,fe(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(Z(e)&&r.set(e,null),null):(k(o)?o.forEach(c=>i[c]=null):fe(i,o),Z(e)&&r.set(e,i),i)}function Hn(e,t){return!e||!Kt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,Ze(t))||z(e,t))}function Xn(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:l,emit:c,render:u,renderCache:f,props:h,data:m,setupState:_,ctx:w,inheritAttrs:O}=e,U=bn(e);let W,H;try{if(n.shapeFlag&4){const y=s||r,I=y;W=xe(u.call(I,y,f,h,_,m,w)),H=l}else{const y=t;W=xe(y.length>1?y(h,{attrs:l,slots:i,emit:c}):y(h,null)),H=t.props?l:_c(l)}}catch(y){$t.length=0,Wt(y,e,1),W=le(ye)}let p=W;if(H&&O!==!1){const y=Object.keys(H),{shapeFlag:I}=p;y.length&&I&7&&(o&&y.some(Er)&&(H=bc(H,o)),p=Je(p,H,!1,!0))}return n.dirs&&(p=Je(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),W=p,bn(U),W}const _c=e=>{let t;for(const n in e)(n==="class"||n==="style"||Kt(n))&&((t||(t={}))[n]=e[n]);return t},bc=(e,t)=>{const n={};for(const r in e)(!Er(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function vc(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?_s(r,i,u):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function Qo(e,t){t&&t.pendingBranch?k(e)?t.effects.push(...e):t.effects.push(e):xl(e)}const be=Symbol.for("v-fgt"),ut=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Ft=Symbol.for("v-stc"),$t=[];let Ce=null;function Zo(e=!1){$t.push(Ce=e?null:[])}function Cc(){$t.pop(),Ce=$t[$t.length-1]||null}let Ut=1;function bs(e){Ut+=e,e<0&&Ce&&(Ce.hasOnce=!0)}function ei(e){return e.dynamicChildren=Ut>0?Ce||yt:null,Cc(),Ut>0&&Ce&&Ce.push(e),e}function bu(e,t,n,r,s,o){return ei(ri(e,t,n,r,s,o,!0))}function ti(e,t,n,r,s){return ei(le(e,t,n,r,s,!0))}function Cn(e){return e?e.__v_isVNode===!0:!1}function lt(e,t){return e.type===t.type&&e.key===t.key}const ni=({key:e})=>e??null,pn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||he(e)||q(e)?{i:ue,r:e,k:t,f:!!n}:e:null);function ri(e,t=null,n=null,r=0,s=null,o=e===be?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ni(t),ref:t&&pn(t),scopeId:Pn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:ue};return l?(kr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Ut>0&&!i&&Ce&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Ce.push(c),c}const le=Sc;function Sc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Lo)&&(e=ye),Cn(e)){const l=Je(e,t,!0);return n&&kr(l,n),Ut>0&&!o&&Ce&&(l.shapeFlag&6?Ce[Ce.indexOf(e)]=l:Ce.push(l)),l.patchFlag=-2,l}if(Nc(e)&&(e=e.__vccOpts),t){t=Tc(t);let{class:l,style:c}=t;l&&!ie(l)&&(t.class=xr(l)),Z(c)&&(mo(c)&&!k(c)&&(c=fe({},c)),t.style=Tr(c))}const i=ie(e)?1:Ec(e)?128:sc(e)?64:Z(e)?4:q(e)?2:0;return ri(e,t,n,r,s,i,o,!0)}function Tc(e){return e?mo(e)||Ho(e)?fe({},e):e:null}function Je(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:l,transition:c}=e,u=t?xc(s||{},t):s,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&ni(u),ref:t&&t.ref?n&&o?k(o)?o.concat(pn(t)):[o,pn(t)]:pn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==be?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Je(e.ssContent),ssFallback:e.ssFallback&&Je(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&vn(f,c.clone(f)),f}function si(e=" ",t=0){return le(ut,null,e,t)}function vu(e,t){const n=le(Ft,null,e);return n.staticCount=t,n}function wu(e="",t=!1){return t?(Zo(),ti(ye,null,e)):le(ye,null,e)}function xe(e){return e==null||typeof e=="boolean"?le(ye):k(e)?le(be,null,e.slice()):typeof e=="object"?qe(e):le(ut,null,String(e))}function qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Je(e)}function kr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(k(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),kr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!Ho(t)?t._ctx=ue:s===3&&ue&&(ue.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:ue},n=32):(t=String(t),r&64?(n=16,t=[si(t)]):n=8);e.children=t,e.shapeFlag|=n}function xc(...e){const t={};for(let n=0;nae||ue;let Sn,br;{const e=Zs(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),o=>{s.length>1?s.forEach(i=>i(o)):s[0](o)}};Sn=t("__VUE_INSTANCE_SETTERS__",n=>ae=n),br=t("__VUE_SSR_SETTERS__",n=>Xt=n)}const Gt=e=>{const t=ae;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},vs=()=>{ae&&ae.scope.off(),Sn(null)};function oi(e){return e.vnode.shapeFlag&4}let Xt=!1;function Lc(e,t=!1,n=!1){t&&br(t);const{props:r,children:s}=e.vnode,o=oi(e);Ql(e,r,o,t),nc(e,s,n);const i=o?Mc(e,t):void 0;return t&&br(!1),i}function Mc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Bl);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?li(e):null,o=Gt(e);et();const i=Ye(r,e,0,[e.props,s]);if(tt(),o(),Ys(i)){if(i.then(vs,vs),t)return i.then(l=>{ws(e,l,t)}).catch(l=>{Wt(l,e,0)});e.asyncDep=i}else ws(e,i,t)}else ii(e,t)}function ws(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=vo(t)),ii(e,n)}let Es;function ii(e,t,n){const r=e.type;if(!e.render){if(!t&&Es&&!r.render){const s=r.template||Vr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,u=fe(fe({isCustomElement:o,delimiters:l},i),c);r.render=Es(s,u)}}e.render=r.render||Ae}{const s=Gt(e);et();try{Kl(e)}finally{tt(),s()}}}const Ic={get(e,t){return ve(e,"get",""),e[t]}};function li(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Ic),slots:e.slots,emit:e.emit,expose:t}}function Vn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(vo(hn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Pt)return Pt[n](e)},has(t,n){return n in t||n in Pt}})):e.proxy}function Pc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Nc(e){return q(e)&&"__vccOpts"in e}const se=(e,t)=>pl(e,t,Xt);function vr(e,t,n){const r=arguments.length;return r===2?Z(t)&&!k(t)?Cn(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Cn(n)&&(n=[n]),le(e,t,n))}const Fc="3.4.38";/** +* @vue/runtime-dom v3.4.38 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const $c="http://www.w3.org/2000/svg",Hc="http://www.w3.org/1998/Math/MathML",je=typeof document<"u"?document:null,Cs=je&&je.createElement("template"),jc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?je.createElementNS($c,e):t==="mathml"?je.createElementNS(Hc,e):n?je.createElement(e,{is:n}):je.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>je.createTextNode(e),createComment:e=>je.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>je.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Cs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Cs.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Be="transition",Lt="animation",Bt=Symbol("_vtc"),ci=(e,{slots:t})=>vr(Ml,Vc(e),t);ci.displayName="Transition";const ai={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ci.props=fe({},So,ai);const st=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ss=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function Vc(e){const t={};for(const S in e)S in ai||(t[S]=e[S]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,w=Dc(s),O=w&&w[0],U=w&&w[1],{onBeforeEnter:W,onEnter:H,onEnterCancelled:p,onLeave:y,onLeaveCancelled:I,onBeforeAppear:x=W,onAppear:F=H,onAppearCancelled:V=p}=t,M=(S,K,ee)=>{ot(S,K?f:l),ot(S,K?u:i),ee&&ee()},b=(S,K)=>{S._isLeaving=!1,ot(S,h),ot(S,_),ot(S,m),K&&K()},P=S=>(K,ee)=>{const re=S?F:H,D=()=>M(K,S,ee);st(re,[K,D]),Ts(()=>{ot(K,S?c:o),ke(K,S?f:l),Ss(re)||xs(K,r,O,D)})};return fe(t,{onBeforeEnter(S){st(W,[S]),ke(S,o),ke(S,i)},onBeforeAppear(S){st(x,[S]),ke(S,c),ke(S,u)},onEnter:P(!1),onAppear:P(!0),onLeave(S,K){S._isLeaving=!0;const ee=()=>b(S,K);ke(S,h),ke(S,m),kc(),Ts(()=>{S._isLeaving&&(ot(S,h),ke(S,_),Ss(y)||xs(S,r,U,ee))}),st(y,[S,ee])},onEnterCancelled(S){M(S,!1),st(p,[S])},onAppearCancelled(S){M(S,!0),st(V,[S])},onLeaveCancelled(S){b(S),st(I,[S])}})}function Dc(e){if(e==null)return null;if(Z(e))return[Yn(e.enter),Yn(e.leave)];{const t=Yn(e);return[t,t]}}function Yn(e){return $i(e)}function ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Bt]||(e[Bt]=new Set)).add(t)}function ot(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Bt];n&&(n.delete(t),n.size||(e[Bt]=void 0))}function Ts(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Uc=0;function xs(e,t,n,r){const s=e._endId=++Uc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Bc(e,t);if(!i)return r();const u=i+"end";let f=0;const h=()=>{e.removeEventListener(u,m),o()},m=_=>{_.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[w]||"").split(", "),s=r(`${Be}Delay`),o=r(`${Be}Duration`),i=As(s,o),l=r(`${Lt}Delay`),c=r(`${Lt}Duration`),u=As(l,c);let f=null,h=0,m=0;t===Be?i>0&&(f=Be,h=i,m=o.length):t===Lt?u>0&&(f=Lt,h=u,m=c.length):(h=Math.max(i,u),f=h>0?i>u?Be:Lt:null,m=f?f===Be?o.length:c.length:0);const _=f===Be&&/\b(transform|all)(,|$)/.test(r(`${Be}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:_}}function As(e,t){for(;e.lengthRs(n)+Rs(e[r])))}function Rs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function kc(){return document.body.offsetHeight}function Kc(e,t,n){const r=e[Bt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Os=Symbol("_vod"),Wc=Symbol("_vsh"),qc=Symbol(""),Gc=/(^|;)\s*display\s*:/;function Xc(e,t,n){const r=e.style,s=ie(n);let o=!1;if(n&&!s){if(t)if(ie(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&gn(r,l,"")}else for(const i in t)n[i]==null&&gn(r,i,"");for(const i in n)i==="display"&&(o=!0),gn(r,i,n[i])}else if(s){if(t!==n){const i=r[qc];i&&(n+=";"+i),r.cssText=n,o=Gc.test(n)}}else t&&e.removeAttribute("style");Os in e&&(e[Os]=o?r.display:"",e[Wc]&&(r.display="none"))}const Ls=/\s*!important$/;function gn(e,t,n){if(k(n))n.forEach(r=>gn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Yc(e,t);Ls.test(n)?e.setProperty(Ze(r),n.replace(Ls,""),"important"):e[r]=n}}const Ms=["Webkit","Moz","ms"],zn={};function Yc(e,t){const n=zn[t];if(n)return n;let r=Le(t);if(r!=="filter"&&r in e)return zn[t]=r;r=An(r);for(let s=0;sJn||(ea.then(()=>Jn=0),Jn=Date.now());function na(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Re(ra(r,n.value),t,5,[r])};return n.value=e,n.attached=ta(),n}function ra(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const $s=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,sa=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?Kc(e,r,i):t==="style"?Xc(e,n,r):Kt(t)?Er(t)||Qc(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):oa(e,t,r,i))?(zc(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ps(e,t,r,i,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ps(e,t,r,i))};function oa(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&$s(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return $s(t)&&ie(n)?!1:t in e}const Hs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>dn(t,n):t};function ia(e){e.target.composing=!0}function js(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Qn=Symbol("_assign"),Eu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Qn]=Hs(s);const o=r||s.props&&s.props.type==="number";mt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=cr(l)),e[Qn](l)}),n&&mt(e,"change",()=>{e.value=e.value.trim()}),t||(mt(e,"compositionstart",ia),mt(e,"compositionend",js),mt(e,"change",js))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[Qn]=Hs(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?cr(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},la=["ctrl","shift","alt","meta"],ca={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>la.some(n=>e[`${n}Key`]&&!t.includes(n))},Cu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=Ze(s.key);if(t.some(i=>i===o||aa[i]===o))return e(s)})},ui=fe({patchProp:sa},jc);let Ht,Vs=!1;function ua(){return Ht||(Ht=uc(ui))}function fa(){return Ht=Vs?Ht:fc(ui),Vs=!0,Ht}const Tu=(...e)=>{const t=ua().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=di(r);if(!s)return;const o=t._component;!q(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,fi(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},xu=(...e)=>{const t=fa().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=di(r);if(s)return n(s,!0,fi(s))},t};function fi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function di(e){return ie(e)?document.querySelector(e):e}const Au=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},da=window.__VP_SITE_DATA__;function Kr(e){return ro()?(qi(e),!0):!1}function He(e){return typeof e=="function"?e():bo(e)}const hi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ru=e=>e!=null,ha=Object.prototype.toString,pa=e=>ha.call(e)==="[object Object]",kt=()=>{},Ds=ga();function ga(){var e,t;return hi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ma(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const pi=e=>e();function ya(e,t={}){let n,r,s=kt;const o=l=>{clearTimeout(l),s(),s=kt};return l=>{const c=He(e),u=He(t.maxWait);return n&&o(n),c<=0||u!==void 0&&u<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,u&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},u)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function _a(e=pi){const t=oe(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Ln(t),pause:n,resume:r,eventFilter:s}}function ba(e){return jn()}function gi(...e){if(e.length!==1)return wl(...e);const t=e[0];return typeof t=="function"?Ln(_l(()=>({get:t,set:kt}))):oe(t)}function mi(e,t,n={}){const{eventFilter:r=pi,...s}=n;return $e(e,ma(r,t),s)}function va(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=_a(r);return{stop:mi(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Wr(e,t=!0,n){ba()?At(e,n):t?e():Mn(e)}function Ou(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return mi(e,t,{...o,eventFilter:ya(r,{maxWait:s})})}function Lu(e,t,n){let r;he(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=kt}=r,c=oe(!s),u=i?Fr(t):oe(t);let f=0;return Br(async h=>{if(!c.value)return;f++;const m=f;let _=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const w=await e(O=>{h(()=>{o&&(o.value=!1),_||O()})});m===f&&(u.value=w)}catch(w){l(w)}finally{o&&m===f&&(o.value=!1),_=!0}}),s?se(()=>(c.value=!0,u.value)):u}function yi(e){var t;const n=He(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Me=hi?window:void 0;function xt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Me):[t,n,r,s]=e,!t)return kt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,m,_)=>(f.addEventListener(h,m,_),()=>f.removeEventListener(h,m,_)),c=$e(()=>[yi(t),He(s)],([f,h])=>{if(i(),!f)return;const m=pa(h)?{...h}:h;o.push(...n.flatMap(_=>r.map(w=>l(f,_,w,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),i()};return Kr(u),u}function wa(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Mu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Me,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=wa(t);return xt(s,o,f=>{f.repeat&&He(l)||c(f)&&n(f)},i)}function Ea(){const e=oe(!1),t=jn();return t&&At(()=>{e.value=!0},t),e}function Ca(e){const t=Ea();return se(()=>(t.value,!!e()))}function _i(e,t={}){const{window:n=Me}=t,r=Ca(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=oe(!1),i=u=>{o.value=u.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Br(()=>{r.value&&(l(),s=n.matchMedia(He(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Kr(()=>{c(),l(),s=void 0}),o}const cn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},an="__vueuse_ssr_handlers__",Sa=Ta();function Ta(){return an in cn||(cn[an]=cn[an]||{}),cn[an]}function bi(e,t){return Sa[e]||t}function xa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Aa={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Us="vueuse-storage";function qr(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:h=Me,eventFilter:m,onError:_=b=>{console.error(b)},initOnMounted:w}=r,O=(f?Fr:oe)(typeof t=="function"?t():t);if(!n)try{n=bi("getDefaultStorage",()=>{var b;return(b=Me)==null?void 0:b.localStorage})()}catch(b){_(b)}if(!n)return O;const U=He(t),W=xa(U),H=(s=r.serializer)!=null?s:Aa[W],{pause:p,resume:y}=va(O,()=>x(O.value),{flush:o,deep:i,eventFilter:m});h&&l&&Wr(()=>{n instanceof Storage?xt(h,"storage",V):xt(h,Us,M),w&&V()}),w||V();function I(b,P){if(h){const S={key:e,oldValue:b,newValue:P,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",S):new CustomEvent(Us,{detail:S}))}}function x(b){try{const P=n.getItem(e);if(b==null)I(P,null),n.removeItem(e);else{const S=H.write(b);P!==S&&(n.setItem(e,S),I(P,S))}}catch(P){_(P)}}function F(b){const P=b?b.newValue:n.getItem(e);if(P==null)return c&&U!=null&&n.setItem(e,H.write(U)),U;if(!b&&u){const S=H.read(P);return typeof u=="function"?u(S,U):W==="object"&&!Array.isArray(S)?{...U,...S}:S}else return typeof P!="string"?P:H.read(P)}function V(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){O.value=U;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==H.write(O.value)&&(O.value=F(b))}catch(P){_(P)}finally{b?Mn(y):y()}}}}function M(b){V(b.detail)}return O}function vi(e){return _i("(prefers-color-scheme: dark)",e)}const Ra="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Oa(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Me,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=vi({window:s}),_=se(()=>m.value?"dark":"light"),w=c||(i==null?gi(r):qr(i,r,o,{window:s,listenToStorageChanges:l})),O=se(()=>w.value==="auto"?_.value:w.value),U=bi("updateHTMLAttrs",(y,I,x)=>{const F=typeof y=="string"?s==null?void 0:s.document.querySelector(y):yi(y);if(!F)return;const V=new Set,M=new Set;let b=null;if(I==="class"){const S=x.split(/\s/g);Object.values(h).flatMap(K=>(K||"").split(/\s/g)).filter(Boolean).forEach(K=>{S.includes(K)?V.add(K):M.add(K)})}else b={key:I,value:x};if(V.size===0&&M.size===0&&b===null)return;let P;f&&(P=s.document.createElement("style"),P.appendChild(document.createTextNode(Ra)),s.document.head.appendChild(P));for(const S of V)F.classList.add(S);for(const S of M)F.classList.remove(S);b&&F.setAttribute(b.key,b.value),f&&(s.getComputedStyle(P).opacity,document.head.removeChild(P))});function W(y){var I;U(t,n,(I=h[y])!=null?I:y)}function H(y){e.onChanged?e.onChanged(y,W):W(y)}$e(O,H,{flush:"post",immediate:!0}),Wr(()=>H(O.value));const p=se({get(){return u?w.value:O.value},set(y){w.value=y}});try{return Object.assign(p,{store:w,system:_,state:O})}catch{return p}}function La(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Me}=e,s=Oa({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=se(()=>s.system?s.system.value:vi({window:r}).value?"dark":"light");return se({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function Zn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Iu(e,t,n={}){const{window:r=Me}=n;return qr(e,t,r==null?void 0:r.localStorage,n)}function wi(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const er=new WeakMap;function Pu(e,t=!1){const n=oe(t);let r=null,s="";$e(gi(e),l=>{const c=Zn(He(l));if(c){const u=c;if(er.get(u)||er.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(s=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=Zn(He(e));!l||n.value||(Ds&&(r=xt(l,"touchmove",c=>{Ma(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=Zn(He(e));!l||!n.value||(Ds&&(r==null||r()),l.style.overflow=s,er.delete(l),n.value=!1)};return Kr(i),se({get(){return n.value},set(l){l?o():i()}})}function Nu(e,t,n={}){const{window:r=Me}=n;return qr(e,t,r==null?void 0:r.sessionStorage,n)}function Fu(e={}){const{window:t=Me,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const r=oe(t.scrollX),s=oe(t.scrollY),o=se({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=se({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return xt(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}function $u(e={}){const{window:t=Me,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:o=!0,type:i="inner"}=e,l=oe(n),c=oe(r),u=()=>{t&&(i==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):o?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(u(),Wr(u),xt("resize",u,{passive:!0}),s){const f=_i("(orientation: portrait)");$e(f,()=>u())}return{width:l,height:c}}const tr={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var nr={};const Ei=/^(?:[a-z]+:|\/\/)/i,Ia="vitepress-theme-appearance",Pa=/#.*$/,Na=/[?#].*$/,Fa=/(?:(^|\/)index)?\.(?:md|html)$/,pe=typeof document<"u",Ci={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function $a(e,t,n=!1){if(t===void 0)return!1;if(e=Bs(`/${e}`),n)return new RegExp(t).test(e);if(Bs(t)!==e)return!1;const r=t.match(Pa);return r?(pe?location.hash:"")===r[0]:!0}function Bs(e){return decodeURI(e).replace(Na,"").replace(Fa,"$1")}function Ha(e){return Ei.test(e)}function ja(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ha(n)&&$a(t,`/${n}/`,!0))||"root"}function Va(e,t){var r,s,o,i,l,c,u;const n=ja(e,t);return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Ti(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function Si(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=Da(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function Da(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ua(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function Ti(e,t){return[...e.filter(n=>!Ua(t,n)),...t]}const Ba=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ka=/^[a-z]:/i;function ks(e){const t=ka.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ba,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const rr=new Set;function Ka(e){if(rr.size===0){const n=typeof process=="object"&&(nr==null?void 0:nr.VITE_EXTRA_EXTENSIONS)||(tr==null?void 0:tr.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(r=>rr.add(r))}const t=e.split(".").pop();return t==null||!rr.has(t.toLowerCase())}function Hu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Wa=Symbol(),ft=Fr(da);function ju(e){const t=se(()=>Va(ft.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?oe(!0):n?La({storageKey:Ia,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),s=oe(pe?location.hash:"");return pe&&window.addEventListener("hashchange",()=>{s.value=location.hash}),$e(()=>e.data,()=>{s.value=pe?location.hash:""}),{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),params:se(()=>e.data.params),lang:se(()=>t.value.lang),dir:se(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:se(()=>t.value.localeIndex||"root"),title:se(()=>Si(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:r,hash:se(()=>s.value)}}function qa(){const e=St(Wa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ga(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ks(e){return Ei.test(e)||!e.startsWith("/")?e:Ga(ft.value.base,e)}function Xa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),pe){const n="/";t=ks(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${ks(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let mn=[];function Vu(e){mn.push(e),Fn(()=>{mn=mn.filter(t=>t!==e)})}function Ya(){let e=ft.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Ws(e,n);else if(Array.isArray(e))for(const r of e){const s=Ws(r,n);if(s){t=s;break}}return t}function Ws(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const za=Symbol(),xi="http://a.com",Ja=()=>({path:"/",component:null,data:Ci});function Du(e,t){const n=On(Ja()),r={route:n,go:s};async function s(l=pe?location.href:"/"){var c,u;l=sr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(pe&&l!==sr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await i(l),await((u=r.onAfterRouteChanged)==null?void 0:u.call(r,l)))}let o=null;async function i(l,c=0,u=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,xi),h=o=f.pathname;try{let _=await e(h);if(!_)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:w,__pageData:O}=_;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=pe?h:Ks(h),n.component=hn(w),n.data=hn(O),pe&&Mn(()=>{let U=ft.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ft.value.cleanUrls&&!U.endsWith("/")&&(U+=".html"),U!==f.pathname&&(f.pathname=U,l=U+f.search+f.hash,history.replaceState({},"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(H){console.warn(H)}if(W){qs(W,f.hash);return}}window.scrollTo(0,c)})}}catch(_){if(!/fetch|Page not found/.test(_.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(_),!u)try{const w=await fetch(ft.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await i(l,c,!0);return}catch{}if(o===h){o=null,n.path=pe?h:Ks(h),n.component=t?hn(t):null;const w=pe?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Ci,relativePath:w}}}}return pe&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:f,origin:h,pathname:m,hash:_,search:w}=new URL(u,c.baseURI),O=new URL(location.href);h===O.origin&&Ka(m)&&(l.preventDefault(),m===O.pathname&&w===O.search?(_!==O.hash&&(history.pushState({},"",f),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:O.href,newURL:f}))),_?qs(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):s(f))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await i(sr(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Qa(){const e=St(za);if(!e)throw new Error("useRouter() is called without provider.");return e}function Ai(){return Qa().route}function qs(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(i-window.scrollY)>window.innerHeight?window.scrollTo(0,i):window.scrollTo({left:0,top:i,behavior:"smooth"})};const o=parseInt(window.getComputedStyle(r).paddingTop,10),i=window.scrollY+r.getBoundingClientRect().top-Ya()+o;requestAnimationFrame(s)}}function sr(e){const t=new URL(e,xi);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ft.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const or=()=>mn.forEach(e=>e()),Uu=Hr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Ai(),{site:n}=qa();return()=>vr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?vr(t.component,{onVnodeMounted:or,onVnodeUpdated:or,onVnodeUnmounted:or}):"404 Page Not Found"])}}),Za="modulepreload",eu=function(e){return"/"+e},Gs={},Bu=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=eu(l),l in Gs)return;Gs[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":Za,c||(f.as="script",f.crossOrigin=""),f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),c)return new Promise((h,m)=>{f.addEventListener("load",h),f.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},ku=Hr({setup(e,{slots:t}){const n=oe(!1);return At(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Ku(){pe&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(u=>u.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Wu(){if(pe){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let u=c.textContent||"";i&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),tu(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function tu(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function qu(e,t){let n=!0,r=[];const s=o=>{if(n){n=!1,o.forEach(l=>{const c=ir(l);for(const u of document.head.children)if(u.isEqualNode(c)){r.push(u);return}});return}const i=o.map(ir);r.forEach((l,c)=>{const u=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));u!==-1?delete i[u]:(l==null||l.remove(),delete r[c])}),i.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...i].filter(Boolean)};Br(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],u=Si(i,o);u!==document.title&&(document.title=u);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):ir(["meta",{name:"description",content:f}]),s(Ti(i.head,ru(c)))})}function ir([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function nu(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function ru(e){return e.filter(t=>!nu(t))}const lr=new Set,Ri=()=>document.createElement("link"),su=e=>{const t=Ri();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ou=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let un;const iu=pe&&(un=Ri())&&un.relList&&un.relList.supports&&un.relList.supports("prefetch")?su:ou;function Gu(){if(!pe||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!lr.has(c)){lr.add(c);const u=Xa(c);u&&iu(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):lr.add(l))})})};At(r);const s=Ai();$e(()=>s.path,r),Fn(()=>{n&&n.disconnect()})}export{gu as $,_u as A,Hl as B,Ya as C,fu as D,hu as E,be as F,Fr as G,Vu as H,le as I,du as J,Ei as K,Ai as L,xc as M,St as N,$u as O,Tr as P,Mu as Q,Mn as R,Fu as S,ci as T,pe as U,Ln as V,uu as W,Bu as X,Pu as Y,Jl as Z,Au as _,si as a,Su as a0,Oo as a1,Cu as a2,mu as a3,vu as a4,qu as a5,za as a6,ju as a7,Wa as a8,Uu as a9,ku as aa,ft as ab,xu as ac,Du as ad,Xa as ae,Gu as af,Wu as ag,Ku as ah,vr as ai,He as aj,yi as ak,Ru as al,Kr as am,Lu as an,Nu as ao,Iu as ap,Ou as aq,Qa as ar,xt as as,au as at,Eu as au,he as av,yu as aw,hn as ax,Tu as ay,Hu as az,ti as b,bu as c,Hr as d,wu as e,Ka as f,Ks as g,se as h,Ha as i,ri as j,bo as k,cu as l,$a as m,xr as n,Zo as o,lu as p,_i as q,pu as r,oe as s,ki as t,qa as u,$e as v,Rl as w,Br as x,At as y,Fn as z}; diff --git a/assets/chunks/theme.rDkprPqD.js b/assets/chunks/theme.rDkprPqD.js new file mode 100644 index 00000000..474e1378 --- /dev/null +++ b/assets/chunks/theme.rDkprPqD.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.CLGH5rWG.js","assets/chunks/framework.C3o_UkTa.js"])))=>i.map(i=>d[i]); +import{d as _,o as a,c,r as l,n as N,a as O,t as I,b as k,w as d,e as f,T as ve,_ as $,u as Ge,i as Ue,f as je,g as pe,h as y,j as v,k as r,p as C,l as H,m as K,q as ie,s as w,v as G,x as Z,y as W,z as he,A as fe,B as ze,C as qe,D as R,F as M,E,G as Pe,H as x,I as m,J as F,K as Ve,L as ee,M as q,N as te,O as Ke,P as Le,Q as le,R as We,S as Se,U as oe,V as Re,W as Je,X as Xe,Y as Te,Z as Ie,$ as Ye,a0 as Qe,a1 as Ze,a2 as xe,a3 as et}from"./framework.C3o_UkTa.js";const tt=_({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),c("span",{class:N(["VPBadge",e.type])},[l(e.$slots,"default",{},()=>[O(I(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},nt=_({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),k(ve,{name:"fade"},{default:d(()=>[e.show?(a(),c("div",ot)):f("",!0)]),_:1}))}}),st=$(nt,[["__scopeId","data-v-2cfdfdcf"]]),P=Ge;function at(o,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(o,e):(o(),(s=!0)&&setTimeout(()=>s=!1,e))}}function ce(o){return/^\//.test(o)?o:`/${o}`}function _e(o){const{pathname:e,search:t,hash:s,protocol:n}=new URL(o,"http://a.com");if(Ue(o)||o.startsWith("#")||!n.startsWith("http")||!je(e))return o;const{site:i}=P(),u=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return pe(u)}function X({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:s,theme:n,hash:i}=P(),u=y(()=>{var p,g;return{label:(p=e.value.locales[t.value])==null?void 0:p.label,link:((g=e.value.locales[t.value])==null?void 0:g.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([p,g])=>u.value.label===g.label?[]:{text:g.label,link:rt(g.link||(p==="root"?"/":`/${p}/`),n.value.i18nRouting!==!1&&o,s.value.relativePath.slice(u.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:u}}function rt(o,e,t,s){return e?o.replace(/\/$/,"")+ce(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):o}const it=o=>(C("data-v-868b40d9"),o=o(),H(),o),lt={class:"NotFound"},ct={class:"code"},ut={class:"title"},dt=it(()=>v("div",{class:"divider"},null,-1)),vt={class:"quote"},pt={class:"action"},ht=["href","aria-label"],ft=_({__name:"NotFound",setup(o){const{theme:e}=P(),{currentLang:t}=X();return(s,n)=>{var i,u,h,p,g;return a(),c("div",lt,[v("p",ct,I(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),v("h1",ut,I(((u=r(e).notFound)==null?void 0:u.title)??"PAGE NOT FOUND"),1),dt,v("blockquote",vt,I(((h=r(e).notFound)==null?void 0:h.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",pt,[v("a",{class:"link",href:r(pe)(r(t).link),"aria-label":((p=r(e).notFound)==null?void 0:p.linkLabel)??"go to home"},I(((g=r(e).notFound)==null?void 0:g.linkText)??"Take me home"),9,ht)])])}}}),_t=$(ft,[["__scopeId","data-v-868b40d9"]]);function we(o,e){if(Array.isArray(o))return Y(o);if(o==null)return[];e=ce(e);const t=Object.keys(o).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(ce(n))),s=t?o[t]:[];return Array.isArray(s)?Y(s):Y(s.items,s.base)}function mt(o){const e=[];let t=0;for(const s in o){const n=o[s];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function kt(o){const e=[];function t(s){for(const n of s)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(o),e}function ue(o,e){return Array.isArray(e)?e.some(t=>ue(o,t)):K(o,e.link)?!0:e.items?ue(o,e.items):!1}function Y(o,e){return[...o].map(t=>{const s={...t},n=s.base||e;return n&&s.link&&(s.link=n+s.link),s.items&&(s.items=Y(s.items,n)),s})}function U(){const{frontmatter:o,page:e,theme:t}=P(),s=ie("(min-width: 960px)"),n=w(!1),i=y(()=>{const B=t.value.sidebar,S=e.value.relativePath;return B?we(B,S):[]}),u=w(i.value);G(i,(B,S)=>{JSON.stringify(B)!==JSON.stringify(S)&&(u.value=i.value)});const h=y(()=>o.value.sidebar!==!1&&u.value.length>0&&o.value.layout!=="home"),p=y(()=>g?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),g=y(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),L=y(()=>h.value&&s.value),b=y(()=>h.value?mt(u.value):[]);function V(){n.value=!0}function T(){n.value=!1}function A(){n.value?T():V()}return{isOpen:n,sidebar:u,sidebarGroups:b,hasSidebar:h,hasAside:g,leftAside:p,isSidebarEnabled:L,open:V,close:T,toggle:A}}function bt(o,e){let t;Z(()=>{t=o.value?document.activeElement:void 0}),W(()=>{window.addEventListener("keyup",s)}),he(()=>{window.removeEventListener("keyup",s)});function s(n){n.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function $t(o){const{page:e,hash:t}=P(),s=w(!1),n=y(()=>o.value.collapsed!=null),i=y(()=>!!o.value.link),u=w(!1),h=()=>{u.value=K(e.value.relativePath,o.value.link)};G([e,o,t],h),W(h);const p=y(()=>u.value?!0:o.value.items?ue(e.value.relativePath,o.value.items):!1),g=y(()=>!!(o.value.items&&o.value.items.length));Z(()=>{s.value=!!(n.value&&o.value.collapsed)}),fe(()=>{(u.value||p.value)&&(s.value=!1)});function L(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:i,isActiveLink:u,hasActiveLink:p,hasChildren:g,toggle:L}}function gt(){const{hasSidebar:o}=U(),e=ie("(min-width: 960px)"),t=ie("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const de=[];function Ne(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function me(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:yt(t),link:"#"+t.id,level:s}});return Pt(e,o)}function yt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;o=o.filter(u=>u.level>=s&&u.level<=n),de.length=0;for(const{element:u,link:h}of o)de.push({element:u,link:h});const i=[];e:for(let u=0;u=0;p--){const g=o[p];if(g.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),ze(()=>{u(location.hash)}),he(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const h=window.scrollY,p=window.innerHeight,g=document.body.offsetHeight,L=Math.abs(h+p-g)<1,b=de.map(({element:T,link:A})=>({link:A,top:Lt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,A)=>T.top-A.top);if(!b.length){u(null);return}if(h<1){u(null);return}if(L){u(b[b.length-1].link);return}let V=null;for(const{link:T,top:A}of b){if(A>h+qe()+4)break;V=T}u(V)}function u(h){n&&n.classList.remove("active"),h==null?n=null:n=o.value.querySelector(`a[href="${decodeURIComponent(h)}"]`);const p=n;p?(p.classList.add("active"),e.value.style.top=p.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Lt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}const St=["href","title"],Tt=_({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const s=t.href.split("#")[1],n=document.getElementById(decodeURIComponent(s));n==null||n.focus({preventScroll:!0})}return(t,s)=>{const n=R("VPDocOutlineItem",!0);return a(),c("ul",{class:N(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),c(M,null,E(t.headers,({children:i,link:u,title:h})=>(a(),c("li",null,[v("a",{class:"outline-link",href:u,onClick:e,title:h},I(h),9,St),i!=null&&i.length?(a(),k(n,{key:0,headers:i},null,8,["headers"])):f("",!0)]))),256))],2)}}}),Me=$(Tt,[["__scopeId","data-v-75b86f7a"]]),It={class:"content"},wt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Nt=_({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=P(),s=Pe([]);x(()=>{s.value=me(e.value.outline??t.value.outline)});const n=w(),i=w();return Vt(n,i),(u,h)=>(a(),c("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:n},[v("div",It,[v("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),v("div",wt,I(r(Ne)(r(t))),1),m(Me,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Mt=$(Nt,[["__scopeId","data-v-be1126ba"]]),At={class:"VPDocAsideCarbonAds"},Bt=_({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,s)=>(a(),c("div",At,[m(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ct=o=>(C("data-v-65ef6f81"),o=o(),H(),o),Ht={class:"VPDocAside"},Et=Ct(()=>v("div",{class:"spacer"},null,-1)),Ft=_({__name:"VPDocAside",setup(o){const{theme:e}=P();return(t,s)=>(a(),c("div",Ht,[l(t.$slots,"aside-top",{},void 0,!0),l(t.$slots,"aside-outline-before",{},void 0,!0),m(Mt),l(t.$slots,"aside-outline-after",{},void 0,!0),Et,l(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),k(Bt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),l(t.$slots,"aside-ads-after",{},void 0,!0),l(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Dt=$(Ft,[["__scopeId","data-v-65ef6f81"]]);function Ot(){const{theme:o,page:e}=P();return y(()=>{const{text:t="Edit this page",pattern:s=""}=o.value.editLink||{};let n;return typeof s=="function"?n=s(e.value):n=s.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Gt(){const{page:o,theme:e,frontmatter:t}=P();return y(()=>{var g,L,b,V,T,A,B,S;const s=we(e.value.sidebar,o.value.relativePath),n=kt(s),i=Ut(n,j=>j.link.replace(/[?#].*$/,"")),u=i.findIndex(j=>K(o.value.relativePath,j.link)),h=((g=e.value.docFooter)==null?void 0:g.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:h?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[u-1])==null?void 0:b.docFooterText)??((V=i[u-1])==null?void 0:V.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((T=i[u-1])==null?void 0:T.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[u+1])==null?void 0:A.docFooterText)??((B=i[u+1])==null?void 0:B.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((S=i[u+1])==null?void 0:S.link)}}})}function Ut(o,e){const t=new Set;return o.filter(s=>{const n=e(s);return t.has(n)?!1:t.add(n)})}const D=_({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Ve.test(e.href)||e.target==="_blank");return(n,i)=>(a(),k(F(t.value),{class:N(["VPLink",{link:n.href,"vp-external-link-icon":s.value,"no-icon":n.noIcon}]),href:n.href?r(_e)(n.href):void 0,target:n.target??(s.value?"_blank":void 0),rel:n.rel??(s.value?"noreferrer":void 0)},{default:d(()=>[l(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),jt={class:"VPLastUpdated"},zt=["datetime"],qt=_({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:s}=P(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),u=w("");return W(()=>{Z(()=>{var h,p,g;u.value=new Intl.DateTimeFormat((p=(h=e.value.lastUpdated)==null?void 0:h.formatOptions)!=null&&p.forceLocale?s.value:void 0,((g=e.value.lastUpdated)==null?void 0:g.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(h,p)=>{var g;return a(),c("p",jt,[O(I(((g=r(e).lastUpdated)==null?void 0:g.text)||r(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},I(u.value),9,zt)])}}}),Kt=$(qt,[["__scopeId","data-v-243e2690"]]),Ae=o=>(C("data-v-e27a0cf7"),o=o(),H(),o),Wt={key:0,class:"VPDocFooter"},Rt={key:0,class:"edit-info"},Jt={key:0,class:"edit-link"},Xt=Ae(()=>v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),Yt={key:1,class:"last-updated"},Qt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Zt=Ae(()=>v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),xt={class:"pager"},eo=["innerHTML"],to=["innerHTML"],oo={class:"pager"},no=["innerHTML"],so=["innerHTML"],ao=_({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:s}=P(),n=Ot(),i=Gt(),u=y(()=>e.value.editLink&&s.value.editLink!==!1),h=y(()=>t.value.lastUpdated),p=y(()=>u.value||h.value||i.value.prev||i.value.next);return(g,L)=>{var b,V,T,A;return p.value?(a(),c("footer",Wt,[l(g.$slots,"doc-footer-before",{},void 0,!0),u.value||h.value?(a(),c("div",Rt,[u.value?(a(),c("div",Jt,[m(D,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:d(()=>[Xt,O(" "+I(r(n).text),1)]),_:1},8,["href"])])):f("",!0),h.value?(a(),c("div",Yt,[m(Kt)])):f("",!0)])):f("",!0),(b=r(i).prev)!=null&&b.link||(V=r(i).next)!=null&&V.link?(a(),c("nav",Qt,[Zt,v("div",xt,[(T=r(i).prev)!=null&&T.link?(a(),k(D,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:d(()=>{var B;return[v("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.prev)||"Previous page"},null,8,eo),v("span",{class:"title",innerHTML:r(i).prev.text},null,8,to)]}),_:1},8,["href"])):f("",!0)]),v("div",oo,[(A=r(i).next)!=null&&A.link?(a(),k(D,{key:0,class:"pager-link next",href:r(i).next.link},{default:d(()=>{var B;return[v("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.next)||"Next page"},null,8,no),v("span",{class:"title",innerHTML:r(i).next.text},null,8,so)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),ro=$(ao,[["__scopeId","data-v-e27a0cf7"]]),io=o=>(C("data-v-4981c415"),o=o(),H(),o),lo={class:"container"},co=io(()=>v("div",{class:"aside-curtain"},null,-1)),uo={class:"aside-container"},vo={class:"aside-content"},po={class:"content"},ho={class:"content-container"},fo={class:"main"},_o=_({__name:"VPDoc",setup(o){const{theme:e}=P(),t=ee(),{hasSidebar:s,hasAside:n,leftAside:i}=U(),u=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(h,p)=>{const g=R("Content");return a(),c("div",{class:N(["VPDoc",{"has-sidebar":r(s),"has-aside":r(n)}])},[l(h.$slots,"doc-top",{},void 0,!0),v("div",lo,[r(n)?(a(),c("div",{key:0,class:N(["aside",{"left-aside":r(i)}])},[co,v("div",uo,[v("div",vo,[m(Dt,null,{"aside-top":d(()=>[l(h.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[l(h.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[l(h.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[l(h.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[l(h.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[l(h.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),v("div",po,[v("div",ho,[l(h.$slots,"doc-before",{},void 0,!0),v("main",fo,[m(g,{class:N(["vp-doc",[u.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),m(ro,null,{"doc-footer-before":d(()=>[l(h.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),l(h.$slots,"doc-after",{},void 0,!0)])])]),l(h.$slots,"doc-bottom",{},void 0,!0)],2)}}}),mo=$(_o,[["__scopeId","data-v-4981c415"]]),ko=_({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.href&&Ve.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(n,i)=>(a(),k(F(s.value),{class:N(["VPButton",[n.size,n.theme]]),href:n.href?r(_e)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:d(()=>[O(I(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),bo=$(ko,[["__scopeId","data-v-5208c6a8"]]),$o=["src","alt"],go=_({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const s=R("VPImage",!0);return e.image?(a(),c(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),c("img",q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(pe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,$o)):(a(),c(M,{key:1},[m(s,q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),m(s,q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Q=$(go,[["__scopeId","data-v-6e911b93"]]),yo=o=>(C("data-v-4963d475"),o=o(),H(),o),Po={class:"container"},Vo={class:"main"},Lo={key:0,class:"name"},So=["innerHTML"],To=["innerHTML"],Io=["innerHTML"],wo={key:0,class:"actions"},No={key:0,class:"image"},Mo={class:"image-container"},Ao=yo(()=>v("div",{class:"image-bg"},null,-1)),Bo=_({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=te("hero-image-slot-exists");return(t,s)=>(a(),c("div",{class:N(["VPHero",{"has-image":t.image||r(e)}])},[v("div",Po,[v("div",Vo,[l(t.$slots,"home-hero-info-before",{},void 0,!0),l(t.$slots,"home-hero-info",{},()=>[t.name?(a(),c("h1",Lo,[v("span",{innerHTML:t.name,class:"clip"},null,8,So)])):f("",!0),t.text?(a(),c("p",{key:1,innerHTML:t.text,class:"text"},null,8,To)):f("",!0),t.tagline?(a(),c("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Io)):f("",!0)],!0),l(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),c("div",wo,[(a(!0),c(M,null,E(t.actions,n=>(a(),c("div",{key:n.link,class:"action"},[m(bo,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):f("",!0),l(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),c("div",No,[v("div",Mo,[Ao,l(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Co=$(Bo,[["__scopeId","data-v-4963d475"]]),Ho=_({__name:"VPHomeHero",setup(o){const{frontmatter:e}=P();return(t,s)=>r(e).hero?(a(),k(Co,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":d(()=>[l(t.$slots,"home-hero-info-before")]),"home-hero-info":d(()=>[l(t.$slots,"home-hero-info")]),"home-hero-info-after":d(()=>[l(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":d(()=>[l(t.$slots,"home-hero-actions-after")]),"home-hero-image":d(()=>[l(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Eo=o=>(C("data-v-c6ed09d2"),o=o(),H(),o),Fo={class:"box"},Do={key:0,class:"icon"},Oo=["innerHTML"],Go=["innerHTML"],Uo=["innerHTML"],jo={key:4,class:"link-text"},zo={class:"link-text-value"},qo=Eo(()=>v("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),Ko=_({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),k(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:d(()=>[v("article",Fo,[typeof e.icon=="object"&&e.icon.wrap?(a(),c("div",Do,[m(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),c("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Oo)):f("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Go),e.details?(a(),c("p",{key:3,class:"details",innerHTML:e.details},null,8,Uo)):f("",!0),e.linkText?(a(),c("div",jo,[v("p",zo,[O(I(e.linkText)+" ",1),qo])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Wo=$(Ko,[["__scopeId","data-v-c6ed09d2"]]),Ro={key:0,class:"VPFeatures"},Jo={class:"container"},Xo={class:"items"},Yo=_({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,n)=>s.features?(a(),c("div",Ro,[v("div",Jo,[v("div",Xo,[(a(!0),c(M,null,E(s.features,i=>(a(),c("div",{key:i.title,class:N(["item",[t.value]])},[m(Wo,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),Qo=$(Yo,[["__scopeId","data-v-c56833f4"]]),Zo=_({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=P();return(t,s)=>r(e).features?(a(),k(Qo,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),xo=_({__name:"VPHomeContent",setup(o){const{width:e}=Ke({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),c("div",{class:"vp-doc container",style:Le(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[l(t.$slots,"default",{},void 0,!0)],4))}}),en=$(xo,[["__scopeId","data-v-2763ee34"]]),tn={class:"VPHome"},on=_({__name:"VPHome",setup(o){const{frontmatter:e}=P();return(t,s)=>{const n=R("Content");return a(),c("div",tn,[l(t.$slots,"home-hero-before",{},void 0,!0),m(Ho,null,{"home-hero-info-before":d(()=>[l(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[l(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[l(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[l(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[l(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),l(t.$slots,"home-hero-after",{},void 0,!0),l(t.$slots,"home-features-before",{},void 0,!0),m(Zo),l(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),k(en,{key:0},{default:d(()=>[m(n)]),_:1})):(a(),k(n,{key:1}))])}}}),nn=$(on,[["__scopeId","data-v-ceddc1ed"]]),sn={},an={class:"VPPage"};function rn(o,e){const t=R("Content");return a(),c("div",an,[l(o.$slots,"page-top"),m(t),l(o.$slots,"page-bottom")])}const ln=$(sn,[["render",rn]]),cn=_({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=P(),{hasSidebar:s}=U();return(n,i)=>(a(),c("div",{class:N(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?l(n.$slots,"not-found",{key:0},()=>[m(_t)],!0):r(t).layout==="page"?(a(),k(ln,{key:1},{"page-top":d(()=>[l(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[l(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),k(nn,{key:2},{"home-hero-before":d(()=>[l(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[l(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[l(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[l(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[l(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[l(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[l(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[l(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[l(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),k(F(r(t).layout),{key:3})):(a(),k(mo,{key:4},{"doc-top":d(()=>[l(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[l(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":d(()=>[l(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[l(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[l(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":d(()=>[l(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":d(()=>[l(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[l(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[l(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[l(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":d(()=>[l(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),un=$(cn,[["__scopeId","data-v-4e31bbd2"]]),dn={class:"container"},vn=["innerHTML"],pn=["innerHTML"],hn=_({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=P(),{hasSidebar:s}=U();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),c("footer",{key:0,class:N(["VPFooter",{"has-sidebar":r(s)}])},[v("div",dn,[r(e).footer.message?(a(),c("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,vn)):f("",!0),r(e).footer.copyright?(a(),c("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,pn)):f("",!0)])],2)):f("",!0)}}),fn=$(hn,[["__scopeId","data-v-098a46ae"]]);function _n(){const{theme:o,frontmatter:e}=P(),t=Pe([]),s=y(()=>t.value.length>0);return x(()=>{t.value=me(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:s}}const mn=o=>(C("data-v-5e8cf508"),o=o(),H(),o),kn={class:"menu-text"},bn=mn(()=>v("span",{class:"vpi-chevron-right icon"},null,-1)),$n={class:"header"},gn={class:"outline"},yn=_({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=P(),s=w(!1),n=w(0),i=w(),u=w();function h(b){var V;(V=i.value)!=null&&V.contains(b.target)||(s.value=!1)}G(s,b=>{if(b){document.addEventListener("click",h);return}document.removeEventListener("click",h)}),le("Escape",()=>{s.value=!1}),x(()=>{s.value=!1});function p(){s.value=!s.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function g(b){b.target.classList.contains("outline-link")&&(u.value&&(u.value.style.transition="none"),We(()=>{s.value=!1}))}function L(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,V)=>(a(),c("div",{class:"VPLocalNavOutlineDropdown",style:Le({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),c("button",{key:0,onClick:p,class:N({open:s.value})},[v("span",kn,I(r(Ne)(r(t))),1),bn],2)):(a(),c("button",{key:1,onClick:L},I(r(t).returnToTopLabel||"Return to top"),1)),m(ve,{name:"flyout"},{default:d(()=>[s.value?(a(),c("div",{key:0,ref_key:"items",ref:u,class:"items",onClick:g},[v("div",$n,[v("a",{class:"top-link",href:"#",onClick:L},I(r(t).returnToTopLabel||"Return to top"),1)]),v("div",gn,[m(Me,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Pn=$(yn,[["__scopeId","data-v-5e8cf508"]]),Vn=o=>(C("data-v-b8036a12"),o=o(),H(),o),Ln={class:"container"},Sn=["aria-expanded"],Tn=Vn(()=>v("span",{class:"vpi-align-left menu-icon"},null,-1)),In={class:"menu-text"},wn=_({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=P(),{hasSidebar:s}=U(),{headers:n}=_n(),{y:i}=Se(),u=w(0);W(()=>{u.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),x(()=>{n.value=me(t.value.outline??e.value.outline)});const h=y(()=>n.value.length===0),p=y(()=>h.value&&!s.value),g=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:h.value,fixed:p.value}));return(L,b)=>r(t).layout!=="home"&&(!p.value||r(i)>=u.value)?(a(),c("div",{key:0,class:N(g.value)},[v("div",Ln,[r(s)?(a(),c("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=V=>L.$emit("open-menu"))},[Tn,v("span",In,I(r(e).sidebarMenuLabel||"Menu"),1)],8,Sn)):f("",!0),m(Pn,{headers:r(n),navHeight:u.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Nn=$(wn,[["__scopeId","data-v-b8036a12"]]);function Mn(){const o=w(!1);function e(){o.value=!0,window.addEventListener("resize",n)}function t(){o.value=!1,window.removeEventListener("resize",n)}function s(){o.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=ee();return G(()=>i.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:s}}const An={},Bn={class:"VPSwitch",type:"button",role:"switch"},Cn={class:"check"},Hn={key:0,class:"icon"};function En(o,e){return a(),c("button",Bn,[v("span",Cn,[o.$slots.default?(a(),c("span",Hn,[l(o.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Fn=$(An,[["render",En],["__scopeId","data-v-b19619af"]]),Be=o=>(C("data-v-0f382965"),o=o(),H(),o),Dn=Be(()=>v("span",{class:"vpi-sun sun"},null,-1)),On=Be(()=>v("span",{class:"vpi-moon moon"},null,-1)),Gn=_({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=P(),s=te("toggle-appearance",()=>{e.value=!e.value}),n=w("");return fe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,u)=>(a(),k(Fn,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:d(()=>[Dn,On]),_:1},8,["title","aria-checked","onClick"]))}}),ke=$(Gn,[["__scopeId","data-v-0f382965"]]),Un={key:0,class:"VPNavBarAppearance"},jn=_({__name:"VPNavBarAppearance",setup(o){const{site:e}=P();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",Un,[m(ke)])):f("",!0)}}),zn=$(jn,[["__scopeId","data-v-0a1958c9"]]),be=w();let Ce=!1,re=0;function qn(o){const e=w(!1);if(oe){!Ce&&Kn(),re++;const t=G(be,s=>{var n,i,u;s===o.el.value||(n=o.el.value)!=null&&n.contains(s)?(e.value=!0,(i=o.onFocus)==null||i.call(o)):(e.value=!1,(u=o.onBlur)==null||u.call(o))});he(()=>{t(),re--,re||Wn()})}return Re(e)}function Kn(){document.addEventListener("focusin",He),Ce=!0,be.value=document.activeElement}function Wn(){document.removeEventListener("focusin",He)}function He(){be.value=document.activeElement}const Rn={class:"VPMenuLink"},Jn=_({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=P();return(t,s)=>(a(),c("div",Rn,[m(D,{class:N({active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:d(()=>[O(I(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),ne=$(Jn,[["__scopeId","data-v-19363427"]]),Xn={class:"VPMenuGroup"},Yn={key:0,class:"title"},Qn=_({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),c("div",Xn,[e.text?(a(),c("p",Yn,I(e.text),1)):f("",!0),(a(!0),c(M,null,E(e.items,s=>(a(),c(M,null,["link"in s?(a(),k(ne,{key:0,item:s},null,8,["item"])):f("",!0)],64))),256))]))}}),Zn=$(Qn,[["__scopeId","data-v-e815e7e2"]]),xn={class:"VPMenu"},es={key:0,class:"items"},ts=_({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),c("div",xn,[e.items?(a(),c("div",es,[(a(!0),c(M,null,E(e.items,s=>(a(),c(M,{key:JSON.stringify(s)},["link"in s?(a(),k(ne,{key:0,item:s},null,8,["item"])):"component"in s?(a(),k(F(s.component),q({key:1,ref_for:!0},s.props),null,16)):(a(),k(Zn,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0),l(e.$slots,"default",{},void 0,!0)]))}}),os=$(ts,[["__scopeId","data-v-0e22c6c5"]]),ns=o=>(C("data-v-12ec5ee2"),o=o(),H(),o),ss=["aria-expanded","aria-label"],as={key:0,class:"text"},rs=["innerHTML"],is=ns(()=>v("span",{class:"vpi-chevron-down text-icon"},null,-1)),ls={key:1,class:"vpi-more-horizontal icon"},cs={class:"menu"},us=_({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=w(!1),t=w();qn({el:t,onBlur:s});function s(){e.value=!1}return(n,i)=>(a(),c("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=u=>e.value=!0),onMouseleave:i[2]||(i[2]=u=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=u=>e.value=!e.value)},[n.button||n.icon?(a(),c("span",as,[n.icon?(a(),c("span",{key:0,class:N([n.icon,"option-icon"])},null,2)):f("",!0),n.button?(a(),c("span",{key:1,innerHTML:n.button},null,8,rs)):f("",!0),is])):(a(),c("span",ls))],8,ss),v("div",cs,[m(os,{items:n.items},{default:d(()=>[l(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),$e=$(us,[["__scopeId","data-v-12ec5ee2"]]),ds=["href","aria-label","innerHTML"],vs=_({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,n)=>(a(),c("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,ds))}}),ps=$(vs,[["__scopeId","data-v-974e0aed"]]),hs={class:"VPSocialLinks"},fs=_({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(a(),c("div",hs,[(a(!0),c(M,null,E(e.links,({link:s,icon:n,ariaLabel:i})=>(a(),k(ps,{key:s,icon:n,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ge=$(fs,[["__scopeId","data-v-52782a78"]]),_s={key:0,class:"group translations"},ms={class:"trans-title"},ks={key:1,class:"group"},bs={class:"item appearance"},$s={class:"label"},gs={class:"appearance-action"},ys={key:2,class:"group"},Ps={class:"item social-links"},Vs=_({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=P(),{localeLinks:s,currentLang:n}=X({correspondingLink:!0}),i=y(()=>s.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(u,h)=>i.value?(a(),k($e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:d(()=>[r(s).length&&r(n).label?(a(),c("div",_s,[v("p",ms,I(r(n).label),1),(a(!0),c(M,null,E(r(s),p=>(a(),k(ne,{key:p.link,item:p},null,8,["item"]))),128))])):f("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",ks,[v("div",bs,[v("p",$s,I(r(t).darkModeSwitchLabel||"Appearance"),1),v("div",gs,[m(ke)])])])):f("",!0),r(t).socialLinks?(a(),c("div",ys,[v("div",Ps,[m(ge,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),Ls=$(Vs,[["__scopeId","data-v-c34ef5aa"]]),Ss=o=>(C("data-v-6a2ed68b"),o=o(),H(),o),Ts=["aria-expanded"],Is=Ss(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),ws=[Is],Ns=_({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),c("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},ws,10,Ts))}}),Ms=$(Ns,[["__scopeId","data-v-6a2ed68b"]]),As=["innerHTML"],Bs=_({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=P();return(t,s)=>(a(),k(D,{class:N({VPNavBarMenuLink:!0,active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:d(()=>[v("span",{innerHTML:t.item.text},null,8,As)]),_:1},8,["class","href","noIcon","target","rel"]))}}),Cs=$(Bs,[["__scopeId","data-v-c423e9f4"]]),Hs=_({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=P(),s=i=>"component"in i?!1:"link"in i?K(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),n=y(()=>s(e.item));return(i,u)=>(a(),k($e,{class:N({VPNavBarMenuGroup:!0,active:r(K)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Es=o=>(C("data-v-71183eee"),o=o(),H(),o),Fs={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ds=Es(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),Os=_({__name:"VPNavBarMenu",setup(o){const{theme:e}=P();return(t,s)=>r(e).nav?(a(),c("nav",Fs,[Ds,(a(!0),c(M,null,E(r(e).nav,n=>(a(),c(M,{key:JSON.stringify(n)},["link"in n?(a(),k(Cs,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(F(n.component),q({key:1,ref_for:!0},n.props),null,16)):(a(),k(Hs,{key:2,item:n},null,8,["item"]))],64))),128))])):f("",!0)}}),Gs=$(Os,[["__scopeId","data-v-71183eee"]]);function Us(o){const{localeIndex:e,theme:t}=P();function s(n){var A,B,S;const i=n.split("."),u=(A=t.value.search)==null?void 0:A.options,h=u&&typeof u=="object",p=h&&((S=(B=u.locales)==null?void 0:B[e.value])==null?void 0:S.translations)||null,g=h&&u.translations||null;let L=p,b=g,V=o;const T=i.pop();for(const j of i){let z=null;const J=V==null?void 0:V[j];J&&(z=V=J);const se=b==null?void 0:b[j];se&&(z=b=se);const ae=L==null?void 0:L[j];ae&&(z=L=ae),J||(V=z),se||(b=z),ae||(L=z)}return(L==null?void 0:L[T])??(b==null?void 0:b[T])??(V==null?void 0:V[T])??""}return s}const js=["aria-label"],zs={class:"DocSearch-Button-Container"},qs=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),Ks={class:"DocSearch-Button-Placeholder"},Ws=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),ye=_({__name:"VPNavBarSearchButton",setup(o){const t=Us({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,n)=>(a(),c("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[v("span",zs,[qs,v("span",Ks,I(r(t)("button.buttonText")),1)]),Ws],8,js))}}),Rs={class:"VPNavBarSearch"},Js={id:"local-search"},Xs={key:1,id:"docsearch"},Ys=_({__name:"VPNavBarSearch",setup(o){const e=Je(()=>Xe(()=>import("./VPLocalSearchBox.CLGH5rWG.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=P(),n=w(!1),i=w(!1);W(()=>{});function u(){n.value||(n.value=!0,setTimeout(h,16))}function h(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||h()},16)}function p(b){const V=b.target,T=V.tagName;return V.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const g=w(!1);le("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),g.value=!0)}),le("/",b=>{p(b)||(b.preventDefault(),g.value=!0)});const L="local";return(b,V)=>{var T;return a(),c("div",Rs,[r(L)==="local"?(a(),c(M,{key:0},[g.value?(a(),k(r(e),{key:0,onClose:V[0]||(V[0]=A=>g.value=!1)})):f("",!0),v("div",Js,[m(ye,{onClick:V[1]||(V[1]=A=>g.value=!0)})])],64)):r(L)==="algolia"?(a(),c(M,{key:1},[n.value?(a(),k(r(t),{key:0,algolia:((T=r(s).search)==null?void 0:T.options)??r(s).algolia,onVnodeBeforeMount:V[2]||(V[2]=A=>i.value=!0)},null,8,["algolia"])):f("",!0),i.value?f("",!0):(a(),c("div",Xs,[m(ye,{onClick:u})]))],64)):f("",!0)])}}}),Qs=_({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=P();return(t,s)=>r(e).socialLinks?(a(),k(ge,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Zs=$(Qs,[["__scopeId","data-v-edaebeb1"]]),xs=["href","rel","target"],ea={key:1},ta={key:2},oa=_({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=P(),{hasSidebar:s}=U(),{currentLang:n}=X(),i=y(()=>{var p;return typeof t.value.logoLink=="string"?t.value.logoLink:(p=t.value.logoLink)==null?void 0:p.link}),u=y(()=>{var p;return typeof t.value.logoLink=="string"||(p=t.value.logoLink)==null?void 0:p.rel}),h=y(()=>{var p;return typeof t.value.logoLink=="string"||(p=t.value.logoLink)==null?void 0:p.target});return(p,g)=>(a(),c("div",{class:N(["VPNavBarTitle",{"has-sidebar":r(s)}])},[v("a",{class:"title",href:i.value??r(_e)(r(n).link),rel:u.value,target:h.value},[l(p.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),k(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),c("span",ea,I(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),c("span",ta,I(r(e).title),1)):f("",!0),l(p.$slots,"nav-bar-title-after",{},void 0,!0)],8,xs)],2))}}),na=$(oa,[["__scopeId","data-v-de953605"]]),sa={class:"items"},aa={class:"title"},ra=_({__name:"VPNavBarTranslations",setup(o){const{theme:e}=P(),{localeLinks:t,currentLang:s}=X({correspondingLink:!0});return(n,i)=>r(t).length&&r(s).label?(a(),k($e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:d(()=>[v("div",sa,[v("p",aa,I(r(s).label),1),(a(!0),c(M,null,E(r(t),u=>(a(),k(ne,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),ia=$(ra,[["__scopeId","data-v-d3047050"]]),la=o=>(C("data-v-37a6b570"),o=o(),H(),o),ca={class:"wrapper"},ua={class:"container"},da={class:"title"},va={class:"content"},pa={class:"content-body"},ha=la(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),fa=_({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=Se(),{hasSidebar:s}=U(),{frontmatter:n}=P(),i=w({});return fe(()=>{i.value={"has-sidebar":s.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(u,h)=>(a(),c("div",{class:N(["VPNavBar",i.value])},[v("div",ca,[v("div",ua,[v("div",da,[m(na,null,{"nav-bar-title-before":d(()=>[l(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[l(u.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",va,[v("div",pa,[l(u.$slots,"nav-bar-content-before",{},void 0,!0),m(Ys,{class:"search"}),m(Gs,{class:"menu"}),m(ia,{class:"translations"}),m(zn,{class:"appearance"}),m(Zs,{class:"social-links"}),m(Ls,{class:"extra"}),l(u.$slots,"nav-bar-content-after",{},void 0,!0),m(Ms,{class:"hamburger",active:u.isScreenOpen,onClick:h[0]||(h[0]=p=>u.$emit("toggle-screen"))},null,8,["active"])])])])]),ha],2))}}),_a=$(fa,[["__scopeId","data-v-37a6b570"]]),ma={key:0,class:"VPNavScreenAppearance"},ka={class:"text"},ba=_({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=P();return(s,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",ma,[v("p",ka,I(r(t).darkModeSwitchLabel||"Appearance"),1),m(ke)])):f("",!0)}}),$a=$(ba,[["__scopeId","data-v-beb3f918"]]),ga=_({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=te("close-screen");return(t,s)=>(a(),k(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),ya=$(ga,[["__scopeId","data-v-6f3d2ab5"]]),Pa=_({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=te("close-screen");return(t,s)=>(a(),k(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:d(()=>[O(I(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ee=$(Pa,[["__scopeId","data-v-eab7bfa1"]]),Va={class:"VPNavScreenMenuGroupSection"},La={key:0,class:"title"},Sa=_({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),c("div",Va,[e.text?(a(),c("p",La,I(e.text),1)):f("",!0),(a(!0),c(M,null,E(e.items,s=>(a(),k(Ee,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Ta=$(Sa,[["__scopeId","data-v-60ca4288"]]),Ia=o=>(C("data-v-9b54e8b4"),o=o(),H(),o),wa=["aria-controls","aria-expanded"],Na=["innerHTML"],Ma=Ia(()=>v("span",{class:"vpi-plus button-icon"},null,-1)),Aa=["id"],Ba={key:0,class:"item"},Ca={key:1,class:"item"},Ha={key:2,class:"group"},Ea=_({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=w(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,u)=>(a(),c("div",{class:N(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:n},[v("span",{class:"button-text",innerHTML:i.text},null,8,Na),Ma],8,wa),v("div",{id:s.value,class:"items"},[(a(!0),c(M,null,E(i.items,h=>(a(),c(M,{key:JSON.stringify(h)},["link"in h?(a(),c("div",Ba,[m(Ee,{item:h},null,8,["item"])])):"component"in h?(a(),c("div",Ca,[(a(),k(F(h.component),q({ref_for:!0},h.props,{"screen-menu":""}),null,16))])):(a(),c("div",Ha,[m(Ta,{text:h.text,items:h.items},null,8,["text","items"])]))],64))),128))],8,Aa)],2))}}),Fa=$(Ea,[["__scopeId","data-v-9b54e8b4"]]),Da={key:0,class:"VPNavScreenMenu"},Oa=_({__name:"VPNavScreenMenu",setup(o){const{theme:e}=P();return(t,s)=>r(e).nav?(a(),c("nav",Da,[(a(!0),c(M,null,E(r(e).nav,n=>(a(),c(M,{key:JSON.stringify(n)},["link"in n?(a(),k(ya,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(F(n.component),q({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),k(Fa,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ga=_({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=P();return(t,s)=>r(e).socialLinks?(a(),k(ge,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Fe=o=>(C("data-v-d9ff2423"),o=o(),H(),o),Ua=Fe(()=>v("span",{class:"vpi-languages icon lang"},null,-1)),ja=Fe(()=>v("span",{class:"vpi-chevron-down icon chevron"},null,-1)),za={class:"list"},qa=_({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),s=w(!1);function n(){s.value=!s.value}return(i,u)=>r(e).length&&r(t).label?(a(),c("div",{key:0,class:N(["VPNavScreenTranslations",{open:s.value}])},[v("button",{class:"title",onClick:n},[Ua,O(" "+I(r(t).label)+" ",1),ja]),v("ul",za,[(a(!0),c(M,null,E(r(e),h=>(a(),c("li",{key:h.link,class:"item"},[m(D,{class:"link",href:h.link},{default:d(()=>[O(I(h.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ka=$(qa,[["__scopeId","data-v-d9ff2423"]]),Wa={class:"container"},Ra=_({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=w(null),t=Te(oe?document.body:null);return(s,n)=>(a(),k(ve,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:d(()=>[s.open?(a(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",Wa,[l(s.$slots,"nav-screen-content-before",{},void 0,!0),m(Oa,{class:"menu"}),m(Ka,{class:"translations"}),m($a,{class:"appearance"}),m(Ga,{class:"social-links"}),l(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Ja=$(Ra,[["__scopeId","data-v-c6c7bd45"]]),Xa={key:0,class:"VPNav"},Ya=_({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=Mn(),{frontmatter:n}=P(),i=y(()=>n.value.navbar!==!1);return Ie("close-screen",t),Z(()=>{oe&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(u,h)=>i.value?(a(),c("header",Xa,[m(_a,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":d(()=>[l(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[l(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[l(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[l(u.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),m(Ja,{open:r(e)},{"nav-screen-content-before":d(()=>[l(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[l(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Qa=$(Ya,[["__scopeId","data-v-d52d372b"]]),De=o=>(C("data-v-b74067ae"),o=o(),H(),o),Za=["role","tabindex"],xa=De(()=>v("div",{class:"indicator"},null,-1)),er=De(()=>v("span",{class:"vpi-chevron-right caret-icon"},null,-1)),tr=[er],or={key:1,class:"items"},nr=_({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:s,isLink:n,isActiveLink:i,hasActiveLink:u,hasChildren:h,toggle:p}=$t(y(()=>e.item)),g=y(()=>h.value?"section":"div"),L=y(()=>n.value?"a":"div"),b=y(()=>h.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),V=y(()=>n.value?void 0:"button"),T=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":u.value}]);function A(S){"key"in S&&S.key!=="Enter"||!e.item.link&&p()}function B(){e.item.link&&p()}return(S,j)=>{const z=R("VPSidebarItem",!0);return a(),k(F(g.value),{class:N(["VPSidebarItem",T.value])},{default:d(()=>[S.item.text?(a(),c("div",q({key:0,class:"item",role:V.value},Ye(S.item.items?{click:A,keydown:A}:{},!0),{tabindex:S.item.items&&0}),[xa,S.item.link?(a(),k(D,{key:0,tag:L.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:d(()=>[(a(),k(F(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(F(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null&&S.item.items&&S.item.items.length?(a(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:Qe(B,["enter"]),tabindex:"0"},tr,32)):f("",!0)],16,Za)):f("",!0),S.item.items&&S.item.items.length?(a(),c("div",or,[S.depth<5?(a(!0),c(M,{key:0},E(S.item.items,J=>(a(),k(z,{key:J.text,item:J,depth:S.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),sr=$(nr,[["__scopeId","data-v-b74067ae"]]),ar=_({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=w(!0);let t=null;return W(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,n)=>(a(!0),c(M,null,E(s.items,i=>(a(),c("div",{key:i.text,class:N(["group",{"no-transition":e.value}])},[m(sr,{item:i,depth:0},null,8,["item"])],2))),128))}}),rr=$(ar,[["__scopeId","data-v-e3ecf1ec"]]),Oe=o=>(C("data-v-f2245985"),o=o(),H(),o),ir=Oe(()=>v("div",{class:"curtain"},null,-1)),lr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},cr=Oe(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),ur=_({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=U(),s=o,n=w(null),i=Te(oe?document.body:null);G([s,n],()=>{var h;s.open?(i.value=!0,(h=n.value)==null||h.focus()):i.value=!1},{immediate:!0,flush:"post"});const u=w(0);return G(e,()=>{u.value+=1},{deep:!0}),(h,p)=>r(t)?(a(),c("aside",{key:0,class:N(["VPSidebar",{open:h.open}]),ref_key:"navEl",ref:n,onClick:p[0]||(p[0]=xe(()=>{},["stop"]))},[ir,v("nav",lr,[cr,l(h.$slots,"sidebar-nav-before",{},void 0,!0),(a(),k(rr,{items:r(e),key:u.value},null,8,["items"])),l(h.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),dr=$(ur,[["__scopeId","data-v-f2245985"]]),vr=_({__name:"VPSkipLink",setup(o){const e=ee(),t=w();G(()=>e.path,()=>t.value.focus());function s({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const u=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",u)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",u),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),c(M,null,[v("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),pr=$(vr,[["__scopeId","data-v-a977b129"]]),hr=_({__name:"Layout",setup(o){const{isOpen:e,open:t,close:s}=U(),n=ee();G(()=>n.path,s),bt(e,s);const{frontmatter:i}=P(),u=et(),h=y(()=>!!u["home-hero-image"]);return Ie("hero-image-slot-exists",h),(p,g)=>{const L=R("Content");return r(i).layout!==!1?(a(),c("div",{key:0,class:N(["Layout",r(i).pageClass])},[l(p.$slots,"layout-top",{},void 0,!0),m(pr),m(st,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),m(Qa,null,{"nav-bar-title-before":d(()=>[l(p.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[l(p.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[l(p.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[l(p.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":d(()=>[l(p.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[l(p.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),m(Nn,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),m(dr,{open:r(e)},{"sidebar-nav-before":d(()=>[l(p.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":d(()=>[l(p.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),m(un,null,{"page-top":d(()=>[l(p.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[l(p.$slots,"page-bottom",{},void 0,!0)]),"not-found":d(()=>[l(p.$slots,"not-found",{},void 0,!0)]),"home-hero-before":d(()=>[l(p.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[l(p.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[l(p.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[l(p.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[l(p.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[l(p.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[l(p.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[l(p.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[l(p.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":d(()=>[l(p.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[l(p.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[l(p.$slots,"doc-after",{},void 0,!0)]),"doc-top":d(()=>[l(p.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[l(p.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":d(()=>[l(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[l(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[l(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[l(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[l(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[l(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),m(fn),l(p.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(L,{key:1}))}}}),fr=$(hr,[["__scopeId","data-v-7e3343f7"]]),mr={Layout:fr,enhanceApp:({app:o})=>{o.component("Badge",tt)}};export{Us as c,mr as t,P as u}; diff --git a/assets/deploy_config.md.QRt04bcu.js b/assets/deploy_config.md.QRt04bcu.js new file mode 100644 index 00000000..c7ec7a7a --- /dev/null +++ b/assets/deploy_config.md.QRt04bcu.js @@ -0,0 +1,31 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"配置","description":"","frontmatter":{"title":"配置","order":2},"headers":[],"relativePath":"deploy/config.md","filePath":"zh/deploy/config.md","lastUpdated":1725101868000}'),t={name:"deploy/config.md"},l=n(`

配置

轻雪支持yamljsontoml作为配置文件,取决于你个人的喜好

首次运行后生成config.ymlconfig目录,你可修改配置项后重启轻雪,绝大多数情况下,你只需要修改superusersnickname字段即可

启动时会加载项目目录下config.yml/yaml/json/tomlconfig目录下的所有配置文件,你可在config目录下创建多个配置文件,轻雪会自动合并这些配置文件

基础配置项

yaml
nonebot:
+  # Nonebot机器人的配置,以前的最外层配置项仍可为Nonebot服务,但是部分内容会被覆盖,请尽快迁移
+  command_start: [ "/", "" ] # 指令前缀,若没有""空命令头,请开启alconna_use_command_start保证alconna解析正常
+  host: 127.0.0.1 # 监听地址,默认为本机,若要接收外部请求请填写0.0.0.0
+  port: 20216 # 绑定端口
+  nickname: [ "liteyuki" ]  # 机器人昵称列表
+  superusers: [ "1919810" ]  # 超级用户列表
+liteyuki:
+  # 写在外层的配置项将会被覆盖,建议迁移到liteyuki下
+  log_level: "INFO" # 日志等级
+  log_icon: true # 是否显示日志等级图标(某些控制台字体不可用)
+  auto_report: true # 是否自动上报问题给轻雪服务器
+  auto_update: true # 是否自动更新轻雪,每天4点检查更新
+  plugins: [ ] # 轻雪插件列表
+  plugin_dirs: [ ] # 轻雪插件目录列表

其他配置

以下为默认值,如需自定义请手动添加

yaml
# 高级NoneBot配置
+nonebot:
+  onebot_access_token: "" # 访问令牌,对公开放时建议设置
+  default_language: "zh-CN" # 默认语言
+  alconna_auto_completion: false # alconna是否自动补全指令,默认false,建议开启
+  safe_mode: false # 安全模式,开启后将不会加载任何第三方NoneBot插件
+  # 其他Nonebot插件的配置项
+  custom_config_1: "custom_value1"
+  custom_config_2: "custom_value2"
+
+# 开发者选项
+liteyuki:
+  allow_update: true # 是否允许更新
+  debug: false  # 轻雪调试,开启会自动重载Bot或者资源,其他插件自带的调试功能也将开启
+  dev_mode: false # 开发者模式,开启后将会启动监视者,监视文件变化并自动重载
+
+...

示例:与NoneBot对接的OneBot实现端配置

生产环境中推荐反向WebSocket 不同的实现端给出的字段可能不同,但是基本上都是一样的,这里给出一个参考值

字段参考值说明
协议反向WebSocket推荐使用反向ws协议进行通信,即轻雪作为服务端
地址ws://127.0.0.1:20216/onebot/v11/ws地址取决于配置文件,本机默认为127.0.0.1:20216
AccessToken""如果你给轻雪配置了AccessToken,请在此填写相同的值

其他

  • 轻雪不局限于OneBot适配器,你可以使用NoneBot2支持的任何适配器或使用轻雪讯息传递插件
`,15),h=[l];function e(k,p,d,o,r,E){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default}; diff --git a/assets/deploy_config.md.QRt04bcu.lean.js b/assets/deploy_config.md.QRt04bcu.lean.js new file mode 100644 index 00000000..6aa65ef0 --- /dev/null +++ b/assets/deploy_config.md.QRt04bcu.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"配置","description":"","frontmatter":{"title":"配置","order":2},"headers":[],"relativePath":"deploy/config.md","filePath":"zh/deploy/config.md","lastUpdated":1725101868000}'),t={name:"deploy/config.md"},l=n("",15),h=[l];function e(k,p,d,o,r,E){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default}; diff --git a/assets/deploy_fandq.md.BC91M77d.js b/assets/deploy_fandq.md.BC91M77d.js new file mode 100644 index 00000000..2188f79d --- /dev/null +++ b/assets/deploy_fandq.md.BC91M77d.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"答疑","description":"","frontmatter":{"title":"答疑","order":3},"headers":[],"relativePath":"deploy/fandq.md","filePath":"zh/deploy/fandq.md","lastUpdated":1725101868000}'),r={name:"deploy/fandq.md"},n=a('

答疑

常见问题

  • 设备上Python环境太乱了,pip和python不对应怎么办?

    • 请使用/path/to/python -m pip install -r requirements.txt来安装依赖, 然后用/path/to/python main.py来启动Bot, 其中/path/to/python是你要用来运行Bot的可执行文件
  • 为什么我启动后机器人没有反应?

    • 请检查配置文件的command_startsuperusers,确认你有权限使用命令并按照正确的命令发送
    • 确认命令头没有和nickname{}冲突,例如一个命令是help,但是Bot昵称有一个help,那么将会被解析为nickname而不是命令
  • 更新轻雪失败,报错InvalidGitRepositoryError

    • 请正确安装Git,并使用克隆而非直接下载的方式部署轻雪
  • 怎么登录聊天平台,例如QQ?

    • 你有这个问题说明你不是很了解这个项目,本项目不负责实现登录功能,只负责处理和回应消息,登录功能由实现端(协议端)提供, 实现端本身不负责处理响应逻辑,将消息按照OneBot标准处理好上报给轻雪 你需要使用Onebot标准的实现端来连接到轻雪并将消息上报给轻雪,下面已经列出一些推荐的实现端
  • Playwright安装失败

    • 输入playwright install安装浏览器
  • 有的插件安装后报错无法启动

    • 请先查阅插件文档,确认插件必要配置项完好后,仍然出现问题,请联系插件作者或在安全模式safe_mode: true下启动轻雪,在安全模式下你可以使用npm uninstall卸载问题插件
  • 其他问题

    加入QQ群775840726

推荐方案(QQ)

  1. Lagrange.OneBot,基于NTQQ的OneBot实现,目前Markdown消息支持Lagrange
  2. LLOneBot,NTQQ的OneBot插件,需要安装NTQQ
  3. OpenShamrock,基于Lsposed的OneBot11实现
  4. TRSS-Yunzai,基于node.js,可使用ws-plugin进行通信
  5. go-cqhttpgo语言实现的OneBot11实现端,目前可用性较低
  6. Gensokyo,基于 OneBot QQ官方机器人Api Golang 原生实现,需要官方机器人权限
  7. 人工实现的Onebot协议,自己整一个WebSocket客户端,看着QQ的消息,然后给轻雪传输数据

推荐方案(Minecraft)

  1. MinecraftOneBot,我们专门为Minecraft开发的服务器Bot,支持OneBotV11标准

使用其他项目连接请先自行查阅文档,若有困难请联系对应开发者而不是Liteyuki的开发者

鸣谢

',10),l=[n];function i(c,h,d,p,s,u){return t(),o("div",null,l)}const g=e(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/deploy_fandq.md.BC91M77d.lean.js b/assets/deploy_fandq.md.BC91M77d.lean.js new file mode 100644 index 00000000..a562a899 --- /dev/null +++ b/assets/deploy_fandq.md.BC91M77d.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"答疑","description":"","frontmatter":{"title":"答疑","order":3},"headers":[],"relativePath":"deploy/fandq.md","filePath":"zh/deploy/fandq.md","lastUpdated":1725101868000}'),r={name:"deploy/fandq.md"},n=a("",10),l=[n];function i(c,h,d,p,s,u){return t(),o("div",null,l)}const g=e(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/deploy_install.md.DaqD6Ylg.js b/assets/deploy_install.md.DaqD6Ylg.js new file mode 100644 index 00000000..89582db0 --- /dev/null +++ b/assets/deploy_install.md.DaqD6Ylg.js @@ -0,0 +1,8 @@ +import{_ as i,c as e,o as t,a4 as s}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"安装","description":"","frontmatter":{"title":"安装","order":1},"headers":[],"relativePath":"deploy/install.md","filePath":"zh/deploy/install.md","lastUpdated":1725102337000}'),a={name:"deploy/install.md"},o=s(`

安装

常规部署

  1. 安装 GitPython3.10+ 环境
bash
# 克隆项目到本地,轻雪使用Git进行版本管理,该步骤为必要项
+git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
+# 切换到Bot目录下
+cd LiteyukiBot
+# 安装依赖
+pip install -r requirements.txt
+# 启动Bot
+python main.py

TIP

推荐使用虚拟环境来运行轻雪,以避免依赖冲突,你可以使用python -m venv .venv来创建虚拟环境,然后使用.venv\\Scripts\\activate来激活虚拟环境(Linux下使用source .venv/bin/activate激活)

使用Docker构建

  1. 安装 Docker
  2. 克隆项目 git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
  3. 进入轻雪目录 cd LiteyukiBot
  4. 构建镜像 docker build -t liteyukibot .
  5. 启动容器 docker run -p 20216:20216 -v $(pwd):/liteyukibot -v $(pwd)/.cache:/root/.cache liteyukibot

TIP

Windows请使用项目绝对目录/path/to/LiteyukiBot代替$(pwd)
若你修改了端口号请将20216:20216中的20216替换为你的端口号

使用TRSS Scripts部署

TRSS_Liteyuki轻雪机器人管理脚本,该功能由TRSS提供支持,不是LiteyukiBot官方提供的功能,推荐使用Arch Linux

装置要求

  • Windows系统版本最低Windows10+/Windows Server 2019+
  • Linux系统要支持Python3.10+,推荐Ubuntu 20.04+(别用你那b CentOS)
  • CPU: 至少1vCPU
  • 内存: Bot无其他插件会占用300~500MB,包括chromiumnode等进程,其他插件占用视具体插件而定,建议1GB以上
  • 硬盘: 至少1GB空间

WARNING

如果装置上有多个环境,请使用path/to/python -m pip install -r requirements.txt来安装依赖,path/to/python为你的Python可执行文件路径

WARNING

轻雪的更新功能依赖Git,如果你没有安装Git直接下载源代码运行,你将无法使用更新功能

其他问题请移步至答疑

`,15),l=[o];function n(c,d,r,h,p,k){return t(),e("div",null,l)}const b=i(a,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/deploy_install.md.DaqD6Ylg.lean.js b/assets/deploy_install.md.DaqD6Ylg.lean.js new file mode 100644 index 00000000..a906e68a --- /dev/null +++ b/assets/deploy_install.md.DaqD6Ylg.lean.js @@ -0,0 +1 @@ +import{_ as i,c as e,o as t,a4 as s}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"安装","description":"","frontmatter":{"title":"安装","order":1},"headers":[],"relativePath":"deploy/install.md","filePath":"zh/deploy/install.md","lastUpdated":1725102337000}'),a={name:"deploy/install.md"},o=s("",15),l=[o];function n(c,d,r,h,p,k){return t(),e("div",null,l)}const b=i(a,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/dev_api_api.md.BjidfGYh.js b/assets/dev_api_api.md.BjidfGYh.js new file mode 100644 index 00000000..48fc044b --- /dev/null +++ b/assets/dev_api_api.md.BjidfGYh.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"dev/api/api.md","filePath":"zh/dev/api/api.md","lastUpdated":null}'),o={name:"dev/api/api.md"},r=i('

liteyuki

var __version__

  • 说明: 测试版本号

  • 默认值: '6.3.10'

',3),l=[r];function s(_,n,d,c,p,u){return t(),a("div",null,l)}const m=e(o,[["render",s]]);export{v as __pageData,m as default}; diff --git a/assets/dev_api_api.md.BjidfGYh.lean.js b/assets/dev_api_api.md.BjidfGYh.lean.js new file mode 100644 index 00000000..14cc681a --- /dev/null +++ b/assets/dev_api_api.md.BjidfGYh.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"dev/api/api.md","filePath":"zh/dev/api/api.md","lastUpdated":null}'),o={name:"dev/api/api.md"},r=i("",3),l=[r];function s(_,n,d,c,p,u){return t(),a("div",null,l)}const m=e(o,[["render",s]]);export{v as __pageData,m as default}; diff --git a/assets/dev_api_bot_bot.md.CmVyYr_O.js b/assets/dev_api_bot_bot.md.CmVyYr_O.js new file mode 100644 index 00000000..10bd7e8c --- /dev/null +++ b/assets/dev_api_bot_bot.md.CmVyYr_O.js @@ -0,0 +1,211 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"dev/api/bot/bot.md","filePath":"zh/dev/api/bot/bot.md","lastUpdated":null}'),t={name:"dev/api/bot/bot.md"},l=n(`

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

说明: 初始化轻雪实例

参数:

  • *args:
  • **kwargs: 配置
源代码在GitHub上查看
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

说明: 启动逻辑

源代码在GitHub上查看
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

说明: 外部启动接口

源代码在GitHub上查看
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

说明: 保持轻雪运行

源代码在GitHub上查看
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

说明: 信号处理

参数:

  • signum:
  • frame:
源代码在GitHub上查看
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

说明: 重启轻雪本体

源代码在GitHub上查看
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

说明: 停止轻雪

参数:

  • name: 进程名称, 默认为None, 所有进程
源代码在GitHub上查看
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

说明: 初始化轻雪, 自动调用

源代码在GitHub上查看
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

源代码在GitHub上查看
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

说明: 停止轻雪

源代码在GitHub上查看
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

说明: 注册启动前的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

说明: 注册启动后的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册停止后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册进程停止前的函数,为子进程停止时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

说明: 注册进程重启前的函数,为子进程重启时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

说明: 注册重启后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

说明: 获取轻雪实例

返回: LiteyukiBot: 当前的轻雪实例

源代码在GitHub上查看
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

说明: 获取配置

参数:

  • key: 配置键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

说明: 获取配置,兼容旧版本

参数:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
源代码在GitHub上查看
python
def print_logo():
+    print('\\x1b[34m' + '\\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \\n    /  |      /      |/        |/        |/  \\\\    /  |/  |  /  |/  |  /  |/      |\\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\\\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \\n    $$ |        $$ |     $$ |   $$ |__     $$  \\\\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \\n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \\n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\\\    $$ |  \\n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\\\__$$ |$$ |$$  \\\\  _$$ |_ \\n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \\n                ' + '\\x1b[0m')
`,85),e=[l];function h(p,k,r,d,g,o){return a(),i("div",null,e)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/dev_api_bot_bot.md.CmVyYr_O.lean.js b/assets/dev_api_bot_bot.md.CmVyYr_O.lean.js new file mode 100644 index 00000000..379d36c7 --- /dev/null +++ b/assets/dev_api_bot_bot.md.CmVyYr_O.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"dev/api/bot/bot.md","filePath":"zh/dev/api/bot/bot.md","lastUpdated":null}'),t={name:"dev/api/bot/bot.md"},l=n("",85),e=[l];function h(p,k,r,d,g,o){return a(),i("div",null,e)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/dev_api_bot_index.md.DudPhKae.js b/assets/dev_api_bot_index.md.DudPhKae.js new file mode 100644 index 00000000..e8aaceca --- /dev/null +++ b/assets/dev_api_bot_index.md.DudPhKae.js @@ -0,0 +1,211 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"dev/api/bot/index.md","filePath":"zh/dev/api/bot/index.md","lastUpdated":null}'),t={name:"dev/api/bot/index.md"},l=n(`

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

说明: 初始化轻雪实例

参数:

  • *args:
  • **kwargs: 配置
源代码在GitHub上查看
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

说明: 启动逻辑

源代码在GitHub上查看
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

说明: 外部启动接口

源代码在GitHub上查看
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

说明: 保持轻雪运行

源代码在GitHub上查看
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

说明: 信号处理

参数:

  • signum:
  • frame:
源代码在GitHub上查看
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

说明: 重启轻雪本体

源代码在GitHub上查看
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

说明: 停止轻雪

参数:

  • name: 进程名称, 默认为None, 所有进程
源代码在GitHub上查看
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

说明: 初始化轻雪, 自动调用

源代码在GitHub上查看
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

源代码在GitHub上查看
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

说明: 停止轻雪

源代码在GitHub上查看
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

说明: 注册启动前的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

说明: 注册启动后的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册停止后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册进程停止前的函数,为子进程停止时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

说明: 注册进程重启前的函数,为子进程重启时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

说明: 注册重启后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

说明: 获取轻雪实例

返回: LiteyukiBot: 当前的轻雪实例

源代码在GitHub上查看
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

说明: 获取配置

参数:

  • key: 配置键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

说明: 获取配置,兼容旧版本

参数:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
源代码在GitHub上查看
python
def print_logo():
+    print('\\x1b[34m' + '\\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \\n    /  |      /      |/        |/        |/  \\\\    /  |/  |  /  |/  |  /  |/      |\\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\\\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \\n    $$ |        $$ |     $$ |   $$ |__     $$  \\\\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \\n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \\n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\\\    $$ |  \\n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\\\__$$ |$$ |$$  \\\\  _$$ |_ \\n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \\n                ' + '\\x1b[0m')
`,85),e=[l];function h(p,k,r,d,g,o){return a(),i("div",null,e)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/dev_api_bot_index.md.DudPhKae.lean.js b/assets/dev_api_bot_index.md.DudPhKae.lean.js new file mode 100644 index 00000000..f5927c92 --- /dev/null +++ b/assets/dev_api_bot_index.md.DudPhKae.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"dev/api/bot/index.md","filePath":"zh/dev/api/bot/index.md","lastUpdated":null}'),t={name:"dev/api/bot/index.md"},l=n("",85),e=[l];function h(p,k,r,d,g,o){return a(),i("div",null,e)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/dev_api_bot_lifespan.md.B4hpMOqt.js b/assets/dev_api_bot_lifespan.md.B4hpMOqt.js new file mode 100644 index 00000000..70578a4c --- /dev/null +++ b/assets/dev_api_bot_lifespan.md.B4hpMOqt.js @@ -0,0 +1,114 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"liteyuki.bot.lifespan","description":"","frontmatter":{"title":"liteyuki.bot.lifespan"},"headers":[],"relativePath":"dev/api/bot/lifespan.md","filePath":"zh/dev/api/bot/lifespan.md","lastUpdated":null}'),t={name:"dev/api/bot/lifespan.md"},e=n(`

liteyuki.bot.lifespan

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午8:24 @Author : snowykami @Email : snowykami@outlook.com @File : lifespan.py @Software: PyCharm

class Lifespan

def __init__(self) -> None

说明: 轻雪生命周期管理,启动、停止、重启

源代码在GitHub上查看
python
def __init__(self) -> None:
+    """
+        轻雪生命周期管理,启动、停止、重启
+        """
+    self.life_flag: int = 0
+    self._before_start_funcs: list[LIFESPAN_FUNC] = []
+    self._after_start_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._after_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_restart_funcs: list[LIFESPAN_FUNC] = []
+    self._after_restart_funcs: list[LIFESPAN_FUNC] = []

@staticmethod

async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None

说明: 并发运行异步函数

参数:

  • funcs:
源代码在GitHub上查看
python
@staticmethod
+async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None:
+    """
+        并发运行异步函数
+        Args:
+            funcs:
+        Returns:
+        """
+    loop = asyncio.get_running_loop()
+    tasks = [func(*args, **kwargs) if is_coroutine_callable(func) else async_wrapper(func)(*args, **kwargs) for func in funcs]
+    await asyncio.gather(*tasks)

def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册启动时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_start_funcs.append(func)
+    return func

def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册启动时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_start_funcs.append(func)
+    return func

def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册停止前的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止前的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_shutdown_funcs.append(func)
+    return func

def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册停止后的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止后的函数
+        Args:
+            func:
+
+        Returns:
+            LIFESPAN_FUNC:
+
+        """
+    self._after_shutdown_funcs.append(func)
+    return func

def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册重启时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_restart_funcs.append(func)
+    return func

def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册重启后的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启后的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_restart_funcs.append(func)
+    return func

async def before_start(self) -> None

说明: 启动前

源代码在GitHub上查看
python
async def before_start(self) -> None:
+    """
+        启动前
+        Returns:
+        """
+    logger.debug('Running before_start functions')
+    await self.run_funcs(self._before_start_funcs)

async def after_start(self) -> None

说明: 启动后

源代码在GitHub上查看
python
async def after_start(self) -> None:
+    """
+        启动后
+        Returns:
+        """
+    logger.debug('Running after_start functions')
+    await self.run_funcs(self._after_start_funcs)

async def before_process_shutdown(self) -> None

说明: 停止前

源代码在GitHub上查看
python
async def before_process_shutdown(self) -> None:
+    """
+        停止前
+        Returns:
+        """
+    logger.debug('Running before_shutdown functions')
+    await self.run_funcs(self._before_process_shutdown_funcs)

async def after_shutdown(self) -> None

说明: 停止后

源代码在GitHub上查看
python
async def after_shutdown(self) -> None:
+    """
+        停止后
+        Returns:
+        """
+    logger.debug('Running after_shutdown functions')
+    await self.run_funcs(self._after_shutdown_funcs)

async def before_process_restart(self) -> None

说明: 重启前

源代码在GitHub上查看
python
async def before_process_restart(self) -> None:
+    """
+        重启前
+        Returns:
+        """
+    logger.debug('Running before_restart functions')
+    await self.run_funcs(self._before_process_restart_funcs)

async def after_restart(self) -> None

说明: 重启后

源代码在GitHub上查看
python
async def after_restart(self) -> None:
+    """
+        重启后
+        Returns:
+
+        """
+    logger.debug('Running after_restart functions')
+    await self.run_funcs(self._after_restart_funcs)
`,67),l=[e];function p(h,k,r,o,d,g){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{F as __pageData,c as default}; diff --git a/assets/dev_api_bot_lifespan.md.B4hpMOqt.lean.js b/assets/dev_api_bot_lifespan.md.B4hpMOqt.lean.js new file mode 100644 index 00000000..a4bc1b67 --- /dev/null +++ b/assets/dev_api_bot_lifespan.md.B4hpMOqt.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"liteyuki.bot.lifespan","description":"","frontmatter":{"title":"liteyuki.bot.lifespan"},"headers":[],"relativePath":"dev/api/bot/lifespan.md","filePath":"zh/dev/api/bot/lifespan.md","lastUpdated":null}'),t={name:"dev/api/bot/lifespan.md"},e=n("",67),l=[e];function p(h,k,r,o,d,g){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{F as __pageData,c as default}; diff --git a/assets/dev_api_comm_channel.md.CNJvRyvp.js b/assets/dev_api_comm_channel.md.CNJvRyvp.js new file mode 100644 index 00000000..258b4b00 --- /dev/null +++ b/assets/dev_api_comm_channel.md.CNJvRyvp.js @@ -0,0 +1,196 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.comm.channel","description":"","frontmatter":{"title":"liteyuki.comm.channel"},"headers":[],"relativePath":"dev/api/comm/channel.md","filePath":"zh/dev/api/comm/channel.md","lastUpdated":null}'),t={name:"dev/api/comm/channel.md"},l=n(`

liteyuki.comm.channel

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午11:21 @Author : snowykami @Email : snowykami@outlook.com @File : channel_.py @Software: PyCharm

本模块定义了一个通用的通道类,用于进程间通信

class Channel(Generic[T])

def __init__(self, name: str, type_check: Optional[bool] = None)

说明: 初始化通道

参数:

  • name: 通道ID
  • type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
源代码在GitHub上查看
python
def __init__(self, name: str, type_check: Optional[bool]=None):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+            type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
+        """
+    self.conn_send, self.conn_recv = Pipe()
+    self._conn_send_inner, self._conn_recv_inner = Pipe()
+    self._closed = False
+    self._on_main_receive_func_ids: list[int] = []
+    self._on_sub_receive_func_ids: list[int] = []
+    self.name: str = name
+    self.is_receive_loop_running = False
+    if type_check is None:
+        type_check = self._get_generic_type() is not None
+    elif type_check:
+        if self._get_generic_type() is None:
+            raise TypeError('Type hint is required for enforcing type check.')
+    self.type_check = type_check
+    if name in _channel:
+        raise ValueError(f'Channel {name} already exists')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = self
+        logger.debug(f'Channel {name} initialized in main process')
+    else:
+        logger.debug(f'Channel {name} initialized in sub process, should manually set in main process')

def _get_generic_type(self) -> Optional[type]

说明: 获取通道传递泛型类型

返回: Optional[type]: 泛型类型

源代码在GitHub上查看
python
def _get_generic_type(self) -> Optional[type]:
+    """
+        获取通道传递泛型类型
+
+        Returns:
+            Optional[type]: 泛型类型
+        """
+    if hasattr(self, '__orig_class__'):
+        return get_args(self.__orig_class__)[0]
+    return None

def _validate_structure(self, data: Any, structure: type) -> bool

说明: 验证数据结构

参数:

  • data: 数据
  • structure: 结构

返回: bool: 是否通过验证

源代码在GitHub上查看
python
def _validate_structure(self, data: Any, structure: type) -> bool:
+    """
+        验证数据结构
+        Args:
+            data: 数据
+            structure: 结构
+
+        Returns:
+            bool: 是否通过验证
+        """
+    if isinstance(structure, type):
+        return isinstance(data, structure)
+    elif isinstance(structure, tuple):
+        if not isinstance(data, tuple) or len(data) != len(structure):
+            return False
+        return all((self._validate_structure(d, s) for d, s in zip(data, structure)))
+    elif isinstance(structure, list):
+        if not isinstance(data, list):
+            return False
+        return all((self._validate_structure(d, structure[0]) for d in data))
+    elif isinstance(structure, dict):
+        if not isinstance(data, dict):
+            return False
+        return all((k in data and self._validate_structure(data[k], structure[k]) for k in structure))
+    return False

def send(self, data: T)

说明: 发送数据,发送函数为同步函数,没有异步的必要

参数:

  • data: 数据
源代码在GitHub上查看
python
def send(self, data: T):
+    """
+        发送数据,发送函数为同步函数,没有异步的必要
+        Args:
+            data: 数据
+        """
+    if self.type_check:
+        _type = self._get_generic_type()
+        if _type is not None and (not self._validate_structure(data, _type)):
+            raise TypeError(f'Data must be an instance of {_type}, {type(data)} found')
+    if self._closed:
+        raise RuntimeError('Cannot send to a closed channel_')
+    self.conn_send.send(data)

def receive(self) -> T

说明: 同步接收数据,会阻塞线程

源代码在GitHub上查看
python
def receive(self) -> T:
+    """
+        同步接收数据,会阻塞线程
+        Args:
+        """
+    if self._closed:
+        raise RuntimeError('Cannot receive from a closed channel_')
+    while True:
+        data = self.conn_recv.recv()
+        return data

async def async_receive(self) -> T

说明: 异步接收数据,会挂起等待

源代码在GitHub上查看
python
async def async_receive(self) -> T:
+    """
+        异步接收数据,会挂起等待
+        """
+    print('等待接收数据')
+    loop = asyncio.get_running_loop()
+    data = await loop.run_in_executor(None, self.receive)
+    print('接收到数据')
+    return data

def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]

说明: 接收数据并执行函数

参数:

  • filter_func: 过滤函数,为None则不过滤

返回: 装饰器,装饰一个函数在接收到数据后执行

源代码在GitHub上查看
python
def on_receive(self, filter_func: Optional[FILTER_FUNC]=None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]:
+    """
+        接收数据并执行函数
+        Args:
+            filter_func: 过滤函数,为None则不过滤
+        Returns:
+            装饰器,装饰一个函数在接收到数据后执行
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('on_receive can only be used in main process')
+
+    def decorator(func: Callable[[T], Any]) -> Callable[[T], Any]:
+        global _func_id
+
+        async def wrapper(data: T) -> Any:
+            if filter_func is not None:
+                if is_coroutine_callable(filter_func):
+                    if not await filter_func(data):
+                        return
+                elif not filter_func(data):
+                    return
+            if is_coroutine_callable(func):
+                return await func(data)
+            else:
+                return func(data)
+        _callback_funcs[_func_id] = wrapper
+        if IS_MAIN_PROCESS:
+            self._on_main_receive_func_ids.append(_func_id)
+        else:
+            self._on_sub_receive_func_ids.append(_func_id)
+        _func_id += 1
+        return func
+    return decorator

async def _run_on_receive_funcs(self, data: Any)

说明: 运行接收函数

参数:

  • data: 数据
源代码在GitHub上查看
python
async def _run_on_receive_funcs(self, data: Any):
+    """
+        运行接收函数
+        Args:
+            data: 数据
+        """
+    if IS_MAIN_PROCESS:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_main_receive_func_ids]
+    else:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_sub_receive_func_ids]

async def start_receive_loop(self)

说明: 开始接收数据 会自动判断主进程和子进程,需要在对应进程都调度一次

源代码在GitHub上查看
python
async def start_receive_loop(self):
+    """
+        开始接收数据
+        会自动判断主进程和子进程,需要在对应进程都调度一次
+        """
+    if len(self._on_main_receive_func_ids) == 0:
+        logger.warning(f'No on_receive function registered for {self.name}')
+        return
+    self.is_receive_loop_running = True
+    logger.debug(f'Starting receive loop for {self.name}')
+    while not self._closed:
+        data = await self.async_receive()
+        await self._run_on_receive_funcs(data)

var active_channel

  • 说明: 子进程可用的主动和被动通道

  • 类型: Channel

  • 默认值: Channel(name='active_channel')

var publish_channel

  • 说明: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • 类型: Channel[tuple[str, dict[str, Any]]]

  • 默认值: Channel(name='publish_channel')

var channel_deliver_active_channel

  • 说明: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • 类型: Channel[Channel[Any]]

  • 默认值: NO_DEFAULT

def set_channel(name: str, channel: Channel)

说明: 设置通道实例

参数:

  • name: 通道名称
  • channel: 通道实例
源代码在GitHub上查看
python
def set_channel(name: str, channel: 'Channel'):
+    """
+    设置通道实例
+    Args:
+        name: 通道名称
+        channel: 通道实例
+    """
+    if not isinstance(channel, Channel):
+        raise TypeError(f'channel_ must be an instance of Channel, {type(channel)} found')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = channel
+    else:
+        channel_deliver_passive_channel.send(('set_channel', {'name': name, 'channel_': channel}))

def set_channels(channels: dict[str, Channel])

说明: 设置通道实例

参数:

  • channels: 通道名称
源代码在GitHub上查看
python
def set_channels(channels: dict[str, 'Channel']):
+    """
+    设置通道实例
+    Args:
+        channels: 通道名称
+    """
+    for name, channel in channels.items():
+        set_channel(name, channel)

def get_channel(name: str) -> Channel

说明: 获取通道实例

参数:

  • name: 通道名称
源代码在GitHub上查看
python
def get_channel(name: str) -> 'Channel':
+    """
+    获取通道实例
+    Args:
+        name: 通道名称
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel[name]
+    else:
+        recv_chan = Channel[Channel[Any]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channel', {'name': name, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def get_channels() -> dict[str, Channel]

说明: 获取通道实例

源代码在GitHub上查看
python
def get_channels() -> dict[str, 'Channel']:
+    """
+    获取通道实例
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel
+    else:
+        recv_chan = Channel[dict[str, Channel[Any]]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channels', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')

def on_set_channel(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')
+def on_set_channel(data: tuple[str, dict[str, Any]]):
+    name, channel = (data[1]['name'], data[1]['channel_'])
+    set_channel(name, channel)

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')

def on_get_channel(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')
+def on_get_channel(data: tuple[str, dict[str, Any]]):
+    name, recv_chan = (data[1]['name'], data[1]['recv_chan'])
+    recv_chan.send(get_channel(name))

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')

def on_get_channels(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')
+def on_get_channels(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(get_channels())
`,78),h=[l];function e(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(t,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/dev_api_comm_channel.md.CNJvRyvp.lean.js b/assets/dev_api_comm_channel.md.CNJvRyvp.lean.js new file mode 100644 index 00000000..a3bbd77e --- /dev/null +++ b/assets/dev_api_comm_channel.md.CNJvRyvp.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.comm.channel","description":"","frontmatter":{"title":"liteyuki.comm.channel"},"headers":[],"relativePath":"dev/api/comm/channel.md","filePath":"zh/dev/api/comm/channel.md","lastUpdated":null}'),t={name:"dev/api/comm/channel.md"},l=n("",78),h=[l];function e(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(t,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/dev_api_comm_comm.md.UNalIkKO.js b/assets/dev_api_comm_comm.md.UNalIkKO.js new file mode 100644 index 00000000..b8763d6e --- /dev/null +++ b/assets/dev_api_comm_comm.md.UNalIkKO.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as c,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"dev/api/comm/comm.md","filePath":"zh/dev/api/comm/comm.md","lastUpdated":null}'),m={name:"dev/api/comm/comm.md"},i=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),n=e("p",null,[e("strong",null,"说明"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),s=[i,n];function l(r,d,_,p,u,h){return c(),a("div",null,s)}const v=o(m,[["render",l]]);export{k as __pageData,v as default}; diff --git a/assets/dev_api_comm_comm.md.UNalIkKO.lean.js b/assets/dev_api_comm_comm.md.UNalIkKO.lean.js new file mode 100644 index 00000000..b8763d6e --- /dev/null +++ b/assets/dev_api_comm_comm.md.UNalIkKO.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as c,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"dev/api/comm/comm.md","filePath":"zh/dev/api/comm/comm.md","lastUpdated":null}'),m={name:"dev/api/comm/comm.md"},i=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),n=e("p",null,[e("strong",null,"说明"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),s=[i,n];function l(r,d,_,p,u,h){return c(),a("div",null,s)}const v=o(m,[["render",l]]);export{k as __pageData,v as default}; diff --git a/assets/dev_api_comm_event.md.C9P63b1v.js b/assets/dev_api_comm_event.md.C9P63b1v.js new file mode 100644 index 00000000..b6bd9132 --- /dev/null +++ b/assets/dev_api_comm_event.md.C9P63b1v.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.event","description":"","frontmatter":{"title":"liteyuki.comm.event"},"headers":[],"relativePath":"dev/api/comm/event.md","filePath":"zh/dev/api/comm/event.md","lastUpdated":null}'),s={name:"dev/api/comm/event.md"},n=i('

liteyuki.comm.event

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class Event

def __init__(self, name: str, data: dict[str, Any])

源代码在GitHub上查看
python
def __init__(self, name: str, data: dict[str, Any]):\n    self.name = name\n    self.data = data
',6),l=[n];function r(h,o,d,k,p,c){return e(),t("div",null,l)}const _=a(s,[["render",r]]);export{y as __pageData,_ as default}; diff --git a/assets/dev_api_comm_event.md.C9P63b1v.lean.js b/assets/dev_api_comm_event.md.C9P63b1v.lean.js new file mode 100644 index 00000000..01c19a4c --- /dev/null +++ b/assets/dev_api_comm_event.md.C9P63b1v.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.event","description":"","frontmatter":{"title":"liteyuki.comm.event"},"headers":[],"relativePath":"dev/api/comm/event.md","filePath":"zh/dev/api/comm/event.md","lastUpdated":null}'),s={name:"dev/api/comm/event.md"},n=i("",6),l=[n];function r(h,o,d,k,p,c){return e(),t("div",null,l)}const _=a(s,[["render",r]]);export{y as __pageData,_ as default}; diff --git a/assets/dev_api_comm_index.md.Bztx56-h.js b/assets/dev_api_comm_index.md.Bztx56-h.js new file mode 100644 index 00000000..d450b16e --- /dev/null +++ b/assets/dev_api_comm_index.md.Bztx56-h.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"dev/api/comm/index.md","filePath":"zh/dev/api/comm/index.md","lastUpdated":null}'),n={name:"dev/api/comm/index.md"},c=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),s=e("p",null,[e("strong",null,"说明"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),l=[c,s];function r(d,m,_,p,u,h){return i(),o("div",null,l)}const x=a(n,[["render",r]]);export{k as __pageData,x as default}; diff --git a/assets/dev_api_comm_index.md.Bztx56-h.lean.js b/assets/dev_api_comm_index.md.Bztx56-h.lean.js new file mode 100644 index 00000000..d450b16e --- /dev/null +++ b/assets/dev_api_comm_index.md.Bztx56-h.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"dev/api/comm/index.md","filePath":"zh/dev/api/comm/index.md","lastUpdated":null}'),n={name:"dev/api/comm/index.md"},c=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),s=e("p",null,[e("strong",null,"说明"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),l=[c,s];function r(d,m,_,p,u,h){return i(),o("div",null,l)}const x=a(n,[["render",r]]);export{k as __pageData,x as default}; diff --git a/assets/dev_api_comm_rpc.md.Ctatb5Fy.js b/assets/dev_api_comm_rpc.md.Ctatb5Fy.js new file mode 100644 index 00000000..bec5b865 --- /dev/null +++ b/assets/dev_api_comm_rpc.md.Ctatb5Fy.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.rpc","description":"","frontmatter":{"title":"liteyuki.comm.rpc"},"headers":[],"relativePath":"dev/api/comm/rpc.md","filePath":"zh/dev/api/comm/rpc.md","lastUpdated":null}'),e={name:"dev/api/comm/rpc.md"},n=t('

liteyuki.comm.rpc

说明: 本模块用于实现RPC(基于IPC)通信

class RPC

def __init__(self, on_calling: ON_CALLING_FUNC) -> None

源代码在GitHub上查看
python
def __init__(self, on_calling: ON_CALLING_FUNC) -> None:\n    self.on_calling = on_calling

def call(self, args: tuple, kwargs: dict) -> Any

说明: 调用

源代码在GitHub上查看
python
def call(self, args: tuple, kwargs: dict) -> Any:\n    """\n        调用\n        """\n    return self.on_calling(args, kwargs)
',8),l=[n];function p(h,r,o,c,k,d){return a(),i("div",null,l)}const m=s(e,[["render",p]]);export{u as __pageData,m as default}; diff --git a/assets/dev_api_comm_rpc.md.Ctatb5Fy.lean.js b/assets/dev_api_comm_rpc.md.Ctatb5Fy.lean.js new file mode 100644 index 00000000..20e1b452 --- /dev/null +++ b/assets/dev_api_comm_rpc.md.Ctatb5Fy.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.rpc","description":"","frontmatter":{"title":"liteyuki.comm.rpc"},"headers":[],"relativePath":"dev/api/comm/rpc.md","filePath":"zh/dev/api/comm/rpc.md","lastUpdated":null}'),e={name:"dev/api/comm/rpc.md"},n=t("",8),l=[n];function p(h,r,o,c,k,d){return a(),i("div",null,l)}const m=s(e,[["render",p]]);export{u as __pageData,m as default}; diff --git a/assets/dev_api_comm_socks_channel.md.i5OohqUe.js b/assets/dev_api_comm_socks_channel.md.i5OohqUe.js new file mode 100644 index 00000000..4c61f886 --- /dev/null +++ b/assets/dev_api_comm_socks_channel.md.i5OohqUe.js @@ -0,0 +1,26 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.socks_channel","description":"","frontmatter":{"title":"liteyuki.comm.socks_channel"},"headers":[],"relativePath":"dev/api/comm/socks_channel.md","filePath":"zh/dev/api/comm/socks_channel.md","lastUpdated":null}'),n={name:"dev/api/comm/socks_channel.md"},t=e(`

liteyuki.comm.socks_channel

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/25 下午3:54 @Author : snowykami @Email : snowykami@outlook.com @File : channelv2.py @Software: PyCharm

class SocksChannel

def __init__(self, name: str)

说明: 初始化通道

参数:

  • name: 通道ID
源代码在GitHub上查看
python
def __init__(self, name: str):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+        """
+    self._name = name
+    self._conn_send = None
+    self._conn_recv = None
+    self._closed = False

def send(self, data)

说明: 发送数据

参数:

  • data: 数据
源代码在GitHub上查看
python
def send(self, data):
+    """
+        发送数据
+        Args:
+            data: 数据
+        """
+    pass

def receive(self)

说明: 接收数据

返回: data: 数据

源代码在GitHub上查看
python
def receive(self):
+    """
+        接收数据
+        Returns:
+            data: 数据
+        """
+    pass

def close(self)

说明: 关闭通道

源代码在GitHub上查看
python
def close(self):
+    """
+        关闭通道
+        """
+    pass
`,21),l=[t];function h(p,k,o,r,d,c){return i(),a("div",null,l)}const y=s(n,[["render",h]]);export{u as __pageData,y as default}; diff --git a/assets/dev_api_comm_socks_channel.md.i5OohqUe.lean.js b/assets/dev_api_comm_socks_channel.md.i5OohqUe.lean.js new file mode 100644 index 00000000..53c26e10 --- /dev/null +++ b/assets/dev_api_comm_socks_channel.md.i5OohqUe.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.socks_channel","description":"","frontmatter":{"title":"liteyuki.comm.socks_channel"},"headers":[],"relativePath":"dev/api/comm/socks_channel.md","filePath":"zh/dev/api/comm/socks_channel.md","lastUpdated":null}'),n={name:"dev/api/comm/socks_channel.md"},t=e("",21),l=[t];function h(p,k,o,r,d,c){return i(),a("div",null,l)}const y=s(n,[["render",h]]);export{u as __pageData,y as default}; diff --git a/assets/dev_api_comm_storage.md.CquSLWbc.js b/assets/dev_api_comm_storage.md.CquSLWbc.js new file mode 100644 index 00000000..b48ff03d --- /dev/null +++ b/assets/dev_api_comm_storage.md.CquSLWbc.js @@ -0,0 +1,144 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.comm.storage","description":"","frontmatter":{"title":"liteyuki.comm.storage"},"headers":[],"relativePath":"dev/api/comm/storage.md","filePath":"zh/dev/api/comm/storage.md","lastUpdated":null}'),t={name:"dev/api/comm/storage.md"},e=n(`

liteyuki.comm.storage

说明: 共享内存模块。类似于redis,但是更加轻量级并且线程安全

var _on_main_subscriber_receive_funcs

  • 说明: 主进程订阅者接收函数

  • 类型: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • 默认值: {}

var _on_sub_subscriber_receive_funcs

  • 说明: 子进程订阅者接收函数

  • 类型: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • 默认值: {}

class KeyValueStore

def __init__(self)

源代码在GitHub上查看
python
def __init__(self):
+    self._store = {}
+    self.active_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-active')
+    self.passive_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-passive')
+    self.publish_channel = Channel[tuple[str, Any]](name='shared_memory-publish')
+    self.is_main_receive_loop_running = False
+    self.is_sub_receive_loop_running = False

def set(self, key: str, value: Any) -> None

说明: 设置键值对

参数:

  • key: 键
  • value: 值
源代码在GitHub上查看
python
def set(self, key: str, value: Any) -> None:
+    """
+        设置键值对
+        Args:
+            key: 键
+            value: 值
+
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            self._store[key] = value
+    else:
+        self.passive_chan.send(('set', {'key': key, 'value': value}))

def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]

说明: 获取键值对

参数:

  • key: 键
  • default: 默认值

返回: Any: 值

源代码在GitHub上查看
python
def get(self, key: str, default: Optional[Any]=None) -> Optional[Any]:
+    """
+        获取键值对
+        Args:
+            key: 键
+            default: 默认值
+
+        Returns:
+            Any: 值
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            return self._store.get(key, default)
+    else:
+        recv_chan = Channel[Optional[Any]]('recv_chan')
+        self.passive_chan.send(('get', {'key': key, 'default': default, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def delete(self, key: str, ignore_key_error: bool = True) -> None

说明: 删除键值对

参数:

  • key: 键
  • ignore_key_error: 是否忽略键不存在的错误
源代码在GitHub上查看
python
def delete(self, key: str, ignore_key_error: bool=True) -> None:
+    """
+        删除键值对
+        Args:
+            key: 键
+            ignore_key_error: 是否忽略键不存在的错误
+
+        Returns:
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            if key in self._store:
+                try:
+                    del self._store[key]
+                    del _locks[key]
+                except KeyError as e:
+                    if not ignore_key_error:
+                        raise e
+    else:
+        self.passive_chan.send(('delete', {'key': key}))

def get_all(self) -> dict[str, Any]

说明: 获取所有键值对

返回: dict[str, Any]: 键值对

源代码在GitHub上查看
python
def get_all(self) -> dict[str, Any]:
+    """
+        获取所有键值对
+        Returns:
+            dict[str, Any]: 键值对
+        """
+    if IS_MAIN_PROCESS:
+        return self._store
+    else:
+        recv_chan = Channel[dict[str, Any]]('recv_chan')
+        self.passive_chan.send(('get_all', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

def publish(self, channel_: str, data: Any) -> None

说明: 发布消息

参数:

  • channel_: 频道
  • data: 数据
源代码在GitHub上查看
python
def publish(self, channel_: str, data: Any) -> None:
+    """
+        发布消息
+        Args:
+            channel_: 频道
+            data: 数据
+
+        Returns:
+        """
+    self.active_chan.send(('publish', {'channel': channel_, 'data': data}))

def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]

说明: 订阅者接收消息时的回调

参数:

  • channel_: 频道

返回: 装饰器

源代码在GitHub上查看
python
def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]:
+    """
+        订阅者接收消息时的回调
+        Args:
+            channel_: 频道
+
+        Returns:
+            装饰器
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot subscribe in sub process.')
+
+    def decorator(func: ON_RECEIVE_FUNC) -> ON_RECEIVE_FUNC:
+
+        async def wrapper(data: Any):
+            if is_coroutine_callable(func):
+                await func(data)
+            else:
+                func(data)
+        if IS_MAIN_PROCESS:
+            if channel_ not in _on_main_subscriber_receive_funcs:
+                _on_main_subscriber_receive_funcs[channel_] = []
+            _on_main_subscriber_receive_funcs[channel_].append(wrapper)
+        else:
+            if channel_ not in _on_sub_subscriber_receive_funcs:
+                _on_sub_subscriber_receive_funcs[channel_] = []
+            _on_sub_subscriber_receive_funcs[channel_].append(wrapper)
+        return wrapper
+    return decorator

@staticmethod

async def run_subscriber_receive_funcs(channel_: str, data: Any)

说明: 运行订阅者接收函数

参数:

  • channel_: 频道
  • data: 数据
源代码在GitHub上查看
python
@staticmethod
+async def run_subscriber_receive_funcs(channel_: str, data: Any):
+    """
+        运行订阅者接收函数
+        Args:
+            channel_: 频道
+            data: 数据
+        """
+    [asyncio.create_task(func(data)) for func in _on_main_subscriber_receive_funcs[channel_]]

async def start_receive_loop(self)

说明: 启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程

源代码在GitHub上查看
python
async def start_receive_loop(self):
+    """
+        启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot start receive loop in sub process.')
+    while True:
+        data = await self.active_chan.async_receive()
+        if data[0] == 'publish':
+            await self.run_subscriber_receive_funcs(data[1]['channel'], data[1]['data'])
+            self.publish_channel.send(data)

class GlobalKeyValueStore

@classmethod

def get_instance(cls)

源代码在GitHub上查看
python
@classmethod
+def get_instance(cls):
+    if cls._instance is None:
+        with cls._lock:
+            if cls._instance is None:
+                cls._instance = KeyValueStore()
+    return cls._instance

attr _instance = None

attr _lock = threading.Lock()

var _ref_count

  • 说明: import 引用计数, 防止获取空指针

  • 默认值: 0

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')

def on_get(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')
+def on_get(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    default = data[1]['default']
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get(key, default))

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')

def on_set(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')
+def on_set(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    value = data[1]['value']
+    shared_memory.set(key, value)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')

def on_delete(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')
+def on_delete(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    shared_memory.delete(key)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')

def on_get_all(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')
+def on_get_all(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get_all())
`,69),l=[e];function h(k,p,r,d,E,g){return a(),i("div",null,l)}const c=s(t,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/dev_api_comm_storage.md.CquSLWbc.lean.js b/assets/dev_api_comm_storage.md.CquSLWbc.lean.js new file mode 100644 index 00000000..0b52e792 --- /dev/null +++ b/assets/dev_api_comm_storage.md.CquSLWbc.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.comm.storage","description":"","frontmatter":{"title":"liteyuki.comm.storage"},"headers":[],"relativePath":"dev/api/comm/storage.md","filePath":"zh/dev/api/comm/storage.md","lastUpdated":null}'),t={name:"dev/api/comm/storage.md"},e=n("",69),l=[e];function h(k,p,r,d,E,g){return a(),i("div",null,l)}const c=s(t,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/dev_api_config.md.5YZEeFsT.js b/assets/dev_api_config.md.5YZEeFsT.js new file mode 100644 index 00000000..9b3c1b1b --- /dev/null +++ b/assets/dev_api_config.md.5YZEeFsT.js @@ -0,0 +1,77 @@ +import{_ as i,c as a,o as n,a4 as s,j as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.config","description":"","frontmatter":{"title":"liteyuki.config"},"headers":[],"relativePath":"dev/api/config.md","filePath":"zh/dev/api/config.md","lastUpdated":null}'),l={name:"dev/api/config.md"},h=s('

liteyuki.config

说明: 该模块用于常用配置文件的加载 多配置文件编写原则: 1.尽量不要冲突: 一个键不要多次出现 2.分工明确: 每个配置文件给一个或一类服务提供配置 3.扁平化编写: 配置文件尽量扁平化,不要出现过多的嵌套 4.注意冲突时的优先级: 项目目录下的配置文件优先级高于config目录下的配置文件 5.请不要将需要动态加载的内容写入配置文件,你应该使用其他储存方式

def flat_config(config: dict[str, Any]) -> dict[str, Any]

说明: 扁平化配置文件

',4),k=t("p",{"a.b.c:":"",1:""},"{a:{b:{c:1}}} ->",-1),p=s(`

参数:

  • config: 配置项目

返回: 扁平化后的配置文件,但也包含原有的键值对

源代码在GitHub上查看
python
def flat_config(config: dict[str, Any]) -> dict[str, Any]:
+    """
+    扁平化配置文件
+
+    {a:{b:{c:1}}} -> {"a.b.c": 1}
+    Args:
+        config: 配置项目
+
+    Returns:
+        扁平化后的配置文件,但也包含原有的键值对
+    """
+    new_config = copy.deepcopy(config)
+    for key, value in config.items():
+        if isinstance(value, dict):
+            for k, v in flat_config(value).items():
+                new_config[f'{key}.{k}'] = v
+    return new_config

def load_from_yaml(file_: str) -> dict[str, Any]

说明: Load config from yaml file

源代码在GitHub上查看
python
def load_from_yaml(file_: str) -> dict[str, Any]:
+    """
+    Load config from yaml file
+
+    """
+    logger.debug(f'Loading YAML config from {file_}')
+    config = yaml.safe_load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_json(file_: str) -> dict[str, Any]

说明: Load config from json file

源代码在GitHub上查看
python
def load_from_json(file_: str) -> dict[str, Any]:
+    """
+    Load config from json file
+    """
+    logger.debug(f'Loading JSON config from {file_}')
+    config = json.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_toml(file_: str) -> dict[str, Any]

说明: Load config from toml file

源代码在GitHub上查看
python
def load_from_toml(file_: str) -> dict[str, Any]:
+    """
+    Load config from toml file
+    """
+    logger.debug(f'Loading TOML config from {file_}')
+    config = toml.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]

说明: 从指定文件加载配置项,会自动识别文件格式 默认执行扁平化选项

源代码在GitHub上查看
python
def load_from_files(*files: str, no_warning: bool=False) -> dict[str, Any]:
+    """
+    从指定文件加载配置项,会自动识别文件格式
+    默认执行扁平化选项
+    """
+    config = {}
+    for file in files:
+        if os.path.exists(file):
+            if file.endswith(('.yaml', 'yml')):
+                config.update(load_from_yaml(file))
+            elif file.endswith('.json'):
+                config.update(load_from_json(file))
+            elif file.endswith('.toml'):
+                config.update(load_from_toml(file))
+            elif not no_warning:
+                logger.warning(f'Unsupported config file format: {file}')
+        elif not no_warning:
+            logger.warning(f'Config file not found: {file}')
+    return config

def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]

说明: 从目录下加载配置文件,不递归 按照读取文件的优先级反向覆盖 默认执行扁平化选项

源代码在GitHub上查看
python
def load_configs_from_dirs(*directories: str, no_waring: bool=False) -> dict[str, Any]:
+    """
+    从目录下加载配置文件,不递归
+    按照读取文件的优先级反向覆盖
+    默认执行扁平化选项
+    """
+    config = {}
+    for directory in directories:
+        if not os.path.exists(directory):
+            if not no_waring:
+                logger.warning(f'Directory not found: {directory}')
+            continue
+        for file in os.listdir(directory):
+            if file.endswith(_SUPPORTED_CONFIG_FORMATS):
+                config.update(load_from_files(os.path.join(directory, file), no_warning=no_waring))
+    return config

def load_config_in_default(no_waring: bool = False) -> dict[str, Any]

说明: 从一个标准的轻雪项目加载配置文件 项目目录下的config.*和config目录下的所有配置文件 项目目录下的配置文件优先

源代码在GitHub上查看
python
def load_config_in_default(no_waring: bool=False) -> dict[str, Any]:
+    """
+    从一个标准的轻雪项目加载配置文件
+    项目目录下的config.*和config目录下的所有配置文件
+    项目目录下的配置文件优先
+    """
+    config = load_configs_from_dirs('config', no_waring=no_waring)
+    config.update(load_from_files('config.yaml', 'config.toml', 'config.json', 'config.yml', no_warning=no_waring))
+    return config
`,22),e=[h,k,p];function r(d,g,E,o,y,F){return n(),a("div",null,e)}const u=i(l,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/dev_api_config.md.5YZEeFsT.lean.js b/assets/dev_api_config.md.5YZEeFsT.lean.js new file mode 100644 index 00000000..7e4c16ea --- /dev/null +++ b/assets/dev_api_config.md.5YZEeFsT.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,a4 as s,j as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.config","description":"","frontmatter":{"title":"liteyuki.config"},"headers":[],"relativePath":"dev/api/config.md","filePath":"zh/dev/api/config.md","lastUpdated":null}'),l={name:"dev/api/config.md"},h=s("",4),k=t("p",{"a.b.c:":"",1:""},"{a:{b:{c:1}}} ->",-1),p=s("",22),e=[h,k,p];function r(d,g,E,o,y,F){return n(),a("div",null,e)}const u=i(l,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/dev_api_core_core.md.D46kyvua.js b/assets/dev_api_core_core.md.D46kyvua.js new file mode 100644 index 00000000..b8787b64 --- /dev/null +++ b/assets/dev_api_core_core.md.D46kyvua.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as r}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"dev/api/core/core.md","filePath":"zh/dev/api/core/core.md","lastUpdated":null}'),c={name:"dev/api/core/core.md"},i=e("h1",{id:"liteyuki-core",tabindex:"-1"},[r("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),s=[i];function l(d,n,p,_,u,h){return o(),a("div",null,s)}const k=t(c,[["render",l]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_core_core.md.D46kyvua.lean.js b/assets/dev_api_core_core.md.D46kyvua.lean.js new file mode 100644 index 00000000..b8787b64 --- /dev/null +++ b/assets/dev_api_core_core.md.D46kyvua.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as r}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"dev/api/core/core.md","filePath":"zh/dev/api/core/core.md","lastUpdated":null}'),c={name:"dev/api/core/core.md"},i=e("h1",{id:"liteyuki-core",tabindex:"-1"},[r("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),s=[i];function l(d,n,p,_,u,h){return o(),a("div",null,s)}const k=t(c,[["render",l]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_core_index.md.BN6y5dmE.js b/assets/dev_api_core_index.md.BN6y5dmE.js new file mode 100644 index 00000000..1f8469ab --- /dev/null +++ b/assets/dev_api_core_index.md.BN6y5dmE.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as o}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"dev/api/core/index.md","filePath":"zh/dev/api/core/index.md","lastUpdated":null}'),r={name:"dev/api/core/index.md"},c=e("h1",{id:"liteyuki-core",tabindex:"-1"},[o("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),d=[c];function s(n,l,p,_,u,h){return i(),a("div",null,d)}const k=t(r,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_core_index.md.BN6y5dmE.lean.js b/assets/dev_api_core_index.md.BN6y5dmE.lean.js new file mode 100644 index 00000000..1f8469ab --- /dev/null +++ b/assets/dev_api_core_index.md.BN6y5dmE.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as o}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"dev/api/core/index.md","filePath":"zh/dev/api/core/index.md","lastUpdated":null}'),r={name:"dev/api/core/index.md"},c=e("h1",{id:"liteyuki-core",tabindex:"-1"},[o("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),d=[c];function s(n,l,p,_,u,h){return i(),a("div",null,d)}const k=t(r,[["render",s]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_core_manager.md.DiZst2H3.js b/assets/dev_api_core_manager.md.DiZst2H3.js new file mode 100644 index 00000000..ae13bae2 --- /dev/null +++ b/assets/dev_api_core_manager.md.DiZst2H3.js @@ -0,0 +1,92 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.core.manager","description":"","frontmatter":{"title":"liteyuki.core.manager"},"headers":[],"relativePath":"dev/api/core/manager.md","filePath":"zh/dev/api/core/manager.md","lastUpdated":null}'),e={name:"dev/api/core/manager.md"},l=n(`

liteyuki.core.manager

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午11:12 @Author : snowykami @Email : snowykami@outlook.com @File : manager.py @Software: PyCharm

class ChannelDeliver

def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])

源代码在GitHub上查看
python
def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]]):
+    self.active = active
+    self.passive = passive
+    self.channel_deliver_active = channel_deliver_active
+    self.channel_deliver_passive = channel_deliver_passive
+    self.publish = publish

class ProcessManager

def __init__(self, lifespan: Lifespan)

源代码在GitHub上查看
python
def __init__(self, lifespan: 'Lifespan'):
+    self.lifespan = lifespan
+    self.targets: dict[str, tuple[Callable, tuple, dict]] = {}
+    self.processes: dict[str, Process] = {}

async def _run_process(self, name: str)

说明: 开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task

参数:

  • name:
源代码在GitHub上查看
python
async def _run_process(self, name: str):
+    """
+        开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task
+        Args:
+            name:
+        Returns:
+        """
+    if name not in self.targets:
+        raise KeyError(f'Process {name} not found.')
+    chan_active = get_channel(f'{name}-active')
+
+    def _start_process():
+        process = Process(target=self.targets[name][0], args=self.targets[name][1], kwargs=self.targets[name][2], daemon=True)
+        self.processes[name] = process
+        process.start()
+    _start_process()
+    while True:
+        data = await chan_active.async_receive()
+        if data == 0:
+            logger.info(f'Stopping process {name}')
+            await self.lifespan.before_process_shutdown()
+            self.terminate(name)
+            break
+        elif data == 1:
+            logger.info(f'Restarting process {name}')
+            await self.lifespan.before_process_shutdown()
+            await self.lifespan.before_process_restart()
+            self.terminate(name)
+            _start_process()
+            continue
+        else:
+            logger.warning('Unknown data received, ignored.')

async def start_all(self)

说明: 对外启动方法,启动所有进程,创建asyncio task

源代码在GitHub上查看
python
async def start_all(self):
+    """
+        对外启动方法,启动所有进程,创建asyncio task
+        """
+    [asyncio.create_task(chan.start_receive_loop()) for chan in get_channels().values()]
+    [asyncio.create_task(sm.start_receive_loop()) for sm in [shared_memory]]
+    [asyncio.create_task(self._run_process(name)) for name in self.targets]

def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)

说明: 添加进程

参数:

  • name: 进程名,用于获取和唯一标识
  • target: 进程函数
  • args: 进程函数参数
  • kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
源代码在GitHub上查看
python
def add_target(self, name: str, target: TARGET_FUNC, args: tuple=(), kwargs=None):
+    """
+        添加进程
+        Args:
+            name: 进程名,用于获取和唯一标识
+            target: 进程函数
+            args: 进程函数参数
+            kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
+        """
+    if kwargs is None:
+        kwargs = {}
+    chan_active: Channel = Channel(name=f'{name}-active')
+    chan_passive: Channel = Channel(name=f'{name}-passive')
+    channel_deliver = ChannelDeliver(active=chan_active, passive=chan_passive, channel_deliver_active=channel_deliver_active_channel, channel_deliver_passive=channel_deliver_passive_channel, publish=publish_channel)
+    self.targets[name] = (_delivery_channel_wrapper, (target, channel_deliver, shared_memory, *args), kwargs)

def join_all(self)

源代码在GitHub上查看
python
def join_all(self):
+    for name, process in self.targets:
+        process.join()

def terminate(self, name: str)

说明: 终止进程并从进程字典中删除

参数:

  • name:
源代码在GitHub上查看
python
def terminate(self, name: str):
+    """
+        终止进程并从进程字典中删除
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.processes:
+        logger.warning(f'Process {name} not found.')
+        return
+    process = self.processes[name]
+    process.terminate()
+    process.join(TIMEOUT)
+    if process.is_alive():
+        process.kill()
+    logger.success(f'Process {name} terminated.')

def terminate_all(self)

源代码在GitHub上查看
python
def terminate_all(self):
+    for name in self.targets:
+        self.terminate(name)

def is_process_alive(self, name: str) -> bool

说明: 检查进程是否存活

参数:

  • name:
源代码在GitHub上查看
python
def is_process_alive(self, name: str) -> bool:
+    """
+        检查进程是否存活
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.targets:
+        logger.warning(f'Process {name} not found.')
+    return self.processes[name].is_alive()
`,36),t=[l];function h(k,p,r,d,E,g){return a(),i("div",null,t)}const c=s(e,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/dev_api_core_manager.md.DiZst2H3.lean.js b/assets/dev_api_core_manager.md.DiZst2H3.lean.js new file mode 100644 index 00000000..19d57784 --- /dev/null +++ b/assets/dev_api_core_manager.md.DiZst2H3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.core.manager","description":"","frontmatter":{"title":"liteyuki.core.manager"},"headers":[],"relativePath":"dev/api/core/manager.md","filePath":"zh/dev/api/core/manager.md","lastUpdated":null}'),e={name:"dev/api/core/manager.md"},l=n("",36),t=[l];function h(k,p,r,d,E,g){return a(),i("div",null,t)}const c=s(e,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/dev_api_dev_dev.md.CnxR9aZA.js b/assets/dev_api_dev_dev.md.CnxR9aZA.js new file mode 100644 index 00000000..5a6c53e9 --- /dev/null +++ b/assets/dev_api_dev_dev.md.CnxR9aZA.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"dev/api/dev/dev.md","filePath":"zh/dev/api/dev/dev.md","lastUpdated":null}'),s={name:"dev/api/dev/dev.md"},l=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"说明"),t(": 该模块用于存放一些开发工具")],-1),r=[l,o];function n(c,v,p,_,u,h){return i(),d("div",null,r)}const k=a(s,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_dev_dev.md.CnxR9aZA.lean.js b/assets/dev_api_dev_dev.md.CnxR9aZA.lean.js new file mode 100644 index 00000000..5a6c53e9 --- /dev/null +++ b/assets/dev_api_dev_dev.md.CnxR9aZA.lean.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"dev/api/dev/dev.md","filePath":"zh/dev/api/dev/dev.md","lastUpdated":null}'),s={name:"dev/api/dev/dev.md"},l=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"说明"),t(": 该模块用于存放一些开发工具")],-1),r=[l,o];function n(c,v,p,_,u,h){return i(),d("div",null,r)}const k=a(s,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_dev_index.md.CbQNGO4N.js b/assets/dev_api_dev_index.md.CbQNGO4N.js new file mode 100644 index 00000000..92b1d6de --- /dev/null +++ b/assets/dev_api_dev_index.md.CbQNGO4N.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"dev/api/dev/index.md","filePath":"zh/dev/api/dev/index.md","lastUpdated":null}'),n={name:"dev/api/dev/index.md"},s=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),l=e("p",null,[e("strong",null,"说明"),t(": 该模块用于存放一些开发工具")],-1),o=[s,l];function r(c,p,_,u,v,h){return i(),d("div",null,o)}const k=a(n,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_dev_index.md.CbQNGO4N.lean.js b/assets/dev_api_dev_index.md.CbQNGO4N.lean.js new file mode 100644 index 00000000..92b1d6de --- /dev/null +++ b/assets/dev_api_dev_index.md.CbQNGO4N.lean.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"dev/api/dev/index.md","filePath":"zh/dev/api/dev/index.md","lastUpdated":null}'),n={name:"dev/api/dev/index.md"},s=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),l=e("p",null,[e("strong",null,"说明"),t(": 该模块用于存放一些开发工具")],-1),o=[s,l];function r(c,p,_,u,v,h){return i(),d("div",null,o)}const k=a(n,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/dev_api_dev_observer.md.rNRTx952.js b/assets/dev_api_dev_observer.md.rNRTx952.js new file mode 100644 index 00000000..9ce86d69 --- /dev/null +++ b/assets/dev_api_dev_observer.md.rNRTx952.js @@ -0,0 +1,44 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.dev.observer","description":"","frontmatter":{"title":"liteyuki.dev.observer"},"headers":[],"relativePath":"dev/api/dev/observer.md","filePath":"zh/dev/api/dev/observer.md","lastUpdated":null}'),n={name:"dev/api/dev/observer.md"},t=a(`

liteyuki.dev.observer

说明: 此模块用于注册观察者函数,使用watchdog监控文件变化并重启bot 启用该模块需要在配置文件中设置dev_mode为True

var CALLBACK_FUNC

  • 说明: 位置1为FileSystemEvent

  • 类型: TypeAlias

  • 默认值: Callable[[FileSystemEvent], None]

var FILTER_FUNC

  • 说明: 位置1为FileSystemEvent

  • 类型: TypeAlias

  • 默认值: Callable[[FileSystemEvent], bool]

def debounce(wait)

说明: 防抖函数

源代码在GitHub上查看
python
def debounce(wait):
+    """
+    防抖函数
+    """
+
+    def decorator(func):
+
+        def wrapper(*args, **kwargs):
+            nonlocal last_call_time
+            current_time = time.time()
+            if current_time - last_call_time > wait:
+                last_call_time = current_time
+                return func(*args, **kwargs)
+        last_call_time = None
+        return wrapper
+    return decorator

class CodeModifiedHandler(FileSystemEventHandler)

@debounce(1)

def on_modified(self, event)

源代码在GitHub上查看
python
@debounce(1)
+def on_modified(self, event):
+    raise NotImplementedError('on_modified must be implemented')

def on_created(self, event)

源代码在GitHub上查看
python
def on_created(self, event):
+    self.on_modified(event)

def on_deleted(self, event)

源代码在GitHub上查看
python
def on_deleted(self, event):
+    self.on_modified(event)

def on_moved(self, event)

源代码在GitHub上查看
python
def on_moved(self, event):
+    self.on_modified(event)

def on_any_event(self, event)

源代码在GitHub上查看
python
def on_any_event(self, event):
+    self.on_modified(event)

def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]

说明: 注册文件系统变化监听器

参数:

  • directories: 监听目录们
  • recursive: 是否递归监听子目录
  • event_filter: 事件过滤器, 返回True则执行回调函数

返回: 装饰器,装饰一个函数在接收到数据后执行

源代码在GitHub上查看
python
def on_file_system_event(directories: tuple[str], recursive: bool=True, event_filter: FILTER_FUNC=None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]:
+    """
+    注册文件系统变化监听器
+    Args:
+        directories: 监听目录们
+        recursive: 是否递归监听子目录
+        event_filter: 事件过滤器, 返回True则执行回调函数
+    Returns:
+        装饰器,装饰一个函数在接收到数据后执行
+    """
+
+    def decorator(func: CALLBACK_FUNC) -> CALLBACK_FUNC:
+
+        def wrapper(event: FileSystemEvent):
+            if event_filter is not None and (not event_filter(event)):
+                return
+            func(event)
+        code_modified_handler = CodeModifiedHandler()
+        code_modified_handler.on_modified = wrapper
+        for directory in directories:
+            observer.schedule(code_modified_handler, directory, recursive=recursive)
+        return func
+    return decorator
`,27),l=[t];function h(p,k,r,d,o,c){return e(),i("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/dev_api_dev_observer.md.rNRTx952.lean.js b/assets/dev_api_dev_observer.md.rNRTx952.lean.js new file mode 100644 index 00000000..7a5c0ece --- /dev/null +++ b/assets/dev_api_dev_observer.md.rNRTx952.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.dev.observer","description":"","frontmatter":{"title":"liteyuki.dev.observer"},"headers":[],"relativePath":"dev/api/dev/observer.md","filePath":"zh/dev/api/dev/observer.md","lastUpdated":null}'),n={name:"dev/api/dev/observer.md"},t=a("",27),l=[t];function h(p,k,r,d,o,c){return e(),i("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/dev_api_dev_plugin.md.B8-Pj2Gj.js b/assets/dev_api_dev_plugin.md.B8-Pj2Gj.js new file mode 100644 index 00000000..21dced2a --- /dev/null +++ b/assets/dev_api_dev_plugin.md.B8-Pj2Gj.js @@ -0,0 +1,12 @@ +import{_ as i,c as s,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const E=JSON.parse('{"title":"liteyuki.dev.plugin","description":"","frontmatter":{"title":"liteyuki.dev.plugin"},"headers":[],"relativePath":"dev/api/dev/plugin.md","filePath":"zh/dev/api/dev/plugin.md","lastUpdated":null}'),n={name:"dev/api/dev/plugin.md"},l=t(`

liteyuki.dev.plugin

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/18 上午5:04 @Author : snowykami @Email : snowykami@outlook.com @File : plugin.py @Software: PyCharm

def run_plugins(*module_path: str | Path)

说明: 运行插件,无需手动初始化bot

参数:

  • module_path: 插件路径,参考liteyuki.load_plugin的函数签名
源代码在GitHub上查看
python
def run_plugins(*module_path: str | Path):
+    """
+    运行插件,无需手动初始化bot
+    Args:
+        module_path: 插件路径,参考\`liteyuki.load_plugin\`的函数签名
+    """
+    cfg = load_config_in_default()
+    plugins = cfg.get('liteyuki.plugins', [])
+    plugins.extend(module_path)
+    cfg['liteyuki.plugins'] = plugins
+    bot = LiteyukiBot(**cfg)
+    bot.run()
`,8),e=[l];function p(h,k,d,r,o,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{E as __pageData,y as default}; diff --git a/assets/dev_api_dev_plugin.md.B8-Pj2Gj.lean.js b/assets/dev_api_dev_plugin.md.B8-Pj2Gj.lean.js new file mode 100644 index 00000000..ac640c39 --- /dev/null +++ b/assets/dev_api_dev_plugin.md.B8-Pj2Gj.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const E=JSON.parse('{"title":"liteyuki.dev.plugin","description":"","frontmatter":{"title":"liteyuki.dev.plugin"},"headers":[],"relativePath":"dev/api/dev/plugin.md","filePath":"zh/dev/api/dev/plugin.md","lastUpdated":null}'),n={name:"dev/api/dev/plugin.md"},l=t("",8),e=[l];function p(h,k,d,r,o,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{E as __pageData,y as default}; diff --git a/assets/dev_api_exception.md.BdaZK_3x.js b/assets/dev_api_exception.md.BdaZK_3x.js new file mode 100644 index 00000000..6c3550a8 --- /dev/null +++ b/assets/dev_api_exception.md.BdaZK_3x.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.exception","description":"","frontmatter":{"title":"liteyuki.exception"},"headers":[],"relativePath":"dev/api/exception.md","filePath":"zh/dev/api/exception.md","lastUpdated":null}'),o={name:"dev/api/exception.md"},c=e("h1",{id:"liteyuki-exception",tabindex:"-1"},[t("liteyuki.exception "),e("a",{class:"header-anchor",href:"#liteyuki-exception","aria-label":'Permalink to "liteyuki.exception"'},"​")],-1),s=e("p",null,[e("strong",null,"说明"),t(": exception模块包含了liteyuki运行中的所有错误")],-1),l=e("h3",{id:"class-liteyukiexception-baseexception",tabindex:"-1"},[e("em",null,[e("strong",null,"class")]),t(),e("code",null,"LiteyukiException(BaseException)"),t(),e("a",{class:"header-anchor",href:"#class-liteyukiexception-baseexception","aria-label":'Permalink to "***class*** `LiteyukiException(BaseException)`"'},"​")],-1),p=[c,s,l];function r(d,x,u,_,h,k){return n(),a("div",null,p)}const f=i(o,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_exception.md.BdaZK_3x.lean.js b/assets/dev_api_exception.md.BdaZK_3x.lean.js new file mode 100644 index 00000000..6c3550a8 --- /dev/null +++ b/assets/dev_api_exception.md.BdaZK_3x.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.exception","description":"","frontmatter":{"title":"liteyuki.exception"},"headers":[],"relativePath":"dev/api/exception.md","filePath":"zh/dev/api/exception.md","lastUpdated":null}'),o={name:"dev/api/exception.md"},c=e("h1",{id:"liteyuki-exception",tabindex:"-1"},[t("liteyuki.exception "),e("a",{class:"header-anchor",href:"#liteyuki-exception","aria-label":'Permalink to "liteyuki.exception"'},"​")],-1),s=e("p",null,[e("strong",null,"说明"),t(": exception模块包含了liteyuki运行中的所有错误")],-1),l=e("h3",{id:"class-liteyukiexception-baseexception",tabindex:"-1"},[e("em",null,[e("strong",null,"class")]),t(),e("code",null,"LiteyukiException(BaseException)"),t(),e("a",{class:"header-anchor",href:"#class-liteyukiexception-baseexception","aria-label":'Permalink to "***class*** `LiteyukiException(BaseException)`"'},"​")],-1),p=[c,s,l];function r(d,x,u,_,h,k){return n(),a("div",null,p)}const f=i(o,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_index.md.Bj6EsNxq.js b/assets/dev_api_index.md.Bj6EsNxq.js new file mode 100644 index 00000000..14bafa91 --- /dev/null +++ b/assets/dev_api_index.md.Bj6EsNxq.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"dev/api/index.md","filePath":"zh/dev/api/index.md","lastUpdated":null}'),o={name:"dev/api/index.md"},r=i('

liteyuki

var __version__

  • 说明: 测试版本号

  • 默认值: '6.3.10'

',3),n=[r];function l(s,_,d,c,p,u){return a(),t("div",null,n)}const m=e(o,[["render",l]]);export{v as __pageData,m as default}; diff --git a/assets/dev_api_index.md.Bj6EsNxq.lean.js b/assets/dev_api_index.md.Bj6EsNxq.lean.js new file mode 100644 index 00000000..8ff180e5 --- /dev/null +++ b/assets/dev_api_index.md.Bj6EsNxq.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"dev/api/index.md","filePath":"zh/dev/api/index.md","lastUpdated":null}'),o={name:"dev/api/index.md"},r=i("",3),n=[r];function l(s,_,d,c,p,u){return a(),t("div",null,n)}const m=e(o,[["render",l]]);export{v as __pageData,m as default}; diff --git a/assets/dev_api_log.md.C1VDikdj.js b/assets/dev_api_log.md.C1VDikdj.js new file mode 100644 index 00000000..cbfc75df --- /dev/null +++ b/assets/dev_api_log.md.C1VDikdj.js @@ -0,0 +1,18 @@ +import{_ as s,c as i,o as a,a4 as h}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.log","description":"","frontmatter":{"title":"liteyuki.log"},"headers":[],"relativePath":"dev/api/log.md","filePath":"zh/dev/api/log.md","lastUpdated":null}'),t={name:"dev/api/log.md"},k=h(`

liteyuki.log

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午9:12 @Author : snowykami @Email : snowykami@outlook.com @File : log.py @Software: PyCharm

def get_format(level: str) -> str

源代码在GitHub上查看
python
def get_format(level: str) -> str:
+    if level == 'DEBUG':
+        return debug_format
+    else:
+        return default_format

def init_log(config: dict)

说明: 在语言加载完成后执行

源代码在GitHub上查看
python
def init_log(config: dict):
+    """
+    在语言加载完成后执行
+    Returns:
+
+    """
+    logger.remove()
+    logger.add(sys.stdout, level=0, diagnose=False, format=get_format(config.get('log_level', 'INFO')))
+    show_icon = config.get('log_icon', True)
+    logger.level('DEBUG', color='<blue>', icon=f"{('🐛' if show_icon else '')}DEBUG")
+    logger.level('INFO', color='<normal>', icon=f"{('ℹ️' if show_icon else '')}INFO")
+    logger.level('SUCCESS', color='<green>', icon=f"{('✅' if show_icon else '')}SUCCESS")
+    logger.level('WARNING', color='<yellow>', icon=f"{('⚠️' if show_icon else '')}WARNING")
+    logger.level('ERROR', color='<red>', icon=f"{('⭕' if show_icon else '')}ERROR")
`,8),l=[k];function n(p,e,E,r,g,d){return a(),i("div",null,l)}const o=s(t,[["render",n]]);export{y as __pageData,o as default}; diff --git a/assets/dev_api_log.md.C1VDikdj.lean.js b/assets/dev_api_log.md.C1VDikdj.lean.js new file mode 100644 index 00000000..319d6e52 --- /dev/null +++ b/assets/dev_api_log.md.C1VDikdj.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as h}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.log","description":"","frontmatter":{"title":"liteyuki.log"},"headers":[],"relativePath":"dev/api/log.md","filePath":"zh/dev/api/log.md","lastUpdated":null}'),t={name:"dev/api/log.md"},k=h("",8),l=[k];function n(p,e,E,r,g,d){return a(),i("div",null,l)}const o=s(t,[["render",n]]);export{y as __pageData,o as default}; diff --git a/assets/dev_api_message_event.md.AxntDJi3.js b/assets/dev_api_message_event.md.AxntDJi3.js new file mode 100644 index 00000000..30b497f1 --- /dev/null +++ b/assets/dev_api_message_event.md.AxntDJi3.js @@ -0,0 +1,36 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.message.event","description":"","frontmatter":{"title":"liteyuki.message.event"},"headers":[],"relativePath":"dev/api/message/event.md","filePath":"zh/dev/api/message/event.md","lastUpdated":null}'),n={name:"dev/api/message/event.md"},t=e(`

liteyuki.message.event

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class MessageEvent

def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)

说明: 轻雪抽象消息事件

源代码在GitHub上查看
python
def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel['MessageEvent']]=None, data: Optional[dict[str, Any]]=None):
+    """
+        轻雪抽象消息事件
+        Args:
+
+            bot_id: 机器人ID
+            message: 消息,消息段数组[{type: str, data: dict[str, Any]}]
+            raw_message: 原始消息(通常为纯文本的格式)
+            message_type: 消息类型(private, group, other)
+
+            session_id: 会话ID(私聊通常为用户ID,群聊通常为群ID)
+            session_type: 会话类型(private, group)
+            receive_channel: 接收频道(用于回复消息)
+
+            data: 附加数据
+        """
+    if data is None:
+        data = {}
+    self.message_type = message_type
+    self.data = data
+    self.bot_id = bot_id
+    self.message = message
+    self.raw_message = raw_message
+    self.session_id = session_id
+    self.session_type = session_type
+    self.user_id = user_id
+    self.receive_channel = receive_channel

def reply(self, message: str | dict[str, Any])

说明: 回复消息

参数:

  • message:
源代码在GitHub上查看
python
def reply(self, message: str | dict[str, Any]):
+    """
+        回复消息
+        Args:
+            message:
+        Returns:
+        """
+    reply_event = MessageEvent(message_type=self.session_type, message=message, raw_message='', data={'message': message}, bot_id=self.bot_id, session_id=self.session_id, user_id=self.user_id, session_type=self.session_type, receive_channel=None)
+    if self.receive_channel:
+        self.receive_channel.send(reply_event)
`,12),h=[t];function l(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(n,[["render",l]]);export{o as __pageData,F as default}; diff --git a/assets/dev_api_message_event.md.AxntDJi3.lean.js b/assets/dev_api_message_event.md.AxntDJi3.lean.js new file mode 100644 index 00000000..ba320c11 --- /dev/null +++ b/assets/dev_api_message_event.md.AxntDJi3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.message.event","description":"","frontmatter":{"title":"liteyuki.message.event"},"headers":[],"relativePath":"dev/api/message/event.md","filePath":"zh/dev/api/message/event.md","lastUpdated":null}'),n={name:"dev/api/message/event.md"},t=e("",12),h=[t];function l(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(n,[["render",l]]);export{o as __pageData,F as default}; diff --git a/assets/dev_api_message_index.md.B1MCWTHF.js b/assets/dev_api_message_index.md.B1MCWTHF.js new file mode 100644 index 00000000..8820aa4d --- /dev/null +++ b/assets/dev_api_message_index.md.B1MCWTHF.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"dev/api/message/index.md","filePath":"zh/dev/api/message/index.md","lastUpdated":null}'),o={name:"dev/api/message/index.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[t("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),n=e("p",null,[e("strong",null,"说明"),t(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[t("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),t(" @File : "),e("strong",null,"init"),t(".py.py @Software: PyCharm")],-1),d=[l,n,r];function m(c,u,p,_,h,k){return i(),s("div",null,d)}const f=a(o,[["render",m]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_message_index.md.B1MCWTHF.lean.js b/assets/dev_api_message_index.md.B1MCWTHF.lean.js new file mode 100644 index 00000000..8820aa4d --- /dev/null +++ b/assets/dev_api_message_index.md.B1MCWTHF.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"dev/api/message/index.md","filePath":"zh/dev/api/message/index.md","lastUpdated":null}'),o={name:"dev/api/message/index.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[t("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),n=e("p",null,[e("strong",null,"说明"),t(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[t("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),t(" @File : "),e("strong",null,"init"),t(".py.py @Software: PyCharm")],-1),d=[l,n,r];function m(c,u,p,_,h,k){return i(),s("div",null,d)}const f=a(o,[["render",m]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_message_matcher.md.CrqC3-lV.js b/assets/dev_api_message_matcher.md.CrqC3-lV.js new file mode 100644 index 00000000..41017bb9 --- /dev/null +++ b/assets/dev_api_message_matcher.md.CrqC3-lV.js @@ -0,0 +1,35 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.matcher","description":"","frontmatter":{"title":"liteyuki.message.matcher"},"headers":[],"relativePath":"dev/api/message/matcher.md","filePath":"zh/dev/api/message/matcher.md","lastUpdated":null}'),n={name:"dev/api/message/matcher.md"},t=e(`

liteyuki.message.matcher

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:51 @Author : snowykami @Email : snowykami@outlook.com @File : matcher.py @Software: PyCharm

class Matcher

def __init__(self, rule: Rule, priority: int, block: bool)

说明: 匹配器

参数:

  • rule: 规则
  • priority: 优先级 >= 0
  • block: 是否阻断后续优先级更低的匹配器
源代码在GitHub上查看
python
def __init__(self, rule: Rule, priority: int, block: bool):
+    """
+        匹配器
+        Args:
+            rule: 规则
+            priority: 优先级 >= 0
+            block: 是否阻断后续优先级更低的匹配器
+        """
+    self.rule = rule
+    self.priority = priority
+    self.block = block
+    self.handlers: list[EventHandler] = []

def handle(self) -> Callable[[EventHandler], EventHandler]

说明: 添加处理函数,装饰器

返回: 装饰器 handler

源代码在GitHub上查看
python
def handle(self) -> Callable[[EventHandler], EventHandler]:
+    """
+        添加处理函数,装饰器
+        Returns:
+            装饰器 handler
+        """
+
+    def decorator(handler: EventHandler) -> EventHandler:
+        self.handlers.append(handler)
+        return handler
+    return decorator

async def run(self, event: MessageEvent) -> None

说明: 运行处理函数

参数:

  • event:
源代码在GitHub上查看
python
async def run(self, event: MessageEvent) -> None:
+    """
+        运行处理函数
+        Args:
+            event:
+        Returns:
+        """
+    if not await self.rule(event):
+        return
+    for handler in self.handlers:
+        try:
+            await handler(event)
+        except Exception:
+            traceback.print_exc()
`,18),l=[t];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const E=s(n,[["render",h]]);export{y as __pageData,E as default}; diff --git a/assets/dev_api_message_matcher.md.CrqC3-lV.lean.js b/assets/dev_api_message_matcher.md.CrqC3-lV.lean.js new file mode 100644 index 00000000..b56a6ef1 --- /dev/null +++ b/assets/dev_api_message_matcher.md.CrqC3-lV.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.matcher","description":"","frontmatter":{"title":"liteyuki.message.matcher"},"headers":[],"relativePath":"dev/api/message/matcher.md","filePath":"zh/dev/api/message/matcher.md","lastUpdated":null}'),n={name:"dev/api/message/matcher.md"},t=e("",18),l=[t];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const E=s(n,[["render",h]]);export{y as __pageData,E as default}; diff --git a/assets/dev_api_message_message.md.Cp-oF0Sy.js b/assets/dev_api_message_message.md.Cp-oF0Sy.js new file mode 100644 index 00000000..ed2f7b41 --- /dev/null +++ b/assets/dev_api_message_message.md.Cp-oF0Sy.js @@ -0,0 +1 @@ +import{_ as s,c as t,o,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"dev/api/message/message.md","filePath":"zh/dev/api/message/message.md","lastUpdated":null}'),i={name:"dev/api/message/message.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[a("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),r=e("p",null,[e("strong",null,"说明"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),n=e("p",null,[a("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : "),e("strong",null,"init"),a(".py.py @Software: PyCharm")],-1),m=[l,r,n];function d(c,u,p,_,g,h){return o(),t("div",null,m)}const f=s(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_message_message.md.Cp-oF0Sy.lean.js b/assets/dev_api_message_message.md.Cp-oF0Sy.lean.js new file mode 100644 index 00000000..ed2f7b41 --- /dev/null +++ b/assets/dev_api_message_message.md.Cp-oF0Sy.lean.js @@ -0,0 +1 @@ +import{_ as s,c as t,o,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"dev/api/message/message.md","filePath":"zh/dev/api/message/message.md","lastUpdated":null}'),i={name:"dev/api/message/message.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[a("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),r=e("p",null,[e("strong",null,"说明"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),n=e("p",null,[a("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : "),e("strong",null,"init"),a(".py.py @Software: PyCharm")],-1),m=[l,r,n];function d(c,u,p,_,g,h){return o(),t("div",null,m)}const f=s(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_message_on.md.BdoE0DiT.js b/assets/dev_api_message_on.md.BdoE0DiT.js new file mode 100644 index 00000000..8b3ebe16 --- /dev/null +++ b/assets/dev_api_message_on.md.BdoE0DiT.js @@ -0,0 +1,15 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.message.on","description":"","frontmatter":{"title":"liteyuki.message.on"},"headers":[],"relativePath":"dev/api/message/on.md","filePath":"zh/dev/api/message/on.md","lastUpdated":null}'),t={name:"dev/api/message/on.md"},n=e(`

liteyuki.message.on

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:52 @Author : snowykami @Email : snowykami@outlook.com @File : on.py @Software: PyCharm

def add_matcher(matcher: Matcher)

源代码在GitHub上查看
python
def add_matcher(matcher: Matcher):
+    for i, m in enumerate(_matcher_list):
+        if m.priority < matcher.priority:
+            _matcher_list.insert(i, matcher)
+            break
+    else:
+        _matcher_list.append(matcher)

def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

源代码在GitHub上查看
python
def on_message(rule: Rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+    matcher = Matcher(rule, priority, block)
+    add_matcher(matcher)
+    return matcher

def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

源代码在GitHub上查看
python
def on_keywords(keywords: list[str], rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+
+    @Rule
+    async def on_keywords_rule(event: MessageEvent):
+        return any((keyword in event.raw_message for keyword in keywords))
+    return on_message(on_keywords_rule & rule, priority, block)
`,9),l=[n];function h(k,r,p,o,d,y){return a(),i("div",null,l)}const E=s(t,[["render",h]]);export{c as __pageData,E as default}; diff --git a/assets/dev_api_message_on.md.BdoE0DiT.lean.js b/assets/dev_api_message_on.md.BdoE0DiT.lean.js new file mode 100644 index 00000000..9f091c2b --- /dev/null +++ b/assets/dev_api_message_on.md.BdoE0DiT.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.message.on","description":"","frontmatter":{"title":"liteyuki.message.on"},"headers":[],"relativePath":"dev/api/message/on.md","filePath":"zh/dev/api/message/on.md","lastUpdated":null}'),t={name:"dev/api/message/on.md"},n=e("",9),l=[n];function h(k,r,p,o,d,y){return a(),i("div",null,l)}const E=s(t,[["render",h]]);export{c as __pageData,E as default}; diff --git a/assets/dev_api_message_rule.md.UByA3TJk.js b/assets/dev_api_message_rule.md.UByA3TJk.js new file mode 100644 index 00000000..448d8a68 --- /dev/null +++ b/assets/dev_api_message_rule.md.UByA3TJk.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.rule","description":"","frontmatter":{"title":"liteyuki.message.rule"},"headers":[],"relativePath":"dev/api/message/rule.md","filePath":"zh/dev/api/message/rule.md","lastUpdated":null}'),t={name:"dev/api/message/rule.md"},n=a('

liteyuki.message.rule

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:55 @Author : snowykami @Email : snowykami@outlook.com @File : rule.py @Software: PyCharm

var RuleHandlerFunc

  • 说明: 规则函数签名

  • 类型: TypeAlias

  • 默认值: Callable[[MessageEvent], Coroutine[None, None, bool]]

class Rule

def __init__(self, handler: RuleHandlerFunc)

源代码在GitHub上查看
python
def __init__(self, handler: RuleHandlerFunc):\n    self.handler = handler

def __or__(self, other: Rule) -> Rule

源代码在GitHub上查看
python
def __or__(self, other: 'Rule') -> 'Rule':\n\n    async def combined_handler(event: MessageEvent) -> bool:\n        return await self.handler(event) or await other.handler(event)\n    return Rule(combined_handler)

def __and__(self, other: Rule) -> Rule

源代码在GitHub上查看
python
def __and__(self, other: 'Rule') -> 'Rule':\n\n    async def combined_handler(event: MessageEvent) -> bool:\n        return await self.handler(event) and await other.handler(event)\n    return Rule(combined_handler)

async def __call__(self, event: MessageEvent) -> bool

源代码在GitHub上查看
python
async def __call__(self, event: MessageEvent) -> bool:\n    if self.handler is None:\n        return True\n    return await self.handler(event)

@Rule

async def empty_rule(event: MessageEvent) -> bool

源代码在GitHub上查看
python
@Rule\nasync def empty_rule(event: MessageEvent) -> bool:\n    return True

@Rule

async def is_su_rule(event: MessageEvent) -> bool

源代码在GitHub上查看
python
@Rule\nasync def is_su_rule(event: MessageEvent) -> bool:\n    return str(event.user_id) in _superusers
',20),l=[n];function h(r,p,k,d,o,g){return e(),i("div",null,l)}const c=s(t,[["render",h]]);export{y as __pageData,c as default}; diff --git a/assets/dev_api_message_rule.md.UByA3TJk.lean.js b/assets/dev_api_message_rule.md.UByA3TJk.lean.js new file mode 100644 index 00000000..6c42cfdb --- /dev/null +++ b/assets/dev_api_message_rule.md.UByA3TJk.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.rule","description":"","frontmatter":{"title":"liteyuki.message.rule"},"headers":[],"relativePath":"dev/api/message/rule.md","filePath":"zh/dev/api/message/rule.md","lastUpdated":null}'),t={name:"dev/api/message/rule.md"},n=a("",20),l=[n];function h(r,p,k,d,o,g){return e(),i("div",null,l)}const c=s(t,[["render",h]]);export{y as __pageData,c as default}; diff --git a/assets/dev_api_message_session.md.ZRjlTcix.js b/assets/dev_api_message_session.md.ZRjlTcix.js new file mode 100644 index 00000000..fbc33cd3 --- /dev/null +++ b/assets/dev_api_message_session.md.ZRjlTcix.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.session","description":"","frontmatter":{"title":"liteyuki.message.session"},"headers":[],"relativePath":"dev/api/message/session.md","filePath":"zh/dev/api/message/session.md","lastUpdated":null}'),i={name:"dev/api/message/session.md"},n=e("h1",{id:"liteyuki-message-session",tabindex:"-1"},[s("liteyuki.message.session "),e("a",{class:"header-anchor",href:"#liteyuki-message-session","aria-label":'Permalink to "liteyuki.message.session"'},"​")],-1),l=e("p",null,[e("strong",null,"说明"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[s("@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : session.py @Software: PyCharm")],-1),m=[n,l,r];function d(c,u,_,p,h,k){return o(),a("div",null,m)}const f=t(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_message_session.md.ZRjlTcix.lean.js b/assets/dev_api_message_session.md.ZRjlTcix.lean.js new file mode 100644 index 00000000..fbc33cd3 --- /dev/null +++ b/assets/dev_api_message_session.md.ZRjlTcix.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.session","description":"","frontmatter":{"title":"liteyuki.message.session"},"headers":[],"relativePath":"dev/api/message/session.md","filePath":"zh/dev/api/message/session.md","lastUpdated":null}'),i={name:"dev/api/message/session.md"},n=e("h1",{id:"liteyuki-message-session",tabindex:"-1"},[s("liteyuki.message.session "),e("a",{class:"header-anchor",href:"#liteyuki-message-session","aria-label":'Permalink to "liteyuki.message.session"'},"​")],-1),l=e("p",null,[e("strong",null,"说明"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[s("@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : session.py @Software: PyCharm")],-1),m=[n,l,r];function d(c,u,_,p,h,k){return o(),a("div",null,m)}const f=t(i,[["render",d]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_mkdoc.md.BPGO1Znu.js b/assets/dev_api_mkdoc.md.BPGO1Znu.js new file mode 100644 index 00000000..fb3c086d --- /dev/null +++ b/assets/dev_api_mkdoc.md.BPGO1Znu.js @@ -0,0 +1,161 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.mkdoc","description":"","frontmatter":{"title":"liteyuki.mkdoc"},"headers":[],"relativePath":"dev/api/mkdoc.md","filePath":"zh/dev/api/mkdoc.md","lastUpdated":null}'),n={name:"dev/api/mkdoc.md"},h=t(`

liteyuki.mkdoc

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 上午6:23 @Author : snowykami @Email : snowykami@outlook.com @File : mkdoc.py @Software: PyCharm

class DefType(Enum)

attr FUNCTION = 'function'

attr METHOD = 'method'

attr STATIC_METHOD = 'staticmethod'

attr CLASS_METHOD = 'classmethod'

attr PROPERTY = 'property'

class FunctionInfo(BaseModel)

attr name: str = NO_DEFAULT

attr args: list[tuple[str, str]] = NO_DEFAULT

attr return_type: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr source_code: str = ''

attr type: DefType = NO_DEFAULT

attr is_async: bool = NO_DEFAULT

class AttributeInfo(BaseModel)

attr name: str = NO_DEFAULT

attr type: str = NO_DEFAULT

attr value: Any = None

attr docstring: str = ''

class ClassInfo(BaseModel)

attr name: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr methods: list[FunctionInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr inherit: list[str] = NO_DEFAULT

class ModuleInfo(BaseModel)

attr module_path: str = NO_DEFAULT

attr functions: list[FunctionInfo] = NO_DEFAULT

attr classes: list[ClassInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr docstring: str = NO_DEFAULT

def get_relative_path(base_path: str, target_path: str) -> str

说明: 获取相对路径

参数:

  • base_path: 基础路径
  • target_path: 目标路径
源代码在GitHub上查看
python
def get_relative_path(base_path: str, target_path: str) -> str:
+    """
+    获取相对路径
+    Args:
+        base_path: 基础路径
+        target_path: 目标路径
+    """
+    return os.path.relpath(target_path, base_path)

def write_to_files(file_data: dict[str, str])

说明: 输出文件

参数:

  • file_data: 文件数据 相对路径
源代码在GitHub上查看
python
def write_to_files(file_data: dict[str, str]):
+    """
+    输出文件
+    Args:
+        file_data: 文件数据 相对路径
+    """
+    for rp, data in file_data.items():
+        if not os.path.exists(os.path.dirname(rp)):
+            os.makedirs(os.path.dirname(rp))
+        with open(rp, 'w', encoding='utf-8') as f:
+            f.write(data)

def get_file_list(module_folder: str)

源代码在GitHub上查看
python
def get_file_list(module_folder: str):
+    file_list = []
+    for root, dirs, files in os.walk(module_folder):
+        for file in files:
+            if file.endswith(('.py', '.pyi')):
+                file_list.append(os.path.join(root, file))
+    return file_list

def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo

说明: 获取函数和类

参数:

  • file_path: Python 文件路径
  • ignore_private: 忽略私有函数和类

返回: 模块信息

源代码在GitHub上查看
python
def get_module_info_normal(file_path: str, ignore_private: bool=True) -> ModuleInfo:
+    """
+    获取函数和类
+    Args:
+        file_path: Python 文件路径
+        ignore_private: 忽略私有函数和类
+    Returns:
+        模块信息
+    """
+    with open(file_path, 'r', encoding='utf-8') as file:
+        file_content = file.read()
+        tree = ast.parse(file_content)
+    dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')
+    module_docstring = ast.get_docstring(tree)
+    module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')
+    for node in ast.walk(tree):
+        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
+            if not any((isinstance(parent, ast.ClassDef) for parent in ast.iter_child_nodes(node))) and (not ignore_private or not node.name.startswith('_')):
+                if node.args.args:
+                    first_arg = node.args.args[0]
+                    if first_arg.arg in ('self', 'cls'):
+                        continue
+                function_docstring = ast.get_docstring(node)
+                func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))
+                module_info.functions.append(func_info)
+        elif isinstance(node, ast.ClassDef):
+            class_docstring = ast.get_docstring(node)
+            class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])
+            for class_node in node.body:
+                if isinstance(class_node, ast.FunctionDef) and (not ignore_private or not class_node.name.startswith('_') or class_node.name == '__init__'):
+                    method_docstring = ast.get_docstring(class_node)
+                    def_type = DefType.METHOD
+                    if class_node.decorator_list:
+                        if any((isinstance(decorator, ast.Name) and decorator.id == 'staticmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.STATIC_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'classmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.CLASS_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'property' for decorator in class_node.decorator_list)):
+                            def_type = DefType.PROPERTY
+                    class_info.methods.append(FunctionInfo(name=class_node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in class_node.args.args], return_type=ast.unparse(class_node.returns) if class_node.returns else 'None', docstring=method_docstring if method_docstring else '', type=def_type, is_async=isinstance(class_node, ast.AsyncFunctionDef), source_code=ast.unparse(class_node)))
+                elif isinstance(class_node, ast.Assign):
+                    for target in class_node.targets:
+                        if isinstance(target, ast.Name):
+                            class_info.attributes.append(AttributeInfo(name=target.id, type=ast.unparse(class_node.value)))
+            module_info.classes.append(class_info)
+        elif isinstance(node, ast.Assign):
+            if not any((isinstance(parent, (ast.ClassDef, ast.FunctionDef)) for parent in ast.iter_child_nodes(node))):
+                for target in node.targets:
+                    if isinstance(target, ast.Name) and (not ignore_private or not target.id.startswith('_')):
+                        attr_type = NO_TYPE_HINT
+                        if isinstance(node.value, ast.AnnAssign) and node.value.annotation:
+                            attr_type = ast.unparse(node.value.annotation)
+                        module_info.attributes.append(AttributeInfo(name=target.id, type=attr_type, value=ast.unparse(node.value) if node.value else None))
+    return module_info

def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str

说明: 生成模块的Markdown 你可在此自定义生成的Markdown格式

参数:

  • module_info: 模块信息
  • front_matter: 自定义选项title, index, icon, category
  • lang: 语言

返回: Markdown 字符串

源代码在GitHub上查看
python
def generate_markdown(module_info: ModuleInfo, front_matter=None, lang: str='zh-CN') -> str:
+    """
+    生成模块的Markdown
+    你可在此自定义生成的Markdown格式
+    Args:
+        module_info: 模块信息
+        front_matter: 自定义选项title, index, icon, category
+        lang: 语言
+    Returns:
+        Markdown 字符串
+    """
+    content = ''
+    front_matter = '---\\n' + '\\n'.join([f'{k}: {v}' for k, v in front_matter.items()]) + '\\n---\\n\\n'
+    content += front_matter
+    for func in module_info.functions:
+        args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]
+        content += f"### ***{('async ' if func.is_async else '')}def*** \`{func.name}({', '.join(args_with_type)}) -> {func.return_type}\`\\n\\n"
+        func.docstring = func.docstring.replace('\\n', '\\n\\n')
+        content += f'{func.docstring}\\n\\n'
+        content += f'<details>\\n<summary>源代码</summary>\\n\\n\`\`\`python\\n{func.source_code}\\n\`\`\`\\n</details>\\n\\n'
+    for cls in module_info.classes:
+        if cls.inherit:
+            inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''
+            content += f'### ***class*** \`{cls.name}{inherit}\`\\n\\n'
+        else:
+            content += f'### ***class*** \`{cls.name}\`\\n\\n'
+        cls.docstring = cls.docstring.replace('\\n', '\\n\\n')
+        content += f'{cls.docstring}\\n\\n'
+        for method in cls.methods:
+            if method.type != DefType.METHOD:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]
+                content += f'### &emsp; ***@{method.type.value}***\\n'
+            else:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]
+            content += f"### &emsp; ***{('async ' if method.is_async else '')}def*** \`{method.name}({', '.join(args_with_type)}) -> {method.return_type}\`\\n\\n"
+            method.docstring = method.docstring.replace('\\n', '\\n\\n')
+            content += f'&emsp;{method.docstring}\\n\\n'
+            if lang == 'zh-CN':
+                TEXT_SOURCE_CODE = '源代码'
+            else:
+                TEXT_SOURCE_CODE = 'Source Code'
+            content += f'<details>\\n<summary>{TEXT_SOURCE_CODE}</summary>\\n\\n\`\`\`python\\n{method.source_code}\\n\`\`\`\\n</details>\\n\\n'
+        for attr in cls.attributes:
+            content += f'### &emsp; ***attr*** \`{attr.name}: {attr.type}\`\\n\\n'
+    for attr in module_info.attributes:
+        if attr.type == NO_TYPE_HINT:
+            content += f'### ***var*** \`{attr.name} = {attr.value}\`\\n\\n'
+        else:
+            content += f'### ***var*** \`{attr.name}: {attr.type} = {attr.value}\`\\n\\n'
+        attr.docstring = attr.docstring.replace('\\n', '\\n\\n')
+        content += f'{attr.docstring}\\n\\n'
+    return content

def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)

说明: 生成文档

参数:

  • module_folder: 模块文件夹
  • output_dir: 输出文件夹
  • with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
  • ignored_paths: 忽略的路径
  • lang: 语言
源代码在GitHub上查看
python
def generate_docs(module_folder: str, output_dir: str, with_top: bool=False, lang: str='zh-CN', ignored_paths=None):
+    """
+    生成文档
+    Args:
+        module_folder: 模块文件夹
+        output_dir: 输出文件夹
+        with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
+        ignored_paths: 忽略的路径
+        lang: 语言
+    """
+    if ignored_paths is None:
+        ignored_paths = []
+    file_data: dict[str, str] = {}
+    file_list = get_file_list(module_folder)
+    shutil.rmtree(output_dir, ignore_errors=True)
+    os.mkdir(output_dir)
+    replace_data = {'__init__': 'README', '.py': '.md'}
+    for pyfile_path in file_list:
+        if any((ignored_path.replace('\\\\', '/') in pyfile_path.replace('\\\\', '/') for ignored_path in ignored_paths)):
+            continue
+        no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)
+        rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
+        for rk, rv in replace_data.items():
+            rel_md_path = rel_md_path.replace(rk, rv)
+        abs_md_path = os.path.join(output_dir, rel_md_path)
+        module_info = get_module_info_normal(pyfile_path)
+        if 'README' in abs_md_path:
+            front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}
+        else:
+            front_matter = {'title': module_info.module_path.replace('_', '\\\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}
+        md_content = generate_markdown(module_info, front_matter)
+        print(f'Generate {pyfile_path} -> {abs_md_path}')
+        file_data[abs_md_path] = md_content
+    write_to_files(file_data)

var no_module_name_pyfile_path

  • 说明: 去头路径

  • 默认值: get_relative_path(module_folder, pyfile_path)

`,65),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(n,[["render",l]]);export{y as __pageData,o as default}; diff --git a/assets/dev_api_mkdoc.md.BPGO1Znu.lean.js b/assets/dev_api_mkdoc.md.BPGO1Znu.lean.js new file mode 100644 index 00000000..4fdbc177 --- /dev/null +++ b/assets/dev_api_mkdoc.md.BPGO1Znu.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.mkdoc","description":"","frontmatter":{"title":"liteyuki.mkdoc"},"headers":[],"relativePath":"dev/api/mkdoc.md","filePath":"zh/dev/api/mkdoc.md","lastUpdated":null}'),n={name:"dev/api/mkdoc.md"},h=t("",65),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(n,[["render",l]]);export{y as __pageData,o as default}; diff --git a/assets/dev_api_plugin_index.md.3yEbVRtX.js b/assets/dev_api_plugin_index.md.3yEbVRtX.js new file mode 100644 index 00000000..19b266db --- /dev/null +++ b/assets/dev_api_plugin_index.md.3yEbVRtX.js @@ -0,0 +1,7 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"dev/api/plugin/index.md","filePath":"zh/dev/api/plugin/index.md","lastUpdated":null}'),e={name:"dev/api/plugin/index.md"},n=a(`

liteyuki.plugin

def get_loaded_plugins() -> dict[str, Plugin]

说明: 获取已加载的插件

返回: dict[str, Plugin]: 插件字典

源代码在GitHub上查看
python
def get_loaded_plugins() -> dict[str, Plugin]:
+    """
+    获取已加载的插件
+    Returns:
+        dict[str, Plugin]: 插件字典
+    """
+    return _plugins
`,5),l=[n];function p(d,r,h,o,u,g){return t(),s("div",null,l)}const _=i(e,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/dev_api_plugin_index.md.3yEbVRtX.lean.js b/assets/dev_api_plugin_index.md.3yEbVRtX.lean.js new file mode 100644 index 00000000..3d82d5a8 --- /dev/null +++ b/assets/dev_api_plugin_index.md.3yEbVRtX.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"dev/api/plugin/index.md","filePath":"zh/dev/api/plugin/index.md","lastUpdated":null}'),e={name:"dev/api/plugin/index.md"},n=a("",5),l=[n];function p(d,r,h,o,u,g){return t(),s("div",null,l)}const _=i(e,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/dev_api_plugin_load.md.Bb_Kxjiz.js b/assets/dev_api_plugin_load.md.Bb_Kxjiz.js new file mode 100644 index 00000000..68363d79 --- /dev/null +++ b/assets/dev_api_plugin_load.md.Bb_Kxjiz.js @@ -0,0 +1,83 @@ +import{_ as h,D as l,c as t,j as i,a as s,I as k,w as p,a4 as a,o as e}from"./chunks/framework.C3o_UkTa.js";const B=JSON.parse('{"title":"liteyuki.plugin.load","description":"","frontmatter":{"title":"liteyuki.plugin.load"},"headers":[],"relativePath":"dev/api/plugin/load.md","filePath":"zh/dev/api/plugin/load.md","lastUpdated":null}'),E={name:"dev/api/plugin/load.md"},d=a(`

liteyuki.plugin.load

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : snowykami@outlook.com @File : load.py @Software: PyCharm

def load_plugin(module_path: str | Path) -> Optional[Plugin]

说明: 加载单个插件,可以是本地插件或是通过 pip 安装的插件。

参数:

  • module_path: 插件名称 path.to.your.plugin
  • 或插件路径 pathlib.Path(path/to/your/plugin):
源代码在GitHub上查看
python
def load_plugin(module_path: str | Path) -> Optional[Plugin]:
+    """加载单个插件,可以是本地插件或是通过 \`pip\` 安装的插件。
+
+    参数:
+        module_path: 插件名称 \`path.to.your.plugin\`
+        或插件路径 \`pathlib.Path(path/to/your/plugin)\`
+    """
+    module_path = path_to_module_name(Path(module_path)) if isinstance(module_path, Path) else module_path
+    try:
+        module = import_module(module_path)
+        _plugins[module.__name__] = Plugin(name=module.__name__, module=module, module_name=module_path)
+        if module.__dict__.get('__plugin_metadata__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_metadata__']
+            display_name = module.__name__.split('.')[-1]
+        elif module.__dict__.get('__liteyuki_plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__liteyuki_plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        elif module.__dict__.get('__plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        else:
+            logger.opt(colors=True).warning(f'The metadata of Liteyuki plugin "{module.__name__}" is not specified, use empty.')
+            metadata = PluginMetadata(name=module.__name__)
+            display_name = module.__name__.split('.')[-1]
+        _plugins[module.__name__].metadata = metadata
+        logger.opt(colors=True).success(f'Succeeded to load liteyuki plugin "{display_name}"')
+        return _plugins[module.__name__]
+    except Exception as e:
+        logger.opt(colors=True).success(f'Failed to load liteyuki plugin "<r>{module_path}</r>"')
+        traceback.print_exc()
+        return None

def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]

说明: 导入文件夹下多个插件

参数:

  • plugin_dir: 文件夹路径
  • ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
源代码在GitHub上查看
python
def load_plugins(*plugin_dir: str, ignore_warning: bool=True) -> set[Plugin]:
+    """导入文件夹下多个插件
+
+    参数:
+        plugin_dir: 文件夹路径
+        ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
+    """
+    plugins = set()
+    for dir_path in plugin_dir:
+        if not os.path.exists(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' does not exist.")
+            continue
+        if not os.listdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is empty.")
+            continue
+        if not os.path.isdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is not a directory.")
+            continue
+        for f in os.listdir(dir_path):
+            path = Path(os.path.join(dir_path, f))
+            module_name = None
+            if os.path.isfile(path) and f.endswith('.py') and (f != '__init__.py'):
+                module_name = f'{path_to_module_name(Path(dir_path))}.{f[:-3]}'
+            elif os.path.isdir(path) and os.path.exists(os.path.join(path, '__init__.py')):
+                module_name = path_to_module_name(path)
+            if module_name:
+                load_plugin(module_name)
+                if _plugins.get(module_name):
+                    plugins.add(_plugins[module_name])
+    return plugins

def format_display_name(display_name: str, plugin_type: PluginType) -> str

说明: 设置插件名称颜色,根据不同类型插件设置颜色

参数:

  • display_name: 插件名称
  • plugin_type: 插件类型
`,17),r=i("strong",null,"返回",-1),g=a(`
源代码在GitHub上查看
python
def format_display_name(display_name: str, plugin_type: PluginType) -> str:
+    """
+    设置插件名称颜色,根据不同类型插件设置颜色
+    Args:
+        display_name: 插件名称
+        plugin_type: 插件类型
+
+    Returns:
+        str: 设置后的插件名称 <y>name</y>
+    """
+    color = 'y'
+    match plugin_type:
+        case PluginType.APPLICATION:
+            color = 'm'
+        case PluginType.TEST:
+            color = 'g'
+        case PluginType.MODULE:
+            color = 'e'
+        case PluginType.SERVICE:
+            color = 'c'
+    return f'<{color}>{display_name} [{plugin_type.name}]</{color}>'
`,1);function y(F,o,u,_,C,c){const n=l("y");return e(),t("div",null,[d,i("p",null,[r,s(": str: 设置后的插件名称 "),k(n,null,{default:p(()=>[s("name")]),_:1})]),g])}const A=h(E,[["render",y]]);export{B as __pageData,A as default}; diff --git a/assets/dev_api_plugin_load.md.Bb_Kxjiz.lean.js b/assets/dev_api_plugin_load.md.Bb_Kxjiz.lean.js new file mode 100644 index 00000000..d931572e --- /dev/null +++ b/assets/dev_api_plugin_load.md.Bb_Kxjiz.lean.js @@ -0,0 +1 @@ +import{_ as h,D as l,c as t,j as i,a as s,I as k,w as p,a4 as a,o as e}from"./chunks/framework.C3o_UkTa.js";const B=JSON.parse('{"title":"liteyuki.plugin.load","description":"","frontmatter":{"title":"liteyuki.plugin.load"},"headers":[],"relativePath":"dev/api/plugin/load.md","filePath":"zh/dev/api/plugin/load.md","lastUpdated":null}'),E={name:"dev/api/plugin/load.md"},d=a("",17),r=i("strong",null,"返回",-1),g=a("",1);function y(F,o,u,_,C,c){const n=l("y");return e(),t("div",null,[d,i("p",null,[r,s(": str: 设置后的插件名称 "),k(n,null,{default:p(()=>[s("name")]),_:1})]),g])}const A=h(E,[["render",y]]);export{B as __pageData,A as default}; diff --git a/assets/dev_api_plugin_manager.md.wxoQsnAr.js b/assets/dev_api_plugin_manager.md.wxoQsnAr.js new file mode 100644 index 00000000..b12f6a14 --- /dev/null +++ b/assets/dev_api_plugin_manager.md.wxoQsnAr.js @@ -0,0 +1 @@ +import{_ as t,c as i,o as n,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.plugin.manager","description":"","frontmatter":{"title":"liteyuki.plugin.manager"},"headers":[],"relativePath":"dev/api/plugin/manager.md","filePath":"zh/dev/api/plugin/manager.md","lastUpdated":null}'),r={name:"dev/api/plugin/manager.md"},l=e("h1",{id:"liteyuki-plugin-manager",tabindex:"-1"},[a("liteyuki.plugin.manager "),e("a",{class:"header-anchor",href:"#liteyuki-plugin-manager","aria-label":'Permalink to "liteyuki.plugin.manager"'},"​")],-1),o=e("p",null,[e("strong",null,"说明"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),s=e("p",null,[a("@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : manager.py @Software: PyCharm")],-1),m=[l,o,s];function u(p,d,c,g,_,h){return n(),i("div",null,m)}const f=t(r,[["render",u]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_plugin_manager.md.wxoQsnAr.lean.js b/assets/dev_api_plugin_manager.md.wxoQsnAr.lean.js new file mode 100644 index 00000000..b12f6a14 --- /dev/null +++ b/assets/dev_api_plugin_manager.md.wxoQsnAr.lean.js @@ -0,0 +1 @@ +import{_ as t,c as i,o as n,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.plugin.manager","description":"","frontmatter":{"title":"liteyuki.plugin.manager"},"headers":[],"relativePath":"dev/api/plugin/manager.md","filePath":"zh/dev/api/plugin/manager.md","lastUpdated":null}'),r={name:"dev/api/plugin/manager.md"},l=e("h1",{id:"liteyuki-plugin-manager",tabindex:"-1"},[a("liteyuki.plugin.manager "),e("a",{class:"header-anchor",href:"#liteyuki-plugin-manager","aria-label":'Permalink to "liteyuki.plugin.manager"'},"​")],-1),o=e("p",null,[e("strong",null,"说明"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),s=e("p",null,[a("@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : manager.py @Software: PyCharm")],-1),m=[l,o,s];function u(p,d,c,g,_,h){return n(),i("div",null,m)}const f=t(r,[["render",u]]);export{y as __pageData,f as default}; diff --git a/assets/dev_api_plugin_model.md.CXJI2586.js b/assets/dev_api_plugin_model.md.CXJI2586.js new file mode 100644 index 00000000..3277fda7 --- /dev/null +++ b/assets/dev_api_plugin_model.md.CXJI2586.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as r}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugin.model","description":"","frontmatter":{"title":"liteyuki.plugin.model"},"headers":[],"relativePath":"dev/api/plugin/model.md","filePath":"zh/dev/api/plugin/model.md","lastUpdated":null}'),o={name:"dev/api/plugin/model.md"},s=r('

liteyuki.plugin.model

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/24 上午12:02 @Author : snowykami @Email : snowykami@outlook.com @File : model.py @Software: PyCharm

class PluginType(Enum)

attr APPLICATION = 'application'

attr SERVICE = 'service'

attr MODULE = 'module'

attr UNCLASSIFIED = 'unclassified'

attr TEST = 'test'

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr type: PluginType = PluginType.UNCLASSIFIED

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)

def __hash__(self)

源代码在GitHub上查看
python
def __hash__(self):\n    return hash(self.module_name)

attr model_config = {'arbitrary_types_allowed': True}

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr metadata: Optional[PluginMetadata] = None

',25),i=[s];function l(n,d,h,c,u,m){return e(),t("div",null,i)}const k=a(o,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/dev_api_plugin_model.md.CXJI2586.lean.js b/assets/dev_api_plugin_model.md.CXJI2586.lean.js new file mode 100644 index 00000000..720d096d --- /dev/null +++ b/assets/dev_api_plugin_model.md.CXJI2586.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as r}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugin.model","description":"","frontmatter":{"title":"liteyuki.plugin.model"},"headers":[],"relativePath":"dev/api/plugin/model.md","filePath":"zh/dev/api/plugin/model.md","lastUpdated":null}'),o={name:"dev/api/plugin/model.md"},s=r("",25),i=[s];function l(n,d,h,c,u,m){return e(),t("div",null,i)}const k=a(o,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/dev_api_plugin_plugin.md.CSWk8lsR.js b/assets/dev_api_plugin_plugin.md.CSWk8lsR.js new file mode 100644 index 00000000..a9a207f1 --- /dev/null +++ b/assets/dev_api_plugin_plugin.md.CSWk8lsR.js @@ -0,0 +1,7 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"dev/api/plugin/plugin.md","filePath":"zh/dev/api/plugin/plugin.md","lastUpdated":null}'),n={name:"dev/api/plugin/plugin.md"},e=a(`

liteyuki.plugin

def get_loaded_plugins() -> dict[str, Plugin]

说明: 获取已加载的插件

返回: dict[str, Plugin]: 插件字典

源代码在GitHub上查看
python
def get_loaded_plugins() -> dict[str, Plugin]:
+    """
+    获取已加载的插件
+    Returns:
+        dict[str, Plugin]: 插件字典
+    """
+    return _plugins
`,5),l=[e];function p(d,r,h,u,o,g){return t(),s("div",null,l)}const _=i(n,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/dev_api_plugin_plugin.md.CSWk8lsR.lean.js b/assets/dev_api_plugin_plugin.md.CSWk8lsR.lean.js new file mode 100644 index 00000000..298b85a0 --- /dev/null +++ b/assets/dev_api_plugin_plugin.md.CSWk8lsR.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"dev/api/plugin/plugin.md","filePath":"zh/dev/api/plugin/plugin.md","lastUpdated":null}'),n={name:"dev/api/plugin/plugin.md"},e=a("",5),l=[e];function p(d,r,h,u,o,g){return t(),s("div",null,l)}const _=i(n,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/dev_api_plugins_liteecho.md.CPFGVTjw.js b/assets/dev_api_plugins_liteecho.md.CPFGVTjw.js new file mode 100644 index 00000000..bfc526a3 --- /dev/null +++ b/assets/dev_api_plugins_liteecho.md.CPFGVTjw.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as s,a4 as t}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugins.liteecho","description":"","frontmatter":{"title":"liteyuki.plugins.liteecho"},"headers":[],"relativePath":"dev/api/plugins/liteecho.md","filePath":"zh/dev/api/plugins/liteecho.md","lastUpdated":null}'),a={name:"dev/api/plugins/liteecho.md"},l=t('

liteyuki.plugins.liteecho

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/22 下午12:31 @Author : snowykami @Email : snowykami@outlook.com @File : liteecho.py @Software: PyCharm

@on_startswith(['liteecho'], rule=is_su_rule).handle()

async def liteecho(event: MessageEvent)

源代码在GitHub上查看
python
@on_startswith(['liteecho'], rule=is_su_rule).handle()\nasync def liteecho(event: MessageEvent):\n    event.reply(event.raw_message.strip()[8:].strip())
',6),n=[l];function h(o,p,r,k,c,d){return s(),i("div",null,n)}const y=e(a,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/dev_api_plugins_liteecho.md.CPFGVTjw.lean.js b/assets/dev_api_plugins_liteecho.md.CPFGVTjw.lean.js new file mode 100644 index 00000000..b26d7d24 --- /dev/null +++ b/assets/dev_api_plugins_liteecho.md.CPFGVTjw.lean.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as s,a4 as t}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugins.liteecho","description":"","frontmatter":{"title":"liteyuki.plugins.liteecho"},"headers":[],"relativePath":"dev/api/plugins/liteecho.md","filePath":"zh/dev/api/plugins/liteecho.md","lastUpdated":null}'),a={name:"dev/api/plugins/liteecho.md"},l=t("",6),n=[l];function h(o,p,r,k,c,d){return s(),i("div",null,n)}const y=e(a,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.js b/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.js new file mode 100644 index 00000000..4a03e860 --- /dev/null +++ b/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.js @@ -0,0 +1,8 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"dev/api/plugins/plugin_loader/index.md","filePath":"zh/dev/api/plugins/plugin_loader/index.md","lastUpdated":null}'),n={name:"dev/api/plugins/plugin_loader/index.md"},t=l(`

liteyuki.plugins.plugin_loader

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

说明: 默认插件加载器,应在初始化时调用

源代码在GitHub上查看
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)
`,6),e=[t];function p(r,h,o,d,k,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{_ as __pageData,y as default}; diff --git a/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.lean.js b/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.lean.js new file mode 100644 index 00000000..ceb14766 --- /dev/null +++ b/assets/dev_api_plugins_plugin_loader_index.md.BKOtyJlM.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"dev/api/plugins/plugin_loader/index.md","filePath":"zh/dev/api/plugins/plugin_loader/index.md","lastUpdated":null}'),n={name:"dev/api/plugins/plugin_loader/index.md"},t=l("",6),e=[t];function p(r,h,o,d,k,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{_ as __pageData,y as default}; diff --git a/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.js b/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.js new file mode 100644 index 00000000..5d1ee82f --- /dev/null +++ b/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.js @@ -0,0 +1,8 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"dev/api/plugins/plugin_loader/plugin_loader.md","filePath":"zh/dev/api/plugins/plugin_loader/plugin_loader.md","lastUpdated":null}'),n={name:"dev/api/plugins/plugin_loader/plugin_loader.md"},t=l(`

liteyuki.plugins.plugin_loader

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

说明: 默认插件加载器,应在初始化时调用

源代码在GitHub上查看
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)
`,6),e=[t];function p(r,o,h,d,k,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{_ as __pageData,y as default}; diff --git a/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.lean.js b/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.lean.js new file mode 100644 index 00000000..595ebc12 --- /dev/null +++ b/assets/dev_api_plugins_plugin_loader_plugin_loader.md.Bfz2lNbM.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"dev/api/plugins/plugin_loader/plugin_loader.md","filePath":"zh/dev/api/plugins/plugin_loader/plugin_loader.md","lastUpdated":null}'),n={name:"dev/api/plugins/plugin_loader/plugin_loader.md"},t=l("",6),e=[t];function p(r,o,h,d,k,u){return a(),s("div",null,e)}const y=i(n,[["render",p]]);export{_ as __pageData,y as default}; diff --git a/assets/dev_api_utils.md.BfOyfADO.js b/assets/dev_api_utils.md.BfOyfADO.js new file mode 100644 index 00000000..6dac9d07 --- /dev/null +++ b/assets/dev_api_utils.md.BfOyfADO.js @@ -0,0 +1,70 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.utils","description":"","frontmatter":{"title":"liteyuki.utils"},"headers":[],"relativePath":"dev/api/utils.md","filePath":"zh/dev/api/utils.md","lastUpdated":null}'),t={name:"dev/api/utils.md"},l=n(`

liteyuki.utils

说明: 一些常用的工具类,部分来源于 nonebot 并遵循其许可进行修改

def is_coroutine_callable(call: Callable[..., Any]) -> bool

说明: 判断是否为协程可调用对象

参数:

  • call: 可调用对象

返回: bool: 是否为协程可调用对象

源代码在GitHub上查看
python
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
+    """
+    判断是否为协程可调用对象
+    Args:
+        call: 可调用对象
+    Returns:
+        bool: 是否为协程可调用对象
+    """
+    if inspect.isroutine(call):
+        return inspect.iscoroutinefunction(call)
+    if inspect.isclass(call):
+        return False
+    func_ = getattr(call, '__call__', None)
+    return inspect.iscoroutinefunction(func_)

def run_coroutine(*coro: Coroutine)

说明: 运行协程

参数:

  • coro:
源代码在GitHub上查看
python
def run_coroutine(*coro: Coroutine):
+    """
+    运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    try:
+        loop = asyncio.get_running_loop()
+        if loop.is_running():
+            for c in coro:
+                asyncio.ensure_future(c)
+        else:
+            for c in coro:
+                loop.run_until_complete(c)
+    except RuntimeError:
+        loop = asyncio.new_event_loop()
+        asyncio.set_event_loop(loop)
+        loop.run_until_complete(asyncio.gather(*coro))
+        loop.close()
+    except Exception as e:
+        logger.error(f'Exception occurred: {e}')

def run_coroutine_in_thread(*coro: Coroutine)

说明: 在新线程中运行协程

参数:

  • coro:
源代码在GitHub上查看
python
def run_coroutine_in_thread(*coro: Coroutine):
+    """
+    在新线程中运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    threading.Thread(target=run_coroutine, args=coro, daemon=True).start()

def path_to_module_name(path: Path) -> str

说明: 转换路径为模块名

参数:

  • path: 路径a/b/c/d -> a.b.c.d

返回: str: 模块名

源代码在GitHub上查看
python
def path_to_module_name(path: Path) -> str:
+    """
+    转换路径为模块名
+    Args:
+        path: 路径a/b/c/d -> a.b.c.d
+    Returns:
+        str: 模块名
+    """
+    rel_path = path.resolve().relative_to(Path.cwd().resolve())
+    if rel_path.stem == '__init__':
+        return '.'.join(rel_path.parts[:-1])
+    else:
+        return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]

说明: 异步包装器

参数:

  • func: Sync Callable

返回: Coroutine: Asynchronous Callable

源代码在GitHub上查看
python
def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]:
+    """
+    异步包装器
+    Args:
+        func: Sync Callable
+    Returns:
+        Coroutine: Asynchronous Callable
+    """
+
+    async def wrapper(*args, **kwargs):
+        return func(*args, **kwargs)
+    wrapper.__signature__ = inspect.signature(func)
+    return wrapper
`,30),p=[l];function h(e,k,r,o,d,E){return a(),i("div",null,p)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/dev_api_utils.md.BfOyfADO.lean.js b/assets/dev_api_utils.md.BfOyfADO.lean.js new file mode 100644 index 00000000..05db92ed --- /dev/null +++ b/assets/dev_api_utils.md.BfOyfADO.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.utils","description":"","frontmatter":{"title":"liteyuki.utils"},"headers":[],"relativePath":"dev/api/utils.md","filePath":"zh/dev/api/utils.md","lastUpdated":null}'),t={name:"dev/api/utils.md"},l=n("",30),p=[l];function h(e,k,r,o,d,E){return a(),i("div",null,p)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/dev_comm.md.BaLcrxQn.js b/assets/dev_comm.md.BaLcrxQn.js new file mode 100644 index 00000000..845d9cff --- /dev/null +++ b/assets/dev_comm.md.BaLcrxQn.js @@ -0,0 +1,43 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"进程通信","description":"","frontmatter":{"title":"进程通信","order":4},"headers":[],"relativePath":"dev/comm.md","filePath":"zh/dev/comm.md","lastUpdated":1725102337000}'),e={name:"dev/comm.md"},h=n(`

通道通信

简介

轻雪运行在主进程 MainProcess 里,其他插件框架进程是伴随的子进程,因此无法通过内存共享和直接对象传递的方式进行通信, 轻雪提供了一个通道Channel用于跨进程通信, 你可以通过Channel发送消息给其他进程,也可以监听其他进程的消息。

例如子进程接收到用户信息需要重启机器人,这时可以通过通道对主进程发送消息,主进程接收到消息后重启对应子进程。

示例

通道是全双工的,有两种接收模式,但一个通道只能使用一种,即被动模式和主动模式,被动模式由chan.on_receive()装饰回调函数实现,主动模式需调用chan.receive()实现

  • 创建子进程的同时会初始化一个被动通道和一个主动通道,且通道标识为{process_name}-active{process_name}-passive
  • 主进程中通过get_channel函数获取通道对象
  • 子进程中导入单例active_channelpassive_channel即可

在轻雪插件中(主进程中)

python
import asyncio
+
+from liteyuki.comm import get_channel, Channel
+from liteyuki import get_bot
+
+# get_channel函数获取通道对象,参数为调用set_channel时的通道标识
+channel_passive = get_channel("nonebot-passive")  # 获取被动通道
+channel_active = get_channel("nonebot-active")  # 获取主动通道
+liteyuki_bot = get_bot()
+
+
+# 注册一个函数在轻雪启动后运行
+@liteyuki_bot.on_after_start
+async def send_data():
+    while True:
+        channel_passive.send("I am liteyuki main process passive")
+        channel_active.send("I am liteyuki main process active")
+        await asyncio.sleep(3)  # 每3秒发送一次消息

在子进程中(例如NoneBot插件中)

python
from nonebot import get_driver
+from liteyuki.comm import active_channel, passive_channel  # 子进程中获取通道直接导入进程全局单例即可
+from liteyuki.log import logger
+
+driver = get_driver()
+
+
+# 被动模式,通过装饰器注册一个函数在接收到消息时运行,每次接收到字符串数据时都会运行
+@passive_channel.on_receive(filter_func=lambda data: isinstance(data, str))
+async def on_passive_receive(data):
+    logger.info(f"Passive receive: {data}")
+
+
+# 注册一个函数在NoneBot启动后运行
+@driver.on_startup
+def on_startup():
+    while True:
+        data = active_channel.receive()
+        logger.info(f"Active receive: {data}")

启动后控制台输出

log
0000-00-00 00:00:00 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:00 [ℹ️信息] Active receive: I am liteyuki main process active
+0000-00-00 00:00:03 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:03 [ℹ️信息] Active receive: I am liteyuki main process active
+...

共享内存通信

简介

  • 相比于普通进程通信,内存共享使得代码编写更加简洁,轻雪框架提供了一个内存共享通信的接口,你可以通过storage模块实现内存共享通信,该模块封装通道实现
  • 内存共享是线程安全的,你可以在多个线程中读写共享内存,线程锁会自动保护共享内存的读写操作

示例

在任意进程中均可使用

python
from liteyuki.comm.storage import shared_memory
+
+shared_memory.set("key", "value")  # 设置共享内存
+value = shared_memory.get("key")  # 获取共享内存

源代码:liteyuki/comm/storage.py

`,20),l=[h];function t(p,k,r,d,E,o){return a(),i("div",null,l)}const y=s(e,[["render",t]]);export{g as __pageData,y as default}; diff --git a/assets/dev_comm.md.BaLcrxQn.lean.js b/assets/dev_comm.md.BaLcrxQn.lean.js new file mode 100644 index 00000000..106f26d4 --- /dev/null +++ b/assets/dev_comm.md.BaLcrxQn.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"进程通信","description":"","frontmatter":{"title":"进程通信","order":4},"headers":[],"relativePath":"dev/comm.md","filePath":"zh/dev/comm.md","lastUpdated":1725102337000}'),e={name:"dev/comm.md"},h=n("",20),l=[h];function t(p,k,r,d,E,o){return a(),i("div",null,l)}const y=s(e,[["render",t]]);export{g as __pageData,y as default}; diff --git a/assets/dev_lyfunc.md.DGSAE6Uz.js b/assets/dev_lyfunc.md.DGSAE6Uz.js new file mode 100644 index 00000000..9359c45a --- /dev/null +++ b/assets/dev_lyfunc.md.DGSAE6Uz.js @@ -0,0 +1,20 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"轻雪函数","description":"","frontmatter":{"title":"轻雪函数","order":2},"headers":[],"relativePath":"dev/lyfunc.md","filePath":"zh/dev/lyfunc.md","lastUpdated":1725101868000}'),t={name:"dev/lyfunc.md"},l=n(`

轻雪函数

轻雪函数 Liteyuki Function 是轻雪的一个功能,它允许你在轻雪中运行一些自定义的由数据驱动的命令,类似于Minecraft的mcfunction,属于资源包的一部分,但需单独起篇幅.

函数文件

函数文件放在资源包的functions目录下,文件名以.mcfunction .lyfunction .lyf结尾,例如test.mcfunction,文件内容为一系列的命令,每行一个命令,支持单行注释#(编辑时的语法高亮可采取shell格式),例如:

shell
# 在发信器输出"hello world"
+cmd echo hello world
+
+# 如果你想同时输出多行内容可以尝试换行符(Python格式)
+cmd echo hello world\\nLiteyuki bot

也支持句末注释,例如:

shell
cmd echo hello world # 输出"hello world"

命令文档

shell
var <var1=value1> [var2=value2] ...  # 定义变量
+cmd <command>  # 在设备上执行命令
+api <api_name> [var=value...]  # 调用Bot API
+function <func_name> # 调用函数,可递归
+sleep <time>  # 异步等待,单位s
+nohup <command>  # 使用新的task执行命令,即不等待
+end # 结束函数关键字,包括子task
+await # 等待所有异步任务结束,若函数中启动了其他task,需要在最后调用,否则task对象会被销毁

示例

shell
# 疯狂戳好友
+# 使用 /function poke user_id=123456 执行
+# 每隔0.2s戳两次,无限戳,会触发最大递归深度限制
+# 若要戳20s后停止,则需要删除await,添加sleep 20和end
+api friend_poke user_id=user_id
+api friend_poke user_id=user_id
+sleep 0.2
+nohup function poke
+await

API

理论上所有基于onebotv11的api都可调用,不同Adapter api也有差别.

Onebot v11 API文档

结束关键字

由于LiteyukiBot基于异步运行, 所以在编写lyfunction时也要注意异步的调用,避免出现"单线程走到底"的情况是效率提升的关键.

await 异步任务结束关键字,用于结束当前已完成function的执行

WARNING

但若出现非单function的情况,有一个task任务没有完成而await被执行了,那么当前所有函数包的task都会被截停销毁

TIP

编写轻雪函数推荐你使用VS Code插件Liteyuki Function实现语法高亮

`,19),e=[l];function h(p,k,d,r,o,c){return a(),i("div",null,e)}const y=s(t,[["render",h]]);export{F as __pageData,y as default}; diff --git a/assets/dev_lyfunc.md.DGSAE6Uz.lean.js b/assets/dev_lyfunc.md.DGSAE6Uz.lean.js new file mode 100644 index 00000000..b82a4077 --- /dev/null +++ b/assets/dev_lyfunc.md.DGSAE6Uz.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"轻雪函数","description":"","frontmatter":{"title":"轻雪函数","order":2},"headers":[],"relativePath":"dev/lyfunc.md","filePath":"zh/dev/lyfunc.md","lastUpdated":1725101868000}'),t={name:"dev/lyfunc.md"},l=n("",19),e=[l];function h(p,k,d,r,o,c){return a(),i("div",null,e)}const y=s(t,[["render",h]]);export{F as __pageData,y as default}; diff --git a/assets/dev_plugin.md.7WyHaDzB.js b/assets/dev_plugin.md.7WyHaDzB.js new file mode 100644 index 00000000..8413211a --- /dev/null +++ b/assets/dev_plugin.md.7WyHaDzB.js @@ -0,0 +1,32 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"轻雪插件开发","description":"","frontmatter":{"title":"轻雪插件开发","order":3},"headers":[],"relativePath":"dev/plugin.md","filePath":"zh/dev/plugin.md","lastUpdated":1725101868000}'),t={name:"dev/plugin.md"},h=n(`

简介

轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能

开始

创建插件

一个.py文件或一个包含__init__.py的文件夹即可被识别为插件

首先创建一个文件夹,例如watchdog_plugin,并在其中创建一个__init__.py文件,即可创建一个插件

__init__.py

python
from liteyuki.plugin import PluginMetadata, PluginType
+from .watch_dog import *    # 导入逻辑部分
+
+# 定义插件元数据
+__plugin_meta__ = PluginMetadata(
+    name="NoneDog",  # 插件名称
+    version="1.0.0",  # 插件版本
+    description="A simple plugin for nonebot developer",  # 插件描述
+    type=PluginType.SERVICE  # 插件类型
+)
+
+# 你的插件代码
+...

编写逻辑部分

轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信 以下我们会编写一个简单的插件,用于开发NoneBot时进行文件系统变更重载 watch_dog.py

python
import os
+from liteyuki.dev import observer  # 导入文件系统观察器
+from liteyuki import get_bot, logger  # 导入轻雪Bot和日志
+from watchdog.events import FileSystemEvent  # 导入文件系统事件
+
+liteyuki = get_bot()  # 获取唯一的轻雪Bot实例
+
+exclude_extensions = (".pyc", ".pyo")  # 排除的文件扩展名
+
+
+# 用observer的on_file_system_event装饰器监听文件系统事件
+@observer.on_file_system_event(
+    directories=("src/nonebot_plugins",),
+    event_filter=lambda event: not event.src_path.endswith(exclude_extensions) and ("__pycache__" not in event.src_path) and os.path.isfile(event.src_path)
+)
+def restart_nonebot_process(event: FileSystemEvent):
+    logger.debug(f"File {event.src_path} changed, reloading nonebot...")
+    liteyuki.restart_process("nonebot")  # 调用重启进程方法

加载插件

方法1

  • 在配置文件中的liteyuki.plugins中添加你的插件路径,例如watchdog_plugin,重启轻雪即可加载插件。

方法2

  • 使用开发工具快速运行插件,无需手动创建实例
  • 创建入口文件,例如main.py,并在其中写入以下代码
python
from liteyuki.dev.plugin import run_plugins
+
+run_plugins("watchdog_plugin")

然后运行python main.py即可启动插件

启用插件后,我们在src/nonebot_plugins下创建一个文件,例如test.py,并在其中写入一些代码,保存后轻雪会自动重载NoneBot进程

`,19),l=[h];function p(e,k,d,r,E,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default}; diff --git a/assets/dev_plugin.md.7WyHaDzB.lean.js b/assets/dev_plugin.md.7WyHaDzB.lean.js new file mode 100644 index 00000000..7247ade3 --- /dev/null +++ b/assets/dev_plugin.md.7WyHaDzB.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"轻雪插件开发","description":"","frontmatter":{"title":"轻雪插件开发","order":3},"headers":[],"relativePath":"dev/plugin.md","filePath":"zh/dev/plugin.md","lastUpdated":1725101868000}'),t={name:"dev/plugin.md"},h=n("",19),l=[h];function p(e,k,d,r,E,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default}; diff --git a/assets/dev_resource.md.DU3Q8OBq.js b/assets/dev_resource.md.DU3Q8OBq.js new file mode 100644 index 00000000..5956b2ca --- /dev/null +++ b/assets/dev_resource.md.DU3Q8OBq.js @@ -0,0 +1,13 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"资源包开发","description":"","frontmatter":{"title":"资源包开发","order":1},"headers":[],"relativePath":"dev/resource.md","filePath":"zh/dev/resource.md","lastUpdated":1725102337000}'),l={name:"dev/resource.md"},t=e(`

简介

资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码

  • 资源/主题商店提供了一些资源包供你选择,你也可以自己制作资源包
  • 资源包的制作很简单,如果你接触过Minecraft的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。
  • 部分内容制作需要一点点前端基础,例如htmlcss
  • 轻雪原版资源包请查看LiteyukiBot/liteyuki/resources,可以在此基础上进行修改
  • 欢迎各位投稿资源包到轻雪资源商店

请注意,主题包中的html渲染使用Js来规定数据的渲染位置,请确保您所编写的html代码能被Bot解析,否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码,以避免出现无法预料的问题。


加载资源包

  • 资源包通常是以.zip格式压缩的,只需要将其解压到根目录resources目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的
shell
main.py
+resources
+└─resource_pack_1
+    ├─metadata.yml
+    ├─templates
+    └───...
+└─resource_pack_2
+    ├─metadata.yml
+    └─...
  • 你自己制作的资源包也应该遵循这个规则,并且应该在metadata.yml中填写一些信息
  • 若没有metadata.yml文件,则该文件夹不会被识别为资源包
yaml
name: "资源包名称"
+version: "1.0.0"
+description: "资源包描述"
+# 你可以自定义一些信息,但请保证以上三个字段
+...
  • 资源包加载遵循一个优先级,即后加载的资源包会覆盖前面的资源包,例如,你在A包中定义了一个index.html文件,B包也定义了一个index.html文件,那么加载B包后,A包中的index.html文件会被覆盖
  • 对于不同资源包的不同文件,是可以相对引用的,例如你在A中定义了templates/index.html,在B中定义了templates/style.css,可以在A的index.html中用./style.css相对路径引用B中的css

TIP

资源包的结构会随着轻雪的更新而有变动,第三方资源包开发者需要注意版本兼容性,同时用户也应该自行选择可用的资源包

`,12),n=[t];function p(c,h,d,o,r,k){return i(),a("div",null,n)}const y=s(l,[["render",p]]);export{m as __pageData,y as default}; diff --git a/assets/dev_resource.md.DU3Q8OBq.lean.js b/assets/dev_resource.md.DU3Q8OBq.lean.js new file mode 100644 index 00000000..5733c363 --- /dev/null +++ b/assets/dev_resource.md.DU3Q8OBq.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"资源包开发","description":"","frontmatter":{"title":"资源包开发","order":1},"headers":[],"relativePath":"dev/resource.md","filePath":"zh/dev/resource.md","lastUpdated":1725102337000}'),l={name:"dev/resource.md"},t=e("",12),n=[t];function p(c,h,d,o,r,k){return i(),a("div",null,n)}const y=s(l,[["render",p]]);export{m as __pageData,y as default}; diff --git a/assets/en_deploy_config.md.CB-Epa0p.js b/assets/en_deploy_config.md.CB-Epa0p.js new file mode 100644 index 00000000..76c01eed --- /dev/null +++ b/assets/en_deploy_config.md.CB-Epa0p.js @@ -0,0 +1,29 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"Configurations","description":"","frontmatter":{"title":"Configurations","order":2},"headers":[],"relativePath":"en/deploy/config.md","filePath":"en/deploy/config.md","lastUpdated":1725101868000}'),e={name:"en/deploy/config.md"},n=t(`

Configurations

LiteyukiBot supports yaml, json, and toml as configuration files, depending on your personal preference.

When you first run LiteyukiBot, it will generate config.yml and the config directory. You can modify the configuration items and restart LiteyukiBot. In most cases, you only need to modify the superusers and nickname fields.

When starting, LiteyukiBot will load all configuration files in the project directory config.yml/yaml/json/toml and the config directory. You can create multiple configuration files in the config directory, and LiteyukiBot will automatically merge these configuration files.

Basic Configuration

yaml
# NoneBot configuration
+nonebot:
+  command_start: [ "/", "" ] # Command prefix, if there is no "" empty command header, please enable alconna_use_command_start to ensure alconna parsing is normal
+  host: 127.0.0.1 # Listening address, default is local, if you want to receive external requests, please fill in
+  port: 20216 # Binding port
+  nickname: [ "liteyuki" ]  # Bot nickname list
+  superusers: [ "1919810" ]  # Superuser list
+liteyuki:
+  log_level: "INFO" # Log level
+  log_icon: true # Whether to display the log level icon (some console fonts are not available)
+  auto_report: true # Whether to automatically report problems to Liteyuki server
+  auto_update: true # Whether to automatically update Liteyuki, check for updates at 4 am every day
+  plugins: [ ] # Liteyuki plugin list
+  plugin_dirs: [ ] # Liteyuki plugin directory list

Other configurations

The following is the default value. If you need to customize it, please add it manually

yaml
# Advanced configuration
+nonebot:
+  onebot_access_token: "" # OneBot access token
+  default_language: "zh-CN" # Default language
+  alconna_auto_completion: false # alconna auto completion
+  safe_mode: false # Safe mode, if true, the bot will not load any plugins
+  # other nonebot configurations
+  custom_config_1: "custom_value1"
+  custom_config_2: "custom_value2"
+
+# development configuration
+liteyuki:
+  allow_update: true # Whether to allow Liteyuki to update
+  debug: false  # Debug mode, if true, Liteyuki will output more detailed logs
+  dev_mode: false # development mode, if true, Liteyuki will load all plugins in the development directory
+...
yaml

Example: Configuration of OneBot implementation side connected to NoneBot

In production environments, it is recommended to use reverse WebSocket The fields provided by different implementation sides may be different, but basically the same. Here is a reference value

FieldsValueDescription
protocolReverse WebSocketLiteyuki-NoneBot as server
addressws://127.0.0.1:20216/onebot/v11/wsThe address depends on the configuration file, the default is \`
AccessToken""If you have configured AccessToken for Liteyuki, please fill in the same value here
  • To use other communication methods, please visit OneBot Adapter for detailed information

Other

  • Liteyuki is not limited to the OneBot adapter and NoneBot2. You can use any adapter supported by NoneBot2 or use the Liteyuki message delivery plugin
`,16),l=[n];function o(h,p,k,r,d,c){return a(),i("div",null,l)}const y=s(e,[["render",o]]);export{u as __pageData,y as default}; diff --git a/assets/en_deploy_config.md.CB-Epa0p.lean.js b/assets/en_deploy_config.md.CB-Epa0p.lean.js new file mode 100644 index 00000000..9aabda2e --- /dev/null +++ b/assets/en_deploy_config.md.CB-Epa0p.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"Configurations","description":"","frontmatter":{"title":"Configurations","order":2},"headers":[],"relativePath":"en/deploy/config.md","filePath":"en/deploy/config.md","lastUpdated":1725101868000}'),e={name:"en/deploy/config.md"},n=t("",16),l=[n];function o(h,p,k,r,d,c){return a(),i("div",null,l)}const y=s(e,[["render",o]]);export{u as __pageData,y as default}; diff --git a/assets/en_deploy_fandq.md.lp1l61Jw.js b/assets/en_deploy_fandq.md.lp1l61Jw.js new file mode 100644 index 00000000..57a031fa --- /dev/null +++ b/assets/en_deploy_fandq.md.lp1l61Jw.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a4 as n}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"FAQ","description":"","frontmatter":{"title":"FAQ","order":3},"headers":[],"relativePath":"en/deploy/fandq.md","filePath":"en/deploy/fandq.md","lastUpdated":1725101868000}'),a={name:"en/deploy/fandq.md"},r=n('

FAQ

Frequently Asked Questions

  • There are too many python interpreters on my computer, how do I know which one to use?

    • You can specify which python interpreter to use by using the full path to the python executable, for example, /path/to/python main.py
    • Use virtual environments to avoid conflicts between different python interpreters
  • Why does the bot not respond after I start it?

    • Please check the configuration file command_start or superusers, make sure you have permission to use the command and send it correctly
    • Make sure the command header does not conflict with nickname{}, for example, a command is help, but the Bot nickname has a help, then it will be parsed as a nickname instead of a command
  • Update Liteyuki failed, error InvalidGitRepositoryError

    • Please install Git correctly and deploy Liteyuki using cloning instead of direct download
  • How to log in to chat platforms such as Telegram?

    • If you have this question, it means you don't know much about this project. This project does not implement the login function, only the message processing and response. The login function is provided by the implementation side (protocol side). The implementation side itself does not handle response logic. It processes and reports messages to Liteyuki according to the OneBot standard. You need to use an implementation side that complies with the OneBot standard to connect to Liteyuki and report messages to Liteyuki. Some recommended implementation sides have been listed below
  • Playwright installation failed

    • Enter playwright install to install the browser
  • Some plugins report errors after installation and cannot be started

    • Please refer to the plugin documentation first, confirm that the necessary configuration items of the plugin are intact, and if the problem persists, please contact the plugin author or start Liteyuki in safe mode safe_mode: true. In safe mode, you can use npm uninstall to uninstall problematic plugins

Other questions

  1. Lagrange.OneBot, based on Lagrange.Core, a Linux QQ implementation, supports OneBotv11 protocol
  2. LLOneBot, a plugin for Liteloader NTQQ, supports OneBotv11 protocol
  3. OpenShamrock, based on Lsposed, supports kritor protocol
  4. TRSS-Yunzai, based on Node.js, supports OneBotv11 protocol
  5. go-cqhttp,A QQ Client based on go, supports OneBotv11 protocol
  6. Gensokyo, use QQ protocol
  1. MinecraftOneBot, We develop a Minecraft server chat bot

Other project encountered issues, please prioritize the documentation and issues of the project itself, don't ask LiteyukiBot developers

Acknowledgements

',12),i=[r];function l(s,d,c,h,p,u){return t(),o("div",null,i)}const g=e(a,[["render",l]]);export{f as __pageData,g as default}; diff --git a/assets/en_deploy_fandq.md.lp1l61Jw.lean.js b/assets/en_deploy_fandq.md.lp1l61Jw.lean.js new file mode 100644 index 00000000..42f2b007 --- /dev/null +++ b/assets/en_deploy_fandq.md.lp1l61Jw.lean.js @@ -0,0 +1 @@ +import{_ as e,c as o,o as t,a4 as n}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"FAQ","description":"","frontmatter":{"title":"FAQ","order":3},"headers":[],"relativePath":"en/deploy/fandq.md","filePath":"en/deploy/fandq.md","lastUpdated":1725101868000}'),a={name:"en/deploy/fandq.md"},r=n("",12),i=[r];function l(s,d,c,h,p,u){return t(),o("div",null,i)}const g=e(a,[["render",l]]);export{f as __pageData,g as default}; diff --git a/assets/en_deploy_install.md.BnEnd6Nu.js b/assets/en_deploy_install.md.BnEnd6Nu.js new file mode 100644 index 00000000..67e29946 --- /dev/null +++ b/assets/en_deploy_install.md.BnEnd6Nu.js @@ -0,0 +1,8 @@ +import{_ as e,c as t,o as i,a4 as a}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"Install","description":"","frontmatter":{"title":"Install","order":1},"headers":[],"relativePath":"en/deploy/install.md","filePath":"en/deploy/install.md","lastUpdated":1725102337000}'),s={name:"en/deploy/install.md"},o=a(`

Install

Normal Installation

  1. Install Git and Python3.10+ Environment.
bash
# Clone the project
+git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
+# change directory
+cd LiteyukiBot
+# install dependencies
+pip install -r requirements.txt
+# start the bot!
+python main.py

TIP

It is recommended to use a virtual environment to run Liteyuki to avoid dependency conflicts. You can use python -m venv .venv to create a virtual environment, and then use .venv\\Scripts\\activate to activate the virtual environment (use source .venv/bin/activate to activate on Linux).

Run with Docker

  1. Install Docker
  2. Clone Repo git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
  3. Change directory cd LiteyukiBot
  4. Build docker image docker build -t liteyukibot .
  5. Run container docker run -p 20216:20216 -v $(pwd):/liteyukibot -v $(pwd)/.cache:/root/.cache liteyukibot

TIP

If you are using Windows, please use the absolute project directory /path/to/LiteyukiBot instead of $&#40;pwd&#41;
If you have modified the port number, please replace 20216:20216 with your port number

Use TRSS Script

TRSS_Liteyuki Management Script, which provides a more convenient way to manage LiteyukiBot, recommended to use Arch Linux

Device Requirements

  • Windows system version minimum Windows10+/Windows Server 2019+
  • Linux system requires Python3.10+, recommended Ubuntu 20.04+
  • CPU: at least 1vCPU
  • Memory: Bot without other plugins will occupy 300~500MB, including chromium and node processes, other plugins depend on specific plugins, recommended 1GB or more
  • Disk: at least 1GB of space

WARNING

If there are multiple environments on the device, please use path/to/python -m pip install -r requirements.txt to install dependencies, path/to/python is the path to your Python executable

WARNING

Liteyuki's update function depends on Git. If you do not have Git installed and run the source code directly, you will not be able to use the update function

For other questions, please refer to FAQ

`,15),n=[o];function l(r,c,d,h,p,u){return i(),t("div",null,n)}const y=e(s,[["render",l]]);export{m as __pageData,y as default}; diff --git a/assets/en_deploy_install.md.BnEnd6Nu.lean.js b/assets/en_deploy_install.md.BnEnd6Nu.lean.js new file mode 100644 index 00000000..f412935a --- /dev/null +++ b/assets/en_deploy_install.md.BnEnd6Nu.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i,a4 as a}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"Install","description":"","frontmatter":{"title":"Install","order":1},"headers":[],"relativePath":"en/deploy/install.md","filePath":"en/deploy/install.md","lastUpdated":1725102337000}'),s={name:"en/deploy/install.md"},o=a("",15),n=[o];function l(r,c,d,h,p,u){return i(),t("div",null,n)}const y=e(s,[["render",l]]);export{m as __pageData,y as default}; diff --git a/assets/en_dev_api_api.md.D-5_3fUd.js b/assets/en_dev_api_api.md.D-5_3fUd.js new file mode 100644 index 00000000..13d486e0 --- /dev/null +++ b/assets/en_dev_api_api.md.D-5_3fUd.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"en/dev/api/api.md","filePath":"en/dev/api/api.md","lastUpdated":null}'),o={name:"en/dev/api/api.md"},r=i('

liteyuki

var __version__

  • Description: 测试版本号

  • Default: '6.3.10'

',3),n=[r];function l(s,_,c,d,p,u){return t(),a("div",null,n)}const f=e(o,[["render",l]]);export{v as __pageData,f as default}; diff --git a/assets/en_dev_api_api.md.D-5_3fUd.lean.js b/assets/en_dev_api_api.md.D-5_3fUd.lean.js new file mode 100644 index 00000000..9a013d86 --- /dev/null +++ b/assets/en_dev_api_api.md.D-5_3fUd.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"en/dev/api/api.md","filePath":"en/dev/api/api.md","lastUpdated":null}'),o={name:"en/dev/api/api.md"},r=i("",3),n=[r];function l(s,_,c,d,p,u){return t(),a("div",null,n)}const f=e(o,[["render",l]]);export{v as __pageData,f as default}; diff --git a/assets/en_dev_api_bot_bot.md.D0tmeTXy.js b/assets/en_dev_api_bot_bot.md.D0tmeTXy.js new file mode 100644 index 00000000..1a468851 --- /dev/null +++ b/assets/en_dev_api_bot_bot.md.D0tmeTXy.js @@ -0,0 +1,211 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"en/dev/api/bot/bot.md","filePath":"en/dev/api/bot/bot.md","lastUpdated":null}'),t={name:"en/dev/api/bot/bot.md"},e=n(`

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

Description: 初始化轻雪实例

Arguments:

  • *args:
  • **kwargs: 配置
Source code or View on GitHub
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

Description: 启动逻辑

Source code or View on GitHub
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

Description: 外部启动接口

Source code or View on GitHub
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

Description: 保持轻雪运行

Source code or View on GitHub
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

Description: 信号处理

Arguments:

  • signum:
  • frame:
Source code or View on GitHub
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

Description: 重启轻雪本体

Source code or View on GitHub
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

Description: 停止轻雪

Arguments:

  • name: 进程名称, 默认为None, 所有进程
Source code or View on GitHub
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

Description: 初始化轻雪, 自动调用

Source code or View on GitHub
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

Source code or View on GitHub
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

Description: 停止轻雪

Source code or View on GitHub
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

Description: 注册启动前的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

Description: 注册启动后的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册停止后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册进程停止前的函数,为子进程停止时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

Description: 注册进程重启前的函数,为子进程重启时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

Description: 注册重启后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

Description: 获取轻雪实例

Return: LiteyukiBot: 当前的轻雪实例

Source code or View on GitHub
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

Description: 获取配置

Arguments:

  • key: 配置键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

Description: 获取配置,兼容旧版本

Arguments:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
Source code or View on GitHub
python
def print_logo():
+    print('\\x1b[34m' + '\\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \\n    /  |      /      |/        |/        |/  \\\\    /  |/  |  /  |/  |  /  |/      |\\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\\\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \\n    $$ |        $$ |     $$ |   $$ |__     $$  \\\\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \\n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \\n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\\\    $$ |  \\n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\\\__$$ |$$ |$$  \\\\  _$$ |_ \\n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \\n                ' + '\\x1b[0m')
`,85),l=[e];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/en_dev_api_bot_bot.md.D0tmeTXy.lean.js b/assets/en_dev_api_bot_bot.md.D0tmeTXy.lean.js new file mode 100644 index 00000000..582bfaa1 --- /dev/null +++ b/assets/en_dev_api_bot_bot.md.D0tmeTXy.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"en/dev/api/bot/bot.md","filePath":"en/dev/api/bot/bot.md","lastUpdated":null}'),t={name:"en/dev/api/bot/bot.md"},e=n("",85),l=[e];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/en_dev_api_bot_index.md.LrWFTh2D.js b/assets/en_dev_api_bot_index.md.LrWFTh2D.js new file mode 100644 index 00000000..27bf00de --- /dev/null +++ b/assets/en_dev_api_bot_index.md.LrWFTh2D.js @@ -0,0 +1,211 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"en/dev/api/bot/index.md","filePath":"en/dev/api/bot/index.md","lastUpdated":null}'),t={name:"en/dev/api/bot/index.md"},e=n(`

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

Description: 初始化轻雪实例

Arguments:

  • *args:
  • **kwargs: 配置
Source code or View on GitHub
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

Description: 启动逻辑

Source code or View on GitHub
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

Description: 外部启动接口

Source code or View on GitHub
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

Description: 保持轻雪运行

Source code or View on GitHub
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

Description: 信号处理

Arguments:

  • signum:
  • frame:
Source code or View on GitHub
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

Description: 重启轻雪本体

Source code or View on GitHub
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

Description: 停止轻雪

Arguments:

  • name: 进程名称, 默认为None, 所有进程
Source code or View on GitHub
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

Description: 初始化轻雪, 自动调用

Source code or View on GitHub
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

Source code or View on GitHub
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

Description: 停止轻雪

Source code or View on GitHub
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

Description: 注册启动前的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

Description: 注册启动后的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册停止后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册进程停止前的函数,为子进程停止时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

Description: 注册进程重启前的函数,为子进程重启时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

Description: 注册重启后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

Description: 获取轻雪实例

Return: LiteyukiBot: 当前的轻雪实例

Source code or View on GitHub
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

Description: 获取配置

Arguments:

  • key: 配置键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

Description: 获取配置,兼容旧版本

Arguments:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
Source code or View on GitHub
python
def print_logo():
+    print('\\x1b[34m' + '\\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \\n    /  |      /      |/        |/        |/  \\\\    /  |/  |  /  |/  |  /  |/      |\\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\\\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \\n    $$ |        $$ |     $$ |   $$ |__     $$  \\\\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \\n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \\n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\\\    $$ |  \\n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\\\__$$ |$$ |$$  \\\\  _$$ |_ \\n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \\n                ' + '\\x1b[0m')
`,85),l=[e];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/en_dev_api_bot_index.md.LrWFTh2D.lean.js b/assets/en_dev_api_bot_index.md.LrWFTh2D.lean.js new file mode 100644 index 00000000..59d1aab4 --- /dev/null +++ b/assets/en_dev_api_bot_index.md.LrWFTh2D.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.bot","description":"","frontmatter":{"title":"liteyuki.bot","collapsed":true},"headers":[],"relativePath":"en/dev/api/bot/index.md","filePath":"en/dev/api/bot/index.md","lastUpdated":null}'),t={name:"en/dev/api/bot/index.md"},e=n("",85),l=[e];function h(p,k,r,d,o,g){return a(),i("div",null,l)}const F=s(t,[["render",h]]);export{y as __pageData,F as default}; diff --git a/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.js b/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.js new file mode 100644 index 00000000..cd82bb55 --- /dev/null +++ b/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.js @@ -0,0 +1,114 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.bot.lifespan","description":"","frontmatter":{"title":"liteyuki.bot.lifespan"},"headers":[],"relativePath":"en/dev/api/bot/lifespan.md","filePath":"en/dev/api/bot/lifespan.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/bot/lifespan.md"},e=n(`

liteyuki.bot.lifespan

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午8:24 @Author : snowykami @Email : snowykami@outlook.com @File : lifespan.py @Software: PyCharm

class Lifespan

def __init__(self) -> None

Description: 轻雪生命周期管理,启动、停止、重启

Source code or View on GitHub
python
def __init__(self) -> None:
+    """
+        轻雪生命周期管理,启动、停止、重启
+        """
+    self.life_flag: int = 0
+    self._before_start_funcs: list[LIFESPAN_FUNC] = []
+    self._after_start_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._after_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_restart_funcs: list[LIFESPAN_FUNC] = []
+    self._after_restart_funcs: list[LIFESPAN_FUNC] = []

@staticmethod

async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None

Description: 并发运行异步函数

Arguments:

  • funcs:
Source code or View on GitHub
python
@staticmethod
+async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None:
+    """
+        并发运行异步函数
+        Args:
+            funcs:
+        Returns:
+        """
+    loop = asyncio.get_running_loop()
+    tasks = [func(*args, **kwargs) if is_coroutine_callable(func) else async_wrapper(func)(*args, **kwargs) for func in funcs]
+    await asyncio.gather(*tasks)

def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册启动时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_start_funcs.append(func)
+    return func

def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册启动时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_start_funcs.append(func)
+    return func

def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册停止前的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止前的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_shutdown_funcs.append(func)
+    return func

def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册停止后的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止后的函数
+        Args:
+            func:
+
+        Returns:
+            LIFESPAN_FUNC:
+
+        """
+    self._after_shutdown_funcs.append(func)
+    return func

def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册重启时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_restart_funcs.append(func)
+    return func

def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册重启后的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启后的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_restart_funcs.append(func)
+    return func

async def before_start(self) -> None

Description: 启动前

Source code or View on GitHub
python
async def before_start(self) -> None:
+    """
+        启动前
+        Returns:
+        """
+    logger.debug('Running before_start functions')
+    await self.run_funcs(self._before_start_funcs)

async def after_start(self) -> None

Description: 启动后

Source code or View on GitHub
python
async def after_start(self) -> None:
+    """
+        启动后
+        Returns:
+        """
+    logger.debug('Running after_start functions')
+    await self.run_funcs(self._after_start_funcs)

async def before_process_shutdown(self) -> None

Description: 停止前

Source code or View on GitHub
python
async def before_process_shutdown(self) -> None:
+    """
+        停止前
+        Returns:
+        """
+    logger.debug('Running before_shutdown functions')
+    await self.run_funcs(self._before_process_shutdown_funcs)

async def after_shutdown(self) -> None

Description: 停止后

Source code or View on GitHub
python
async def after_shutdown(self) -> None:
+    """
+        停止后
+        Returns:
+        """
+    logger.debug('Running after_shutdown functions')
+    await self.run_funcs(self._after_shutdown_funcs)

async def before_process_restart(self) -> None

Description: 重启前

Source code or View on GitHub
python
async def before_process_restart(self) -> None:
+    """
+        重启前
+        Returns:
+        """
+    logger.debug('Running before_restart functions')
+    await self.run_funcs(self._before_process_restart_funcs)

async def after_restart(self) -> None

Description: 重启后

Source code or View on GitHub
python
async def after_restart(self) -> None:
+    """
+        重启后
+        Returns:
+
+        """
+    logger.debug('Running after_restart functions')
+    await self.run_funcs(self._after_restart_funcs)
`,67),l=[e];function p(h,k,r,o,d,g){return a(),i("div",null,l)}const E=s(t,[["render",p]]);export{u as __pageData,E as default}; diff --git a/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.lean.js b/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.lean.js new file mode 100644 index 00000000..188301be --- /dev/null +++ b/assets/en_dev_api_bot_lifespan.md.EgH0pEuD.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.bot.lifespan","description":"","frontmatter":{"title":"liteyuki.bot.lifespan"},"headers":[],"relativePath":"en/dev/api/bot/lifespan.md","filePath":"en/dev/api/bot/lifespan.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/bot/lifespan.md"},e=n("",67),l=[e];function p(h,k,r,o,d,g){return a(),i("div",null,l)}const E=s(t,[["render",p]]);export{u as __pageData,E as default}; diff --git a/assets/en_dev_api_comm_channel.md.BLjPtV1B.js b/assets/en_dev_api_comm_channel.md.BLjPtV1B.js new file mode 100644 index 00000000..4354d4b0 --- /dev/null +++ b/assets/en_dev_api_comm_channel.md.BLjPtV1B.js @@ -0,0 +1,196 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.channel","description":"","frontmatter":{"title":"liteyuki.comm.channel"},"headers":[],"relativePath":"en/dev/api/comm/channel.md","filePath":"en/dev/api/comm/channel.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/comm/channel.md"},l=n(`

liteyuki.comm.channel

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午11:21 @Author : snowykami @Email : snowykami@outlook.com @File : channel_.py @Software: PyCharm

本模块定义了一个通用的通道类,用于进程间通信

class Channel(Generic[T])

def __init__(self, name: str, type_check: Optional[bool] = None)

Description: 初始化通道

Arguments:

  • name: 通道ID
  • type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
Source code or View on GitHub
python
def __init__(self, name: str, type_check: Optional[bool]=None):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+            type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
+        """
+    self.conn_send, self.conn_recv = Pipe()
+    self._conn_send_inner, self._conn_recv_inner = Pipe()
+    self._closed = False
+    self._on_main_receive_func_ids: list[int] = []
+    self._on_sub_receive_func_ids: list[int] = []
+    self.name: str = name
+    self.is_receive_loop_running = False
+    if type_check is None:
+        type_check = self._get_generic_type() is not None
+    elif type_check:
+        if self._get_generic_type() is None:
+            raise TypeError('Type hint is required for enforcing type check.')
+    self.type_check = type_check
+    if name in _channel:
+        raise ValueError(f'Channel {name} already exists')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = self
+        logger.debug(f'Channel {name} initialized in main process')
+    else:
+        logger.debug(f'Channel {name} initialized in sub process, should manually set in main process')

def _get_generic_type(self) -> Optional[type]

Description: 获取通道传递泛型类型

Return: Optional[type]: 泛型类型

Source code or View on GitHub
python
def _get_generic_type(self) -> Optional[type]:
+    """
+        获取通道传递泛型类型
+
+        Returns:
+            Optional[type]: 泛型类型
+        """
+    if hasattr(self, '__orig_class__'):
+        return get_args(self.__orig_class__)[0]
+    return None

def _validate_structure(self, data: Any, structure: type) -> bool

Description: 验证数据结构

Arguments:

  • data: 数据
  • structure: 结构

Return: bool: 是否通过验证

Source code or View on GitHub
python
def _validate_structure(self, data: Any, structure: type) -> bool:
+    """
+        验证数据结构
+        Args:
+            data: 数据
+            structure: 结构
+
+        Returns:
+            bool: 是否通过验证
+        """
+    if isinstance(structure, type):
+        return isinstance(data, structure)
+    elif isinstance(structure, tuple):
+        if not isinstance(data, tuple) or len(data) != len(structure):
+            return False
+        return all((self._validate_structure(d, s) for d, s in zip(data, structure)))
+    elif isinstance(structure, list):
+        if not isinstance(data, list):
+            return False
+        return all((self._validate_structure(d, structure[0]) for d in data))
+    elif isinstance(structure, dict):
+        if not isinstance(data, dict):
+            return False
+        return all((k in data and self._validate_structure(data[k], structure[k]) for k in structure))
+    return False

def send(self, data: T)

Description: 发送数据,发送函数为同步函数,没有异步的必要

Arguments:

  • data: 数据
Source code or View on GitHub
python
def send(self, data: T):
+    """
+        发送数据,发送函数为同步函数,没有异步的必要
+        Args:
+            data: 数据
+        """
+    if self.type_check:
+        _type = self._get_generic_type()
+        if _type is not None and (not self._validate_structure(data, _type)):
+            raise TypeError(f'Data must be an instance of {_type}, {type(data)} found')
+    if self._closed:
+        raise RuntimeError('Cannot send to a closed channel_')
+    self.conn_send.send(data)

def receive(self) -> T

Description: 同步接收数据,会阻塞线程

Source code or View on GitHub
python
def receive(self) -> T:
+    """
+        同步接收数据,会阻塞线程
+        Args:
+        """
+    if self._closed:
+        raise RuntimeError('Cannot receive from a closed channel_')
+    while True:
+        data = self.conn_recv.recv()
+        return data

async def async_receive(self) -> T

Description: 异步接收数据,会挂起等待

Source code or View on GitHub
python
async def async_receive(self) -> T:
+    """
+        异步接收数据,会挂起等待
+        """
+    print('等待接收数据')
+    loop = asyncio.get_running_loop()
+    data = await loop.run_in_executor(None, self.receive)
+    print('接收到数据')
+    return data

def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]

Description: 接收数据并执行函数

Arguments:

  • filter_func: 过滤函数,为None则不过滤

Return: 装饰器,装饰一个函数在接收到数据后执行

Source code or View on GitHub
python
def on_receive(self, filter_func: Optional[FILTER_FUNC]=None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]:
+    """
+        接收数据并执行函数
+        Args:
+            filter_func: 过滤函数,为None则不过滤
+        Returns:
+            装饰器,装饰一个函数在接收到数据后执行
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('on_receive can only be used in main process')
+
+    def decorator(func: Callable[[T], Any]) -> Callable[[T], Any]:
+        global _func_id
+
+        async def wrapper(data: T) -> Any:
+            if filter_func is not None:
+                if is_coroutine_callable(filter_func):
+                    if not await filter_func(data):
+                        return
+                elif not filter_func(data):
+                    return
+            if is_coroutine_callable(func):
+                return await func(data)
+            else:
+                return func(data)
+        _callback_funcs[_func_id] = wrapper
+        if IS_MAIN_PROCESS:
+            self._on_main_receive_func_ids.append(_func_id)
+        else:
+            self._on_sub_receive_func_ids.append(_func_id)
+        _func_id += 1
+        return func
+    return decorator

async def _run_on_receive_funcs(self, data: Any)

Description: 运行接收函数

Arguments:

  • data: 数据
Source code or View on GitHub
python
async def _run_on_receive_funcs(self, data: Any):
+    """
+        运行接收函数
+        Args:
+            data: 数据
+        """
+    if IS_MAIN_PROCESS:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_main_receive_func_ids]
+    else:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_sub_receive_func_ids]

async def start_receive_loop(self)

Description: 开始接收数据 会自动判断主进程和子进程,需要在对应进程都调度一次

Source code or View on GitHub
python
async def start_receive_loop(self):
+    """
+        开始接收数据
+        会自动判断主进程和子进程,需要在对应进程都调度一次
+        """
+    if len(self._on_main_receive_func_ids) == 0:
+        logger.warning(f'No on_receive function registered for {self.name}')
+        return
+    self.is_receive_loop_running = True
+    logger.debug(f'Starting receive loop for {self.name}')
+    while not self._closed:
+        data = await self.async_receive()
+        await self._run_on_receive_funcs(data)

var active_channel

  • Description: 子进程可用的主动和被动通道

  • Type: Channel

  • Default: Channel(name='active_channel')

var publish_channel

  • Description: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • Type: Channel[tuple[str, dict[str, Any]]]

  • Default: Channel(name='publish_channel')

var channel_deliver_active_channel

  • Description: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • Type: Channel[Channel[Any]]

  • Default: NO_DEFAULT

def set_channel(name: str, channel: Channel)

Description: 设置通道实例

Arguments:

  • name: 通道名称
  • channel: 通道实例
Source code or View on GitHub
python
def set_channel(name: str, channel: 'Channel'):
+    """
+    设置通道实例
+    Args:
+        name: 通道名称
+        channel: 通道实例
+    """
+    if not isinstance(channel, Channel):
+        raise TypeError(f'channel_ must be an instance of Channel, {type(channel)} found')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = channel
+    else:
+        channel_deliver_passive_channel.send(('set_channel', {'name': name, 'channel_': channel}))

def set_channels(channels: dict[str, Channel])

Description: 设置通道实例

Arguments:

  • channels: 通道名称
Source code or View on GitHub
python
def set_channels(channels: dict[str, 'Channel']):
+    """
+    设置通道实例
+    Args:
+        channels: 通道名称
+    """
+    for name, channel in channels.items():
+        set_channel(name, channel)

def get_channel(name: str) -> Channel

Description: 获取通道实例

Arguments:

  • name: 通道名称
Source code or View on GitHub
python
def get_channel(name: str) -> 'Channel':
+    """
+    获取通道实例
+    Args:
+        name: 通道名称
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel[name]
+    else:
+        recv_chan = Channel[Channel[Any]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channel', {'name': name, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def get_channels() -> dict[str, Channel]

Description: 获取通道实例

Source code or View on GitHub
python
def get_channels() -> dict[str, 'Channel']:
+    """
+    获取通道实例
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel
+    else:
+        recv_chan = Channel[dict[str, Channel[Any]]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channels', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')

def on_set_channel(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')
+def on_set_channel(data: tuple[str, dict[str, Any]]):
+    name, channel = (data[1]['name'], data[1]['channel_'])
+    set_channel(name, channel)

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')

def on_get_channel(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')
+def on_get_channel(data: tuple[str, dict[str, Any]]):
+    name, recv_chan = (data[1]['name'], data[1]['recv_chan'])
+    recv_chan.send(get_channel(name))

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')

def on_get_channels(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')
+def on_get_channels(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(get_channels())
`,78),h=[l];function e(k,p,r,d,E,g){return a(),i("div",null,h)}const o=s(t,[["render",e]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_comm_channel.md.BLjPtV1B.lean.js b/assets/en_dev_api_comm_channel.md.BLjPtV1B.lean.js new file mode 100644 index 00000000..90218063 --- /dev/null +++ b/assets/en_dev_api_comm_channel.md.BLjPtV1B.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.channel","description":"","frontmatter":{"title":"liteyuki.comm.channel"},"headers":[],"relativePath":"en/dev/api/comm/channel.md","filePath":"en/dev/api/comm/channel.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/comm/channel.md"},l=n("",78),h=[l];function e(k,p,r,d,E,g){return a(),i("div",null,h)}const o=s(t,[["render",e]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_comm_comm.md.nImwmKaA.js b/assets/en_dev_api_comm_comm.md.nImwmKaA.js new file mode 100644 index 00000000..2a250ce4 --- /dev/null +++ b/assets/en_dev_api_comm_comm.md.nImwmKaA.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as c,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"en/dev/api/comm/comm.md","filePath":"en/dev/api/comm/comm.md","lastUpdated":null}'),m={name:"en/dev/api/comm/comm.md"},n=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),i=e("p",null,[e("strong",null,"Description"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),s=[n,i];function l(r,d,_,p,u,h){return c(),a("div",null,s)}const v=o(m,[["render",l]]);export{k as __pageData,v as default}; diff --git a/assets/en_dev_api_comm_comm.md.nImwmKaA.lean.js b/assets/en_dev_api_comm_comm.md.nImwmKaA.lean.js new file mode 100644 index 00000000..2a250ce4 --- /dev/null +++ b/assets/en_dev_api_comm_comm.md.nImwmKaA.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as c,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"en/dev/api/comm/comm.md","filePath":"en/dev/api/comm/comm.md","lastUpdated":null}'),m={name:"en/dev/api/comm/comm.md"},n=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),i=e("p",null,[e("strong",null,"Description"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),s=[n,i];function l(r,d,_,p,u,h){return c(),a("div",null,s)}const v=o(m,[["render",l]]);export{k as __pageData,v as default}; diff --git a/assets/en_dev_api_comm_event.md.B8tSNpPu.js b/assets/en_dev_api_comm_event.md.B8tSNpPu.js new file mode 100644 index 00000000..4676b31c --- /dev/null +++ b/assets/en_dev_api_comm_event.md.B8tSNpPu.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.event","description":"","frontmatter":{"title":"liteyuki.comm.event"},"headers":[],"relativePath":"en/dev/api/comm/event.md","filePath":"en/dev/api/comm/event.md","lastUpdated":1725101868000}'),s={name:"en/dev/api/comm/event.md"},n=i('

liteyuki.comm.event

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class Event

def __init__(self, name: str, data: dict[str, Any])

Source code or View on GitHub
python
def __init__(self, name: str, data: dict[str, Any]):\n    self.name = name\n    self.data = data
',6),l=[n];function o(r,h,d,p,k,c){return a(),t("div",null,l)}const _=e(s,[["render",o]]);export{y as __pageData,_ as default}; diff --git a/assets/en_dev_api_comm_event.md.B8tSNpPu.lean.js b/assets/en_dev_api_comm_event.md.B8tSNpPu.lean.js new file mode 100644 index 00000000..1d958823 --- /dev/null +++ b/assets/en_dev_api_comm_event.md.B8tSNpPu.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.event","description":"","frontmatter":{"title":"liteyuki.comm.event"},"headers":[],"relativePath":"en/dev/api/comm/event.md","filePath":"en/dev/api/comm/event.md","lastUpdated":1725101868000}'),s={name:"en/dev/api/comm/event.md"},n=i("",6),l=[n];function o(r,h,d,p,k,c){return a(),t("div",null,l)}const _=e(s,[["render",o]]);export{y as __pageData,_ as default}; diff --git a/assets/en_dev_api_comm_index.md.DXB5jsIP.js b/assets/en_dev_api_comm_index.md.DXB5jsIP.js new file mode 100644 index 00000000..0cedc518 --- /dev/null +++ b/assets/en_dev_api_comm_index.md.DXB5jsIP.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"en/dev/api/comm/index.md","filePath":"en/dev/api/comm/index.md","lastUpdated":null}'),i={name:"en/dev/api/comm/index.md"},c=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),s=e("p",null,[e("strong",null,"Description"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),l=[c,s];function r(d,m,_,p,u,h){return n(),o("div",null,l)}const x=a(i,[["render",r]]);export{k as __pageData,x as default}; diff --git a/assets/en_dev_api_comm_index.md.DXB5jsIP.lean.js b/assets/en_dev_api_comm_index.md.DXB5jsIP.lean.js new file mode 100644 index 00000000..0cedc518 --- /dev/null +++ b/assets/en_dev_api_comm_index.md.DXB5jsIP.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const k=JSON.parse('{"title":"liteyuki.comm","description":"","frontmatter":{"title":"liteyuki.comm","collapsed":true},"headers":[],"relativePath":"en/dev/api/comm/index.md","filePath":"en/dev/api/comm/index.md","lastUpdated":null}'),i={name:"en/dev/api/comm/index.md"},c=e("h1",{id:"liteyuki-comm",tabindex:"-1"},[t("liteyuki.comm "),e("a",{class:"header-anchor",href:"#liteyuki-comm","aria-label":'Permalink to "liteyuki.comm"'},"​")],-1),s=e("p",null,[e("strong",null,"Description"),t(": 该模块用于轻雪主进程和Nonebot子进程之间的通信 依赖关系 event -> _ storage -> channel_ rpc -> channel_, storage")],-1),l=[c,s];function r(d,m,_,p,u,h){return n(),o("div",null,l)}const x=a(i,[["render",r]]);export{k as __pageData,x as default}; diff --git a/assets/en_dev_api_comm_rpc.md.Db5NdJbe.js b/assets/en_dev_api_comm_rpc.md.Db5NdJbe.js new file mode 100644 index 00000000..206b511e --- /dev/null +++ b/assets/en_dev_api_comm_rpc.md.Db5NdJbe.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.rpc","description":"","frontmatter":{"title":"liteyuki.comm.rpc"},"headers":[],"relativePath":"en/dev/api/comm/rpc.md","filePath":"en/dev/api/comm/rpc.md","lastUpdated":null}'),e={name:"en/dev/api/comm/rpc.md"},n=t('

liteyuki.comm.rpc

Description: 本模块用于实现RPC(基于IPC)通信

class RPC

def __init__(self, on_calling: ON_CALLING_FUNC) -> None

Source code or View on GitHub
python
def __init__(self, on_calling: ON_CALLING_FUNC) -> None:\n    self.on_calling = on_calling

def call(self, args: tuple, kwargs: dict) -> Any

Description: 调用

Source code or View on GitHub
python
def call(self, args: tuple, kwargs: dict) -> Any:\n    """\n        调用\n        """\n    return self.on_calling(args, kwargs)
',8),l=[n];function p(r,h,o,c,k,d){return a(),i("div",null,l)}const m=s(e,[["render",p]]);export{u as __pageData,m as default}; diff --git a/assets/en_dev_api_comm_rpc.md.Db5NdJbe.lean.js b/assets/en_dev_api_comm_rpc.md.Db5NdJbe.lean.js new file mode 100644 index 00000000..cb032b57 --- /dev/null +++ b/assets/en_dev_api_comm_rpc.md.Db5NdJbe.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"liteyuki.comm.rpc","description":"","frontmatter":{"title":"liteyuki.comm.rpc"},"headers":[],"relativePath":"en/dev/api/comm/rpc.md","filePath":"en/dev/api/comm/rpc.md","lastUpdated":null}'),e={name:"en/dev/api/comm/rpc.md"},n=t("",8),l=[n];function p(r,h,o,c,k,d){return a(),i("div",null,l)}const m=s(e,[["render",p]]);export{u as __pageData,m as default}; diff --git a/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.js b/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.js new file mode 100644 index 00000000..21b1634c --- /dev/null +++ b/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.js @@ -0,0 +1,26 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.comm.socks_channel","description":"","frontmatter":{"title":"liteyuki.comm.socks_channel"},"headers":[],"relativePath":"en/dev/api/comm/socks_channel.md","filePath":"en/dev/api/comm/socks_channel.md","lastUpdated":null}'),n={name:"en/dev/api/comm/socks_channel.md"},t=e(`

liteyuki.comm.socks_channel

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/25 下午3:54 @Author : snowykami @Email : snowykami@outlook.com @File : channelv2.py @Software: PyCharm

class SocksChannel

def __init__(self, name: str)

Description: 初始化通道

Arguments:

  • name: 通道ID
Source code or View on GitHub
python
def __init__(self, name: str):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+        """
+    self._name = name
+    self._conn_send = None
+    self._conn_recv = None
+    self._closed = False

def send(self, data)

Description: 发送数据

Arguments:

  • data: 数据
Source code or View on GitHub
python
def send(self, data):
+    """
+        发送数据
+        Args:
+            data: 数据
+        """
+    pass

def receive(self)

Description: 接收数据

Return: data: 数据

Source code or View on GitHub
python
def receive(self):
+    """
+        接收数据
+        Returns:
+            data: 数据
+        """
+    pass

def close(self)

Description: 关闭通道

Source code or View on GitHub
python
def close(self):
+    """
+        关闭通道
+        """
+    pass
`,21),l=[t];function h(p,o,k,r,c,d){return i(),a("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.lean.js b/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.lean.js new file mode 100644 index 00000000..c0f66f79 --- /dev/null +++ b/assets/en_dev_api_comm_socks_channel.md.kerI5Mmv.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.comm.socks_channel","description":"","frontmatter":{"title":"liteyuki.comm.socks_channel"},"headers":[],"relativePath":"en/dev/api/comm/socks_channel.md","filePath":"en/dev/api/comm/socks_channel.md","lastUpdated":null}'),n={name:"en/dev/api/comm/socks_channel.md"},t=e("",21),l=[t];function h(p,o,k,r,c,d){return i(),a("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_comm_storage.md.CyNGUlpk.js b/assets/en_dev_api_comm_storage.md.CyNGUlpk.js new file mode 100644 index 00000000..b42e0ade --- /dev/null +++ b/assets/en_dev_api_comm_storage.md.CyNGUlpk.js @@ -0,0 +1,144 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.storage","description":"","frontmatter":{"title":"liteyuki.comm.storage"},"headers":[],"relativePath":"en/dev/api/comm/storage.md","filePath":"en/dev/api/comm/storage.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/comm/storage.md"},e=n(`

liteyuki.comm.storage

Description: 共享内存模块。类似于redis,但是更加轻量级并且线程安全

var _on_main_subscriber_receive_funcs

  • Description: 主进程订阅者接收函数

  • Type: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • Default: {}

var _on_sub_subscriber_receive_funcs

  • Description: 子进程订阅者接收函数

  • Type: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • Default: {}

class KeyValueStore

def __init__(self)

Source code or View on GitHub
python
def __init__(self):
+    self._store = {}
+    self.active_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-active')
+    self.passive_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-passive')
+    self.publish_channel = Channel[tuple[str, Any]](name='shared_memory-publish')
+    self.is_main_receive_loop_running = False
+    self.is_sub_receive_loop_running = False

def set(self, key: str, value: Any) -> None

Description: 设置键值对

Arguments:

  • key: 键
  • value: 值
Source code or View on GitHub
python
def set(self, key: str, value: Any) -> None:
+    """
+        设置键值对
+        Args:
+            key: 键
+            value: 值
+
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            self._store[key] = value
+    else:
+        self.passive_chan.send(('set', {'key': key, 'value': value}))

def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]

Description: 获取键值对

Arguments:

  • key: 键
  • default: 默认值

Return: Any: 值

Source code or View on GitHub
python
def get(self, key: str, default: Optional[Any]=None) -> Optional[Any]:
+    """
+        获取键值对
+        Args:
+            key: 键
+            default: 默认值
+
+        Returns:
+            Any: 值
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            return self._store.get(key, default)
+    else:
+        recv_chan = Channel[Optional[Any]]('recv_chan')
+        self.passive_chan.send(('get', {'key': key, 'default': default, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def delete(self, key: str, ignore_key_error: bool = True) -> None

Description: 删除键值对

Arguments:

  • key: 键
  • ignore_key_error: 是否忽略键不存在的错误
Source code or View on GitHub
python
def delete(self, key: str, ignore_key_error: bool=True) -> None:
+    """
+        删除键值对
+        Args:
+            key: 键
+            ignore_key_error: 是否忽略键不存在的错误
+
+        Returns:
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            if key in self._store:
+                try:
+                    del self._store[key]
+                    del _locks[key]
+                except KeyError as e:
+                    if not ignore_key_error:
+                        raise e
+    else:
+        self.passive_chan.send(('delete', {'key': key}))

def get_all(self) -> dict[str, Any]

Description: 获取所有键值对

Return: dict[str, Any]: 键值对

Source code or View on GitHub
python
def get_all(self) -> dict[str, Any]:
+    """
+        获取所有键值对
+        Returns:
+            dict[str, Any]: 键值对
+        """
+    if IS_MAIN_PROCESS:
+        return self._store
+    else:
+        recv_chan = Channel[dict[str, Any]]('recv_chan')
+        self.passive_chan.send(('get_all', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

def publish(self, channel_: str, data: Any) -> None

Description: 发布消息

Arguments:

  • channel_: 频道
  • data: 数据
Source code or View on GitHub
python
def publish(self, channel_: str, data: Any) -> None:
+    """
+        发布消息
+        Args:
+            channel_: 频道
+            data: 数据
+
+        Returns:
+        """
+    self.active_chan.send(('publish', {'channel': channel_, 'data': data}))

def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]

Description: 订阅者接收消息时的回调

Arguments:

  • channel_: 频道

Return: 装饰器

Source code or View on GitHub
python
def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]:
+    """
+        订阅者接收消息时的回调
+        Args:
+            channel_: 频道
+
+        Returns:
+            装饰器
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot subscribe in sub process.')
+
+    def decorator(func: ON_RECEIVE_FUNC) -> ON_RECEIVE_FUNC:
+
+        async def wrapper(data: Any):
+            if is_coroutine_callable(func):
+                await func(data)
+            else:
+                func(data)
+        if IS_MAIN_PROCESS:
+            if channel_ not in _on_main_subscriber_receive_funcs:
+                _on_main_subscriber_receive_funcs[channel_] = []
+            _on_main_subscriber_receive_funcs[channel_].append(wrapper)
+        else:
+            if channel_ not in _on_sub_subscriber_receive_funcs:
+                _on_sub_subscriber_receive_funcs[channel_] = []
+            _on_sub_subscriber_receive_funcs[channel_].append(wrapper)
+        return wrapper
+    return decorator

@staticmethod

async def run_subscriber_receive_funcs(channel_: str, data: Any)

Description: 运行订阅者接收函数

Arguments:

  • channel_: 频道
  • data: 数据
Source code or View on GitHub
python
@staticmethod
+async def run_subscriber_receive_funcs(channel_: str, data: Any):
+    """
+        运行订阅者接收函数
+        Args:
+            channel_: 频道
+            data: 数据
+        """
+    [asyncio.create_task(func(data)) for func in _on_main_subscriber_receive_funcs[channel_]]

async def start_receive_loop(self)

Description: 启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程

Source code or View on GitHub
python
async def start_receive_loop(self):
+    """
+        启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot start receive loop in sub process.')
+    while True:
+        data = await self.active_chan.async_receive()
+        if data[0] == 'publish':
+            await self.run_subscriber_receive_funcs(data[1]['channel'], data[1]['data'])
+            self.publish_channel.send(data)

class GlobalKeyValueStore

@classmethod

def get_instance(cls)

Source code or View on GitHub
python
@classmethod
+def get_instance(cls):
+    if cls._instance is None:
+        with cls._lock:
+            if cls._instance is None:
+                cls._instance = KeyValueStore()
+    return cls._instance

attr _instance = None

attr _lock = threading.Lock()

var _ref_count

  • Description: import 引用计数, 防止获取空指针

  • Default: 0

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')

def on_get(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')
+def on_get(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    default = data[1]['default']
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get(key, default))

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')

def on_set(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')
+def on_set(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    value = data[1]['value']
+    shared_memory.set(key, value)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')

def on_delete(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')
+def on_delete(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    shared_memory.delete(key)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')

def on_get_all(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')
+def on_get_all(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get_all())
`,69),l=[e];function h(k,p,r,d,E,o){return a(),i("div",null,l)}const c=s(t,[["render",h]]);export{y as __pageData,c as default}; diff --git a/assets/en_dev_api_comm_storage.md.CyNGUlpk.lean.js b/assets/en_dev_api_comm_storage.md.CyNGUlpk.lean.js new file mode 100644 index 00000000..5dd4febd --- /dev/null +++ b/assets/en_dev_api_comm_storage.md.CyNGUlpk.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.comm.storage","description":"","frontmatter":{"title":"liteyuki.comm.storage"},"headers":[],"relativePath":"en/dev/api/comm/storage.md","filePath":"en/dev/api/comm/storage.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/comm/storage.md"},e=n("",69),l=[e];function h(k,p,r,d,E,o){return a(),i("div",null,l)}const c=s(t,[["render",h]]);export{y as __pageData,c as default}; diff --git a/assets/en_dev_api_config.md.paJM3SZQ.js b/assets/en_dev_api_config.md.paJM3SZQ.js new file mode 100644 index 00000000..3ceea153 --- /dev/null +++ b/assets/en_dev_api_config.md.paJM3SZQ.js @@ -0,0 +1,77 @@ +import{_ as i,c as a,o as n,a4 as s,j as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.config","description":"","frontmatter":{"title":"liteyuki.config"},"headers":[],"relativePath":"en/dev/api/config.md","filePath":"en/dev/api/config.md","lastUpdated":1725101868000}'),l={name:"en/dev/api/config.md"},h=s('

liteyuki.config

Description: 该模块用于常用配置文件的加载 多配置文件编写原则: 1.尽量不要冲突: 一个键不要多次出现 2.分工明确: 每个配置文件给一个或一类服务提供配置 3.扁平化编写: 配置文件尽量扁平化,不要出现过多的嵌套 4.注意冲突时的优先级: 项目目录下的配置文件优先级高于config目录下的配置文件 5.请不要将需要动态加载的内容写入配置文件,你应该使用其他储存方式

def flat_config(config: dict[str, Any]) -> dict[str, Any]

Description: 扁平化配置文件

',4),k=t("p",{"a.b.c:":"",1:""},"{a:{b:{c:1}}} ->",-1),p=s(`

Arguments:

  • config: 配置项目

Return: 扁平化后的配置文件,但也包含原有的键值对

Source code or View on GitHub
python
def flat_config(config: dict[str, Any]) -> dict[str, Any]:
+    """
+    扁平化配置文件
+
+    {a:{b:{c:1}}} -> {"a.b.c": 1}
+    Args:
+        config: 配置项目
+
+    Returns:
+        扁平化后的配置文件,但也包含原有的键值对
+    """
+    new_config = copy.deepcopy(config)
+    for key, value in config.items():
+        if isinstance(value, dict):
+            for k, v in flat_config(value).items():
+                new_config[f'{key}.{k}'] = v
+    return new_config

def load_from_yaml(file_: str) -> dict[str, Any]

Description: Load config from yaml file

Source code or View on GitHub
python
def load_from_yaml(file_: str) -> dict[str, Any]:
+    """
+    Load config from yaml file
+
+    """
+    logger.debug(f'Loading YAML config from {file_}')
+    config = yaml.safe_load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_json(file_: str) -> dict[str, Any]

Description: Load config from json file

Source code or View on GitHub
python
def load_from_json(file_: str) -> dict[str, Any]:
+    """
+    Load config from json file
+    """
+    logger.debug(f'Loading JSON config from {file_}')
+    config = json.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_toml(file_: str) -> dict[str, Any]

Description: Load config from toml file

Source code or View on GitHub
python
def load_from_toml(file_: str) -> dict[str, Any]:
+    """
+    Load config from toml file
+    """
+    logger.debug(f'Loading TOML config from {file_}')
+    config = toml.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]

Description: 从指定文件加载配置项,会自动识别文件格式 默认执行扁平化选项

Source code or View on GitHub
python
def load_from_files(*files: str, no_warning: bool=False) -> dict[str, Any]:
+    """
+    从指定文件加载配置项,会自动识别文件格式
+    默认执行扁平化选项
+    """
+    config = {}
+    for file in files:
+        if os.path.exists(file):
+            if file.endswith(('.yaml', 'yml')):
+                config.update(load_from_yaml(file))
+            elif file.endswith('.json'):
+                config.update(load_from_json(file))
+            elif file.endswith('.toml'):
+                config.update(load_from_toml(file))
+            elif not no_warning:
+                logger.warning(f'Unsupported config file format: {file}')
+        elif not no_warning:
+            logger.warning(f'Config file not found: {file}')
+    return config

def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]

Description: 从目录下加载配置文件,不递归 按照读取文件的优先级反向覆盖 默认执行扁平化选项

Source code or View on GitHub
python
def load_configs_from_dirs(*directories: str, no_waring: bool=False) -> dict[str, Any]:
+    """
+    从目录下加载配置文件,不递归
+    按照读取文件的优先级反向覆盖
+    默认执行扁平化选项
+    """
+    config = {}
+    for directory in directories:
+        if not os.path.exists(directory):
+            if not no_waring:
+                logger.warning(f'Directory not found: {directory}')
+            continue
+        for file in os.listdir(directory):
+            if file.endswith(_SUPPORTED_CONFIG_FORMATS):
+                config.update(load_from_files(os.path.join(directory, file), no_warning=no_waring))
+    return config

def load_config_in_default(no_waring: bool = False) -> dict[str, Any]

Description: 从一个标准的轻雪项目加载配置文件 项目目录下的config.*和config目录下的所有配置文件 项目目录下的配置文件优先

Source code or View on GitHub
python
def load_config_in_default(no_waring: bool=False) -> dict[str, Any]:
+    """
+    从一个标准的轻雪项目加载配置文件
+    项目目录下的config.*和config目录下的所有配置文件
+    项目目录下的配置文件优先
+    """
+    config = load_configs_from_dirs('config', no_waring=no_waring)
+    config.update(load_from_files('config.yaml', 'config.toml', 'config.json', 'config.yml', no_warning=no_waring))
+    return config
`,22),e=[h,k,p];function r(d,o,g,E,y,F){return n(),a("div",null,e)}const u=i(l,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/en_dev_api_config.md.paJM3SZQ.lean.js b/assets/en_dev_api_config.md.paJM3SZQ.lean.js new file mode 100644 index 00000000..0848354b --- /dev/null +++ b/assets/en_dev_api_config.md.paJM3SZQ.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,a4 as s,j as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.config","description":"","frontmatter":{"title":"liteyuki.config"},"headers":[],"relativePath":"en/dev/api/config.md","filePath":"en/dev/api/config.md","lastUpdated":1725101868000}'),l={name:"en/dev/api/config.md"},h=s("",4),k=t("p",{"a.b.c:":"",1:""},"{a:{b:{c:1}}} ->",-1),p=s("",22),e=[h,k,p];function r(d,o,g,E,y,F){return n(),a("div",null,e)}const u=i(l,[["render",r]]);export{f as __pageData,u as default}; diff --git a/assets/en_dev_api_core_core.md.DspKdKLc.js b/assets/en_dev_api_core_core.md.DspKdKLc.js new file mode 100644 index 00000000..3e686739 --- /dev/null +++ b/assets/en_dev_api_core_core.md.DspKdKLc.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as r}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"en/dev/api/core/core.md","filePath":"en/dev/api/core/core.md","lastUpdated":null}'),c={name:"en/dev/api/core/core.md"},i=e("h1",{id:"liteyuki-core",tabindex:"-1"},[r("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),s=[i];function l(n,d,p,_,u,h){return o(),a("div",null,s)}const k=t(c,[["render",l]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_core_core.md.DspKdKLc.lean.js b/assets/en_dev_api_core_core.md.DspKdKLc.lean.js new file mode 100644 index 00000000..3e686739 --- /dev/null +++ b/assets/en_dev_api_core_core.md.DspKdKLc.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,j as e,a as r}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"en/dev/api/core/core.md","filePath":"en/dev/api/core/core.md","lastUpdated":null}'),c={name:"en/dev/api/core/core.md"},i=e("h1",{id:"liteyuki-core",tabindex:"-1"},[r("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),s=[i];function l(n,d,p,_,u,h){return o(),a("div",null,s)}const k=t(c,[["render",l]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_core_index.md.Cu0gmuqG.js b/assets/en_dev_api_core_index.md.Cu0gmuqG.js new file mode 100644 index 00000000..b2698a5c --- /dev/null +++ b/assets/en_dev_api_core_index.md.Cu0gmuqG.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as o}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"en/dev/api/core/index.md","filePath":"en/dev/api/core/index.md","lastUpdated":null}'),r={name:"en/dev/api/core/index.md"},c=e("h1",{id:"liteyuki-core",tabindex:"-1"},[o("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),n=[c];function d(s,l,p,_,u,h){return i(),a("div",null,n)}const k=t(r,[["render",d]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_core_index.md.Cu0gmuqG.lean.js b/assets/en_dev_api_core_index.md.Cu0gmuqG.lean.js new file mode 100644 index 00000000..b2698a5c --- /dev/null +++ b/assets/en_dev_api_core_index.md.Cu0gmuqG.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as o}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.core","description":"","frontmatter":{"title":"liteyuki.core","collapsed":true},"headers":[],"relativePath":"en/dev/api/core/index.md","filePath":"en/dev/api/core/index.md","lastUpdated":null}'),r={name:"en/dev/api/core/index.md"},c=e("h1",{id:"liteyuki-core",tabindex:"-1"},[o("liteyuki.core "),e("a",{class:"header-anchor",href:"#liteyuki-core","aria-label":'Permalink to "liteyuki.core"'},"​")],-1),n=[c];function d(s,l,p,_,u,h){return i(),a("div",null,n)}const k=t(r,[["render",d]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_core_manager.md.Bs82V5ER.js b/assets/en_dev_api_core_manager.md.Bs82V5ER.js new file mode 100644 index 00000000..31a32f16 --- /dev/null +++ b/assets/en_dev_api_core_manager.md.Bs82V5ER.js @@ -0,0 +1,92 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.core.manager","description":"","frontmatter":{"title":"liteyuki.core.manager"},"headers":[],"relativePath":"en/dev/api/core/manager.md","filePath":"en/dev/api/core/manager.md","lastUpdated":1725101868000}'),e={name:"en/dev/api/core/manager.md"},t=n(`

liteyuki.core.manager

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午11:12 @Author : snowykami @Email : snowykami@outlook.com @File : manager.py @Software: PyCharm

class ChannelDeliver

def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])

Source code or View on GitHub
python
def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]]):
+    self.active = active
+    self.passive = passive
+    self.channel_deliver_active = channel_deliver_active
+    self.channel_deliver_passive = channel_deliver_passive
+    self.publish = publish

class ProcessManager

def __init__(self, lifespan: Lifespan)

Source code or View on GitHub
python
def __init__(self, lifespan: 'Lifespan'):
+    self.lifespan = lifespan
+    self.targets: dict[str, tuple[Callable, tuple, dict]] = {}
+    self.processes: dict[str, Process] = {}

async def _run_process(self, name: str)

Description: 开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task

Arguments:

  • name:
Source code or View on GitHub
python
async def _run_process(self, name: str):
+    """
+        开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task
+        Args:
+            name:
+        Returns:
+        """
+    if name not in self.targets:
+        raise KeyError(f'Process {name} not found.')
+    chan_active = get_channel(f'{name}-active')
+
+    def _start_process():
+        process = Process(target=self.targets[name][0], args=self.targets[name][1], kwargs=self.targets[name][2], daemon=True)
+        self.processes[name] = process
+        process.start()
+    _start_process()
+    while True:
+        data = await chan_active.async_receive()
+        if data == 0:
+            logger.info(f'Stopping process {name}')
+            await self.lifespan.before_process_shutdown()
+            self.terminate(name)
+            break
+        elif data == 1:
+            logger.info(f'Restarting process {name}')
+            await self.lifespan.before_process_shutdown()
+            await self.lifespan.before_process_restart()
+            self.terminate(name)
+            _start_process()
+            continue
+        else:
+            logger.warning('Unknown data received, ignored.')

async def start_all(self)

Description: 对外启动方法,启动所有进程,创建asyncio task

Source code or View on GitHub
python
async def start_all(self):
+    """
+        对外启动方法,启动所有进程,创建asyncio task
+        """
+    [asyncio.create_task(chan.start_receive_loop()) for chan in get_channels().values()]
+    [asyncio.create_task(sm.start_receive_loop()) for sm in [shared_memory]]
+    [asyncio.create_task(self._run_process(name)) for name in self.targets]

def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)

Description: 添加进程

Arguments:

  • name: 进程名,用于获取和唯一标识
  • target: 进程函数
  • args: 进程函数参数
  • kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
Source code or View on GitHub
python
def add_target(self, name: str, target: TARGET_FUNC, args: tuple=(), kwargs=None):
+    """
+        添加进程
+        Args:
+            name: 进程名,用于获取和唯一标识
+            target: 进程函数
+            args: 进程函数参数
+            kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
+        """
+    if kwargs is None:
+        kwargs = {}
+    chan_active: Channel = Channel(name=f'{name}-active')
+    chan_passive: Channel = Channel(name=f'{name}-passive')
+    channel_deliver = ChannelDeliver(active=chan_active, passive=chan_passive, channel_deliver_active=channel_deliver_active_channel, channel_deliver_passive=channel_deliver_passive_channel, publish=publish_channel)
+    self.targets[name] = (_delivery_channel_wrapper, (target, channel_deliver, shared_memory, *args), kwargs)

def join_all(self)

Source code or View on GitHub
python
def join_all(self):
+    for name, process in self.targets:
+        process.join()

def terminate(self, name: str)

Description: 终止进程并从进程字典中删除

Arguments:

  • name:
Source code or View on GitHub
python
def terminate(self, name: str):
+    """
+        终止进程并从进程字典中删除
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.processes:
+        logger.warning(f'Process {name} not found.')
+        return
+    process = self.processes[name]
+    process.terminate()
+    process.join(TIMEOUT)
+    if process.is_alive():
+        process.kill()
+    logger.success(f'Process {name} terminated.')

def terminate_all(self)

Source code or View on GitHub
python
def terminate_all(self):
+    for name in self.targets:
+        self.terminate(name)

def is_process_alive(self, name: str) -> bool

Description: 检查进程是否存活

Arguments:

  • name:
Source code or View on GitHub
python
def is_process_alive(self, name: str) -> bool:
+    """
+        检查进程是否存活
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.targets:
+        logger.warning(f'Process {name} not found.')
+    return self.processes[name].is_alive()
`,36),l=[t];function h(k,p,r,d,E,g){return a(),i("div",null,l)}const c=s(e,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/en_dev_api_core_manager.md.Bs82V5ER.lean.js b/assets/en_dev_api_core_manager.md.Bs82V5ER.lean.js new file mode 100644 index 00000000..ef9e36c4 --- /dev/null +++ b/assets/en_dev_api_core_manager.md.Bs82V5ER.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.core.manager","description":"","frontmatter":{"title":"liteyuki.core.manager"},"headers":[],"relativePath":"en/dev/api/core/manager.md","filePath":"en/dev/api/core/manager.md","lastUpdated":1725101868000}'),e={name:"en/dev/api/core/manager.md"},t=n("",36),l=[t];function h(k,p,r,d,E,g){return a(),i("div",null,l)}const c=s(e,[["render",h]]);export{o as __pageData,c as default}; diff --git a/assets/en_dev_api_dev_dev.md.C7bp0nFK.js b/assets/en_dev_api_dev_dev.md.C7bp0nFK.js new file mode 100644 index 00000000..04e9f053 --- /dev/null +++ b/assets/en_dev_api_dev_dev.md.C7bp0nFK.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"en/dev/api/dev/dev.md","filePath":"en/dev/api/dev/dev.md","lastUpdated":null}'),s={name:"en/dev/api/dev/dev.md"},n=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"Description"),t(": 该模块用于存放一些开发工具")],-1),l=[n,o];function r(c,p,v,_,u,h){return i(),d("div",null,l)}const k=a(s,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_dev_dev.md.C7bp0nFK.lean.js b/assets/en_dev_api_dev_dev.md.C7bp0nFK.lean.js new file mode 100644 index 00000000..04e9f053 --- /dev/null +++ b/assets/en_dev_api_dev_dev.md.C7bp0nFK.lean.js @@ -0,0 +1 @@ +import{_ as a,c as d,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"en/dev/api/dev/dev.md","filePath":"en/dev/api/dev/dev.md","lastUpdated":null}'),s={name:"en/dev/api/dev/dev.md"},n=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"Description"),t(": 该模块用于存放一些开发工具")],-1),l=[n,o];function r(c,p,v,_,u,h){return i(),d("div",null,l)}const k=a(s,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_dev_index.md.B_Clatcv.js b/assets/en_dev_api_dev_index.md.B_Clatcv.js new file mode 100644 index 00000000..bbe1ae4a --- /dev/null +++ b/assets/en_dev_api_dev_index.md.B_Clatcv.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as d,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"en/dev/api/dev/index.md","filePath":"en/dev/api/dev/index.md","lastUpdated":null}'),n={name:"en/dev/api/dev/index.md"},s=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"Description"),t(": 该模块用于存放一些开发工具")],-1),l=[s,o];function r(c,p,_,u,v,h){return d(),i("div",null,l)}const k=a(n,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_dev_index.md.B_Clatcv.lean.js b/assets/en_dev_api_dev_index.md.B_Clatcv.lean.js new file mode 100644 index 00000000..bbe1ae4a --- /dev/null +++ b/assets/en_dev_api_dev_index.md.B_Clatcv.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as d,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"liteyuki.dev","description":"","frontmatter":{"title":"liteyuki.dev","collapsed":true},"headers":[],"relativePath":"en/dev/api/dev/index.md","filePath":"en/dev/api/dev/index.md","lastUpdated":null}'),n={name:"en/dev/api/dev/index.md"},s=e("h1",{id:"liteyuki-dev",tabindex:"-1"},[t("liteyuki.dev "),e("a",{class:"header-anchor",href:"#liteyuki-dev","aria-label":'Permalink to "liteyuki.dev"'},"​")],-1),o=e("p",null,[e("strong",null,"Description"),t(": 该模块用于存放一些开发工具")],-1),l=[s,o];function r(c,p,_,u,v,h){return d(),i("div",null,l)}const k=a(n,[["render",r]]);export{f as __pageData,k as default}; diff --git a/assets/en_dev_api_dev_observer.md.DfB9VffK.js b/assets/en_dev_api_dev_observer.md.DfB9VffK.js new file mode 100644 index 00000000..0bd0c411 --- /dev/null +++ b/assets/en_dev_api_dev_observer.md.DfB9VffK.js @@ -0,0 +1,44 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.dev.observer","description":"","frontmatter":{"title":"liteyuki.dev.observer"},"headers":[],"relativePath":"en/dev/api/dev/observer.md","filePath":"en/dev/api/dev/observer.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/dev/observer.md"},t=a(`

liteyuki.dev.observer

Description: 此模块用于注册观察者函数,使用watchdog监控文件变化并重启bot 启用该模块需要在配置文件中设置dev_mode为True

var CALLBACK_FUNC

  • Description: 位置1为FileSystemEvent

  • Type: TypeAlias

  • Default: Callable[[FileSystemEvent], None]

var FILTER_FUNC

  • Description: 位置1为FileSystemEvent

  • Type: TypeAlias

  • Default: Callable[[FileSystemEvent], bool]

def debounce(wait)

Description: 防抖函数

Source code or View on GitHub
python
def debounce(wait):
+    """
+    防抖函数
+    """
+
+    def decorator(func):
+
+        def wrapper(*args, **kwargs):
+            nonlocal last_call_time
+            current_time = time.time()
+            if current_time - last_call_time > wait:
+                last_call_time = current_time
+                return func(*args, **kwargs)
+        last_call_time = None
+        return wrapper
+    return decorator

class CodeModifiedHandler(FileSystemEventHandler)

@debounce(1)

def on_modified(self, event)

Source code or View on GitHub
python
@debounce(1)
+def on_modified(self, event):
+    raise NotImplementedError('on_modified must be implemented')

def on_created(self, event)

Source code or View on GitHub
python
def on_created(self, event):
+    self.on_modified(event)

def on_deleted(self, event)

Source code or View on GitHub
python
def on_deleted(self, event):
+    self.on_modified(event)

def on_moved(self, event)

Source code or View on GitHub
python
def on_moved(self, event):
+    self.on_modified(event)

def on_any_event(self, event)

Source code or View on GitHub
python
def on_any_event(self, event):
+    self.on_modified(event)

def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]

Description: 注册文件系统变化监听器

Arguments:

  • directories: 监听目录们
  • recursive: 是否递归监听子目录
  • event_filter: 事件过滤器, 返回True则执行回调函数

Return: 装饰器,装饰一个函数在接收到数据后执行

Source code or View on GitHub
python
def on_file_system_event(directories: tuple[str], recursive: bool=True, event_filter: FILTER_FUNC=None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]:
+    """
+    注册文件系统变化监听器
+    Args:
+        directories: 监听目录们
+        recursive: 是否递归监听子目录
+        event_filter: 事件过滤器, 返回True则执行回调函数
+    Returns:
+        装饰器,装饰一个函数在接收到数据后执行
+    """
+
+    def decorator(func: CALLBACK_FUNC) -> CALLBACK_FUNC:
+
+        def wrapper(event: FileSystemEvent):
+            if event_filter is not None and (not event_filter(event)):
+                return
+            func(event)
+        code_modified_handler = CodeModifiedHandler()
+        code_modified_handler.on_modified = wrapper
+        for directory in directories:
+            observer.schedule(code_modified_handler, directory, recursive=recursive)
+        return func
+    return decorator
`,27),l=[t];function h(p,r,k,d,o,c){return e(),i("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_dev_observer.md.DfB9VffK.lean.js b/assets/en_dev_api_dev_observer.md.DfB9VffK.lean.js new file mode 100644 index 00000000..d67111ee --- /dev/null +++ b/assets/en_dev_api_dev_observer.md.DfB9VffK.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as e,a4 as a}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.dev.observer","description":"","frontmatter":{"title":"liteyuki.dev.observer"},"headers":[],"relativePath":"en/dev/api/dev/observer.md","filePath":"en/dev/api/dev/observer.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/dev/observer.md"},t=a("",27),l=[t];function h(p,r,k,d,o,c){return e(),i("div",null,l)}const y=s(n,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_dev_plugin.md.dVSn90qu.js b/assets/en_dev_api_dev_plugin.md.dVSn90qu.js new file mode 100644 index 00000000..9f778026 --- /dev/null +++ b/assets/en_dev_api_dev_plugin.md.dVSn90qu.js @@ -0,0 +1,12 @@ +import{_ as i,c as s,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const E=JSON.parse('{"title":"liteyuki.dev.plugin","description":"","frontmatter":{"title":"liteyuki.dev.plugin"},"headers":[],"relativePath":"en/dev/api/dev/plugin.md","filePath":"en/dev/api/dev/plugin.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/dev/plugin.md"},e=t(`

liteyuki.dev.plugin

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/18 上午5:04 @Author : snowykami @Email : snowykami@outlook.com @File : plugin.py @Software: PyCharm

def run_plugins(*module_path: str | Path)

Description: 运行插件,无需手动初始化bot

Arguments:

  • module_path: 插件路径,参考liteyuki.load_plugin的函数签名
Source code or View on GitHub
python
def run_plugins(*module_path: str | Path):
+    """
+    运行插件,无需手动初始化bot
+    Args:
+        module_path: 插件路径,参考\`liteyuki.load_plugin\`的函数签名
+    """
+    cfg = load_config_in_default()
+    plugins = cfg.get('liteyuki.plugins', [])
+    plugins.extend(module_path)
+    cfg['liteyuki.plugins'] = plugins
+    bot = LiteyukiBot(**cfg)
+    bot.run()
`,8),l=[e];function p(h,k,r,o,d,u){return a(),s("div",null,l)}const c=i(n,[["render",p]]);export{E as __pageData,c as default}; diff --git a/assets/en_dev_api_dev_plugin.md.dVSn90qu.lean.js b/assets/en_dev_api_dev_plugin.md.dVSn90qu.lean.js new file mode 100644 index 00000000..3363425d --- /dev/null +++ b/assets/en_dev_api_dev_plugin.md.dVSn90qu.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const E=JSON.parse('{"title":"liteyuki.dev.plugin","description":"","frontmatter":{"title":"liteyuki.dev.plugin"},"headers":[],"relativePath":"en/dev/api/dev/plugin.md","filePath":"en/dev/api/dev/plugin.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/dev/plugin.md"},e=t("",8),l=[e];function p(h,k,r,o,d,u){return a(),s("div",null,l)}const c=i(n,[["render",p]]);export{E as __pageData,c as default}; diff --git a/assets/en_dev_api_exception.md.DTnDyb4J.js b/assets/en_dev_api_exception.md.DTnDyb4J.js new file mode 100644 index 00000000..e8855ad9 --- /dev/null +++ b/assets/en_dev_api_exception.md.DTnDyb4J.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.exception","description":"","frontmatter":{"title":"liteyuki.exception"},"headers":[],"relativePath":"en/dev/api/exception.md","filePath":"en/dev/api/exception.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/exception.md"},c=e("h1",{id:"liteyuki-exception",tabindex:"-1"},[t("liteyuki.exception "),e("a",{class:"header-anchor",href:"#liteyuki-exception","aria-label":'Permalink to "liteyuki.exception"'},"​")],-1),s=e("p",null,[e("strong",null,"Description"),t(": exception模块包含了liteyuki运行中的所有错误")],-1),l=e("h3",{id:"class-liteyukiexception-baseexception",tabindex:"-1"},[e("em",null,[e("strong",null,"class")]),t(),e("code",null,"LiteyukiException(BaseException)"),t(),e("a",{class:"header-anchor",href:"#class-liteyukiexception-baseexception","aria-label":'Permalink to "***class*** `LiteyukiException(BaseException)`"'},"​")],-1),p=[c,s,l];function r(d,x,u,_,h,k){return n(),a("div",null,p)}const f=i(o,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_exception.md.DTnDyb4J.lean.js b/assets/en_dev_api_exception.md.DTnDyb4J.lean.js new file mode 100644 index 00000000..e8855ad9 --- /dev/null +++ b/assets/en_dev_api_exception.md.DTnDyb4J.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.exception","description":"","frontmatter":{"title":"liteyuki.exception"},"headers":[],"relativePath":"en/dev/api/exception.md","filePath":"en/dev/api/exception.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/exception.md"},c=e("h1",{id:"liteyuki-exception",tabindex:"-1"},[t("liteyuki.exception "),e("a",{class:"header-anchor",href:"#liteyuki-exception","aria-label":'Permalink to "liteyuki.exception"'},"​")],-1),s=e("p",null,[e("strong",null,"Description"),t(": exception模块包含了liteyuki运行中的所有错误")],-1),l=e("h3",{id:"class-liteyukiexception-baseexception",tabindex:"-1"},[e("em",null,[e("strong",null,"class")]),t(),e("code",null,"LiteyukiException(BaseException)"),t(),e("a",{class:"header-anchor",href:"#class-liteyukiexception-baseexception","aria-label":'Permalink to "***class*** `LiteyukiException(BaseException)`"'},"​")],-1),p=[c,s,l];function r(d,x,u,_,h,k){return n(),a("div",null,p)}const f=i(o,[["render",r]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_index.md.Da9OtAtQ.js b/assets/en_dev_api_index.md.Da9OtAtQ.js new file mode 100644 index 00000000..725ad5dd --- /dev/null +++ b/assets/en_dev_api_index.md.Da9OtAtQ.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"en/dev/api/index.md","filePath":"en/dev/api/index.md","lastUpdated":null}'),o={name:"en/dev/api/index.md"},r=i('

liteyuki

var __version__

  • Description: 测试版本号

  • Default: '6.3.10'

',3),n=[r];function l(s,_,d,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",l]]);export{v as __pageData,f as default}; diff --git a/assets/en_dev_api_index.md.Da9OtAtQ.lean.js b/assets/en_dev_api_index.md.Da9OtAtQ.lean.js new file mode 100644 index 00000000..99dfe05f --- /dev/null +++ b/assets/en_dev_api_index.md.Da9OtAtQ.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as i}from"./chunks/framework.C3o_UkTa.js";const v=JSON.parse('{"title":"liteyuki","description":"","frontmatter":{"title":"liteyuki","collapsed":true},"headers":[],"relativePath":"en/dev/api/index.md","filePath":"en/dev/api/index.md","lastUpdated":null}'),o={name:"en/dev/api/index.md"},r=i("",3),n=[r];function l(s,_,d,c,p,u){return a(),t("div",null,n)}const f=e(o,[["render",l]]);export{v as __pageData,f as default}; diff --git a/assets/en_dev_api_log.md.BD04gPQH.js b/assets/en_dev_api_log.md.BD04gPQH.js new file mode 100644 index 00000000..783078bf --- /dev/null +++ b/assets/en_dev_api_log.md.BD04gPQH.js @@ -0,0 +1,18 @@ +import{_ as s,c as i,o as a,a4 as h}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.log","description":"","frontmatter":{"title":"liteyuki.log"},"headers":[],"relativePath":"en/dev/api/log.md","filePath":"en/dev/api/log.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/log.md"},k=h(`

liteyuki.log

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午9:12 @Author : snowykami @Email : snowykami@outlook.com @File : log.py @Software: PyCharm

def get_format(level: str) -> str

Source code or View on GitHub
python
def get_format(level: str) -> str:
+    if level == 'DEBUG':
+        return debug_format
+    else:
+        return default_format

def init_log(config: dict)

Description: 在语言加载完成后执行

Source code or View on GitHub
python
def init_log(config: dict):
+    """
+    在语言加载完成后执行
+    Returns:
+
+    """
+    logger.remove()
+    logger.add(sys.stdout, level=0, diagnose=False, format=get_format(config.get('log_level', 'INFO')))
+    show_icon = config.get('log_icon', True)
+    logger.level('DEBUG', color='<blue>', icon=f"{('🐛' if show_icon else '')}DEBUG")
+    logger.level('INFO', color='<normal>', icon=f"{('ℹ️' if show_icon else '')}INFO")
+    logger.level('SUCCESS', color='<green>', icon=f"{('✅' if show_icon else '')}SUCCESS")
+    logger.level('WARNING', color='<yellow>', icon=f"{('⚠️' if show_icon else '')}WARNING")
+    logger.level('ERROR', color='<red>', icon=f"{('⭕' if show_icon else '')}ERROR")
`,8),l=[k];function n(p,e,E,r,g,d){return a(),i("div",null,l)}const o=s(t,[["render",n]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_log.md.BD04gPQH.lean.js b/assets/en_dev_api_log.md.BD04gPQH.lean.js new file mode 100644 index 00000000..bdda093e --- /dev/null +++ b/assets/en_dev_api_log.md.BD04gPQH.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as h}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.log","description":"","frontmatter":{"title":"liteyuki.log"},"headers":[],"relativePath":"en/dev/api/log.md","filePath":"en/dev/api/log.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/log.md"},k=h("",8),l=[k];function n(p,e,E,r,g,d){return a(),i("div",null,l)}const o=s(t,[["render",n]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_message_event.md.DkU7HnIc.js b/assets/en_dev_api_message_event.md.DkU7HnIc.js new file mode 100644 index 00000000..bab7101d --- /dev/null +++ b/assets/en_dev_api_message_event.md.DkU7HnIc.js @@ -0,0 +1,36 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.message.event","description":"","frontmatter":{"title":"liteyuki.message.event"},"headers":[],"relativePath":"en/dev/api/message/event.md","filePath":"en/dev/api/message/event.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/message/event.md"},t=e(`

liteyuki.message.event

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class MessageEvent

def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)

Description: 轻雪抽象消息事件

Source code or View on GitHub
python
def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel['MessageEvent']]=None, data: Optional[dict[str, Any]]=None):
+    """
+        轻雪抽象消息事件
+        Args:
+
+            bot_id: 机器人ID
+            message: 消息,消息段数组[{type: str, data: dict[str, Any]}]
+            raw_message: 原始消息(通常为纯文本的格式)
+            message_type: 消息类型(private, group, other)
+
+            session_id: 会话ID(私聊通常为用户ID,群聊通常为群ID)
+            session_type: 会话类型(private, group)
+            receive_channel: 接收频道(用于回复消息)
+
+            data: 附加数据
+        """
+    if data is None:
+        data = {}
+    self.message_type = message_type
+    self.data = data
+    self.bot_id = bot_id
+    self.message = message
+    self.raw_message = raw_message
+    self.session_id = session_id
+    self.session_type = session_type
+    self.user_id = user_id
+    self.receive_channel = receive_channel

def reply(self, message: str | dict[str, Any])

Description: 回复消息

Arguments:

  • message:
Source code or View on GitHub
python
def reply(self, message: str | dict[str, Any]):
+    """
+        回复消息
+        Args:
+            message:
+        Returns:
+        """
+    reply_event = MessageEvent(message_type=self.session_type, message=message, raw_message='', data={'message': message}, bot_id=self.bot_id, session_id=self.session_id, user_id=self.user_id, session_type=self.session_type, receive_channel=None)
+    if self.receive_channel:
+        self.receive_channel.send(reply_event)
`,12),h=[t];function l(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(n,[["render",l]]);export{o as __pageData,F as default}; diff --git a/assets/en_dev_api_message_event.md.DkU7HnIc.lean.js b/assets/en_dev_api_message_event.md.DkU7HnIc.lean.js new file mode 100644 index 00000000..c887faad --- /dev/null +++ b/assets/en_dev_api_message_event.md.DkU7HnIc.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const o=JSON.parse('{"title":"liteyuki.message.event","description":"","frontmatter":{"title":"liteyuki.message.event"},"headers":[],"relativePath":"en/dev/api/message/event.md","filePath":"en/dev/api/message/event.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/message/event.md"},t=e("",12),h=[t];function l(k,p,r,d,E,g){return a(),i("div",null,h)}const F=s(n,[["render",l]]);export{o as __pageData,F as default}; diff --git a/assets/en_dev_api_message_index.md.DEGPA3Qg.js b/assets/en_dev_api_message_index.md.DEGPA3Qg.js new file mode 100644 index 00000000..474679ba --- /dev/null +++ b/assets/en_dev_api_message_index.md.DEGPA3Qg.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"en/dev/api/message/index.md","filePath":"en/dev/api/message/index.md","lastUpdated":null}'),o={name:"en/dev/api/message/index.md"},n=e("h1",{id:"liteyuki-message",tabindex:"-1"},[t("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),l=e("p",null,[e("strong",null,"Description"),t(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[t("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),t(" @File : "),e("strong",null,"init"),t(".py.py @Software: PyCharm")],-1),d=[n,l,r];function m(c,p,u,_,h,k){return i(),s("div",null,d)}const f=a(o,[["render",m]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_message_index.md.DEGPA3Qg.lean.js b/assets/en_dev_api_message_index.md.DEGPA3Qg.lean.js new file mode 100644 index 00000000..474679ba --- /dev/null +++ b/assets/en_dev_api_message_index.md.DEGPA3Qg.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,j as e,a as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"en/dev/api/message/index.md","filePath":"en/dev/api/message/index.md","lastUpdated":null}'),o={name:"en/dev/api/message/index.md"},n=e("h1",{id:"liteyuki-message",tabindex:"-1"},[t("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),l=e("p",null,[e("strong",null,"Description"),t(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),r=e("p",null,[t("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),t(" @File : "),e("strong",null,"init"),t(".py.py @Software: PyCharm")],-1),d=[n,l,r];function m(c,p,u,_,h,k){return i(),s("div",null,d)}const f=a(o,[["render",m]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_message_matcher.md.fjcL64M7.js b/assets/en_dev_api_message_matcher.md.fjcL64M7.js new file mode 100644 index 00000000..fcc29cc1 --- /dev/null +++ b/assets/en_dev_api_message_matcher.md.fjcL64M7.js @@ -0,0 +1,35 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.matcher","description":"","frontmatter":{"title":"liteyuki.message.matcher"},"headers":[],"relativePath":"en/dev/api/message/matcher.md","filePath":"en/dev/api/message/matcher.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/message/matcher.md"},t=e(`

liteyuki.message.matcher

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:51 @Author : snowykami @Email : snowykami@outlook.com @File : matcher.py @Software: PyCharm

class Matcher

def __init__(self, rule: Rule, priority: int, block: bool)

Description: 匹配器

Arguments:

  • rule: 规则
  • priority: 优先级 >= 0
  • block: 是否阻断后续优先级更低的匹配器
Source code or View on GitHub
python
def __init__(self, rule: Rule, priority: int, block: bool):
+    """
+        匹配器
+        Args:
+            rule: 规则
+            priority: 优先级 >= 0
+            block: 是否阻断后续优先级更低的匹配器
+        """
+    self.rule = rule
+    self.priority = priority
+    self.block = block
+    self.handlers: list[EventHandler] = []

def handle(self) -> Callable[[EventHandler], EventHandler]

Description: 添加处理函数,装饰器

Return: 装饰器 handler

Source code or View on GitHub
python
def handle(self) -> Callable[[EventHandler], EventHandler]:
+    """
+        添加处理函数,装饰器
+        Returns:
+            装饰器 handler
+        """
+
+    def decorator(handler: EventHandler) -> EventHandler:
+        self.handlers.append(handler)
+        return handler
+    return decorator

async def run(self, event: MessageEvent) -> None

Description: 运行处理函数

Arguments:

  • event:
Source code or View on GitHub
python
async def run(self, event: MessageEvent) -> None:
+    """
+        运行处理函数
+        Args:
+            event:
+        Returns:
+        """
+    if not await self.rule(event):
+        return
+    for handler in self.handlers:
+        try:
+            await handler(event)
+        except Exception:
+            traceback.print_exc()
`,18),l=[t];function h(p,k,r,o,d,c){return a(),i("div",null,l)}const E=s(n,[["render",h]]);export{y as __pageData,E as default}; diff --git a/assets/en_dev_api_message_matcher.md.fjcL64M7.lean.js b/assets/en_dev_api_message_matcher.md.fjcL64M7.lean.js new file mode 100644 index 00000000..4b297d31 --- /dev/null +++ b/assets/en_dev_api_message_matcher.md.fjcL64M7.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.matcher","description":"","frontmatter":{"title":"liteyuki.message.matcher"},"headers":[],"relativePath":"en/dev/api/message/matcher.md","filePath":"en/dev/api/message/matcher.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/message/matcher.md"},t=e("",18),l=[t];function h(p,k,r,o,d,c){return a(),i("div",null,l)}const E=s(n,[["render",h]]);export{y as __pageData,E as default}; diff --git a/assets/en_dev_api_message_message.md.D0iZgCWF.js b/assets/en_dev_api_message_message.md.D0iZgCWF.js new file mode 100644 index 00000000..e489c195 --- /dev/null +++ b/assets/en_dev_api_message_message.md.D0iZgCWF.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as i,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"en/dev/api/message/message.md","filePath":"en/dev/api/message/message.md","lastUpdated":null}'),o={name:"en/dev/api/message/message.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[s("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),r=e("p",null,[e("strong",null,"Description"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),n=e("p",null,[s("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : "),e("strong",null,"init"),s(".py.py @Software: PyCharm")],-1),m=[l,r,n];function c(d,p,u,_,g,h){return i(),t("div",null,m)}const f=a(o,[["render",c]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_message_message.md.D0iZgCWF.lean.js b/assets/en_dev_api_message_message.md.D0iZgCWF.lean.js new file mode 100644 index 00000000..e489c195 --- /dev/null +++ b/assets/en_dev_api_message_message.md.D0iZgCWF.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as i,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message","description":"","frontmatter":{"title":"liteyuki.message","collapsed":true},"headers":[],"relativePath":"en/dev/api/message/message.md","filePath":"en/dev/api/message/message.md","lastUpdated":null}'),o={name:"en/dev/api/message/message.md"},l=e("h1",{id:"liteyuki-message",tabindex:"-1"},[s("liteyuki.message "),e("a",{class:"header-anchor",href:"#liteyuki-message","aria-label":'Permalink to "liteyuki.message"'},"​")],-1),r=e("p",null,[e("strong",null,"Description"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),n=e("p",null,[s("@Time : 2024/8/19 下午10:44 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : "),e("strong",null,"init"),s(".py.py @Software: PyCharm")],-1),m=[l,r,n];function c(d,p,u,_,g,h){return i(),t("div",null,m)}const f=a(o,[["render",c]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_message_on.md.Bpf1nKZ0.js b/assets/en_dev_api_message_on.md.Bpf1nKZ0.js new file mode 100644 index 00000000..32e5e60c --- /dev/null +++ b/assets/en_dev_api_message_on.md.Bpf1nKZ0.js @@ -0,0 +1,15 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.message.on","description":"","frontmatter":{"title":"liteyuki.message.on"},"headers":[],"relativePath":"en/dev/api/message/on.md","filePath":"en/dev/api/message/on.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/message/on.md"},n=e(`

liteyuki.message.on

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:52 @Author : snowykami @Email : snowykami@outlook.com @File : on.py @Software: PyCharm

def add_matcher(matcher: Matcher)

Source code or View on GitHub
python
def add_matcher(matcher: Matcher):
+    for i, m in enumerate(_matcher_list):
+        if m.priority < matcher.priority:
+            _matcher_list.insert(i, matcher)
+            break
+    else:
+        _matcher_list.append(matcher)

def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

Source code or View on GitHub
python
def on_message(rule: Rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+    matcher = Matcher(rule, priority, block)
+    add_matcher(matcher)
+    return matcher

def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

Source code or View on GitHub
python
def on_keywords(keywords: list[str], rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+
+    @Rule
+    async def on_keywords_rule(event: MessageEvent):
+        return any((keyword in event.raw_message for keyword in keywords))
+    return on_message(on_keywords_rule & rule, priority, block)
`,9),l=[n];function h(r,k,p,o,d,y){return a(),i("div",null,l)}const E=s(t,[["render",h]]);export{g as __pageData,E as default}; diff --git a/assets/en_dev_api_message_on.md.Bpf1nKZ0.lean.js b/assets/en_dev_api_message_on.md.Bpf1nKZ0.lean.js new file mode 100644 index 00000000..515fe3aa --- /dev/null +++ b/assets/en_dev_api_message_on.md.Bpf1nKZ0.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as e}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.message.on","description":"","frontmatter":{"title":"liteyuki.message.on"},"headers":[],"relativePath":"en/dev/api/message/on.md","filePath":"en/dev/api/message/on.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/message/on.md"},n=e("",9),l=[n];function h(r,k,p,o,d,y){return a(),i("div",null,l)}const E=s(t,[["render",h]]);export{g as __pageData,E as default}; diff --git a/assets/en_dev_api_message_rule.md.L6rc-HBj.js b/assets/en_dev_api_message_rule.md.L6rc-HBj.js new file mode 100644 index 00000000..a7dea55f --- /dev/null +++ b/assets/en_dev_api_message_rule.md.L6rc-HBj.js @@ -0,0 +1 @@ +import{_ as s,c as e,o as i,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.message.rule","description":"","frontmatter":{"title":"liteyuki.message.rule"},"headers":[],"relativePath":"en/dev/api/message/rule.md","filePath":"en/dev/api/message/rule.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/message/rule.md"},n=a('

liteyuki.message.rule

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:55 @Author : snowykami @Email : snowykami@outlook.com @File : rule.py @Software: PyCharm

var RuleHandlerFunc

  • Description: 规则函数签名

  • Type: TypeAlias

  • Default: Callable[[MessageEvent], Coroutine[None, None, bool]]

class Rule

def __init__(self, handler: RuleHandlerFunc)

Source code or View on GitHub
python
def __init__(self, handler: RuleHandlerFunc):\n    self.handler = handler

def __or__(self, other: Rule) -> Rule

Source code or View on GitHub
python
def __or__(self, other: 'Rule') -> 'Rule':\n\n    async def combined_handler(event: MessageEvent) -> bool:\n        return await self.handler(event) or await other.handler(event)\n    return Rule(combined_handler)

def __and__(self, other: Rule) -> Rule

Source code or View on GitHub
python
def __and__(self, other: 'Rule') -> 'Rule':\n\n    async def combined_handler(event: MessageEvent) -> bool:\n        return await self.handler(event) and await other.handler(event)\n    return Rule(combined_handler)

async def __call__(self, event: MessageEvent) -> bool

Source code or View on GitHub
python
async def __call__(self, event: MessageEvent) -> bool:\n    if self.handler is None:\n        return True\n    return await self.handler(event)

@Rule

async def empty_rule(event: MessageEvent) -> bool

Source code or View on GitHub
python
@Rule\nasync def empty_rule(event: MessageEvent) -> bool:\n    return True

@Rule

async def is_su_rule(event: MessageEvent) -> bool

Source code or View on GitHub
python
@Rule\nasync def is_su_rule(event: MessageEvent) -> bool:\n    return str(event.user_id) in _superusers
',20),l=[n];function h(r,p,k,d,o,u){return i(),e("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/en_dev_api_message_rule.md.L6rc-HBj.lean.js b/assets/en_dev_api_message_rule.md.L6rc-HBj.lean.js new file mode 100644 index 00000000..91baa0c5 --- /dev/null +++ b/assets/en_dev_api_message_rule.md.L6rc-HBj.lean.js @@ -0,0 +1 @@ +import{_ as s,c as e,o as i,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.message.rule","description":"","frontmatter":{"title":"liteyuki.message.rule"},"headers":[],"relativePath":"en/dev/api/message/rule.md","filePath":"en/dev/api/message/rule.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/message/rule.md"},n=a("",20),l=[n];function h(r,p,k,d,o,u){return i(),e("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/en_dev_api_message_session.md.DMwGauxy.js b/assets/en_dev_api_message_session.md.DMwGauxy.js new file mode 100644 index 00000000..c61961a8 --- /dev/null +++ b/assets/en_dev_api_message_session.md.DMwGauxy.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.session","description":"","frontmatter":{"title":"liteyuki.message.session"},"headers":[],"relativePath":"en/dev/api/message/session.md","filePath":"en/dev/api/message/session.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/message/session.md"},n=e("h1",{id:"liteyuki-message-session",tabindex:"-1"},[s("liteyuki.message.session "),e("a",{class:"header-anchor",href:"#liteyuki-message-session","aria-label":'Permalink to "liteyuki.message.session"'},"​")],-1),r=e("p",null,[e("strong",null,"Description"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),l=e("p",null,[s("@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : session.py @Software: PyCharm")],-1),m=[n,r,l];function c(d,p,_,u,h,k){return i(),a("div",null,m)}const f=t(o,[["render",c]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_message_session.md.DMwGauxy.lean.js b/assets/en_dev_api_message_session.md.DMwGauxy.lean.js new file mode 100644 index 00000000..c61961a8 --- /dev/null +++ b/assets/en_dev_api_message_session.md.DMwGauxy.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,j as e,a as s}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.message.session","description":"","frontmatter":{"title":"liteyuki.message.session"},"headers":[],"relativePath":"en/dev/api/message/session.md","filePath":"en/dev/api/message/session.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/message/session.md"},n=e("h1",{id:"liteyuki-message-session",tabindex:"-1"},[s("liteyuki.message.session "),e("a",{class:"header-anchor",href:"#liteyuki-message-session","aria-label":'Permalink to "liteyuki.message.session"'},"​")],-1),r=e("p",null,[e("strong",null,"Description"),s(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),l=e("p",null,[s("@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),s(" @File : session.py @Software: PyCharm")],-1),m=[n,r,l];function c(d,p,_,u,h,k){return i(),a("div",null,m)}const f=t(o,[["render",c]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_mkdoc.md.EVvNGPKX.js b/assets/en_dev_api_mkdoc.md.EVvNGPKX.js new file mode 100644 index 00000000..d63245c7 --- /dev/null +++ b/assets/en_dev_api_mkdoc.md.EVvNGPKX.js @@ -0,0 +1,161 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.mkdoc","description":"","frontmatter":{"title":"liteyuki.mkdoc"},"headers":[],"relativePath":"en/dev/api/mkdoc.md","filePath":"en/dev/api/mkdoc.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/mkdoc.md"},h=t(`

liteyuki.mkdoc

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 上午6:23 @Author : snowykami @Email : snowykami@outlook.com @File : mkdoc.py @Software: PyCharm

class DefType(Enum)

attr FUNCTION = 'function'

attr METHOD = 'method'

attr STATIC_METHOD = 'staticmethod'

attr CLASS_METHOD = 'classmethod'

attr PROPERTY = 'property'

class FunctionInfo(BaseModel)

attr name: str = NO_DEFAULT

attr args: list[tuple[str, str]] = NO_DEFAULT

attr return_type: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr source_code: str = ''

attr type: DefType = NO_DEFAULT

attr is_async: bool = NO_DEFAULT

class AttributeInfo(BaseModel)

attr name: str = NO_DEFAULT

attr type: str = NO_DEFAULT

attr value: Any = None

attr docstring: str = ''

class ClassInfo(BaseModel)

attr name: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr methods: list[FunctionInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr inherit: list[str] = NO_DEFAULT

class ModuleInfo(BaseModel)

attr module_path: str = NO_DEFAULT

attr functions: list[FunctionInfo] = NO_DEFAULT

attr classes: list[ClassInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr docstring: str = NO_DEFAULT

def get_relative_path(base_path: str, target_path: str) -> str

Description: 获取相对路径

Arguments:

  • base_path: 基础路径
  • target_path: 目标路径
Source code or View on GitHub
python
def get_relative_path(base_path: str, target_path: str) -> str:
+    """
+    获取相对路径
+    Args:
+        base_path: 基础路径
+        target_path: 目标路径
+    """
+    return os.path.relpath(target_path, base_path)

def write_to_files(file_data: dict[str, str])

Description: 输出文件

Arguments:

  • file_data: 文件数据 相对路径
Source code or View on GitHub
python
def write_to_files(file_data: dict[str, str]):
+    """
+    输出文件
+    Args:
+        file_data: 文件数据 相对路径
+    """
+    for rp, data in file_data.items():
+        if not os.path.exists(os.path.dirname(rp)):
+            os.makedirs(os.path.dirname(rp))
+        with open(rp, 'w', encoding='utf-8') as f:
+            f.write(data)

def get_file_list(module_folder: str)

Source code or View on GitHub
python
def get_file_list(module_folder: str):
+    file_list = []
+    for root, dirs, files in os.walk(module_folder):
+        for file in files:
+            if file.endswith(('.py', '.pyi')):
+                file_list.append(os.path.join(root, file))
+    return file_list

def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo

Description: 获取函数和类

Arguments:

  • file_path: Python 文件路径
  • ignore_private: 忽略私有函数和类

Return: 模块信息

Source code or View on GitHub
python
def get_module_info_normal(file_path: str, ignore_private: bool=True) -> ModuleInfo:
+    """
+    获取函数和类
+    Args:
+        file_path: Python 文件路径
+        ignore_private: 忽略私有函数和类
+    Returns:
+        模块信息
+    """
+    with open(file_path, 'r', encoding='utf-8') as file:
+        file_content = file.read()
+        tree = ast.parse(file_content)
+    dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')
+    module_docstring = ast.get_docstring(tree)
+    module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')
+    for node in ast.walk(tree):
+        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
+            if not any((isinstance(parent, ast.ClassDef) for parent in ast.iter_child_nodes(node))) and (not ignore_private or not node.name.startswith('_')):
+                if node.args.args:
+                    first_arg = node.args.args[0]
+                    if first_arg.arg in ('self', 'cls'):
+                        continue
+                function_docstring = ast.get_docstring(node)
+                func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))
+                module_info.functions.append(func_info)
+        elif isinstance(node, ast.ClassDef):
+            class_docstring = ast.get_docstring(node)
+            class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])
+            for class_node in node.body:
+                if isinstance(class_node, ast.FunctionDef) and (not ignore_private or not class_node.name.startswith('_') or class_node.name == '__init__'):
+                    method_docstring = ast.get_docstring(class_node)
+                    def_type = DefType.METHOD
+                    if class_node.decorator_list:
+                        if any((isinstance(decorator, ast.Name) and decorator.id == 'staticmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.STATIC_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'classmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.CLASS_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'property' for decorator in class_node.decorator_list)):
+                            def_type = DefType.PROPERTY
+                    class_info.methods.append(FunctionInfo(name=class_node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in class_node.args.args], return_type=ast.unparse(class_node.returns) if class_node.returns else 'None', docstring=method_docstring if method_docstring else '', type=def_type, is_async=isinstance(class_node, ast.AsyncFunctionDef), source_code=ast.unparse(class_node)))
+                elif isinstance(class_node, ast.Assign):
+                    for target in class_node.targets:
+                        if isinstance(target, ast.Name):
+                            class_info.attributes.append(AttributeInfo(name=target.id, type=ast.unparse(class_node.value)))
+            module_info.classes.append(class_info)
+        elif isinstance(node, ast.Assign):
+            if not any((isinstance(parent, (ast.ClassDef, ast.FunctionDef)) for parent in ast.iter_child_nodes(node))):
+                for target in node.targets:
+                    if isinstance(target, ast.Name) and (not ignore_private or not target.id.startswith('_')):
+                        attr_type = NO_TYPE_HINT
+                        if isinstance(node.value, ast.AnnAssign) and node.value.annotation:
+                            attr_type = ast.unparse(node.value.annotation)
+                        module_info.attributes.append(AttributeInfo(name=target.id, type=attr_type, value=ast.unparse(node.value) if node.value else None))
+    return module_info

def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str

Description: 生成模块的Markdown 你可在此自定义生成的Markdown格式

Arguments:

  • module_info: 模块信息
  • front_matter: 自定义选项title, index, icon, category
  • lang: 语言

Return: Markdown 字符串

Source code or View on GitHub
python
def generate_markdown(module_info: ModuleInfo, front_matter=None, lang: str='zh-CN') -> str:
+    """
+    生成模块的Markdown
+    你可在此自定义生成的Markdown格式
+    Args:
+        module_info: 模块信息
+        front_matter: 自定义选项title, index, icon, category
+        lang: 语言
+    Returns:
+        Markdown 字符串
+    """
+    content = ''
+    front_matter = '---\\n' + '\\n'.join([f'{k}: {v}' for k, v in front_matter.items()]) + '\\n---\\n\\n'
+    content += front_matter
+    for func in module_info.functions:
+        args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]
+        content += f"### ***{('async ' if func.is_async else '')}def*** \`{func.name}({', '.join(args_with_type)}) -> {func.return_type}\`\\n\\n"
+        func.docstring = func.docstring.replace('\\n', '\\n\\n')
+        content += f'{func.docstring}\\n\\n'
+        content += f'<details>\\n<summary>源代码</summary>\\n\\n\`\`\`python\\n{func.source_code}\\n\`\`\`\\n</details>\\n\\n'
+    for cls in module_info.classes:
+        if cls.inherit:
+            inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''
+            content += f'### ***class*** \`{cls.name}{inherit}\`\\n\\n'
+        else:
+            content += f'### ***class*** \`{cls.name}\`\\n\\n'
+        cls.docstring = cls.docstring.replace('\\n', '\\n\\n')
+        content += f'{cls.docstring}\\n\\n'
+        for method in cls.methods:
+            if method.type != DefType.METHOD:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]
+                content += f'### &emsp; ***@{method.type.value}***\\n'
+            else:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]
+            content += f"### &emsp; ***{('async ' if method.is_async else '')}def*** \`{method.name}({', '.join(args_with_type)}) -> {method.return_type}\`\\n\\n"
+            method.docstring = method.docstring.replace('\\n', '\\n\\n')
+            content += f'&emsp;{method.docstring}\\n\\n'
+            if lang == 'zh-CN':
+                TEXT_SOURCE_CODE = '源代码'
+            else:
+                TEXT_SOURCE_CODE = 'Source Code'
+            content += f'<details>\\n<summary>{TEXT_SOURCE_CODE}</summary>\\n\\n\`\`\`python\\n{method.source_code}\\n\`\`\`\\n</details>\\n\\n'
+        for attr in cls.attributes:
+            content += f'### &emsp; ***attr*** \`{attr.name}: {attr.type}\`\\n\\n'
+    for attr in module_info.attributes:
+        if attr.type == NO_TYPE_HINT:
+            content += f'### ***var*** \`{attr.name} = {attr.value}\`\\n\\n'
+        else:
+            content += f'### ***var*** \`{attr.name}: {attr.type} = {attr.value}\`\\n\\n'
+        attr.docstring = attr.docstring.replace('\\n', '\\n\\n')
+        content += f'{attr.docstring}\\n\\n'
+    return content

def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)

Description: 生成文档

Arguments:

  • module_folder: 模块文件夹
  • output_dir: 输出文件夹
  • with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
  • ignored_paths: 忽略的路径
  • lang: 语言
Source code or View on GitHub
python
def generate_docs(module_folder: str, output_dir: str, with_top: bool=False, lang: str='zh-CN', ignored_paths=None):
+    """
+    生成文档
+    Args:
+        module_folder: 模块文件夹
+        output_dir: 输出文件夹
+        with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
+        ignored_paths: 忽略的路径
+        lang: 语言
+    """
+    if ignored_paths is None:
+        ignored_paths = []
+    file_data: dict[str, str] = {}
+    file_list = get_file_list(module_folder)
+    shutil.rmtree(output_dir, ignore_errors=True)
+    os.mkdir(output_dir)
+    replace_data = {'__init__': 'README', '.py': '.md'}
+    for pyfile_path in file_list:
+        if any((ignored_path.replace('\\\\', '/') in pyfile_path.replace('\\\\', '/') for ignored_path in ignored_paths)):
+            continue
+        no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)
+        rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
+        for rk, rv in replace_data.items():
+            rel_md_path = rel_md_path.replace(rk, rv)
+        abs_md_path = os.path.join(output_dir, rel_md_path)
+        module_info = get_module_info_normal(pyfile_path)
+        if 'README' in abs_md_path:
+            front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}
+        else:
+            front_matter = {'title': module_info.module_path.replace('_', '\\\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}
+        md_content = generate_markdown(module_info, front_matter)
+        print(f'Generate {pyfile_path} -> {abs_md_path}')
+        file_data[abs_md_path] = md_content
+    write_to_files(file_data)

var no_module_name_pyfile_path

  • Description: 去头路径

  • Default: get_relative_path(module_folder, pyfile_path)

`,65),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(n,[["render",l]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_mkdoc.md.EVvNGPKX.lean.js b/assets/en_dev_api_mkdoc.md.EVvNGPKX.lean.js new file mode 100644 index 00000000..ac1e661a --- /dev/null +++ b/assets/en_dev_api_mkdoc.md.EVvNGPKX.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as t}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.mkdoc","description":"","frontmatter":{"title":"liteyuki.mkdoc"},"headers":[],"relativePath":"en/dev/api/mkdoc.md","filePath":"en/dev/api/mkdoc.md","lastUpdated":1725101868000}'),n={name:"en/dev/api/mkdoc.md"},h=t("",65),k=[h];function l(p,e,r,E,d,g){return a(),i("div",null,k)}const o=s(n,[["render",l]]);export{y as __pageData,o as default}; diff --git a/assets/en_dev_api_plugin_index.md.7EqtiaFh.js b/assets/en_dev_api_plugin_index.md.7EqtiaFh.js new file mode 100644 index 00000000..962f85ec --- /dev/null +++ b/assets/en_dev_api_plugin_index.md.7EqtiaFh.js @@ -0,0 +1,7 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugin/index.md","filePath":"en/dev/api/plugin/index.md","lastUpdated":null}'),e={name:"en/dev/api/plugin/index.md"},n=a(`

liteyuki.plugin

def get_loaded_plugins() -> dict[str, Plugin]

Description: 获取已加载的插件

Return: dict[str, Plugin]: 插件字典

Source code or View on GitHub
python
def get_loaded_plugins() -> dict[str, Plugin]:
+    """
+    获取已加载的插件
+    Returns:
+        dict[str, Plugin]: 插件字典
+    """
+    return _plugins
`,5),l=[n];function p(d,r,o,h,u,g){return t(),s("div",null,l)}const _=i(e,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/en_dev_api_plugin_index.md.7EqtiaFh.lean.js b/assets/en_dev_api_plugin_index.md.7EqtiaFh.lean.js new file mode 100644 index 00000000..2ffc2b54 --- /dev/null +++ b/assets/en_dev_api_plugin_index.md.7EqtiaFh.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugin/index.md","filePath":"en/dev/api/plugin/index.md","lastUpdated":null}'),e={name:"en/dev/api/plugin/index.md"},n=a("",5),l=[n];function p(d,r,o,h,u,g){return t(),s("div",null,l)}const _=i(e,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/en_dev_api_plugin_load.md.BWXzuii9.js b/assets/en_dev_api_plugin_load.md.BWXzuii9.js new file mode 100644 index 00000000..9e1b054d --- /dev/null +++ b/assets/en_dev_api_plugin_load.md.BWXzuii9.js @@ -0,0 +1,83 @@ +import{_ as h,D as l,c as t,j as i,a as s,I as k,w as p,a4 as a,o as e}from"./chunks/framework.C3o_UkTa.js";const B=JSON.parse('{"title":"liteyuki.plugin.load","description":"","frontmatter":{"title":"liteyuki.plugin.load"},"headers":[],"relativePath":"en/dev/api/plugin/load.md","filePath":"en/dev/api/plugin/load.md","lastUpdated":1725101868000}'),E={name:"en/dev/api/plugin/load.md"},d=a(`

liteyuki.plugin.load

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : snowykami@outlook.com @File : load.py @Software: PyCharm

def load_plugin(module_path: str | Path) -> Optional[Plugin]

Description: 加载单个插件,可以是本地插件或是通过 pip 安装的插件。

Arguments:

  • module_path: 插件名称 path.to.your.plugin
  • 或插件路径 pathlib.Path(path/to/your/plugin):
Source code or View on GitHub
python
def load_plugin(module_path: str | Path) -> Optional[Plugin]:
+    """加载单个插件,可以是本地插件或是通过 \`pip\` 安装的插件。
+
+    参数:
+        module_path: 插件名称 \`path.to.your.plugin\`
+        或插件路径 \`pathlib.Path(path/to/your/plugin)\`
+    """
+    module_path = path_to_module_name(Path(module_path)) if isinstance(module_path, Path) else module_path
+    try:
+        module = import_module(module_path)
+        _plugins[module.__name__] = Plugin(name=module.__name__, module=module, module_name=module_path)
+        if module.__dict__.get('__plugin_metadata__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_metadata__']
+            display_name = module.__name__.split('.')[-1]
+        elif module.__dict__.get('__liteyuki_plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__liteyuki_plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        elif module.__dict__.get('__plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        else:
+            logger.opt(colors=True).warning(f'The metadata of Liteyuki plugin "{module.__name__}" is not specified, use empty.')
+            metadata = PluginMetadata(name=module.__name__)
+            display_name = module.__name__.split('.')[-1]
+        _plugins[module.__name__].metadata = metadata
+        logger.opt(colors=True).success(f'Succeeded to load liteyuki plugin "{display_name}"')
+        return _plugins[module.__name__]
+    except Exception as e:
+        logger.opt(colors=True).success(f'Failed to load liteyuki plugin "<r>{module_path}</r>"')
+        traceback.print_exc()
+        return None

def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]

Description: 导入文件夹下多个插件

Arguments:

  • plugin_dir: 文件夹路径
  • ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
Source code or View on GitHub
python
def load_plugins(*plugin_dir: str, ignore_warning: bool=True) -> set[Plugin]:
+    """导入文件夹下多个插件
+
+    参数:
+        plugin_dir: 文件夹路径
+        ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
+    """
+    plugins = set()
+    for dir_path in plugin_dir:
+        if not os.path.exists(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' does not exist.")
+            continue
+        if not os.listdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is empty.")
+            continue
+        if not os.path.isdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is not a directory.")
+            continue
+        for f in os.listdir(dir_path):
+            path = Path(os.path.join(dir_path, f))
+            module_name = None
+            if os.path.isfile(path) and f.endswith('.py') and (f != '__init__.py'):
+                module_name = f'{path_to_module_name(Path(dir_path))}.{f[:-3]}'
+            elif os.path.isdir(path) and os.path.exists(os.path.join(path, '__init__.py')):
+                module_name = path_to_module_name(path)
+            if module_name:
+                load_plugin(module_name)
+                if _plugins.get(module_name):
+                    plugins.add(_plugins[module_name])
+    return plugins

def format_display_name(display_name: str, plugin_type: PluginType) -> str

Description: 设置插件名称颜色,根据不同类型插件设置颜色

Arguments:

  • display_name: 插件名称
  • plugin_type: 插件类型
`,17),r=i("strong",null,"Return",-1),g=a(`
Source code or View on GitHub
python
def format_display_name(display_name: str, plugin_type: PluginType) -> str:
+    """
+    设置插件名称颜色,根据不同类型插件设置颜色
+    Args:
+        display_name: 插件名称
+        plugin_type: 插件类型
+
+    Returns:
+        str: 设置后的插件名称 <y>name</y>
+    """
+    color = 'y'
+    match plugin_type:
+        case PluginType.APPLICATION:
+            color = 'm'
+        case PluginType.TEST:
+            color = 'g'
+        case PluginType.MODULE:
+            color = 'e'
+        case PluginType.SERVICE:
+            color = 'c'
+    return f'<{color}>{display_name} [{plugin_type.name}]</{color}>'
`,1);function y(F,o,u,_,C,c){const n=l("y");return e(),t("div",null,[d,i("p",null,[r,s(": str: 设置后的插件名称 "),k(n,null,{default:p(()=>[s("name")]),_:1})]),g])}const A=h(E,[["render",y]]);export{B as __pageData,A as default}; diff --git a/assets/en_dev_api_plugin_load.md.BWXzuii9.lean.js b/assets/en_dev_api_plugin_load.md.BWXzuii9.lean.js new file mode 100644 index 00000000..68423a1d --- /dev/null +++ b/assets/en_dev_api_plugin_load.md.BWXzuii9.lean.js @@ -0,0 +1 @@ +import{_ as h,D as l,c as t,j as i,a as s,I as k,w as p,a4 as a,o as e}from"./chunks/framework.C3o_UkTa.js";const B=JSON.parse('{"title":"liteyuki.plugin.load","description":"","frontmatter":{"title":"liteyuki.plugin.load"},"headers":[],"relativePath":"en/dev/api/plugin/load.md","filePath":"en/dev/api/plugin/load.md","lastUpdated":1725101868000}'),E={name:"en/dev/api/plugin/load.md"},d=a("",17),r=i("strong",null,"Return",-1),g=a("",1);function y(F,o,u,_,C,c){const n=l("y");return e(),t("div",null,[d,i("p",null,[r,s(": str: 设置后的插件名称 "),k(n,null,{default:p(()=>[s("name")]),_:1})]),g])}const A=h(E,[["render",y]]);export{B as __pageData,A as default}; diff --git a/assets/en_dev_api_plugin_manager.md.Cq1g681t.js b/assets/en_dev_api_plugin_manager.md.Cq1g681t.js new file mode 100644 index 00000000..562e8dc4 --- /dev/null +++ b/assets/en_dev_api_plugin_manager.md.Cq1g681t.js @@ -0,0 +1 @@ +import{_ as t,c as i,o as n,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.plugin.manager","description":"","frontmatter":{"title":"liteyuki.plugin.manager"},"headers":[],"relativePath":"en/dev/api/plugin/manager.md","filePath":"en/dev/api/plugin/manager.md","lastUpdated":1725101868000}'),r={name:"en/dev/api/plugin/manager.md"},o=e("h1",{id:"liteyuki-plugin-manager",tabindex:"-1"},[a("liteyuki.plugin.manager "),e("a",{class:"header-anchor",href:"#liteyuki-plugin-manager","aria-label":'Permalink to "liteyuki.plugin.manager"'},"​")],-1),l=e("p",null,[e("strong",null,"Description"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),s=e("p",null,[a("@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : manager.py @Software: PyCharm")],-1),m=[o,l,s];function p(u,c,d,g,_,h){return n(),i("div",null,m)}const f=t(r,[["render",p]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_plugin_manager.md.Cq1g681t.lean.js b/assets/en_dev_api_plugin_manager.md.Cq1g681t.lean.js new file mode 100644 index 00000000..562e8dc4 --- /dev/null +++ b/assets/en_dev_api_plugin_manager.md.Cq1g681t.lean.js @@ -0,0 +1 @@ +import{_ as t,c as i,o as n,j as e,a}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"liteyuki.plugin.manager","description":"","frontmatter":{"title":"liteyuki.plugin.manager"},"headers":[],"relativePath":"en/dev/api/plugin/manager.md","filePath":"en/dev/api/plugin/manager.md","lastUpdated":1725101868000}'),r={name:"en/dev/api/plugin/manager.md"},o=e("h1",{id:"liteyuki-plugin-manager",tabindex:"-1"},[a("liteyuki.plugin.manager "),e("a",{class:"header-anchor",href:"#liteyuki-plugin-manager","aria-label":'Permalink to "liteyuki.plugin.manager"'},"​")],-1),l=e("p",null,[e("strong",null,"Description"),a(": Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved")],-1),s=e("p",null,[a("@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : "),e("a",{href:"mailto:snowykami@outlook.com",target:"_blank",rel:"noreferrer"},"snowykami@outlook.com"),a(" @File : manager.py @Software: PyCharm")],-1),m=[o,l,s];function p(u,c,d,g,_,h){return n(),i("div",null,m)}const f=t(r,[["render",p]]);export{y as __pageData,f as default}; diff --git a/assets/en_dev_api_plugin_model.md.CeWxdiF_.js b/assets/en_dev_api_plugin_model.md.CeWxdiF_.js new file mode 100644 index 00000000..54bb43fd --- /dev/null +++ b/assets/en_dev_api_plugin_model.md.CeWxdiF_.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as r}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugin.model","description":"","frontmatter":{"title":"liteyuki.plugin.model"},"headers":[],"relativePath":"en/dev/api/plugin/model.md","filePath":"en/dev/api/plugin/model.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/plugin/model.md"},s=r('

liteyuki.plugin.model

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/24 上午12:02 @Author : snowykami @Email : snowykami@outlook.com @File : model.py @Software: PyCharm

class PluginType(Enum)

attr APPLICATION = 'application'

attr SERVICE = 'service'

attr MODULE = 'module'

attr UNCLASSIFIED = 'unclassified'

attr TEST = 'test'

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr type: PluginType = PluginType.UNCLASSIFIED

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)

def __hash__(self)

Source code or View on GitHub
python
def __hash__(self):\n    return hash(self.module_name)

attr model_config = {'arbitrary_types_allowed': True}

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr metadata: Optional[PluginMetadata] = None

',25),i=[s];function l(n,d,h,c,u,m){return e(),t("div",null,i)}const k=a(o,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/en_dev_api_plugin_model.md.CeWxdiF_.lean.js b/assets/en_dev_api_plugin_model.md.CeWxdiF_.lean.js new file mode 100644 index 00000000..42db6f7c --- /dev/null +++ b/assets/en_dev_api_plugin_model.md.CeWxdiF_.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,a4 as r}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugin.model","description":"","frontmatter":{"title":"liteyuki.plugin.model"},"headers":[],"relativePath":"en/dev/api/plugin/model.md","filePath":"en/dev/api/plugin/model.md","lastUpdated":1725101868000}'),o={name:"en/dev/api/plugin/model.md"},s=r("",25),i=[s];function l(n,d,h,c,u,m){return e(),t("div",null,i)}const k=a(o,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/en_dev_api_plugin_plugin.md.C9viahSZ.js b/assets/en_dev_api_plugin_plugin.md.C9viahSZ.js new file mode 100644 index 00000000..a7325ad1 --- /dev/null +++ b/assets/en_dev_api_plugin_plugin.md.C9viahSZ.js @@ -0,0 +1,7 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugin/plugin.md","filePath":"en/dev/api/plugin/plugin.md","lastUpdated":null}'),n={name:"en/dev/api/plugin/plugin.md"},e=a(`

liteyuki.plugin

def get_loaded_plugins() -> dict[str, Plugin]

Description: 获取已加载的插件

Return: dict[str, Plugin]: 插件字典

Source code or View on GitHub
python
def get_loaded_plugins() -> dict[str, Plugin]:
+    """
+    获取已加载的插件
+    Returns:
+        dict[str, Plugin]: 插件字典
+    """
+    return _plugins
`,5),l=[e];function p(d,r,o,u,h,g){return t(),s("div",null,l)}const _=i(n,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/en_dev_api_plugin_plugin.md.C9viahSZ.lean.js b/assets/en_dev_api_plugin_plugin.md.C9viahSZ.lean.js new file mode 100644 index 00000000..f23f1b5f --- /dev/null +++ b/assets/en_dev_api_plugin_plugin.md.C9viahSZ.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as t,a4 as a}from"./chunks/framework.C3o_UkTa.js";const c=JSON.parse('{"title":"liteyuki.plugin","description":"","frontmatter":{"title":"liteyuki.plugin","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugin/plugin.md","filePath":"en/dev/api/plugin/plugin.md","lastUpdated":null}'),n={name:"en/dev/api/plugin/plugin.md"},e=a("",5),l=[e];function p(d,r,o,u,h,g){return t(),s("div",null,l)}const _=i(n,[["render",p]]);export{c as __pageData,_ as default}; diff --git a/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.js b/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.js new file mode 100644 index 00000000..7570c6e9 --- /dev/null +++ b/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as s,a4 as t}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugins.liteecho","description":"","frontmatter":{"title":"liteyuki.plugins.liteecho"},"headers":[],"relativePath":"en/dev/api/plugins/liteecho.md","filePath":"en/dev/api/plugins/liteecho.md","lastUpdated":1725101868000}'),a={name:"en/dev/api/plugins/liteecho.md"},l=t('

liteyuki.plugins.liteecho

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/22 下午12:31 @Author : snowykami @Email : snowykami@outlook.com @File : liteecho.py @Software: PyCharm

@on_startswith(['liteecho'], rule=is_su_rule).handle()

async def liteecho(event: MessageEvent)

Source code or View on GitHub
python
@on_startswith(['liteecho'], rule=is_su_rule).handle()\nasync def liteecho(event: MessageEvent):\n    event.reply(event.raw_message.strip()[8:].strip())
',6),n=[l];function h(o,p,r,k,c,d){return s(),i("div",null,n)}const y=e(a,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.lean.js b/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.lean.js new file mode 100644 index 00000000..365a5465 --- /dev/null +++ b/assets/en_dev_api_plugins_liteecho.md.w4kQQyNd.lean.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as s,a4 as t}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.plugins.liteecho","description":"","frontmatter":{"title":"liteyuki.plugins.liteecho"},"headers":[],"relativePath":"en/dev/api/plugins/liteecho.md","filePath":"en/dev/api/plugins/liteecho.md","lastUpdated":1725101868000}'),a={name:"en/dev/api/plugins/liteecho.md"},l=t("",6),n=[l];function h(o,p,r,k,c,d){return s(),i("div",null,n)}const y=e(a,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.js b/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.js new file mode 100644 index 00000000..7dd7c030 --- /dev/null +++ b/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.js @@ -0,0 +1,8 @@ +import{_ as i,c as s,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugins/plugin_loader/index.md","filePath":"en/dev/api/plugins/plugin_loader/index.md","lastUpdated":null}'),l={name:"en/dev/api/plugins/plugin_loader/index.md"},e=n(`

liteyuki.plugins.plugin_loader

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

Description: 默认插件加载器,应在初始化时调用

Source code or View on GitHub
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)
`,6),t=[e];function p(r,o,h,d,k,u){return a(),s("div",null,t)}const c=i(l,[["render",p]]);export{_ as __pageData,c as default}; diff --git a/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.lean.js b/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.lean.js new file mode 100644 index 00000000..a9752570 --- /dev/null +++ b/assets/en_dev_api_plugins_plugin_loader_index.md.DYxIyTd3.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugins/plugin_loader/index.md","filePath":"en/dev/api/plugins/plugin_loader/index.md","lastUpdated":null}'),l={name:"en/dev/api/plugins/plugin_loader/index.md"},e=n("",6),t=[e];function p(r,o,h,d,k,u){return a(),s("div",null,t)}const c=i(l,[["render",p]]);export{_ as __pageData,c as default}; diff --git a/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.js b/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.js new file mode 100644 index 00000000..de8c2875 --- /dev/null +++ b/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.js @@ -0,0 +1,8 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugins/plugin_loader/plugin_loader.md","filePath":"en/dev/api/plugins/plugin_loader/plugin_loader.md","lastUpdated":null}'),n={name:"en/dev/api/plugins/plugin_loader/plugin_loader.md"},e=l(`

liteyuki.plugins.plugin_loader

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

Description: 默认插件加载器,应在初始化时调用

Source code or View on GitHub
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)
`,6),t=[e];function p(r,o,h,d,k,u){return a(),s("div",null,t)}const c=i(n,[["render",p]]);export{_ as __pageData,c as default}; diff --git a/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.lean.js b/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.lean.js new file mode 100644 index 00000000..a0b60bc5 --- /dev/null +++ b/assets/en_dev_api_plugins_plugin_loader_plugin_loader.md.CX7_cGXK.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,o as a,a4 as l}from"./chunks/framework.C3o_UkTa.js";const _=JSON.parse('{"title":"liteyuki.plugins.plugin_loader","description":"","frontmatter":{"title":"liteyuki.plugins.plugin_loader","collapsed":true},"headers":[],"relativePath":"en/dev/api/plugins/plugin_loader/plugin_loader.md","filePath":"en/dev/api/plugins/plugin_loader/plugin_loader.md","lastUpdated":null}'),n={name:"en/dev/api/plugins/plugin_loader/plugin_loader.md"},e=l("",6),t=[e];function p(r,o,h,d,k,u){return a(),s("div",null,t)}const c=i(n,[["render",p]]);export{_ as __pageData,c as default}; diff --git a/assets/en_dev_api_utils.md.D2AasRls.js b/assets/en_dev_api_utils.md.D2AasRls.js new file mode 100644 index 00000000..7f5ba236 --- /dev/null +++ b/assets/en_dev_api_utils.md.D2AasRls.js @@ -0,0 +1,70 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.utils","description":"","frontmatter":{"title":"liteyuki.utils"},"headers":[],"relativePath":"en/dev/api/utils.md","filePath":"en/dev/api/utils.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/utils.md"},l=n(`

liteyuki.utils

Description: 一些常用的工具类,部分来源于 nonebot 并遵循其许可进行修改

def is_coroutine_callable(call: Callable[..., Any]) -> bool

Description: 判断是否为协程可调用对象

Arguments:

  • call: 可调用对象

Return: bool: 是否为协程可调用对象

Source code or View on GitHub
python
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
+    """
+    判断是否为协程可调用对象
+    Args:
+        call: 可调用对象
+    Returns:
+        bool: 是否为协程可调用对象
+    """
+    if inspect.isroutine(call):
+        return inspect.iscoroutinefunction(call)
+    if inspect.isclass(call):
+        return False
+    func_ = getattr(call, '__call__', None)
+    return inspect.iscoroutinefunction(func_)

def run_coroutine(*coro: Coroutine)

Description: 运行协程

Arguments:

  • coro:
Source code or View on GitHub
python
def run_coroutine(*coro: Coroutine):
+    """
+    运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    try:
+        loop = asyncio.get_running_loop()
+        if loop.is_running():
+            for c in coro:
+                asyncio.ensure_future(c)
+        else:
+            for c in coro:
+                loop.run_until_complete(c)
+    except RuntimeError:
+        loop = asyncio.new_event_loop()
+        asyncio.set_event_loop(loop)
+        loop.run_until_complete(asyncio.gather(*coro))
+        loop.close()
+    except Exception as e:
+        logger.error(f'Exception occurred: {e}')

def run_coroutine_in_thread(*coro: Coroutine)

Description: 在新线程中运行协程

Arguments:

  • coro:
Source code or View on GitHub
python
def run_coroutine_in_thread(*coro: Coroutine):
+    """
+    在新线程中运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    threading.Thread(target=run_coroutine, args=coro, daemon=True).start()

def path_to_module_name(path: Path) -> str

Description: 转换路径为模块名

Arguments:

  • path: 路径a/b/c/d -> a.b.c.d

Return: str: 模块名

Source code or View on GitHub
python
def path_to_module_name(path: Path) -> str:
+    """
+    转换路径为模块名
+    Args:
+        path: 路径a/b/c/d -> a.b.c.d
+    Returns:
+        str: 模块名
+    """
+    rel_path = path.resolve().relative_to(Path.cwd().resolve())
+    if rel_path.stem == '__init__':
+        return '.'.join(rel_path.parts[:-1])
+    else:
+        return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]

Description: 异步包装器

Arguments:

  • func: Sync Callable

Return: Coroutine: Asynchronous Callable

Source code or View on GitHub
python
def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]:
+    """
+    异步包装器
+    Args:
+        func: Sync Callable
+    Returns:
+        Coroutine: Asynchronous Callable
+    """
+
+    async def wrapper(*args, **kwargs):
+        return func(*args, **kwargs)
+    wrapper.__signature__ = inspect.signature(func)
+    return wrapper
`,30),e=[l];function p(h,k,r,o,d,E){return a(),i("div",null,e)}const u=s(t,[["render",p]]);export{g as __pageData,u as default}; diff --git a/assets/en_dev_api_utils.md.D2AasRls.lean.js b/assets/en_dev_api_utils.md.D2AasRls.lean.js new file mode 100644 index 00000000..942c1642 --- /dev/null +++ b/assets/en_dev_api_utils.md.D2AasRls.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"liteyuki.utils","description":"","frontmatter":{"title":"liteyuki.utils"},"headers":[],"relativePath":"en/dev/api/utils.md","filePath":"en/dev/api/utils.md","lastUpdated":1725101868000}'),t={name:"en/dev/api/utils.md"},l=n("",30),e=[l];function p(h,k,r,o,d,E){return a(),i("div",null,e)}const u=s(t,[["render",p]]);export{g as __pageData,u as default}; diff --git a/assets/en_dev_comm.md.Cn-onW1y.js b/assets/en_dev_comm.md.Cn-onW1y.js new file mode 100644 index 00000000..33d74bb0 --- /dev/null +++ b/assets/en_dev_comm.md.Cn-onW1y.js @@ -0,0 +1,43 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"进程通信","description":"","frontmatter":{"title":"进程通信","order":4},"headers":[],"relativePath":"en/dev/comm.md","filePath":"en/dev/comm.md","lastUpdated":1725102337000}'),e={name:"en/dev/comm.md"},t=n(`

Channel Communication

Introduction

LiteyukiBot is running in the main process MainProcess, and other plugin framework processes are child processes that come with it. Therefore, it is impossible to communicate through shared memory and direct object transfer. Liteyuki provides a channel Channel for inter-process communication like go. You can send messages to other processes through Channel and listen to messages from other processes.

Example

The channel is full-duplex, with two receiving modes, but only one mode can be used for a channel, that is, passive mode and active mode, passive mode is implemented by the chan.on_receive() decorator callback function, and active mode needs to call chan.receive() to implement

  • 创建子进程的同时会初始化一个被动通道和一个主动通道,且通道标识为{process_name}-active{process_name}-passive
  • 主进程中通过get_channel函数获取通道对象
  • 子进程中导入单例active_channelpassive_channel即可

在轻雪插件中(主进程中)

python
import asyncio
+
+from liteyuki.comm import get_channel, Channel
+from liteyuki import get_bot
+
+# get_channel函数获取通道对象,参数为调用set_channel时的通道标识
+channel_passive = get_channel("nonebot-passive")  # 获取被动通道
+channel_active = get_channel("nonebot-active")  # 获取主动通道
+liteyuki_bot = get_bot()
+
+
+# 注册一个函数在轻雪启动后运行
+@liteyuki_bot.on_after_start
+async def send_data():
+    while True:
+        channel_passive.send("I am liteyuki main process passive")
+        channel_active.send("I am liteyuki main process active")
+        await asyncio.sleep(3)  # 每3秒发送一次消息

在子进程中(例如NoneBot插件中)

python
from nonebot import get_driver
+from liteyuki.comm import active_channel, passive_channel  # 子进程中获取通道直接导入进程全局单例即可
+from liteyuki.log import logger
+
+driver = get_driver()
+
+
+# 被动模式,通过装饰器注册一个函数在接收到消息时运行,每次接收到字符串数据时都会运行
+@passive_channel.on_receive(filter_func=lambda data: isinstance(data, str))
+async def on_passive_receive(data):
+    logger.info(f"Passive receive: {data}")
+
+
+# 注册一个函数在NoneBot启动后运行
+@driver.on_startup
+def on_startup():
+    while True:
+        data = active_channel.receive()
+        logger.info(f"Active receive: {data}")

启动后控制台输出

log
0000-00-00 00:00:00 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:00 [ℹ️信息] Active receive: I am liteyuki main process active
+0000-00-00 00:00:03 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:03 [ℹ️信息] Active receive: I am liteyuki main process active
+...

共享内存通信

简介

  • 相比于普通进程通信,内存共享使得代码编写更加简洁,轻雪框架提供了一个内存共享通信的接口,你可以通过storage模块实现内存共享通信,该模块封装通道实现
  • 内存共享是线程安全的,你可以在多个线程中读写共享内存,线程锁会自动保护共享内存的读写操作

示例

在任意进程中均可使用

python
from liteyuki.comm.storage import shared_memory
+
+shared_memory.set("key", "value")  # 设置共享内存
+value = shared_memory.get("key")  # 获取共享内存

源代码:liteyuki/comm/storage.py

`,19),l=[t];function h(p,k,r,o,d,c){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_comm.md.Cn-onW1y.lean.js b/assets/en_dev_comm.md.Cn-onW1y.lean.js new file mode 100644 index 00000000..386a376d --- /dev/null +++ b/assets/en_dev_comm.md.Cn-onW1y.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const g=JSON.parse('{"title":"进程通信","description":"","frontmatter":{"title":"进程通信","order":4},"headers":[],"relativePath":"en/dev/comm.md","filePath":"en/dev/comm.md","lastUpdated":1725102337000}'),e={name:"en/dev/comm.md"},t=n("",19),l=[t];function h(p,k,r,o,d,c){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_lyfunc.md.C5K1_qgM.js b/assets/en_dev_lyfunc.md.C5K1_qgM.js new file mode 100644 index 00000000..58098ca6 --- /dev/null +++ b/assets/en_dev_lyfunc.md.C5K1_qgM.js @@ -0,0 +1,20 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"轻雪函数","description":"","frontmatter":{"title":"轻雪函数","order":2},"headers":[],"relativePath":"en/dev/lyfunc.md","filePath":"en/dev/lyfunc.md","lastUpdated":1725102337000}'),t={name:"en/dev/lyfunc.md"},l=n(`

轻雪函数

轻雪函数 Liteyuki Function 是轻雪的一个功能,它允许你在轻雪中运行一些自定义的由数据驱动的命令,类似于Minecraft的mcfunction,属于资源包的一部分,但需单独起篇幅.

函数文件

函数文件放在资源包的functions目录下,文件名以.mcfunction .lyfunction .lyf结尾,例如test.mcfunction,文件内容为一系列的命令,每行一个命令,支持单行注释#(编辑时的语法高亮可采取shell格式),例如:

shell
# 在发信器输出"hello world"
+cmd echo hello world
+
+# 如果你想同时输出多行内容可以尝试换行符(Python格式)
+cmd echo hello world\\nLiteyuki bot

也支持句末注释,例如:

shell
cmd echo hello world # 输出"hello world"

命令文档

shell
var <var1=value1> [var2=value2] ...  # 定义变量
+cmd <command>  # 在设备上执行命令
+api <api_name> [var=value...]  # 调用Bot API
+function <func_name> # 调用函数,可递归
+sleep <time>  # 异步等待,单位s
+nohup <command>  # 使用新的task执行命令,即不等待
+end # 结束函数关键字,包括子task
+await # 等待所有异步任务结束,若函数中启动了其他task,需要在最后调用,否则task对象会被销毁

示例

shell
# 疯狂戳好友
+# 使用 /function poke user_id=123456 执行
+# 每隔0.2s戳两次,无限戳,会触发最大递归深度限制
+# 若要戳20s后停止,则需要删除await,添加sleep 20和end
+api friend_poke user_id=user_id
+api friend_poke user_id=user_id
+sleep 0.2
+nohup function poke
+await

API

理论上所有基于onebotv11的api都可调用,不同Adapter api也有差别.

Onebot v11 API文档

结束关键字

由于LiteyukiBot基于异步运行, 所以在编写lyfunction时也要注意异步的调用,避免出现"单线程走到底"的情况是效率提升的关键.

await 异步任务结束关键字,用于结束当前已完成function的执行

WARNING

但若出现非单function的情况,有一个task任务没有完成而await被执行了,那么当前所有函数包的task都会被截停销毁

TIP

编写轻雪函数推荐你使用VS Code插件Liteyuki Function实现语法高亮

`,19),e=[l];function h(p,k,d,r,o,c){return a(),i("div",null,e)}const y=s(t,[["render",h]]);export{F as __pageData,y as default}; diff --git a/assets/en_dev_lyfunc.md.C5K1_qgM.lean.js b/assets/en_dev_lyfunc.md.C5K1_qgM.lean.js new file mode 100644 index 00000000..96d6f6e0 --- /dev/null +++ b/assets/en_dev_lyfunc.md.C5K1_qgM.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const F=JSON.parse('{"title":"轻雪函数","description":"","frontmatter":{"title":"轻雪函数","order":2},"headers":[],"relativePath":"en/dev/lyfunc.md","filePath":"en/dev/lyfunc.md","lastUpdated":1725102337000}'),t={name:"en/dev/lyfunc.md"},l=n("",19),e=[l];function h(p,k,d,r,o,c){return a(),i("div",null,e)}const y=s(t,[["render",h]]);export{F as __pageData,y as default}; diff --git a/assets/en_dev_plugin.md.Xb7vUDpJ.js b/assets/en_dev_plugin.md.Xb7vUDpJ.js new file mode 100644 index 00000000..d95d0591 --- /dev/null +++ b/assets/en_dev_plugin.md.Xb7vUDpJ.js @@ -0,0 +1,32 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"轻雪插件开发","description":"","frontmatter":{"title":"轻雪插件开发","order":3},"headers":[],"relativePath":"en/dev/plugin.md","filePath":"en/dev/plugin.md","lastUpdated":1725102337000}'),t={name:"en/dev/plugin.md"},h=n(`

简介

轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能

开始

创建插件

一个.py文件或一个包含__init__.py的文件夹即可被识别为插件

首先创建一个文件夹,例如watchdog_plugin,并在其中创建一个__init__.py文件,即可创建一个插件

__init__.py

python
from liteyuki.plugin import PluginMetadata, PluginType
+from .watch_dog import *    # 导入逻辑部分
+
+# 定义插件元数据
+__plugin_meta__ = PluginMetadata(
+    name="NoneDog",  # 插件名称
+    version="1.0.0",  # 插件版本
+    description="A simple plugin for nonebot developer",  # 插件描述
+    type=PluginType.SERVICE  # 插件类型
+)
+
+# 你的插件代码
+...

编写逻辑部分

轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信 以下我们会编写一个简单的插件,用于开发NoneBot时进行文件系统变更重载 watch_dog.py

python
import os
+from liteyuki.dev import observer  # 导入文件系统观察器
+from liteyuki import get_bot, logger  # 导入轻雪Bot和日志
+from watchdog.events import FileSystemEvent  # 导入文件系统事件
+
+liteyuki = get_bot()  # 获取唯一的轻雪Bot实例
+
+exclude_extensions = (".pyc", ".pyo")  # 排除的文件扩展名
+
+
+# 用observer的on_file_system_event装饰器监听文件系统事件
+@observer.on_file_system_event(
+    directories=("src/nonebot_plugins",),
+    event_filter=lambda event: not event.src_path.endswith(exclude_extensions) and ("__pycache__" not in event.src_path) and os.path.isfile(event.src_path)
+)
+def restart_nonebot_process(event: FileSystemEvent):
+    logger.debug(f"File {event.src_path} changed, reloading nonebot...")
+    liteyuki.restart_process("nonebot")  # 调用重启进程方法

加载插件

方法1

  • 在配置文件中的liteyuki.plugins中添加你的插件路径,例如watchdog_plugin,重启轻雪即可加载插件。

方法2

  • 使用开发工具快速运行插件,无需手动创建实例
  • 创建入口文件,例如main.py,并在其中写入以下代码
python
from liteyuki.dev.plugin import run_plugins
+
+run_plugins("watchdog_plugin")

然后运行python main.py即可启动插件

启用插件后,我们在src/nonebot_plugins下创建一个文件,例如test.py,并在其中写入一些代码,保存后轻雪会自动重载NoneBot进程

`,19),l=[h];function p(e,k,d,r,E,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default}; diff --git a/assets/en_dev_plugin.md.Xb7vUDpJ.lean.js b/assets/en_dev_plugin.md.Xb7vUDpJ.lean.js new file mode 100644 index 00000000..bc639f53 --- /dev/null +++ b/assets/en_dev_plugin.md.Xb7vUDpJ.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"轻雪插件开发","description":"","frontmatter":{"title":"轻雪插件开发","order":3},"headers":[],"relativePath":"en/dev/plugin.md","filePath":"en/dev/plugin.md","lastUpdated":1725102337000}'),t={name:"en/dev/plugin.md"},h=n("",19),l=[h];function p(e,k,d,r,E,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default}; diff --git a/assets/en_dev_resource.md.CYdCh9wj.js b/assets/en_dev_resource.md.CYdCh9wj.js new file mode 100644 index 00000000..7077fb6d --- /dev/null +++ b/assets/en_dev_resource.md.CYdCh9wj.js @@ -0,0 +1,13 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"资源包开发","description":"","frontmatter":{"title":"资源包开发","order":1},"headers":[],"relativePath":"en/dev/resource.md","filePath":"en/dev/resource.md","lastUpdated":1725102337000}'),l={name:"en/dev/resource.md"},t=e(`

简介

资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码

  • 资源/主题商店提供了一些资源包供你选择,你也可以自己制作资源包
  • 资源包的制作很简单,如果你接触过Minecraft的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。
  • 部分内容制作需要一点点前端基础,例如htmlcss
  • 轻雪原版资源包请查看LiteyukiBot/liteyuki/resources,可以在此基础上进行修改
  • 欢迎各位投稿资源包到轻雪资源商店

请注意,主题包中的html渲染使用Js来规定数据的渲染位置,请确保您所编写的html代码能被Bot解析,否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码,以避免出现无法预料的问题。


加载资源包

  • 资源包通常是以.zip格式压缩的,只需要将其解压到根目录resources目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的
shell
main.py
+resources
+└─resource_pack_1
+    ├─metadata.yml
+    ├─templates
+    └───...
+└─resource_pack_2
+    ├─metadata.yml
+    └─...
  • 你自己制作的资源包也应该遵循这个规则,并且应该在metadata.yml中填写一些信息
  • 若没有metadata.yml文件,则该文件夹不会被识别为资源包
yaml
name: "资源包名称"
+version: "1.0.0"
+description: "资源包描述"
+# 你可以自定义一些信息,但请保证以上三个字段
+...
  • 资源包加载遵循一个优先级,即后加载的资源包会覆盖前面的资源包,例如,你在A包中定义了一个index.html文件,B包也定义了一个index.html文件,那么加载B包后,A包中的index.html文件会被覆盖
  • 对于不同资源包的不同文件,是可以相对引用的,例如你在A中定义了templates/index.html,在B中定义了templates/style.css,可以在A的index.html中用./style.css相对路径引用B中的css

TIP

资源包的结构会随着轻雪的更新而有变动,第三方资源包开发者需要注意版本兼容性,同时用户也应该自行选择可用的资源包

`,12),n=[t];function p(c,d,h,o,r,k){return i(),a("div",null,n)}const y=s(l,[["render",p]]);export{m as __pageData,y as default}; diff --git a/assets/en_dev_resource.md.CYdCh9wj.lean.js b/assets/en_dev_resource.md.CYdCh9wj.lean.js new file mode 100644 index 00000000..64bd48b0 --- /dev/null +++ b/assets/en_dev_resource.md.CYdCh9wj.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,a4 as e}from"./chunks/framework.C3o_UkTa.js";const m=JSON.parse('{"title":"资源包开发","description":"","frontmatter":{"title":"资源包开发","order":1},"headers":[],"relativePath":"en/dev/resource.md","filePath":"en/dev/resource.md","lastUpdated":1725102337000}'),l={name:"en/dev/resource.md"},t=e("",12),n=[t];function p(c,d,h,o,r,k){return i(),a("div",null,n)}const y=s(l,[["render",p]]);export{m as __pageData,y as default}; diff --git a/assets/en_index.md.DVQGNFEI.js b/assets/en_index.md.DVQGNFEI.js new file mode 100644 index 00000000..b1245a9d --- /dev/null +++ b/assets/en_index.md.DVQGNFEI.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"LiteyukiBot","text":"Litedoc","tagline":"An integrated chat bot application and management framework","actions":[{"theme":"brand","text":"Get Started","link":"./deploy/install"},{"theme":"alt","text":"Manual","link":"./usage/basic_command"},{"theme":"alt","text":"Extensions","link":"./store/"}],"image":{"src":"/liteyuki.svg","alt":"Liteyuki Logo"}},"features":[{"title":"Supports Multiple Frameworks","icon":"🛠️","details":"Based on the liteyuki framework, compatible with nonebot, melobot, etc., with good ecological support","link":"./dev/api/api"},{"title":"Plugin Management","icon":"🧩","details":"Use package manager for convenient management of plugins and resource packs","link":"./store/plugin"},{"title":"Theme Support","icon":"🎨","details":"Fully customize the appearance using resource packs","link":"./store/resource"},{"title":"Internationalization","icon":"🌐","details":"Support for multiple languages through resource packs","link":"https://baike.baidu.com/item/i18n/6771940"},{"title":"Easy to Use","icon":"⚙️","details":"No complicated pre-process, ready to use out of the box","link":"./deploy/config"},{"title":"Ultra-high Performance","icon":"🏎️","details":"500 plugins, starts within 2 seconds"},{"title":"Rolling Updates","icon":"☁️","details":"Keep your robot up to date with the latest commits"},{"title":"Open Source Project","icon":"💻","details":"The project follows the MIT LICENSE and is open to contributions","link":"https://github.com/LiteyukiStudio/LiteyukiBot"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1725101868000}'),o={name:"en/index.md"};function a(n,s,l,r,c,p){return i(),t("div")}const m=e(o,[["render",a]]);export{u as __pageData,m as default}; diff --git a/assets/en_index.md.DVQGNFEI.lean.js b/assets/en_index.md.DVQGNFEI.lean.js new file mode 100644 index 00000000..b1245a9d --- /dev/null +++ b/assets/en_index.md.DVQGNFEI.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"LiteyukiBot","text":"Litedoc","tagline":"An integrated chat bot application and management framework","actions":[{"theme":"brand","text":"Get Started","link":"./deploy/install"},{"theme":"alt","text":"Manual","link":"./usage/basic_command"},{"theme":"alt","text":"Extensions","link":"./store/"}],"image":{"src":"/liteyuki.svg","alt":"Liteyuki Logo"}},"features":[{"title":"Supports Multiple Frameworks","icon":"🛠️","details":"Based on the liteyuki framework, compatible with nonebot, melobot, etc., with good ecological support","link":"./dev/api/api"},{"title":"Plugin Management","icon":"🧩","details":"Use package manager for convenient management of plugins and resource packs","link":"./store/plugin"},{"title":"Theme Support","icon":"🎨","details":"Fully customize the appearance using resource packs","link":"./store/resource"},{"title":"Internationalization","icon":"🌐","details":"Support for multiple languages through resource packs","link":"https://baike.baidu.com/item/i18n/6771940"},{"title":"Easy to Use","icon":"⚙️","details":"No complicated pre-process, ready to use out of the box","link":"./deploy/config"},{"title":"Ultra-high Performance","icon":"🏎️","details":"500 plugins, starts within 2 seconds"},{"title":"Rolling Updates","icon":"☁️","details":"Keep your robot up to date with the latest commits"},{"title":"Open Source Project","icon":"💻","details":"The project follows the MIT LICENSE and is open to contributions","link":"https://github.com/LiteyukiStudio/LiteyukiBot"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1725101868000}'),o={name:"en/index.md"};function a(n,s,l,r,c,p){return i(),t("div")}const m=e(o,[["render",a]]);export{u as __pageData,m as default}; diff --git a/assets/en_store_plugin.md.DceXsbsh.js b/assets/en_store_plugin.md.DceXsbsh.js new file mode 100644 index 00000000..3d1ff77f --- /dev/null +++ b/assets/en_store_plugin.md.DceXsbsh.js @@ -0,0 +1 @@ +import{_ as t,D as o,c as n,I as r,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"插件商店","description":"","frontmatter":{"title":"插件商店","order":2},"headers":[],"relativePath":"en/store/plugin.md","filePath":"en/store/plugin.md","lastUpdated":1725101868000}'),s={name:"en/store/plugin.md"};function p(c,l,i,d,m,_){const e=o("pluginStoreComp");return a(),n("div",null,[r(e)])}const g=t(s,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/en_store_plugin.md.DceXsbsh.lean.js b/assets/en_store_plugin.md.DceXsbsh.lean.js new file mode 100644 index 00000000..3d1ff77f --- /dev/null +++ b/assets/en_store_plugin.md.DceXsbsh.lean.js @@ -0,0 +1 @@ +import{_ as t,D as o,c as n,I as r,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"插件商店","description":"","frontmatter":{"title":"插件商店","order":2},"headers":[],"relativePath":"en/store/plugin.md","filePath":"en/store/plugin.md","lastUpdated":1725101868000}'),s={name:"en/store/plugin.md"};function p(c,l,i,d,m,_){const e=o("pluginStoreComp");return a(),n("div",null,[r(e)])}const g=t(s,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/en_store_resource.md.DwD3Poel.js b/assets/en_store_resource.md.DwD3Poel.js new file mode 100644 index 00000000..065eca32 --- /dev/null +++ b/assets/en_store_resource.md.DwD3Poel.js @@ -0,0 +1 @@ +import{_ as r,D as o,c as t,I as s,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"资源商店","description":"","frontmatter":{"title":"资源商店","order":1},"headers":[],"relativePath":"en/store/resource.md","filePath":"en/store/resource.md","lastUpdated":1725101868000}'),c={name:"en/store/resource.md"};function n(p,d,m,_,l,i){const e=o("resourceStoreComp");return a(),t("div",null,[s(e)])}const h=r(c,[["render",n]]);export{f as __pageData,h as default}; diff --git a/assets/en_store_resource.md.DwD3Poel.lean.js b/assets/en_store_resource.md.DwD3Poel.lean.js new file mode 100644 index 00000000..065eca32 --- /dev/null +++ b/assets/en_store_resource.md.DwD3Poel.lean.js @@ -0,0 +1 @@ +import{_ as r,D as o,c as t,I as s,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"资源商店","description":"","frontmatter":{"title":"资源商店","order":1},"headers":[],"relativePath":"en/store/resource.md","filePath":"en/store/resource.md","lastUpdated":1725101868000}'),c={name:"en/store/resource.md"};function n(p,d,m,_,l,i){const e=o("resourceStoreComp");return a(),t("div",null,[s(e)])}const h=r(c,[["render",n]]);export{f as __pageData,h as default}; diff --git a/assets/en_usage_agreement.md.DzIdKK2Q.js b/assets/en_usage_agreement.md.DzIdKK2Q.js new file mode 100644 index 00000000..8eff5a72 --- /dev/null +++ b/assets/en_usage_agreement.md.DzIdKK2Q.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as o}from"./chunks/framework.C3o_UkTa.js";const h=JSON.parse('{"title":"用户协议","description":"","frontmatter":{"title":"用户协议","order":3},"headers":[],"relativePath":"en/usage/agreement.md","filePath":"en/usage/agreement.md","lastUpdated":1725101868000}'),l={name:"en/usage/agreement.md"},i=o('

用户协议

  1. 本项目遵循MIT协议,你可以自由使用,修改,分发,但是请保留原作者信息
  2. 你可以选择开启auto_report(默认开启),轻雪会收集以下内容
    • 运行环境的设备信息:CPU,内存,系统信息及Python信息
    • 插件信息(不含插件数据)
    • 部分异常信息,
    • 会话负载信息(不含隐私部分) 以上内容仅用于项目的优化,不包含任何隐私信息,且通过安全的方式传输到轻雪的服务器,若你不希望提供这些信息,可以在配置文件中把auto_report设定为false
  3. 本项目不会收集用户的任何隐私信息,但请注意甄别第三方插件的安全性
  4. 使用此项目代表你已经同意以上协议
',2),r=[i];function c(n,_,s,d,m,p){return a(),t("div",null,r)}const f=e(l,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/en_usage_agreement.md.DzIdKK2Q.lean.js b/assets/en_usage_agreement.md.DzIdKK2Q.lean.js new file mode 100644 index 00000000..fe46c48e --- /dev/null +++ b/assets/en_usage_agreement.md.DzIdKK2Q.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as o}from"./chunks/framework.C3o_UkTa.js";const h=JSON.parse('{"title":"用户协议","description":"","frontmatter":{"title":"用户协议","order":3},"headers":[],"relativePath":"en/usage/agreement.md","filePath":"en/usage/agreement.md","lastUpdated":1725101868000}'),l={name:"en/usage/agreement.md"},i=o("",2),r=[i];function c(n,_,s,d,m,p){return a(),t("div",null,r)}const f=e(l,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/en_usage_basic.md.CxkJTStx.js b/assets/en_usage_basic.md.CxkJTStx.js new file mode 100644 index 00000000..e18ebff2 --- /dev/null +++ b/assets/en_usage_basic.md.CxkJTStx.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,a4 as l}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"基础插件","description":"","frontmatter":{"title":"基础插件","order":1},"headers":[],"relativePath":"en/usage/basic.md","filePath":"en/usage/basic.md","lastUpdated":1725101868000}'),n={name:"en/usage/basic.md"},r=l('

基础插件


TIP

参数<param>为必填参数,[option]为可选参数。

命令别名:配置了命令别名的命令可以使用别名代替原命令,例如npm install ~可以使用插件 安装 ~代替。

轻雪命令liteyuki_command

命令说明权限举例可用参数
reload-liteyuki重载轻雪超级用户
update-liteyuki更新轻雪超级用户
liteecho查看当前bot 版本超级用户
status查看统计信息和状态超级用户
config set <key> value添加配置项,若存在则会覆盖,输入值会被执行以转换为正确的类型,"10"和10是不一样的超级用户config set name 'liteyuki-bot'<key>: 若存在则覆盖, 若不存在则创建于config.yml ; value: yml格式的所有合法内容
config get [key] 查询配置项,不带key返回配置项列表,推荐私聊使用超级用户config get name<key>: 若存在则返回, 若不存在则返回空
switch-image-mode 在普通图片和Markdown大图之间切换,该功能需要commit:505468b及以后的Lagrange.OneBot,默认普通图片超级用户switch-image-mode
/api api_name [args] 调用机器人API超级用户/api get_group_member_list group_id=1234567<args>: 参数列表, 格式为onebot v11协议api, 可用%20代替空格
/function function_name [args] [kwargs] 调用机器人函数(.lyfunction语法)超级用户/function send_group_msg group_id=1234567 message='hello'<args><kwargs>: 参数列表, api格式为onebot v11协议api
group enable/disable [group_id]在群聊启用/停用机器人,group_id仅超级用户可用超级用户,群聊仅群主、管理员、超级用户可用group enable 1145141919810<group_id>: 群号
liteyuki-docs查看轻雪文档所有人

命令别名

命令别名
status状态
reload-liteyuki重启轻雪
update-liteyuki更新轻雪
reload-resources重载资源
config配置, set 设置 / get 查询
switch-image-mode切换图片模式
liteyuki-docs轻雪文档
group群聊, enable 启用 / disable 停用

插件/包管理器 liteyuki_pacman

  • 插件管理
命令说明权限
npm update更新插件商店索引超级用户
npm install <plugin_name>安装插件超级用户
npm uninstall <plugin_name>卸载插件超级用户
npm search <keywords...>通过关键词搜索插件超级用户
npm enable-global/disable-global <plugin_name>全局启用/停用插件超级用户
npm enable/disable <plugin_name> [--group <group_id>]当前会话启用/停用插件群聊仅群主、管理员、超级用户可用,私聊所有人可用
npm list [page] [num]列出所有插件 page为页数,num为每页显示数量群聊仅群主、管理员、超级用户可用,私聊所有人可用
help <plugin_name>查看插件帮助所有人
  • 资源包管理
命令说明权限
rpm list [page] [num]列出所有资源包 page为页数,num为每页显示数量超级用户
rpm load <pack_name>加载资源包超级用户
rpm unload <pack_name>卸载资源包超级用户
rpm change <pack_name>修改优先级超级用户
rpm reload重载所有资源包超级用户

命令别名

命令别名
npm插件管理
update更新
install安装
uninstall卸载
search搜索
enable启用
disable停用
enable-global全局启用
disable-global全局停用
rpm资源包
load加载
unload卸载
change更改
reload重载
list列表
help帮助

WARNING

受限于NoneBot2钩子函数的依赖注入参数,插件停用只能阻断传入响应,对于主动推送的插件不生效,请阅读插件主页的说明。


用户管理liteyuki_user

命令说明权限
profile查看用户信息菜单所有人
profile set <key> [value]设置用户信息或打开属性设置菜单所有人
profile get <key>获取用户信息所有人

###命令别名

命令别名
profile个人信息
set设置
get查询
',22),a=[r];function c(i,s,o,g,y,x){return d(),e("div",null,a)}const p=t(n,[["render",c]]);export{u as __pageData,p as default}; diff --git a/assets/en_usage_basic.md.CxkJTStx.lean.js b/assets/en_usage_basic.md.CxkJTStx.lean.js new file mode 100644 index 00000000..6d46861b --- /dev/null +++ b/assets/en_usage_basic.md.CxkJTStx.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,a4 as l}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"基础插件","description":"","frontmatter":{"title":"基础插件","order":1},"headers":[],"relativePath":"en/usage/basic.md","filePath":"en/usage/basic.md","lastUpdated":1725101868000}'),n={name:"en/usage/basic.md"},r=l("",22),a=[r];function c(i,s,o,g,y,x){return d(),e("div",null,a)}const p=t(n,[["render",c]]);export{u as __pageData,p as default}; diff --git a/assets/en_usage_extra.md.CHJ4PN4s.js b/assets/en_usage_extra.md.CHJ4PN4s.js new file mode 100644 index 00000000..dde36965 --- /dev/null +++ b/assets/en_usage_extra.md.CHJ4PN4s.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as s,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"功能命令","description":"","frontmatter":{"title":"功能命令","order":2},"headers":[],"relativePath":"en/usage/extra.md","filePath":"en/usage/extra.md","lastUpdated":1725101868000}'),a={name:"en/usage/extra.md"},l=i('

功能插件命令

轻雪天气liteyuki_weather

查询实时天气,支持绑定城市,支持中英文城市名,支持多个关键词查询。

配置项

yaml
weather_key: "" # 和风天气的天气key,会自动判断key版本

命令

shell
weather <keywords...> # Keywords为城市名,支持中英文

查询目标地实时天气,例如:"天气 北京 海淀", "weather Tokyo Shinjuku"

shell
bind-city <keywords...> # Keywords为城市名,支持中英文

绑定查询城市,个人全局生效

命令别名

命令别名
weather天气
bind-city绑定城市

统计信息liteyuki_statistics

统计信息 命令

shell
statistic message --duration <duration> --period <period> --group [current|group_id] --bot [current|bot_id]

功能: 用于统计Bot接收到的消息, 统计周期为period, 统计时间范围为duration

参数格式
duration使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
period使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
groupcurrent (当前群聊) 或 group_id (QQ群号)
botcurrent (当前Bot) 或 bot_id

命令别名

命令别名
statisticstat
messagem
--duration-d
--period`-p
--group-g
--bot-b
currentc
',20),d=[l];function n(h,r,o,p,c,k){return s(),e("div",null,d)}const u=t(a,[["render",n]]);export{y as __pageData,u as default}; diff --git a/assets/en_usage_extra.md.CHJ4PN4s.lean.js b/assets/en_usage_extra.md.CHJ4PN4s.lean.js new file mode 100644 index 00000000..a07d1120 --- /dev/null +++ b/assets/en_usage_extra.md.CHJ4PN4s.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as s,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"功能命令","description":"","frontmatter":{"title":"功能命令","order":2},"headers":[],"relativePath":"en/usage/extra.md","filePath":"en/usage/extra.md","lastUpdated":1725101868000}'),a={name:"en/usage/extra.md"},l=i("",20),d=[l];function n(h,r,o,p,c,k){return s(),e("div",null,d)}const u=t(a,[["render",n]]);export{y as __pageData,u as default}; diff --git a/assets/index.md.CQL2AFxv.js b/assets/index.md.CQL2AFxv.js new file mode 100644 index 00000000..0fdad09d --- /dev/null +++ b/assets/index.md.CQL2AFxv.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C3o_UkTa.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"轻雪机器人","text":"文档","tagline":"一个综合性的机器人应用及管理框架","actions":[{"theme":"brand","text":"快速开始","link":"./deploy/install"},{"theme":"alt","text":"使用手册","link":"./usage/basic_command"},{"theme":"alt","text":"扩展","link":"./store/resource"}],"image":{"src":"./liteyuki.svg","alt":"Liteyuki Logo"}},"features":[{"title":"支持多种框架","icon":"🛠️","details":"基于轻雪框架,兼容nonebot,melobot等,拥有良好的生态支持","link":"./dev/api/api"},{"title":"插件管理","icon":"🧩","details":"使用包管理器,便捷管理插件及资源包","link":"./store/plugin"},{"title":"主题支持","icon":"🎨","details":"使用资源包对外观进行完全自定义","link":"./store/resource"},{"title":"国际化","icon":"🌐","details":"通过资源包支持多种语言","link":"https://baike.baidu.com/item/i18n/6771940"},{"title":"简易使用","icon":"⚙️","details":"无需繁琐前期过程,开箱即用","link":"./deploy/config"},{"title":"超高性能","icon":"🏎️","details":"500个插件,2s内启动"},{"title":"滚动更新","icon":"☁️","details":"让你的机器人保持最新提交"},{"title":"开源项目","icon":"💻","details":"项目遵循MIT LICENCE开源,欢迎各位的贡献","link":"https://github.com/LiteyukiStudio/LiteyukiBot"}]},"headers":[],"relativePath":"index.md","filePath":"zh/index.md","lastUpdated":1725101868000}'),a={name:"index.md"};function o(n,l,s,c,d,r){return i(),e("div")}const u=t(a,[["render",o]]);export{p as __pageData,u as default}; diff --git a/assets/index.md.CQL2AFxv.lean.js b/assets/index.md.CQL2AFxv.lean.js new file mode 100644 index 00000000..0fdad09d --- /dev/null +++ b/assets/index.md.CQL2AFxv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C3o_UkTa.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"轻雪机器人","text":"文档","tagline":"一个综合性的机器人应用及管理框架","actions":[{"theme":"brand","text":"快速开始","link":"./deploy/install"},{"theme":"alt","text":"使用手册","link":"./usage/basic_command"},{"theme":"alt","text":"扩展","link":"./store/resource"}],"image":{"src":"./liteyuki.svg","alt":"Liteyuki Logo"}},"features":[{"title":"支持多种框架","icon":"🛠️","details":"基于轻雪框架,兼容nonebot,melobot等,拥有良好的生态支持","link":"./dev/api/api"},{"title":"插件管理","icon":"🧩","details":"使用包管理器,便捷管理插件及资源包","link":"./store/plugin"},{"title":"主题支持","icon":"🎨","details":"使用资源包对外观进行完全自定义","link":"./store/resource"},{"title":"国际化","icon":"🌐","details":"通过资源包支持多种语言","link":"https://baike.baidu.com/item/i18n/6771940"},{"title":"简易使用","icon":"⚙️","details":"无需繁琐前期过程,开箱即用","link":"./deploy/config"},{"title":"超高性能","icon":"🏎️","details":"500个插件,2s内启动"},{"title":"滚动更新","icon":"☁️","details":"让你的机器人保持最新提交"},{"title":"开源项目","icon":"💻","details":"项目遵循MIT LICENCE开源,欢迎各位的贡献","link":"https://github.com/LiteyukiStudio/LiteyukiBot"}]},"headers":[],"relativePath":"index.md","filePath":"zh/index.md","lastUpdated":1725101868000}'),a={name:"index.md"};function o(n,l,s,c,d,r){return i(),e("div")}const u=t(a,[["render",o]]);export{p as __pageData,u as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b6b603d596933f026dfecf98550bbe4d0876276b GIT binary patch literal 43112 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..def40a4f658cf8a9f7029c98931f5c9ff5a00910 GIT binary patch literal 31300 zcmV(?K-a%_Pew8T0RR910D43K6951J0MIl50C~{>1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a3c16ca40b2a8f454c34cfa91996ec99ae2e4aa0 GIT binary patch literal 32564 zcmV(`K-0f>Pew8T0RR910Dm+96951J0Mft!0Di&%1ONa400000000000000000000 z0000Qg?t;OY#b^-NLE2ohhslYRzXsMC}fi?=tOuq~;f`?E6 zHUcCAge(h!7ytwy1&nkDARDC0C2Tt6*3?ZzfOR*Tv`+2yC*zjc?eMGCJiCoV*bL6f zIr{%Il8!NIqx%7XC zfB%Ne7oT4!(E~}ApxNY z{~V?-Iag{r$3o^EPM)kg=cZ0v$)1YaL~Zm~U}5B@ez>o>&l4YQQ3&_x%CEXx8d`z_ zqzE}YjyOrLrTGx#2T=k*`+d*rCEH5_nh`Z{@$m2Rf4@&AnM=*%03As#w%ZxpE{yFyE zw`d&jrjeLo)%Iyo`hfYbC@Y_9n-tYLg9(#c(1DIqm4m*)SU`ee8s;VyNu4+JmNw#d?yY`v(@+k{} z3Cv`(`vKt2_EjsgvclDfDgp!7uTwLLDE*0^ZnjiTymNYe$# zG%0Eqgy!CBLNjjwa!nH$(*o~2Z=Er^Ip@29GY#@g0Xzd>Tmv)n9%giglFnEcgqL0F zv+SbK`5?L=%+9Z0%WU3uK>x5Xov_p~h6l3M>FNN_P5?jxfFu$!IksoSIekCPz1mz; zq7+FDSg2n)B<1ejyWlmS3xETl{2>TMAm@NV%}vQEJ>kHp2{~i@eE#p9zW2`kbE1sZ znAk}Jt*5muvTzOh8W_hi46_*1{%01EH1Ea`Pmv%&-!G-!k6FHhEzKA9nr93#9L|mi zBeJYpli$k!V`^ZI&~ABm=~}KXqi7KkKSSj9O(CGrWc@k_I_nq^`=~>3KIm=;oy4nC z7@foE0zsF^x}T=&LNY=fV(5@Kr*29~i#jC3sTUMw8+Awrr(WfxFXW;x=B|(M(wFhm z*9g>i6|V0sMn6Kjehh|woGf_?Ay5aD0i_(%V=k6qBlhAXxiK$3(xEWwVmeuNx`_b@ zHb5EMAK>^LKp95}^%tkef-u_%$hFtQVuX-V?}I?GBdi0001N>8wnqBx$iG0KAjk{v z)pk!}5mS1w_VDdxJ@FBB_pZj~S1-W6O6*9&tgP19*!F1oiMt;ry}V{zUDvFl_OtWM z_5L$mYY#rV`3}LFHx`JsSAO?e|Ia9lb**lXeYf+%3mvUkRV z=Yq<^7G2<`$X$H*t$ya${14_nTswpRe73pim)`5rzich|fB*IIn*Yc9zXRqmh~2eu zW>?}X4xl|1(RnRTfc3B)fn#~6oL)Rdx8Q_7>OGbCZi*XRha2?dgkOb9~pj z?p5qY+oIK1FRJbm9rByc^UZEFbK%h8HUpM%}MQ0G^9G z0D~zhrA@nT6)s%4^Weu{unr7aOaBbDB`tu;59wg93$O07L#{S9PK>|u(v^21wZ3|C#Nc2|A=ImD}~ zLc-Ny_vwBRlM zeOg^pC#XKI_eYTsXN3P9;IH!6fo#DvHPrlmjn6d}05O9qvk>ds0T4T`Fgv!Qzh@Xs zH&Y%P;a5sYi0ArLb-7#ivG8twh$l!3$MVmtqET1T`de#aDr#w>Q34#3rQVTmlQ_Gk zhF>xDCn~$JQqM}sRNtq6by=aXwiXhux<7AGg|9B}8`mc$IL?dGmAgOHZ~5@I%eDU` zE?$X^CctGTw(31d{*mq)yGP{z2S>e|L0%Rt@>jKhMKDW z2@Q7l@?WSQ|9^m?U0-b0`TzLq_#B8||9n^x*SDJin-hDpwC-FoOSk4X2IDqvF$cQF z*s}8*%y)}b`Ybe8X?}EWQXTH5?Rsc8Fhrp~pO-=@ZtU{j{K)+OAs+sG@|WMb4pJ9s z{#jj}*C6VJ1$T=zcJQCdV5Ly#8jkRj7_1asus^~OzpL!EWaNJ4LR!uCe!)&%di0Yx zo35-S^1a&>6nmM8O4@G0Q!?M7*GQN^6~68TF@GPfJH|b1L%`8hksKRBd;?B!vQr_t+lV} zAF<=@K(`SHc>_SQU=BQ!)qz|C|Ln4qV-?UvHakPuC54(35H1D)@Yz}CgVSIMfdbkX zPy)_*%(0wiWWb_6v_{CW5)65R4ah{ZrcgPSg*G!7sL7B4tw2Ho{g4wxV-9bzi)z4E zm!mkqm~xjI3|7z*^g$&zI0qV#HROnK*5`h=g8<+h1d(?8>HV{=taY1gmXy88uPVLA z0zOVy{{%UIB|mVf7(*o_Q$oKQXf7r0I9>M{f?~D&_r9y}w)=jsJ-#H#Z zCw!D?n>vU+(0(BsY2SI;4!5tTui%T(Gi`@4@BNhgL}B1-<^w$c8{>Y`J$dK;)USR0 zuEn9>{MucOy04#i&yA7aXuan}%q#DCxc~3}-}msniJw3BsQrKbE{^t*# zc?o_3XXO?7?iWawYxTxgeu!V+to*zb{x{ z53h{zrsBX^e=8^T;KsiT-zx#*|Gdg*!Nk=;|7{2c1Z)5R0_Zoh{A|WnIaiLGvOH%0 zAibt${MWPRh5WStK7K!d=>pDxzf%%^@j{|_2%2hPm@a_l{fZ( zT|TeAkEIH(nSFTc{vM5&b}qCvOF8jupSj!4+uxpj=2nIKBH!8^Da6y~YMOvq@5URN zQj*^1>YM!>{jZ=53c4CvRKw-{|8HuyDWtO*jVh3LJ&B6vy9;HGgQga?^K1cFP77Q%+Im~a4j#_r~q zap%Y<#K2)}P@ECYUt$30AcPoLadMS~y|gyngWCh6IOnghRl(^=T@V8bhFDezf{7^1 z~Y%9{QmKM3rx& za87ARQfA0iGq6{#FD)Ioc1V|^QVYj`Qq=S7x5lCV&JGw>=f|D*)(2fzo(jQv-`j5a z)d+bJxoBtwUVit!*&M1fEY;Ifc;F%AsF2n9#_M21yOy%+E zQlc2w%G)s0WYrL8fT1KnjG6<|yN}#4Xsj~$Y)LW50RQ&1H!=`F5JhBk8ssY)6;p`@ z-B=TVWQ7EDQ?sEHn3@6*BXfHO{;`nfa`)~0p;Hv>^(5*N-ZyGYpuA^X|npfaptyQ5<{$+U=pxaFlqfViTI${?XkAN zme~s1WABtcD*d0*l+zoq18k1vmakT2`|QKgFO;Gn13A^-FTf}QPZsg4xvX%~vUQgM z#^aJR;qWiyy-Ok)2T3N#0VMH4OR6D)V83|%UT!QT9Vh|}iKdgTOGGz=sYhIe4V07t z?!1stI9}*Jiw95Me9-yHz~Im1qBkO_HiE_F?t;F;nA&}K_B6Se?AUVe9FG{XwWz-=372vNG1;<3#udg0iSeiL&Pott@BzY)A?!mE3a^9e`otpk$oaIS zBF9LM^yH$FIq4}yBVW@}iymW|q^Fe-Ih>YWA~7~idPXtG1SK;-n$CKXsAvih?(g$2 zA0>$br;!RqTOsIk7#xS{ypBf!IH;y>YP4Rnk-kn*3qc+&)C4Gx1)&NeI{=;oXb=P) zz*?0$%7$u{AQaUj(2eNpm(JL%KO{j^wI5Y^X@yuU@|>gS@NG)Q@Vk%QfhvXzqi0_0 zHkVD#a(50NiNsgKT@y<_FH_v22|+c#D$XsJXLi?CMt(ZGxl-V~&4uW+M}C|yhPi0- z_O85ejNF*u4RS@1i~3IjPm?kMCbN>33Q{7Ek_Q#1f$)r&36$xQBk?Yl^|(fCvaKX@ zk{2as%$d0LHDwrm`vvyh+smNNVX zE*+WO48n)*kmr%7QK0#B;7s>wV(>)w-gYU&f3u5W>F-mHw|gY2Rmlw6PwkTHavIO$ zLm|{WC&>iiGUqSLx$LHM>$4Tk#A;G1o{n2%i`If2a*19Je>n^0bWxdto1fa7^oCQo zfn)Bp7oDiy!OGBLKI1z|6n zFE=l504I}0Zdl1Cc=pzOw9lmvQ1HB40}|f7D{~*7iCf8(Veevya&f`>7$xKC6?zEB zlNmuMeegLpV9Jp;k$oWnnnduDeza@p8UWUU76lv^nl633`^2`_*EBVhT3`^r;t%m`*NNv~xJJl5GLKnKD?>H6~%ehL(rNO0YK|-` z#+1mP9>gEa0SeY=T-X!%>jNe+g?;pNs;e%TItYX>I5=0fb8W;^8WRv=^E7zI$sq~T zi0l+ZX`&|vycy1I{?BfVeAs=%qlNJ}yB@{k~%pr;+=S_$~<>gMYycmyb5bD>UsW!X%JJYTEKOmP?<4dscycy+Sgf~9ww z#^x{1nKLKdZ~(%Aehc4aMquy(8ajp8+KC|wsxPQUpa+nedhRCQ%=Op-E81Mv!u73) zcI%}E?d&C%oyBiNF71NpJ1<$hJ3_}@IucC3LlGB9&)Av>FScg99!XZsE}~Y82S0FfvY+u zRJm=2e%hug&vOdUmmzLu^iZ!{4d;qS1+8~{#LFroP7Q}s-D@=Ry&~v%w^M2~-ihM{ z*KC35^ybj-QKmBu(x+b;v5d~lUxDXe_1f&17U?8zeR-U(YFbX@K;Nw8&dSsQSlR$k zT-$ih;v0e)X8h*NAWTKnrg)iNLXe0}Pl~4Ym!r!hq&1fD277NH--6SFvg-#OatiXY zt*s=VLOu+3tD`gz-}{vBPOG&A8f?(PHo*XKbAECjc;dCg?Q!B!hZkBEk z0av7t!2Fk86kQ?FWO6YaOkp!z(ZR9WmSd4@EZ0XGkR*{h2(5~z5D}kQq37Y8IMEd%__qP8fTzBi;GZzMGLyjH#U^C>^I7^f~>mZQ{y_Qe|$<1IEJQ4wj9E)zyEg8Ebz$`!C zzxyvSU2n;7rMWeCx5md3@cgjscA|f!l%JHpW+~e{%S>uo8^{{9H;mY`d1GZR$8QAc z>k8VSD{v_J8$DLa_Bvt8!P3@B<8~n);g)tVtEXD^XmmNA?tEh{d&dme8{nbAvC?GNgX=P-HH~|VCBwu`c^xN8XW=D(7b~t1L}Cb6uS7JeP8&Q z0a$JE8EX8MG9K~QwdWpZRFW#R5`FCG;?Co0uF4L_iFmWvwy?ww)03ejlVX}@uw|@* zuf-vEoq>HyE^&00ccT`FaZ;uwGsfTv5lx-mDJr-DC655IBx!6txX!OAUP;UNq)hsC z!`kEYqVBl%u!MHg#SlN!VwzV-Y#Rm10QuR&0Ahn}g3w_D@C0Kv)ymbg@L&KN9y_El zCHg(0DCdA2wpFF{aK3adJX#Zx>Q|lWm8Phx8?8w6R;|LInxcXT*g;j!MmwKHSJD@! zXvbmU8qDPV{^Y{_KFpLe?Wy!dba~0j-55abQ8T8Ju7`t%?S?wI0TsUlIU5qrtGJ=v zKYsnJ(!SI0jdbwO`y@px*apb?mlk(;oL4b61w$J*2>i>-B@VYhiy?1g9r-Nj;Ps<$lh$kN74&vZS79K zf+U3F`QTIMHI-40vEqgC?tE)P8M|J5eeWp8P~p66bKReZQJJXrr2dkge}(;Tux;3O z|2H>Sy(OKy`FFm-c4OKD-rUUh-wQwII~!62QH>jOhYD35ozb*xd{ET=+Pic>>knbb zx^V6wLt)AM4BD?k74@SAhba3&M7H*P zgRe0DC}Efn`B7U(uO)eNW`r=O0!UT8uN!^!a^I! zRIYoK<1NFXEkiul9A`~Bl3O+$03bHl^e0qS+1#x-Ucqc6c>+mCP&qYMT?<9HkwQcI znW3ijh(u{t&BX`wViMQHg8_*|r?lmohSb_o@}>M_Sd7M;N?fmxSH1-?Nzw(Gn3bDJ zWLf$oNI0j@N;v5-G8{lL1M^K^D`-N+qAp8@+3JM(T{epiZdz0Ok^b#`hrua_L9iuT zzn?r3#by#a)+>ms({B-3YxWRBvdsAv)VN9clIMS#I zyIqo049tjio60=YCOfN!EL6*G2Dbm|7DYvH8Fwz7v6CM-KpIl(FI|i10+*}UW z7*EaH`3naNkpOoWnAOiYwsnJ5oEQBpN8A z+EA=OX+)Nn7PrAf#hMC1nCP>;kG(qzL(76f}6mcrg)n4=BZ9{+ciqyBq~Qb zx2R>_dxbzWAr7FpmUijTPz1G{b;^n&EPOc}+d@EBmy5iW1UWJV$du}=+E>`FpBWFmZbeqdQ4O@^ni0=^CKpU3b}*`jpase;|B-LTdZM^mD?wWtIZJt6)>RkD5! z)579ECP2_8u6&&^)(5sKn;XxS`23Ye@hAGkKGs$wW;mLMJcWjP)@vnnrp28?9!6%U z&1WSg#&*QU&PwM!d)cOoIZYY3 zsyMy$Czw^w8?#RhW2q(Hnwwc`>zB9NL80Nq04B; zsMzj0YE;VZ6QkTNMGGDd?a)ac_)z()s>@)S2!~)C2`)wRweSN_*6^_ z^mz~S)9qj4hp|T(-_9KwUw5%@oJfBzTa6zInx~}{kK(#CzK?hO{l~ZcC^fTr5r0&+ zO8t4@aTELX|9r-jzhav3!!<9jrsqU59L<=*-bxCjXlA7ykXmhuYa#z}_z_isS+uVlW04b_E5Vb_V6EV)wV$m?Ns5X;KB%e^4YEDCxR` z9B#p9Y}eqeCzAFQ$LE<%lE#jE~#lA>D6z%uUf)?xKrmZ zemE9rq;v&0pm^o1k@~U4f$RCfkH82acxvf!eJrL`J}K85MvDB!#GZYwvn)brUIDbCy9yUAV&SM0+o6Q=7_x8oc9b5k4F;^JV} zYq0e#xNe5S5M%o8MU_#2o=i!K^me-wRW(Y>ShAYoP?KLW&OBWJv{x*#zYEcxO3u$p&lrwzw-WFuFe8 zwh>wSZoYoyp-D&Gp2)CVUCssS@m)%7qu8);Oao=QCbHDmw+R*@Tb0rPTvsHKeeSL> zClRHI?TU;))Br+~O6?dYCUiEf5yt8BvURnWZzr%z7igYWWJ*mOu9!N=u#;M|5*sRH zYv_ycIP+jTs}OgoC>3au^=Mx-2ZJ(m0r4*>guc*jK&%OmOa(ZmS$?Tv&w5eb;VOpiBW#ws zcnktvquwX>z_Wzo>Vve0F_nT3sb}a;r1b?SwqYnqUd!gn*uk!yZ{nu*Q&rA?gnkuN zdG+IGtd@bu@*q-!gueJI#mZtzDp z)_nUa;~NtO3{uKt+>b${$gmX5V0@VRJzSp>whz>AAURQ>LGnwz@{92(JPgqTkKN+H zAe*VM>mz&wjIL?-Dm_^nC$*`VAXS`#gCz64=AfhnWmWsKL+t<-~@7B+1^cALb&$+YP&?#?c1()u4(G& zG|fTzY}rw~e{wNtwll9rm?Im=A#{>UJ}apcZtH#rV02O~eELWb=q_%p{J?+zgaLrw z0o+%fRL?`k&*t*>p-g$3ecY~J0laSn`S4A+ci_vtP1L<@=5NR52_B1M`)$tBKYUy~ zmtdOvdG88zxb9w|*7rDS`0_bPhk0|z!FjG8zM8)v*t>62syUgC+fmvtGsz_@cc2g{ zJDQV}f;b*P+bvIgF~WSGwf)IoEOFiH^Tk7EorKJ8%`Gr5UUG5!XZjKhhb;S0mRZlN zfHY(EdaFx@+I}+IQN&fXf$ctb1tD7!MMG!tb;>Avu0c9%cSp3!@z|7X*VMs`X$1 zOX?1DCGNNfu_<1^m*jE1aqn6MC8zGm6cKR*MGuJvh|Nj=GB z$vaZ=Qsz)0QiIk&hoCp1Td+^VqTxR9MEH65E5rig2I4F7KU9SDKIv5HX&F9R1Z^wp zf-%F~!%kx#<4)pU;YA2?1S`2bx$g=pibO@KQs!RNUPEOuJB;K;#8hpG6#$9Ff2>eoo>vqFu?$&%f0;PL&c7894wo)lwjt(6Bp`X9 z8C|wm7uTg~F6*wfgo<7pcl68ikUm^?FmVPvSpyw3`bvWKa`K38Zhh%~NdM-vfeznS z{qm7~=O6_Xzvh`L_((2XMj)(}K-iSa%75+mwk_XRPV4*G{WjvD6bT#Cj`1bqLN2@R0TzJ|}A>og#;y{2uGwOj8BbJls- zV1pet*ot*m`2%|U%OhUni9jeY20NT^!cOdW4nZV%!Q)ULu-GhDBMjC5PrzpS6F`G{ zstM>eQ5wUKI9lK*{w478oe_fmD3$A1-S+dV-+cUVW51YI)p zyt}`0BzQ_^IFrgm*e&CsWICNXA!h{b@&DCq16|ElePr*)Z&8+BJpZ0eAt`s><$n%g ziOw{FiRCruY2{I(SX#qa2AY2mG{SF_yt5X+>yNYBg_wFI9y2q@%R&3UD-+At*NUPl zW0s-4zAnusOw;B0xjav4D*?8I(K^e0rik#_bRZLaXt{+pD-&DTDVGB~^)j)mTDn*b zni~>^2nD{_+>Gcnd`l4BI^gQQ=q=Oan3`j=ykYt-8})&SKnzwpEMX#Y{@;xrAt!Un zsrmjJ??4(HXrr{~KhYObn@pTfScP41C{~f>0T}P?=aE#(F{M)LAgF`U876|( zFX@bLelB0RM~aDf7K)B{u1Y4qusg&FeB~1`Rp-@K>Zma2G|Eoeg$7=(pO-LKKdAri zdsu+KIyV?uUu}w$Oakud-3(i<7su_xPL9&csza7|!0D?jx(&k}COqpu&HQmm!Tqa^ zUY(#(jKVV85{Q%%xoCHyAPetXd+7-0F|~lH#dsA3RiP&ZoEV##Sy(y?l11m^DewNLjY{RY z|C*b0fOA;PQBJ>FIylD@5AF@=^+$K=rMmTiaQo|&MbxaTRy@a4N2-AloMa>JJ?z-* zE+j>1=0!%s_Si4jHp(3g^L3c+KA1u`+w%8F?c;iL(IaByp$~`cp*{1hH=Y`jN^IQT)hx@l8S${$tzQ`oqP;&do9IB#htSfy zAP#~DfKl3?lh03kBJj6h+FCE@hc=ALKrb|-No^$#*66ssRZpo(+3fZ@4Kgzhg!YBc zgyhsc8!?4MmN(g6`H%ROiNLI$Onmy3KBJ9Po_Pla3Sv;8^x@eTz9RCy_X71t^gJ1S zC{BebT06E=Pn*Ik)@4I#<%KG_2BqzaBLWJz30v3chLc z>CW_$yev5B99^V)w3QYz2wWgR!Ub0%`oMdrDk$iPiemXCOwy6XK^cqGLEb7HV*TA9 z%Oc=ONMUby50sBkH&;lI5Q21AVl04h91{|K4}%yRAtsiP&#TxwOziRZKKJWWZ@U9L z-O!9Rzf0#NbnA@;PBvZa`rGvN|J)(Z(Z6dt&q|?GFh>dn^lOQXl200dVkl*Z zgh6UHhie1)KI26Z1oLYQ~Ew{CB!*=)MaI%*ZnU~PFym2kcMnFo`mg0g~Y0Ppknl2Wt zbgr}q4ORAS)Wpd;)QFj6NG2(XF^DAC8L1Dp`@68e8KaqEh7chMAT&9K+eJKHAQ+ZJ zVIY>|6c<#L0tG9;1Q7?da9HL9Q4hiwiG);ot3nxMdPpzO-OL48Xhk0^Si73PpTv>y zQwVVwB1kauq2+>5P*}&=o#zmxDJdLC0%6!LB3qj4`7f>MDILwD3x!*)CWqrg%4xla z-zt`-ZP`~AmTUDHNaZ}1bzXa~_4)KaJw1=v^}^^|YB<<+){|fd61}uUBxU_K3I(`- zAPfgF*6-}q%X{7nAIEWo(Hiw@3^AQoQ@+9@)E79(>WDV#Qlc)DtmX;l?{K1J1Kg;fcD75{540mBW+rZk=rG+U zOsBxkI1}e$XR>n=SkL9Esv0i#n4_uVKPI%^&@4;ubvm|gK+1X?LdVbuVM59P*n^jr zM&(W=l2MR;+mvo4g?48##_^VrNr{3+)?&=cT`Aj8n?gk|oGxp+VZl80lzQ_NI!`{u zf9XK0X2X7OOs2snBfj`@{@>zKtJ_>vZS0)|kHtA&iSfSG)s2u!QI1}-;y5Wgq7GKU zU&M%NQ-_7dYO>)GaG}nrtQ`ZUpub|JGCWC~*o>FiaWb4Y*tV&bi5XiLX8H{H2X``L zntr(u%_a~(iK(`ox@Vf4bis&Z~FX9&(MXDE5Ew(?UhUF;o_ojBAtj4R9*v0BmOIeDz<`Whs?2dv!HNoA$I()kVF1wZ-}oj ztiY+qq%zohey*;7t!)&8kr%y?rXG)EcSJvBv@X z40X#~Ssv=*x9S${lVwTnAP6qeD8b@`q+O$CEKpArtHvk{+XK}7)v zDZA9QZJE2hyWA4br9I!Xn6?od*_;0jx`A(g}q53rF zgim6aqN2pE-R5}*whj9X;$X+A?fY&)M{bfRJE%6+Y#;z$c+ECXI(6knWM&NuxnZ

1t(xH;=J#kr{_cc{|P&R?xVq7&+XkUmMRT&5ZzT2gdbSfHrRSO3wO{6?gPBDEh z{aYr0>y-!{z}gB)_HNYBHKy#*-5RXVxp!J?oY`+Cx|_b|vyRER5tXj&pMMxi)~ za#-5O+7#AbHCuXcOhq0!_o(=QY2_v8-{}OY0|Dt`#Ozr{@=Yc_7OfQ8>JNCI1i##{ z67jp1h-l`HpU$HkC4y4iy2>*P2=D>wC63Tf8)u7kziKV?Pt7N}Y_lYty;Q(JS;NTs zjj(vJvh^@-mc=gX&Qp+;sECeJKAw?O%*I4^!tw({5Wa2C6dazOlRd77g2G@EGv4<3H-;9Kz5jJ&`|YRT&WHGwes(Mv{a z>AyV|)HQbjuL^!B+}Orefqh!rl4%hr`xiTa;44~1Nw7s+<9i~i;#HBtG71#PShLn0 z7o%T3`VyY3{8JDlfI_>XuN~FD=py|Jy(4oHeOQh$^r3H%U?_z2scwrfjYjHra85iF z23bt7+r@g1xZr6o$B-qs+X?l2%ENHNAF7-&0-x3n6x(ebV|qs~ehIiK6)9~v5s z#zW?2u9lBzoycBJw-x0|W;C~cN`3>Z5rtNp>mjDH7A@=<9=51?7Bj$B#ON@e^L<$qkbPqZUu!r z*J8AsAtB;&QK4q%UTCKJBo$5JtAR2${tRqX-ef-a>^8dA7@sC$tc6}gTh&wvWZ*i9 zSjM5BGnnDym`^x9*lyJXn`%055u-6+M}Q!0jEo>xO%x)E<5MeKyq#m>9;84@5^SHHHF^#7s`8e@C~|X zgIre|o1@LiG{C1f^3ej1b6zIU_}F#9)AKP~jB;`gdNp%;LmWhf4Og+yYA;NJ&T zfybHz)K@e?$ae0%A_yh+2=ba~2oe~|goKXm)UI*<;UN0NL=QdOEW==-mVNO3gIhe| z;WN2V$#6v%%3Ap`*r=)oc!X{s@PdLr6(&o-3*5FVE%XD%(Vdf>|;_)mI3;Pq8@ zd`BwEbY11#ETy=$hZGpz;ZTQ)It*d(HWuBRfecMuux{0~PHKn4vKGHp>!o{PP&DVb zIw8^I_?8dY43BP~)~(@QxxG{G6mUAs?mhnMFjf6N{MgFj=a6XDx`~ri)C|Z;Q;Q${F3myYqQbF*E*ceYw zVzycfl9RS3yXJCLWj){Y5s_DMn6KxyNou4a`W<>K^KAs6AqEZF0OUJ8#o$}PKC!!f zNkAm9v37MQlwuyLUs|)w=64w_o@o!+pz_5*@R1nl*$nC21MJz_M}X;3xb$)#ubhLg zBpaOvJ@B8eT+;}43uUmU8n@YC7GxXSH=Rq@3mZlhf!Ry7&#Wu8t$87{x|LFmMN5@U zAH$Oi0gyzRQFdc>B0u<1;rL?V;??oSz)WAR7{EtoMn3pY1A%w5C?uV4+G4O6duc;p zaV>Jm^0-)r_15y$s3n%3N$NJ17uki3rDr*IJOP?uXV{H8##$Rm8uY7e_+`6A;DewFW-CaZWknri4eJx}lB7dOcl zh6`wn{#Z8-fb#|c{(fK#^kWHzaRi1j9F9GOJ?NUcb&u5a=EAh8)oQl1-pW>1H?6Ym zz9Ta$4{2}{9#s*({1cS}3CIK%hT)o}L(asdcW6sW#NyyarD4cu- z>6gWxZFJSqKY@N(CW$c`VLgp3lA@U8`?(>HPhio>!lI9JAXtJ!+7KO$mw&8xZARwujc{ zIP85CeL{v!wjo>*6Nq}O+W>XlpM{2(o%@#Otwb3;msKOy7OqLWQ6Xjgkz!EY# zk*Z9v5DRf27GY^P{Lob_?CPfVZSyo@wy{1CN=q%eMVRF9NzVXi5v2M$HmLiGEI6<~ zNpSvbz10A@IHl3CFK>*s`fUBkn}1``5Tx{yYS!GIkylUcWTUiQ^>k&gEN*}Kqqo4c zDD{RlY?lcUiC092>;Ff~LMVR@^7q{nCyfaVv;@iWzC&q*`}wl_M8e7 zNA)(X`O(bA>HKOMB3{9o^=kzEO$SbJoVslw$lV^o_aTxatcq?e##W|i1suCt8*jX} z^-FA>LMWBcE*w4N3Bp{061+4fW@3FOcdk>5NC%QbbNp&Ri`Ego`6D(IN^33=jw{U~ zkcp;53JGY6GkR(TOIb2%A)|LJv~jetnQSz>NB>K|v>%Nm$;J>t?*JW+Q-`rV4azz+=!mj|Fs|17@Rc{nm>ikA^q87GpT8KWD{~ZGDu2lAswiZOwUP9cTBhB4*s;`OaU{hm zWN)jm!hc`e4!-4D6p5Iw{J0y!JC$v(Le>@=7@j_`-jdO@=JQv4OA6MhE7rq})huL& z(EE+oddzo8hfLiily!QYUTd*tY3a7Ew->Lnt+~yv_LZ7#g%!%&46^_dL4TY^^M}JIhP0RX_x#QWl_6T9Bq21M5A^ zZkfIT2tW70-kNh9-Ur=k^L_znKbC9ra3mh|hZA8xSX^z^1;G!0rk681 zB|t!df(Q!K8vX%^liq2>g0Im&$A5L1-v3{5#~l^ylgK7tpUd#M zns?p#_j?^1HGo#(j=eFLtB6LcR z&jqH5n+=sB$H3-xDYd2eoDV|bZIy@DTJ~kfS&F?ojtfY@5~YhDM;o%P|26bZ>i-|-^7%db zFZXlv!BN|J;(Et^Svcskg;A`*VHm~e#Lahk5{41Sp5uCqc)m^QGu7)WwJVW|3t7#I zFn=(ue0t>VpNV*$!w&g-`oT?`rN-x2=pI&O1MJbp{68;z2UdqF=Yr!7T7^^&{wZ)F^H;*foNLm6#Zf6%bqu zLGxcO&mHh8HF`Fe&-82pUmkKK@9AECm83I}plAA(?M}E|nh#w}DG^CrAgI?#bCI?$1%NrbRz5D}$G9LiLB z@=cROjKx@j3no63lC#w}nkE+}Cgj48$AY`CGv$?!)HXKvp1`Z<8yV;r4|eyQ`6$pl z{GNc*?(NkE_PxfnH~&oA+~(rS>c#PTYnZsWS_~$AM#hzw?X2x^>HdGyo!!IMfa5)! zA1J<&W3xHZKT}XJ158;g@!7WOM#eNWADv~1jpUfknhT(E_m__fP8FnS(%-)41YwV| zRL1oCTla+ZBw--GcZIRmo3DBqSpiDlC~FlMO@u;0tC)<2B-#^l%V@0F-9~w0jvu)-^3J@9+Zm-ifZ?Jj<D&1zQr}bK`MkDyG_G(-0R$HJuXkHwhjTVIhG5#iG$soK{G|lOO)WguyJ-8 z(&@qQgM03SdMFY#6XA6@kw~Uf$z;MDc>L^Z5)9?DOJOc}hcsvppUVy8C6uwf!ZuUu z(Li84LCT(aECi9bivQi#7x06`PpObeTt567RtH12!amp+$KXKhPg;au)HG~ef4JK@ zlVzc%-dZ~E99~M$Ov|zntDp5H=FJPc?*@7#no%$uj1gG`Zm+HAty71sJwMM>7vAaL zu7j~iRIHC<{&zlf(^%to>0Q6;YDK-Y=S$4q=A0t)1U(e=OaCYPrzNdRQ4i7GUtOh= z*ydeO7e`drKR4}LhgYwzLiS)V6G@Q@EY_4ZR(C_4PNHBTKVD77Giuv=UiLGGZHA4I z<9;eAu(yg6wBI^>(^tvd>S&& zwfcMJMok4rScfT1q)1`e(H(u<{Rr{ry=+B%>8{=r=8mCZPOB}LnV!Y|EGuHY-I5!| zjPXE<=ar-L<#5k#N5_4?Yk!<_q`bfG-`d*FPmRL$D-r|c^f=gH39ht<2;dZdqve;q zGA@+jwCqDq)+x@wzt>23F13DE4UZ0n(Y-e7YRlF z-ac{2)T~3{*iyn2=O@oX$rX*tO&(A65E0Kf! zRCvtO)evkM7ZIrPQx6kTs`Ev#+-g&DZkr)#>hAGUy>WAqzhbR-X^XNj_VY%qzI5|~ zug5-L_JXSI?83s@&Kxw4+m4sX>AxO!DdfRC^g#5Y%G0qESuC4z-m{C)a9AY57>Nh# z0*KxPu7MM}K;Fs)CxSJt7GL#UDJ%aJA*iNDV@rWr`#}WQ<+h%}({^9B)@*7GWst2i zkW(<}z8Nt2>(xl_Dmb^c;C$(<$Fde~Cic4Kq)~H=9FJ}qO;Z{yO2pwWo^4M3TUk-3~TQ?UD&J>k~ccBfBqlI-fC$B6Z$dQ zMn3sfiZt?9DxS5JsWIM`AT+gz$duw}pJr8jT4OLPRwB1o1;qk$C+M*(@D)a;l_vi2 zcYV|7Q83%?A7tv4Kt9cCw}Czk^x@jLwvgu?H_y~+2hXf*Xo>$%J$cA>VR}3qmXG1nnV#P6sqF(|UyTf0I`*c zpu)fgG~-ferX}pI?QUx;wEv^5zcpxXn2qLEa^m4p%Pb0fUmlpV!mH-vMOwgCH$JTU zk7by|(bLK<_LtQ(iOOk&itX>Clqkx(3hP?xT9N8js)@K=zL@Ing@s9(Y=D&0rms>= zI?J=x-=#NQ2z}WQ&}(X=HjEd5n}9^i6jkqRcgmw=Ot0tl)a$ht|v=^2F%Jj zRm08&iKckhCE%JuNzut#Z+hN8I?C3o!e{Qyfln8>EvYT!eV+uUH(R7GMn z?7zY}4cCELZ&S6^2D9KZ=IySDqnz!IVD?gRa!8f6_MtuZ0~6WWIcX=?F;#p>3f|(% z@BjW{#g1R>a2q45aZBBN>I_me&6R8Bl!YM z@?8v<&9tU6&6(>cnnINVThcxSO_lwh(uia?mqoHF@ME2VFpQm)1~Iy3K??Ns;CVYU zGh*xjOS4N24L^Gis;NcE>pga<(ACqk)MRna;Ikp0d8Z|J(B$Q?nKZ24<2gQ_>&a*H z%KU8x)>uC)Zb}@5$V{$nBju`OI9qE7pozn!(;@3AiAc{zb1=8^u=|!a8;XXJ1u&x> zc*VE~e#3|Zwg<+7HP{7v;8g5_U483u5DdN$Q5eJkrWV8H`JqrUIh_?HBJc?GJOoD{ zGwPWl2A-f058EUTku!Om50=F?d{>XKvU*k)g*)u`<&iDFIG0bDH{iJ!=123;zGTg(-XLSLE{;ypXLRl9+|TCQ_AOT% zvURx^{Pr*er)wtOepD}2;OB&AQPW^ho$TkdtEh%;&WjNnCpa(kOrO~{esmT?Y_{d( z-#j+-@p1F;>LcmH=GzXSp(iCA;4d5}C5z3BWI(c5t^Px!&{(WGA-}_c=9k-dG41E- zo2F8womt>iEL2P3pV?zw`@Z)%Co~B4OU=vnwegh7m(=5a9A!zIX3kG!7+WcEhwCe0 z8zES7GI>9#Lwh=)&WgN&Lr)W&QX?plQElr0aeg^h=+rk9j7Yk-aUt1{%IT)pIzWxy zhlh=>1KaY%+GfVd>n7#}GpZ95iZkNCuYHV*QSO)a{5vTI&8nYHjHJp6$V(_-7zGr@ zC0#}m8Rqp=d}L%OI`*?=wmX`l8U}C$%voxzscLjMe=<@p~`L#x;5jn>Ti&{4P> zfe^(e&Np=#XGs(RB-kkNw)M%0wT9bez2;T($oSFtRx1c2wP4yvll@QGxr6ui%;SWAMMm0sHoW3=}NJ2=+g^I7q-0LWU7Z8VlwT z#zp$Si~uKDniH8(k9Z;R(hOWRWt2EdQjwseoWYEBtQbfsMZuhy%4tjASusM`=DV{+foDTw}0y;kr0Hy$Ji z%iq7^tKVF(wcpvOl8(>nE0!7Tn#J}de(so>F@C$7t>V$LTZdn^8HApPlFi?t4 zaU=zI34Vehaw7)AIEv{#0zt4O&QhY-Scr(#`2ZjM_{7$ON97jx#d7vm#{~DO^u2nR zCQMdpAv^!8roxJbf*Y6yl@~GSlKv*fa^LgicWN;bnKl^xP~%%aKt01^vEFIi*Z&^) z$B4|^+_;vJ80##`R>x6B?au48U<}_Z70;G*A9kAiA3=_g1zW#-5(Aqis1&*2&m^&ESCk6bBdq$18atUfM*|g_cY@jNrU*+Dm zNF|Uh)Mlu_twtI6xzP@65;_flab{LT(G9nOCP5)U6==|si0(;8?~k{T_}OXF?>kS& zSE$Cz<>t?lQxWtyV1K`YN^R|1jm@kCi-7~I~>lBH6L)Nt(e(C z7hSWrKFXf}H*B6&BKlZ}{19_tYx!CK4PgtR&+&(>Vz#S7v?t-c(Mk&c^L~y)ifzq5 zelkWW3{DrmJ&OTB0N1(7?K#>HkEv36k<{dggv<^%z2ZKezA+K3;?mns$w06?3uj0o z-HYR;phsCwCea?cTyqPKi#A9<*e)cap{E#EcOQDWgZO!94SsxA8;zM~b}w;R>6y7W zK5q(k?vLNx(y@r1=h&$ogGblDbS z#-d*k#?S-RHV7qT%_n$}F`FWLw#XqNleAJ(tVe@~| z(G?2&IbCzB$JRUG9vn#~;<54cb?FzU7mRupV(;d>jN|*3FIV6Al3h}z3H;o^%qw@N zfg*^vt~>Ojy?YrziIV=`p&2vMc1|xDOVhwwxn}IJO$Jc|6QB=mCABmEGL|=T?@PBe z+5H)Hhb&lNcxiO)VpsN$-kXM+j{M#h`ig@%d(om3?r*BDL@?~MK{d7QMx$;QBZF<) zzz;qS3eP}+2MsK4YTfuX3wIh!9pa5SM{j$=83D=nCCWXy&nNAR4bFxU)ihPnLWWi9 zYT@jv=0ct_IA{b(*I|Eq|4aLHS{*ZPTDN93%2X;#)aOr5XT(@M{qMn+U|@|sQillh zPhT%9mx|a554WcaN_FVb)ETk+dGu5{mWt(OJHJLHUUw=gW^`_+v!E((+ywqq(YHt3 zo7JoHvV;3Z;0Qi{08j#;>{zx41RWKA;m0S)&b*T+6WGD)o8Y!p?B3AdAH7K#wgU<&BcY$^i-m;F+At-GJ!AOA+5aJ$1R&r{Z)XgX23~@GSKSbrfO5c>7t6oC?%NYvDor0H0(Dt zR5AM-O-rZ24;yphxlJy)LsH%w3mC7aoWarU?QIc4z1!rYwe)t$XtB~7?o@BIOcRjB z&I;MYm~oAmx-9zGtj7Qm_?*GE787+jcPz*n<*rI3;a5Xu+A<~Q#(EUov9-NwmOs@o-i$$|=l+}Ya=M+n^9D89YmU{6`tpBMy6Da}Ry`r>@%S6eq# zLM>Bw%=#I-!|8GXn=lTwPcef#r`vYcg`i%M{oC&8d0~H#E63Ax9;e6a6u<0R1J#|1 z#K85fb@j<$d;6~Tumhj_y;AI*Ppr&GwI(|VhospuDFY%a^FYyjh@TiLFoz2d>YKJV z?^7_zzvh`~97|RW-+ulqwJ-@fneE(LDMwzox^Ld^eUyb z9-|DRG%Mp`KhxA=rPDwZU!mzDz2#}4Xx-PQp1NiOhMRd|vK!HkJ6LdRH+O9B$YpuI zkRLEf3rJScV0#oBvuM;)%h`-lT+}AE< z)02&dB{&Gnuxtvki#A~d8SRyOT@?<5bX~Lb`sG+U^W$39(YbjcGBOg&SioSgbJ2qI zmTE+^3WaCwv)at{e0#l1HU^?=T9c+R=M*PP0u9#h$(0`l@2$u?UHL@&SZA+ejS$7! zt}moVbLpTz7>v?fnnGSI$Z}+QNAK?vtJzngN3P+-&d+^YqCh#?j2iRQFm!J+dq^;P z;oA!!GAt^=*OzQ;z0Z;U=Cvs2!bzTMHs9y*g?#&9Z|x|9xfoK>+hBq|k>?Op*3ga9 zq?>2ueXRS(eB|}|`bOtVCoG$6Ojm&)NSSYpz)Wk*O@XZefQ{DK}cTSgEC$@7oDC!MEYlnmeY*IIUPOs3N z*ZgGQfq}vu#uz*|^1&4Y!2JiRfO@F1i~|l#Eb;Jclsk-XDZJSVXM?k&XCKUp=AszG zez*u@*llVpj~vI=lum0^(L1Xqmof;#{Y3vQJGf=r)Tc&6@u1tOca)y0x*!;|#M-K_ zsK>ff9dKsl+?=1-&WRpYSw0w8_}m#->=0gFQ`hFsP0VM4=9tcsVI;*eiXzLZriUZU z<||jKq=8$Qzjz=6B{d^_8?hOjrBDa0qF?mgqGs)p)?+s6MtP*tbK5^mlk2DOc{P~$ z6I_6HQ>mAnZGj78L+->7JI?uDEo8(?V%W+=xCs3ROt+kHPco+47eT3WmAW0&1-Xcw zK~GTdG+xT--?fF)+|?r{En9@u!4eXUb+qJ?X9vYt>Ft)y=%P@DVGuXCwhi!M4qRGx zS$-dU?d?BaR#ao%C^nr}%Z-#G6hSs>o3?ARXu&*`Z|j#Sj}OK9H98!KwG3sP$SBQa z1%{}fQ<&`$r(L5;m5uLMx|1TqanAw?#qB}Y>a0sCW<>mHvyQEB`Ap{OY-HaF!c z|9yuP)ryvg59?F%%{EqiR2<4q zKZGH=$Nz>;UQl-Vmmg%Ot6fSP!aFgBm>Zj(5LsphfQRY{D)W4|N{!p9O_7P;>P<;S z#|i%j^Z4BwC%9|7)DjSFoIJxenT%{SmE%iWl^0Pca;Aj3E1<%(dCP`Ua&q}99=JP@ zd>bmH?Hp=y`hN~!r$aL06GBr8|9dGvn8CL&p(WXH4Vur9dzp}nfquN1KMX zO0M>vK|ukY_AV+OzGSi=$;Z=49)m>5psh(s-pMt~`1b)LN~N*PPT-o1Rc7B->z-m6 zZOo|Hv!~#nH*?46zyge-jB@|8@TdJHMM%|cOLr9$VaIB>dz!-nZG^1%tKp{JuPE8X zsvMR|I*mFX7x1AoSGqMj9z@1R{FZKwbJoA2i(NBUE=M2LMM-&r)*@g?uM~jpz`W%6 zAPpDu+MyOKg(w{KjZ?gbMiQ`@{xS8<22%0rfd$vzaI58Ln^o-&_i z?8hOMUhU^QO@pL9qGL2+9TCN_J+>I0^od$#WqJZZ< zW~l^f7W?5yTz~^`U?~4O4ShzC9G{_R$D=IpiRnVd=%UQATb}Rf15z2rf?(_gDF_E^ zq)UOjOSM|lU{Qahb#?AId1bX#>|0IS08`3jjAiS zuO9ZCerBoNUs%dP$HGoeLVAt(HBpe$Z8<*|EhveM1~O7n)==ys*PN3rh_-isY3oL} zf821dTf&Y&4v@(a3dF=5k1>1fqOd>ocj&JyP)tp zFm2oHH+;BK>tXW~P|?xOBYYk`{A7N5JNSQP?N?&(@75`NMGj{BbykW-=EF3^`1;iq zNg&=Ow-l!y*S@}tW+?Dxe!$67@atpPOhqPwZ}_d{+}|!_oFmhr^8iVb5q0@OD3VU4 z2i!)HP^i#r%r=9nTOIV)k=&<9q}S0qS>CEnVFK(}&v8m=n?O1_P9;5w5EO1>w^7o; zPAY7bFpAuG?mX(*Frp}LBq@409N`%f=JQiy2}KlfrF6L{J82BV(0o)!H}*;)KwFFw z>S9J+!6K5swqCK`EBspzE|dbsV4m9mlGy74rq8lu$9Gro4PT=<++bkZScxy|x52+J zLKz=OoIVhNBzz#jfCO2`9(u|&{OZcl1iyKY3tL>EF$rk{t{@zc8m}N)t6$IhjwGa!Te1=R{9$X6sQ3EFl`;(=ICU;;DX)n{fQpZtBtGv@EoKhdZs zLu804W>EsB$Vc+=NfbUo1hGOLK-a<<1~h1$i3i3^^_AQME& zq12Ejia1>f$Nu@F;>%Px&Z@wo8o9y@5?bLGVZ9J$i>?DSi03e z>L@v|f!y}FJ<4`iy}hL4w0ot0QpV=@RftRbCJ6J3M++Vh%3D&_o{s$ zQ#}j-k6x3&^e~J&+5Z&$qEI`Tn4uhA((t{e76<(!)&4jOqGXj~(GKazMM0-inHog3 zTGlFAOXW`GjD{8v!jb%NQ8i*8TUicS(=u=Tc+?s+)6%eTV<0*=i?24G} zPFc~bMb2kCmJ|Fy<;f%L_u?;XoxAiyk8*s~H}dP1{l0kZJ$HH%pa5G2MI!K>Kz`~B z(9oD?vet2EaOMG-C98%Msp#du@Xjp#`=;H2PzV9w|1~x?5vSF85+_*TPRE?fELf)& ze1Amf9RGe)C3zIoN&jd`G`*p^oqh#C}yT$G6(2H($`4;LKLFliPj(I=cmyks5 zu4S1{V74qU7?71_tO-F#4eUReE4^iJHe4rM{c-Pwf$u*1)eGi)XL1kn`Gpy%?+3Xo z+{V=2K4zff`QThO{({{nFkFuy$jQT(%}?>~bgTY>b4TLD##U95CM?(_n_y{EfFqom z#B{AL`+S~eNFPbN_9(RJB=MC$dUt9lzGuH9^cN^q*t=IfP*Wd%3*;Y$ARrOWo2V)D^WIB(= zqq`KmLm=v#W}ZBcC4Bj`9xvvi1{lN*^XaW*x1UB>(xB(rVey}E@xBlN^CW~Q3^5`Y zTSU@`rYJrIO$YRemb-@Iy-?E@?KYd|MAjdw=8mje*>rXh#it;_TL68ch@Y^T_d&RP z89e#5D)uvQ+ZEQU-#jPt)!_5DacB`Md_M>iMlw#$Pn`}A@`%E@0#re;G>K@Uvn+Ut z^i5&JQih=mlt7oM073~63}Po7jX?}n!w((T-_+y&DEzRv2(J;0p=;brywSu!ES0SL zLOH~Avb&<_eI}+9ZX}1KfY?}qmmk;dT&McparV?wu}j?;wUznNJU4Sk)q$n+8gZAT z%Me>}P3-_)NJah`wnG*()N>GNMWun^$2&TWyjwM;2?}2l*dhx^db8kX6NXke4=wz| z8ro@I#^(`PSfo8j0Jh+-#WTp|*x-IbP@|76*n}MZVvh{U+5{vCFj9-musU)5dBL9X zg?$FF4W37~GKT2Xn_pV5WzZCo9NDNZh$ATlr^J>0AR?hPUx+Xw_fl-MFfe5$kBBj3 z1SKwdYaJ%}Sa5jOD7HZ!&FTqJ;5c_qdn{KNLBw0Duq-c-d&zFRw-JaHQ)oWeVSiQj zU&0ab$v+Ycu(o;X^OJc?Bm9K<$j_m`M=`YIKt}Qr5|SnI8FC|elsrv>Wac&A9}9>M z&dkw6x`cC^%|hcd1!|#J_mm(D>lJ&UtRaP4K4;ALndi8A&$6qSsh0!OkUnVT_c4*n zFHUBt>S8a|f#+%$o}CeEWi>k6u5S;Bytt!mp76`Nphgtl*bv!#AFiuCdfT?Y>InSe z(_{ba>e>djGX)jRHuT7xE0oIlCvUd&4e&3H0~OR;6j;MAFg>bw+=*V$SGum&Ue%J8 zqeaUON82_j%fiIzj%aKLA4OsBsOAD^+;HP*7gpXJ6zjkksjg8G<&6dH_iU4q^bG)) z5cYWQ->$3&!$h$V%dsmKV&O26hpvk~kNQ%GfHUeL$T=m%!)W9ck8)iKBtv7OcT7Mo zd16~mDP|N7u!OQeE_K?}lgj7HOd@{H@~A&)L^iEoBA(wgnffWRbTJ-Dj3idcV+;z9 zr7qLGZWNN$GJ;*17&RJ}fy5O#(25V3IWu zg1|BiMd~0hVMH+;?+s&`W>{|I6_4`jt%XQVg(kuwI25Pj5FFCIc-}w|_F79 zm+-zj)>k#hYFwo*(8M2S4rM z$L0ofW^v`F;JG?lAfWpPJ_od*;W>=7Lx*lv^1CTg;`ytFH#xTLFcwxx(wB9ey)JCh zZ(R9l54iY!wF7@5@D@uDxgUE1O}e5}rQKJWrx*IxrlGnAHbyp%JT6k6(GBa< z28V1tTrmfG#CS1ZV*fA+Sg=%12}&TUk4Zogs7OzKd#u2Qpd>2+Js>SS+AEd0aFBJ% za6Y8StT*Chm8YTVqXbC{X!x)aj7{=1Ep2Ud|gm(PE zvrGdLWa~Y}aiHsJtF6`5j?H9Fg#g=~u7ZI-SS#uWfgFSBXB?S&R%_kRR@#x8C$la1 z(#(9UAr+S={mgP55*6t(@yKrQxFMIH+yQ%k{;Te^PDa+f)s;Gw?VZ`9vfghFd3Lt7 zd*BhcQDnOm5fTbiMR6&T496vDIs z2YdICGC=N$VpRnmciQg2#xCb_hrDLj-Q|o^2aFJK<&gL>#mu@Up6|!u_{LAFL0iRH zHBx$A=6Nyl!FyMS0VPBv`Kaq=z!p0(C?V`njA^#11JPtUYn3XRu@Gs670wA%J1=Wd zBn1_YYP2a?A7K{!Db}Sda10rQb9srWQ5MnU=%Qgd$j*5F}noVa}Ej>>#{SNC}VJ1AD5fX}S(Ul0~Xfhvx#2n}{L) zy7ROyvG~Le4#X*|<&RIkuWgcSYP>&Gh0H+pUaq=fRt8`w;w>t*eY4}Cfde;@pJi!E zEIl4&bMDfDz_HFSB8YGUSqwW@bPf<0NTG-@!lP0rr{kTbC6S6O(_`%}7z|1ls6D|< zv9Sj9oUzozEX#}VtEKHGMCr`iY`Dd~`aRTfbQYKsL>?&C_va!>=h+cJqA&gxdM!Lz z4X>RQnzQ<&WEGS=RSyp3?m^sCRX<$w_W6 z%LI1<_C?SZUkJ(5l0Z;p&^fvDmz2X;m4^vO`dV=7CLWH~6xW{&4Y+(UYo~!_OyHC^ z_-I%-xxj8~{2gWOSglvy*88lIAE)6yQuK}-%6b15U|ky19X3_e@7fsR@_v?K&Eh-Q z)eNSq_F5{HT)=&MZeF9^X)@MoYT?Q6p4^E1s^(cw|L`3?-@4>E>hSx)e+Rkhd_Vmu zNgQpd@J8>{i1>*k5O^Y%m}P+(Tzy@#*rtF}oi0olDPrl&tx5`Vp8}7vZyimKG3cVw zL$gla0_*OoIY8j1s90DU8}pPBt#Ey8(&MCD-w$oe)-QdQ#WcTlI)7<)rk>XD?zzid zxMf(Aw;R;J6B}*%xT|j5j~L%|DercyvxAgjz!V5%l%`2ojf4!uV^zt0e>5SUbSjSg zz+so?!*NC^0WHahhxCjs`V=FkIAU=z$&6ejd-LGD6Z|ihdhvx&xf%$}nX+rVZ^wXh z9%Q5dxDX?S)nFai$Er>nGx`uuDq}Epdv+=R+N4z(S};p?co+wvj`ML44pJ#PF5!&W znnigSQfNC4Jm^UT#8n`4xwS~$-334MAeKT!F%Mic2pQ*MRFqOMf+?Cahna#Y4TN(R z2{BPFm1LBWGR2G!6DTQI&$*J<{XN;W*2dZLQzm{F%a;DCiA?2e5%)5MuUiU#-05Ab zuB3C=Yk%st#i!{yrF++Yv0o=Rg-0?j6H>`cR#Y^Pd%Q0KlR76@469( zLhsPUku)$k?6`wxc89r$vs_z95G-`C(~jOc>nT)Z=A;!hLpjtM#dp$@##vBlO~-$| zcNV<^SLNc2N(*~-94y63e{mLBj1rSF-V3Vfr- zkO-la5SkTV9E^+%HBn37k3AvA=%Z6MC?y*{@E5OC!WcM^hq47zexC!2m*wyo4#kzP zcyGX+N?FsTppIobw(TH9D02sgySR6~GVg1a4KZ}CceaU&%jY%?3I(jcX>;}4`bFw!D9 zF(ft(iGZ(7rrd!A8@`ta;$XWpQ(C*oF6BYsrTGwD5tz%JWY%31K9CK>0UNu1Pm+7MU8}BFBL+bkQVQ&8UcEQ|(kGG#gn66-qYbf?K4(y;XqDW%L7De_sD>g8f{E-UH@iWk zB3f=7hER}{z&sHwl65CzNs1CcNP-cBs>PKFRz%A9d@~Z5;Za(5Fbvagvy1OU_!$ z1EK4n7!MKlKr#ds29)z$V>+GDb3e`Z*8M*gTbSbpzO{&mWCwMVn8XE#!4bHNEZ{;M zwG#!mwW~8ud z;^YxKvBS#1PK&@Nqa$crJV20!pcQXD`!}jtVI+m!Tx=a(XU3-E?ss3{x@a%NrBnaK z=?MkC@Ck}E9NMEiTNFXvNw(w?KXJvCF+P+c0OJx=4hnC>g=av411X`ygrXw=1s9B6 z(L&HHO+whtg$};LvJ7p~x8%G5&kG{Q{|{Q;IuI$!Xn!bOE-%~HA{ywpTr?EfY$z{D(z(vq3K0O$1gnBWPFe~dkYrd&-wj9@ zNoagw8TeeJOoa%;{OTD^K4PL=3Wpp<@5*zs;PW0bH-<~2k)lAD%WEH=JbnAc&FOCb z(8(K*Ui@-U4Bhr*etMv*sj;G>b?)-Nq{Tib%^y$aTkYw{sl}U3WB}CF3lBiVBZpkw zwSM1PMMZDrMmLG|wb|L*?;$fySNo}Nvr$wo<>XmCxZtDS12J*d-eAqSxlOdzpOX=c zN#9%>R!A~U85@5`B*3QS_66%Og08DIfm~gQ9Av1eb;ZJC`}iIU5fK3%^mKL9O6(UA z9ko(@eHK0gdaY!3PyXQ)<{X$jY1EclPI)r$^Sw9ag@S1rI~?~QwrcN+@p-ok`>9=e zL`q?t>_ZUhoEIM`sm*5qpYrg&-4YQ3);jm^&f|v6XEl1vXH-b{C11pG_&6EGGO`UX z+ohtEkX)`DifpEqm$>*v#$izcCxNy#j4>hQ49n0|T%y_P9QO|C9nu>=H6jp11ZeCO z66Y1|Fh$Bm)^k{DqY1Q$jFPoUkZ%$F!wa~ypSfY#z80P2V~roB zOfc4IP4(!KS3kc8qvlgxKIQTbR zOT}MYU!)uR2YIp2w>)udmT#WEhdB0j^CgYC;@}th@pGLKkNK$>hbJXTRYqZ!ft)3L zUdoCTnh6U-Zyb|F%9a;v zo5o5#YW4os_6DUDPgB%sN5Jv?9BEYIQxNsdH2&T?#3xBHp|@}nRvMx0@?6VBh6NqM z15@poF35RALF4hC@zlIm%~E(VOE=1eO(JBrCHh@0!J}yiVaZKW#ol}IK9(Xs<5Jm7 zq8B@WP-~%w#Uk&5wIdz zE6aKV{Mj(%-Su*?Rx|;^-YlgwWO~aIT`0XP{bXVvy^h@V0T!TPgQ$r)gPUkzw|@Jw|_~MW)SPC z+|^E+7yi>S{gtRejd`*8 z#rU#r_WFI{fYs2{H_X#|Rk9lpB_uL8yZa{(Yf0*&1$%#EJQG3SyfyRHn=rn$K!^|~ zl=f~e`0E(Mo@2Yx31EPGCsvx%#f!M(a+XC_{c?(2eL1WH8-|gOW(+h>zRC%sB!n{` ztYOHSnzdYpyjsj?pyk_1igcH(U(&U1r)yZI+EY(_ZJWtq8?PO8Aab^aob7t^-YBCXks#y)@`Z3<`ScqP2S_A$F@6>bL)-u_a0!{3`s zI=~3_PLaK&f=_1#_db>L!FTafBBfpqJM4*~KECd>w|39}9f@!tAEwvE@HEZs*hH?&V$! z@Y)Y@jJ=;_yWO~XC2xE|pF8tXGD=^{=W;v{HDC^4n73%d0I}o`$>azDWx`YXaX|r6 zMxL3ce?fJTsY0{A~{dJ|r#Mu%QK33&sb zxb*a5&C$ZsJCCXRS*_fmoJ5qA=j)KiDDSy4e}nPfnN%9x)Bu8=4YcH19Kl<{36MFn zWL&*Ssyye`d;vSO76PjwRflz{4E=6ODpy-qG4MXrhyw$1@}*F6;!D}r+pkcEcR8** z`7_j9tH*K=Cb$oELin*t6xxmV&=KvA~{IhUgP z%4$twuGCx7=&9Jk6;m9K>T~QthVjDlJZ&cWtE44@x0kdzQ)>A%za0fddze6tZr}M8 zx!E6sd@7-thgI$`vD!NoG?x}>cIhjyF6%TEB*%7bsHdp@>v8_Nvc{kx;zC5}olY%ZN#5g>{)$4c) zRV0y|79qz*rag9>5{UO<|Nik?bd8;ZEJ=6G?#M@gxF^z)HrqiwYTrY&1Pm$7P6Qzh zNckRYrAZczxGTz0ibhECc$9d%<1|o`Z_g1WsY#me9-kSb@byT=K9A|B`sdD$we1~8 b6r&82^QQ+ZZ1?Zre-i}g|91_a`#}W>14e7b literal 0 HcmV?d00001 diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2210a899edaeb06655f7bc50e7f94444da140b94 GIT binary patch literal 120840 zcmV)DK*7IvPew8T0RR910oVut6951J1HHHa0oRcL1ONa400000000000000000000 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̍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�&m_s)7i%W&AOTQj!RY?DD%Lgp-S*pOmro??aDv7GjXilW-I&L zM{?Tg*MeHpd9p-xZuY_~Z0*T=e{U@vj7*)Cm7UvhAu&L3-+1QU@635F0f~X4VrgpS zK&gC#@Ni;+M@M6{vSc{ZK6Y3*xt+QUgu$ZhU84@V&5p;^MVC6KC;Tov{op^{Gfz|$ zB)d-hU3}`nzh(>-_T{MhJPu|id(5ni%~baC4}*S>k*t=6jj;FT4@S*)86gwTz#JGB z=7)yZ{j*%6;;nqrkLclod0#K;Wm#Y;1336VB2!c1Le!N}Al21>?7T28QIPVz-hW#*Dg zjzr>;sZ~`oyy6_iIsj)`Go0Lmeb~ze=RWQVoX$^ktFwni)ZEF z+hyqDBT=j4#V#)1;`!*}BschT2*xK2J^VvkTN6V)TtvZDRViX%y|y-%5q0AcDr;xO z7Vxk9FTOU)vy~RpK@~?NON7w^cS%`C=RSYx+(5s%nI(vtjZS=w65OoXq6GK?O)Jj=E0k;eSTJ>hkn)d zr@a?!0YEIEg|Q~2VXG^){|Y^_weR^O7t4jTN?YR|w1HNoS=){qt##aFjeB*p=S(r1 zQu`T!o=kkXQZnqAgmD>r$1P?ith+>HeXi?-0NXmPF9Ka zQlV=REkz z_$o1?n+S&K&gwmM6-Jl-KXd=YOZD(;#gCFdM@B~0OaPEK0UuL4XWUiOF~*y@Y`isg zQ-EJ8=Uux~N+lG8O3&X=XnP~?pcJXh+(~1G0Vx$!sPs79BBW6AAH;TQ6zPaEZOTp) z!)pabBaYEE2Vyk6z&#|CF}0zSZ*ptIcS;q>zLQZ@1;QT9N*4Bh+%D0=<>Pi5i*{m@ zH9M%3ut#3WWgtE#yIigs*U}gYWmH6Is;|vPz(r14O8K7ha}*T;2OsXKDS13_Y*;L% zK-qml9%G>Hv|h_ry_MIJ&0Dp*O?;=Ub(QmkA_g1 zW)`O80mv`~(~z`c3|2v;^J5wNBfahQfc;$A%$GiKWmS z+iIis*%;<;qd`zYioCRkRpCT<8gYW7$9tvEkK5ARd^SHXL@nzosfs$iY$=z^hcP-? z*haPY##fFXAAdMLA-D7c`#JsAe%~Zr+i4IzC?Cw7svORp+B|iA>gz~<Y3h^_a>|FVwZbwQZ`QsSZzdPw$VCuOH!7=r(=o%~PLe3{E?0@Sds7 zT$mZAR4Ci0+c@1h=1W7O(UUV=G|tvErE`{>wVHL3^|tmeZPi}Eg)GDQy&Ly|7IDU0 z;|})gUKjW2U0i1RocAw2JbQw3et)OQ>*wL_<9^^DZTXb<@*M}ywg{{`0w4n5=#Mvo zdIk~wG&t*%0Ro=CHvyo)2?$W%Nj1szY)8+g5}zOBSG&-qNJnzN$YHIybbv$JEgZ?b zFu}Ks6!gw$p|N{HE$&cX&q1Cd1v#@G@S9DI2!>|ESu%|0+_K%|qtRm*JC0BrpI(?U zVM-8)%&<*Hrd{KMbCJp34CERvp7}>a4YQF@sGU z%Q=vM475P9NHD~Z&3}e+z!?ufo}xrVtQ1*t)Hpod6_o&wff|beh(QXZtc*jp5g$Yc zAmSC`0nj~t78n^I^4rQifHr7_B8VHf^E>>QFN^Qy$LuHmKmWH+!l(U(Pu*%d8Dju2 zAV3?i&_YMx7l}nWuZS;h9}NOlvb9nQi#7t}T3s9oJ?LH@L;_mBU&M{UPx0M8DUWjW zZf~uz=;u^_YJYy3_xq$g(nz^a_?M_2`An!&jRF#)(YQ}P1`4MDq(DBnL5g?AW+ENg zuIDX#e$^agfoa*gD9ermgCca$L!|LAs=bWR5JSR8-d9aR9BfX{Rm%Jvk+(|eG>Z;+ z@zu)Xse|hFk20iubJccb;|tP8!$cSlCf9>4-Ma2IW=2eniLul*+~|Z`F50)E zkZ22EHv(2j1X|Ua<2Gh!{9z&Eo|uA)6wYJsp)o6oY)w`1FZyqoG$WhH2u4Am>o6oT zx&p~-IK<^;h>qA!7YDs3nX*Q^-KbLo-}8MKw9@0kV40HzPKp9igxDWnxknHDZ##{O z!lg$T0Rs#OU<%Aa5N*z(e66xCTQBWx1f`N#`5Y!mUF>yAO+C+k?$%$Xg8O`8(Di$pNTQv+&6&>wOoU{BhDCi22NJV7emy*mg7zh+bC(Ic13 zj`Xc)N(NyLgNO!pL^KSdQrmB!D4U6ML_4{dv_#;>gX^_*^+Y|`T10~oHvwY6d1=~n zZ#wkB-YSj9n;_ba!o#ydNs0X2C;`;Wr*6RBN__BD)WEIR#R(`7fynPDD(J-l3aplk!a&V5OlL!iNX4Z~DFaV$848H}iTMn>mBAnt>!(dVqL_PmJ8P**E1o3G z=IyDQB~2+1m}Iele|Lmb$mdb|`fPrh7*g3;eC!POfR+#@QgLGp#E=4RM3y^({JHbe zu*Gud_+_?MMTkW_XJ_j`55%#ph1}&8)oiZY>Nbi6PlIGhvRVAb9%*$6PPK}u43sDc zE!R^*h17Usy+n45B=1Aw4R2sXB3#<)SWx}Kp0hEM#e>i`;RyzmWK*hO8&Sqw?Y@>8 za8raCN(p9aNQ=!@v?T)Ns^}=*#3?q$5|AWh?4LRS9iu0ymbP!5^;)P}mDOXMn^AZ> zU%BGgbmm*`i1BSk;K+&t9EZyM+bDEz?Jl0~%T1%Kl)W4+KD$UqTVfwyA8>i-6G6%j z_z^Z`X1*?Ec6zc8{MqhNtkS8qlDn_Ab+$+Bm2Mb$*IPd67op*T?j4{PvTZ-K>QYzb zBnHX$E~Ty34{fzg{bF2S-}uB0Ssn9_JwFpX1@puxL)sMf{DUExf60}DX?t~pBy4;bDP|7_o>9^7#s(X2KnF$$)hlA&8ilwV z8#2lQk1vJ*;SsK5RCa?tMM}hL8Gt$Q!-_yq-AjXTgqy#y^ApGBo%D z9WHq=y6(qKSfF%nNjGHo8VWJE3_Z@^lHV>YLxVri;g^KK0Q`V3s7KxX+f}+Y_jw{F zHYi_oz|HjbB9$Khl^pE+z2fyjS4~wiQV^{y*999t|ep4b9;nY%E&0GJEwApz#PaINzy(qyXHc)4bd!)sp-uMbeJywSGQCTNPp ztGK9fG^uD%Bo~w*Fh=Joci#BEP%N$~`_Wx%vvHkI8VcL<*P4@!F!s{d_3_T2Q7>bO z+@Hh5mcE*;iOS>$hYRFvF59deo|3=JQ9ZwF`A)ECnl@#S8FeY+&syBhEGcm&z}(&P z&{}*d`mGJbH7;gHWY<5$9?vZ8<|3uJ;zjdbrb(k5frr$ ziX=}Ad%agGNOa>|vDw+lsm{qcK{`q^?+^s5L56}T8F*kyoKX6kJDE(<&5erhV@jfP zQ9#?Cw@M~vcnp$BDP*{>i`A2}ltimPX__xh^Cp|kYN4D{!VPHy9#5LqYea4+Yq2^c z6Q@A#I<^sQMxaLhM3k5A%i8*<=ZH$)W|%z{QXsLUhuLTRSLmmKsO8mJauW=q z2Ta3kkgV0i59q@cn38$N$F?QM|9ba2fxx2~+yeian>ZMZUJ00%*$;!{gEXPip-wnK zuZJJY_k#74jobJSmoe*P_G4G3qRf>trDY~1wjH)<{57)NbTv2e#&aC|FJHfyl?*?e ztQ-&*FpeN3Ne9iNxkqgvyxbb6dsJ2E;V)NBQT0x#+^&noS6f!v%`Sxz^*n;+OARQN z6G}1d3!T+En6fv$W%ljTr#*sf$0N_xbM2G)imH|yGCZ8kAeOzBqm4?p_THt-k_J*u5Tl%kz(RCW4XoLa?qGVt-q)BVg=yIBx8Ru?xb%0Tz%&r(`FT?84c_H|*s zZs-oOnLyq(S%^XCj!0V_dW*J-G9RBu_r(oXsQ{yF0`ELnkg+G6xmAVY^!+H~z6Mr$ zo2fVm*!~{%+K^)47WOcv4Y<<1_#}qQ8qORJD_IIu@4Y1Wj zr!2=~-sY#RqwludKV_>GYsGYbmmkr5RdaVs{HAyi=CxN^H=Sq>UpR`Et448cATjYi z+aZ!&ClFDIwL2|_e*)kKOZ-ygE&23gq77nY6 ztgmUr0``-JvOPp{l;gAfEk*kUxIdfcFe%25=j~Q_9lQZ=yR=G&YVCGGurri+c1+?r zJ98dU7Ff9*(UBT#|i|+#+B0-HFln|ql45 ziwJb{{fvT(uqMKz|#YF1O?CRmW`xaI;^N+Xkmm| z(R!L1)`qufg3zST?9inM=6HsJZQupY9F^utaB|Uhn-FKa%v#1|(0#2HOcEQ?Lb)N; zBN|bqEx6FVw9}U@&5E(fdZ$;zDEN#H&~AE^%4uIHa<$ca+mNlX>HH^bSXWm$U^?kB z*KJ!Yw?Ah)offWT2o;O9`J}(LXKj3PEQuY3Wp*-B?^aZ|Pm1c)!b^8V&%LM#z{;nC6Fx)C=(wX z6F)rYc`cX}RO_Jze(I9UzU6AT zbGT(+4x~czp513Zd(n@Fp=nCJnDf9;B-PC0WY_f*sFLfbRFa=4j>C~pGS`urQi3~*lQof^TjM|X_axKv9a)( zdu<%A)h~r=wy}@7X=6C;DokhuS;-o6=C=KNAhAaVeM z_7{rmM;uG0=PZm$_~%4KqB)2uovRl=2s%v&h)$H@qMsU+K}e8juRM|@A_xic0;zJ_ z_QASBse6^G$Ad4I!7uTL$>TJEGHE_}Q}#cM{dD;-a?to{2eC9Eim8XFZyLI+Q;a>W z!yEGIkNQQserLzy#rd3wtgHy;$cdskt!k|szR%dDa@$@MyM!N1R*2q~1pN2fZ&@Y1 zTf>rrYO#_h8Ig%4rSAy)MCqKOv|o%P)IEECfUDa-XOdJHIlq1p^o|`UOOZ+<;$mNf z!w?U+&mt*do=+$m{%6%ULI(dZoteHXm`DudF+1#)NGgLMh2^3=0p_zn^7;gNsw^?> zpLbD45qs(l96v~f9lp)m@X}*PDx!*YP7Zsl`QjWUPP0Uu_tt$(RCx^*dC zzqJ7c<7h>@S-mh@WDR76Y|obZT5NuHz+)x9uS!yPSgTRt$JPe;<3k__4c>q`(IJ)a zQvLvn_U;qje2VL&Sh|x_I*43~dSF}zldvM>)+jac0Aq=T&?YbVDG)#a0Xje|kO<~V zLf8|LSdKEKXg3H--v&8S-$Bjr_N{>w`s1JUgp3zV z__&;5I4n3t3>U~4idHfjb8bN@>W16)qT9B`sCfB@A8}CheQbAn2d>j~6@xA-@WAKw z6&1$sCR1+?Nb(oTnVM+Y&{*07HLO5E7G!{*8e<#qub{nv`#CL{7Z$?!0!RrS__n33 z)x|G8JzcUst5M!=V)*t+iMJUjt3Fv1h$`(K9mvhe$qiU77HdFo@{Va;z8_8%Y&eZ4 zV?6+TK-Yj!3VIk9Pj&DDDdpaK>8K)pSDkrv+Q zEYP{(xxuv+eXq+}8FJ8@x>q-0J(^hN_EW%=Zh(zB2fH4aWv0i$Y1%Hx;t2n7*8caw z^8DQV>iXK!;*!JdCunx8w(GlJnK5t`q1{wjt6i>-id0H!WkKmb;)+m@w?La#>( zm_wz&ie8Pz_`(BQlFie{?|+dmWJT1(254;#Q^L(a%N2RPw#j^>cExm|tWz$?3jv8$ z4A4VKbNFlE+H&D!7}~MXZ|J636+}_9>^P2W428{*0-+0H9pgJ-*eq;y)p8bA$%2v& zD;oi)*$Um6D(FB53>bkfCv6VAdyNJ#5yt&%={A|Vvu6DXJCnKefK9lq=N)35is(4( zq8BeZ*dLk)8NB1MCB?UMZH~DY-Atx1yrfwEa+jr>op73FG#ZAcZQ)fp!r1KHaqYte z!%PYxnNIy_V1XYI%jX?D(lq~>a*db^qpTEyH~}nsV=*W%jRxrB}BBWGW*{;!NWLb;pnPUuCa~!P<)gs$p$+|`;jp8|P{$&DFN~qw}1mK7P z1OU)H0*Fy_Zvi;Gh=&!v)9<}zlU1HRvyhYyKiK!r<92R`7MT2pwGA-U>dw8U5=|J! z`h*UPwA{tLeIwjhe8Au=@Iz)^>gD421I77m~^vA%48FR>uMLAI6 zIE~UV0}AeF1v6~=z9TfB#&8-10-imBJeUc=keAjf;iogFtsRMB)e(0HkRX>#P|8T- zZT@@9Y_is&Yxe5%s#p|D1}Fm6&v9{Hg_2?Zb#CvhIPGMA4vdmtdxVzT^v|XC)y7wC zowA?htYENkqEGCVxUw-LHch20DG!E7x@or~&F#K*YM9ekvR2nE^xO>z)kEzPJVCS? z_Al=5^$RjIlyOf&3S+d4oQ>u0D9aF*K*NQftYMu8N^$UE&KN2C^jc(`P3yF@S36^2 zWcUkN8Y4ZLPTd3vSx8k>HdOR7rAkHUNjf8?d6-YnOmnnkT0*#QD(;vBK!OtJK)MqJ z1mD8VvlOP7~F#14A; zcP@~a;6h=MWHlHMgiE{~BLDYs4Gb9R*YPtL60F^m!_R}?IWgf5Ceo2I188AO)|85K zT3v@xd>m|@sY4?dk*bSd*dU6MtoDq8 z9Za9CgQKn19znNO%188#gaffoM@5iQ^=nzX{$lS8yCtvM=2tu3lMTW(dD!~w0ftA_ z?w!)#C)Iy+@0D&naqbpzc>pKycmfZcj`2Lw@qn^Z94X{Zy|hva0tglaI>+N_Lpt+L zkq{`4W(&nYY~{C|9B;uMxsz__`5^2{-g-MDPgzl;iHTxjxwAx2a3525!H&9|7mmi5 zJqTg6$gYvWb`NiWOXLuE~%L zOJP5_q9u5NJ_WJ3cVcs^2zz8rYlcpBrKB;(lnA>JDwZ1;znc%Hq$DSgZ3zj9dM*=E zQvvL621CxiD;s956&7<1Cl%jHmpbG=tb6~K^|Q#*o#}jwGC~Bauu4T%YfNWR12O~8 zOWZA6EYTTx2>RM=@ry6)BYp5qvsXA%OJ;Ph}w$$)UuY z2K-}_L{S(Fl6aV9SxlpZp&`d8x^$E; zxh7je-!UY`GAXLnfopOs&VOmK^yc{s7$LIkyiMSsOZ$8T0*K>ypy<0ByLX>ja`wqHyGU7}r)R)m80b=g7UJKa?TCx{^^7Oa~zM&~|NzQ1v=-fT3QEs~c-5M`5$aI#|B zq%mT~;M@fZQjev}hgJ^t_4a*%npN1!vnzxHfDgg}>}f+Vqo`_Px~EKINhz|3=H~?& z9uXdvG7YiWLUW*#bp=AyNh;}fK8%lw-kZ+CLVx^|`2#o{9YY3%IGD{p^v`Q+M0kLj zT&|sGkOh4#EGQpDi))`P@472oXrDw8%=QLNvk0b@`pUdaCRg4R3Ekw9Lpm8$&`L9J zA%=}im*nAW#_{lXVL|sh{+a~q-?mHoEe-E4PJo!EtI2dRX z@bBWQr~mE5|M>Vk{1wB{<$qZcu{KTbcP|Qgiqsh`Sc0MPhD%pwWtW=;YpC> z*Q`E_vz*JbKE5U@{F3ZKA@3!7ihM>$$Tu~9scxTUb}wahIygcFzE|8I4C8Fg$77V? zeh_e%rB$)x_Iv4LACE`%H<|A&{R08!2;&uqcWS{8UKmeD~ z0gXypAi5I%NEXZ;aF9~~*a{?#;E2;0G)gs&OuZ&xZ%h;MG(M1oAg&`JCak1sLugWK zBaG6ljd9Kb&4Qof+64bR(`;D9)26tVw}(^KvB=C*b75DpHpjg>G!Jg=(-wHw4b8`> z>Dm(Kw$fJcI!RmO+Zru^)myX;u6^3Jtr@?x9c0(j_RyUL2ScD8VUAEwg6hGxu+@-i zCulCy&ghL&yFm6@?FwUBUfd0;&m%+ywFXsG3Kh}daplZ~=W13<`T#{fLOBh!s;I@~ zwhG1fm|U0-QbW^n)(Tas_p&MSEPLk3S4ts5THdOuzMADu$a$9cQ%F_SCdFb8u3Wf{ zeh)qk{Uk^fy(d3Y>)pLff_?YB^7djW0qT0G+b{1ONa400000000000000000000 z0000QhAA7ER2(WlNLE2oiYGr!RzXsMC44B1XFg6ARu zHUcCAhIk8uJ^%zD1&KfhAX{+)ae&Qf!aGg35dlv&ZBDE1U$cVg=7{IEf!B8jPm0mJ%i*sY;dE5#W*ERs0Y5Hd&$6A>AhrVx5e zdg*$OaS9ss;+n>l5h_ur-@R9T@ci(fCyAH7@@KJF-#KaDm>85KEK>*(xv*dNd0HEa zda%TIJA}ga$XC#&*=alz7OB}UE{6@nYTTrg{mB{FHnvYPnY{iJ&Dr}SYY7k_hz9XO zm7`*zoSI~lP&K8ZP%%G)8te>@Tly~{Kms9VB#;FBFg=BnRYY#`C*tLL0(T^%5(o(jXh3V7oaIkkTZY?e6OHb7*H45Y~B%7BWD zGE%+H^t8th1V;uE#Peg!dx&K+RF9BFHCb|R5{hhzN}6e8%`|PL|NHs>Is0FsSn0I1 zW9IZe6aN)$8s>^==Z@8ErqDuwh@Iq^?z4|+3w5zc8YUrfq4Kt~RR9{l&L zy}tQLT#A~eXiR{GDjbg%SpK^cP?c5a5O@Q`P~Q*d-YdT}=o-bu%BUC}|9QRm?w#>H z;a^ZCz{Ep*A<1hd?fiDP1S`2S2P^Qzd*jjg3l8UYZ_yEkQJ$FP)0e7s{SPF^UzA-7 zVM@DAZE9-M=fozxd!LX`8!wm5$BzcR`e;ycqe)qfhFsHxBySV6Tpyt1ZGzG$tUNa1Cn=|qyx-JT5D4Xrx4;bAFg{$$4iQb^J)K2RbB7n01FUP2o;wqrOGK& zUiMN)XUf~NEWkfd$HU=7sx&~wMw;kK(XElR_#P-bt(2|QI`%cg)TUC0CF7oT@RYng z!!`$=YCpBNn+?%R*r}x8>nso%0YcIJ63NchRmhG97S5N4cNZrRSPukS`wJ+*xCMcQ zsUICYVtf5wN5arH&8?^bLmbC|!)kW3p7%Y*(sHyUyMMg&E^Tw^Z}N+Zia)}DgvQ(+ z`xtYjEx1*d;E9AF5+nq#_OEx#*z|#q3POAIQ2#dw95EIT(!fx_%|Vbof{{B55u)G` zgW)AeqVmyY^EVF=3PC6ap-Iq8PD`yisu0>K^=D*rdG!y_#Sx;F<`(62J_x`7L}kGD4gwtT{vq0i{lcuM ztJ^(Zv;3L@5bv~ielvEQde&)#m~QD?qHEU@fom$?%CK)|OMht5e^f99RQ<8gQPs1h z{b$6}3qJ383E$)j+`m&Ea{pPp78dTfbL&r(7TP~wO*a1r-K-r6c@O8uc?0NJ2!BYc&O#IbdAcbes=T6C75pZ-H@yY;y`ptL^xJqR=TBqZOZ)To zz8&=U#pp4Ds7`T|+dU=l5*633QBm z04(IlfbZ9u9Z>%~T#}&<0RR=K|Cv}|s_fng@DT`@CWD2TeA*0nuNw9dH{c7?>Y8F|abQ zKCm%xE{e~%3lRYT!e7gKK!qX8X6>wjCuH*b6&@??$&rVsK_W-#)8TYmS?1Tk87j|= zz+bs{ic`K>_9`^W)#g#H$_3O@7o_%7?T}~g9k*53Xj6wqH-NGh@s)GUNlM>S|>4GvGO z;%X=yop77}7QM)mGp1p+eTb7UOT8+s(WVA0+-ZeXJwb?8G7wr;Ob`kQ7d#5mSH|k^ zt8|%nu1ptH@5QCT1yOIe*lu!Hnoktsnis52hw^Lz6{I|Ctyex$TV4Gjw<&v7olvV0mAREy3TL~+-*IJvdnRivLtbB`PfgIcjU>!Q4|8WsbDBn((^!Hoz+!Gpo!31kX4mCna6C?Y0VUx@6mqNt?Y{Cf5*LP80I zg%=^RndS7KCP9*9DX7w<%aA2o4w_u_hLz31wF?yC45}yBs#CA={(7z2wCiwGmu`La z(YuovHD=tbc?+Z#Es@nw(HeOz^>mqBp_HD)(#|13!A#`XKEOIIs5jpsFLlB;W4-xjV_~ zVNO?Rw0n;tsXGXwzISp;t*~rYg3b7LK*^qw*9fw?HBs=|p(&^uMfvh1`DC>|6VCOh z)N}z$0Lo2WmCGoaO-Zu185^9zCWZXRl`hG7r2`~;9Zi+MA^;FD5wMyYK~h&k2F+-& zZ5R>MCJ=RZNGEx_LN^kMs-xrpln6pbi%bT!DZnU7MjpYCQOiXt1(GJn=yD~vxQWf9 z6Phv`Af=_?$jX#8K@s>BGMYNclVH*wrB+kXfGRs|A#%VIcwU36;y9p)28y?`9>uA@ zej3WE1%W&-?E8iEN3r+~{<@@=o%{FUt6K`X3W$zR7whZnoPoYU_ASD74~yS9zi=M> zE&K6-!M|T_d}i1*bj4@nIsAd=$RE51Mv|oC4kXj?W* zS3I^{m+m@lc`PqdFW4?Wh`wMgI~%UCJNvBBrj6`3^-cXXPwbhe1!$);P8%D<4U>(n zoih2`zc+Sn{6pE^i9JRB_4JsxT=Tp%CGFl%6c+zHb>UmFf6Kz3J#So<{OY5m>I=Vn z_xP8_fBkRqHUBTKJk83DzD5?u6^q(KPkV-*WYt~W4GhI4gB~I4{vO7Z+v~- z-~GdPJlXk`fBtjW%|8GCYxkvhU3*1+<+JP))4$(1h*X~{gD7|emiSL+0fMWaSj0=< z$!%}ifES+AZZQU5pG)7(gE!AjU%m<4c%gXlDUk7!{__3c{L8I7C!yk^YV_R{FSV>L zf?uzx33~AIYyQzEfci?;8~dT_x6EL9)Et}7DPV(=HWr$fBwB|Z^!)2U$5Q=2H$*i=`awy z$$zjFDCwMEYl4ZPFS^M#1eTRt*af_*YNjt=Il9ierruIq1*+cyqWFK4Y{b4*%{z1L z?wIThT_NB8g?v_K5tJJ?3jA&+mZW_jA6g0 zs!(gS`Rf#{{?zebVMbjA=YJ=;)Vn(W7xfZg@T~l8!bU4*AmoH8uoqI(`VTEEv zUsT0+jtCb6hua}VC`(US0hDS~8Q?YDQJU8zppKN3fr$NU47Avw`nM=VtHp;aR9S*{ zPE#O25rV$ZCq|=gOrrF5@d*SaD8}puIkq7<4CeeCmr4qiIMDg~c!_ys0b(w>z8u#( zUUvL-7`x&-kEBOYmYHevQfS+!Omk3=z{}f0N)%T19qiPGpU09)A^_mPZdWitO{wqRB+ zw~q4p#X-Qr5&)EcI$zJ-@6!3}x_7!RB|T3dvOb)>y2Xst15pC=+=wioVj~m?J*eiN zE`Ay66Nvnn@j?mmx-riXka&BjRJ^TO-s)cKU#lebN0Co{32_5j5&YAyc3cgvT4U;r zt2aSpQiCatrZt%n$c0OZX0uwjd5v=_txivnYK_}MMsOJ0rzWT}3MUUjyjF8GL?NZv zhiZ>3YO>+wBPh^jUb_Vyq>fs2P)@KyXiOL^SoZ9SbXwA-+cK0SJ<{x!V=tOsG8CzB zG$$~!S&+kuJSYk+b%IfnNhh|v+x?$K-kXYAl(Z_lR{@_*t1hTm zCQdY@8w9`u27?!d$n7+t&d!h#g5ow6w+y$4ZNe&0JQ)eFIhsf&9JaJ1lbJ=ut*K-I zeOuGX3jS}&ARCLl+?qvpu(BnG94wyEnn#WhwhI8r3AcxpZT|rgjZE*e-4fPUjBGK5 z*STPz&f2?s2TTk(PE5+5W<=Gm%9GJ}MwJED2u7o0H>t2CLe<5V-$5TjLy5>~^Q*5jSA$Mi z(~$WoB4^Mz(MoE+-d$?%gA%gaLL+1$ThFko zmO3@-Ar;!W$f<=4_ZH}#&Ou5M^1AJSLMqwDdRVcO#B5SIe+(G~b62&LEL7=o z_Z#Qwe;hTw$(2n^mi!CNVf`f>n|!SJwToMo|d@icW22ORD{CK&Tj^{SU?rPVCIAINV(;nA>mWj;_^V>71O7n0@$hMPbpH+(W$cnN4hS?^| zf6J?>T{$r?i9+WMR#202{vk#kHLc*OdBQv(5_z#uDQg{6AiT)WQ@p8*r8NI?J8Jbm7$3dzghdo$M!NT7mlQ*v3@SHn zny4A3<{XpkMl)jqt#;{_!6ft}GL5y;oDGhd)P%Qo-sUTqQ0EhweHL%~%FY^p86>{` zq~{u6&sZ`2G{qj8U_RZ^CW177}dfjgemUrI^8TZR1 z`mn`p-P6JWia?09+U#5uJ>pKZMu_Uof3AYHHbeYW=*PE&_nNwbX>b)Koa9SdJu)lo64s0GeP#@&pM^J3~TecdQk+en?x zS0^ICHawol~J z9Qw|4e4YYqPWKy8t`8c>h}(P&CEWpkkAE%iU{wZOoWmmOw$W1Xkjd?-z^{O(Sm2(pgJQd;HNM}Dzy@ou%JmTbzlzCqWux2HYXnn~{U zj=2#{crWDa_*7rYv$_J5xUP3aRv-O+-ajQRdH-)Bt=FXdTuwt;vAXG1jcw8@Z8j^SH^pU? z!WgAz!s0=oFEn+Ta+;+f{MY6E9}YFWwcTlp+TLWIVH@KyUp&?<+}A^Y7@)P>*r)-? zzY+koKerup{L-(lkN5v}=ZgraM8#Xbj1mm=Pxk}okJ{@H*?8oyAHGFGPOLLF;R7X^ zQZ1%@9|pssg$b;Kg?FloRo62ms&|BfV1W%S6vN(!mTNLH7Y6v72p|P2+x5q#>U0q(OUYR-lI+UnOfVa!wfa23V#3xX5xm{6fMWacj^HT|p$m6vY7w`v;SZ=?b z(tDDRK478F>`@eN6AaH%bN%JjSCH$7|6kI!d&8N2Pf*wWJh@?#WWh3JZa^NH(kDXXjX`ORJ`v!4D$DFurnQ33{)TAGzsi$}js)Pz$ zh#-Ou)(JMsHz+3&nt4DmWjwej#`FyC*=V&bjtUpZy_5(eD+0C|$x5+&e&Px60w7`{ z^IcxIJux2n;n%3LmC0uWw}mCD@|^Hg7YOfEl|U&}_z4!^O1;EDY~qjMlih~o4p#*c z@vFf^=^#+q{?GTMB>R>?kbUQu#OaLD1a2b^R!<_qYMa7%9zewos9HjfryjonFc7(< z1BWbFaFJQ^frqyjIH7zfuCf1{)`RPt@c7kp-}{akQMcYgE9il8e%~RI3+aRHeOJ=q z7`bXbAO)HE(;r$ralv6)Y;rL+3~ZYt#`4L7+V_Gaa9hrt45N0@641O7WS1#+SMuIs zwNtjL%iR*v+(K~-mw*u6NiPVsnK|PW>D6FZ85Y@F@pP_puN9FX@bv3Xslf&oA$ul+ zwaNQPyIas5bSwW5*kNyMnl-p1XHF%ojo{aXjG7R_iN0z_;Zq{2|2euj3ELk_EsB`v zil+K!S%zYQrtJ;F3rm-S*aaK-!e(vC0jLF@&FhDyL{A*9D<|CQL7xm0+7O7asB%(D zN;Nj12uVS?CZ^``doBE^S$XEcOtVpK^-TnpZ;d%fG3tEL$XA;5^OavTcH$dtxuFqE z-JnV56_>yOXsod(y^)Ptqtj5UjV!uX{Qe*h7xe0cvrb4Pn@4Dd0G83{} zs!v=XrWdpw z{A2imIrTT|@)YMnJf)kW`pmK*RGg#w22V&vJv~6qVWU>+b28KF(gI{fMS*MenE;+$ z4r;_H+qHMyiJ{H5{$z-MK(hx?boWY9wm{0cKJ*t9kEyqTQEXtSdUyQDU!bAQp~oU8 zdT$`wFzjHQp)}>(hsTy_ZWoOy2xAKLl11w89cK?Ls+f|<%wmr)XOtQs4tSL^M4f_n z5j$SA%`O|m|1~7}LKqSbPC5zUudy;2cP;M4<^AK;6B3VovBu`efXcRY_B!W!W%7#Z zfc-MS*l}O6BowFC;r4ZVr`E3AzSoKER>keFR<;f(;qHrCvzuDu<0Dtgfi|~eUB{qZ zZ@w*c$Ax!2u6i~2?$(j=j0&(iFnniKtxm4INQG#PncC3-s&RzKR%K%W> zUaJ}Xr}~5KbJx#eko4ImAl%cbcTWf5bG9=t-#+XdlJSY!+(RbZ6#obYmY8xz@J9)_j`fz_>7_Hiu2~;gz#boh*jw?lw^Sq>A zF^bljFth}K0dUu@=a*#O_Q;m}!qCa4=E4W~1k?(}`&q~?JC7Z(TO}03*CpANrj}0) zmk@An=4WAh_mixG^VOpK%TG@9m^?qP4oS_&2dX15`E`iIc5s1ZUGN_$NtbHT<@?YW zHZ4qO9W1;pELK_16{{v!7+mm59K+g&k!vwCrER-6;Y?48_g@z$@Ul_qD4q-CGqN8z+no9%8Tv4?5@5p@9{Kv95G>2EAjI=*h1Nby)uUnrO zjrw(tVlaFD%P-qc?VE0dZVk~Sztwh-->wQoHTSAYROH#>9k+z#xC%%*9?j4VJgb$J zIWI1~6o5GEK8FoDc-7BN;xN!RA^}g?4GsQJ`k|nm{BBK9U;CL*y;W5aRvBCl;AVbF zRHq~S>~I2C${R|EINK4#>6d(`adtrjcI=i$6>vwAC5o~L89>&( z8si$O*WV-I#a=5Gw{q`CKaf6%%DI0h$3pIPkNGg-k@Qgn`yrU#n=1>Tl_^HbyehHL zDaEN+f{@A%76wy_DPibza%6ZJQ2{xv5S=NU4auYr5lM9sDTRg68aorU%IebNGn-Bl z!2U%mH5+rQ39{5y&Bot$+@Ga-K^HxLQDA%q_9Fd8&rM)*qu+qb`WkrHp=5f}@?<_u z%e5s$lZA(Kf+Awdj)i2j-C$W*`~0rl{Qp1t_C~(lGx~yp_k~MjBXHNK){~UuWJA9m!_7~aWb-I ztfLM{+L#B6ep-#ke69N>c;!-T{6HF&JhYfld9Tt*W|_=SCr0tJli^i;NAGB%G}Fdu zKQ(>#8TiXM`+Lbjy^^(f#xb?zMctUXw3L+QblfVx7=NOLnuN~wfRj!ys%7R4$Vqu! zFItP0C+r1EFWO)~22}>Zm8uvQTONvP&yM#lWx#PbI^4T7-mt`XtD2jeJ;%zpP~OCS zaxGD)6(QEVf46|osW)$RyTM0h&8;>s+xpm=*0c;ww;rKc08hU$2>&mAL63ajU^f{Z<&_1Q7GcyxqW{}FmSaXi_eNR z+Q=#HH1)&MpWG6qi%aX0{-lK5oc{+p3F>R|F!`M3bI#t^5{t~HudXcgKoH&-qfKN2 zn{$5QN%l@i^+3bRAauvX+4P~B_0W_q2EwBtbkfboBiaSeOYBu~8*nLG z5Z?T>HG^`;gu}#gN)fj$A?so(Te6J<1a0S zasJgwpmp=3f^E6kXW2Gtc>%aeKaM@}Pxrw?I6oBN^zz1SNCWVfZwKn+U(GN%tVB>4 zm0Dg{a`iC4jrC%c-=aKrFIZL7CW*!8;f!^NY%KEE4__ORcawV_Hc*r;jroJp`!4UEwN+C*a|`aM$?)o5e5V;Fp8 z9Jn^HHvFb)`~SsgYhNRolVsKGS*1&U^S%GEv6g|6n9X-hll$7!K4B-i7hgERVHZw4 zrgXHHH1<{1re+IDM0WN!1zPWEpF4G>P=1eE?-l~{b%A;YggC4c1PG&|n9%a5av8r5 z5|t14l< z7ncs^4%$B=OUYhPZvTt60;N%RiSqN-F5Y@n-hf)x;v9mM?TJZjrQ&5JeB4?~T5^gg zO($kijmi|S#(_@F1+CPOKBG!<`d5^907|ik$#ydhH4A0A!F!O3N05PE(~VNdJsBaI zEGBWjCg8^gFH6!5sg* zd}jiRP~e2jqYcKw7vQH)KkVM7a{YaF?V;c6?Y{QC?c)$AzMB_%ERR|a&D7HOQ5sjg z`JydpVYaEz$-h%8SxOF&NyuVTxe)RIDdbObms};kr#g2peGo+|i;j*g8$jiRWHAXC zY@E&dNBrvp!S;dAN*AZ+PX|+~;>oG(St$Ki=YQz4uv9+9|G2hp8l4{!oq+K5O+myv zig!lI8mC3m3%lO$p18Do7of|9OyObEZ$B7^j9l_@;bV}vPhk^_RbI4o=Eb8Q|#JuefynM8VeViGf*$lST*2|c;8p9R8BW|a98EzBJ!UvqtM-jfB{ zicBKS`mwwFZ!n~Wgp-*GH;&KPu|~9Rq5X~hP)<)Gfk@xEh^;M z=!gG}FAu?%hE*a-kq2DAsUj=GF#K{f=suRg^_;Y{obV*biQH(F(XB2=TkPFl%3h+<- z>OXfu!-xGXNr3M^o7J;4-Enkzp}Ti+Z8&Ri z=2XL2UDD)%Zk3r7KxOo^K8J&g7z8BEG2YSEE7Ela=W!^a zAU*1StK%FYF0qFJ|D$kF2*iG5Ke)uI=_QEkx_o8&mM#K5FgS5glB(9N@HaRTgpNwb z4*&gaR6Os!1#li906J>Ihr$}nqik3EX{-u?zHT>d5KwG`qwNg`|H!!e}>fo^KwYYNcYdRvT^*o48V z(tO`8=cAdS9jdSG?YsIxZwzzI0cKGX1cw|_b-g;GL)(la=pKDrsvR_rp$YZJ3_M1j zK%LA<&?gybLl>5>&=K-SZv!#7 z)LM&FQ9Yb>C@HD;5a62Sab`3P}EO$gOoU{N!-NSJdLJaPFl!3B;rhQ6ii z=fZUcVGSX>E{7^+7_JYqJ6KQoc;}fJk7C|c$Ix&8iCTsXaDi)k>!8BODwzg z-kx-U@+-4*D0v+lb5-kBrnV-O0&@0%2+ZgPz!^FI^9i&y55^ zaz(=M(!{@(-{uGNXiyF!d&o?A#Z`N&>^}0hmY+AFW~f0=)1~5bq%XgW<<*J10Fl;& z$)smlQXyRt(%k;>j-T-%>tXXn@bHa&?@>IuE^>g_tFJI3*1nFaovk9qM7mh7;wH1E z!j#c$DqL6@Sw4%pVj1D>|6P6?ahp<|=Xv-L8Sv(A?G~hep6J#L#n}S1RUzPx=x;LC zb)}1$nt{Q8SmpqN+KYFhM3InE>MI-7IKV`;C6n7Cfc7E_&HvKvNjrX4+VHDOLwf}e zx3IU!^z4u57nPz!n}VkD+8o6p7JWKUn&S=Ki&N$dO z-T2jh#sTJmrUTO^KBf(30<(T|9rHR14~sa94vQ7bNK3Aj(CUHJKi2U!CN_RHGFvy> zDcg&-?;yKed?2xqF}py!6niK8Q2VR)zd7u2Z+9d*{p9q~dC6tJYlrIxs5aCI+UfqQ zr?KZ}FF!AV*NE4a*PBDC^X?t`zs2n>@qr(4@eS}J`|c6Va~8nST;-m z8-<;Ry?`sjE#W9Q6)u2JAR7Fu{HOdc`oBlsL0t==2L=Wqg7ZRdgnU5nK||2N=nQlP z`WX5Y`Y8rrOfa69C=3VFhMB`$#eBr7VePQEP~Fh&Fil(xZVUH2J`!JtUm@ra-V*(Y zN5j=4tRe;?rIBx<_Cz^GO-5ZMDU%M75=oB%zy$zM{P!qrFkl0mwe^8jk}S8^0;|jZ;$peI`oam%N|;sr$62&7dB~&veJ0#8VIu z%qX+)nCZ+;iT?v*aYmKXIE30Ul2}tZ%aF3=cwk6bReTf$Z5Xvp*kK=G_rP@1xy7&p z!nsAlmU3A^O<+u5=h~l;{Sv?>a~O`JR$lIonB3~7<2cv>13TE?8B7Qze?CX;U_%*z zFJxtaTwu#tW7dG|Ntyw8EqdMP+h)Xc`!Oa=x4;7_a1(dhSzy^GWiMwpFT|bN{mIm4 zKiI*vDp?DqdJZ>#gRKKp=g2mr1Fe{o(&RVq_cmX!X)zyOcp0BPA8)P#+Bb$rWc)>fkL*Q_y1BM7Vl+fyJ9 z4=CP%H^N%S>RWS<9owOIIe7Om48B+atY8HzSc$a=YN`oOT9$TPDzECV@mQ@BU$)lji{3fQGSD9E2bzCA<2Ov~lTY@MzWj?5H?Q)Af?sTj4&#Px6L1D@ z-|6YY`_V3`7rjQKoJ?%ND`4AGo$Q3$@If8c+oRIP2+ZvhJ65X?F}`xUi>H(logCf^ zl%H}wjRm-nJzFsK)M;4CMExj?0%+0bXLuJc(KMM;7*kyG8BtA_qz zXDUjH5?N%41`)Oxsi5U0iegkL&2cVF;KR5V9^&!@=NC9niZVfhgane1JEhR#NNnEr z?X}}NwjJWA4Cb*d_s)^6N2--W{G9y4n=w7HxUR{XTJ#ui(8~>TGeururg!!yBjd(c zgD95jo$>{nf~h4h=l|x)-8JXCm-dZ&be09W_>y}Aw&Zl6%DR9pCxas2d%i7;dCXqK zz!N|e>48tZeDwCl6Dh3lZGh)YIOXP{7v*r22EgY);E&|1uIiT{2zkWPf&-JodnHmb zeTgZZFEnE=n$aB7ehU1yw~w9hEs~~a2(j!nk37X7o)}37kg)*SRuH`um_Ry{5Qb;k zGL4S6>5M|&-Eu2Xnz5gIpnbrNTNzxt=HIza>8`WL#dQ|t<%5N-8}(A|UKc+YGmDk{ zsA=Yx!goEMvUr?+&tu^xc?P96fbK^F5y2)F(S@E2S{(2cqDSkwKBYgys~vLO{N?dg zA#RJM8#+S1f6XILG3Wy$p`dOoAaF!8p|4RCqZ%cv1}Sej9Z1yT@qDzO3I?xv zVIT*RHDd$%{`5|n5b_!&+ufu7tnz?6F8bCt6an~@oHYUM5r*2GUv``uhKVd5%wu`) z*`Dizco2_k$6O1P=DMKoN*x%_L8FG#h=U^3ydlBL)-!U`a4tTH`wjwOknZ)qx8*&W zWE?{$_+~SThD%(vT;+(= z54ckTAuiKOe$-PaJY>80%C)Gu-q_NUT~MG+3_4xtQ)MX&HXz@QjYK2yTlScj2^Tjw zTMv?UMcJr+{BgmI5=pGgdv@AnWr=0J#H*0?W?_t5dz3eP2CuC$7$bo|QV&gJUDtRr zIeBw%?0yB-yoMMwXunNq6d^tKRADUl3bUK&Op%bh+3cC{HfX#C>j4s9sSh+N#~!)~ zy#dydbvF&kvurjsqOq1(4;mq5nOM69p48U1QENc0R;y{`+V`N4ltI_dAhmm=QQ0z{ z`8k&>kc%qmnj>OOdM1 zOCjicZ;PjcG;P5|G#v1IB?Y*aLALi}l8>X6^_KFe+-9v@m$ly?`^gA{*hn5R4HoUj z15KG^VZXj}Tf*ZYEn6$;a_ILLrsSDu7`tY)?9>}|i>5D95OpNeQVK9EIJjYW%F^fs|kOBt$2O2I9Szbr@ck%Ei#$!NZCkCwX_BU2 zsbe# zyGYcge7(8>k5f2^H94Blx@+6#ePndRup_r=;1T_aA{8^s8qNZDTT&N_kn|f?P$oH# zEI^*zr;s#wNUjKu%MHTnW(#;wrfWsl3T09bL3>VWD^aUm-d0#)i15Mr@)D76N_3Mi z!soP2!m`T$bKIrf6#GImI=hM<%OraXQ!Sl@3T0xg6l76Kz2QI3m4<}tSG6mg%_K5I zTt>5l`LD7PU9V6mqp7ccz%=bo65r`l7-@`3nwva*NbI@LBS9yk2$XTyrZ$-~ z0G)x#@RBA{Yfa12pGh@sH#g_e4_wShR+x?ka2?wmsEk)W!npJ>!BU1s?3VFXtFh@w zqarS<>OqgoYtmmrA<-8$G1GUW$^)5g!ax$4$QD#fyqIu3pHoT?N9b;3&pgbrzyTt_ z;BnA~6J&pG^Gvn}Y_ub!C3OOvK!E~X*M|C~0iQDfPW4+brxf8C4!kwMH(d;y)0TY- zv>6@quyryK^k4zj;UIJej(xB5t;SxmYI>}pSzFhfDT*vMC5;(_5TDi!2hBG$7D(c} z0*YBw6*mCQl^%oX(JILl_Zxi}$0W7MJVV;?)vfcGb7pV#N3zwK`(X*3fY&fO-jgZ@ z1Rbhv>uZH)2UM?Vbu)hBVDtk^y`~J>Zgz6BTlNLV)^}M($w6V**^Hgr*?y@S zyABN7*9%D&hDKmjsUARYTfuSwt(mu2>D58*ZFsRe77%||Ru>ZuXLhCFT$1~KHtgxG6!5JKP znP>WOMJ_qj z+=Zrt+DIcKubye7XRd?df zym9bbP7a+pK2+!W!IB$<^C$S`4s< zd%kM`13>LRQv=MFsL(qej8&{czRCDk1uJ4*d7X405C*;ye|zTKq*x6raY6X&ycn;E zV{6ANh;%df7T8;+6ewwbFtmfp36mM};(qSW${B9v+HpQ|zaewAwwusE9T|gt^Fa82 z;)5hlda4>h5~jzhk_b+T2FAX?g`ne~y4r!ui%5LjQ4q)|sqMaUKdx`82f zCaF)!01k#SPViZYgwl$Ca5?=VhT!?Knf{RWNSPahu@yS-e>G4>;nKcsVad+}QZU@P z*Tq734oZae&ixZp-E;ki74c^*#=+=8&p!u7swf)8mumtq%U-Bpmg5**aZOPYMWV*j z5KRoy1~H~yr0{|2YETndLKU%zoiZ_US1S^lH_QoFudZ{I(jrZJuKfR<60c zX^QG0c3~Q;7Dn36Rkai{Uwn+yf4-VdkAk*7v%QgQg+Ub+wc7zdw=w{&f1OQ@se7o) zOZs-b(WA`Aj@jj|e6~frOjG^gTj7>B>(c&;`^1e|Lf}PY#NJ=p#xmL;)L~71Br&LXiiSo*EAZ?PB~gHtAI!>hEa^i%K>9b zLS6JJjmJ5-6zAZasHNR+Qy*K5ZO2tfEzuwaQ4Pbwj{~y`T`ouqL2#VzWBb)c%H5DV zL4wA`V9Oe!rn7SH7-BI^tXo2>sc4lx!ckkBWs9UdWi7Bc9^Q6RGX|4WLoZH3PgGG` zB9^v{Z?;=9c6XVcIG}fHC+PgrDXpRk{r^JIl+H?JaXDQ?cW{GVCFWSo7L8B7Bq6mq z13GdyL@Sz~IG4YnNoE^ARtXk_Eywv4Z0VhkZGEiTi(hSA#OV94?I5pqJ8e8?qGzDR z+6g(gs-n=~Wo+eAM>gSU?Hyb1mX4z!qUwTq`^15j-Lyao3srmPB+|aN;8EG7$(qno zG!Ml)PN!jn^fl3hk4eI-n$S`=+qAPGxXgw3MBIM1p100q;oMfM#)`dO^h!yM z&Hu3W1VOe)zPB&4OzO8q;NhvpZfHnD52DprY8)Zo?JjH1i+FcN7Dpn1h-wqqI*R$J z$tdZ}JyNd)z_1(M7KHkut_XKh{@08;!d^Zbn5|GQEoq>J>ZCN**7(7Syfd0bsQsQ| zg{Y-1OqSF#Ht0w^tA(|(R3aEn`t^=p=N@D0C8SjpS;po1tov12uw#>_U8HU)fWvNi zUpfbn*`*RvFf5c5R`{*R%pD|tGDH40TdiDYErP`mr(5z++$zpf4FEJVP9WYR8~!wfRCV6z7I^f4Zb%q0#@2So-McdTg%U_Ni(E$h8}KOq@=vAqS3!VqEq0_avi% zk(C|cu_v!DY-!ifU(d~r1`911Cha^xA(MS#+--ezVxyY!s@MRVNCVApZHlpApqXX95D~4STEJ$SxK{H zjdUq0wG}O)E0&Mxiw8@8C&T3ve5MkCdzzpBZ;^}f%1=XGZxy3`94S}cm_8==HSD@; zb!cuX4=BK)L8l9fN zAeAraBMyv?9r9)3)Fj~DK`Yyuk{PIsI%513wZ~hBblMH-9SiLEk=uJU-SW?~PQ!y? zapO_~Y>dQ2c@ZA--Sd{EdCG?Ct>K{8W$9okH3})k_`($w?D*X`Mr3s1#xOZCq^tE` zcDODpMp>YIwAcTMy5)vFOia8Ahjx8Xhp0Rb3@jPC_yq+Zd_CNxKOYpz&)d)6$HUI? z2m%qof`b;&=Ew~6HZ`#I5#zh5rP`>Gp_ab+c1UTF<_HO8lz{in-sK%H6b|V+tffGz z069R$zqPhKWS(|Nr(w_7Z0q3ewyzi0Z5?Vqrqjs0adyvOkFl18NrI#^?Y4Wyaendr_Ft|y;ul~M z8X9@%N$Q>uH;#z;0uI|IWw>r#lJUt9!W!Ztd9z6z3wU-9Ecd~ z@WAM9>VXSAr5o781O70*i$`EcoF%zJCB?ez9sTuf2Q$z<t1I#f-LXBkFx*tVPx+;&+}^Qysso25ZBVoGyq1D?1;zb&X_Rb|3x#&ECV zI^59FP8fEWt|hP(OA%W<)*zy0J1b3p)uejdKwigZQkKhF5#GA`O}baK#iA-^Kn&g+ zu^;Y_loofr#&JSl<-&u|{9uU4BC^pmY>@0DO$LYUF2;B4_8nSB!wXG*>)M9#fpV36 z=dy_uE`jeS_@c6<-Zfv5tGnlyk%L>~h1uvvk+|4km9=1V!J3e8Bi|J4-2BnVwFBK6 z@VQ72?k*g9j5y`^&X|4?uoLpY(u5KdjR)<&*PlSXR$dKHE={uRCA~PNPEq2;_^Ck6_cv7T`6p|wfn{5h98f$4k z?6k{dKKr~hvc_untdvf==~42O%k`p{G@1U=bXOu;q1+o*hL@KgPdIi?i-iq6Eq))r zc#87!VyTLonvG_a76`(cw%o%^la>BpWTy&kXxu%H9^L&upL2L`c}s_MNeFv0=T60| z>9d?`rG79#9@l@C$*uS8!0Jb?KRkLgD9OXa=k*>@p>kCR+^Hz0L-*fce9*;HI~W+6 zv}3My;g@fvhQGrAG3C0a5fBUI;WfV9GMrb)M8b0Dq&vWevK<^P%-{jx@EsoNu&Tf% z^L{G9CTx>+c`g#+bR>1>e$VZV z_+uVVw2(?=k7Wjb2QvXr6_*cBOVg1WRB$z0Ur?{gx7jkD$D_Pc_fYetlU$y~f#<{G zTiJVIl#PTHJl5p%o-qq@TT~QfnzTDnXbCulP+2(Jkbqe`xeH#2|FEVgNE2b}510MtnWiPAC>xh36X&w~PhNHhG|1N!14{#^p%nc$|gb?{J< z1e|J>a$@WcfNH>aP5v8L#u7M9^%ArWZ6No%M|Burnd&L(a1iw5jM{prI3M>8>Eh{y zxx&C)uF75wn#61C=@)MZcH4kzd`GdADtmk95yW4b;=>#2U{Ig{r6da7}wrVTSxBN?5T`>TUXAA68o~6iLgel zVG}M4nM<{@K}|K$$x1mR2wJWx>yAr7YP&5`J?nq~PSOIp8p_$$kg7*gTOzv52MSnP zzN916Ml#`Xs-i?M1Z`I_u_I=BSt}TJ+hp3qLI+P_f>x9;6A@g12;F`WO>HvkHf&Nq zPUyn+#Z!RJ?##=r5L|=iOOhFe#oAJQmL{+ptI>xwSXGVeyqORod z-6$1nb)NOYEHiDO8>{Io2M_&Gq6OZ0BnYeH5>sK#9zyj6ri(#4HDqx*Y)NWP#ZFfz z#j=a;mACYJEKP>uYGv`5Nz~r_31Q`XO*-BAVlgBPc`#tk8r;x?s^MqU0p$ zi^=eD2@y@U2Tl!OY2b#rn1z%J`jM24pxAKG`!5_rw2e$8Q)Gf0s_;lOiA{=@fvSv5 zY)9rm_d%AKwxRkCj_o92+#IPziID5|S1wP4=<$-M4Tt>u+)Od?$GKo!sv+K1*EI1M zIgm%Wmp$Sww>Fe%_^^LCsNbA-Ik52>(rI2W-bQrk*)-Ox+)oLDPn!tGJ&~ZOL#q9H zxZji{UosgGCYADeJ^DVc0j#$y#W+XoivVWF0xAuaP5-dyxtSuo<*vzosy)u6!0-V{aGIq?s-M4&h`}IkpzVeX6VSlg5Zu6flP7WV4Hqn|GRQ+^~{NnZ1sv2I>AUc{>Kds+$}F@8sj=Q-?7)rAqp_OAn$V1OL7 zJ2A325oz}4d-o^F|AQ^+2&3zjfE&-2})@B|9k30?Jnn~!raVAYLzMli4&R& zr=p$R7t~$|x8^o!)B)<1F#1zf2UlvhAOM4-N$poj4)TGDz-qsdc{(I&h|?d=1kkSd*4 zK3mpCSB+#~YP&rKlvKR-Vb@m^ZlkMe*g);gqgfrdpFb5W1O z2CfrL9q1EHk)`JLg%<%puW2Ul4p{n`N8B5)&bnY!zM_uVMJlB)(GmS#3`B-o!DgBvFveemHy z)E&GBp?j<)fCB^^%N+72;~$tsypIKu+}XFK;zPZWP|&kmIFU^7syVFss3ab2CVqG? zB|X+k!iUg?8E8YB<3*7qkOaxAhHW6UzCc16$BHw%mDPyTQJz-Z4^i4B-w?B4Y>v4ep?v^@p!#7wyAZE)-#}%~t`~Lk25IP$X zQLK*hTF>_Ardk6*Qx#~J z9}=@iQ#x*?Dx~nUK^!t5BsS!iJhPlBTI_kdCU>!<5Zp#5Y!v*xrTjlgV9|Sw1NOwa zy3-sf#jiuBL_bq8Nh+wy{5;Y%)3=kXv4mCdJv0ElEOp=kl@|?$W>s zzJe)mCJ)?%bSCyB49}`Y#@pI&m5pbsubO&~9X=}O4BZp_!S(#peLDTRE|A-_l_huS zM&6Cr=?{5X>~FWIU*fF9VF-Rlapu#^!$2JlAl~5nhAC{JJvasvk#qKE{MVqI+`FrD-ro)R-;EwpzXVj z9uH4n&+bD#f`usJ2qIW#e)7C#*+k2g^@mX3w>tpA=`|r z;>OuE#i~aaw6q!jxZfF|?IJ0sf#FoE0s+HYX8vbyelv@#9!=!FTD*loRs1nR#n(-y zI|agSd2%zaV#sx!OBrkHQ55TrSZy&dywDVlB_yTnj=Uq{vt)tRG!HGVPXN$9vaOa! zE9RjUt)cdv<9`L~Atx!ygO4093iRyD1|MV&B3X{5PKZa@;6OdKqj4Lq+K34&Qan-n zLUyf2<6l9I*70x>`SQ^4upNB*(6%}1rTpMuU4wjgEZ5%tK~e2JdsJM*i6jf9gliF5 z4JGR|@FYyVd%&&1{+Z*+?z<0u%gn#7-^)@m`kI9GXN@=xYVF#Jsu@B1+F6Tbx6OZZ zs@BW=iG12>kI^}8#B+az@1bWI#)FRpE(-MQn~ED`4<;yAZ#!}JNO-eHBZZyVP_8y& zNG*L6S^5=&lVZ94CxWO`sH3-&jPE9!ULaS)HLKh3%L zI^If3RcKNlerxPH{Lfl65_bRbpNl}E`T^$9I%qWXP(RCXT=ug4;f*)EA}t3&jCabB z+apz(Jv6`s7!jum6Qov^h_H4|!W!z9x@fVOAT+l$Cw;0HEJWDgH`+e(Cey7=I3(h6 z=xkvI7NdaHy7FIBL+XG2vSC(&>Os@!WO$r8Qb|-VS#qW@;si7_|-8>3XeT zY7Isxi84A*w}SLDn?|GZSY1Ki7;I}xr;a2cj`%hSZp?^Spewanuv-D zjkc?_2gq6v?+?Xhp;aheN_F?ZLk1S{?zRv9*=63*r~HSXzUN7N_F)YC2?!FtdI>-d zJbu>u{3uG&V=5Lh{}6vh6_y`!GU4Or9uzzM+3IwaAlNH}OtIpoSs!!kE1Ts~H^bb) z8ek95yfO+Ou87gJ(1fPF!e3QuMzx5djC37qdL9wP6M>u|35IB;G7g+=2vZxo!$NN9 zqh*2Za=XRx*V~`+fwK@6ww42UjFI*iMb)zZuJin2BFtAy5*)-tbh|C0R{lKd>A3I( z?e7<{{k&OIZQ@nmVsS)ILp@!uR6kMOhxOJ_i*1`o(^OqwBZ58{=5=LUZ-S6VjKH)# z89wA;DM&EEGot(nG6I3ZO;JMyP>`<83`!10FnUozNgaU!{3s?JHdgX%C$jB7$7`3e)LoH zGQ%mi@sX2HwUGB-CW^(HuPb5G+bmlyialSx)S*#Qxh>pHXyI#HLO?5RvUHmlJI|k( z75A#`pe8>-b8}Wc<#G6Z$4wSxE_uZ~;eh415H&EcS*n+u;mDKw(tgl}y4`Kb2)slJ z)sy9zsG0HboZd-)`!adq@Io48q>-MJe%r3y2bN1hI;gOEc2VhaM;H#HCG<;Z)#!tjr`k0``Rln zY@4kZZ}r=#b$rZbbQ8!R&(hX}Y!vlQ<6V7QztG0lew_XrIJ_Yocdc49?IzfwQvHMC# z&-sR|m#wvJ-|~T!v(5c%3Lj(>TNYJq=ij}l-o&F?sMBq-W{sk%ieJ?e`@o5IbNwb$ zfYll!4|J&UTcEniHV*H!Q99XjkZ833^s{$MH8;Uq$$I0M(qyq^@|di8?((?a6&tbR zwA#er4X9ZtC~F93GnwA%OwN(12S`g!h*UtX@O=Y=o05)R)cd~ktu2jnfW}i_La&|Yrh(nq$rH{Pvzn0QV2~U-WJiiprWB1o z=6e`sV3>gj#R9zp@Ea8HBdmb~Nq&RUDRn(!L_UBy12bS=?K9}1J6wg^@gAqr9yU^yanUdpfG$kZEc8ZqgfZk~M=eD1iKwDr zTB@SVnFb#L&RVM|OfkQrtm+$wbUaKeB^af|sI*rok~URfm0X;bBl-hjvYAvO7Co?i zS=hR-&vTDEW+sAGMJRoY>>MlBQ3 zCZ)&JahIvO5(MkP=y=Q-4r<%RK;Lmzk3GCDaz-6l(KM@Te5Cm!u~^1QQ7?Wx%5~z0 zw@bW#X8$hDq{CoIO9!h3-65x$)~LGjPh56hP&i+pZ#|bm7-HCp6YetXd#podZHtFV zQS)#fm$a;TjmeEmA*X30VMyO22B=oSD`;jU7LsW#S>~)+A7cbnJVE3YkX>=7BD$sK zz3^fsI0ZkZ+%05-`RfC@c6Oa^%hj9~b)*cSH)$`ZDereYE5IN+A$rD0rID>`=*7(7 zRoEvn>*0!oG$P7!XqYmfW6;3v>Xz}WYbEFy2oZcDyeP>EE-1$)n1;40aQ-6}0#DYS z;EdFa2cL84X>AOP6cuU5JptBr)D?PVjA8nN;V2sk`E<1K*zvfFxo_CESC1$B5~CXa za6C=(<)3~jpPPnksTM#bD^K7oxpIIoat_doR-hOtia9m5h$I}nkkE4b4Vmz8wRZ>{vn z-~QTEFr~oop)x{r2zCmmx^lrEwhi>bNeRwM&jx|vQta6342=`ta^5lvLZx5l|N%xCd=uh4EAlx;eH3Ht}$ktu=(B0+D+xRfMprhc;bGRQ4+r zuqtsPR);jalR0@{(`!EOuN2@boZM#mj~oU6KBwCT_h=9`c+T}%IPF}OlUJ3V@e7?e zD@jvgrO}8=DxRl$%A$KACGD)dtS~ai2$77HaHSwGa>5QnjT365X<6yUZ%c5|`1}xk zz$(@GubRZzKG)~xRN6$+hEr#<%)8J* z%e%C>-N`!^s&m7n*y$J{*5~yY8f9yDPqyxy9T?F>Opy2sG#+?Bwpr29$V3#|$l8U#L|(g9`p=is(P$`S<=}{Ga$vq48Ih<*dK~}cb$Kf@ zo=d$JA!Ea$YAvLsrR_QP0zpCM)jeGQFRVl_PQpqoi=vZkf@rtb^>;zA`^uMGw2K{6 zXjEI8rkjqFDkQJ26dX1vxWFOT2O83x=~)>UwIq5tFs`KP4VL}`BlHDxxHDDPp79HA z|CNbm=eu)tmueA3PWqB-EkLkqR9aK>yGyUMG=t=3!^gXKz}EFC_ikDVxhzMAiE05@ z12a3Kx2o!$3BN5G$BFIu+NAh7maddp|Hb^OPMLz7d5@ZBx+if`m>^|0XC%%vvT^@j+r?@FzK(jG zZnUv}K|Z>+s+zW4JoU?~3&-N1k;8d*$UM;8+Q^x1_(fYvqi85QsM&qJ$tK9{XkdtbK7w7P!XZsoo1@snlO<6Z%K_!EUM9T1PKty%M+1 zoNkhn4#yvP>x>t?9(RL9!*$EG2WF=MccgybqdICI7wgHJFO3@Y_8Af)(I(6cOo;iL z$V%;Uu&k_}AX!LP0ow1alyX)yaC|H311YtkAD#lF;29FPbD^y*cBNhe&stVWRe{$~ zjQ`>_*U&&jYk>w_5$5o`B(*wMTSV|+EM2hxRV+af#l6};+v>H4f~?Y$kesx_T8&oo zZZrfFuT<;Be4cRD1wP*)GIdek=#hY*EvFs{g(3H`iHqG!o?OP&cbFlPOuY+{9>J9iAHro8HuyUs+`iIDOI3vk1#-fng69Yd%r$LA(y7?HK^TC-{oo@$^^-wY@zhUHvL$sZg8D}rGkeM!T&O=bmj87`&p z1Ou1-t3Ru;YYP;F9QyI$fAEh4AER}|8-K#ai4S%@1siFhp+xauFbSxk0|))MoJ&=> z1^{#EN_G>8wQ%ema<}|m{QkYtI-e0p?12Us-A~cq-tH%O=C^9_Q-@@ zPUyB;tGaGI9Zr46gjfcWMVe_WEiISpeNYk#UF?QIN~B4e45eXLxkl2tzR)f#^uKBH zf1_o!ZS$huxWmkPU9Hc>#Ow?NtUg704)UCUw`*4DpTA;sZB1s#55|t(@n~iTK}xYt z*OgVAU{z+T+9tw%gyE$bY+Cl(usHCpuy?bfn8kj&maTi|QLtzoS}1v>sVmDsLMCua zSgB2eU$3W4_`af5%YD7&a*Ku%qFr|F;J-I=chj!&k69K#zH@s#-ai|q4_=X{q%t&Z zGIEk4NlH1QDU7=&3WXiJ83fW`S?#RpmLc%&2DJMgF{ftX{(wfYLp_drbdRak(zblK zQM@oX$zo=EnZaw)TITsQ-jW7Hx9T+MH)(_gp&N%uSnd{rnps{3J*QDf42?BH&7o3V zr!f+UI3D0WTdVcjVmJ*jDGk36Y#y~Zl1X|WvYHH>q@jM=0+o!u1;5?%9^bBSND}agDqr2 zFDo0~5|O{~@3`_NJ*D zmzXR%V>K#8@8)i;jC}J|;rzYm4t-=d)3!Q@WYtpT{GM%NS?zS`>xIjwV0TeB8y|&l zorJ70!MZBy^J*mC;4o82x4wU=AllX~_{raEf6;lOiaMf3+OXa}Z`jLK3j?sgz3# z8e+(G4y<+U?&lY|yD@whq%k8Q2{aw@VyS-3BLwwO~^1|9axzt+R% z-{OeP%y}Ro6`Z^PD(1DQJ=dGZhq$f>qhKT&`raDpQ-F<6UVp{-G?5HLqa|5&yH(&t zM;VO7ux(@u#_cjeBpi`DDKCW&CpUc-<3)jG79^Y1ItO*od44h!zJ&_<>48(1eyM?< z+~Nh*?(N)iH=+KG&Bp0>)&@WMJ*F_)BOKK$?9ZVxlR1meghc`0e*5Rz&6XL(m8kOa zm|_`KXf`n>UgNB&8@cq>IoJWh@ndpm6ocWVvAA=lS(pV zG3lF(HA;-Ft#C;=hbCN#n%eFjz+0>>dr_Ld2V>`hVu=r40 zDONn&?q@fNoPnW9BQEsLQI&5VpXf5F3O{rBUBp9xlfmwt~%^egJD*4B`-Qp?kM^C~w zb>Vog^e5gSyD2xnHlKZf!6C!TFsUay^7?-s`IV3U=v_>WFT?vIOZH=UfcbuAg5aXA z3RuQ42L}aoA&-Je`y*MJhQ`pzniG1DAj`rSWWX?}%07rj@DS<~{K4-2-)au?S%?=k zpb)i;U_P5Ic2o|MP9CYBKCHf()@?Z8QRnk)&=A$XxxAOUi%7Jk#aS}-y3XYiw`jU@aXOHvB-hDO!WCL%p8XmQ}@-WUJec@mm0 z5rLn61Q{W=E=x0VrIlyg<4nM1XwyssG_445HTnk6MlJ;ZUMsB58f zyBP+!LZkY!ey}*nkKN`{jbtkm=CEkJ6Bu6Qgb>Xg#dyvZL}o5;rU6&1z;Z0cO!TPC zznXk?P()yQ|iJ9rM>w)_nQvGttRaB zqo|+J6YL@YK1Ru#wxaRk5ACQif8_2SGivr7@75OX^iXXfPqU57UI*x`xT5sQ-k{R; z>GyY>d-TxT*XZ0Pvys0R%FYDW&pw*Y4>09eakr;%iFu>?gKO!ojdi@@Zxg6_strK%iR2eyA{+N}CQt zx!pbqSITdFfDfWL?(0QIY=^qhRKNuyrIzjOk$ZO!pr(3c=RD254-e*FLBa|o zq#};2Oe9By@a861Tka{zM{GmPcm7m{U|c~OxO<9>iJya5R`xQQ&toL}ieWqo2zzI% zr#6ROQbw-cw9@=)Re7oWd>AZ(uv3nM_}4vs(L1ENo=L=07ZXAW0gGb`6{`SotD%;6 zW;;*&Oyu}8_~ttXztIx?_PtB}3|i)Wn@=}BQ9WdcP+Z3vxVAG)O(V|ppbB1>(b!Rk zz-Og-Jn*B03n0o`B1P8gU6-XKN#r?(;mB^tAuQWh^%vS}6$$ln-$6=_0UzS2Ohax5 zG(8;=q;V9V3fRE-&js4v^~Rqv!+^q71PRckat8j`9fJCINCUwn+K@z268{)9!Ftf7 zjrcDqHk0^w1RY5pGdbzeO7tuf8yLdsa%__D&1+F>Jd5|Y@4a|CmL11jAe7|qmgLX{ zHk_qgH3AE;e`!BroSfTbU?Kakx^}B^98R9DKdEJJQUVd^fd_fWWd_Q6u2J8zOZ^O+ ztLe8ocrx87o55ay`s(GtyqC#xW0^!OL$O9(&SExK!`Kzl7lX-J(BAd`DxSqs99#`5 zA^(|gA}85=cR1Z>6`1TB(nZ2DEZot7jh>s_+%jx6u_rRJ&x&5g7vBh6oe&rpQpw;w z6Fi@%P$U)fC$o-9zpS-)xMl%AJUaBD;0s{~rGw>5=#Q=%cfK`-?+8lVlMTH`yrE-g zGr2xiqhM7lsHIYJ%1bobq1M8w`DaBBA(E3l{BvJ4;&;KZATm61o49S*rPVGoQ9NwG0vv^fSfCF6H4Q~(`KqD_v^gTq(WfZ+#hfHD zwX$kSK`>2lCcYP?tQ89xQ|=&{rD%157HTr7*x@=1p3>R5gTonK;I5VwN14Pdx~w&Z z|DI`-Rh!V0HoJ0Kzes-1_$~*ugYQ-Kr9AaHnD7OAaAA2tV3(q%?&QNeeFTC*@$u3N z{a7IXTjOV_UD;(Z8~X0e)K~M=f*Ph&@no0ptL$WMQMN&l=BQE8#Cpda*oXzeBg-{0 zZ?^{vrjH+YxIOswX#c$big0+wnZu@qV-3O1K4K@A=T8fqc2%1ZD%|1ShQ)@?QetYR zfr=+Rud-0Y{z#}4Bwz#}WS$|-QchEAR6$KqM4AToa5T;N^$^Q)g6LS9l{|qEC+fOL zac=QMu6Lq@hv;f8rn21WzyyX)(?r{?ANBBPfp0tX>}aRy5q86RSfrRsA)9U+2qv7h z@2<e zme*_0eF(uROd+*=yJqH2sdBI`x)w4lMXeT26y1$J&$n)_JS`XyM|j&~Tkt(ejj~ig zlIQzmX*ok9qIk_T!C;HP4HQ~+I@{rNoDz#+;61+CNts^Aj)9~CP#ryH<$Bu-cAHJt zqz}xMcYB%pq;j4|>J3)iE5{vn0>xCa-^!%t5I5Rg?pXX&o_BpXn@aUTQMJ3+6zt2a z9?Y@!Os3fW7LR3uG_p55n_;4%iQLypCp#8Hn$3P{xe4j^lFA#&5dO5px@!6DPi>so zyCqWSqW~>r!A2r!0c#BZrmi{(if7;r_~zOMxp8zsAKFiaRJPG{&6VWiq!OVn(sh#w zaAUQ!BaF&9r%XgeHhp(DXe+Q>V;WeBU+l+v&ynW7WY;d8`*-o%4;bK#@GV8^*^NUJ zsgWw_(voa$WZL%MQe~Ex7cZ~M)aNx!@R~|ciPN!;{ZJ09BjP2!l?|?(%d=TlvN~rV z?Y_xFwHmY80v_MC+^TN%LC#6ZIXwH}7p=XEyIJXw+%m6xnhs+UMAbq{%{HEz`ksW$ zin0}hE(RS|iQoCSnK>odwX?eJOerQ!s~=EEZK)k*#>!e$F>(2=T38$a%q#8f4ep35 z>~c-*U0$CJcC@yGTN8i7ofLu|S+;)c&b=Kigrw@ce2NrQ*w3%DTb2r4qXz^pItT>n zY7t30w)LcBE9sMw9Wb_w$Cnq@q$8MVw*nJkt2CaY+(4+vo)h&Ypo}NlDyz8-z)tM8 zI_!rsxm-N%rWL9jlxOp9#D&svg3Fu+5o&r8AXSS9$&mY;vXK>;WgX!iaSE0QS+-GY zkM#>XPR~BEe}olP?+T(xU%{(#SYOMuhaCPiX8AKYG7M}JVz)l!i6{jhgZ{+ z8=7siih=7WP0b?3YicGf#w)IiWbDOJ3e54kW135obWMQHB#W+TgAflNDwEUn(jTu? zDBkSc(2QE><^79C$GVTr)1XKMTSyKY22jrB8vJd*G6iq71(4QO4t1 zFudQsU>9494jsu<7tSgOkj^NbS=w=QC-*H93Qc$u5S><<&ReajYt|IBEP$^D<2l^6 zB+f>?6g@Y3=aw?zyisS-yx zQgn1f5oFEqs~ia64^?P*_J(tA69-mUm)o&1Pp6`w5c8)3@5UT<@F4>odS6tFD_OFR zIGX3HEs}v8SP3t`#?F`WPRi+t*)oU3ZR;CP#x`R!>RJwZ`ah+pPjelx_yJJ-#6(EtpZgd^W8bB@vhEJ^!vmJ>ua16KO2^^2(I~M-L?E%Ybnk>m? z29Yf42y0yv5E7P--28B5Wk+x(#N_KbKdeiDL{f0FtxFb$K*#CDf*=^dQOt$D$+fdm zu?JDg{~gI`Q10zyt*d;%7G1(Qrt$tZZBD}ak44Bs$Ry2=%gY-0PV~wB$L%5OyIT9t{k5-$h zBwxP0e!XnIk|Z}OeR`NixsFbwm*jW-O7eI8$-d_-(PrHH`-DEjD?oAre#7|2(O|V;Ef>rDVOZ8?M`Zg{C=vw5KKtIDzcG)f*y3iA$fODK|M* zlw=_!pA34#vtITG)exwLlyZ-|b&)1%o~;K)2m2bEHBK}% zmPKlk5jvaEj?hsI*D2L{Pu1r;b&iDLzO#~%icz%Gb;IU2R#v!PAS*g_plg=O3uL8} z!dkC$w0V8kiY>*>&BIMt9sjF8nflbeHmg$xr7Nv^(*axCC2sMkT^O}UBvBbP!7+#> zz6T_QUVC34jD31K9_t_=nR%xkD zB1@2Uhj|aP45NeEO+kj84x05sSq{8jaUj&*$0;`596?c*2Dp7?;>1n8jxegkl`zC( zxb|^D*zjyiO9U_0!)=!=KqD9}gokN?T=OO^r7z2TmR;jL&8%f)X3`@Z_+2+?ndD5U z8H#$=qxn3k!Y=G!XNHSawPL4pl#ik{Qf<|n z&W5p-#rlb{v4@h;L`>(9BFX9XcPYNB1=_;eh!H_MR#=&^zfu|%pYqk$ixfJM!c!1Q z{F0;!y?IOk6TKqtp5r(_zvjY==z7lx9eK*Fmj^sUyg}m&Vum)xJ>yJU#2?-hWd>eD zKwo=l{QL~cFtHqvWCnbi8?Dg>`~;g|Ugfw93poSG;xU+--Br}ugPn?GcidSeP1>_} zMso?>MKXW0$kmow0yZR4NmQGexO9M?*!bBTR=aU23$8^s<)M=JNL@KUapKx^Ntp5N zbWKl_Nj4BM#!pnK_7zn%E3eF1UZcTZ6zXZyD6Uz>r_S}Uc zl+|kE*E1k+6k`{zF^Pm$1b~#9u0aU6Ot1tIiAaGL-X2sLLTyLsjDXY0C7+V*OI(Pz zf5!eWfBTVsWq&UDc+}0Ef-@A}n~Qngw0}W#L;fYkHVd&yE5h*+e)+Or;yRWcYw7iq z|3tT4_G`N#u)%=#SXPFp{6Z{V3S})~+T<(7uF3GnQe7bgf>G<%kc|&=DS$?EL!gpJhQG_LUpc3MVN1#~Uyh#Uv~g{UTa}+1h)9 zl5WQbar*k2{=7!Xf``@?!#L0_arnOmClZ8OIg2~RvH~X>fxC3Y&qdJ;!*S?+j~cjh zSBiW2?mbXQLN*QSIx=BvVx+^WKck6AVcJa;Cio!9pfBgcM}1UvQ?z)~3-p`4$zb!PI(aZ&0=udg2jX)Ou$L2t_f|7tCc`P zuk!v)^U;&`FmdOXqd)^{`zg&2DJ3R?$&Gsy5p*@NXReRwC3*VD?u~w&(Dxnh3Pb+Q zaMjN>zZL|ZhuHmCK-V<={zp@jAPN!&3H#Hq7cmy^Q4~=YblvM!?PLIlqMzmP$K zy1)?kHp*29*JO)}P~-Xa7G9mx`9q87SPFScS4`oY73nlNuHxjbRgci}rR^b;+ogQH zQG~vD&ncPw@=S0^Qd*zv`Z|D6zJtb(4q67^94md7hxzC+r6C2v2e4;!RvvDZV z^thTNq}J%rENnLw?i3nU9I&nEE~?v>3BBj=(5RdkZ>4S`C-n2FXtHLfkc_c|uC^r4 z1gM!Lxr`lq6fT(fzD@j?gG)!{LD>E*2J8%fN)BDO5Y z3&OZVu$E~Uc#dVoTcaop{lfGH+hZMJC)w?48K(b3m`(Or@Pt^|Q&|4gD^yl)NS0JFk`M{FS_L8Kr+`K(wRah<{*KD<1Qc{0LG5vceXUgvmCRR zwWqSCQ50m88#52MYI6{S^Md6M(cG)Mxn{Mki^{w7{(;|*5A`>_%5~>d5QtJ7OP@vr zvTfERQIIwDu1?{>i{(LtZ}YbORpV~^8I{j`Y>>rO(O)YDn^DFP$JVFT&j0Cb&v?Je zqe$(F%9pi4wKrr$H8;@#8mQ=5A{lPPn6s*(zUFc{lhGp;{b6(EwA|JljHU_yv0A+O z(dBfk74G1NnL^Y#TL5+Yiw!McpZloV}MR0_Y12cGstIpeUbd8xwvQbU*EhfZ!dhxcRb*o z^G6p0u}cFmG%R5Rj0(%lk#Wg}jdkr)y{Y%7vV6pYKf*)vd4G>iReJbaXqA#wOrGdw z!R6s5?$Ac_RKEQf8ak*(zghaU8AtPfP?FEioT!}W5@#}cI%(f&+C%$Re zwx@dt)jWZs_>%$p0qWNz&e09aN>2>rQ~7ntP&}mylG;uCI-6AqHXjP)AIuBH|JMn- z9rBA#EcU53yZvK-erEFv)%F9eU9a4HK*l_MK}qgkH1?HG=+8-aG3=o;y&*<@$grW% z?JBK3xGcyxPPF|U;ZBt~Ai3Q`%3_>fY(~w_-PfF7+QFl=K<5k2Cu)1;yQ!6 zgBjdr?atDyhJ4>7l8H4*g@!%_6U#S>vOj?jgJdY=Y(V zk~O_;jf2QR4Os?62^$3lLIraWyAf5wwz<9LpV%%~8&Q#UNf9|tMj>fBLaMCEeAi5| zihcoOh)USf1dJ`=M3r9`hY2U>U4FWM8OLT7~`@qFLZi};63aYE_XD3rMrQOFq zUqL3d)Sc>?i}o^*hqCbCBbL+UlCm6Wvpo8{$oQiPVJryt#C#?DT!@CoL)E4>i}zRH zrvx`K+^&4$D0$(^De87qWS5Q90!4v0zjXwm8= zaR|mjkv0O$k!@CxWiC_jG#OG1M{`nlikiZbHsQPrkE2;^){*3^@}j@p#q5J0!5UXd zmtLX^3v^@2)8elPwN58uVyIKRg(AEkSCP4hFu$$B5@*Fu)?Z?d%{6oUo5C_g6XT58 zLtR49ZPnj^9wM8+K^Mvwz08A-mm+s}pFMglBgZ834{?;J;s?G01s-T{9He$HnuNAc z&Xd_|_vZluttX>-d@-T-TJy;ppvASG0WSzfJ1>#KE_VxNtQuXv+nfU zSTZdqAP}QhP}FHNn}K)!7q}A6Yw$Ystqfxv=1=Yj>#!QfVJ_yKYM=qDs_VWt2uW4r z3vl0ez1cDAt>t@w8$XAp>JvA{hmAYGH#lkVR`nln>Gz`I72^2&8$`n` zRUNMFcdEG*_jm64es2(xtZm0|jlU8I{IC{hU^&**qKn{bvb?kC!N4HKxsjYK2Dhi6 zGzOkj_D+pg4YC$+_0T;n6xN$1P6Q(1*|sDx_mhxi!x9deo2M+ zwjR^OpG`RyJNJatgpWS%Ult5(MVbmgEf|XRt$=m#7=7a*b#}iC{7f^E( zajm&*^THPc&{x|h2JE0rJER5Hku3ahygF~Sa^KfCfY%}K*{N(dIJ|*EIfbY@N+w>w z(zNmDhs@l@S61ju7grV+=2IQXbnbuhoufEL&_s=Hzugi_rc%H##?*gQq%eV1iRuaK zSu6w-`Z$M$xK}CFY>^6<#=f`kou+hI%mdF0(hZfBe4tqWmh2!Ip&3ck#;=0GCd+U#`w8O!QI|%?i+2$FkuOM$VEtz9Y1E@BB<(!FTt0?8xVo7710ziDGF^AB{2fjw$*T$ zUR>Uz(2{EH(~B^1y*u+eqWg&0o0hwlt(jy5Alu1^ur^BxwU+_yZtrHrY%`97!0ni( z!VcTEGR@0hsf3sA&MahJVR7NmL!gNR_QfOLvlxvmP9}T4g_Ir z!w7E~e~=+G%@7o_o$w=U$LgW;Gs|j!WJM7%RY=uV6H7Eh@mE4vXp5C)j-+f>_)e%- z!Jh;n#z?2AiCSf7D_o&rX6FzmYw0p>+V@e;*gX~ z_Bof_Nmr9oo+?ZKKW8{&9X&A?IKNZ6q~%;spt-lBh07Hq$yY4wk*6m3HauNe)XHS#;FUI=NT~T9)dL>qLoXPMz!9> zicv$Bqh09QB5hM42Qk-EJ-Q)h^mr@tg6)(>2*!&6aNAu5m%raxfu%cMp$%oWWF8`4GJv|5?4My;SvdC#!IXH&M6Xax% zkIt#%SfsxvWpJ*{t^|L-$T5${gTY8F==BGq$fNr9^q$!jG|%9(pww+j8>RW=#sq3W zp~oLr&0oj?^<6ufC{dMNY|El3=^`!MT~aicW1lMs!f%mBacV>cAw`cKnE2|p2qll| z1U217BfRB~Q^tk#;toV_M8zqd1|~)hMur$-M9~^U1WiY$j_`A=!73b$ZglJX-HB_M z2+?%C-e`ChL$2%SZtN}gc>KX(?CJ&#QBhP!7p8bz8mKu$q<~qslekLz=?#aS?y)Sd zU_9l%4hOeaPx#f9mBqc%Q#-(>1A#83i2`k%&Q74qj`{N=F;jW)L??WB4o0NHjvzBV zF*uG1pZ1HfIMBW+AykQq+YYyD4o}XXjUZKL7UaWLK5Hk&YrdzFx6}BMQe@x^i@Ny0m4xWd+$rO4!JBO7<8fV(JOk03Ka!K>La(aR=2R^M zk)my-wn4bKebKMB^HV&POs~1NDLXEQw7LfmOK}`d#ZoMn`}X!q&A7s2V9E%}+?bA$ zy+fSTMYj!ZaMbgo2+DYaUO$)UxaM|@)dyzZ-7+#kEhdnD!#v6-BJ14#>AqAK+wGf6 z_+0Lg5>G;V<9I^CHbFFG>`ryuY+$9U*4`r7Wh4Jlo?B1VhG>64Bmx>Ba{+QcyX50o zGfV9sjkdTEI9m2Nov%EHH8Nz?egy z!{C}M*WhYC_w1{bwZYgE>*Q)V}QJBuN=t_0>p=!3TW z9Q5YH7!-q3L1tKXl^~n*fQ2+xjHeaStL+*h>l*eg|8@_c+8f9c0J&2bz?3lMYLN-v zA1$6EB)l7ilV*;)6)2H1X@!{-{1uODE660Q2vOqSGmlwS}0>}z3VVoY9`AkJx9(_*1vP;~J zKmu&Pl$NuVk-!FbcVRODwXb*_PM#9$9c2(HZLeNg%-96 z|G03FuTBhj3tzZ4gCN2~

l(X_I+GK&R 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 H00000K--!s literal 0 HcmV?d00001 diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..36d67487dcf5fbe3dc6d0a6b01cf4d29dc997765 GIT binary patch literal 16272 zcmV;BKX1TyPew8T0RR9106&lb6951J0Hgo_06!c61ONa400000000000000000000 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 G0RR9|PM1{x literal 0 HcmV?d00001 diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2bed1e85e8b20cb3903206a6cace251c52bdd8c3 GIT binary patch literal 29920 zcmV)5K*_&%Pew8T0RR910CeC06951J0LqjA0Ca2s1ONa400000000000000000000 z0000Qg?t;OY#b^-NLE2ohh;xaRzXsMC}fi?=pP`g7gf&Ned zHUcCAge(h!7ytwy1&KfhARDQ|6*9M7GC`dT0HL~c-mhLbGLYMWR8$PhMh1e7Lx7Cu znUeoMA2)^w{)kq!H3&&^Q5)$D$DFhvd!Yr{JMu&#leQ*#c-2wxkOIYTEdBjr)yCM} zD7w$yeN`VCXo}5YgPX@WBsC7ga!pwZ{3sK@sbRvDIMEYrTqc+j5ot~)wyQcKSeCIv! z-A+u_KV|Erx9i%~R$xGer_=ub41x(a?Lvjtm!9Gg`hRAUf~lf5bP=)LHYuQmyImsx zo74ZUWSQbPanm**2v-A4TiVT;6_D(F*w2~8h8P}j%W1*}S>h{Q{oCDxl4b-8hx7?4 zGK84=Wv;rB)&LN?oD$+apaWjkYKCB&9V$lutk?{UMiF}kU_=076;e7(4D6bUiHb`w za^*I+e%;zlfA7{V3;6F{zP{0n%I~sMQEN0OxB(c*B=4pm7{CHypig+b7oM-R$oIQv zb`}ppH~}4p?g(5e#>YnX+u0z424Z(|n|~he`~5!RC7AcLW*l|K!eP>YqlBXAf7QE& z-l_EyXp_PcL)*K1!2Cs+)Hxt7a>7j=6UmZBKrEHH4Kct4%5T1lBi zf@pTM=KD62ZCOpr4$w$Kg^JkIW%lkilj$Y}x^96XSU{F2fmLN$*Vwu$+kPX%vStl%)$=fBmu{;!4S!&Y5E#1$xF>m6^%o`* zFOE%g-y3;zh3V~D?Z;+ep7#j9d*mX#bvz?yVW;qsljSE(4_m8yej)^h;1@G?eV+L8 zZw9LqKHv7wMT7O?hs=|eub-PBgz7_l?Wg(D0W$mLUt8<=cO;zHtVEt0>XowZYqDed z!pI_>x6r!}Y#c`hF@XFf&-AU_f!G9lLaxt0ZX{Wkq~_1pEWJzf90D% zA-%9(hVIu#)82u%0gUXvcgXI^8Ht6vJ!fukzOGz~@`v^3juxYP=S-j6sqNh#<9ACl zdFGDK8 z`yR8DezN$>XvTV(%6wdUb)T5uu)nuk0M+ACrRJ|$w)00fMvIqU=rzxozZiYkFQ`}P zrM(uWp8JK(_POT2j0VkHMwjMrWAyst3GR1f(*3eht9{e40{r}?sI)YKbK9d4^TZbD zy14*hb0t+6%y-wL9me1;a-Lyq|4|gE)<7%|_*V@(z-;X)#;bjw30s#0U_6QDOwP0n z^WgQ;^RnnY9FiC7&p(;YUoM$StqG=k^66|*8U@`Oo&w=bjH0&9R}US#LOI$dP94GHd?>!od#PnJ zRS$jH;HrfOGm9Pg#a&n-(#GS6h$e`0= zUn(jHrZX!tDSrRtE@uMR=%LGC zwg@bn;C$Ze42gIIQN*H>gK!BifH<^^g(Q9hib+UC?HB;0GW)ut6?0qM3wX%hD3lOW z(;*Dh1vohYDk|;;PzJ(l`UtoV0C-}hHbh1F5b3};aM43+I=B!jK5QTnD+SLvggCHk zdLT+dC@2AN0mjE2jT$xtIc3Lf4I9Q#q9wtgAh4Pv*dSHm;93eIVF241fJ8(PW5X2V zs(}KQ0fJi8l`nw=qOFsP|Fodog43Wee%f`UL?vuWavZ+3s^`P2W$K0N&g{~!Cf?=Suy z`S`+hzdibi{I|akf0p{w?+3qFKr&f;(UfZV%zxFg^G)Om90j~}C9 z?Y6tO0R*tu%lt=gZ<_oK;AT8z-@?y3xbvpf<_27Q?Zh9yUivA?()t>*#y zADedJFB!jaSLH`8}i zx8b&zQ;%y^)m;AF3;ONrUp%aJW&Lk^05Cv{((QdzH2&R9S`9|mKYuR1N3;2NLi;d& zjemMW5hu`n&OLwVPwKqo^DssQ^uIwmks~QRidXM8C(}(%E-lrCv?&A0WJJhF!h?^J zk7snt$9)D$I1*HUpQ6JsrZsk*GVM-=ZA4$g@lh!A1CP@?#HjXV{&?G}X zO$H1%!^5Wb_cai3#iBH;n|@-HYp`*{)=#p$BJe_^*DRw8`{}HzFZ^g#l$5$&c))eH z{Uv|m4Fk5PyVxh$HRERh<8g+*q`n8Iu^%ZJ+m_^ma?0IcgAZoP@YVX-GGM0T?Sx_k zYj!rOnTXm+c$<$!0i}>NzojN-2yA($%9tYf5o#`0J7W_0rOdXFU5udZfp)BNo*>0& zNOzS`Ao~)WvM9a0U8Ohj*JU(?eOb%8)j7O3#)HYHP=>+?{)n;+$` z-oW!-G8>0J6}5Jac_eS;_g>#CXO?@NKN8{mg?KVQK)F@kYt?100yv<8hCZ~%^Uf#Z zg0toHv&?BCh!)evst;!h`%`7498C+B1S5&dY>GMj<_e0MCoGFFCT;;e6PqAry1N+z zBQuKVkg`-&ueL;(3B!Nn(`XDdXwvW_UcthjAZKxk4{<> zIv{Rr%?qzByG{@uWIFKT>dZQ_YQP@Hn~?Yxw_7T9hw_v9DC!Qn!HoXD1lHy;K3g&_RCt2a#^*kQZ=Kayc0D$n7+ z5BB$u$um9zdD?|pr+Fx2;{=_jjErngfbNA8dV=o>Atqz8df%KFr7ZX+p@P|uX(%xh zXnkt(`c!DVaE#`sA^4&wjGKBa`EW1{_EEADO7erIjSv)B7RNMO;lv|?8;8jwx+k4B z8Vg+=a$Mr1%)B!V4u35N`Q$^ej`YANeLye_#|#EN?!Eb_;7%EE3{PG%L%w6&CW)LC zV}_M$9sU{k)5?M^vOTD?WK^?&2_U&sm#DBVjB*Ox1CbhH6%L)IGDWelb~#b2OunHb z{pSv@!y0)}Dl=bT2rk1JHdsbP1%HLX|55(fgI==dErr?d=!pMZhgJGq&mskJB{AC( zN&Km>MSXYdR=T3CW z6mp8fR4m8GnPeZ10>=UdOG9D zze@trsa?Y&#`0}AwICFjVSExTA=sQ7Lw7OVxYvvVn^=*zJcr&AzRJk8O^LwGYmPrF zq; zb#fgOej6Pyz`@e0k%3C&ml(CnJcAtUwl9MLW!HZu+kdqE+UnOv%RN2cR@-qs`r12h zU8dza*%T1xppGp&Ws`Fk`K-eX8&f&Rkc*deao*Vag!?=f&O>i?3ueU2aPx$Fth==t zn%*;V)kKC43+Ll-E$K}7w%}NEL7|re$LCnYY;Xon%oAe_A32U^q6$CBX*ANep56e6w|}=aoXJn`NL; zrlyKYYOyU3BJ*j6@mc53o#bU&VPQ&>Og7QGGpN%~5zZ0OWZMx3 zfzFf>sSiseAMOx&0k6Pzp$1dx+giX72TRwsJSu4?85T=CU9fSQeg@Y#%Vouunc7Z9 zib3y77b6rxF7`Q0WhVpbFh!L^NQojnkmYZl9pSJXkIjWDiG1B?4*5Itn6gHP9v9W7 zblXBBYuQeYs`rgp(T9Qw=TG230JVX%aNp z3sePElWJJu1`-{Tee7p#RuxNGnAbO1J8v7mnXJ@-meg`l)MP3fJKr!V>?k1h2Q}tivy6MAZX+gq1Ty$$dJlXI zf_#P)_8pAw@Uz`kx`_v_{lf$~X&YvJ-@M&)Zc+S%V87nlVhkrE9L^)R@{pK8Og&^> zov0f=CZaP`k#GQQ+DsSP&8KG)51Vungt6b>^uGjPEEpz}x>A6RTvP&5wr&}(@g%`Q zH*WNQl8+~vy2XW;cs$c1sn^j00mh5DGB3eN#v-Te=|YqiY9QU-lWGYuYyX+oqV@h;iHuWh-35mA$7V%w}G9PPRvrln0Kq_6ZDG4jB6^o8roO(p4%H++L(=XxpNftAm7i(_vu=n^8c=)le3~=2FL%5D}Dcf z2XsUB@a1&E$t*moFx$)JAL&lP+O@GmRAMssVd`-L8+)|1GTz6hsMZIc%JK|k9P}ai z#WO2g{DH+G`41S)PldnPn+i8tIF-BZI#`^}lOwIl`1+Ew11j~sn0Kp+gin1^EPR() z=~Zcv?e9yG@mbxMo6a39S$6{__dm1JjW<&fNuSf%+u?j#486l-)|AUl(+Rw$e&YJG z{)zt2cPFkbTdk0;_~dl$ap`fO6xf()=QF4R2Q25m?Y|Sa8dzP|NG9cTsWwX?NGt;&X21nn>EiF>aFuvAS)1yyrueu+GdbY>wM$Vil3%GJ3!DSYmrVH zJ<=lTQnZrJD2`0a+#lej5Hmm(U?7#WtUTJR(WF8@Yg2wRWK2OPWCNCNQfA()?72@# zK!p{M4iB-}(+=$a1qzDn-vSF(6J0HG7?vknqwVL3*114$??T*^dy$UNc_K?#T{swo zS%6b#8Ek9B5}K`Z$WN5L3Zq-SCwRkFGf3_o-H9+YyEGA##hJG& zD>LtImmE!F<7rKSF7=U-F15`8c}M^?2Es6-iR6h*05w|8@qnG5?AoB6pt*I&!5rg= zvy9DJYh6eJntI5pw}(+`-MW*-+A zW9AqLfLOVvi%BWx>X&(3tbGyfU{n;`*09`}<@yS*-WR}gNJEDhg20!?rdybdn}lX* z1OyudUT(Jw|8ZGe>%NPGC7TXQKM)XQ9D2FR-tV*;*BYR{Y_P8ZsByCh2rq2ovX=Wt zvkRUrq;$(h5}*@oSrnGs|I#>{`UecyPQm@`a<=1>Mz%5=ggmXvDI;kq{LI<_%xlIM zry~M=P@REY-p=6x*D6}teAwZ!EdsYb+4asbp@*EjQ3nHWq$fxDt9^188bDIYk5h6onooO|idZv+w}UFD z8p|n{ujVpCst|FseesHiHLYWrXwTyC(uPiY!$?pN#ojr?JH3vcM{g?0p7(a8mY~4% zgVl6N=l42c$%w1!I5%}1;;L@)Ugvo=1nGFg6mJTIDYZS$FW4O#DcF8YX_E|*EinkQ zHTJWP%%^;CcuVilSz^74o3*jVj;nEozMp)kLUkOz+Ui)^NWt!-{5BS$*4L|#n&-`_ zjf;=3i}jw)qj~k#`2s6T+4TTgbG(^Oe00dD72|Ly)1PSJ6pZj|#}x$<43WWaj_b?E zW!9YVW*Havn}_&oVog&sThIEH(AchN1@|d~6V&(qRx={yA zeA;ef$;atQeq*gm$z_Z&E7xeOpZiNgt1xJ^Py|E|GqkUUv=x_6?{%PiMFwQHzzJ4O z4K&6Y2x6Ch69 ze@53+)+FnN*v5R4SIwcYR?`kyX9a)uz81SEay*e*I^%$aLhoUE)SIhBo=U#|&$9G^ zg3evm_hTQ{F$#`Wjzp(^cW%c;iwl^COnJaR&VQin3`2|C1d76VFvYg>J&YdEf7i|9 zbjYK+uC7P5bjXP}@}Rex>M|Ifm{>FE6*fj`^*QdVd1TaLZB|BdL$c?5VS&eLeFm_8 zbN`TozZ*KCd$+vgTbFLjZAv93;u}!`MG+%?SoyTMSYUdf-?8W~In`_C+H6<@uNV zrRNGR@j?$7c|0}2$9P2D&0=eT5Ki>$HWv#fo||@?dXBSB5SxD&6Wv#uD8v(BM_rd= z1VpGOWaHq>!N)$=T_=53fv33*Ujxg5fu{(O(8%#8_(p|X3YLdOJz`BTw;!sO0OK5|^kQ1> z)s9Z`&Vz!Uf%}6w_OHEOl9OIuIvLaE6n-e$#jU6jjsN;Gon4%lCyY!Zw?Ya1Q( z3<@iV3t+>x%bdLDB0a~wirxGec!G5&EhL^m53%ngG?jM%PqL)wvkng#cM6yeb zWjRGVkbuUH#<9TYvzIXWUdt-uQKiV4WSn~(k3SUGEbr=OI(!Np*IlkdBghSjJ(!nB^P3%JOW|pZkry zz4sd^zs7~S^zDm`nK42^v|W3I0@3b7K?;G8g=l|*s1RY_Ua0~74VL3;%e&2KU%Erx zX&>)3jCntdS%;D>CKB}H&8G9y|GPh`H40q!LL#s+tHaBN32HLzP|BAt(7lz8TV25c z=M9!=MOY+DAVCCj@^dvGo2nYAPkY^B(46+>#+_j0vW{q_6W|yOJQFlUzdXzxN&qrc z1uL()X6c2tLPXyZULFPFy6+eE*JtwA@72KRrl=_|C$_Bao?2!t5D*3sV5lCe0;+#l z78r&CkPso_n%+)9Y#jP#L5dzNm5@DHHlb&#fVrN96oG=gW+0| zb)u6c0ZZr;LrrgA8a`~7G`x`LgelB<6>!duswh~IusU8rbyS}2bp_Y6&TFF}8OkXX zf;kiJQo_uV@<{}x{1f$wpglF~7q;rEBeJ`g>%KxHme*F-|2P3*U_-;^tqRDTPIHzi zn?zAEaeImy5&@|#JRRtRWd09JRT)VI>S!cU4Uw$OK(+;PZWE$Jc?=;nA&Z*?k}!yV zs42m~@@Q)E<;7`WN;Y{^5c7cr0MbVQau9T5pYXQF`a(MYx4Km5GYVcVp(RO}$_KHt zMC>$@mg=fd$QwO$r?8oXidz99j>-%>6f$gJJ?Tg-{Q+FyisQwy z;Gd;`!Wfz=M@`~)yKcjt!#-i%#Cn?b!=4SC4E5A$2Imp(>1P<+@m>_)M8ACYZ-2tv z&p77%;oAk>BWI7?oV9#(`z>!~|8uL8FW%NDoOJQ@OS7cCcW&pPB4YbrRZ=!nb5+Bs zw`hpCT=!@0uRTE4689Kr?P(`!mua)KS9N&0Td;CHtX{ExoPmqMrokIS@d(TiWfW-~ zVIq()HuW|wGCg7jO~TCl%~H+Q&5g`)=D#eyYViSnw$=dd0>5I}Z8eKnLVUO8kejwb z&GGg@4zrGaj*E_)j(bj;PICvP=7t`uIr!9B)TjW!0r0^HxQmw^i56Hv5Fn5S@Jh~q zU>F1e3YL6DU=^gQqHEf??0M-l@G0WZO&y||rU5B6E;#g@T3`5@E3uqJt=02TCEpj; z*MUM&*+`>-_hXTUgivrWUPrpV$^YsbEd6@lNW%7Z>)-Dmb#^GIh2rPjMbDZEsHVE$ zEh;Kq3Zo|f2O;7<@~tp~>zc5X`(m+7RQjeV>za@KY8{6En9{?TBF@Bg(;*HUP)ylI zaWIgHD2YBgn4b39&DB;wVL!`p^o@W2>$8ypKnERg3_|Cr!{tv<*j=iS;06dMCj$-w z1cnIy;1D9=OK*c6P|A(^ut8{D4`Fi*1L$YrmzIkPW2$Klhad6>cF%Nd!oXwg5+$Y5cV2v(v8=fjE~6}Ev~qn3LN zmMAkbN6~Ei07DB;m|^k=!p$h;@%P%N!KOm4!T3&GG2By06R#*)kg@JIOvL8&ir}#} z6~{A~DRw2urm0M(5MN*u7jD~dkZCn<+n5c;m*;Eo_$R-A9-LLkWo)bs+jJXCL$5D7 z)N+H2(2YIu7V@28?h?A2rrVYQXJKktIK!_MWtNBAY9xzrpknv8%W#BEHIa>dQDMr* zzc%)&P`2K!ww?<(tO~j2X(=F+p$@d2G;>#02MCLkbYif@G`flrZllnUL@SUnxEFO3B_Ffry?^GcX0(|f1`WLr%1T`OxaRX)K(oKRP zxOIygzZ=%k&3`c8yrNto1udvod;RaX&g~i!9_Y$1)6JuQf`8IQZh#99WLpfEsg_1u z`8}#77@M7B19Vh|(6=^lB>HsUtV=U9-57omFJ{!ClFk8SC#d8&QjXEsrug_^eRV7J z*ES#Tpx)kGJH5OxKX-!5n^|6a`24Bjzt~z^o}J+ypPOG?IRjdRagQQdL*jFp4N1~8 zw#|z1Qkc}4ihHtYTF0XzG#h$YYa>4Md_N44CUUAXvPtM44*VcWisGB)6azd}!fHt3 zTvjbpO7m(ZhV-C_v(F;p!1wpK3QMtm)VX1W(?05+S1qfKZ6Tr?)n;c1YERv2Y8phd ztcq8I2qC1rL_#DFAtiHwZqo6fW##VXHp{{o-^$XN zJP-eVw7t0{Uq<&=wQ3YO5Gu6AJr$-;A73wx!YOgcTauY||2tkB2pEZ&0l%>>uUd%AO7Q%B&%2y zIi>^=&Vw#Ys|YhzO;vH6WXx{`J#Q7%M%1H7^P)Fcow%s0P3m;cm~J}olFT%$&L|j< z21fQ>cb;|s=ush$sd$L6Jn)%y>fqw91(eU$nN44^^dBn(RQhc&og0#poH zdGmzI)j12HqO?S}%wX~BG79kZpSsWz5}v>X0z9LD7Ph|O(_f1} zM`u94;C&T1w?w7ee*E4V1#caEUeGA+Gu9m^=+FEPH2V&=rujy81%NJwnTpo znhSc<YM;rVH@H5CsjnLueAvB8t|e;F1wj&?t2HzCa&+g=cL=A&#S}+7*IP zwMr-pRSL58)~Y3qpPhwv_eKD{Y&fPd1)|ojTRt*R zrL1bwHJuKxsU(dL*Vij+NN7U?i8V7S6czee|JwES%(7~$r98txNGL&oIFQYXE(ovF zp+GXLu!4G(Q`RJ0_R-TGeaY;UgUd!2tfH6bYjiF329jt*CpM5&ii5l$OT5M~EJ6?p z*THLCi3T1C)Fa@Pq7Y*_Jfo3=^w^?r&9N%6?rlS1YE*WJ%m$-HBIBQr;{v1H@2ROf z?<t0LsOb`BI*YIAU20^M01VBw&$$q|x! zYDKp`v|5!+N;Jv10fA7deuh5s-=IR#`WSp_SX{ zwb<#&#v|p6zg@c5aLygcoGVvEw2ij;>}VPRXG`6A&*KKq{P%HO{{@~d+Q0+^G-ZWR2Re#KG;cZl{Tht$7G}XGI1HH1z z_7HNX7}aDt%3eC4^5bBRid|nwgeq(ivD+IFrnEgv-sJ>1kRcx#LMo z=46nmQrrzFBFT!IG<}AS(sSqzkmf!Qc0x1OU@Z>O+|rpxMUKvGtfmW;NRvsvjImOY zB%alS2rN?ASlgRxv`pw)DT2|RYC%s_JrlREmLm|QQ7M@z$)o}lU=U?|s6P*|=Z&{F zja@h~Jw8GJVEiXBqF@PC>$tx^zY;P$gccM;1;T+p5Dp>{1vv1Vg-HA*1r-O^406~L ztkM3q>`J8$65~P=^Gnd6j2aq9v;Zx&%nL$UbK|9OZSjT zE)j2>6Lx?5pL02RR6p_CmULH((9*sb2bxNtZC9%52P{irtZ}rL_OEw(QaNm*V{3`Z z_^2+wHZcs#YN(g_%pr|qEi=<_`B*@)D*!gQRBhATW6zj1CQO$F%V$N&xDrqu$Ba70 z|F#^>#awP}BoSwew_eUt5xIuMl=!4bNsKnE^8Oq&Sx@);o2EB58(nC7`EhVdZf=vW ztCvGG5Xh=Z?H+H&oXy)kiFhbJ_F<+p4gr-cA0@a9H1IVluOH?as=>)zxkaXtQDTU! ziVg+F@5W1?@iMtuZ;Ow|&dUj&Qx*NXh zrb#Yt4g2p%y<8lDNy1-D0JsVt3-3CMf!o!}((6h!t?wX7d0-Al{7 z4Avx3B7_-{>xwOq3R?B6Z<)RV_VzS1Yp#F;kJ{d9oT1vu1%tLbW0}QGBGIt0|EoZYGx9~ z^qLDIFeGTUIO>bKutyS|u7C>jJq81l4KNI?p;)f;$z5|Gk~GIix<%LMUaC!B&B?k#}@K0EbbvO+=vak&FhTKK*coBu0mxk!b8T#BXy)am=8}wFsv|(b%=~JDH39wyl7+ekJ~zs$&4&_n8Met`0pN^j+BVq z&Oa1Eyh|`I1mjstkZ&^X-e5M~Fx@c^IA0EDgY9Hak0JcW38GAeu&LCsvM)+nK(Q+1 zmk%;$)f&jFH}ON6i^7`m*7GdIY7pjb9nLro?|`v-fF4g=(2p=3wp2ZagiNcg%SLbn zh8ep~G+>@p@JCb|bv|?baylLif*``A-w;y~vc*89JS6st?~rtu#%VF_PaOdT3Y<2o z5NbwnBqaO~4u=;Agn%MobI&V|f7Sa}0nO0g{%;f7C=(1AG!tnK-PJG1QF1lrg1Qh?bPZJFOTyow^BH2+8`t*Wa^z`{~NU?8?IVv+L)M z>r^y1yYTCKwUsN^E?%CQ}xBAIb+ho(q2R~B?JGKt*NQaQ6r$x5K79`f!*U1ry)l!orFsNro{`!5I`6y1W2F+ z?2ao8PqQz?DuMXm%C#9Vs&`TH*rxHfall5%trPNjG7INRKm1uE!wiIc?@Zl^}dA^G9fAP!ytkKiTRN0-Jb5qa#F{f#lte8Efg5TnUm*BOmco9@uK5=^*a zrTYfLb-mIQVe}+yGCQ$wE?aySoq%TNe>SJotLfYH4Nzz*uQ*+4rQhzD2? zP_S(b9*>2B;Z(cshv-4&J&&)q+uT}{uYkM+#yJE%dOxznVTWdQ?M!hEcx19#Pw>cU z{K@&|h2X|usW7={);ZN8T-AAAFeib%_@g5&#aHT*+$7iCy|*hOuB}om5wyqnP_Z%l zunCtOJHaocFAGA11mFD3#1K~kfafz=a51)q!Gv+UPV%-Yx5TgSGROHZqHGL9kjzvBRgxz-J@rg_Ja0;nt778vk+&JpZCi zC39FhBo7Ne-nie9Ze5Q>!k?{!kr0{xW1=dYq6R0j5j9SFBR(&$Y(EeVx|NutRg`|g z2)fXXQ(?x+TIgq5LZ~G=4>g5~C(=cV%8L@K*piSh@~1=TMBr)9 zQiH?0E)yY+)ktH^n`n1Se3RXrBB)F}Tx9EHN95#{vwgEa^`@xtYJaxxu&M1oc6oX+ zJ!|sl`CSRESTq=5fjl?^i&!o3U1z37)2Q@RC*aBu7Q%EG2DQAry*^sctSUqCTdnKz zI65J0i$;ScP}jg16%^3oX1lvxFGAG`MybY?=4DvDY4+H?9_Yj&LddGEXpd|zFiv;i7yTl-veM15L-chCMtC(ZS}pdW8m1%uP!0G^5`Jws zIEdb)B^tL73~$SvTAQYqEFphku$)eV-=8}cg~z#SxuICSljH4l-73i~Y^d?Frh$<~ z=vW|gl(FxNe$b7TWqWFFijFfw#)2r)j%<#V>CD2f3;iA1g6Dfv72dnMRKno5w{#x- zK8XxLh~_(bbmEu`n7pu;lB+>8v2=cYrT@EDl05%hAeYP$^RHeIth#}sI99CM0k>aO zczE35e&%LQ^M3P&j;ZStVlEF|1PhWmWW)y&qZkMh1#tUirj^O~aTRq4tYZH<+$hv# zaQ&Z9*S4?UKM&I6IK2MhTWy-;lq}zQy+OmH;{9Harni>i>WXj(yyx@qiOsv$gXM{~ zH^x31%wFJE4YzP}$%c`cz*Jsnry?TIv%~<7UM4tYiDRK~!YZfx{Vida)lfpUW_w$T z@aE~FVaoI<&u(2jn@96&2j)l7OB3r*YTYm!h3CJZ!^pBm_xsyIPb}Z}&FZkXtq^^P z{zEf#7#%BQeR>JLm40deq@MzrbjF7F^q~WBZE3Gv*dre8=)Iw@V2r~0!}A_J@)m>O zZT5LcQ#4a9#^cFEp-^1-UQp)u@lH$|?~jIq{GP!bM5BgVJd?%%qCe2SH9 zLW292$dt-MzrJ&rx?ncHB?>9##^gycCVO&$M87}NwrPr<&)&!gERmx`CNNAtfPRrW zkdcU@QO|*MjHddry1>vPL>n#&Go6<8b#!TmMi=c-&<-)KQ}DD>kkU;<4V|cMb#zau z;BVWZ5eW*HJbx=Xew0a-GA-FweTT5Q<<}2`F3fev z^Dy@4H#UqhZmE-3X*WPg5_jsKI1YNfA)IVD%$30HaBv#wz|+Ni$t14Y zNCT79u3`|4`Ypj#67{@Y7WAKxinm3=v=>hM{otCe$RearLLYq`n_ykif{Ow|EerBYck5Kk5RvK8vV zOZTN4G)^zNyg(ztm?*tYXo@r!%D_;;x9=n~DU*dCrbPeBgD;}VNYTpKDZlI2J#M!r zIp66%bMdXPj|WqX)yJi)VQl$FB`_+%cuMQji)$pMvW_$t|Jm_nu6R!5??3#uJJv^n z<2nA1j~&%&@Bve;W?HMNm z=q-d=N@kH_9A_!(s_ulndgbS@SwB*9-Xs4d_lm0W+0oAV7e^aY6)~ z{VX=Y{t3}>z{rum54}DKu3Un5`cF5<&m#5)-R~kAJjzii$TWhT%QslygbQP^43^v= zWtPUG2z&~WqKI?>(PM2W0*AqkH}(U(wq_2xvAVRHN9+MA{eJ&wgRwBNfB(xJ;9OBy zo<>^rsuyx%1r_&?a~M;I=v8xPpWl(CYSdZokv z@wC2zs>Rxv7^+#fLi_lK`97Elsx0?Iq zSa-8l>-)EVgO!D)(3&Gi$M-@*ccpnZm8x4&lYTNCpTs}A$RiFHJol)e=8QcY`yrE= z*2v^uMbqUQ!i$?c@wwHTp=3XLLM&L$-FDNi@K-PRmF}Zj@Fz(S5nwC+yS)`nqOPS{ zqqweGp$Pi5I22eyxwfwhu6@Q_^2 z7dP0>Z6pX(0p)4s7K__wf^3E5bFrD({bfS^-H-TvMh&gGv@C zR!3*LpWk$Ow>b$ft{D4)YE3TiQnu_|A3L&nFMT$jlX!EotYMP&vh|-&x#MVQHygYD zH7gXY)+l4io#I&aVavD^j<8T#>!@Vk_LjG%#>-c9V#ebctJ|BNuhPdzvS1a*V_vtA znFOF`uPuHg_j=QN8qpxO z{h+HZ-(0c+{=T$aNFDX_;KU_3=<;|!IVd8#f*^u*%e3sQ;a$l?|=lb*CNS!m}i}!mDnJ|4qvf8qScOKiW`f)}nw8kgdkn?c~*!Og?C!u7%c_aa6 zIaXl~=3oJ2nB%!6yOYYrGOy~EF6S+fkj6oA-U>&mC)sEaYN03TFklYDf=`5izdg_Y z2$xVOEuKTc+6;MljoDp}w+08d`{U2(Pk~?FaNt*C;OT5|P@MTHb*7ExuA$f`LGQNe zh-7-6nQ?zVG?S;OlqG_VE>=VOoQ?d2-oXDqy#u_dlI-_Q?X418w6>c9BsQ>cPe)*{ z{d1~1FYlfd)E5p>L`4Q%U?N;`t@$znBX5|iw2UhWIcp75<@OW5)%c7z&4HlTA+n}8 zCEhNv+JugD%1~=T3ew<6EXY1*nc=+>Do4k?{EZ=;q{p$i3?8hTlWhP&N=#urE}I`> zpD&%vt17|>3F1paF9E7FRm$<+=8G*zvTmhaT# zwC|f&C-aC9q@f>4n&?JWeAC?XEnkt%sMxS7)q?vI=|Jq&t5rcyh%#hg9EIi0fL=Ks zAwm1oR_U~pmI`$1Btq|P9O_|M#)VWm2DKI($lcYqA6UR!M zoUCYz)ND;+ET}xiWoHjg8=qv;$?Pu0PD?+ZOwosumBc@HHcq7E4w6i;`FrSdg43hk z-%7y+bC^DAqwxOr5s=M}32A?*(yYNc~+UNo@pLOrw~CEP1gAHjeTh3m<* zxAh91SmNX2)G5)d&Z?6t&|;1a9@+Zl{6V+?{kwFQyZN)S?CKry{4nr+&(W$E)SG6# z2>*C33^lB2#~2JrU`5F#>I_<0RE-fjCpB2eXEHJJDvHPJ^>~zsx)pCA5(#*Hf4mqB zMWT_n7mb1?d-@I)ZIxZA8+zLxX@6>*N_LJefytl9{?l<5`=?6o=zXRfpMbxU^$H^u zr!g4XYXwViDo(>CNaK`B%}zxr-k8jB=i57iqe&@N$gG$&z8Q*UwI5F2IM>^sFT|u| z^n7PW7dImz31FH+3gHM?im&8`wHhLugPEn58dwC7ATiuY?JNy&O<=3YWs zGDSQKHaw7>f%!B1JQntlNAu3bvn?8|YZGk$GwuqK?_bDtstXwj=p@mqOU~sX_=U0X zAk=a-0a}`;7mG1pN6(xUTV_>Pnv9}L)ENEd%EBDaQfjHrOKm0Noc5dHM_a*2WB2iz ztk!N_$sn8w(Jf zO7HKY*Opo)z(LuB4i#uWx#oX2TgK^vh=`f*+NkQU!*B=b*!m~Cq1){#lQe}ndXAUB zL}nI-c)Y`tT$ZX7mp^~DX@@yX#U2ny>dQPhZ1IIAy&3;boR*;b?(qUIYkV3i8g9XT ztlbB5iGT@?j)^p7isA6cjxY+lS*s@yb2P{`A3|f;j2%7P%dE1i_pf!$QqBHtN!m%FvPM9Mta(oiR4xHm}?{)Huv;mG3Js7~kM>LCbR)t96qpw`+~J1CC- z?rfMgr`yP7{Lk}??gZCS&`$cy*ID3omB6`dWc%QrDLK2ArZb@x47I|V8>wcZ&;xZz~4qq+=~;2#fy)zEd!iJu#sv#whkCu08zr)bR{n2vm8syXCFgZrN4 zAI%bngQ%!nk|gv}w$!lyzg|52cm3kIt^0ScpE+@1V`F_C^e83t#n~UcCN9oP{zvz7 zL#WCEH|x1`?dFE4xJlP`gae0jIN+h+m($m5xcmC`-O(Bb`1N-9;EoHJ8%Ku*`UZGo zoFBV_1$c4)zAKnxu7#3=QC&d~O*sdH$-!ydXZHtmf!wFWC};Y8=M%pT#u@FewY4xw zL55NF+w%rPV0%ghnGZKg>mx zM@?8Ie{JoLSy-d<3@I0^_s3dUPp}PL}o}$Z*|5Q=0aJ&(AtORJh)F8LK_=!W$mWl!8JQY zdEv#924qRyKXbGq8+DjVjQ*%3u)WK_$ct1xNAAo^gfEB9TTrIz4dJk-kUnOPJ)LKa zo=^sw_4R70=(NNNA&xH{UVNP8;RoTPXprG0=Oa%?!xvR~cxH3!&RK2+@v@`W@^%Fj zt99;h`BR)-GuNl$5{pACGF`g4LSdUY)~4P$*tc!jIu5eo?IGQ0o7W9PlU=yc!H^?# z&0LPNp54egQ%tq+>^Lk(30qEeTq2GIh9r4YQ&mMS7GJB6yJ(#m^THy%I=7i*D%4)<(tev93!in_ErbIkSa{ zGhVdG$E+d%=BEs)+CP8Lb{6HD7%sy3xDrKNP-`5B%%Zqt zx8pCp-j&YfRSQulw7*U)HzuHp-L5=Mh5z%@{6_ZoSlO-8A0ubA2y1{VQmBv ztSj)5KTWfohuh@(qYLPonVBMcbM9!+crqm+Tkh|%XW|8^u2lOnad;^I|2?Pv#T0%f zs$TS4B5eWzbyPNgk@4^n5-N$hJzack06wQ$P#TbFuYg1TV>E~1g@w2*BaUzo4B=qj zOd^r

t(&?w!zF}RL36mRM9a4gAR8StlxI_wFlP!Kj9qT;ce|2p5B*3@@(+q3iW zR46DR<;3%bp4Nc7HwbNN{9%M_ku8IyR)^F@c6(rw5scXyw%JxR1Xiv839IO~ZjQ68 zcq<%~8HqKzz;{~G&Ns}HYUx4LLL^VwjFR=sL_88VHA3$HnU(^~+Mt_Po|9|E6C zhXB4u0_)MJozQES_1OOvuj|oi89;`T5GIK<>K_iyrgo?rLb{<-3$CtkXn-ZUCP0qk z75*3j;Cv4v#ID)$I}&tCfv$p;!U9$eF|SRAZXC`zHArt0=3fo4AEW2n&Dw z@!n%zo0t=?ol?%UWWdyXDxm|KvHi=Ao1_*QkRdbTgzr4W~ z#IkQFl>?0u+e~(DT>JOVxh%Dpb#(1mx=Bip$9kJyy-G~PfJufJfJMv=-R>XlU^h@> zxj6{#%mp@gzvWDS$BdQW%1~#07puFPiRO2y-O|3BDctEZHZnm*p#g)o$^9Hzu+c_S zdjun-$V#}=#zCm3s)B8|QgL*LnE};Yuu2X3Tm{}hX$cfI8-y4@V({3({G5)d(r((> zUHN>0tj%7!VTcl96hq(uLtNHG*YS|}Q?#>6X#vTk5;TR{P}9E}-0?67(X@}%Ok|K= zy(B=>vnIJk1wO%iExH!fNTw>iRHZjAug=D;w_9bY7V%x`=WC}E>tk^( zM(nt47=HUlp6`z2G6F=H3;2g%VSvZirw+p7i*XhDSX|Ce=4)~f`y=n7wlk_?9*SX* zm2?(VD=t_S+%Jf4i$=loW&ghXjgW(D@2$jxxXo4_zd zv37K=F5lR>8)-i2DR?fu9B!o_0slxFVe6hFU`HG)a2D3c;!2Z88ccyphC2vdk{ykF zLaZ2uXy==S#uD)@DkxpW1VwKYs*%_4>jBK~ug6o8K^`2d@k=9vs(sV!{p|kL)~+#! zBgYATv53$^j;lC{THyy3?y2ablBGwsKY2E5E^U8g@awPtlzTM?vW>lqxsW0ElKELn z7E9d5-yP5)Pn@prS)_)Jp-&;#YUzvy*r$@TsonDP3YF8Th2$T&)s5G({mb|EE?#;v z=TG1J@}6Z;{_(Z?A0t;nSGzqtXmru0`tK6K(@L&YXObtCfFc?@BjRL64Y%`sf>1MOVeXO z6zK7%)|vP@cX_jgHtG=azuUq3=^FTdQG}+J--HW_G&ELs*Fb$TTPg&PMtVv6T6H95 zV1O@z9g$L2V{}-s$xg^9mQeU`s&bQST*8q}*-H)A5J0cmfuR(z>;0kV;GnYie5y|i zU_*L8`2TbR7)=L2U}d`}%gK4kXOrmDgC_OKk>rtNaT|e?(1R;rL(ky3Vdi9Tu9t1P zT)&W8zhpOroXr)o*m*T=ikC{c&J|3I@lZ-+Qj`SniG23vzJ6fZXgD{`IHhhsJvVKq zsq(@J&5Qb@znl}Bu~*#Lay?)cgr<3CAtcw@kh z{j2x900R_W=GefAn!30&MnVFQ-s^S z>m$U@xvL+XL;*z=6tx|Tms&?_tprMv_qIqxT&hTN4R3D4gh^Pmr}OquizpnYK<}@6 z*WhCr4&%LMzM~?RIyj^f#isvn+1g`CptWuqHy_sXsMKp7eqm4B!{TkTR+toAaV|_u zHrO$4hIiD=TTCu;mj619-uP5v9HnV@tO_%1{cuz?CGeU=G56kby{yHC-a8j`*uAq1 zZ)L{@g!3UYB1;4UwI(YaF2aSl8a&SQjeli?VOT|ubN=HBY=K$pio2TNi)B&BB*OccbC-=-+Bm! z&F-H(xhy$zZRaONfvuNEBG)&mCu^EY~M)<@%1M zr$bbWoZ6GR#{NZi*J3^W_s%j5!iKUY4E?Z)vGkfvYll?{lBXp1bkCwav0xMe+!BqnK-i}_29H`tOK39C^1s+-TSSFFRiXUqYMiOwg;5P%dw*PiiKAMVHKleJwxT;LpT1~p(=T>pt z$;3?id}wGWc%+OrLH|?zxn~!uAX15FWHtn2+gXv#WC_c)Hf%EBd@%>#xzrgA5nufh zPl)edO#rLAOE(6Ld*S1?vR;H%Vh_gt2ap3$A=qLNNT#2$>h>{s9*r@9w5N50uhnY9aeZwW3Kir|$ zZ}+dR5hF}hge9XayaJLEtZK!udT6h0tn=OQsz3f=sQGdQpJ^0wz9WO_ zU01s{-?qs>BX)Yxqwb1p6KU_^YL@G_Zf&Q5KuzM1sRJtPg@^QdPHFAL9du}DuagK` z8F;hi+^Oh6#9$7WlntF<*> z4q!q{ZBFEu)|o6&Cgg0?tmVkMS`ia-B`86=!xId7KsM~vH@sG>HyRCyiN`%Im%@)x z(4Z26&3kMZOlp&?_@Oj12kV@oV%+n(x``n2}0A^?7vU5C;r&!4JgRwGz z$}p%{ke-0Op&)3ueK>pSWON1L7t0lUwTDMd1|44%ppyVlEBA>yg4Aw(=i-%i7;(6J zbWOu=0N@ptCWeLEfQ!dkVD0m@t8xeadX)?wlS#ODa_&j|28EB=3r&OtisFlorkcd* z8qL-IV}4liQ*cMfRrN&yl1hL~#giu_qLLh2$C~n$PNi_T-e*wI0W_!tq*n!6!cS>$ z(Q4#|xfG0P1p^U)j8)%~5t3WiayZIN%ZF+6W^!gGaNBY$)oK6Qdwg^4(7mM0{oTj+ zp8u#F-+#P&Z>{O;;ig)zTAPfJRJfMQz3Zc$_t`$O_vq4TFK!>4ysCwS&~lsSaz+N3 z9I5+zV|X8+(6|FzuJh5h2_-U9E16^6d^lvj6r% z@MolL-p(|uc!Kf$e|WE3V-qF+=lQtns^x9s#i?WC{_5`s!-#|=y4Lr{<~78hgE&m`>N5LiG+}yp~?CAbyoc@Y7U&1D?KV5U`=;BOY6oO*Kvk z-bMgkyHiK*!fXG0d(-$*z2y-?Dwni9*F^;yhi4qlemZNpkp5vC^_%FV8D+Xa2C`U1 zDke)(xG?{?)-YTIh|`?Q66sAL93BQ|c%Dvu{~VX?hAkZmC6($4{8jLyx|xN@`cC9inCwuJokI>10pxg`{Cy8OPx?+=UR1 z^J})7k$HwH7T83bQV>S$<~<9q98n>QOofUj`4Os6W>`xqud#m2rV?x{#rq?Cbf`K^ z(+Qfkf~xN~MPQ6tAHh6Rq{?%JM=>^eSP_|vr9jFqvq~t0o;=&$9DQt0b(Tqx5^-|T zp^do6U!rPTvnLppW6QB$8fwB#uymAG!%?snP#=Y zR@G8Bb;No-cCCzTvIf$_b~(PfVw?FbA~O;!9eK^Btg0(sIFR0<;%r*uQNIlD@d9=h zUf70dl^xaim~bl7IH!$esQp;P!La`Mo`2sSiL#+!tg%g=V(QY#Ov@}Y=(d-2d-U3{ zH#|6`^~j-Ni2ZiG)YPE6sC14ovcoWPvV23qyBFzG9c4J@-4D4U zy?dfOU*Nc91rmh*9Z%ZY^2OS$5#+V6nt%t8S*N;m$=#j`D>Q6FDc(Dmq zHtCSo%>c1=T=72&eq|AD@VI24HC@r{z_*(jO966}_3Je7t2Cfp#UY#*o6xE6TV-L| zFvEX;&pl!mTG4}jG#+#Au*{^8lB_a+9Lai@@l!H&_>=rpX7nJFEe;m^!3|sY#49Xsue8W$jcY*uwUz zfGs#aJX*vi^#%L35u5~hUn4XC!8)^o| zn=&3?p9=Jx4gc>~sOuBf*M(~v#rjS`BprW7`Epvs7+PIqFfCyPlO?xdTLwxWO+h0v z?4;ISM2>EuvcDFnjZfLG#ONp(?8j=O6D4vucWQP9D;AZyRvSyg?^S7-qU{=T=w7+i zdw_&`bYf)t7!Y#rf|yPF*$=14EKQpXj}syXpVEKzNH#VeE4c8?6LU(UQ75o-x`p$prmLRH<3Iy@4885xipsQ zl(euYa@|C-ZJ{#9b~CG!mAx$XhZ79iUhcX_F9a<%O0pP2+!DpX(me7T+`oZ)sPo&( zAggm82P6u0sJ@}RpcpGAaqLl@CBCWJ9G;zPML*t9P@BVgwvlNAKT3bF)bMA)c>y|e zRo3es4&xK6P1_pD~Yoq^{x1T^|f%ITOI&-El*=v zvvTR^l3|1CLWdzcBc5hI`@OX>>;t&4-2#|KByvf93&S*CPJvqe58UJFYu9x;?yJ+l z)NdB(ZDEL|*o#Jp+N2U@hSFGY2VqW!ykN)#&@Gz`npQcaw+@1x1iYvw-;O{-7jZm2uU49ZP%L!_Hb!H_z^H97}`?j0PhQc{kH@u{TCBs zfHH-|St7fi`mglPNM5}}h>q_VDVk30(_9Jy@N1Wq#Wn@C23e^QvZN$X1|=ka&Lwk~ z`+opkt!^pGs6ss-m)K3iNPxd+duS!vsMT%>6uv4o!NGjl+KL*Ha5`b-XOA znI^!PA|#dCq0U0}pUt@h;G*3f_7dRsyX#b@|~0S@ToKk=4m8 zjj0RjR!7}Hc3wY8LFS#)&UNkHac0U_R1yj>-vMYpp-2^ecw<6-bBszb-!VYH42pw3 z_CeF1Qd=KMdlWo>Jv=^T>nm!E3lKBlX&9gK<2R%vxbE^$uQ7~PvX{Nr-l=?UT8WVuX_w8_150KV!}5=eBPG|di&1O*B;l=j6KPyRPGoy}=wXIypC;<~tRx&@o?a^B zBEX}Hgj1`WdaW->;eAm1lH zA-^EgWaWk4pCg3!B*y4vI*o$y-JUZbB=rWitUCl2X;6JhI&$^mnbGK%1I}~xi2RFAxyg6^n5R(PLf%% zJ(zxOC=aI@6TmNsA_?+4)%Mu_f}r4l=s9XB5&(~bAbvCAKT z;%^6A8(nzY8_o&6`}E;zv0Yc8pWZ6anIss@SXm%GC;JIH-O1tG2jxK26^t=3FAlO- z*;!F!^_iA)sw+5rjvge62o|>Pv1#;>j>DMgNFgAXA!ujkndJtm$<1190%OHCU9^3k zOB@+ahZB7?LbR`e{TyoBOL5+|ErZ}NM?181*0Pb7s8cXYM{oFc4Gfx%h9+dDAoNzt z-i)y$M002aX{ab>BuV5sHgwT3rIW=XN{l&WIg2oHEX}*bnjvtYoQUI0oVEIY=2BSq z8`P}BQs&x=CzB6HWFJ}`W2wx$LBe)zbe!_S$4;ZN6xq-W)=HRNbzn%(0*j!!SOgAmmq}W<;m@auE>zjDvH3+ zBx;HXX<;< zRoLJT!x#m9jFBOd0Y^37#v083&GBJSV)d+h3w~D?kvNiCQ754J5-OmX0_F#FLX`NHQn~5HdvHAQR&sS43!a2D*k9ftIujj8EMid z^8~Q0WOoM?aoZ&}_oBd$BD`M-SuDJW%EDT#u0V*F6h&fqy9|jp8Lb;@YjP9B)P3cl zn96b^6_Z5NS%klfW;o{(h+F`n>h3hpj0pp1O;BFip(x1|2y>y_YL!60NK-seolBQ~ z{ga1tf$J~+_*?3d3jX4)TqSs?C3hWHF^4xuTHe(brCFrtSD;I+;iLIgM;x7GImqXESsj#$>TwVDu5md#0YzSo@IU!1?Rt0X*MFI&bc?3wT2PwCVI|lL#cCb zJvM0U3@|3}|8*v?^MiA6_Va~VfDfI601vQN%W&Z5-p^h`u>d44m=}IzxniBm5|FP}!Un{*C1<25RFSFEzUrY7h4x{-3E+Y2Y z$uDnwx8ZMrd5h|l_|{vz{4k>lj)qljY0XA=l^OmOcS%Yn7;cyc*XCmVrx%%*M~l*X z%-#5Y0Wkz_{Qc++>c+b9!7G#l8XDBm1e3IG3Nx@ya%B)ms|TpqJwDGS*CEDqDon|C z0}NVdo2AAjIAL;$dkT?Wf&!&a0oCNbx<6J)88K4ic$?)y2d za3UwWNq%s|>>Le&)ab?MbcX(anEC!fW9+7#KC|EFb#c#^&g@-Bo|}-@o&N7AKB-&g z?z3!5CJiG!!q-SU>9~mxGp1qMGHeokhiM(P9o>j`FY81@ia^R?Fz2jwZ{>fQjl+U) zfCb%9C(2q^k*&^Q$GMD_0%dtn)$?NR5DC=)a7JgS0b)oQ0X=vc_SWt2c$|U*RPf8r zD&9gF3!XeD&Nv6x;3k}dbG-VvwOLhBRBY*LE{7vv3%AA3S?o@;ouwYjc z9~6P_;T*%nT9;3|>PQe+tvpt+ABpf0;yHtx3wxPE1KiE$FW(Q!)>S(f7Dp;!+K;T> z`9Y2Oj(j&e)~Bxw4D?`cPgkS()=J&VzW#6L?)nKZq2zqh#u*iH9n6h1GfPT}W8re2w|0v$7Y$epaF{+yJKv<+d=TqB001_LdlF}E*Y9@>Omv+f%Mf%c zI5xI8S{yhYwG)_5$=B|VAWa8Da?K#F=2jSD@gbWwsVZ4qKE?(IDO93H~ z#s&j9K_V<~M824ZlBP_3svHhIWS2|MQ-t7`=?6HkRErqDEj#D_mZ>k*CRwGy1gR#D) zt)KOIRmK69;8+NecSe0yE380&W`tVlO2y;REWphZekpl>Bo3)l9ouKGx>bXuh|E*}RX1b8{T3NE6kg8vgkn$FBJ z1CN+5z&QNT8?>}JFP!8$cA$F7lkn=;{yI1f3b3CP7Bt9SA-f79Y$1lYz0_xu;{lIO zl7L=wQ#8(41=pWrF7-27yYPMbx3{MI&?-q(=uo0P)x(2y&tm6n`th|JuGgNkgO^d7 zduO7tgDf9=9YB&6;(>;$CD) ze+o`Hdg!uL*`!!SIrC3^gm)80tbBlZnc^LE10@M0NqI2Hyh>k!!~ODe_$Yq?J>Gr1@$>S|lgyda2zBn`BZ z6cAR(fPe_9yoHLaj8d94E;+CYxzN;yTvo z9JZtU^EB}4>XEIVr6n6{BJQq%_nl}CpPv1qs0)l(ASqv4oU;}PK73OUt1gVFt@ew*L6%}mgnk>oNs-&v& zo%Mg&_`oi$&X41fg`OCvDiLJ>-YuDpum}h`<>LfPsYdi@%$W#*##i)$0`0a#=v8UX zcas~k58UrqxjQ8b*NcVT8o$<`Hdq2~yv*Q@PTH-**fE1MF)QK@artHcLLv@&mrVZ8$BTS{!PNEK5Xmwj_PagQ=8b0~~i6J2Cv z<^`jCpV)oM^+0i{iby9u1^0@^1f*aT`x zf<0WGuV#oThQSx20TVZr&nOtQazpD zb?D6XHK|bCUxeHw_FsBPx)%!twVmU}`M8}U_+6LpVY8e+A^A}~jFqBSE`6nSmIiWJx7H)Ef^1v|ztwOq zr&6EbcaFnBUeoLBN0;o*t!uc+@6!+DcGV|e0@JR$&FWS)I;lAajEu))pPkOAa4P0xV}T7R5-M8jRS@BQNB& zp1eI)yQMoY4*KM`wAd%^cOB|`El1hoO)WWQT4W*DN$NOM#}!=yYKtmgMZ!;1Assm; zqtswdCJ@#VY@vA~Zc4=lTTW9DoR-gVWH#)KRh6yC)jXFIz!ZbTVI44ZqZ)2dSIy@VEcL072{E#M-`FR)jC|3M8k5mwm ztn#?eUaH$w0AGqIvaIC5FSdX(m+l8gi~c5xr3h`Wg9sQDslo?OBv=^^1niR_tS#!b z_8vz2c< zcnfE5*y*iYj^&P*M&6OOQ^rRS`k}@Xz_&k|tZt|q-gZJ<@;g7+ZPRy;x|@nU_lL~; zIdH(GOs>7?aJr|)9WIw6+-6s!gIZBszZCkwy(CW)dxX=D8{2>Wu`EaqD`M?rFxJ=R zUrY@~vIYfJ5_yJ4n1uTVBbkd%>q?G%NQTHk8ls4XEpS8-N1^6AWx4PHS%y+eo937g z4xHvzFuFLSpjsiDbWwj|N=25V%Txbn8Sb&m6n*QT$MY8bbcwO>CyTi#+c85V7~Sbs zsVNI}*}QwhiN`JvAKH()OpSWA^|ay#Qx!xWO=p+zf&5|kK_t{+cqx(a7JR>Vjo)uG zeLo|o-I}8CBAzhci|8e zAVcK*l>_?LwK!k;Q?S|9E@-0smHy>%`j2 z2YzK==wv+K@g!bDBi%c zy>SZgjE`N=r~j>c@zE2=Z(?_x7-WC|&fCN0;-%T~rx^jlu^*-9sq6Zw68*l3w~Iak zU{G+i!1oXIi#`8i^$9K zV6sMP3jAYNYKLe+(u$s{cQm%Ywb44=jW+a52qix_V=v;+D9n*_T!#p^jwdIq(E9d|u7GS&WXB+GXd4PHl;Did2 ztaYrO8uiMo8xTY+62K&o5>jx`mxVHgO2nSIODE8@jByQF4GHT!(ou?cx>hBp*VL;^*&^1aN(WpkzNJ#Gu~@ z3-)g!tbJG%VQ4Y55yer)zyIqK3?`)=PtZ`5mXuO9B`u{^L&2+Dh%a3vuM8JQ?lKWC zbCakbYE`kE^3N|SvE3T1wr8SvO{vYU z4D2J(&%bw|b%>M6r6%V4j=+>%u@;eu5Iqm0Sea7iW-aN;rgT&;uRP>@M-2~^>Rha* z^%_M>3rk8r%?2Ahjt!Sw!HIIYY%76_NPNQ~$E11rCCd!V5K9&o5(qi=mmZas8fN}6 jt=I#0(q~#+iJ%-cXoR>VS!%`OocVeEghBl?ss{i7_cKz0 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9a8d1e2b5ef22b97801781478d477685dd6119f3 GIT binary patch literal 110160 zcmV)XK&`)bPew8T0RR910j^L06951J1C_)80j=5q1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..07d3c53aef14e7e3aec6b11684395f2833e0b3d5 GIT binary patch literal 67792 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 IZR%D40KZ@npa1{> literal 0 HcmV?d00001 diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..57bdc22ae88555c6217307e4064a642f83d642b1 GIT binary patch literal 14072 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 literal 0 HcmV?d00001 diff --git a/assets/store_plugin.md.BMBIhTm1.js b/assets/store_plugin.md.BMBIhTm1.js new file mode 100644 index 00000000..4486f4e9 --- /dev/null +++ b/assets/store_plugin.md.BMBIhTm1.js @@ -0,0 +1 @@ +import{_ as t,D as o,c as n,I as r,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"插件商店","description":"","frontmatter":{"title":"插件商店","order":2},"headers":[],"relativePath":"store/plugin.md","filePath":"zh/store/plugin.md","lastUpdated":1725101868000}'),s={name:"store/plugin.md"};function p(c,l,i,d,m,_){const e=o("pluginStoreComp");return a(),n("div",null,[r(e)])}const g=t(s,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/store_plugin.md.BMBIhTm1.lean.js b/assets/store_plugin.md.BMBIhTm1.lean.js new file mode 100644 index 00000000..4486f4e9 --- /dev/null +++ b/assets/store_plugin.md.BMBIhTm1.lean.js @@ -0,0 +1 @@ +import{_ as t,D as o,c as n,I as r,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"插件商店","description":"","frontmatter":{"title":"插件商店","order":2},"headers":[],"relativePath":"store/plugin.md","filePath":"zh/store/plugin.md","lastUpdated":1725101868000}'),s={name:"store/plugin.md"};function p(c,l,i,d,m,_){const e=o("pluginStoreComp");return a(),n("div",null,[r(e)])}const g=t(s,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/store_resource.md.CfhqcpPi.js b/assets/store_resource.md.CfhqcpPi.js new file mode 100644 index 00000000..c635cde6 --- /dev/null +++ b/assets/store_resource.md.CfhqcpPi.js @@ -0,0 +1 @@ +import{_ as r,D as o,c as t,I as s,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"资源商店","description":"","frontmatter":{"title":"资源商店","order":1},"headers":[],"relativePath":"store/resource.md","filePath":"zh/store/resource.md","lastUpdated":1725101868000}'),c={name:"store/resource.md"};function n(p,d,m,_,l,i){const e=o("resourceStoreComp");return a(),t("div",null,[s(e)])}const h=r(c,[["render",n]]);export{f as __pageData,h as default}; diff --git a/assets/store_resource.md.CfhqcpPi.lean.js b/assets/store_resource.md.CfhqcpPi.lean.js new file mode 100644 index 00000000..c635cde6 --- /dev/null +++ b/assets/store_resource.md.CfhqcpPi.lean.js @@ -0,0 +1 @@ +import{_ as r,D as o,c as t,I as s,o as a}from"./chunks/framework.C3o_UkTa.js";const f=JSON.parse('{"title":"资源商店","description":"","frontmatter":{"title":"资源商店","order":1},"headers":[],"relativePath":"store/resource.md","filePath":"zh/store/resource.md","lastUpdated":1725101868000}'),c={name:"store/resource.md"};function n(p,d,m,_,l,i){const e=o("resourceStoreComp");return a(),t("div",null,[s(e)])}const h=r(c,[["render",n]]);export{f as __pageData,h as default}; diff --git a/assets/style.BNCNLzKP.css b/assets/style.BNCNLzKP.css new file mode 100644 index 00000000..6ba0902f --- /dev/null +++ b/assets/style.BNCNLzKP.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-2cfdfdcf]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-2cfdfdcf],.VPBackdrop.fade-leave-to[data-v-2cfdfdcf]{opacity:0}.VPBackdrop.fade-leave-active[data-v-2cfdfdcf]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-2cfdfdcf]{display:none}}.NotFound[data-v-868b40d9]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-868b40d9]{padding:96px 32px 168px}}.code[data-v-868b40d9]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-868b40d9]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-868b40d9]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-868b40d9]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-868b40d9]{padding-top:20px}.link[data-v-868b40d9]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-868b40d9]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-75b86f7a]{position:relative;z-index:1}.nested[data-v-75b86f7a]{padding-right:16px;padding-left:16px}.outline-link[data-v-75b86f7a]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-75b86f7a]:hover,.outline-link.active[data-v-75b86f7a]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-75b86f7a]{padding-left:13px}.VPDocAsideOutline[data-v-be1126ba]{display:none}.VPDocAsideOutline.has-outline[data-v-be1126ba]{display:block}.content[data-v-be1126ba]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-be1126ba]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-be1126ba]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-65ef6f81]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-65ef6f81]{flex-grow:1}.VPDocAside[data-v-65ef6f81] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-65ef6f81] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-65ef6f81] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-243e2690]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-243e2690]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-e27a0cf7]{margin-top:64px}.edit-info[data-v-e27a0cf7]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-e27a0cf7]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-e27a0cf7]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-e27a0cf7]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-e27a0cf7]{margin-right:8px}.prev-next[data-v-e27a0cf7]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-e27a0cf7]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-e27a0cf7]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-e27a0cf7]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-e27a0cf7]{margin-left:auto;text-align:right}.desc[data-v-e27a0cf7]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-e27a0cf7]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-4981c415]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-4981c415]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-4981c415]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-4981c415]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-4981c415]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-4981c415]{display:flex;justify-content:center}.VPDoc .aside[data-v-4981c415]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-4981c415]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-4981c415]{max-width:1104px}}.container[data-v-4981c415]{margin:0 auto;width:100%}.aside[data-v-4981c415]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-4981c415]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-4981c415]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-4981c415]::-webkit-scrollbar{display:none}.aside-curtain[data-v-4981c415]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-4981c415]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-4981c415]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-4981c415]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-4981c415]{order:1;margin:0;min-width:640px}}.content-container[data-v-4981c415]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-4981c415]{max-width:688px}.VPButton[data-v-5208c6a8]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-5208c6a8]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-5208c6a8]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-5208c6a8]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-5208c6a8]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-5208c6a8]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-5208c6a8]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-5208c6a8]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-5208c6a8]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-5208c6a8]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-5208c6a8]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-5208c6a8]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-5208c6a8]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-6e911b93]{display:none}.dark .VPImage.light[data-v-6e911b93]{display:none}.VPHero[data-v-4963d475]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-4963d475]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-4963d475]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-4963d475]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-4963d475]{flex-direction:row}}.main[data-v-4963d475]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-4963d475]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-4963d475]{text-align:left}}@media (min-width: 960px){.main[data-v-4963d475]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-4963d475]{max-width:592px}}.name[data-v-4963d475],.text[data-v-4963d475]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-4963d475],.VPHero.has-image .text[data-v-4963d475]{margin:0 auto}.name[data-v-4963d475]{color:var(--vp-home-hero-name-color)}.clip[data-v-4963d475]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-4963d475],.text[data-v-4963d475]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-4963d475],.text[data-v-4963d475]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-4963d475],.VPHero.has-image .text[data-v-4963d475]{margin:0}}.tagline[data-v-4963d475]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-4963d475]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-4963d475]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-4963d475]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-4963d475]{margin:0}}.actions[data-v-4963d475]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-4963d475]{justify-content:center}@media (min-width: 640px){.actions[data-v-4963d475]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-4963d475]{justify-content:flex-start}}.action[data-v-4963d475]{flex-shrink:0;padding:6px}.image[data-v-4963d475]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-4963d475]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-4963d475]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-4963d475]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-4963d475]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-4963d475]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-4963d475]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-4963d475]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-4963d475]{width:320px;height:320px}}[data-v-4963d475] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-4963d475] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-4963d475] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-c6ed09d2]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-c6ed09d2]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-c6ed09d2]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-c6ed09d2]>.VPImage{margin-bottom:20px}.icon[data-v-c6ed09d2]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-c6ed09d2]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-c6ed09d2]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-c6ed09d2]{padding-top:8px}.link-text-value[data-v-c6ed09d2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-c6ed09d2]{margin-left:6px}.VPFeatures[data-v-c56833f4]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-c56833f4]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-c56833f4]{padding:0 64px}}.container[data-v-c56833f4]{margin:0 auto;max-width:1152px}.items[data-v-c56833f4]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-c56833f4]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-c56833f4],.item.grid-4[data-v-c56833f4],.item.grid-6[data-v-c56833f4]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-c56833f4],.item.grid-4[data-v-c56833f4]{width:50%}.item.grid-3[data-v-c56833f4],.item.grid-6[data-v-c56833f4]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-c56833f4]{width:25%}}.container[data-v-2763ee34]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-2763ee34]{padding:0 48px}}@media (min-width: 960px){.container[data-v-2763ee34]{width:100%;padding:0 64px}}.vp-doc[data-v-2763ee34] .VPHomeSponsors,.vp-doc[data-v-2763ee34] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-2763ee34] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-2763ee34] .VPHomeSponsors a,.vp-doc[data-v-2763ee34] .VPTeamPage a{text-decoration:none}.VPHome[data-v-ceddc1ed]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-ceddc1ed]{margin-bottom:128px}}.VPContent[data-v-4e31bbd2]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-4e31bbd2]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-4e31bbd2]{margin:0}@media (min-width: 960px){.VPContent[data-v-4e31bbd2]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-4e31bbd2]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-4e31bbd2]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-098a46ae]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-098a46ae]{display:none}.VPFooter[data-v-098a46ae] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-098a46ae] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-098a46ae]{padding:32px}}.container[data-v-098a46ae]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-098a46ae],.copyright[data-v-098a46ae]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-5e8cf508]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-5e8cf508]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-5e8cf508]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-5e8cf508]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-5e8cf508]{color:var(--vp-c-text-1)}.icon[data-v-5e8cf508]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-5e8cf508]{font-size:14px}.icon[data-v-5e8cf508]{font-size:16px}}.open>.icon[data-v-5e8cf508]{transform:rotate(90deg)}.items[data-v-5e8cf508]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-5e8cf508]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-5e8cf508]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-5e8cf508]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-5e8cf508]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-5e8cf508]{transition:all .2s ease-out}.flyout-leave-active[data-v-5e8cf508]{transition:all .15s ease-in}.flyout-enter-from[data-v-5e8cf508],.flyout-leave-to[data-v-5e8cf508]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-b8036a12]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-b8036a12]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-b8036a12]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-b8036a12]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-b8036a12]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-b8036a12]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-b8036a12]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-b8036a12]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-b8036a12]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-b8036a12]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-b8036a12]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-b8036a12]{display:none}}.menu-icon[data-v-b8036a12]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-b8036a12]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-b8036a12]{padding:12px 32px 11px}}.VPSwitch[data-v-b19619af]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-b19619af]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-b19619af]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-b19619af]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-b19619af] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-b19619af] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-0f382965]{opacity:1}.moon[data-v-0f382965],.dark .sun[data-v-0f382965]{opacity:0}.dark .moon[data-v-0f382965]{opacity:1}.dark .VPSwitchAppearance[data-v-0f382965] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-0a1958c9]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-0a1958c9]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-19363427]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-19363427]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-19363427]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-19363427]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-e815e7e2]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-e815e7e2]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-e815e7e2]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-e815e7e2]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-0e22c6c5]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-0e22c6c5] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-0e22c6c5] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-0e22c6c5] .group:last-child{padding-bottom:0}.VPMenu[data-v-0e22c6c5] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-0e22c6c5] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-0e22c6c5] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-0e22c6c5] .action{padding-left:24px}.VPFlyout[data-v-12ec5ee2]{position:relative}.VPFlyout[data-v-12ec5ee2]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-12ec5ee2]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-12ec5ee2]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-12ec5ee2]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-12ec5ee2]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-12ec5ee2],.button[aria-expanded=true]+.menu[data-v-12ec5ee2]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-12ec5ee2]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-12ec5ee2]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-12ec5ee2]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-12ec5ee2]{margin-right:0;font-size:16px}.text-icon[data-v-12ec5ee2]{margin-left:4px;font-size:14px}.icon[data-v-12ec5ee2]{font-size:20px;transition:fill .25s}.menu[data-v-12ec5ee2]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-974e0aed]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-974e0aed]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-974e0aed]>svg,.VPSocialLink[data-v-974e0aed]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-52782a78]{display:flex;justify-content:center}.VPNavBarExtra[data-v-c34ef5aa]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c34ef5aa]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c34ef5aa]{display:none}}.trans-title[data-v-c34ef5aa]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c34ef5aa],.item.social-links[data-v-c34ef5aa]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c34ef5aa]{min-width:176px}.appearance-action[data-v-c34ef5aa]{margin-right:-2px}.social-links-list[data-v-c34ef5aa]{margin:-4px -8px}.VPNavBarHamburger[data-v-6a2ed68b]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6a2ed68b]{display:none}}.container[data-v-6a2ed68b]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6a2ed68b]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6a2ed68b]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6a2ed68b]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6a2ed68b]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6a2ed68b]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6a2ed68b]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6a2ed68b],.VPNavBarHamburger.active:hover .middle[data-v-6a2ed68b],.VPNavBarHamburger.active:hover .bottom[data-v-6a2ed68b]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6a2ed68b],.middle[data-v-6a2ed68b],.bottom[data-v-6a2ed68b]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6a2ed68b]{top:0;left:0;transform:translate(0)}.middle[data-v-6a2ed68b]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6a2ed68b]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-c423e9f4]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-c423e9f4],.VPNavBarMenuLink[data-v-c423e9f4]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-71183eee]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-71183eee]{display:flex}}/*! @docsearch/css 3.6.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-edaebeb1]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-edaebeb1]{display:flex;align-items:center}}.title[data-v-de953605]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-de953605]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-de953605]{border-bottom-color:var(--vp-c-divider)}}[data-v-de953605] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-d3047050]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-d3047050]{display:flex;align-items:center}}.title[data-v-d3047050]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-37a6b570]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-37a6b570]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-37a6b570]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-37a6b570]:not(.home){background-color:transparent}.VPNavBar[data-v-37a6b570]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-37a6b570]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-37a6b570]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-37a6b570]{padding:0}}.container[data-v-37a6b570]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-37a6b570],.container>.content[data-v-37a6b570]{pointer-events:none}.container[data-v-37a6b570] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-37a6b570]{max-width:100%}}.title[data-v-37a6b570]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-37a6b570]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-37a6b570]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-37a6b570]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-37a6b570]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-37a6b570]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-37a6b570]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-37a6b570]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-37a6b570]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-37a6b570]{column-gap:.5rem}}.menu+.translations[data-v-37a6b570]:before,.menu+.appearance[data-v-37a6b570]:before,.menu+.social-links[data-v-37a6b570]:before,.translations+.appearance[data-v-37a6b570]:before,.appearance+.social-links[data-v-37a6b570]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-37a6b570]:before,.translations+.appearance[data-v-37a6b570]:before{margin-right:16px}.appearance+.social-links[data-v-37a6b570]:before{margin-left:16px}.social-links[data-v-37a6b570]{margin-right:-8px}.divider[data-v-37a6b570]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-37a6b570]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-37a6b570]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-37a6b570]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-37a6b570]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-37a6b570]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-37a6b570]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-beb3f918]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-beb3f918]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-6f3d2ab5]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-6f3d2ab5]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-eab7bfa1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-eab7bfa1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-60ca4288]{display:block}.title[data-v-60ca4288]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-9b54e8b4]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-9b54e8b4]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-9b54e8b4]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-9b54e8b4]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-9b54e8b4]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-9b54e8b4]{transform:rotate(45deg)}.button[data-v-9b54e8b4]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-9b54e8b4]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-9b54e8b4]{transition:transform .25s}.group[data-v-9b54e8b4]:first-child{padding-top:0}.group+.group[data-v-9b54e8b4],.group+.item[data-v-9b54e8b4]{padding-top:4px}.VPNavScreenTranslations[data-v-d9ff2423]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-d9ff2423]{height:auto}.title[data-v-d9ff2423]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-d9ff2423]{font-size:16px}.icon.lang[data-v-d9ff2423]{margin-right:8px}.icon.chevron[data-v-d9ff2423]{margin-left:4px}.list[data-v-d9ff2423]{padding:4px 0 0 24px}.link[data-v-d9ff2423]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-c6c7bd45]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-c6c7bd45],.VPNavScreen.fade-leave-active[data-v-c6c7bd45]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-c6c7bd45],.VPNavScreen.fade-leave-active .container[data-v-c6c7bd45]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-c6c7bd45],.VPNavScreen.fade-leave-to[data-v-c6c7bd45]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-c6c7bd45],.VPNavScreen.fade-leave-to .container[data-v-c6c7bd45]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-c6c7bd45]{display:none}}.container[data-v-c6c7bd45]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-c6c7bd45],.menu+.appearance[data-v-c6c7bd45],.translations+.appearance[data-v-c6c7bd45]{margin-top:24px}.menu+.social-links[data-v-c6c7bd45]{margin-top:16px}.appearance+.social-links[data-v-c6c7bd45]{margin-top:16px}.VPNav[data-v-d52d372b]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-d52d372b]{position:fixed}}.VPSidebarItem.level-0[data-v-b74067ae]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-b74067ae]{padding-bottom:10px}.item[data-v-b74067ae]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-b74067ae]{cursor:pointer}.indicator[data-v-b74067ae]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-b74067ae],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-b74067ae],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-b74067ae],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-b74067ae]{background-color:var(--vp-c-brand-1)}.link[data-v-b74067ae]{display:flex;align-items:center;flex-grow:1}.text[data-v-b74067ae]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-b74067ae]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-b74067ae],.VPSidebarItem.level-2 .text[data-v-b74067ae],.VPSidebarItem.level-3 .text[data-v-b74067ae],.VPSidebarItem.level-4 .text[data-v-b74067ae],.VPSidebarItem.level-5 .text[data-v-b74067ae]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-b74067ae],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-b74067ae],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-b74067ae],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-b74067ae],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-b74067ae],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-b74067ae]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-1.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-2.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-3.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-4.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-5.has-active>.item>.text[data-v-b74067ae],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-b74067ae],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-b74067ae],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-b74067ae],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-b74067ae],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-b74067ae],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-b74067ae]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-b74067ae],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-b74067ae],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-b74067ae],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-b74067ae],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-b74067ae],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-b74067ae]{color:var(--vp-c-brand-1)}.caret[data-v-b74067ae]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-b74067ae]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-b74067ae]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-b74067ae]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-b74067ae]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-b74067ae],.VPSidebarItem.level-2 .items[data-v-b74067ae],.VPSidebarItem.level-3 .items[data-v-b74067ae],.VPSidebarItem.level-4 .items[data-v-b74067ae],.VPSidebarItem.level-5 .items[data-v-b74067ae]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-b74067ae]{display:none}.no-transition[data-v-e3ecf1ec] .caret-icon{transition:none}.group+.group[data-v-e3ecf1ec]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-e3ecf1ec]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-f2245985]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-f2245985]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-f2245985]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-f2245985]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-f2245985]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-f2245985]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-f2245985]{outline:0}.VPSkipLink[data-v-a977b129]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-a977b129]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-a977b129]{top:14px;left:16px}}.Layout[data-v-7e3343f7]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-308016a3]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-308016a3]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-308016a3]{margin:128px 0}}.VPHomeSponsors[data-v-308016a3]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-308016a3]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-308016a3]{padding:0 64px}}.container[data-v-308016a3]{margin:0 auto;max-width:1152px}.love[data-v-308016a3]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-308016a3]{display:inline-block}.message[data-v-308016a3]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-308016a3]{padding-top:32px}.action[data-v-308016a3]{padding-top:40px;text-align:center}.VPTeamPage[data-v-2771c96e]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-2771c96e]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-2771c96e-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-2771c96e-s],.VPTeamMembers+.VPTeamPageSection[data-v-2771c96e-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-2771c96e-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-2771c96e-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-2771c96e-s],.VPTeamMembers+.VPTeamPageSection[data-v-2771c96e-s]{margin-top:96px}}.VPTeamMembers[data-v-2771c96e-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-2771c96e-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-2771c96e-s]{padding:0 64px}}.VPTeamPageTitle[data-v-b7285b4e]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-b7285b4e]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-b7285b4e]{padding:80px 64px 48px}}.title[data-v-b7285b4e]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-b7285b4e]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-b7285b4e]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-b7285b4e]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-1745a870]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-1745a870]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-1745a870]{padding:0 64px}}.title[data-v-1745a870]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-1745a870]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-1745a870]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-1745a870]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-1745a870]{padding-top:40px}.VPTeamMembersItem[data-v-3c3727f9]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-3c3727f9]{padding:32px}.VPTeamMembersItem.small .data[data-v-3c3727f9]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-3c3727f9]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-3c3727f9]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-3c3727f9]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-3c3727f9]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-3c3727f9]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-3c3727f9]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-3c3727f9]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-3c3727f9]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-3c3727f9]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-3c3727f9]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-3c3727f9]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-3c3727f9]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-3c3727f9]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-3c3727f9]{text-align:center}.avatar[data-v-3c3727f9]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-3c3727f9]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-3c3727f9]{margin:0;font-weight:600}.affiliation[data-v-3c3727f9]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-3c3727f9]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-3c3727f9]:hover{color:var(--vp-c-brand-1)}.desc[data-v-3c3727f9]{margin:0 auto}.desc[data-v-3c3727f9] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-3c3727f9]{display:flex;justify-content:center;height:56px}.sp-link[data-v-3c3727f9]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-3c3727f9]:hover,.sp .sp-link.link[data-v-3c3727f9]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-3c3727f9]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-2607a016]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-2607a016]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-2607a016]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-2607a016]{max-width:876px}.VPTeamMembers.medium .container[data-v-2607a016]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-2607a016]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-2607a016]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-2607a016]{max-width:760px}.container[data-v-2607a016]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-c-brand-1: #149ef8;--vp-c-brand-2: #0434ad;--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #34a3fe 30%, #8d44ff);--vp-home-hero-image-background-image: linear-gradient(-45deg, #d0e9ff 50%, #a2d8f4 50%);--vp-home-hero-image-filter: blur(44px)}.VPLocalSearchBox[data-v-a5632211]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-a5632211]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-a5632211]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-a5632211]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-a5632211]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-a5632211]{padding:0 8px}}.search-bar[data-v-a5632211]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-a5632211]{display:block;font-size:18px}.navigate-icon[data-v-a5632211]{display:block;font-size:14px}.search-icon[data-v-a5632211]{margin:8px}@media (max-width: 767px){.search-icon[data-v-a5632211]{display:none}}.search-input[data-v-a5632211]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-a5632211]{padding:6px 4px}}.search-actions[data-v-a5632211]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-a5632211]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-a5632211]{display:none}}.search-actions button[data-v-a5632211]{padding:8px}.search-actions button[data-v-a5632211]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-a5632211]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-a5632211]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-a5632211]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-a5632211]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-a5632211]{display:none}}.search-keyboard-shortcuts kbd[data-v-a5632211]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-a5632211]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-a5632211]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-a5632211]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-a5632211]{margin:8px}}.titles[data-v-a5632211]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-a5632211]{display:flex;align-items:center;gap:4px}.title.main[data-v-a5632211]{font-weight:500}.title-icon[data-v-a5632211]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-a5632211]{opacity:.5}.result.selected[data-v-a5632211]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-a5632211]{position:relative}.excerpt[data-v-a5632211]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-a5632211]{opacity:1}.excerpt[data-v-a5632211] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-a5632211] mark,.excerpt[data-v-a5632211] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-a5632211] .vp-code-group .tabs{display:none}.excerpt[data-v-a5632211] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-a5632211]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-a5632211]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-a5632211],.result.selected .title-icon[data-v-a5632211]{color:var(--vp-c-brand-1)!important}.no-results[data-v-a5632211]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-a5632211]{flex:none} diff --git a/assets/usage_agreement.md.DBBkunJ_.js b/assets/usage_agreement.md.DBBkunJ_.js new file mode 100644 index 00000000..849d5d24 --- /dev/null +++ b/assets/usage_agreement.md.DBBkunJ_.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as o}from"./chunks/framework.C3o_UkTa.js";const h=JSON.parse('{"title":"用户协议","description":"","frontmatter":{"title":"用户协议","order":3},"headers":[],"relativePath":"usage/agreement.md","filePath":"zh/usage/agreement.md","lastUpdated":1725101868000}'),l={name:"usage/agreement.md"},i=o('
  1. 本项目遵循MIT协议,你可以自由使用,修改,分发,但是请保留原作者信息
  2. 你可以选择开启auto_report(默认开启),轻雪会收集以下内容
    • 运行环境的设备信息:CPU,内存,系统信息及Python信息
    • 插件信息(不含插件数据)
    • 部分异常信息,
    • 会话负载信息(不含隐私部分) 以上内容仅用于项目的优化,不包含任何隐私信息,且通过安全的方式传输到轻雪的服务器,若你不希望提供这些信息,可以在配置文件中把auto_report设定为false
  3. 本项目不会收集用户的任何隐私信息,但请注意甄别第三方插件的安全性
  4. 使用此项目代表你已经同意以上协议
',2),r=[i];function c(_,s,d,n,m,p){return a(),t("div",null,r)}const f=e(l,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/usage_agreement.md.DBBkunJ_.lean.js b/assets/usage_agreement.md.DBBkunJ_.lean.js new file mode 100644 index 00000000..ccf4b29b --- /dev/null +++ b/assets/usage_agreement.md.DBBkunJ_.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a,a4 as o}from"./chunks/framework.C3o_UkTa.js";const h=JSON.parse('{"title":"用户协议","description":"","frontmatter":{"title":"用户协议","order":3},"headers":[],"relativePath":"usage/agreement.md","filePath":"zh/usage/agreement.md","lastUpdated":1725101868000}'),l={name:"usage/agreement.md"},i=o("",2),r=[i];function c(_,s,d,n,m,p){return a(),t("div",null,r)}const f=e(l,[["render",c]]);export{h as __pageData,f as default}; diff --git a/assets/usage_basic.md.DJoTZ022.js b/assets/usage_basic.md.DJoTZ022.js new file mode 100644 index 00000000..7d9b5f21 --- /dev/null +++ b/assets/usage_basic.md.DJoTZ022.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,a4 as l}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"基础插件","description":"","frontmatter":{"title":"基础插件","order":1},"headers":[],"relativePath":"usage/basic.md","filePath":"zh/usage/basic.md","lastUpdated":1725101868000}'),n={name:"usage/basic.md"},r=l('

基础插件


TIP

参数<param>为必填参数,[option]为可选参数。

命令别名:配置了命令别名的命令可以使用别名代替原命令,例如npm install ~可以使用插件 安装 ~代替。

轻雪命令liteyuki_command

命令说明权限举例可用参数
reload-liteyuki重载轻雪超级用户
update-liteyuki更新轻雪超级用户
liteecho查看当前bot 版本超级用户
status查看统计信息和状态超级用户
config set <key> value添加配置项,若存在则会覆盖,输入值会被执行以转换为正确的类型,"10"和10是不一样的超级用户config set name 'liteyuki-bot'<key>: 若存在则覆盖, 若不存在则创建于config.yml ; value: yml格式的所有合法内容
config get [key] 查询配置项,不带key返回配置项列表,推荐私聊使用超级用户config get name<key>: 若存在则返回, 若不存在则返回空
switch-image-mode 在普通图片和Markdown大图之间切换,该功能需要commit:505468b及以后的Lagrange.OneBot,默认普通图片超级用户switch-image-mode
/api api_name [args] 调用机器人API超级用户/api get_group_member_list group_id=1234567<args>: 参数列表, 格式为onebot v11协议api, 可用%20代替空格
/function function_name [args] [kwargs] 调用机器人函数(.lyfunction语法)超级用户/function send_group_msg group_id=1234567 message='hello'<args><kwargs>: 参数列表, api格式为onebot v11协议api
group enable/disable [group_id]在群聊启用/停用机器人,group_id仅超级用户可用超级用户,群聊仅群主、管理员、超级用户可用group enable 1145141919810<group_id>: 群号
liteyuki-docs查看轻雪文档所有人

命令别名

命令别名
status状态
reload-liteyuki重启轻雪
update-liteyuki更新轻雪
reload-resources重载资源
config配置, set 设置 / get 查询
switch-image-mode切换图片模式
liteyuki-docs轻雪文档
group群聊, enable 启用 / disable 停用

插件/包管理器 liteyuki_pacman

  • 插件管理
命令说明权限
npm update更新插件商店索引超级用户
npm install <plugin_name>安装插件超级用户
npm uninstall <plugin_name>卸载插件超级用户
npm search <keywords...>通过关键词搜索插件超级用户
npm enable-global/disable-global <plugin_name>全局启用/停用插件超级用户
npm enable/disable <plugin_name> [--group <group_id>]当前会话启用/停用插件群聊仅群主、管理员、超级用户可用,私聊所有人可用
npm list [page] [num]列出所有插件 page为页数,num为每页显示数量群聊仅群主、管理员、超级用户可用,私聊所有人可用
help <plugin_name>查看插件帮助所有人
  • 资源包管理
命令说明权限
rpm list [page] [num]列出所有资源包 page为页数,num为每页显示数量超级用户
rpm load <pack_name>加载资源包超级用户
rpm unload <pack_name>卸载资源包超级用户
rpm change <pack_name>修改优先级超级用户
rpm reload重载所有资源包超级用户

命令别名

命令别名
npm插件管理
update更新
install安装
uninstall卸载
search搜索
enable启用
disable停用
enable-global全局启用
disable-global全局停用
rpm资源包
load加载
unload卸载
change更改
reload重载
list列表
help帮助

WARNING

受限于NoneBot2钩子函数的依赖注入参数,插件停用只能阻断传入响应,对于主动推送的插件不生效,请阅读插件主页的说明。


用户管理liteyuki_user

命令说明权限
profile查看用户信息菜单所有人
profile set <key> [value]设置用户信息或打开属性设置菜单所有人
profile get <key>获取用户信息所有人

###命令别名

命令别名
profile个人信息
set设置
get查询
',22),a=[r];function c(i,s,o,g,y,x){return d(),e("div",null,a)}const p=t(n,[["render",c]]);export{u as __pageData,p as default}; diff --git a/assets/usage_basic.md.DJoTZ022.lean.js b/assets/usage_basic.md.DJoTZ022.lean.js new file mode 100644 index 00000000..c55ad60d --- /dev/null +++ b/assets/usage_basic.md.DJoTZ022.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as d,a4 as l}from"./chunks/framework.C3o_UkTa.js";const u=JSON.parse('{"title":"基础插件","description":"","frontmatter":{"title":"基础插件","order":1},"headers":[],"relativePath":"usage/basic.md","filePath":"zh/usage/basic.md","lastUpdated":1725101868000}'),n={name:"usage/basic.md"},r=l("",22),a=[r];function c(i,s,o,g,y,x){return d(),e("div",null,a)}const p=t(n,[["render",c]]);export{u as __pageData,p as default}; diff --git a/assets/usage_extra.md.AJu--2F9.js b/assets/usage_extra.md.AJu--2F9.js new file mode 100644 index 00000000..abaac9c9 --- /dev/null +++ b/assets/usage_extra.md.AJu--2F9.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as s,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"功能命令","description":"","frontmatter":{"title":"功能命令","order":2},"headers":[],"relativePath":"usage/extra.md","filePath":"zh/usage/extra.md","lastUpdated":1725101868000}'),a={name:"usage/extra.md"},l=i('

功能插件命令

轻雪天气liteyuki_weather

查询实时天气,支持绑定城市,支持中英文城市名,支持多个关键词查询。

配置项

yaml
weather_key: "" # 和风天气的天气key,会自动判断key版本

命令

shell
weather <keywords...> # Keywords为城市名,支持中英文

查询目标地实时天气,例如:"天气 北京 海淀", "weather Tokyo Shinjuku"

shell
bind-city <keywords...> # Keywords为城市名,支持中英文

绑定查询城市,个人全局生效

命令别名

命令别名
weather天气
bind-city绑定城市

统计信息liteyuki_statistics

统计信息 命令

shell
statistic message --duration <duration> --period <period> --group [current|group_id] --bot [current|bot_id]

功能: 用于统计Bot接收到的消息, 统计周期为period, 统计时间范围为duration

参数格式
duration使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
period使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
groupcurrent (当前群聊) 或 group_id (QQ群号)
botcurrent (当前Bot) 或 bot_id

命令别名

命令别名
statisticstat
messagem
--duration-d
--period`-p
--group-g
--bot-b
currentc
',20),d=[l];function n(h,r,o,p,c,k){return s(),e("div",null,d)}const u=t(a,[["render",n]]);export{y as __pageData,u as default}; diff --git a/assets/usage_extra.md.AJu--2F9.lean.js b/assets/usage_extra.md.AJu--2F9.lean.js new file mode 100644 index 00000000..6ea1ed04 --- /dev/null +++ b/assets/usage_extra.md.AJu--2F9.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as s,a4 as i}from"./chunks/framework.C3o_UkTa.js";const y=JSON.parse('{"title":"功能命令","description":"","frontmatter":{"title":"功能命令","order":2},"headers":[],"relativePath":"usage/extra.md","filePath":"zh/usage/extra.md","lastUpdated":1725101868000}'),a={name:"usage/extra.md"},l=i("",20),d=[l];function n(h,r,o,p,c,k){return s(),e("div",null,d)}const u=t(a,[["render",n]]);export{y as __pageData,u as default}; diff --git a/deploy/config.html b/deploy/config.html new file mode 100644 index 00000000..d0bef215 --- /dev/null +++ b/deploy/config.html @@ -0,0 +1,56 @@ + + + + + + 配置 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

配置

轻雪支持yamljsontoml作为配置文件,取决于你个人的喜好

首次运行后生成config.ymlconfig目录,你可修改配置项后重启轻雪,绝大多数情况下,你只需要修改superusersnickname字段即可

启动时会加载项目目录下config.yml/yaml/json/tomlconfig目录下的所有配置文件,你可在config目录下创建多个配置文件,轻雪会自动合并这些配置文件

基础配置项

yaml
nonebot:
+  # Nonebot机器人的配置,以前的最外层配置项仍可为Nonebot服务,但是部分内容会被覆盖,请尽快迁移
+  command_start: [ "/", "" ] # 指令前缀,若没有""空命令头,请开启alconna_use_command_start保证alconna解析正常
+  host: 127.0.0.1 # 监听地址,默认为本机,若要接收外部请求请填写0.0.0.0
+  port: 20216 # 绑定端口
+  nickname: [ "liteyuki" ]  # 机器人昵称列表
+  superusers: [ "1919810" ]  # 超级用户列表
+liteyuki:
+  # 写在外层的配置项将会被覆盖,建议迁移到liteyuki下
+  log_level: "INFO" # 日志等级
+  log_icon: true # 是否显示日志等级图标(某些控制台字体不可用)
+  auto_report: true # 是否自动上报问题给轻雪服务器
+  auto_update: true # 是否自动更新轻雪,每天4点检查更新
+  plugins: [ ] # 轻雪插件列表
+  plugin_dirs: [ ] # 轻雪插件目录列表

其他配置

以下为默认值,如需自定义请手动添加

yaml
# 高级NoneBot配置
+nonebot:
+  onebot_access_token: "" # 访问令牌,对公开放时建议设置
+  default_language: "zh-CN" # 默认语言
+  alconna_auto_completion: false # alconna是否自动补全指令,默认false,建议开启
+  safe_mode: false # 安全模式,开启后将不会加载任何第三方NoneBot插件
+  # 其他Nonebot插件的配置项
+  custom_config_1: "custom_value1"
+  custom_config_2: "custom_value2"
+
+# 开发者选项
+liteyuki:
+  allow_update: true # 是否允许更新
+  debug: false  # 轻雪调试,开启会自动重载Bot或者资源,其他插件自带的调试功能也将开启
+  dev_mode: false # 开发者模式,开启后将会启动监视者,监视文件变化并自动重载
+
+...

示例:与NoneBot对接的OneBot实现端配置

生产环境中推荐反向WebSocket 不同的实现端给出的字段可能不同,但是基本上都是一样的,这里给出一个参考值

字段参考值说明
协议反向WebSocket推荐使用反向ws协议进行通信,即轻雪作为服务端
地址ws://127.0.0.1:20216/onebot/v11/ws地址取决于配置文件,本机默认为127.0.0.1:20216
AccessToken""如果你给轻雪配置了AccessToken,请在此填写相同的值

其他

  • 轻雪不局限于OneBot适配器,你可以使用NoneBot2支持的任何适配器或使用轻雪讯息传递插件

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/deploy/fandq.html b/deploy/fandq.html new file mode 100644 index 00000000..7d1bfbd7 --- /dev/null +++ b/deploy/fandq.html @@ -0,0 +1,26 @@ + + + + + + 答疑 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

答疑

常见问题

  • 设备上Python环境太乱了,pip和python不对应怎么办?

    • 请使用/path/to/python -m pip install -r requirements.txt来安装依赖, 然后用/path/to/python main.py来启动Bot, 其中/path/to/python是你要用来运行Bot的可执行文件
  • 为什么我启动后机器人没有反应?

    • 请检查配置文件的command_startsuperusers,确认你有权限使用命令并按照正确的命令发送
    • 确认命令头没有和nickname{}冲突,例如一个命令是help,但是Bot昵称有一个help,那么将会被解析为nickname而不是命令
  • 更新轻雪失败,报错InvalidGitRepositoryError

    • 请正确安装Git,并使用克隆而非直接下载的方式部署轻雪
  • 怎么登录聊天平台,例如QQ?

    • 你有这个问题说明你不是很了解这个项目,本项目不负责实现登录功能,只负责处理和回应消息,登录功能由实现端(协议端)提供, 实现端本身不负责处理响应逻辑,将消息按照OneBot标准处理好上报给轻雪 你需要使用Onebot标准的实现端来连接到轻雪并将消息上报给轻雪,下面已经列出一些推荐的实现端
  • Playwright安装失败

    • 输入playwright install安装浏览器
  • 有的插件安装后报错无法启动

    • 请先查阅插件文档,确认插件必要配置项完好后,仍然出现问题,请联系插件作者或在安全模式safe_mode: true下启动轻雪,在安全模式下你可以使用npm uninstall卸载问题插件
  • 其他问题

    加入QQ群775840726

推荐方案(QQ)

  1. Lagrange.OneBot,基于NTQQ的OneBot实现,目前Markdown消息支持Lagrange
  2. LLOneBot,NTQQ的OneBot插件,需要安装NTQQ
  3. OpenShamrock,基于Lsposed的OneBot11实现
  4. TRSS-Yunzai,基于node.js,可使用ws-plugin进行通信
  5. go-cqhttpgo语言实现的OneBot11实现端,目前可用性较低
  6. Gensokyo,基于 OneBot QQ官方机器人Api Golang 原生实现,需要官方机器人权限
  7. 人工实现的Onebot协议,自己整一个WebSocket客户端,看着QQ的消息,然后给轻雪传输数据

推荐方案(Minecraft)

  1. MinecraftOneBot,我们专门为Minecraft开发的服务器Bot,支持OneBotV11标准

使用其他项目连接请先自行查阅文档,若有困难请联系对应开发者而不是Liteyuki的开发者

鸣谢

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/deploy/install.html b/deploy/install.html new file mode 100644 index 00000000..d67d66f5 --- /dev/null +++ b/deploy/install.html @@ -0,0 +1,33 @@ + + + + + + 安装 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

安装

常规部署

  1. 安装 GitPython3.10+ 环境
bash
# 克隆项目到本地,轻雪使用Git进行版本管理,该步骤为必要项
+git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
+# 切换到Bot目录下
+cd LiteyukiBot
+# 安装依赖
+pip install -r requirements.txt
+# 启动Bot
+python main.py

TIP

推荐使用虚拟环境来运行轻雪,以避免依赖冲突,你可以使用python -m venv .venv来创建虚拟环境,然后使用.venv\Scripts\activate来激活虚拟环境(Linux下使用source .venv/bin/activate激活)

使用Docker构建

  1. 安装 Docker
  2. 克隆项目 git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
  3. 进入轻雪目录 cd LiteyukiBot
  4. 构建镜像 docker build -t liteyukibot .
  5. 启动容器 docker run -p 20216:20216 -v $(pwd):/liteyukibot -v $(pwd)/.cache:/root/.cache liteyukibot

TIP

Windows请使用项目绝对目录/path/to/LiteyukiBot代替$(pwd)
若你修改了端口号请将20216:20216中的20216替换为你的端口号

使用TRSS Scripts部署

TRSS_Liteyuki轻雪机器人管理脚本,该功能由TRSS提供支持,不是LiteyukiBot官方提供的功能,推荐使用Arch Linux

装置要求

  • Windows系统版本最低Windows10+/Windows Server 2019+
  • Linux系统要支持Python3.10+,推荐Ubuntu 20.04+(别用你那b CentOS)
  • CPU: 至少1vCPU
  • 内存: Bot无其他插件会占用300~500MB,包括chromiumnode等进程,其他插件占用视具体插件而定,建议1GB以上
  • 硬盘: 至少1GB空间

WARNING

如果装置上有多个环境,请使用path/to/python -m pip install -r requirements.txt来安装依赖,path/to/python为你的Python可执行文件路径

WARNING

轻雪的更新功能依赖Git,如果你没有安装Git直接下载源代码运行,你将无法使用更新功能

其他问题请移步至答疑

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/api.html b/dev/api/api.html new file mode 100644 index 00000000..89aea284 --- /dev/null +++ b/dev/api/api.html @@ -0,0 +1,26 @@ + + + + + + liteyuki | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/bot/bot.html b/dev/api/bot/bot.html new file mode 100644 index 00000000..8709e060 --- /dev/null +++ b/dev/api/bot/bot.html @@ -0,0 +1,236 @@ + + + + + + liteyuki.bot | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

说明: 初始化轻雪实例

参数:

  • *args:
  • **kwargs: 配置
源代码在GitHub上查看
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

说明: 启动逻辑

源代码在GitHub上查看
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

说明: 外部启动接口

源代码在GitHub上查看
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

说明: 保持轻雪运行

源代码在GitHub上查看
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

说明: 信号处理

参数:

  • signum:
  • frame:
源代码在GitHub上查看
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

说明: 重启轻雪本体

源代码在GitHub上查看
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

说明: 停止轻雪

参数:

  • name: 进程名称, 默认为None, 所有进程
源代码在GitHub上查看
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

说明: 初始化轻雪, 自动调用

源代码在GitHub上查看
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

源代码在GitHub上查看
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

说明: 停止轻雪

源代码在GitHub上查看
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

说明: 注册启动前的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

说明: 注册启动后的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册停止后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册进程停止前的函数,为子进程停止时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

说明: 注册进程重启前的函数,为子进程重启时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

说明: 注册重启后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

说明: 获取轻雪实例

返回: LiteyukiBot: 当前的轻雪实例

源代码在GitHub上查看
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

说明: 获取配置

参数:

  • key: 配置键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

说明: 获取配置,兼容旧版本

参数:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
源代码在GitHub上查看
python
def print_logo():
+    print('\x1b[34m' + '\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \n    /  |      /      |/        |/        |/  \\    /  |/  |  /  |/  |  /  |/      |\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \n    $$ |        $$ |     $$ |   $$ |__     $$  \\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\    $$ |  \n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\__$$ |$$ |$$  \\  _$$ |_ \n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \n                ' + '\x1b[0m')

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/bot/index.html b/dev/api/bot/index.html new file mode 100644 index 00000000..cf80c6cf --- /dev/null +++ b/dev/api/bot/index.html @@ -0,0 +1,236 @@ + + + + + + liteyuki.bot | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

说明: 初始化轻雪实例

参数:

  • *args:
  • **kwargs: 配置
源代码在GitHub上查看
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

说明: 启动逻辑

源代码在GitHub上查看
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

说明: 外部启动接口

源代码在GitHub上查看
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

说明: 保持轻雪运行

源代码在GitHub上查看
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

说明: 信号处理

参数:

  • signum:
  • frame:
源代码在GitHub上查看
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

说明: 重启轻雪本体

源代码在GitHub上查看
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

说明: 停止轻雪

参数:

  • name: 进程名称, 默认为None, 所有进程
源代码在GitHub上查看
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

说明: 初始化轻雪, 自动调用

源代码在GitHub上查看
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

源代码在GitHub上查看
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

说明: 停止轻雪

源代码在GitHub上查看
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

说明: 注册启动前的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

说明: 注册启动后的函数

参数:

  • func:
源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册停止后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

说明: 注册进程停止前的函数,为子进程停止时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

说明: 注册进程重启前的函数,为子进程重启时调用

参数:

  • func:
源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

说明: 注册重启后的函数:未实现

参数:

  • func:
源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

说明: 获取轻雪实例

返回: LiteyukiBot: 当前的轻雪实例

源代码在GitHub上查看
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

说明: 获取配置

参数:

  • key: 配置键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

说明: 获取配置,兼容旧版本

参数:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

返回: Any: 配置值

源代码在GitHub上查看
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
源代码在GitHub上查看
python
def print_logo():
+    print('\x1b[34m' + '\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \n    /  |      /      |/        |/        |/  \\    /  |/  |  /  |/  |  /  |/      |\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \n    $$ |        $$ |     $$ |   $$ |__     $$  \\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\    $$ |  \n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\__$$ |$$ |$$  \\  _$$ |_ \n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \n                ' + '\x1b[0m')

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/bot/lifespan.html b/dev/api/bot/lifespan.html new file mode 100644 index 00000000..12bdfc2e --- /dev/null +++ b/dev/api/bot/lifespan.html @@ -0,0 +1,139 @@ + + + + + + liteyuki.bot.lifespan | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot.lifespan

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午8:24 @Author : snowykami @Email : snowykami@outlook.com @File : lifespan.py @Software: PyCharm

class Lifespan

def __init__(self) -> None

说明: 轻雪生命周期管理,启动、停止、重启

源代码在GitHub上查看
python
def __init__(self) -> None:
+    """
+        轻雪生命周期管理,启动、停止、重启
+        """
+    self.life_flag: int = 0
+    self._before_start_funcs: list[LIFESPAN_FUNC] = []
+    self._after_start_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._after_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_restart_funcs: list[LIFESPAN_FUNC] = []
+    self._after_restart_funcs: list[LIFESPAN_FUNC] = []

@staticmethod

async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None

说明: 并发运行异步函数

参数:

  • funcs:
源代码在GitHub上查看
python
@staticmethod
+async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None:
+    """
+        并发运行异步函数
+        Args:
+            funcs:
+        Returns:
+        """
+    loop = asyncio.get_running_loop()
+    tasks = [func(*args, **kwargs) if is_coroutine_callable(func) else async_wrapper(func)(*args, **kwargs) for func in funcs]
+    await asyncio.gather(*tasks)

def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册启动时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_start_funcs.append(func)
+    return func

def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册启动时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_start_funcs.append(func)
+    return func

def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册停止前的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止前的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_shutdown_funcs.append(func)
+    return func

def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册停止后的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止后的函数
+        Args:
+            func:
+
+        Returns:
+            LIFESPAN_FUNC:
+
+        """
+    self._after_shutdown_funcs.append(func)
+    return func

def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册重启时的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_restart_funcs.append(func)
+    return func

def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

说明: 注册重启后的函数

参数:

  • func:

返回: LIFESPAN_FUNC:

源代码在GitHub上查看
python
def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启后的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_restart_funcs.append(func)
+    return func

async def before_start(self) -> None

说明: 启动前

源代码在GitHub上查看
python
async def before_start(self) -> None:
+    """
+        启动前
+        Returns:
+        """
+    logger.debug('Running before_start functions')
+    await self.run_funcs(self._before_start_funcs)

async def after_start(self) -> None

说明: 启动后

源代码在GitHub上查看
python
async def after_start(self) -> None:
+    """
+        启动后
+        Returns:
+        """
+    logger.debug('Running after_start functions')
+    await self.run_funcs(self._after_start_funcs)

async def before_process_shutdown(self) -> None

说明: 停止前

源代码在GitHub上查看
python
async def before_process_shutdown(self) -> None:
+    """
+        停止前
+        Returns:
+        """
+    logger.debug('Running before_shutdown functions')
+    await self.run_funcs(self._before_process_shutdown_funcs)

async def after_shutdown(self) -> None

说明: 停止后

源代码在GitHub上查看
python
async def after_shutdown(self) -> None:
+    """
+        停止后
+        Returns:
+        """
+    logger.debug('Running after_shutdown functions')
+    await self.run_funcs(self._after_shutdown_funcs)

async def before_process_restart(self) -> None

说明: 重启前

源代码在GitHub上查看
python
async def before_process_restart(self) -> None:
+    """
+        重启前
+        Returns:
+        """
+    logger.debug('Running before_restart functions')
+    await self.run_funcs(self._before_process_restart_funcs)

async def after_restart(self) -> None

说明: 重启后

源代码在GitHub上查看
python
async def after_restart(self) -> None:
+    """
+        重启后
+        Returns:
+
+        """
+    logger.debug('Running after_restart functions')
+    await self.run_funcs(self._after_restart_funcs)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/comm/channel.html b/dev/api/comm/channel.html new file mode 100644 index 00000000..6811fe8b --- /dev/null +++ b/dev/api/comm/channel.html @@ -0,0 +1,221 @@ + + + + + + liteyuki.comm.channel | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.channel

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午11:21 @Author : snowykami @Email : snowykami@outlook.com @File : channel_.py @Software: PyCharm

本模块定义了一个通用的通道类,用于进程间通信

class Channel(Generic[T])

def __init__(self, name: str, type_check: Optional[bool] = None)

说明: 初始化通道

参数:

  • name: 通道ID
  • type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
源代码在GitHub上查看
python
def __init__(self, name: str, type_check: Optional[bool]=None):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+            type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
+        """
+    self.conn_send, self.conn_recv = Pipe()
+    self._conn_send_inner, self._conn_recv_inner = Pipe()
+    self._closed = False
+    self._on_main_receive_func_ids: list[int] = []
+    self._on_sub_receive_func_ids: list[int] = []
+    self.name: str = name
+    self.is_receive_loop_running = False
+    if type_check is None:
+        type_check = self._get_generic_type() is not None
+    elif type_check:
+        if self._get_generic_type() is None:
+            raise TypeError('Type hint is required for enforcing type check.')
+    self.type_check = type_check
+    if name in _channel:
+        raise ValueError(f'Channel {name} already exists')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = self
+        logger.debug(f'Channel {name} initialized in main process')
+    else:
+        logger.debug(f'Channel {name} initialized in sub process, should manually set in main process')

def _get_generic_type(self) -> Optional[type]

说明: 获取通道传递泛型类型

返回: Optional[type]: 泛型类型

源代码在GitHub上查看
python
def _get_generic_type(self) -> Optional[type]:
+    """
+        获取通道传递泛型类型
+
+        Returns:
+            Optional[type]: 泛型类型
+        """
+    if hasattr(self, '__orig_class__'):
+        return get_args(self.__orig_class__)[0]
+    return None

def _validate_structure(self, data: Any, structure: type) -> bool

说明: 验证数据结构

参数:

  • data: 数据
  • structure: 结构

返回: bool: 是否通过验证

源代码在GitHub上查看
python
def _validate_structure(self, data: Any, structure: type) -> bool:
+    """
+        验证数据结构
+        Args:
+            data: 数据
+            structure: 结构
+
+        Returns:
+            bool: 是否通过验证
+        """
+    if isinstance(structure, type):
+        return isinstance(data, structure)
+    elif isinstance(structure, tuple):
+        if not isinstance(data, tuple) or len(data) != len(structure):
+            return False
+        return all((self._validate_structure(d, s) for d, s in zip(data, structure)))
+    elif isinstance(structure, list):
+        if not isinstance(data, list):
+            return False
+        return all((self._validate_structure(d, structure[0]) for d in data))
+    elif isinstance(structure, dict):
+        if not isinstance(data, dict):
+            return False
+        return all((k in data and self._validate_structure(data[k], structure[k]) for k in structure))
+    return False

def send(self, data: T)

说明: 发送数据,发送函数为同步函数,没有异步的必要

参数:

  • data: 数据
源代码在GitHub上查看
python
def send(self, data: T):
+    """
+        发送数据,发送函数为同步函数,没有异步的必要
+        Args:
+            data: 数据
+        """
+    if self.type_check:
+        _type = self._get_generic_type()
+        if _type is not None and (not self._validate_structure(data, _type)):
+            raise TypeError(f'Data must be an instance of {_type}, {type(data)} found')
+    if self._closed:
+        raise RuntimeError('Cannot send to a closed channel_')
+    self.conn_send.send(data)

def receive(self) -> T

说明: 同步接收数据,会阻塞线程

源代码在GitHub上查看
python
def receive(self) -> T:
+    """
+        同步接收数据,会阻塞线程
+        Args:
+        """
+    if self._closed:
+        raise RuntimeError('Cannot receive from a closed channel_')
+    while True:
+        data = self.conn_recv.recv()
+        return data

async def async_receive(self) -> T

说明: 异步接收数据,会挂起等待

源代码在GitHub上查看
python
async def async_receive(self) -> T:
+    """
+        异步接收数据,会挂起等待
+        """
+    print('等待接收数据')
+    loop = asyncio.get_running_loop()
+    data = await loop.run_in_executor(None, self.receive)
+    print('接收到数据')
+    return data

def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]

说明: 接收数据并执行函数

参数:

  • filter_func: 过滤函数,为None则不过滤

返回: 装饰器,装饰一个函数在接收到数据后执行

源代码在GitHub上查看
python
def on_receive(self, filter_func: Optional[FILTER_FUNC]=None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]:
+    """
+        接收数据并执行函数
+        Args:
+            filter_func: 过滤函数,为None则不过滤
+        Returns:
+            装饰器,装饰一个函数在接收到数据后执行
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('on_receive can only be used in main process')
+
+    def decorator(func: Callable[[T], Any]) -> Callable[[T], Any]:
+        global _func_id
+
+        async def wrapper(data: T) -> Any:
+            if filter_func is not None:
+                if is_coroutine_callable(filter_func):
+                    if not await filter_func(data):
+                        return
+                elif not filter_func(data):
+                    return
+            if is_coroutine_callable(func):
+                return await func(data)
+            else:
+                return func(data)
+        _callback_funcs[_func_id] = wrapper
+        if IS_MAIN_PROCESS:
+            self._on_main_receive_func_ids.append(_func_id)
+        else:
+            self._on_sub_receive_func_ids.append(_func_id)
+        _func_id += 1
+        return func
+    return decorator

async def _run_on_receive_funcs(self, data: Any)

说明: 运行接收函数

参数:

  • data: 数据
源代码在GitHub上查看
python
async def _run_on_receive_funcs(self, data: Any):
+    """
+        运行接收函数
+        Args:
+            data: 数据
+        """
+    if IS_MAIN_PROCESS:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_main_receive_func_ids]
+    else:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_sub_receive_func_ids]

async def start_receive_loop(self)

说明: 开始接收数据 会自动判断主进程和子进程,需要在对应进程都调度一次

源代码在GitHub上查看
python
async def start_receive_loop(self):
+    """
+        开始接收数据
+        会自动判断主进程和子进程,需要在对应进程都调度一次
+        """
+    if len(self._on_main_receive_func_ids) == 0:
+        logger.warning(f'No on_receive function registered for {self.name}')
+        return
+    self.is_receive_loop_running = True
+    logger.debug(f'Starting receive loop for {self.name}')
+    while not self._closed:
+        data = await self.async_receive()
+        await self._run_on_receive_funcs(data)

var active_channel

  • 说明: 子进程可用的主动和被动通道

  • 类型: Channel

  • 默认值: Channel(name='active_channel')

var publish_channel

  • 说明: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • 类型: Channel[tuple[str, dict[str, Any]]]

  • 默认值: Channel(name='publish_channel')

var channel_deliver_active_channel

  • 说明: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • 类型: Channel[Channel[Any]]

  • 默认值: NO_DEFAULT

def set_channel(name: str, channel: Channel)

说明: 设置通道实例

参数:

  • name: 通道名称
  • channel: 通道实例
源代码在GitHub上查看
python
def set_channel(name: str, channel: 'Channel'):
+    """
+    设置通道实例
+    Args:
+        name: 通道名称
+        channel: 通道实例
+    """
+    if not isinstance(channel, Channel):
+        raise TypeError(f'channel_ must be an instance of Channel, {type(channel)} found')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = channel
+    else:
+        channel_deliver_passive_channel.send(('set_channel', {'name': name, 'channel_': channel}))

def set_channels(channels: dict[str, Channel])

说明: 设置通道实例

参数:

  • channels: 通道名称
源代码在GitHub上查看
python
def set_channels(channels: dict[str, 'Channel']):
+    """
+    设置通道实例
+    Args:
+        channels: 通道名称
+    """
+    for name, channel in channels.items():
+        set_channel(name, channel)

def get_channel(name: str) -> Channel

说明: 获取通道实例

参数:

  • name: 通道名称
源代码在GitHub上查看
python
def get_channel(name: str) -> 'Channel':
+    """
+    获取通道实例
+    Args:
+        name: 通道名称
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel[name]
+    else:
+        recv_chan = Channel[Channel[Any]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channel', {'name': name, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def get_channels() -> dict[str, Channel]

说明: 获取通道实例

源代码在GitHub上查看
python
def get_channels() -> dict[str, 'Channel']:
+    """
+    获取通道实例
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel
+    else:
+        recv_chan = Channel[dict[str, Channel[Any]]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channels', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')

def on_set_channel(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')
+def on_set_channel(data: tuple[str, dict[str, Any]]):
+    name, channel = (data[1]['name'], data[1]['channel_'])
+    set_channel(name, channel)

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')

def on_get_channel(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')
+def on_get_channel(data: tuple[str, dict[str, Any]]):
+    name, recv_chan = (data[1]['name'], data[1]['recv_chan'])
+    recv_chan.send(get_channel(name))

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')

def on_get_channels(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')
+def on_get_channels(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(get_channels())

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/comm/comm.html b/dev/api/comm/comm.html new file mode 100644 index 00000000..16fb80da --- /dev/null +++ b/dev/api/comm/comm.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.comm | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/comm/event.html b/dev/api/comm/event.html new file mode 100644 index 00000000..9fcc2fc8 --- /dev/null +++ b/dev/api/comm/event.html @@ -0,0 +1,28 @@ + + + + + + liteyuki.comm.event | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.event

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class Event

def __init__(self, name: str, data: dict[str, Any])

源代码在GitHub上查看
python
def __init__(self, name: str, data: dict[str, Any]):
+    self.name = name
+    self.data = data

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/comm/index.html b/dev/api/comm/index.html new file mode 100644 index 00000000..7bd2d63b --- /dev/null +++ b/dev/api/comm/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.comm | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/comm/rpc.html b/dev/api/comm/rpc.html new file mode 100644 index 00000000..c1a156a7 --- /dev/null +++ b/dev/api/comm/rpc.html @@ -0,0 +1,31 @@ + + + + + + liteyuki.comm.rpc | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.rpc

说明: 本模块用于实现RPC(基于IPC)通信

class RPC

def __init__(self, on_calling: ON_CALLING_FUNC) -> None

源代码在GitHub上查看
python
def __init__(self, on_calling: ON_CALLING_FUNC) -> None:
+    self.on_calling = on_calling

def call(self, args: tuple, kwargs: dict) -> Any

说明: 调用

源代码在GitHub上查看
python
def call(self, args: tuple, kwargs: dict) -> Any:
+    """
+        调用
+        """
+    return self.on_calling(args, kwargs)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/comm/socks_channel.html b/dev/api/comm/socks_channel.html new file mode 100644 index 00000000..4b2cee8e --- /dev/null +++ b/dev/api/comm/socks_channel.html @@ -0,0 +1,51 @@ + + + + + + liteyuki.comm.socks_channel | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.socks_channel

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/25 下午3:54 @Author : snowykami @Email : snowykami@outlook.com @File : channelv2.py @Software: PyCharm

class SocksChannel

def __init__(self, name: str)

说明: 初始化通道

参数:

  • name: 通道ID
源代码在GitHub上查看
python
def __init__(self, name: str):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+        """
+    self._name = name
+    self._conn_send = None
+    self._conn_recv = None
+    self._closed = False

def send(self, data)

说明: 发送数据

参数:

  • data: 数据
源代码在GitHub上查看
python
def send(self, data):
+    """
+        发送数据
+        Args:
+            data: 数据
+        """
+    pass

def receive(self)

说明: 接收数据

返回: data: 数据

源代码在GitHub上查看
python
def receive(self):
+    """
+        接收数据
+        Returns:
+            data: 数据
+        """
+    pass

def close(self)

说明: 关闭通道

源代码在GitHub上查看
python
def close(self):
+    """
+        关闭通道
+        """
+    pass

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/comm/storage.html b/dev/api/comm/storage.html new file mode 100644 index 00000000..2596763e --- /dev/null +++ b/dev/api/comm/storage.html @@ -0,0 +1,169 @@ + + + + + + liteyuki.comm.storage | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.storage

说明: 共享内存模块。类似于redis,但是更加轻量级并且线程安全

var _on_main_subscriber_receive_funcs

  • 说明: 主进程订阅者接收函数

  • 类型: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • 默认值: {}

var _on_sub_subscriber_receive_funcs

  • 说明: 子进程订阅者接收函数

  • 类型: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • 默认值: {}

class KeyValueStore

def __init__(self)

源代码在GitHub上查看
python
def __init__(self):
+    self._store = {}
+    self.active_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-active')
+    self.passive_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-passive')
+    self.publish_channel = Channel[tuple[str, Any]](name='shared_memory-publish')
+    self.is_main_receive_loop_running = False
+    self.is_sub_receive_loop_running = False

def set(self, key: str, value: Any) -> None

说明: 设置键值对

参数:

  • key: 键
  • value: 值
源代码在GitHub上查看
python
def set(self, key: str, value: Any) -> None:
+    """
+        设置键值对
+        Args:
+            key: 键
+            value: 值
+
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            self._store[key] = value
+    else:
+        self.passive_chan.send(('set', {'key': key, 'value': value}))

def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]

说明: 获取键值对

参数:

  • key: 键
  • default: 默认值

返回: Any: 值

源代码在GitHub上查看
python
def get(self, key: str, default: Optional[Any]=None) -> Optional[Any]:
+    """
+        获取键值对
+        Args:
+            key: 键
+            default: 默认值
+
+        Returns:
+            Any: 值
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            return self._store.get(key, default)
+    else:
+        recv_chan = Channel[Optional[Any]]('recv_chan')
+        self.passive_chan.send(('get', {'key': key, 'default': default, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def delete(self, key: str, ignore_key_error: bool = True) -> None

说明: 删除键值对

参数:

  • key: 键
  • ignore_key_error: 是否忽略键不存在的错误
源代码在GitHub上查看
python
def delete(self, key: str, ignore_key_error: bool=True) -> None:
+    """
+        删除键值对
+        Args:
+            key: 键
+            ignore_key_error: 是否忽略键不存在的错误
+
+        Returns:
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            if key in self._store:
+                try:
+                    del self._store[key]
+                    del _locks[key]
+                except KeyError as e:
+                    if not ignore_key_error:
+                        raise e
+    else:
+        self.passive_chan.send(('delete', {'key': key}))

def get_all(self) -> dict[str, Any]

说明: 获取所有键值对

返回: dict[str, Any]: 键值对

源代码在GitHub上查看
python
def get_all(self) -> dict[str, Any]:
+    """
+        获取所有键值对
+        Returns:
+            dict[str, Any]: 键值对
+        """
+    if IS_MAIN_PROCESS:
+        return self._store
+    else:
+        recv_chan = Channel[dict[str, Any]]('recv_chan')
+        self.passive_chan.send(('get_all', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

def publish(self, channel_: str, data: Any) -> None

说明: 发布消息

参数:

  • channel_: 频道
  • data: 数据
源代码在GitHub上查看
python
def publish(self, channel_: str, data: Any) -> None:
+    """
+        发布消息
+        Args:
+            channel_: 频道
+            data: 数据
+
+        Returns:
+        """
+    self.active_chan.send(('publish', {'channel': channel_, 'data': data}))

def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]

说明: 订阅者接收消息时的回调

参数:

  • channel_: 频道

返回: 装饰器

源代码在GitHub上查看
python
def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]:
+    """
+        订阅者接收消息时的回调
+        Args:
+            channel_: 频道
+
+        Returns:
+            装饰器
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot subscribe in sub process.')
+
+    def decorator(func: ON_RECEIVE_FUNC) -> ON_RECEIVE_FUNC:
+
+        async def wrapper(data: Any):
+            if is_coroutine_callable(func):
+                await func(data)
+            else:
+                func(data)
+        if IS_MAIN_PROCESS:
+            if channel_ not in _on_main_subscriber_receive_funcs:
+                _on_main_subscriber_receive_funcs[channel_] = []
+            _on_main_subscriber_receive_funcs[channel_].append(wrapper)
+        else:
+            if channel_ not in _on_sub_subscriber_receive_funcs:
+                _on_sub_subscriber_receive_funcs[channel_] = []
+            _on_sub_subscriber_receive_funcs[channel_].append(wrapper)
+        return wrapper
+    return decorator

@staticmethod

async def run_subscriber_receive_funcs(channel_: str, data: Any)

说明: 运行订阅者接收函数

参数:

  • channel_: 频道
  • data: 数据
源代码在GitHub上查看
python
@staticmethod
+async def run_subscriber_receive_funcs(channel_: str, data: Any):
+    """
+        运行订阅者接收函数
+        Args:
+            channel_: 频道
+            data: 数据
+        """
+    [asyncio.create_task(func(data)) for func in _on_main_subscriber_receive_funcs[channel_]]

async def start_receive_loop(self)

说明: 启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程

源代码在GitHub上查看
python
async def start_receive_loop(self):
+    """
+        启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot start receive loop in sub process.')
+    while True:
+        data = await self.active_chan.async_receive()
+        if data[0] == 'publish':
+            await self.run_subscriber_receive_funcs(data[1]['channel'], data[1]['data'])
+            self.publish_channel.send(data)

class GlobalKeyValueStore

@classmethod

def get_instance(cls)

源代码在GitHub上查看
python
@classmethod
+def get_instance(cls):
+    if cls._instance is None:
+        with cls._lock:
+            if cls._instance is None:
+                cls._instance = KeyValueStore()
+    return cls._instance

attr _instance = None

attr _lock = threading.Lock()

var _ref_count

  • 说明: import 引用计数, 防止获取空指针

  • 默认值: 0

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')

def on_get(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')
+def on_get(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    default = data[1]['default']
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get(key, default))

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')

def on_set(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')
+def on_set(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    value = data[1]['value']
+    shared_memory.set(key, value)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')

def on_delete(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')
+def on_delete(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    shared_memory.delete(key)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')

def on_get_all(data: tuple[str, dict[str, Any]])

源代码在GitHub上查看
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')
+def on_get_all(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get_all())

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/config.html b/dev/api/config.html new file mode 100644 index 00000000..51135e45 --- /dev/null +++ b/dev/api/config.html @@ -0,0 +1,102 @@ + + + + + + liteyuki.config | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.config

说明: 该模块用于常用配置文件的加载 多配置文件编写原则: 1.尽量不要冲突: 一个键不要多次出现 2.分工明确: 每个配置文件给一个或一类服务提供配置 3.扁平化编写: 配置文件尽量扁平化,不要出现过多的嵌套 4.注意冲突时的优先级: 项目目录下的配置文件优先级高于config目录下的配置文件 5.请不要将需要动态加载的内容写入配置文件,你应该使用其他储存方式

def flat_config(config: dict[str, Any]) -> dict[str, Any]

说明: 扁平化配置文件

{a:{b:{c:1}}} ->

参数:

  • config: 配置项目

返回: 扁平化后的配置文件,但也包含原有的键值对

源代码在GitHub上查看
python
def flat_config(config: dict[str, Any]) -> dict[str, Any]:
+    """
+    扁平化配置文件
+
+    {a:{b:{c:1}}} -> {"a.b.c": 1}
+    Args:
+        config: 配置项目
+
+    Returns:
+        扁平化后的配置文件,但也包含原有的键值对
+    """
+    new_config = copy.deepcopy(config)
+    for key, value in config.items():
+        if isinstance(value, dict):
+            for k, v in flat_config(value).items():
+                new_config[f'{key}.{k}'] = v
+    return new_config

def load_from_yaml(file_: str) -> dict[str, Any]

说明: Load config from yaml file

源代码在GitHub上查看
python
def load_from_yaml(file_: str) -> dict[str, Any]:
+    """
+    Load config from yaml file
+
+    """
+    logger.debug(f'Loading YAML config from {file_}')
+    config = yaml.safe_load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_json(file_: str) -> dict[str, Any]

说明: Load config from json file

源代码在GitHub上查看
python
def load_from_json(file_: str) -> dict[str, Any]:
+    """
+    Load config from json file
+    """
+    logger.debug(f'Loading JSON config from {file_}')
+    config = json.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_toml(file_: str) -> dict[str, Any]

说明: Load config from toml file

源代码在GitHub上查看
python
def load_from_toml(file_: str) -> dict[str, Any]:
+    """
+    Load config from toml file
+    """
+    logger.debug(f'Loading TOML config from {file_}')
+    config = toml.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]

说明: 从指定文件加载配置项,会自动识别文件格式 默认执行扁平化选项

源代码在GitHub上查看
python
def load_from_files(*files: str, no_warning: bool=False) -> dict[str, Any]:
+    """
+    从指定文件加载配置项,会自动识别文件格式
+    默认执行扁平化选项
+    """
+    config = {}
+    for file in files:
+        if os.path.exists(file):
+            if file.endswith(('.yaml', 'yml')):
+                config.update(load_from_yaml(file))
+            elif file.endswith('.json'):
+                config.update(load_from_json(file))
+            elif file.endswith('.toml'):
+                config.update(load_from_toml(file))
+            elif not no_warning:
+                logger.warning(f'Unsupported config file format: {file}')
+        elif not no_warning:
+            logger.warning(f'Config file not found: {file}')
+    return config

def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]

说明: 从目录下加载配置文件,不递归 按照读取文件的优先级反向覆盖 默认执行扁平化选项

源代码在GitHub上查看
python
def load_configs_from_dirs(*directories: str, no_waring: bool=False) -> dict[str, Any]:
+    """
+    从目录下加载配置文件,不递归
+    按照读取文件的优先级反向覆盖
+    默认执行扁平化选项
+    """
+    config = {}
+    for directory in directories:
+        if not os.path.exists(directory):
+            if not no_waring:
+                logger.warning(f'Directory not found: {directory}')
+            continue
+        for file in os.listdir(directory):
+            if file.endswith(_SUPPORTED_CONFIG_FORMATS):
+                config.update(load_from_files(os.path.join(directory, file), no_warning=no_waring))
+    return config

def load_config_in_default(no_waring: bool = False) -> dict[str, Any]

说明: 从一个标准的轻雪项目加载配置文件 项目目录下的config.*和config目录下的所有配置文件 项目目录下的配置文件优先

源代码在GitHub上查看
python
def load_config_in_default(no_waring: bool=False) -> dict[str, Any]:
+    """
+    从一个标准的轻雪项目加载配置文件
+    项目目录下的config.*和config目录下的所有配置文件
+    项目目录下的配置文件优先
+    """
+    config = load_configs_from_dirs('config', no_waring=no_waring)
+    config.update(load_from_files('config.yaml', 'config.toml', 'config.json', 'config.yml', no_warning=no_waring))
+    return config

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/core/core.html b/dev/api/core/core.html new file mode 100644 index 00000000..580d28e3 --- /dev/null +++ b/dev/api/core/core.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.core | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/core/index.html b/dev/api/core/index.html new file mode 100644 index 00000000..63668e35 --- /dev/null +++ b/dev/api/core/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.core | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/core/manager.html b/dev/api/core/manager.html new file mode 100644 index 00000000..5b816da6 --- /dev/null +++ b/dev/api/core/manager.html @@ -0,0 +1,117 @@ + + + + + + liteyuki.core.manager | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.core.manager

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午11:12 @Author : snowykami @Email : snowykami@outlook.com @File : manager.py @Software: PyCharm

class ChannelDeliver

def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])

源代码在GitHub上查看
python
def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]]):
+    self.active = active
+    self.passive = passive
+    self.channel_deliver_active = channel_deliver_active
+    self.channel_deliver_passive = channel_deliver_passive
+    self.publish = publish

class ProcessManager

def __init__(self, lifespan: Lifespan)

源代码在GitHub上查看
python
def __init__(self, lifespan: 'Lifespan'):
+    self.lifespan = lifespan
+    self.targets: dict[str, tuple[Callable, tuple, dict]] = {}
+    self.processes: dict[str, Process] = {}

async def _run_process(self, name: str)

说明: 开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task

参数:

  • name:
源代码在GitHub上查看
python
async def _run_process(self, name: str):
+    """
+        开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task
+        Args:
+            name:
+        Returns:
+        """
+    if name not in self.targets:
+        raise KeyError(f'Process {name} not found.')
+    chan_active = get_channel(f'{name}-active')
+
+    def _start_process():
+        process = Process(target=self.targets[name][0], args=self.targets[name][1], kwargs=self.targets[name][2], daemon=True)
+        self.processes[name] = process
+        process.start()
+    _start_process()
+    while True:
+        data = await chan_active.async_receive()
+        if data == 0:
+            logger.info(f'Stopping process {name}')
+            await self.lifespan.before_process_shutdown()
+            self.terminate(name)
+            break
+        elif data == 1:
+            logger.info(f'Restarting process {name}')
+            await self.lifespan.before_process_shutdown()
+            await self.lifespan.before_process_restart()
+            self.terminate(name)
+            _start_process()
+            continue
+        else:
+            logger.warning('Unknown data received, ignored.')

async def start_all(self)

说明: 对外启动方法,启动所有进程,创建asyncio task

源代码在GitHub上查看
python
async def start_all(self):
+    """
+        对外启动方法,启动所有进程,创建asyncio task
+        """
+    [asyncio.create_task(chan.start_receive_loop()) for chan in get_channels().values()]
+    [asyncio.create_task(sm.start_receive_loop()) for sm in [shared_memory]]
+    [asyncio.create_task(self._run_process(name)) for name in self.targets]

def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)

说明: 添加进程

参数:

  • name: 进程名,用于获取和唯一标识
  • target: 进程函数
  • args: 进程函数参数
  • kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
源代码在GitHub上查看
python
def add_target(self, name: str, target: TARGET_FUNC, args: tuple=(), kwargs=None):
+    """
+        添加进程
+        Args:
+            name: 进程名,用于获取和唯一标识
+            target: 进程函数
+            args: 进程函数参数
+            kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
+        """
+    if kwargs is None:
+        kwargs = {}
+    chan_active: Channel = Channel(name=f'{name}-active')
+    chan_passive: Channel = Channel(name=f'{name}-passive')
+    channel_deliver = ChannelDeliver(active=chan_active, passive=chan_passive, channel_deliver_active=channel_deliver_active_channel, channel_deliver_passive=channel_deliver_passive_channel, publish=publish_channel)
+    self.targets[name] = (_delivery_channel_wrapper, (target, channel_deliver, shared_memory, *args), kwargs)

def join_all(self)

源代码在GitHub上查看
python
def join_all(self):
+    for name, process in self.targets:
+        process.join()

def terminate(self, name: str)

说明: 终止进程并从进程字典中删除

参数:

  • name:
源代码在GitHub上查看
python
def terminate(self, name: str):
+    """
+        终止进程并从进程字典中删除
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.processes:
+        logger.warning(f'Process {name} not found.')
+        return
+    process = self.processes[name]
+    process.terminate()
+    process.join(TIMEOUT)
+    if process.is_alive():
+        process.kill()
+    logger.success(f'Process {name} terminated.')

def terminate_all(self)

源代码在GitHub上查看
python
def terminate_all(self):
+    for name in self.targets:
+        self.terminate(name)

def is_process_alive(self, name: str) -> bool

说明: 检查进程是否存活

参数:

  • name:
源代码在GitHub上查看
python
def is_process_alive(self, name: str) -> bool:
+    """
+        检查进程是否存活
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.targets:
+        logger.warning(f'Process {name} not found.')
+    return self.processes[name].is_alive()

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/dev/dev.html b/dev/api/dev/dev.html new file mode 100644 index 00000000..bd4811ee --- /dev/null +++ b/dev/api/dev/dev.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.dev | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/dev/index.html b/dev/api/dev/index.html new file mode 100644 index 00000000..d16039c3 --- /dev/null +++ b/dev/api/dev/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.dev | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/dev/observer.html b/dev/api/dev/observer.html new file mode 100644 index 00000000..028b1d6a --- /dev/null +++ b/dev/api/dev/observer.html @@ -0,0 +1,69 @@ + + + + + + liteyuki.dev.observer | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.dev.observer

说明: 此模块用于注册观察者函数,使用watchdog监控文件变化并重启bot 启用该模块需要在配置文件中设置dev_mode为True

var CALLBACK_FUNC

  • 说明: 位置1为FileSystemEvent

  • 类型: TypeAlias

  • 默认值: Callable[[FileSystemEvent], None]

var FILTER_FUNC

  • 说明: 位置1为FileSystemEvent

  • 类型: TypeAlias

  • 默认值: Callable[[FileSystemEvent], bool]

def debounce(wait)

说明: 防抖函数

源代码在GitHub上查看
python
def debounce(wait):
+    """
+    防抖函数
+    """
+
+    def decorator(func):
+
+        def wrapper(*args, **kwargs):
+            nonlocal last_call_time
+            current_time = time.time()
+            if current_time - last_call_time > wait:
+                last_call_time = current_time
+                return func(*args, **kwargs)
+        last_call_time = None
+        return wrapper
+    return decorator

class CodeModifiedHandler(FileSystemEventHandler)

@debounce(1)

def on_modified(self, event)

源代码在GitHub上查看
python
@debounce(1)
+def on_modified(self, event):
+    raise NotImplementedError('on_modified must be implemented')

def on_created(self, event)

源代码在GitHub上查看
python
def on_created(self, event):
+    self.on_modified(event)

def on_deleted(self, event)

源代码在GitHub上查看
python
def on_deleted(self, event):
+    self.on_modified(event)

def on_moved(self, event)

源代码在GitHub上查看
python
def on_moved(self, event):
+    self.on_modified(event)

def on_any_event(self, event)

源代码在GitHub上查看
python
def on_any_event(self, event):
+    self.on_modified(event)

def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]

说明: 注册文件系统变化监听器

参数:

  • directories: 监听目录们
  • recursive: 是否递归监听子目录
  • event_filter: 事件过滤器, 返回True则执行回调函数

返回: 装饰器,装饰一个函数在接收到数据后执行

源代码在GitHub上查看
python
def on_file_system_event(directories: tuple[str], recursive: bool=True, event_filter: FILTER_FUNC=None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]:
+    """
+    注册文件系统变化监听器
+    Args:
+        directories: 监听目录们
+        recursive: 是否递归监听子目录
+        event_filter: 事件过滤器, 返回True则执行回调函数
+    Returns:
+        装饰器,装饰一个函数在接收到数据后执行
+    """
+
+    def decorator(func: CALLBACK_FUNC) -> CALLBACK_FUNC:
+
+        def wrapper(event: FileSystemEvent):
+            if event_filter is not None and (not event_filter(event)):
+                return
+            func(event)
+        code_modified_handler = CodeModifiedHandler()
+        code_modified_handler.on_modified = wrapper
+        for directory in directories:
+            observer.schedule(code_modified_handler, directory, recursive=recursive)
+        return func
+    return decorator

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/dev/plugin.html b/dev/api/dev/plugin.html new file mode 100644 index 00000000..e552909a --- /dev/null +++ b/dev/api/dev/plugin.html @@ -0,0 +1,37 @@ + + + + + + liteyuki.dev.plugin | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.dev.plugin

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/18 上午5:04 @Author : snowykami @Email : snowykami@outlook.com @File : plugin.py @Software: PyCharm

def run_plugins(*module_path: str | Path)

说明: 运行插件,无需手动初始化bot

参数:

  • module_path: 插件路径,参考liteyuki.load_plugin的函数签名
源代码在GitHub上查看
python
def run_plugins(*module_path: str | Path):
+    """
+    运行插件,无需手动初始化bot
+    Args:
+        module_path: 插件路径,参考`liteyuki.load_plugin`的函数签名
+    """
+    cfg = load_config_in_default()
+    plugins = cfg.get('liteyuki.plugins', [])
+    plugins.extend(module_path)
+    cfg['liteyuki.plugins'] = plugins
+    bot = LiteyukiBot(**cfg)
+    bot.run()

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/exception.html b/dev/api/exception.html new file mode 100644 index 00000000..8a3ca24d --- /dev/null +++ b/dev/api/exception.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.exception | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/index.html b/dev/api/index.html new file mode 100644 index 00000000..fd78ff0d --- /dev/null +++ b/dev/api/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/log.html b/dev/api/log.html new file mode 100644 index 00000000..5a4457b6 --- /dev/null +++ b/dev/api/log.html @@ -0,0 +1,43 @@ + + + + + + liteyuki.log | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.log

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午9:12 @Author : snowykami @Email : snowykami@outlook.com @File : log.py @Software: PyCharm

def get_format(level: str) -> str

源代码在GitHub上查看
python
def get_format(level: str) -> str:
+    if level == 'DEBUG':
+        return debug_format
+    else:
+        return default_format

def init_log(config: dict)

说明: 在语言加载完成后执行

源代码在GitHub上查看
python
def init_log(config: dict):
+    """
+    在语言加载完成后执行
+    Returns:
+
+    """
+    logger.remove()
+    logger.add(sys.stdout, level=0, diagnose=False, format=get_format(config.get('log_level', 'INFO')))
+    show_icon = config.get('log_icon', True)
+    logger.level('DEBUG', color='<blue>', icon=f"{('🐛' if show_icon else '')}DEBUG")
+    logger.level('INFO', color='<normal>', icon=f"{('ℹ️' if show_icon else '')}INFO")
+    logger.level('SUCCESS', color='<green>', icon=f"{('✅' if show_icon else '')}SUCCESS")
+    logger.level('WARNING', color='<yellow>', icon=f"{('⚠️' if show_icon else '')}WARNING")
+    logger.level('ERROR', color='<red>', icon=f"{('⭕' if show_icon else '')}ERROR")

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/message/event.html b/dev/api/message/event.html new file mode 100644 index 00000000..0db283d5 --- /dev/null +++ b/dev/api/message/event.html @@ -0,0 +1,61 @@ + + + + + + liteyuki.message.event | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.event

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class MessageEvent

def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)

说明: 轻雪抽象消息事件

源代码在GitHub上查看
python
def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel['MessageEvent']]=None, data: Optional[dict[str, Any]]=None):
+    """
+        轻雪抽象消息事件
+        Args:
+
+            bot_id: 机器人ID
+            message: 消息,消息段数组[{type: str, data: dict[str, Any]}]
+            raw_message: 原始消息(通常为纯文本的格式)
+            message_type: 消息类型(private, group, other)
+
+            session_id: 会话ID(私聊通常为用户ID,群聊通常为群ID)
+            session_type: 会话类型(private, group)
+            receive_channel: 接收频道(用于回复消息)
+
+            data: 附加数据
+        """
+    if data is None:
+        data = {}
+    self.message_type = message_type
+    self.data = data
+    self.bot_id = bot_id
+    self.message = message
+    self.raw_message = raw_message
+    self.session_id = session_id
+    self.session_type = session_type
+    self.user_id = user_id
+    self.receive_channel = receive_channel

def reply(self, message: str | dict[str, Any])

说明: 回复消息

参数:

  • message:
源代码在GitHub上查看
python
def reply(self, message: str | dict[str, Any]):
+    """
+        回复消息
+        Args:
+            message:
+        Returns:
+        """
+    reply_event = MessageEvent(message_type=self.session_type, message=message, raw_message='', data={'message': message}, bot_id=self.bot_id, session_id=self.session_id, user_id=self.user_id, session_type=self.session_type, receive_channel=None)
+    if self.receive_channel:
+        self.receive_channel.send(reply_event)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/message/index.html b/dev/api/message/index.html new file mode 100644 index 00000000..e82fe7d8 --- /dev/null +++ b/dev/api/message/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/message/matcher.html b/dev/api/message/matcher.html new file mode 100644 index 00000000..35ed2a6c --- /dev/null +++ b/dev/api/message/matcher.html @@ -0,0 +1,60 @@ + + + + + + liteyuki.message.matcher | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.matcher

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:51 @Author : snowykami @Email : snowykami@outlook.com @File : matcher.py @Software: PyCharm

class Matcher

def __init__(self, rule: Rule, priority: int, block: bool)

说明: 匹配器

参数:

  • rule: 规则
  • priority: 优先级 >= 0
  • block: 是否阻断后续优先级更低的匹配器
源代码在GitHub上查看
python
def __init__(self, rule: Rule, priority: int, block: bool):
+    """
+        匹配器
+        Args:
+            rule: 规则
+            priority: 优先级 >= 0
+            block: 是否阻断后续优先级更低的匹配器
+        """
+    self.rule = rule
+    self.priority = priority
+    self.block = block
+    self.handlers: list[EventHandler] = []

def handle(self) -> Callable[[EventHandler], EventHandler]

说明: 添加处理函数,装饰器

返回: 装饰器 handler

源代码在GitHub上查看
python
def handle(self) -> Callable[[EventHandler], EventHandler]:
+    """
+        添加处理函数,装饰器
+        Returns:
+            装饰器 handler
+        """
+
+    def decorator(handler: EventHandler) -> EventHandler:
+        self.handlers.append(handler)
+        return handler
+    return decorator

async def run(self, event: MessageEvent) -> None

说明: 运行处理函数

参数:

  • event:
源代码在GitHub上查看
python
async def run(self, event: MessageEvent) -> None:
+    """
+        运行处理函数
+        Args:
+            event:
+        Returns:
+        """
+    if not await self.rule(event):
+        return
+    for handler in self.handlers:
+        try:
+            await handler(event)
+        except Exception:
+            traceback.print_exc()

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/message/message.html b/dev/api/message/message.html new file mode 100644 index 00000000..afd8bb3c --- /dev/null +++ b/dev/api/message/message.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/message/on.html b/dev/api/message/on.html new file mode 100644 index 00000000..20eae514 --- /dev/null +++ b/dev/api/message/on.html @@ -0,0 +1,40 @@ + + + + + + liteyuki.message.on | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.on

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:52 @Author : snowykami @Email : snowykami@outlook.com @File : on.py @Software: PyCharm

def add_matcher(matcher: Matcher)

源代码在GitHub上查看
python
def add_matcher(matcher: Matcher):
+    for i, m in enumerate(_matcher_list):
+        if m.priority < matcher.priority:
+            _matcher_list.insert(i, matcher)
+            break
+    else:
+        _matcher_list.append(matcher)

def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

源代码在GitHub上查看
python
def on_message(rule: Rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+    matcher = Matcher(rule, priority, block)
+    add_matcher(matcher)
+    return matcher

def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

源代码在GitHub上查看
python
def on_keywords(keywords: list[str], rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+
+    @Rule
+    async def on_keywords_rule(event: MessageEvent):
+        return any((keyword in event.raw_message for keyword in keywords))
+    return on_message(on_keywords_rule & rule, priority, block)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/message/rule.html b/dev/api/message/rule.html new file mode 100644 index 00000000..ae49ac7e --- /dev/null +++ b/dev/api/message/rule.html @@ -0,0 +1,42 @@ + + + + + + liteyuki.message.rule | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.rule

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:55 @Author : snowykami @Email : snowykami@outlook.com @File : rule.py @Software: PyCharm

var RuleHandlerFunc

  • 说明: 规则函数签名

  • 类型: TypeAlias

  • 默认值: Callable[[MessageEvent], Coroutine[None, None, bool]]

class Rule

def __init__(self, handler: RuleHandlerFunc)

源代码在GitHub上查看
python
def __init__(self, handler: RuleHandlerFunc):
+    self.handler = handler

def __or__(self, other: Rule) -> Rule

源代码在GitHub上查看
python
def __or__(self, other: 'Rule') -> 'Rule':
+
+    async def combined_handler(event: MessageEvent) -> bool:
+        return await self.handler(event) or await other.handler(event)
+    return Rule(combined_handler)

def __and__(self, other: Rule) -> Rule

源代码在GitHub上查看
python
def __and__(self, other: 'Rule') -> 'Rule':
+
+    async def combined_handler(event: MessageEvent) -> bool:
+        return await self.handler(event) and await other.handler(event)
+    return Rule(combined_handler)

async def __call__(self, event: MessageEvent) -> bool

源代码在GitHub上查看
python
async def __call__(self, event: MessageEvent) -> bool:
+    if self.handler is None:
+        return True
+    return await self.handler(event)

@Rule

async def empty_rule(event: MessageEvent) -> bool

源代码在GitHub上查看
python
@Rule
+async def empty_rule(event: MessageEvent) -> bool:
+    return True

@Rule

async def is_su_rule(event: MessageEvent) -> bool

源代码在GitHub上查看
python
@Rule
+async def is_su_rule(event: MessageEvent) -> bool:
+    return str(event.user_id) in _superusers

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/message/session.html b/dev/api/message/session.html new file mode 100644 index 00000000..20cfef0d --- /dev/null +++ b/dev/api/message/session.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message.session | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/mkdoc.html b/dev/api/mkdoc.html new file mode 100644 index 00000000..f9676497 --- /dev/null +++ b/dev/api/mkdoc.html @@ -0,0 +1,186 @@ + + + + + + liteyuki.mkdoc | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.mkdoc

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 上午6:23 @Author : snowykami @Email : snowykami@outlook.com @File : mkdoc.py @Software: PyCharm

class DefType(Enum)

attr FUNCTION = 'function'

attr METHOD = 'method'

attr STATIC_METHOD = 'staticmethod'

attr CLASS_METHOD = 'classmethod'

attr PROPERTY = 'property'

class FunctionInfo(BaseModel)

attr name: str = NO_DEFAULT

attr args: list[tuple[str, str]] = NO_DEFAULT

attr return_type: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr source_code: str = ''

attr type: DefType = NO_DEFAULT

attr is_async: bool = NO_DEFAULT

class AttributeInfo(BaseModel)

attr name: str = NO_DEFAULT

attr type: str = NO_DEFAULT

attr value: Any = None

attr docstring: str = ''

class ClassInfo(BaseModel)

attr name: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr methods: list[FunctionInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr inherit: list[str] = NO_DEFAULT

class ModuleInfo(BaseModel)

attr module_path: str = NO_DEFAULT

attr functions: list[FunctionInfo] = NO_DEFAULT

attr classes: list[ClassInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr docstring: str = NO_DEFAULT

def get_relative_path(base_path: str, target_path: str) -> str

说明: 获取相对路径

参数:

  • base_path: 基础路径
  • target_path: 目标路径
源代码在GitHub上查看
python
def get_relative_path(base_path: str, target_path: str) -> str:
+    """
+    获取相对路径
+    Args:
+        base_path: 基础路径
+        target_path: 目标路径
+    """
+    return os.path.relpath(target_path, base_path)

def write_to_files(file_data: dict[str, str])

说明: 输出文件

参数:

  • file_data: 文件数据 相对路径
源代码在GitHub上查看
python
def write_to_files(file_data: dict[str, str]):
+    """
+    输出文件
+    Args:
+        file_data: 文件数据 相对路径
+    """
+    for rp, data in file_data.items():
+        if not os.path.exists(os.path.dirname(rp)):
+            os.makedirs(os.path.dirname(rp))
+        with open(rp, 'w', encoding='utf-8') as f:
+            f.write(data)

def get_file_list(module_folder: str)

源代码在GitHub上查看
python
def get_file_list(module_folder: str):
+    file_list = []
+    for root, dirs, files in os.walk(module_folder):
+        for file in files:
+            if file.endswith(('.py', '.pyi')):
+                file_list.append(os.path.join(root, file))
+    return file_list

def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo

说明: 获取函数和类

参数:

  • file_path: Python 文件路径
  • ignore_private: 忽略私有函数和类

返回: 模块信息

源代码在GitHub上查看
python
def get_module_info_normal(file_path: str, ignore_private: bool=True) -> ModuleInfo:
+    """
+    获取函数和类
+    Args:
+        file_path: Python 文件路径
+        ignore_private: 忽略私有函数和类
+    Returns:
+        模块信息
+    """
+    with open(file_path, 'r', encoding='utf-8') as file:
+        file_content = file.read()
+        tree = ast.parse(file_content)
+    dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')
+    module_docstring = ast.get_docstring(tree)
+    module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')
+    for node in ast.walk(tree):
+        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
+            if not any((isinstance(parent, ast.ClassDef) for parent in ast.iter_child_nodes(node))) and (not ignore_private or not node.name.startswith('_')):
+                if node.args.args:
+                    first_arg = node.args.args[0]
+                    if first_arg.arg in ('self', 'cls'):
+                        continue
+                function_docstring = ast.get_docstring(node)
+                func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))
+                module_info.functions.append(func_info)
+        elif isinstance(node, ast.ClassDef):
+            class_docstring = ast.get_docstring(node)
+            class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])
+            for class_node in node.body:
+                if isinstance(class_node, ast.FunctionDef) and (not ignore_private or not class_node.name.startswith('_') or class_node.name == '__init__'):
+                    method_docstring = ast.get_docstring(class_node)
+                    def_type = DefType.METHOD
+                    if class_node.decorator_list:
+                        if any((isinstance(decorator, ast.Name) and decorator.id == 'staticmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.STATIC_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'classmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.CLASS_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'property' for decorator in class_node.decorator_list)):
+                            def_type = DefType.PROPERTY
+                    class_info.methods.append(FunctionInfo(name=class_node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in class_node.args.args], return_type=ast.unparse(class_node.returns) if class_node.returns else 'None', docstring=method_docstring if method_docstring else '', type=def_type, is_async=isinstance(class_node, ast.AsyncFunctionDef), source_code=ast.unparse(class_node)))
+                elif isinstance(class_node, ast.Assign):
+                    for target in class_node.targets:
+                        if isinstance(target, ast.Name):
+                            class_info.attributes.append(AttributeInfo(name=target.id, type=ast.unparse(class_node.value)))
+            module_info.classes.append(class_info)
+        elif isinstance(node, ast.Assign):
+            if not any((isinstance(parent, (ast.ClassDef, ast.FunctionDef)) for parent in ast.iter_child_nodes(node))):
+                for target in node.targets:
+                    if isinstance(target, ast.Name) and (not ignore_private or not target.id.startswith('_')):
+                        attr_type = NO_TYPE_HINT
+                        if isinstance(node.value, ast.AnnAssign) and node.value.annotation:
+                            attr_type = ast.unparse(node.value.annotation)
+                        module_info.attributes.append(AttributeInfo(name=target.id, type=attr_type, value=ast.unparse(node.value) if node.value else None))
+    return module_info

def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str

说明: 生成模块的Markdown 你可在此自定义生成的Markdown格式

参数:

  • module_info: 模块信息
  • front_matter: 自定义选项title, index, icon, category
  • lang: 语言

返回: Markdown 字符串

源代码在GitHub上查看
python
def generate_markdown(module_info: ModuleInfo, front_matter=None, lang: str='zh-CN') -> str:
+    """
+    生成模块的Markdown
+    你可在此自定义生成的Markdown格式
+    Args:
+        module_info: 模块信息
+        front_matter: 自定义选项title, index, icon, category
+        lang: 语言
+    Returns:
+        Markdown 字符串
+    """
+    content = ''
+    front_matter = '---\n' + '\n'.join([f'{k}: {v}' for k, v in front_matter.items()]) + '\n---\n\n'
+    content += front_matter
+    for func in module_info.functions:
+        args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]
+        content += f"### ***{('async ' if func.is_async else '')}def*** `{func.name}({', '.join(args_with_type)}) -> {func.return_type}`\n\n"
+        func.docstring = func.docstring.replace('\n', '\n\n')
+        content += f'{func.docstring}\n\n'
+        content += f'<details>\n<summary>源代码</summary>\n\n```python\n{func.source_code}\n```\n</details>\n\n'
+    for cls in module_info.classes:
+        if cls.inherit:
+            inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''
+            content += f'### ***class*** `{cls.name}{inherit}`\n\n'
+        else:
+            content += f'### ***class*** `{cls.name}`\n\n'
+        cls.docstring = cls.docstring.replace('\n', '\n\n')
+        content += f'{cls.docstring}\n\n'
+        for method in cls.methods:
+            if method.type != DefType.METHOD:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]
+                content += f'### &emsp; ***@{method.type.value}***\n'
+            else:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]
+            content += f"### &emsp; ***{('async ' if method.is_async else '')}def*** `{method.name}({', '.join(args_with_type)}) -> {method.return_type}`\n\n"
+            method.docstring = method.docstring.replace('\n', '\n\n')
+            content += f'&emsp;{method.docstring}\n\n'
+            if lang == 'zh-CN':
+                TEXT_SOURCE_CODE = '源代码'
+            else:
+                TEXT_SOURCE_CODE = 'Source Code'
+            content += f'<details>\n<summary>{TEXT_SOURCE_CODE}</summary>\n\n```python\n{method.source_code}\n```\n</details>\n\n'
+        for attr in cls.attributes:
+            content += f'### &emsp; ***attr*** `{attr.name}: {attr.type}`\n\n'
+    for attr in module_info.attributes:
+        if attr.type == NO_TYPE_HINT:
+            content += f'### ***var*** `{attr.name} = {attr.value}`\n\n'
+        else:
+            content += f'### ***var*** `{attr.name}: {attr.type} = {attr.value}`\n\n'
+        attr.docstring = attr.docstring.replace('\n', '\n\n')
+        content += f'{attr.docstring}\n\n'
+    return content

def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)

说明: 生成文档

参数:

  • module_folder: 模块文件夹
  • output_dir: 输出文件夹
  • with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
  • ignored_paths: 忽略的路径
  • lang: 语言
源代码在GitHub上查看
python
def generate_docs(module_folder: str, output_dir: str, with_top: bool=False, lang: str='zh-CN', ignored_paths=None):
+    """
+    生成文档
+    Args:
+        module_folder: 模块文件夹
+        output_dir: 输出文件夹
+        with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
+        ignored_paths: 忽略的路径
+        lang: 语言
+    """
+    if ignored_paths is None:
+        ignored_paths = []
+    file_data: dict[str, str] = {}
+    file_list = get_file_list(module_folder)
+    shutil.rmtree(output_dir, ignore_errors=True)
+    os.mkdir(output_dir)
+    replace_data = {'__init__': 'README', '.py': '.md'}
+    for pyfile_path in file_list:
+        if any((ignored_path.replace('\\', '/') in pyfile_path.replace('\\', '/') for ignored_path in ignored_paths)):
+            continue
+        no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)
+        rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
+        for rk, rv in replace_data.items():
+            rel_md_path = rel_md_path.replace(rk, rv)
+        abs_md_path = os.path.join(output_dir, rel_md_path)
+        module_info = get_module_info_normal(pyfile_path)
+        if 'README' in abs_md_path:
+            front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}
+        else:
+            front_matter = {'title': module_info.module_path.replace('_', '\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}
+        md_content = generate_markdown(module_info, front_matter)
+        print(f'Generate {pyfile_path} -> {abs_md_path}')
+        file_data[abs_md_path] = md_content
+    write_to_files(file_data)

var no_module_name_pyfile_path

  • 说明: 去头路径

  • 默认值: get_relative_path(module_folder, pyfile_path)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/plugin/index.html b/dev/api/plugin/index.html new file mode 100644 index 00000000..4f946b66 --- /dev/null +++ b/dev/api/plugin/index.html @@ -0,0 +1,32 @@ + + + + + + liteyuki.plugin | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/plugin/load.html b/dev/api/plugin/load.html new file mode 100644 index 00000000..3b74d8a5 --- /dev/null +++ b/dev/api/plugin/load.html @@ -0,0 +1,108 @@ + + + + + + liteyuki.plugin.load | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugin.load

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : snowykami@outlook.com @File : load.py @Software: PyCharm

def load_plugin(module_path: str | Path) -> Optional[Plugin]

说明: 加载单个插件,可以是本地插件或是通过 pip 安装的插件。

参数:

  • module_path: 插件名称 path.to.your.plugin
  • 或插件路径 pathlib.Path(path/to/your/plugin):
源代码在GitHub上查看
python
def load_plugin(module_path: str | Path) -> Optional[Plugin]:
+    """加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。
+
+    参数:
+        module_path: 插件名称 `path.to.your.plugin`
+        或插件路径 `pathlib.Path(path/to/your/plugin)`
+    """
+    module_path = path_to_module_name(Path(module_path)) if isinstance(module_path, Path) else module_path
+    try:
+        module = import_module(module_path)
+        _plugins[module.__name__] = Plugin(name=module.__name__, module=module, module_name=module_path)
+        if module.__dict__.get('__plugin_metadata__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_metadata__']
+            display_name = module.__name__.split('.')[-1]
+        elif module.__dict__.get('__liteyuki_plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__liteyuki_plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        elif module.__dict__.get('__plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        else:
+            logger.opt(colors=True).warning(f'The metadata of Liteyuki plugin "{module.__name__}" is not specified, use empty.')
+            metadata = PluginMetadata(name=module.__name__)
+            display_name = module.__name__.split('.')[-1]
+        _plugins[module.__name__].metadata = metadata
+        logger.opt(colors=True).success(f'Succeeded to load liteyuki plugin "{display_name}"')
+        return _plugins[module.__name__]
+    except Exception as e:
+        logger.opt(colors=True).success(f'Failed to load liteyuki plugin "<r>{module_path}</r>"')
+        traceback.print_exc()
+        return None

def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]

说明: 导入文件夹下多个插件

参数:

  • plugin_dir: 文件夹路径
  • ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
源代码在GitHub上查看
python
def load_plugins(*plugin_dir: str, ignore_warning: bool=True) -> set[Plugin]:
+    """导入文件夹下多个插件
+
+    参数:
+        plugin_dir: 文件夹路径
+        ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
+    """
+    plugins = set()
+    for dir_path in plugin_dir:
+        if not os.path.exists(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' does not exist.")
+            continue
+        if not os.listdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is empty.")
+            continue
+        if not os.path.isdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is not a directory.")
+            continue
+        for f in os.listdir(dir_path):
+            path = Path(os.path.join(dir_path, f))
+            module_name = None
+            if os.path.isfile(path) and f.endswith('.py') and (f != '__init__.py'):
+                module_name = f'{path_to_module_name(Path(dir_path))}.{f[:-3]}'
+            elif os.path.isdir(path) and os.path.exists(os.path.join(path, '__init__.py')):
+                module_name = path_to_module_name(path)
+            if module_name:
+                load_plugin(module_name)
+                if _plugins.get(module_name):
+                    plugins.add(_plugins[module_name])
+    return plugins

def format_display_name(display_name: str, plugin_type: PluginType) -> str

说明: 设置插件名称颜色,根据不同类型插件设置颜色

参数:

  • display_name: 插件名称
  • plugin_type: 插件类型

返回: str: 设置后的插件名称

源代码在GitHub上查看
python
def format_display_name(display_name: str, plugin_type: PluginType) -> str:
+    """
+    设置插件名称颜色,根据不同类型插件设置颜色
+    Args:
+        display_name: 插件名称
+        plugin_type: 插件类型
+
+    Returns:
+        str: 设置后的插件名称 <y>name</y>
+    """
+    color = 'y'
+    match plugin_type:
+        case PluginType.APPLICATION:
+            color = 'm'
+        case PluginType.TEST:
+            color = 'g'
+        case PluginType.MODULE:
+            color = 'e'
+        case PluginType.SERVICE:
+            color = 'c'
+    return f'<{color}>{display_name} [{plugin_type.name}]</{color}>'

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/plugin/manager.html b/dev/api/plugin/manager.html new file mode 100644 index 00000000..d9dd381a --- /dev/null +++ b/dev/api/plugin/manager.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.plugin.manager | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/plugin/model.html b/dev/api/plugin/model.html new file mode 100644 index 00000000..6c3d82b9 --- /dev/null +++ b/dev/api/plugin/model.html @@ -0,0 +1,27 @@ + + + + + + liteyuki.plugin.model | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugin.model

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/24 上午12:02 @Author : snowykami @Email : snowykami@outlook.com @File : model.py @Software: PyCharm

class PluginType(Enum)

attr APPLICATION = 'application'

attr SERVICE = 'service'

attr MODULE = 'module'

attr UNCLASSIFIED = 'unclassified'

attr TEST = 'test'

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr type: PluginType = PluginType.UNCLASSIFIED

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)

def __hash__(self)

源代码在GitHub上查看
python
def __hash__(self):
+    return hash(self.module_name)

attr model_config = {'arbitrary_types_allowed': True}

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr metadata: Optional[PluginMetadata] = None

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/plugin/plugin.html b/dev/api/plugin/plugin.html new file mode 100644 index 00000000..8bce9bfe --- /dev/null +++ b/dev/api/plugin/plugin.html @@ -0,0 +1,32 @@ + + + + + + liteyuki.plugin | 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/api/plugins/liteecho.html b/dev/api/plugins/liteecho.html new file mode 100644 index 00000000..9cee7359 --- /dev/null +++ b/dev/api/plugins/liteecho.html @@ -0,0 +1,28 @@ + + + + + + liteyuki.plugins.liteecho | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.liteecho

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/22 下午12:31 @Author : snowykami @Email : snowykami@outlook.com @File : liteecho.py @Software: PyCharm

@on_startswith(['liteecho'], rule=is_su_rule).handle()

async def liteecho(event: MessageEvent)

源代码在GitHub上查看
python
@on_startswith(['liteecho'], rule=is_su_rule).handle()
+async def liteecho(event: MessageEvent):
+    event.reply(event.raw_message.strip()[8:].strip())

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/plugins/plugin_loader/index.html b/dev/api/plugins/plugin_loader/index.html new file mode 100644 index 00000000..fd53f157 --- /dev/null +++ b/dev/api/plugins/plugin_loader/index.html @@ -0,0 +1,33 @@ + + + + + + liteyuki.plugins.plugin_loader | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.plugin_loader

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

说明: 默认插件加载器,应在初始化时调用

源代码在GitHub上查看
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/plugins/plugin_loader/plugin_loader.html b/dev/api/plugins/plugin_loader/plugin_loader.html new file mode 100644 index 00000000..2629a37c --- /dev/null +++ b/dev/api/plugins/plugin_loader/plugin_loader.html @@ -0,0 +1,33 @@ + + + + + + liteyuki.plugins.plugin_loader | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.plugin_loader

说明: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

说明: 默认插件加载器,应在初始化时调用

源代码在GitHub上查看
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/api/utils.html b/dev/api/utils.html new file mode 100644 index 00000000..4c1563c7 --- /dev/null +++ b/dev/api/utils.html @@ -0,0 +1,95 @@ + + + + + + liteyuki.utils | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

liteyuki.utils

说明: 一些常用的工具类,部分来源于 nonebot 并遵循其许可进行修改

def is_coroutine_callable(call: Callable[..., Any]) -> bool

说明: 判断是否为协程可调用对象

参数:

  • call: 可调用对象

返回: bool: 是否为协程可调用对象

源代码在GitHub上查看
python
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
+    """
+    判断是否为协程可调用对象
+    Args:
+        call: 可调用对象
+    Returns:
+        bool: 是否为协程可调用对象
+    """
+    if inspect.isroutine(call):
+        return inspect.iscoroutinefunction(call)
+    if inspect.isclass(call):
+        return False
+    func_ = getattr(call, '__call__', None)
+    return inspect.iscoroutinefunction(func_)

def run_coroutine(*coro: Coroutine)

说明: 运行协程

参数:

  • coro:
源代码在GitHub上查看
python
def run_coroutine(*coro: Coroutine):
+    """
+    运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    try:
+        loop = asyncio.get_running_loop()
+        if loop.is_running():
+            for c in coro:
+                asyncio.ensure_future(c)
+        else:
+            for c in coro:
+                loop.run_until_complete(c)
+    except RuntimeError:
+        loop = asyncio.new_event_loop()
+        asyncio.set_event_loop(loop)
+        loop.run_until_complete(asyncio.gather(*coro))
+        loop.close()
+    except Exception as e:
+        logger.error(f'Exception occurred: {e}')

def run_coroutine_in_thread(*coro: Coroutine)

说明: 在新线程中运行协程

参数:

  • coro:
源代码在GitHub上查看
python
def run_coroutine_in_thread(*coro: Coroutine):
+    """
+    在新线程中运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    threading.Thread(target=run_coroutine, args=coro, daemon=True).start()

def path_to_module_name(path: Path) -> str

说明: 转换路径为模块名

参数:

  • path: 路径a/b/c/d -> a.b.c.d

返回: str: 模块名

源代码在GitHub上查看
python
def path_to_module_name(path: Path) -> str:
+    """
+    转换路径为模块名
+    Args:
+        path: 路径a/b/c/d -> a.b.c.d
+    Returns:
+        str: 模块名
+    """
+    rel_path = path.resolve().relative_to(Path.cwd().resolve())
+    if rel_path.stem == '__init__':
+        return '.'.join(rel_path.parts[:-1])
+    else:
+        return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]

说明: 异步包装器

参数:

  • func: Sync Callable

返回: Coroutine: Asynchronous Callable

源代码在GitHub上查看
python
def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]:
+    """
+    异步包装器
+    Args:
+        func: Sync Callable
+    Returns:
+        Coroutine: Asynchronous Callable
+    """
+
+    async def wrapper(*args, **kwargs):
+        return func(*args, **kwargs)
+    wrapper.__signature__ = inspect.signature(func)
+    return wrapper

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/comm.html b/dev/comm.html new file mode 100644 index 00000000..a737a41b --- /dev/null +++ b/dev/comm.html @@ -0,0 +1,68 @@ + + + + + + 进程通信 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

通道通信

简介

轻雪运行在主进程 MainProcess 里,其他插件框架进程是伴随的子进程,因此无法通过内存共享和直接对象传递的方式进行通信, 轻雪提供了一个通道Channel用于跨进程通信, 你可以通过Channel发送消息给其他进程,也可以监听其他进程的消息。

例如子进程接收到用户信息需要重启机器人,这时可以通过通道对主进程发送消息,主进程接收到消息后重启对应子进程。

示例

通道是全双工的,有两种接收模式,但一个通道只能使用一种,即被动模式和主动模式,被动模式由chan.on_receive()装饰回调函数实现,主动模式需调用chan.receive()实现

  • 创建子进程的同时会初始化一个被动通道和一个主动通道,且通道标识为{process_name}-active{process_name}-passive
  • 主进程中通过get_channel函数获取通道对象
  • 子进程中导入单例active_channelpassive_channel即可

在轻雪插件中(主进程中)

python
import asyncio
+
+from liteyuki.comm import get_channel, Channel
+from liteyuki import get_bot
+
+# get_channel函数获取通道对象,参数为调用set_channel时的通道标识
+channel_passive = get_channel("nonebot-passive")  # 获取被动通道
+channel_active = get_channel("nonebot-active")  # 获取主动通道
+liteyuki_bot = get_bot()
+
+
+# 注册一个函数在轻雪启动后运行
+@liteyuki_bot.on_after_start
+async def send_data():
+    while True:
+        channel_passive.send("I am liteyuki main process passive")
+        channel_active.send("I am liteyuki main process active")
+        await asyncio.sleep(3)  # 每3秒发送一次消息

在子进程中(例如NoneBot插件中)

python
from nonebot import get_driver
+from liteyuki.comm import active_channel, passive_channel  # 子进程中获取通道直接导入进程全局单例即可
+from liteyuki.log import logger
+
+driver = get_driver()
+
+
+# 被动模式,通过装饰器注册一个函数在接收到消息时运行,每次接收到字符串数据时都会运行
+@passive_channel.on_receive(filter_func=lambda data: isinstance(data, str))
+async def on_passive_receive(data):
+    logger.info(f"Passive receive: {data}")
+
+
+# 注册一个函数在NoneBot启动后运行
+@driver.on_startup
+def on_startup():
+    while True:
+        data = active_channel.receive()
+        logger.info(f"Active receive: {data}")

启动后控制台输出

log
0000-00-00 00:00:00 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:00 [ℹ️信息] Active receive: I am liteyuki main process active
+0000-00-00 00:00:03 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:03 [ℹ️信息] Active receive: I am liteyuki main process active
+...

共享内存通信

简介

  • 相比于普通进程通信,内存共享使得代码编写更加简洁,轻雪框架提供了一个内存共享通信的接口,你可以通过storage模块实现内存共享通信,该模块封装通道实现
  • 内存共享是线程安全的,你可以在多个线程中读写共享内存,线程锁会自动保护共享内存的读写操作

示例

在任意进程中均可使用

python
from liteyuki.comm.storage import shared_memory
+
+shared_memory.set("key", "value")  # 设置共享内存
+value = shared_memory.get("key")  # 获取共享内存

源代码:liteyuki/comm/storage.py

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/lyfunc.html b/dev/lyfunc.html new file mode 100644 index 00000000..6c292321 --- /dev/null +++ b/dev/lyfunc.html @@ -0,0 +1,45 @@ + + + + + + 轻雪函数 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

轻雪函数

轻雪函数 Liteyuki Function 是轻雪的一个功能,它允许你在轻雪中运行一些自定义的由数据驱动的命令,类似于Minecraft的mcfunction,属于资源包的一部分,但需单独起篇幅.

函数文件

函数文件放在资源包的functions目录下,文件名以.mcfunction .lyfunction .lyf结尾,例如test.mcfunction,文件内容为一系列的命令,每行一个命令,支持单行注释#(编辑时的语法高亮可采取shell格式),例如:

shell
# 在发信器输出"hello world"
+cmd echo hello world
+
+# 如果你想同时输出多行内容可以尝试换行符(Python格式)
+cmd echo hello world\nLiteyuki bot

也支持句末注释,例如:

shell
cmd echo hello world # 输出"hello world"

命令文档

shell
var <var1=value1> [var2=value2] ...  # 定义变量
+cmd <command>  # 在设备上执行命令
+api <api_name> [var=value...]  # 调用Bot API
+function <func_name> # 调用函数,可递归
+sleep <time>  # 异步等待,单位s
+nohup <command>  # 使用新的task执行命令,即不等待
+end # 结束函数关键字,包括子task
+await # 等待所有异步任务结束,若函数中启动了其他task,需要在最后调用,否则task对象会被销毁

示例

shell
# 疯狂戳好友
+# 使用 /function poke user_id=123456 执行
+# 每隔0.2s戳两次,无限戳,会触发最大递归深度限制
+# 若要戳20s后停止,则需要删除await,添加sleep 20和end
+api friend_poke user_id=user_id
+api friend_poke user_id=user_id
+sleep 0.2
+nohup function poke
+await

API

理论上所有基于onebotv11的api都可调用,不同Adapter api也有差别.

Onebot v11 API文档

结束关键字

由于LiteyukiBot基于异步运行, 所以在编写lyfunction时也要注意异步的调用,避免出现"单线程走到底"的情况是效率提升的关键.

await 异步任务结束关键字,用于结束当前已完成function的执行

WARNING

但若出现非单function的情况,有一个task任务没有完成而await被执行了,那么当前所有函数包的task都会被截停销毁

TIP

编写轻雪函数推荐你使用VS Code插件Liteyuki Function实现语法高亮

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/plugin.html b/dev/plugin.html new file mode 100644 index 00000000..87b45f61 --- /dev/null +++ b/dev/plugin.html @@ -0,0 +1,57 @@ + + + + + + 轻雪插件开发 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

简介

轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能

开始

创建插件

一个.py文件或一个包含__init__.py的文件夹即可被识别为插件

首先创建一个文件夹,例如watchdog_plugin,并在其中创建一个__init__.py文件,即可创建一个插件

__init__.py

python
from liteyuki.plugin import PluginMetadata, PluginType
+from .watch_dog import *    # 导入逻辑部分
+
+# 定义插件元数据
+__plugin_meta__ = PluginMetadata(
+    name="NoneDog",  # 插件名称
+    version="1.0.0",  # 插件版本
+    description="A simple plugin for nonebot developer",  # 插件描述
+    type=PluginType.SERVICE  # 插件类型
+)
+
+# 你的插件代码
+...

编写逻辑部分

轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信 以下我们会编写一个简单的插件,用于开发NoneBot时进行文件系统变更重载 watch_dog.py

python
import os
+from liteyuki.dev import observer  # 导入文件系统观察器
+from liteyuki import get_bot, logger  # 导入轻雪Bot和日志
+from watchdog.events import FileSystemEvent  # 导入文件系统事件
+
+liteyuki = get_bot()  # 获取唯一的轻雪Bot实例
+
+exclude_extensions = (".pyc", ".pyo")  # 排除的文件扩展名
+
+
+# 用observer的on_file_system_event装饰器监听文件系统事件
+@observer.on_file_system_event(
+    directories=("src/nonebot_plugins",),
+    event_filter=lambda event: not event.src_path.endswith(exclude_extensions) and ("__pycache__" not in event.src_path) and os.path.isfile(event.src_path)
+)
+def restart_nonebot_process(event: FileSystemEvent):
+    logger.debug(f"File {event.src_path} changed, reloading nonebot...")
+    liteyuki.restart_process("nonebot")  # 调用重启进程方法

加载插件

方法1

  • 在配置文件中的liteyuki.plugins中添加你的插件路径,例如watchdog_plugin,重启轻雪即可加载插件。

方法2

  • 使用开发工具快速运行插件,无需手动创建实例
  • 创建入口文件,例如main.py,并在其中写入以下代码
python
from liteyuki.dev.plugin import run_plugins
+
+run_plugins("watchdog_plugin")

然后运行python main.py即可启动插件

启用插件后,我们在src/nonebot_plugins下创建一个文件,例如test.py,并在其中写入一些代码,保存后轻雪会自动重载NoneBot进程

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/dev/resource.html b/dev/resource.html new file mode 100644 index 00000000..6a4dfc04 --- /dev/null +++ b/dev/resource.html @@ -0,0 +1,38 @@ + + + + + + 资源包开发 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

简介

资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码

  • 资源/主题商店提供了一些资源包供你选择,你也可以自己制作资源包
  • 资源包的制作很简单,如果你接触过Minecraft的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。
  • 部分内容制作需要一点点前端基础,例如htmlcss
  • 轻雪原版资源包请查看LiteyukiBot/liteyuki/resources,可以在此基础上进行修改
  • 欢迎各位投稿资源包到轻雪资源商店

请注意,主题包中的html渲染使用Js来规定数据的渲染位置,请确保您所编写的html代码能被Bot解析,否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码,以避免出现无法预料的问题。


加载资源包

  • 资源包通常是以.zip格式压缩的,只需要将其解压到根目录resources目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的
shell
main.py
+resources
+└─resource_pack_1
+    ├─metadata.yml
+    ├─templates
+    └───...
+└─resource_pack_2
+    ├─metadata.yml
+    └─...
  • 你自己制作的资源包也应该遵循这个规则,并且应该在metadata.yml中填写一些信息
  • 若没有metadata.yml文件,则该文件夹不会被识别为资源包
yaml
name: "资源包名称"
+version: "1.0.0"
+description: "资源包描述"
+# 你可以自定义一些信息,但请保证以上三个字段
+...
  • 资源包加载遵循一个优先级,即后加载的资源包会覆盖前面的资源包,例如,你在A包中定义了一个index.html文件,B包也定义了一个index.html文件,那么加载B包后,A包中的index.html文件会被覆盖
  • 对于不同资源包的不同文件,是可以相对引用的,例如你在A中定义了templates/index.html,在B中定义了templates/style.css,可以在A的index.html中用./style.css相对路径引用B中的css

TIP

资源包的结构会随着轻雪的更新而有变动,第三方资源包开发者需要注意版本兼容性,同时用户也应该自行选择可用的资源包

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/en/deploy/config.html b/en/deploy/config.html new file mode 100644 index 00000000..7c465fcc --- /dev/null +++ b/en/deploy/config.html @@ -0,0 +1,54 @@ + + + + + + Configurations | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

Configurations

LiteyukiBot supports yaml, json, and toml as configuration files, depending on your personal preference.

When you first run LiteyukiBot, it will generate config.yml and the config directory. You can modify the configuration items and restart LiteyukiBot. In most cases, you only need to modify the superusers and nickname fields.

When starting, LiteyukiBot will load all configuration files in the project directory config.yml/yaml/json/toml and the config directory. You can create multiple configuration files in the config directory, and LiteyukiBot will automatically merge these configuration files.

Basic Configuration

yaml
# NoneBot configuration
+nonebot:
+  command_start: [ "/", "" ] # Command prefix, if there is no "" empty command header, please enable alconna_use_command_start to ensure alconna parsing is normal
+  host: 127.0.0.1 # Listening address, default is local, if you want to receive external requests, please fill in
+  port: 20216 # Binding port
+  nickname: [ "liteyuki" ]  # Bot nickname list
+  superusers: [ "1919810" ]  # Superuser list
+liteyuki:
+  log_level: "INFO" # Log level
+  log_icon: true # Whether to display the log level icon (some console fonts are not available)
+  auto_report: true # Whether to automatically report problems to Liteyuki server
+  auto_update: true # Whether to automatically update Liteyuki, check for updates at 4 am every day
+  plugins: [ ] # Liteyuki plugin list
+  plugin_dirs: [ ] # Liteyuki plugin directory list

Other configurations

The following is the default value. If you need to customize it, please add it manually

yaml
# Advanced configuration
+nonebot:
+  onebot_access_token: "" # OneBot access token
+  default_language: "zh-CN" # Default language
+  alconna_auto_completion: false # alconna auto completion
+  safe_mode: false # Safe mode, if true, the bot will not load any plugins
+  # other nonebot configurations
+  custom_config_1: "custom_value1"
+  custom_config_2: "custom_value2"
+
+# development configuration
+liteyuki:
+  allow_update: true # Whether to allow Liteyuki to update
+  debug: false  # Debug mode, if true, Liteyuki will output more detailed logs
+  dev_mode: false # development mode, if true, Liteyuki will load all plugins in the development directory
+...
yaml

Example: Configuration of OneBot implementation side connected to NoneBot

In production environments, it is recommended to use reverse WebSocket The fields provided by different implementation sides may be different, but basically the same. Here is a reference value

FieldsValueDescription
protocolReverse WebSocketLiteyuki-NoneBot as server
addressws://127.0.0.1:20216/onebot/v11/wsThe address depends on the configuration file, the default is `
AccessToken""If you have configured AccessToken for Liteyuki, please fill in the same value here
  • To use other communication methods, please visit OneBot Adapter for detailed information

Other

  • Liteyuki is not limited to the OneBot adapter and NoneBot2. You can use any adapter supported by NoneBot2 or use the Liteyuki message delivery plugin

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/deploy/fandq.html b/en/deploy/fandq.html new file mode 100644 index 00000000..f7a92ff6 --- /dev/null +++ b/en/deploy/fandq.html @@ -0,0 +1,26 @@ + + + + + + FAQ | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

FAQ

Frequently Asked Questions

  • There are too many python interpreters on my computer, how do I know which one to use?

    • You can specify which python interpreter to use by using the full path to the python executable, for example, /path/to/python main.py
    • Use virtual environments to avoid conflicts between different python interpreters
  • Why does the bot not respond after I start it?

    • Please check the configuration file command_start or superusers, make sure you have permission to use the command and send it correctly
    • Make sure the command header does not conflict with nickname{}, for example, a command is help, but the Bot nickname has a help, then it will be parsed as a nickname instead of a command
  • Update Liteyuki failed, error InvalidGitRepositoryError

    • Please install Git correctly and deploy Liteyuki using cloning instead of direct download
  • How to log in to chat platforms such as Telegram?

    • If you have this question, it means you don't know much about this project. This project does not implement the login function, only the message processing and response. The login function is provided by the implementation side (protocol side). The implementation side itself does not handle response logic. It processes and reports messages to Liteyuki according to the OneBot standard. You need to use an implementation side that complies with the OneBot standard to connect to Liteyuki and report messages to Liteyuki. Some recommended implementation sides have been listed below
  • Playwright installation failed

    • Enter playwright install to install the browser
  • Some plugins report errors after installation and cannot be started

    • Please refer to the plugin documentation first, confirm that the necessary configuration items of the plugin are intact, and if the problem persists, please contact the plugin author or start Liteyuki in safe mode safe_mode: true. In safe mode, you can use npm uninstall to uninstall problematic plugins

Other questions

  1. Lagrange.OneBot, based on Lagrange.Core, a Linux QQ implementation, supports OneBotv11 protocol
  2. LLOneBot, a plugin for Liteloader NTQQ, supports OneBotv11 protocol
  3. OpenShamrock, based on Lsposed, supports kritor protocol
  4. TRSS-Yunzai, based on Node.js, supports OneBotv11 protocol
  5. go-cqhttp,A QQ Client based on go, supports OneBotv11 protocol
  6. Gensokyo, use QQ protocol
  1. MinecraftOneBot, We develop a Minecraft server chat bot

Other project encountered issues, please prioritize the documentation and issues of the project itself, don't ask LiteyukiBot developers

Acknowledgements

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/deploy/install.html b/en/deploy/install.html new file mode 100644 index 00000000..3ad9efad --- /dev/null +++ b/en/deploy/install.html @@ -0,0 +1,33 @@ + + + + + + Install | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

Install

Normal Installation

  1. Install Git and Python3.10+ Environment.
bash
# Clone the project
+git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
+# change directory
+cd LiteyukiBot
+# install dependencies
+pip install -r requirements.txt
+# start the bot!
+python main.py

TIP

It is recommended to use a virtual environment to run Liteyuki to avoid dependency conflicts. You can use python -m venv .venv to create a virtual environment, and then use .venv\Scripts\activate to activate the virtual environment (use source .venv/bin/activate to activate on Linux).

Run with Docker

  1. Install Docker
  2. Clone Repo git clone https://github.com/LiteyukiStudio/LiteyukiBot --depth=1
  3. Change directory cd LiteyukiBot
  4. Build docker image docker build -t liteyukibot .
  5. Run container docker run -p 20216:20216 -v $(pwd):/liteyukibot -v $(pwd)/.cache:/root/.cache liteyukibot

TIP

If you are using Windows, please use the absolute project directory /path/to/LiteyukiBot instead of $&#40;pwd&#41;
If you have modified the port number, please replace 20216:20216 with your port number

Use TRSS Script

TRSS_Liteyuki Management Script, which provides a more convenient way to manage LiteyukiBot, recommended to use Arch Linux

Device Requirements

  • Windows system version minimum Windows10+/Windows Server 2019+
  • Linux system requires Python3.10+, recommended Ubuntu 20.04+
  • CPU: at least 1vCPU
  • Memory: Bot without other plugins will occupy 300~500MB, including chromium and node processes, other plugins depend on specific plugins, recommended 1GB or more
  • Disk: at least 1GB of space

WARNING

If there are multiple environments on the device, please use path/to/python -m pip install -r requirements.txt to install dependencies, path/to/python is the path to your Python executable

WARNING

Liteyuki's update function depends on Git. If you do not have Git installed and run the source code directly, you will not be able to use the update function

For other questions, please refer to FAQ

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/api.html b/en/dev/api/api.html new file mode 100644 index 00000000..7f6198f9 --- /dev/null +++ b/en/dev/api/api.html @@ -0,0 +1,26 @@ + + + + + + liteyuki | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/bot/bot.html b/en/dev/api/bot/bot.html new file mode 100644 index 00000000..ce2c0169 --- /dev/null +++ b/en/dev/api/bot/bot.html @@ -0,0 +1,236 @@ + + + + + + liteyuki.bot | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

Description: 初始化轻雪实例

Arguments:

  • *args:
  • **kwargs: 配置
Source code or View on GitHub
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

Description: 启动逻辑

Source code or View on GitHub
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

Description: 外部启动接口

Source code or View on GitHub
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

Description: 保持轻雪运行

Source code or View on GitHub
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

Description: 信号处理

Arguments:

  • signum:
  • frame:
Source code or View on GitHub
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

Description: 重启轻雪本体

Source code or View on GitHub
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

Description: 停止轻雪

Arguments:

  • name: 进程名称, 默认为None, 所有进程
Source code or View on GitHub
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

Description: 初始化轻雪, 自动调用

Source code or View on GitHub
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

Source code or View on GitHub
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

Description: 停止轻雪

Source code or View on GitHub
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

Description: 注册启动前的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

Description: 注册启动后的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册停止后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册进程停止前的函数,为子进程停止时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

Description: 注册进程重启前的函数,为子进程重启时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

Description: 注册重启后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

Description: 获取轻雪实例

Return: LiteyukiBot: 当前的轻雪实例

Source code or View on GitHub
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

Description: 获取配置

Arguments:

  • key: 配置键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

Description: 获取配置,兼容旧版本

Arguments:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
Source code or View on GitHub
python
def print_logo():
+    print('\x1b[34m' + '\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \n    /  |      /      |/        |/        |/  \\    /  |/  |  /  |/  |  /  |/      |\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \n    $$ |        $$ |     $$ |   $$ |__     $$  \\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\    $$ |  \n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\__$$ |$$ |$$  \\  _$$ |_ \n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \n                ' + '\x1b[0m')

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/bot/index.html b/en/dev/api/bot/index.html new file mode 100644 index 00000000..f691567a --- /dev/null +++ b/en/dev/api/bot/index.html @@ -0,0 +1,236 @@ + + + + + + liteyuki.bot | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot

class LiteyukiBot

def __init__(self, *args, **kwargs) -> None

Description: 初始化轻雪实例

Arguments:

  • *args:
  • **kwargs: 配置
Source code or View on GitHub
python
def __init__(self, *args, **kwargs) -> None:
+    """
+        初始化轻雪实例
+        Args:
+            *args:
+            **kwargs: 配置
+
+        """
+    '常规操作'
+    print_logo()
+    global _BOT_INSTANCE
+    _BOT_INSTANCE = self
+    '配置'
+    self.config: dict[str, Any] = kwargs
+    '初始化'
+    self.init(**self.config)
+    logger.info('Liteyuki is initializing...')
+    '生命周期管理'
+    self.lifespan = Lifespan()
+    self.process_manager: ProcessManager = ProcessManager(lifespan=self.lifespan)
+    '事件循环'
+    self.loop = asyncio.new_event_loop()
+    asyncio.set_event_loop(self.loop)
+    self.stop_event = threading.Event()
+    self.call_restart_count = 0
+    '加载插件加载器'
+    load_plugin('liteyuki.plugins.plugin_loader')
+    '信号处理'
+    signal.signal(signal.SIGINT, self._handle_exit)
+    signal.signal(signal.SIGTERM, self._handle_exit)
+    atexit.register(self.process_manager.terminate_all)

async def _run(self)

Description: 启动逻辑

Source code or View on GitHub
python
async def _run(self):
+    """
+        启动逻辑
+        """
+    await self.lifespan.before_start()
+    await self.process_manager.start_all()
+    await self.lifespan.after_start()
+    await self.keep_alive()

def run(self)

Description: 外部启动接口

Source code or View on GitHub
python
def run(self):
+    """
+        外部启动接口
+        """
+    try:
+        asyncio.run(self._run())
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')

async def keep_alive(self)

Description: 保持轻雪运行

Source code or View on GitHub
python
async def keep_alive(self):
+    """
+        保持轻雪运行
+        Returns:
+
+        """
+    try:
+        while not self.stop_event.is_set():
+            time.sleep(0.5)
+    except KeyboardInterrupt:
+        logger.info('Liteyuki is stopping...')
+        self.stop()

def _handle_exit(self, signum, frame)

Description: 信号处理

Arguments:

  • signum:
  • frame:
Source code or View on GitHub
python
def _handle_exit(self, signum, frame):
+    """
+        信号处理
+        Args:
+            signum:
+            frame:
+
+        Returns:
+
+        """
+    logger.info('Received signal, stopping all processes.')
+    self.stop()
+    sys.exit(0)

def restart(self, delay: int = 0)

Description: 重启轻雪本体

Source code or View on GitHub
python
def restart(self, delay: int=0):
+    """
+        重启轻雪本体
+        Returns:
+
+        """
+    if self.call_restart_count < 1:
+        executable = sys.executable
+        args = sys.argv
+        logger.info('Restarting LiteyukiBot...')
+        time.sleep(delay)
+        if platform.system() == 'Windows':
+            cmd = 'start'
+        elif platform.system() == 'Linux':
+            cmd = 'nohup'
+        elif platform.system() == 'Darwin':
+            cmd = 'open'
+        else:
+            cmd = 'nohup'
+        self.process_manager.terminate_all()
+        threading.Thread(target=os.system, args=(f"{cmd} {executable} {' '.join(args)}",)).start()
+        sys.exit(0)
+    self.call_restart_count += 1

def restart_process(self, name: Optional[str] = None)

Description: 停止轻雪

Arguments:

  • name: 进程名称, 默认为None, 所有进程
Source code or View on GitHub
python
def restart_process(self, name: Optional[str]=None):
+    """
+        停止轻雪
+        Args:
+            name: 进程名称, 默认为None, 所有进程
+        Returns:
+        """
+    if name is not None:
+        chan_active = get_channel(f'{name}-active')
+        chan_active.send(1)
+    else:
+        for process_name in self.process_manager.processes:
+            chan_active = get_channel(f'{process_name}-active')
+            chan_active.send(1)

def init(self, *args, **kwargs)

Description: 初始化轻雪, 自动调用

Source code or View on GitHub
python
def init(self, *args, **kwargs):
+    """
+        初始化轻雪, 自动调用
+        Returns:
+
+        """
+    self.init_logger()

def init_logger(self)

Source code or View on GitHub
python
def init_logger(self):
+    init_log(config=self.config)

def stop(self)

Description: 停止轻雪

Source code or View on GitHub
python
def stop(self):
+    """
+        停止轻雪
+        Returns:
+
+        """
+    self.stop_event.set()
+    self.loop.stop()

def on_before_start(self, func: LIFESPAN_FUNC)

Description: 注册启动前的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动前的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_start(func)

def on_after_start(self, func: LIFESPAN_FUNC)

Description: 注册启动后的函数

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC):
+    """
+        注册启动后的函数
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_start(func)

def on_after_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册停止后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册停止后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_shutdown(func)

def on_before_process_shutdown(self, func: LIFESPAN_FUNC)

Description: 注册进程停止前的函数,为子进程停止时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC):
+    """
+        注册进程停止前的函数,为子进程停止时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_shutdown(func)

def on_before_process_restart(self, func: LIFESPAN_FUNC)

Description: 注册进程重启前的函数,为子进程重启时调用

Arguments:

  • func:
Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册进程重启前的函数,为子进程重启时调用
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_before_process_restart(func)

def on_after_restart(self, func: LIFESPAN_FUNC)

Description: 注册重启后的函数:未实现

Arguments:

  • func:
Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC):
+    """
+        注册重启后的函数:未实现
+        Args:
+            func:
+
+        Returns:
+
+        """
+    return self.lifespan.on_after_restart(func)

def get_bot() -> LiteyukiBot

Description: 获取轻雪实例

Return: LiteyukiBot: 当前的轻雪实例

Source code or View on GitHub
python
def get_bot() -> LiteyukiBot:
+    """
+    获取轻雪实例
+
+    Returns:
+        LiteyukiBot: 当前的轻雪实例
+    """
+    if IS_MAIN_PROCESS:
+        if _BOT_INSTANCE is None:
+            raise RuntimeError('Liteyuki instance not initialized.')
+        return _BOT_INSTANCE
+    else:
+        raise RuntimeError("Can't get bot instance in sub process.")

def get_config(key: str, default: Any = None) -> Any

Description: 获取配置

Arguments:

  • key: 配置键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config(key: str, default: Any=None) -> Any:
+    """
+    获取配置
+    Args:
+        key: 配置键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    return get_bot().config.get(key, default)

def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = None) -> Any

Description: 获取配置,兼容旧版本

Arguments:

  • key: 配置键
  • compat_keys: 兼容键
  • default: 默认值

Return: Any: 配置值

Source code or View on GitHub
python
def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any=None) -> Any:
+    """
+    获取配置,兼容旧版本
+    Args:
+        key: 配置键
+        compat_keys: 兼容键
+        default: 默认值
+
+    Returns:
+        Any: 配置值
+    """
+    if key in get_bot().config:
+        return get_bot().config[key]
+    for compat_key in compat_keys:
+        if compat_key in get_bot().config:
+            logger.warning(f'Config key "{compat_key}" will be deprecated, use "{key}" instead.')
+            return get_bot().config[compat_key]
+    return default
Source code or View on GitHub
python
def print_logo():
+    print('\x1b[34m' + '\n     __        ______  ________  ________  __      __  __    __  __    __  ______ \n    /  |      /      |/        |/        |/  \\    /  |/  |  /  |/  |  /  |/      |\n    $$ |      $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$  \\  /$$/ $$ |  $$ |$$ | /$$/ $$$$$$/ \n    $$ |        $$ |     $$ |   $$ |__     $$  \\/$$/  $$ |  $$ |$$ |/$$/    $$ |  \n    $$ |        $$ |     $$ |   $$    |     $$  $$/   $$ |  $$ |$$  $$<     $$ |  \n    $$ |        $$ |     $$ |   $$$$$/       $$$$/    $$ |  $$ |$$$$$  \\    $$ |  \n    $$ |_____  _$$ |_    $$ |   $$ |_____     $$ |    $$ \\__$$ |$$ |$$  \\  _$$ |_ \n    $$       |/ $$   |   $$ |   $$       |    $$ |    $$    $$/ $$ | $$  |/ $$   |\n    $$$$$$$$/ $$$$$$/    $$/    $$$$$$$$/     $$/      $$$$$$/  $$/   $$/ $$$$$$/ \n                ' + '\x1b[0m')

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/bot/lifespan.html b/en/dev/api/bot/lifespan.html new file mode 100644 index 00000000..8534f2c2 --- /dev/null +++ b/en/dev/api/bot/lifespan.html @@ -0,0 +1,139 @@ + + + + + + liteyuki.bot.lifespan | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.bot.lifespan

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午8:24 @Author : snowykami @Email : snowykami@outlook.com @File : lifespan.py @Software: PyCharm

class Lifespan

def __init__(self) -> None

Description: 轻雪生命周期管理,启动、停止、重启

Source code or View on GitHub
python
def __init__(self) -> None:
+    """
+        轻雪生命周期管理,启动、停止、重启
+        """
+    self.life_flag: int = 0
+    self._before_start_funcs: list[LIFESPAN_FUNC] = []
+    self._after_start_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._after_shutdown_funcs: list[LIFESPAN_FUNC] = []
+    self._before_process_restart_funcs: list[LIFESPAN_FUNC] = []
+    self._after_restart_funcs: list[LIFESPAN_FUNC] = []

@staticmethod

async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None

Description: 并发运行异步函数

Arguments:

  • funcs:
Source code or View on GitHub
python
@staticmethod
+async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None:
+    """
+        并发运行异步函数
+        Args:
+            funcs:
+        Returns:
+        """
+    loop = asyncio.get_running_loop()
+    tasks = [func(*args, **kwargs) if is_coroutine_callable(func) else async_wrapper(func)(*args, **kwargs) for func in funcs]
+    await asyncio.gather(*tasks)

def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册启动时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_start_funcs.append(func)
+    return func

def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册启动时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册启动时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_start_funcs.append(func)
+    return func

def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册停止前的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止前的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_shutdown_funcs.append(func)
+    return func

def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册停止后的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册停止后的函数
+        Args:
+            func:
+
+        Returns:
+            LIFESPAN_FUNC:
+
+        """
+    self._after_shutdown_funcs.append(func)
+    return func

def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册重启时的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启时的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._before_process_restart_funcs.append(func)
+    return func

def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC

Description: 注册重启后的函数

Arguments:

  • func:

Return: LIFESPAN_FUNC:

Source code or View on GitHub
python
def on_after_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
+    """
+        注册重启后的函数
+        Args:
+            func:
+        Returns:
+            LIFESPAN_FUNC:
+        """
+    self._after_restart_funcs.append(func)
+    return func

async def before_start(self) -> None

Description: 启动前

Source code or View on GitHub
python
async def before_start(self) -> None:
+    """
+        启动前
+        Returns:
+        """
+    logger.debug('Running before_start functions')
+    await self.run_funcs(self._before_start_funcs)

async def after_start(self) -> None

Description: 启动后

Source code or View on GitHub
python
async def after_start(self) -> None:
+    """
+        启动后
+        Returns:
+        """
+    logger.debug('Running after_start functions')
+    await self.run_funcs(self._after_start_funcs)

async def before_process_shutdown(self) -> None

Description: 停止前

Source code or View on GitHub
python
async def before_process_shutdown(self) -> None:
+    """
+        停止前
+        Returns:
+        """
+    logger.debug('Running before_shutdown functions')
+    await self.run_funcs(self._before_process_shutdown_funcs)

async def after_shutdown(self) -> None

Description: 停止后

Source code or View on GitHub
python
async def after_shutdown(self) -> None:
+    """
+        停止后
+        Returns:
+        """
+    logger.debug('Running after_shutdown functions')
+    await self.run_funcs(self._after_shutdown_funcs)

async def before_process_restart(self) -> None

Description: 重启前

Source code or View on GitHub
python
async def before_process_restart(self) -> None:
+    """
+        重启前
+        Returns:
+        """
+    logger.debug('Running before_restart functions')
+    await self.run_funcs(self._before_process_restart_funcs)

async def after_restart(self) -> None

Description: 重启后

Source code or View on GitHub
python
async def after_restart(self) -> None:
+    """
+        重启后
+        Returns:
+
+        """
+    logger.debug('Running after_restart functions')
+    await self.run_funcs(self._after_restart_funcs)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/comm/channel.html b/en/dev/api/comm/channel.html new file mode 100644 index 00000000..881b9d4a --- /dev/null +++ b/en/dev/api/comm/channel.html @@ -0,0 +1,221 @@ + + + + + + liteyuki.comm.channel | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.channel

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午11:21 @Author : snowykami @Email : snowykami@outlook.com @File : channel_.py @Software: PyCharm

本模块定义了一个通用的通道类,用于进程间通信

class Channel(Generic[T])

def __init__(self, name: str, type_check: Optional[bool] = None)

Description: 初始化通道

Arguments:

  • name: 通道ID
  • type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
Source code or View on GitHub
python
def __init__(self, name: str, type_check: Optional[bool]=None):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+            type_check: 是否开启类型检查, 若为空,则传入泛型默认开启,否则默认关闭
+        """
+    self.conn_send, self.conn_recv = Pipe()
+    self._conn_send_inner, self._conn_recv_inner = Pipe()
+    self._closed = False
+    self._on_main_receive_func_ids: list[int] = []
+    self._on_sub_receive_func_ids: list[int] = []
+    self.name: str = name
+    self.is_receive_loop_running = False
+    if type_check is None:
+        type_check = self._get_generic_type() is not None
+    elif type_check:
+        if self._get_generic_type() is None:
+            raise TypeError('Type hint is required for enforcing type check.')
+    self.type_check = type_check
+    if name in _channel:
+        raise ValueError(f'Channel {name} already exists')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = self
+        logger.debug(f'Channel {name} initialized in main process')
+    else:
+        logger.debug(f'Channel {name} initialized in sub process, should manually set in main process')

def _get_generic_type(self) -> Optional[type]

Description: 获取通道传递泛型类型

Return: Optional[type]: 泛型类型

Source code or View on GitHub
python
def _get_generic_type(self) -> Optional[type]:
+    """
+        获取通道传递泛型类型
+
+        Returns:
+            Optional[type]: 泛型类型
+        """
+    if hasattr(self, '__orig_class__'):
+        return get_args(self.__orig_class__)[0]
+    return None

def _validate_structure(self, data: Any, structure: type) -> bool

Description: 验证数据结构

Arguments:

  • data: 数据
  • structure: 结构

Return: bool: 是否通过验证

Source code or View on GitHub
python
def _validate_structure(self, data: Any, structure: type) -> bool:
+    """
+        验证数据结构
+        Args:
+            data: 数据
+            structure: 结构
+
+        Returns:
+            bool: 是否通过验证
+        """
+    if isinstance(structure, type):
+        return isinstance(data, structure)
+    elif isinstance(structure, tuple):
+        if not isinstance(data, tuple) or len(data) != len(structure):
+            return False
+        return all((self._validate_structure(d, s) for d, s in zip(data, structure)))
+    elif isinstance(structure, list):
+        if not isinstance(data, list):
+            return False
+        return all((self._validate_structure(d, structure[0]) for d in data))
+    elif isinstance(structure, dict):
+        if not isinstance(data, dict):
+            return False
+        return all((k in data and self._validate_structure(data[k], structure[k]) for k in structure))
+    return False

def send(self, data: T)

Description: 发送数据,发送函数为同步函数,没有异步的必要

Arguments:

  • data: 数据
Source code or View on GitHub
python
def send(self, data: T):
+    """
+        发送数据,发送函数为同步函数,没有异步的必要
+        Args:
+            data: 数据
+        """
+    if self.type_check:
+        _type = self._get_generic_type()
+        if _type is not None and (not self._validate_structure(data, _type)):
+            raise TypeError(f'Data must be an instance of {_type}, {type(data)} found')
+    if self._closed:
+        raise RuntimeError('Cannot send to a closed channel_')
+    self.conn_send.send(data)

def receive(self) -> T

Description: 同步接收数据,会阻塞线程

Source code or View on GitHub
python
def receive(self) -> T:
+    """
+        同步接收数据,会阻塞线程
+        Args:
+        """
+    if self._closed:
+        raise RuntimeError('Cannot receive from a closed channel_')
+    while True:
+        data = self.conn_recv.recv()
+        return data

async def async_receive(self) -> T

Description: 异步接收数据,会挂起等待

Source code or View on GitHub
python
async def async_receive(self) -> T:
+    """
+        异步接收数据,会挂起等待
+        """
+    print('等待接收数据')
+    loop = asyncio.get_running_loop()
+    data = await loop.run_in_executor(None, self.receive)
+    print('接收到数据')
+    return data

def on_receive(self, filter_func: Optional[FILTER_FUNC] = None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]

Description: 接收数据并执行函数

Arguments:

  • filter_func: 过滤函数,为None则不过滤

Return: 装饰器,装饰一个函数在接收到数据后执行

Source code or View on GitHub
python
def on_receive(self, filter_func: Optional[FILTER_FUNC]=None) -> Callable[[Callable[[T], Any]], Callable[[T], Any]]:
+    """
+        接收数据并执行函数
+        Args:
+            filter_func: 过滤函数,为None则不过滤
+        Returns:
+            装饰器,装饰一个函数在接收到数据后执行
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('on_receive can only be used in main process')
+
+    def decorator(func: Callable[[T], Any]) -> Callable[[T], Any]:
+        global _func_id
+
+        async def wrapper(data: T) -> Any:
+            if filter_func is not None:
+                if is_coroutine_callable(filter_func):
+                    if not await filter_func(data):
+                        return
+                elif not filter_func(data):
+                    return
+            if is_coroutine_callable(func):
+                return await func(data)
+            else:
+                return func(data)
+        _callback_funcs[_func_id] = wrapper
+        if IS_MAIN_PROCESS:
+            self._on_main_receive_func_ids.append(_func_id)
+        else:
+            self._on_sub_receive_func_ids.append(_func_id)
+        _func_id += 1
+        return func
+    return decorator

async def _run_on_receive_funcs(self, data: Any)

Description: 运行接收函数

Arguments:

  • data: 数据
Source code or View on GitHub
python
async def _run_on_receive_funcs(self, data: Any):
+    """
+        运行接收函数
+        Args:
+            data: 数据
+        """
+    if IS_MAIN_PROCESS:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_main_receive_func_ids]
+    else:
+        [asyncio.create_task(_callback_funcs[func_id](data)) for func_id in self._on_sub_receive_func_ids]

async def start_receive_loop(self)

Description: 开始接收数据 会自动判断主进程和子进程,需要在对应进程都调度一次

Source code or View on GitHub
python
async def start_receive_loop(self):
+    """
+        开始接收数据
+        会自动判断主进程和子进程,需要在对应进程都调度一次
+        """
+    if len(self._on_main_receive_func_ids) == 0:
+        logger.warning(f'No on_receive function registered for {self.name}')
+        return
+    self.is_receive_loop_running = True
+    logger.debug(f'Starting receive loop for {self.name}')
+    while not self._closed:
+        data = await self.async_receive()
+        await self._run_on_receive_funcs(data)

var active_channel

  • Description: 子进程可用的主动和被动通道

  • Type: Channel

  • Default: Channel(name='active_channel')

var publish_channel

  • Description: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • Type: Channel[tuple[str, dict[str, Any]]]

  • Default: Channel(name='publish_channel')

var channel_deliver_active_channel

  • Description: 通道传递通道,主进程创建单例,子进程初始化时实例化

  • Type: Channel[Channel[Any]]

  • Default: NO_DEFAULT

def set_channel(name: str, channel: Channel)

Description: 设置通道实例

Arguments:

  • name: 通道名称
  • channel: 通道实例
Source code or View on GitHub
python
def set_channel(name: str, channel: 'Channel'):
+    """
+    设置通道实例
+    Args:
+        name: 通道名称
+        channel: 通道实例
+    """
+    if not isinstance(channel, Channel):
+        raise TypeError(f'channel_ must be an instance of Channel, {type(channel)} found')
+    if IS_MAIN_PROCESS:
+        if name in _channel:
+            raise ValueError(f'Channel {name} already exists')
+        _channel[name] = channel
+    else:
+        channel_deliver_passive_channel.send(('set_channel', {'name': name, 'channel_': channel}))

def set_channels(channels: dict[str, Channel])

Description: 设置通道实例

Arguments:

  • channels: 通道名称
Source code or View on GitHub
python
def set_channels(channels: dict[str, 'Channel']):
+    """
+    设置通道实例
+    Args:
+        channels: 通道名称
+    """
+    for name, channel in channels.items():
+        set_channel(name, channel)

def get_channel(name: str) -> Channel

Description: 获取通道实例

Arguments:

  • name: 通道名称
Source code or View on GitHub
python
def get_channel(name: str) -> 'Channel':
+    """
+    获取通道实例
+    Args:
+        name: 通道名称
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel[name]
+    else:
+        recv_chan = Channel[Channel[Any]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channel', {'name': name, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def get_channels() -> dict[str, Channel]

Description: 获取通道实例

Source code or View on GitHub
python
def get_channels() -> dict[str, 'Channel']:
+    """
+    获取通道实例
+    Returns:
+    """
+    if IS_MAIN_PROCESS:
+        return _channel
+    else:
+        recv_chan = Channel[dict[str, Channel[Any]]]('recv_chan')
+        channel_deliver_passive_channel.send(('get_channels', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')

def on_set_channel(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'set_channel')
+def on_set_channel(data: tuple[str, dict[str, Any]]):
+    name, channel = (data[1]['name'], data[1]['channel_'])
+    set_channel(name, channel)

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')

def on_get_channel(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channel')
+def on_get_channel(data: tuple[str, dict[str, Any]]):
+    name, recv_chan = (data[1]['name'], data[1]['recv_chan'])
+    recv_chan.send(get_channel(name))

@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')

def on_get_channels(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == 'get_channels')
+def on_get_channels(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(get_channels())

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/comm/comm.html b/en/dev/api/comm/comm.html new file mode 100644 index 00000000..5e4fdbae --- /dev/null +++ b/en/dev/api/comm/comm.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.comm | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/comm/event.html b/en/dev/api/comm/event.html new file mode 100644 index 00000000..6760ad11 --- /dev/null +++ b/en/dev/api/comm/event.html @@ -0,0 +1,28 @@ + + + + + + liteyuki.comm.event | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.event

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/26 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class Event

def __init__(self, name: str, data: dict[str, Any])

Source code or View on GitHub
python
def __init__(self, name: str, data: dict[str, Any]):
+    self.name = name
+    self.data = data

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/comm/index.html b/en/dev/api/comm/index.html new file mode 100644 index 00000000..3043af5b --- /dev/null +++ b/en/dev/api/comm/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.comm | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/comm/rpc.html b/en/dev/api/comm/rpc.html new file mode 100644 index 00000000..b030c8c7 --- /dev/null +++ b/en/dev/api/comm/rpc.html @@ -0,0 +1,31 @@ + + + + + + liteyuki.comm.rpc | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.rpc

Description: 本模块用于实现RPC(基于IPC)通信

class RPC

def __init__(self, on_calling: ON_CALLING_FUNC) -> None

Source code or View on GitHub
python
def __init__(self, on_calling: ON_CALLING_FUNC) -> None:
+    self.on_calling = on_calling

def call(self, args: tuple, kwargs: dict) -> Any

Description: 调用

Source code or View on GitHub
python
def call(self, args: tuple, kwargs: dict) -> Any:
+    """
+        调用
+        """
+    return self.on_calling(args, kwargs)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/comm/socks_channel.html b/en/dev/api/comm/socks_channel.html new file mode 100644 index 00000000..c8cfdf76 --- /dev/null +++ b/en/dev/api/comm/socks_channel.html @@ -0,0 +1,51 @@ + + + + + + liteyuki.comm.socks_channel | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.socks_channel

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/25 下午3:54 @Author : snowykami @Email : snowykami@outlook.com @File : channelv2.py @Software: PyCharm

class SocksChannel

def __init__(self, name: str)

Description: 初始化通道

Arguments:

  • name: 通道ID
Source code or View on GitHub
python
def __init__(self, name: str):
+    """
+        初始化通道
+        Args:
+            name: 通道ID
+        """
+    self._name = name
+    self._conn_send = None
+    self._conn_recv = None
+    self._closed = False

def send(self, data)

Description: 发送数据

Arguments:

  • data: 数据
Source code or View on GitHub
python
def send(self, data):
+    """
+        发送数据
+        Args:
+            data: 数据
+        """
+    pass

def receive(self)

Description: 接收数据

Return: data: 数据

Source code or View on GitHub
python
def receive(self):
+    """
+        接收数据
+        Returns:
+            data: 数据
+        """
+    pass

def close(self)

Description: 关闭通道

Source code or View on GitHub
python
def close(self):
+    """
+        关闭通道
+        """
+    pass

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/comm/storage.html b/en/dev/api/comm/storage.html new file mode 100644 index 00000000..924e9615 --- /dev/null +++ b/en/dev/api/comm/storage.html @@ -0,0 +1,169 @@ + + + + + + liteyuki.comm.storage | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.comm.storage

Description: 共享内存模块。类似于redis,但是更加轻量级并且线程安全

var _on_main_subscriber_receive_funcs

  • Description: 主进程订阅者接收函数

  • Type: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • Default: {}

var _on_sub_subscriber_receive_funcs

  • Description: 子进程订阅者接收函数

  • Type: dict[str, list[ASYNC_ON_RECEIVE_FUNC]]

  • Default: {}

class KeyValueStore

def __init__(self)

Source code or View on GitHub
python
def __init__(self):
+    self._store = {}
+    self.active_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-active')
+    self.passive_chan = Channel[tuple[str, Optional[dict[str, Any]]]](name='shared_memory-passive')
+    self.publish_channel = Channel[tuple[str, Any]](name='shared_memory-publish')
+    self.is_main_receive_loop_running = False
+    self.is_sub_receive_loop_running = False

def set(self, key: str, value: Any) -> None

Description: 设置键值对

Arguments:

  • key: 键
  • value: 值
Source code or View on GitHub
python
def set(self, key: str, value: Any) -> None:
+    """
+        设置键值对
+        Args:
+            key: 键
+            value: 值
+
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            self._store[key] = value
+    else:
+        self.passive_chan.send(('set', {'key': key, 'value': value}))

def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]

Description: 获取键值对

Arguments:

  • key: 键
  • default: 默认值

Return: Any: 值

Source code or View on GitHub
python
def get(self, key: str, default: Optional[Any]=None) -> Optional[Any]:
+    """
+        获取键值对
+        Args:
+            key: 键
+            default: 默认值
+
+        Returns:
+            Any: 值
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            return self._store.get(key, default)
+    else:
+        recv_chan = Channel[Optional[Any]]('recv_chan')
+        self.passive_chan.send(('get', {'key': key, 'default': default, 'recv_chan': recv_chan}))
+        return recv_chan.receive()

def delete(self, key: str, ignore_key_error: bool = True) -> None

Description: 删除键值对

Arguments:

  • key: 键
  • ignore_key_error: 是否忽略键不存在的错误
Source code or View on GitHub
python
def delete(self, key: str, ignore_key_error: bool=True) -> None:
+    """
+        删除键值对
+        Args:
+            key: 键
+            ignore_key_error: 是否忽略键不存在的错误
+
+        Returns:
+        """
+    if IS_MAIN_PROCESS:
+        lock = _get_lock(key)
+        with lock:
+            if key in self._store:
+                try:
+                    del self._store[key]
+                    del _locks[key]
+                except KeyError as e:
+                    if not ignore_key_error:
+                        raise e
+    else:
+        self.passive_chan.send(('delete', {'key': key}))

def get_all(self) -> dict[str, Any]

Description: 获取所有键值对

Return: dict[str, Any]: 键值对

Source code or View on GitHub
python
def get_all(self) -> dict[str, Any]:
+    """
+        获取所有键值对
+        Returns:
+            dict[str, Any]: 键值对
+        """
+    if IS_MAIN_PROCESS:
+        return self._store
+    else:
+        recv_chan = Channel[dict[str, Any]]('recv_chan')
+        self.passive_chan.send(('get_all', {'recv_chan': recv_chan}))
+        return recv_chan.receive()

def publish(self, channel_: str, data: Any) -> None

Description: 发布消息

Arguments:

  • channel_: 频道
  • data: 数据
Source code or View on GitHub
python
def publish(self, channel_: str, data: Any) -> None:
+    """
+        发布消息
+        Args:
+            channel_: 频道
+            data: 数据
+
+        Returns:
+        """
+    self.active_chan.send(('publish', {'channel': channel_, 'data': data}))

def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]

Description: 订阅者接收消息时的回调

Arguments:

  • channel_: 频道

Return: 装饰器

Source code or View on GitHub
python
def on_subscriber_receive(self, channel_: str) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]:
+    """
+        订阅者接收消息时的回调
+        Args:
+            channel_: 频道
+
+        Returns:
+            装饰器
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot subscribe in sub process.')
+
+    def decorator(func: ON_RECEIVE_FUNC) -> ON_RECEIVE_FUNC:
+
+        async def wrapper(data: Any):
+            if is_coroutine_callable(func):
+                await func(data)
+            else:
+                func(data)
+        if IS_MAIN_PROCESS:
+            if channel_ not in _on_main_subscriber_receive_funcs:
+                _on_main_subscriber_receive_funcs[channel_] = []
+            _on_main_subscriber_receive_funcs[channel_].append(wrapper)
+        else:
+            if channel_ not in _on_sub_subscriber_receive_funcs:
+                _on_sub_subscriber_receive_funcs[channel_] = []
+            _on_sub_subscriber_receive_funcs[channel_].append(wrapper)
+        return wrapper
+    return decorator

@staticmethod

async def run_subscriber_receive_funcs(channel_: str, data: Any)

Description: 运行订阅者接收函数

Arguments:

  • channel_: 频道
  • data: 数据
Source code or View on GitHub
python
@staticmethod
+async def run_subscriber_receive_funcs(channel_: str, data: Any):
+    """
+        运行订阅者接收函数
+        Args:
+            channel_: 频道
+            data: 数据
+        """
+    [asyncio.create_task(func(data)) for func in _on_main_subscriber_receive_funcs[channel_]]

async def start_receive_loop(self)

Description: 启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程

Source code or View on GitHub
python
async def start_receive_loop(self):
+    """
+        启动发布订阅接收器循环,在主进程中运行,若有子进程订阅则推送给子进程
+        """
+    if not IS_MAIN_PROCESS:
+        raise RuntimeError('Cannot start receive loop in sub process.')
+    while True:
+        data = await self.active_chan.async_receive()
+        if data[0] == 'publish':
+            await self.run_subscriber_receive_funcs(data[1]['channel'], data[1]['data'])
+            self.publish_channel.send(data)

class GlobalKeyValueStore

@classmethod

def get_instance(cls)

Source code or View on GitHub
python
@classmethod
+def get_instance(cls):
+    if cls._instance is None:
+        with cls._lock:
+            if cls._instance is None:
+                cls._instance = KeyValueStore()
+    return cls._instance

attr _instance = None

attr _lock = threading.Lock()

var _ref_count

  • Description: import 引用计数, 防止获取空指针

  • Default: 0

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')

def on_get(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get')
+def on_get(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    default = data[1]['default']
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get(key, default))

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')

def on_set(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'set')
+def on_set(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    value = data[1]['value']
+    shared_memory.set(key, value)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')

def on_delete(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'delete')
+def on_delete(data: tuple[str, dict[str, Any]]):
+    key = data[1]['key']
+    shared_memory.delete(key)

@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')

def on_get_all(data: tuple[str, dict[str, Any]])

Source code or View on GitHub
python
@shared_memory.passive_chan.on_receive(lambda d: d[0] == 'get_all')
+def on_get_all(data: tuple[str, dict[str, Any]]):
+    recv_chan = data[1]['recv_chan']
+    recv_chan.send(shared_memory.get_all())

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/config.html b/en/dev/api/config.html new file mode 100644 index 00000000..81ef4e09 --- /dev/null +++ b/en/dev/api/config.html @@ -0,0 +1,102 @@ + + + + + + liteyuki.config | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.config

Description: 该模块用于常用配置文件的加载 多配置文件编写原则: 1.尽量不要冲突: 一个键不要多次出现 2.分工明确: 每个配置文件给一个或一类服务提供配置 3.扁平化编写: 配置文件尽量扁平化,不要出现过多的嵌套 4.注意冲突时的优先级: 项目目录下的配置文件优先级高于config目录下的配置文件 5.请不要将需要动态加载的内容写入配置文件,你应该使用其他储存方式

def flat_config(config: dict[str, Any]) -> dict[str, Any]

Description: 扁平化配置文件

{a:{b:{c:1}}} ->

Arguments:

  • config: 配置项目

Return: 扁平化后的配置文件,但也包含原有的键值对

Source code or View on GitHub
python
def flat_config(config: dict[str, Any]) -> dict[str, Any]:
+    """
+    扁平化配置文件
+
+    {a:{b:{c:1}}} -> {"a.b.c": 1}
+    Args:
+        config: 配置项目
+
+    Returns:
+        扁平化后的配置文件,但也包含原有的键值对
+    """
+    new_config = copy.deepcopy(config)
+    for key, value in config.items():
+        if isinstance(value, dict):
+            for k, v in flat_config(value).items():
+                new_config[f'{key}.{k}'] = v
+    return new_config

def load_from_yaml(file_: str) -> dict[str, Any]

Description: Load config from yaml file

Source code or View on GitHub
python
def load_from_yaml(file_: str) -> dict[str, Any]:
+    """
+    Load config from yaml file
+
+    """
+    logger.debug(f'Loading YAML config from {file_}')
+    config = yaml.safe_load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_json(file_: str) -> dict[str, Any]

Description: Load config from json file

Source code or View on GitHub
python
def load_from_json(file_: str) -> dict[str, Any]:
+    """
+    Load config from json file
+    """
+    logger.debug(f'Loading JSON config from {file_}')
+    config = json.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_toml(file_: str) -> dict[str, Any]

Description: Load config from toml file

Source code or View on GitHub
python
def load_from_toml(file_: str) -> dict[str, Any]:
+    """
+    Load config from toml file
+    """
+    logger.debug(f'Loading TOML config from {file_}')
+    config = toml.load(open(file_, 'r', encoding='utf-8'))
+    return flat_config(config if config is not None else {})

def load_from_files(*files: str, *, no_warning: bool = False) -> dict[str, Any]

Description: 从指定文件加载配置项,会自动识别文件格式 默认执行扁平化选项

Source code or View on GitHub
python
def load_from_files(*files: str, no_warning: bool=False) -> dict[str, Any]:
+    """
+    从指定文件加载配置项,会自动识别文件格式
+    默认执行扁平化选项
+    """
+    config = {}
+    for file in files:
+        if os.path.exists(file):
+            if file.endswith(('.yaml', 'yml')):
+                config.update(load_from_yaml(file))
+            elif file.endswith('.json'):
+                config.update(load_from_json(file))
+            elif file.endswith('.toml'):
+                config.update(load_from_toml(file))
+            elif not no_warning:
+                logger.warning(f'Unsupported config file format: {file}')
+        elif not no_warning:
+            logger.warning(f'Config file not found: {file}')
+    return config

def load_configs_from_dirs(*directories: str, *, no_waring: bool = False) -> dict[str, Any]

Description: 从目录下加载配置文件,不递归 按照读取文件的优先级反向覆盖 默认执行扁平化选项

Source code or View on GitHub
python
def load_configs_from_dirs(*directories: str, no_waring: bool=False) -> dict[str, Any]:
+    """
+    从目录下加载配置文件,不递归
+    按照读取文件的优先级反向覆盖
+    默认执行扁平化选项
+    """
+    config = {}
+    for directory in directories:
+        if not os.path.exists(directory):
+            if not no_waring:
+                logger.warning(f'Directory not found: {directory}')
+            continue
+        for file in os.listdir(directory):
+            if file.endswith(_SUPPORTED_CONFIG_FORMATS):
+                config.update(load_from_files(os.path.join(directory, file), no_warning=no_waring))
+    return config

def load_config_in_default(no_waring: bool = False) -> dict[str, Any]

Description: 从一个标准的轻雪项目加载配置文件 项目目录下的config.*和config目录下的所有配置文件 项目目录下的配置文件优先

Source code or View on GitHub
python
def load_config_in_default(no_waring: bool=False) -> dict[str, Any]:
+    """
+    从一个标准的轻雪项目加载配置文件
+    项目目录下的config.*和config目录下的所有配置文件
+    项目目录下的配置文件优先
+    """
+    config = load_configs_from_dirs('config', no_waring=no_waring)
+    config.update(load_from_files('config.yaml', 'config.toml', 'config.json', 'config.yml', no_warning=no_waring))
+    return config

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/core/core.html b/en/dev/api/core/core.html new file mode 100644 index 00000000..80df9f48 --- /dev/null +++ b/en/dev/api/core/core.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.core | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/core/index.html b/en/dev/api/core/index.html new file mode 100644 index 00000000..e4e590fd --- /dev/null +++ b/en/dev/api/core/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.core | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/core/manager.html b/en/dev/api/core/manager.html new file mode 100644 index 00000000..847f5838 --- /dev/null +++ b/en/dev/api/core/manager.html @@ -0,0 +1,117 @@ + + + + + + liteyuki.core.manager | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.core.manager

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午11:12 @Author : snowykami @Email : snowykami@outlook.com @File : manager.py @Software: PyCharm

class ChannelDeliver

def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]])

Source code or View on GitHub
python
def __init__(self, active: Channel[Any], passive: Channel[Any], channel_deliver_active: Channel[Channel[Any]], channel_deliver_passive: Channel[tuple[str, dict]], publish: Channel[tuple[str, Any]]):
+    self.active = active
+    self.passive = passive
+    self.channel_deliver_active = channel_deliver_active
+    self.channel_deliver_passive = channel_deliver_passive
+    self.publish = publish

class ProcessManager

def __init__(self, lifespan: Lifespan)

Source code or View on GitHub
python
def __init__(self, lifespan: 'Lifespan'):
+    self.lifespan = lifespan
+    self.targets: dict[str, tuple[Callable, tuple, dict]] = {}
+    self.processes: dict[str, Process] = {}

async def _run_process(self, name: str)

Description: 开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task

Arguments:

  • name:
Source code or View on GitHub
python
async def _run_process(self, name: str):
+    """
+        开启后自动监控进程,并添加到进程字典中,会阻塞,请创建task
+        Args:
+            name:
+        Returns:
+        """
+    if name not in self.targets:
+        raise KeyError(f'Process {name} not found.')
+    chan_active = get_channel(f'{name}-active')
+
+    def _start_process():
+        process = Process(target=self.targets[name][0], args=self.targets[name][1], kwargs=self.targets[name][2], daemon=True)
+        self.processes[name] = process
+        process.start()
+    _start_process()
+    while True:
+        data = await chan_active.async_receive()
+        if data == 0:
+            logger.info(f'Stopping process {name}')
+            await self.lifespan.before_process_shutdown()
+            self.terminate(name)
+            break
+        elif data == 1:
+            logger.info(f'Restarting process {name}')
+            await self.lifespan.before_process_shutdown()
+            await self.lifespan.before_process_restart()
+            self.terminate(name)
+            _start_process()
+            continue
+        else:
+            logger.warning('Unknown data received, ignored.')

async def start_all(self)

Description: 对外启动方法,启动所有进程,创建asyncio task

Source code or View on GitHub
python
async def start_all(self):
+    """
+        对外启动方法,启动所有进程,创建asyncio task
+        """
+    [asyncio.create_task(chan.start_receive_loop()) for chan in get_channels().values()]
+    [asyncio.create_task(sm.start_receive_loop()) for sm in [shared_memory]]
+    [asyncio.create_task(self._run_process(name)) for name in self.targets]

def add_target(self, name: str, target: TARGET_FUNC, args: tuple = (), kwargs = None)

Description: 添加进程

Arguments:

  • name: 进程名,用于获取和唯一标识
  • target: 进程函数
  • args: 进程函数参数
  • kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
Source code or View on GitHub
python
def add_target(self, name: str, target: TARGET_FUNC, args: tuple=(), kwargs=None):
+    """
+        添加进程
+        Args:
+            name: 进程名,用于获取和唯一标识
+            target: 进程函数
+            args: 进程函数参数
+            kwargs: 进程函数关键字参数,通常会默认传入chan_active和chan_passive
+        """
+    if kwargs is None:
+        kwargs = {}
+    chan_active: Channel = Channel(name=f'{name}-active')
+    chan_passive: Channel = Channel(name=f'{name}-passive')
+    channel_deliver = ChannelDeliver(active=chan_active, passive=chan_passive, channel_deliver_active=channel_deliver_active_channel, channel_deliver_passive=channel_deliver_passive_channel, publish=publish_channel)
+    self.targets[name] = (_delivery_channel_wrapper, (target, channel_deliver, shared_memory, *args), kwargs)

def join_all(self)

Source code or View on GitHub
python
def join_all(self):
+    for name, process in self.targets:
+        process.join()

def terminate(self, name: str)

Description: 终止进程并从进程字典中删除

Arguments:

  • name:
Source code or View on GitHub
python
def terminate(self, name: str):
+    """
+        终止进程并从进程字典中删除
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.processes:
+        logger.warning(f'Process {name} not found.')
+        return
+    process = self.processes[name]
+    process.terminate()
+    process.join(TIMEOUT)
+    if process.is_alive():
+        process.kill()
+    logger.success(f'Process {name} terminated.')

def terminate_all(self)

Source code or View on GitHub
python
def terminate_all(self):
+    for name in self.targets:
+        self.terminate(name)

def is_process_alive(self, name: str) -> bool

Description: 检查进程是否存活

Arguments:

  • name:
Source code or View on GitHub
python
def is_process_alive(self, name: str) -> bool:
+    """
+        检查进程是否存活
+        Args:
+            name:
+
+        Returns:
+
+        """
+    if name not in self.targets:
+        logger.warning(f'Process {name} not found.')
+    return self.processes[name].is_alive()

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/dev/dev.html b/en/dev/api/dev/dev.html new file mode 100644 index 00000000..78fdc246 --- /dev/null +++ b/en/dev/api/dev/dev.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.dev | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/dev/index.html b/en/dev/api/dev/index.html new file mode 100644 index 00000000..d2eaf766 --- /dev/null +++ b/en/dev/api/dev/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.dev | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/dev/observer.html b/en/dev/api/dev/observer.html new file mode 100644 index 00000000..67b7e5aa --- /dev/null +++ b/en/dev/api/dev/observer.html @@ -0,0 +1,69 @@ + + + + + + liteyuki.dev.observer | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.dev.observer

Description: 此模块用于注册观察者函数,使用watchdog监控文件变化并重启bot 启用该模块需要在配置文件中设置dev_mode为True

var CALLBACK_FUNC

  • Description: 位置1为FileSystemEvent

  • Type: TypeAlias

  • Default: Callable[[FileSystemEvent], None]

var FILTER_FUNC

  • Description: 位置1为FileSystemEvent

  • Type: TypeAlias

  • Default: Callable[[FileSystemEvent], bool]

def debounce(wait)

Description: 防抖函数

Source code or View on GitHub
python
def debounce(wait):
+    """
+    防抖函数
+    """
+
+    def decorator(func):
+
+        def wrapper(*args, **kwargs):
+            nonlocal last_call_time
+            current_time = time.time()
+            if current_time - last_call_time > wait:
+                last_call_time = current_time
+                return func(*args, **kwargs)
+        last_call_time = None
+        return wrapper
+    return decorator

class CodeModifiedHandler(FileSystemEventHandler)

@debounce(1)

def on_modified(self, event)

Source code or View on GitHub
python
@debounce(1)
+def on_modified(self, event):
+    raise NotImplementedError('on_modified must be implemented')

def on_created(self, event)

Source code or View on GitHub
python
def on_created(self, event):
+    self.on_modified(event)

def on_deleted(self, event)

Source code or View on GitHub
python
def on_deleted(self, event):
+    self.on_modified(event)

def on_moved(self, event)

Source code or View on GitHub
python
def on_moved(self, event):
+    self.on_modified(event)

def on_any_event(self, event)

Source code or View on GitHub
python
def on_any_event(self, event):
+    self.on_modified(event)

def on_file_system_event(directories: tuple[str], recursive: bool = True, event_filter: FILTER_FUNC = None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]

Description: 注册文件系统变化监听器

Arguments:

  • directories: 监听目录们
  • recursive: 是否递归监听子目录
  • event_filter: 事件过滤器, 返回True则执行回调函数

Return: 装饰器,装饰一个函数在接收到数据后执行

Source code or View on GitHub
python
def on_file_system_event(directories: tuple[str], recursive: bool=True, event_filter: FILTER_FUNC=None) -> Callable[[CALLBACK_FUNC], CALLBACK_FUNC]:
+    """
+    注册文件系统变化监听器
+    Args:
+        directories: 监听目录们
+        recursive: 是否递归监听子目录
+        event_filter: 事件过滤器, 返回True则执行回调函数
+    Returns:
+        装饰器,装饰一个函数在接收到数据后执行
+    """
+
+    def decorator(func: CALLBACK_FUNC) -> CALLBACK_FUNC:
+
+        def wrapper(event: FileSystemEvent):
+            if event_filter is not None and (not event_filter(event)):
+                return
+            func(event)
+        code_modified_handler = CodeModifiedHandler()
+        code_modified_handler.on_modified = wrapper
+        for directory in directories:
+            observer.schedule(code_modified_handler, directory, recursive=recursive)
+        return func
+    return decorator

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/dev/plugin.html b/en/dev/api/dev/plugin.html new file mode 100644 index 00000000..d6b12c0e --- /dev/null +++ b/en/dev/api/dev/plugin.html @@ -0,0 +1,37 @@ + + + + + + liteyuki.dev.plugin | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.dev.plugin

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/18 上午5:04 @Author : snowykami @Email : snowykami@outlook.com @File : plugin.py @Software: PyCharm

def run_plugins(*module_path: str | Path)

Description: 运行插件,无需手动初始化bot

Arguments:

  • module_path: 插件路径,参考liteyuki.load_plugin的函数签名
Source code or View on GitHub
python
def run_plugins(*module_path: str | Path):
+    """
+    运行插件,无需手动初始化bot
+    Args:
+        module_path: 插件路径,参考`liteyuki.load_plugin`的函数签名
+    """
+    cfg = load_config_in_default()
+    plugins = cfg.get('liteyuki.plugins', [])
+    plugins.extend(module_path)
+    cfg['liteyuki.plugins'] = plugins
+    bot = LiteyukiBot(**cfg)
+    bot.run()

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/exception.html b/en/dev/api/exception.html new file mode 100644 index 00000000..4686a9da --- /dev/null +++ b/en/dev/api/exception.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.exception | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/index.html b/en/dev/api/index.html new file mode 100644 index 00000000..0e4566b3 --- /dev/null +++ b/en/dev/api/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/log.html b/en/dev/api/log.html new file mode 100644 index 00000000..56bf7507 --- /dev/null +++ b/en/dev/api/log.html @@ -0,0 +1,43 @@ + + + + + + liteyuki.log | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.log

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/27 上午9:12 @Author : snowykami @Email : snowykami@outlook.com @File : log.py @Software: PyCharm

def get_format(level: str) -> str

Source code or View on GitHub
python
def get_format(level: str) -> str:
+    if level == 'DEBUG':
+        return debug_format
+    else:
+        return default_format

def init_log(config: dict)

Description: 在语言加载完成后执行

Source code or View on GitHub
python
def init_log(config: dict):
+    """
+    在语言加载完成后执行
+    Returns:
+
+    """
+    logger.remove()
+    logger.add(sys.stdout, level=0, diagnose=False, format=get_format(config.get('log_level', 'INFO')))
+    show_icon = config.get('log_icon', True)
+    logger.level('DEBUG', color='<blue>', icon=f"{('🐛' if show_icon else '')}DEBUG")
+    logger.level('INFO', color='<normal>', icon=f"{('ℹ️' if show_icon else '')}INFO")
+    logger.level('SUCCESS', color='<green>', icon=f"{('✅' if show_icon else '')}SUCCESS")
+    logger.level('WARNING', color='<yellow>', icon=f"{('⚠️' if show_icon else '')}WARNING")
+    logger.level('ERROR', color='<red>', icon=f"{('⭕' if show_icon else '')}ERROR")

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/message/event.html b/en/dev/api/message/event.html new file mode 100644 index 00000000..11b23d97 --- /dev/null +++ b/en/dev/api/message/event.html @@ -0,0 +1,61 @@ + + + + + + liteyuki.message.event | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.event

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:47 @Author : snowykami @Email : snowykami@outlook.com @File : event.py @Software: PyCharm

class MessageEvent

def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel[MessageEvent]] = None, data: Optional[dict[str, Any]] = None)

Description: 轻雪抽象消息事件

Source code or View on GitHub
python
def __init__(self, bot_id: str, message: list[dict[str, Any]] | str, message_type: str, raw_message: str, session_id: str, user_id: str, session_type: str, receive_channel: Optional[Channel['MessageEvent']]=None, data: Optional[dict[str, Any]]=None):
+    """
+        轻雪抽象消息事件
+        Args:
+
+            bot_id: 机器人ID
+            message: 消息,消息段数组[{type: str, data: dict[str, Any]}]
+            raw_message: 原始消息(通常为纯文本的格式)
+            message_type: 消息类型(private, group, other)
+
+            session_id: 会话ID(私聊通常为用户ID,群聊通常为群ID)
+            session_type: 会话类型(private, group)
+            receive_channel: 接收频道(用于回复消息)
+
+            data: 附加数据
+        """
+    if data is None:
+        data = {}
+    self.message_type = message_type
+    self.data = data
+    self.bot_id = bot_id
+    self.message = message
+    self.raw_message = raw_message
+    self.session_id = session_id
+    self.session_type = session_type
+    self.user_id = user_id
+    self.receive_channel = receive_channel

def reply(self, message: str | dict[str, Any])

Description: 回复消息

Arguments:

  • message:
Source code or View on GitHub
python
def reply(self, message: str | dict[str, Any]):
+    """
+        回复消息
+        Args:
+            message:
+        Returns:
+        """
+    reply_event = MessageEvent(message_type=self.session_type, message=message, raw_message='', data={'message': message}, bot_id=self.bot_id, session_id=self.session_id, user_id=self.user_id, session_type=self.session_type, receive_channel=None)
+    if self.receive_channel:
+        self.receive_channel.send(reply_event)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/message/index.html b/en/dev/api/message/index.html new file mode 100644 index 00000000..de0894ea --- /dev/null +++ b/en/dev/api/message/index.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/message/matcher.html b/en/dev/api/message/matcher.html new file mode 100644 index 00000000..dbc230d2 --- /dev/null +++ b/en/dev/api/message/matcher.html @@ -0,0 +1,60 @@ + + + + + + liteyuki.message.matcher | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.matcher

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:51 @Author : snowykami @Email : snowykami@outlook.com @File : matcher.py @Software: PyCharm

class Matcher

def __init__(self, rule: Rule, priority: int, block: bool)

Description: 匹配器

Arguments:

  • rule: 规则
  • priority: 优先级 >= 0
  • block: 是否阻断后续优先级更低的匹配器
Source code or View on GitHub
python
def __init__(self, rule: Rule, priority: int, block: bool):
+    """
+        匹配器
+        Args:
+            rule: 规则
+            priority: 优先级 >= 0
+            block: 是否阻断后续优先级更低的匹配器
+        """
+    self.rule = rule
+    self.priority = priority
+    self.block = block
+    self.handlers: list[EventHandler] = []

def handle(self) -> Callable[[EventHandler], EventHandler]

Description: 添加处理函数,装饰器

Return: 装饰器 handler

Source code or View on GitHub
python
def handle(self) -> Callable[[EventHandler], EventHandler]:
+    """
+        添加处理函数,装饰器
+        Returns:
+            装饰器 handler
+        """
+
+    def decorator(handler: EventHandler) -> EventHandler:
+        self.handlers.append(handler)
+        return handler
+    return decorator

async def run(self, event: MessageEvent) -> None

Description: 运行处理函数

Arguments:

  • event:
Source code or View on GitHub
python
async def run(self, event: MessageEvent) -> None:
+    """
+        运行处理函数
+        Args:
+            event:
+        Returns:
+        """
+    if not await self.rule(event):
+        return
+    for handler in self.handlers:
+        try:
+            await handler(event)
+        except Exception:
+            traceback.print_exc()

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/message/message.html b/en/dev/api/message/message.html new file mode 100644 index 00000000..761ce02b --- /dev/null +++ b/en/dev/api/message/message.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/message/on.html b/en/dev/api/message/on.html new file mode 100644 index 00000000..51c9b1f6 --- /dev/null +++ b/en/dev/api/message/on.html @@ -0,0 +1,40 @@ + + + + + + liteyuki.message.on | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.on

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:52 @Author : snowykami @Email : snowykami@outlook.com @File : on.py @Software: PyCharm

def add_matcher(matcher: Matcher)

Source code or View on GitHub
python
def add_matcher(matcher: Matcher):
+    for i, m in enumerate(_matcher_list):
+        if m.priority < matcher.priority:
+            _matcher_list.insert(i, matcher)
+            break
+    else:
+        _matcher_list.append(matcher)

def on_message(rule: Rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

Source code or View on GitHub
python
def on_message(rule: Rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+    matcher = Matcher(rule, priority, block)
+    add_matcher(matcher)
+    return matcher

def on_keywords(keywords: list[str], rule = empty_rule, priority: int = 0, block: bool = False) -> Matcher

Source code or View on GitHub
python
def on_keywords(keywords: list[str], rule=empty_rule, priority: int=0, block: bool=False) -> Matcher:
+
+    @Rule
+    async def on_keywords_rule(event: MessageEvent):
+        return any((keyword in event.raw_message for keyword in keywords))
+    return on_message(on_keywords_rule & rule, priority, block)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/message/rule.html b/en/dev/api/message/rule.html new file mode 100644 index 00000000..de9f142f --- /dev/null +++ b/en/dev/api/message/rule.html @@ -0,0 +1,42 @@ + + + + + + liteyuki.message.rule | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.message.rule

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 下午10:55 @Author : snowykami @Email : snowykami@outlook.com @File : rule.py @Software: PyCharm

var RuleHandlerFunc

  • Description: 规则函数签名

  • Type: TypeAlias

  • Default: Callable[[MessageEvent], Coroutine[None, None, bool]]

class Rule

def __init__(self, handler: RuleHandlerFunc)

Source code or View on GitHub
python
def __init__(self, handler: RuleHandlerFunc):
+    self.handler = handler

def __or__(self, other: Rule) -> Rule

Source code or View on GitHub
python
def __or__(self, other: 'Rule') -> 'Rule':
+
+    async def combined_handler(event: MessageEvent) -> bool:
+        return await self.handler(event) or await other.handler(event)
+    return Rule(combined_handler)

def __and__(self, other: Rule) -> Rule

Source code or View on GitHub
python
def __and__(self, other: 'Rule') -> 'Rule':
+
+    async def combined_handler(event: MessageEvent) -> bool:
+        return await self.handler(event) and await other.handler(event)
+    return Rule(combined_handler)

async def __call__(self, event: MessageEvent) -> bool

Source code or View on GitHub
python
async def __call__(self, event: MessageEvent) -> bool:
+    if self.handler is None:
+        return True
+    return await self.handler(event)

@Rule

async def empty_rule(event: MessageEvent) -> bool

Source code or View on GitHub
python
@Rule
+async def empty_rule(event: MessageEvent) -> bool:
+    return True

@Rule

async def is_su_rule(event: MessageEvent) -> bool

Source code or View on GitHub
python
@Rule
+async def is_su_rule(event: MessageEvent) -> bool:
+    return str(event.user_id) in _superusers

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/message/session.html b/en/dev/api/message/session.html new file mode 100644 index 00000000..f5f6c8e8 --- /dev/null +++ b/en/dev/api/message/session.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.message.session | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/mkdoc.html b/en/dev/api/mkdoc.html new file mode 100644 index 00000000..db609011 --- /dev/null +++ b/en/dev/api/mkdoc.html @@ -0,0 +1,186 @@ + + + + + + liteyuki.mkdoc | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.mkdoc

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/19 上午6:23 @Author : snowykami @Email : snowykami@outlook.com @File : mkdoc.py @Software: PyCharm

class DefType(Enum)

attr FUNCTION = 'function'

attr METHOD = 'method'

attr STATIC_METHOD = 'staticmethod'

attr CLASS_METHOD = 'classmethod'

attr PROPERTY = 'property'

class FunctionInfo(BaseModel)

attr name: str = NO_DEFAULT

attr args: list[tuple[str, str]] = NO_DEFAULT

attr return_type: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr source_code: str = ''

attr type: DefType = NO_DEFAULT

attr is_async: bool = NO_DEFAULT

class AttributeInfo(BaseModel)

attr name: str = NO_DEFAULT

attr type: str = NO_DEFAULT

attr value: Any = None

attr docstring: str = ''

class ClassInfo(BaseModel)

attr name: str = NO_DEFAULT

attr docstring: str = NO_DEFAULT

attr methods: list[FunctionInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr inherit: list[str] = NO_DEFAULT

class ModuleInfo(BaseModel)

attr module_path: str = NO_DEFAULT

attr functions: list[FunctionInfo] = NO_DEFAULT

attr classes: list[ClassInfo] = NO_DEFAULT

attr attributes: list[AttributeInfo] = NO_DEFAULT

attr docstring: str = NO_DEFAULT

def get_relative_path(base_path: str, target_path: str) -> str

Description: 获取相对路径

Arguments:

  • base_path: 基础路径
  • target_path: 目标路径
Source code or View on GitHub
python
def get_relative_path(base_path: str, target_path: str) -> str:
+    """
+    获取相对路径
+    Args:
+        base_path: 基础路径
+        target_path: 目标路径
+    """
+    return os.path.relpath(target_path, base_path)

def write_to_files(file_data: dict[str, str])

Description: 输出文件

Arguments:

  • file_data: 文件数据 相对路径
Source code or View on GitHub
python
def write_to_files(file_data: dict[str, str]):
+    """
+    输出文件
+    Args:
+        file_data: 文件数据 相对路径
+    """
+    for rp, data in file_data.items():
+        if not os.path.exists(os.path.dirname(rp)):
+            os.makedirs(os.path.dirname(rp))
+        with open(rp, 'w', encoding='utf-8') as f:
+            f.write(data)

def get_file_list(module_folder: str)

Source code or View on GitHub
python
def get_file_list(module_folder: str):
+    file_list = []
+    for root, dirs, files in os.walk(module_folder):
+        for file in files:
+            if file.endswith(('.py', '.pyi')):
+                file_list.append(os.path.join(root, file))
+    return file_list

def get_module_info_normal(file_path: str, ignore_private: bool = True) -> ModuleInfo

Description: 获取函数和类

Arguments:

  • file_path: Python 文件路径
  • ignore_private: 忽略私有函数和类

Return: 模块信息

Source code or View on GitHub
python
def get_module_info_normal(file_path: str, ignore_private: bool=True) -> ModuleInfo:
+    """
+    获取函数和类
+    Args:
+        file_path: Python 文件路径
+        ignore_private: 忽略私有函数和类
+    Returns:
+        模块信息
+    """
+    with open(file_path, 'r', encoding='utf-8') as file:
+        file_content = file.read()
+        tree = ast.parse(file_content)
+    dot_sep_module_path = file_path.replace(os.sep, '.').replace('.py', '').replace('.pyi', '')
+    module_docstring = ast.get_docstring(tree)
+    module_info = ModuleInfo(module_path=dot_sep_module_path, functions=[], classes=[], attributes=[], docstring=module_docstring if module_docstring else '')
+    for node in ast.walk(tree):
+        if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
+            if not any((isinstance(parent, ast.ClassDef) for parent in ast.iter_child_nodes(node))) and (not ignore_private or not node.name.startswith('_')):
+                if node.args.args:
+                    first_arg = node.args.args[0]
+                    if first_arg.arg in ('self', 'cls'):
+                        continue
+                function_docstring = ast.get_docstring(node)
+                func_info = FunctionInfo(name=node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in node.args.args], return_type=ast.unparse(node.returns) if node.returns else 'None', docstring=function_docstring if function_docstring else '', type=DefType.FUNCTION, is_async=isinstance(node, ast.AsyncFunctionDef), source_code=ast.unparse(node))
+                module_info.functions.append(func_info)
+        elif isinstance(node, ast.ClassDef):
+            class_docstring = ast.get_docstring(node)
+            class_info = ClassInfo(name=node.name, docstring=class_docstring if class_docstring else '', methods=[], attributes=[], inherit=[ast.unparse(base) for base in node.bases])
+            for class_node in node.body:
+                if isinstance(class_node, ast.FunctionDef) and (not ignore_private or not class_node.name.startswith('_') or class_node.name == '__init__'):
+                    method_docstring = ast.get_docstring(class_node)
+                    def_type = DefType.METHOD
+                    if class_node.decorator_list:
+                        if any((isinstance(decorator, ast.Name) and decorator.id == 'staticmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.STATIC_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'classmethod' for decorator in class_node.decorator_list)):
+                            def_type = DefType.CLASS_METHOD
+                        elif any((isinstance(decorator, ast.Name) and decorator.id == 'property' for decorator in class_node.decorator_list)):
+                            def_type = DefType.PROPERTY
+                    class_info.methods.append(FunctionInfo(name=class_node.name, args=[(arg.arg, ast.unparse(arg.annotation) if arg.annotation else NO_TYPE_ANY) for arg in class_node.args.args], return_type=ast.unparse(class_node.returns) if class_node.returns else 'None', docstring=method_docstring if method_docstring else '', type=def_type, is_async=isinstance(class_node, ast.AsyncFunctionDef), source_code=ast.unparse(class_node)))
+                elif isinstance(class_node, ast.Assign):
+                    for target in class_node.targets:
+                        if isinstance(target, ast.Name):
+                            class_info.attributes.append(AttributeInfo(name=target.id, type=ast.unparse(class_node.value)))
+            module_info.classes.append(class_info)
+        elif isinstance(node, ast.Assign):
+            if not any((isinstance(parent, (ast.ClassDef, ast.FunctionDef)) for parent in ast.iter_child_nodes(node))):
+                for target in node.targets:
+                    if isinstance(target, ast.Name) and (not ignore_private or not target.id.startswith('_')):
+                        attr_type = NO_TYPE_HINT
+                        if isinstance(node.value, ast.AnnAssign) and node.value.annotation:
+                            attr_type = ast.unparse(node.value.annotation)
+                        module_info.attributes.append(AttributeInfo(name=target.id, type=attr_type, value=ast.unparse(node.value) if node.value else None))
+    return module_info

def generate_markdown(module_info: ModuleInfo, front_matter = None, lang: str = 'zh-CN') -> str

Description: 生成模块的Markdown 你可在此自定义生成的Markdown格式

Arguments:

  • module_info: 模块信息
  • front_matter: 自定义选项title, index, icon, category
  • lang: 语言

Return: Markdown 字符串

Source code or View on GitHub
python
def generate_markdown(module_info: ModuleInfo, front_matter=None, lang: str='zh-CN') -> str:
+    """
+    生成模块的Markdown
+    你可在此自定义生成的Markdown格式
+    Args:
+        module_info: 模块信息
+        front_matter: 自定义选项title, index, icon, category
+        lang: 语言
+    Returns:
+        Markdown 字符串
+    """
+    content = ''
+    front_matter = '---\n' + '\n'.join([f'{k}: {v}' for k, v in front_matter.items()]) + '\n---\n\n'
+    content += front_matter
+    for func in module_info.functions:
+        args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in func.args]
+        content += f"### ***{('async ' if func.is_async else '')}def*** `{func.name}({', '.join(args_with_type)}) -> {func.return_type}`\n\n"
+        func.docstring = func.docstring.replace('\n', '\n\n')
+        content += f'{func.docstring}\n\n'
+        content += f'<details>\n<summary>源代码</summary>\n\n```python\n{func.source_code}\n```\n</details>\n\n'
+    for cls in module_info.classes:
+        if cls.inherit:
+            inherit = f"({', '.join(cls.inherit)})" if cls.inherit else ''
+            content += f'### ***class*** `{cls.name}{inherit}`\n\n'
+        else:
+            content += f'### ***class*** `{cls.name}`\n\n'
+        cls.docstring = cls.docstring.replace('\n', '\n\n')
+        content += f'{cls.docstring}\n\n'
+        for method in cls.methods:
+            if method.type != DefType.METHOD:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] else arg[0] for arg in method.args]
+                content += f'### &emsp; ***@{method.type.value}***\n'
+            else:
+                args_with_type = [f'{arg[0]}: {arg[1]}' if arg[1] and arg[0] != 'self' else arg[0] for arg in method.args]
+            content += f"### &emsp; ***{('async ' if method.is_async else '')}def*** `{method.name}({', '.join(args_with_type)}) -> {method.return_type}`\n\n"
+            method.docstring = method.docstring.replace('\n', '\n\n')
+            content += f'&emsp;{method.docstring}\n\n'
+            if lang == 'zh-CN':
+                TEXT_SOURCE_CODE = '源代码'
+            else:
+                TEXT_SOURCE_CODE = 'Source Code'
+            content += f'<details>\n<summary>{TEXT_SOURCE_CODE}</summary>\n\n```python\n{method.source_code}\n```\n</details>\n\n'
+        for attr in cls.attributes:
+            content += f'### &emsp; ***attr*** `{attr.name}: {attr.type}`\n\n'
+    for attr in module_info.attributes:
+        if attr.type == NO_TYPE_HINT:
+            content += f'### ***var*** `{attr.name} = {attr.value}`\n\n'
+        else:
+            content += f'### ***var*** `{attr.name}: {attr.type} = {attr.value}`\n\n'
+        attr.docstring = attr.docstring.replace('\n', '\n\n')
+        content += f'{attr.docstring}\n\n'
+    return content

def generate_docs(module_folder: str, output_dir: str, with_top: bool = False, lang: str = 'zh-CN', ignored_paths = None)

Description: 生成文档

Arguments:

  • module_folder: 模块文件夹
  • output_dir: 输出文件夹
  • with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
  • ignored_paths: 忽略的路径
  • lang: 语言
Source code or View on GitHub
python
def generate_docs(module_folder: str, output_dir: str, with_top: bool=False, lang: str='zh-CN', ignored_paths=None):
+    """
+    生成文档
+    Args:
+        module_folder: 模块文件夹
+        output_dir: 输出文件夹
+        with_top: 是否包含顶层文件夹 False时例如docs/api/module_a, docs/api/module_b, True时例如docs/api/module/module_a.md, docs/api/module/module_b.md
+        ignored_paths: 忽略的路径
+        lang: 语言
+    """
+    if ignored_paths is None:
+        ignored_paths = []
+    file_data: dict[str, str] = {}
+    file_list = get_file_list(module_folder)
+    shutil.rmtree(output_dir, ignore_errors=True)
+    os.mkdir(output_dir)
+    replace_data = {'__init__': 'README', '.py': '.md'}
+    for pyfile_path in file_list:
+        if any((ignored_path.replace('\\', '/') in pyfile_path.replace('\\', '/') for ignored_path in ignored_paths)):
+            continue
+        no_module_name_pyfile_path = get_relative_path(module_folder, pyfile_path)
+        rel_md_path = pyfile_path if with_top else no_module_name_pyfile_path
+        for rk, rv in replace_data.items():
+            rel_md_path = rel_md_path.replace(rk, rv)
+        abs_md_path = os.path.join(output_dir, rel_md_path)
+        module_info = get_module_info_normal(pyfile_path)
+        if 'README' in abs_md_path:
+            front_matter = {'title': module_info.module_path.replace('.__init__', '').replace('_', '\\n'), 'index': 'true', 'icon': 'laptop-code', 'category': 'API'}
+        else:
+            front_matter = {'title': module_info.module_path.replace('_', '\\n'), 'order': '1', 'icon': 'laptop-code', 'category': 'API'}
+        md_content = generate_markdown(module_info, front_matter)
+        print(f'Generate {pyfile_path} -> {abs_md_path}')
+        file_data[abs_md_path] = md_content
+    write_to_files(file_data)

var no_module_name_pyfile_path

  • Description: 去头路径

  • Default: get_relative_path(module_folder, pyfile_path)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/plugin/index.html b/en/dev/api/plugin/index.html new file mode 100644 index 00000000..11c39b7e --- /dev/null +++ b/en/dev/api/plugin/index.html @@ -0,0 +1,32 @@ + + + + + + liteyuki.plugin | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/plugin/load.html b/en/dev/api/plugin/load.html new file mode 100644 index 00000000..8c0590d5 --- /dev/null +++ b/en/dev/api/plugin/load.html @@ -0,0 +1,108 @@ + + + + + + liteyuki.plugin.load | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugin.load

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/23 下午11:59 @Author : snowykami @Email : snowykami@outlook.com @File : load.py @Software: PyCharm

def load_plugin(module_path: str | Path) -> Optional[Plugin]

Description: 加载单个插件,可以是本地插件或是通过 pip 安装的插件。

Arguments:

  • module_path: 插件名称 path.to.your.plugin
  • 或插件路径 pathlib.Path(path/to/your/plugin):
Source code or View on GitHub
python
def load_plugin(module_path: str | Path) -> Optional[Plugin]:
+    """加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。
+
+    参数:
+        module_path: 插件名称 `path.to.your.plugin`
+        或插件路径 `pathlib.Path(path/to/your/plugin)`
+    """
+    module_path = path_to_module_name(Path(module_path)) if isinstance(module_path, Path) else module_path
+    try:
+        module = import_module(module_path)
+        _plugins[module.__name__] = Plugin(name=module.__name__, module=module, module_name=module_path)
+        if module.__dict__.get('__plugin_metadata__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_metadata__']
+            display_name = module.__name__.split('.')[-1]
+        elif module.__dict__.get('__liteyuki_plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__liteyuki_plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        elif module.__dict__.get('__plugin_meta__', None):
+            metadata: 'PluginMetadata' = module.__dict__['__plugin_meta__']
+            display_name = format_display_name(f"{metadata.name}({module.__name__.split('.')[-1]})", metadata.type)
+        else:
+            logger.opt(colors=True).warning(f'The metadata of Liteyuki plugin "{module.__name__}" is not specified, use empty.')
+            metadata = PluginMetadata(name=module.__name__)
+            display_name = module.__name__.split('.')[-1]
+        _plugins[module.__name__].metadata = metadata
+        logger.opt(colors=True).success(f'Succeeded to load liteyuki plugin "{display_name}"')
+        return _plugins[module.__name__]
+    except Exception as e:
+        logger.opt(colors=True).success(f'Failed to load liteyuki plugin "<r>{module_path}</r>"')
+        traceback.print_exc()
+        return None

def load_plugins(*plugin_dir: str, *, ignore_warning: bool = True) -> set[Plugin]

Description: 导入文件夹下多个插件

Arguments:

  • plugin_dir: 文件夹路径
  • ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
Source code or View on GitHub
python
def load_plugins(*plugin_dir: str, ignore_warning: bool=True) -> set[Plugin]:
+    """导入文件夹下多个插件
+
+    参数:
+        plugin_dir: 文件夹路径
+        ignore_warning: 是否忽略警告,通常是目录不存在或目录为空
+    """
+    plugins = set()
+    for dir_path in plugin_dir:
+        if not os.path.exists(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' does not exist.")
+            continue
+        if not os.listdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is empty.")
+            continue
+        if not os.path.isdir(dir_path):
+            if not ignore_warning:
+                logger.warning(f"Plugins dir '{dir_path}' is not a directory.")
+            continue
+        for f in os.listdir(dir_path):
+            path = Path(os.path.join(dir_path, f))
+            module_name = None
+            if os.path.isfile(path) and f.endswith('.py') and (f != '__init__.py'):
+                module_name = f'{path_to_module_name(Path(dir_path))}.{f[:-3]}'
+            elif os.path.isdir(path) and os.path.exists(os.path.join(path, '__init__.py')):
+                module_name = path_to_module_name(path)
+            if module_name:
+                load_plugin(module_name)
+                if _plugins.get(module_name):
+                    plugins.add(_plugins[module_name])
+    return plugins

def format_display_name(display_name: str, plugin_type: PluginType) -> str

Description: 设置插件名称颜色,根据不同类型插件设置颜色

Arguments:

  • display_name: 插件名称
  • plugin_type: 插件类型

Return: str: 设置后的插件名称

Source code or View on GitHub
python
def format_display_name(display_name: str, plugin_type: PluginType) -> str:
+    """
+    设置插件名称颜色,根据不同类型插件设置颜色
+    Args:
+        display_name: 插件名称
+        plugin_type: 插件类型
+
+    Returns:
+        str: 设置后的插件名称 <y>name</y>
+    """
+    color = 'y'
+    match plugin_type:
+        case PluginType.APPLICATION:
+            color = 'm'
+        case PluginType.TEST:
+            color = 'g'
+        case PluginType.MODULE:
+            color = 'e'
+        case PluginType.SERVICE:
+            color = 'c'
+    return f'<{color}>{display_name} [{plugin_type.name}]</{color}>'

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/plugin/manager.html b/en/dev/api/plugin/manager.html new file mode 100644 index 00000000..6e77c5d1 --- /dev/null +++ b/en/dev/api/plugin/manager.html @@ -0,0 +1,26 @@ + + + + + + liteyuki.plugin.manager | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/plugin/model.html b/en/dev/api/plugin/model.html new file mode 100644 index 00000000..4c1d3e8e --- /dev/null +++ b/en/dev/api/plugin/model.html @@ -0,0 +1,27 @@ + + + + + + liteyuki.plugin.model | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugin.model

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/7/24 上午12:02 @Author : snowykami @Email : snowykami@outlook.com @File : model.py @Software: PyCharm

class PluginType(Enum)

attr APPLICATION = 'application'

attr SERVICE = 'service'

attr MODULE = 'module'

attr UNCLASSIFIED = 'unclassified'

attr TEST = 'test'

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr type: PluginType = PluginType.UNCLASSIFIED

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)

def __hash__(self)

Source code or View on GitHub
python
def __hash__(self):
+    return hash(self.module_name)

attr model_config = {'arbitrary_types_allowed': True}

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr metadata: Optional[PluginMetadata] = None

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/plugin/plugin.html b/en/dev/api/plugin/plugin.html new file mode 100644 index 00000000..802cee99 --- /dev/null +++ b/en/dev/api/plugin/plugin.html @@ -0,0 +1,32 @@ + + + + + + liteyuki.plugin | LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/dev/api/plugins/liteecho.html b/en/dev/api/plugins/liteecho.html new file mode 100644 index 00000000..365d7b52 --- /dev/null +++ b/en/dev/api/plugins/liteecho.html @@ -0,0 +1,28 @@ + + + + + + liteyuki.plugins.liteecho | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.liteecho

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/22 下午12:31 @Author : snowykami @Email : snowykami@outlook.com @File : liteecho.py @Software: PyCharm

@on_startswith(['liteecho'], rule=is_su_rule).handle()

async def liteecho(event: MessageEvent)

Source code or View on GitHub
python
@on_startswith(['liteecho'], rule=is_su_rule).handle()
+async def liteecho(event: MessageEvent):
+    event.reply(event.raw_message.strip()[8:].strip())

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/plugins/plugin_loader/index.html b/en/dev/api/plugins/plugin_loader/index.html new file mode 100644 index 00000000..ba4785a1 --- /dev/null +++ b/en/dev/api/plugins/plugin_loader/index.html @@ -0,0 +1,33 @@ + + + + + + liteyuki.plugins.plugin_loader | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.plugin_loader

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

Description: 默认插件加载器,应在初始化时调用

Source code or View on GitHub
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/plugins/plugin_loader/plugin_loader.html b/en/dev/api/plugins/plugin_loader/plugin_loader.html new file mode 100644 index 00000000..69b9f7fb --- /dev/null +++ b/en/dev/api/plugins/plugin_loader/plugin_loader.html @@ -0,0 +1,33 @@ + + + + + + liteyuki.plugins.plugin_loader | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.plugins.plugin_loader

Description: Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved

@Time : 2024/8/11 下午10:02 @Author : snowykami @Email : snowykami@outlook.com @File : init.py.py @Software: PyCharm

def default_plugins_loader()

Description: 默认插件加载器,应在初始化时调用

Source code or View on GitHub
python
def default_plugins_loader():
+    """
+    默认插件加载器,应在初始化时调用
+    """
+    for plugin in get_config('liteyuki.plugins', []):
+        load_plugin(plugin)
+    for plugin_dir in get_config('liteyuki.plugin_dirs', ['src/liteyuki_plugins']):
+        load_plugins(plugin_dir)

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/api/utils.html b/en/dev/api/utils.html new file mode 100644 index 00000000..21c8ebe3 --- /dev/null +++ b/en/dev/api/utils.html @@ -0,0 +1,95 @@ + + + + + + liteyuki.utils | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

liteyuki.utils

Description: 一些常用的工具类,部分来源于 nonebot 并遵循其许可进行修改

def is_coroutine_callable(call: Callable[..., Any]) -> bool

Description: 判断是否为协程可调用对象

Arguments:

  • call: 可调用对象

Return: bool: 是否为协程可调用对象

Source code or View on GitHub
python
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
+    """
+    判断是否为协程可调用对象
+    Args:
+        call: 可调用对象
+    Returns:
+        bool: 是否为协程可调用对象
+    """
+    if inspect.isroutine(call):
+        return inspect.iscoroutinefunction(call)
+    if inspect.isclass(call):
+        return False
+    func_ = getattr(call, '__call__', None)
+    return inspect.iscoroutinefunction(func_)

def run_coroutine(*coro: Coroutine)

Description: 运行协程

Arguments:

  • coro:
Source code or View on GitHub
python
def run_coroutine(*coro: Coroutine):
+    """
+    运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    try:
+        loop = asyncio.get_running_loop()
+        if loop.is_running():
+            for c in coro:
+                asyncio.ensure_future(c)
+        else:
+            for c in coro:
+                loop.run_until_complete(c)
+    except RuntimeError:
+        loop = asyncio.new_event_loop()
+        asyncio.set_event_loop(loop)
+        loop.run_until_complete(asyncio.gather(*coro))
+        loop.close()
+    except Exception as e:
+        logger.error(f'Exception occurred: {e}')

def run_coroutine_in_thread(*coro: Coroutine)

Description: 在新线程中运行协程

Arguments:

  • coro:
Source code or View on GitHub
python
def run_coroutine_in_thread(*coro: Coroutine):
+    """
+    在新线程中运行协程
+    Args:
+        coro:
+
+    Returns:
+
+    """
+    threading.Thread(target=run_coroutine, args=coro, daemon=True).start()

def path_to_module_name(path: Path) -> str

Description: 转换路径为模块名

Arguments:

  • path: 路径a/b/c/d -> a.b.c.d

Return: str: 模块名

Source code or View on GitHub
python
def path_to_module_name(path: Path) -> str:
+    """
+    转换路径为模块名
+    Args:
+        path: 路径a/b/c/d -> a.b.c.d
+    Returns:
+        str: 模块名
+    """
+    rel_path = path.resolve().relative_to(Path.cwd().resolve())
+    if rel_path.stem == '__init__':
+        return '.'.join(rel_path.parts[:-1])
+    else:
+        return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]

Description: 异步包装器

Arguments:

  • func: Sync Callable

Return: Coroutine: Asynchronous Callable

Source code or View on GitHub
python
def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]:
+    """
+    异步包装器
+    Args:
+        func: Sync Callable
+    Returns:
+        Coroutine: Asynchronous Callable
+    """
+
+    async def wrapper(*args, **kwargs):
+        return func(*args, **kwargs)
+    wrapper.__signature__ = inspect.signature(func)
+    return wrapper

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/comm.html b/en/dev/comm.html new file mode 100644 index 00000000..2510bd0a --- /dev/null +++ b/en/dev/comm.html @@ -0,0 +1,68 @@ + + + + + + 进程通信 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

Channel Communication

Introduction

LiteyukiBot is running in the main process MainProcess, and other plugin framework processes are child processes that come with it. Therefore, it is impossible to communicate through shared memory and direct object transfer. Liteyuki provides a channel Channel for inter-process communication like go. You can send messages to other processes through Channel and listen to messages from other processes.

Example

The channel is full-duplex, with two receiving modes, but only one mode can be used for a channel, that is, passive mode and active mode, passive mode is implemented by the chan.on_receive() decorator callback function, and active mode needs to call chan.receive() to implement

  • 创建子进程的同时会初始化一个被动通道和一个主动通道,且通道标识为{process_name}-active{process_name}-passive
  • 主进程中通过get_channel函数获取通道对象
  • 子进程中导入单例active_channelpassive_channel即可

在轻雪插件中(主进程中)

python
import asyncio
+
+from liteyuki.comm import get_channel, Channel
+from liteyuki import get_bot
+
+# get_channel函数获取通道对象,参数为调用set_channel时的通道标识
+channel_passive = get_channel("nonebot-passive")  # 获取被动通道
+channel_active = get_channel("nonebot-active")  # 获取主动通道
+liteyuki_bot = get_bot()
+
+
+# 注册一个函数在轻雪启动后运行
+@liteyuki_bot.on_after_start
+async def send_data():
+    while True:
+        channel_passive.send("I am liteyuki main process passive")
+        channel_active.send("I am liteyuki main process active")
+        await asyncio.sleep(3)  # 每3秒发送一次消息

在子进程中(例如NoneBot插件中)

python
from nonebot import get_driver
+from liteyuki.comm import active_channel, passive_channel  # 子进程中获取通道直接导入进程全局单例即可
+from liteyuki.log import logger
+
+driver = get_driver()
+
+
+# 被动模式,通过装饰器注册一个函数在接收到消息时运行,每次接收到字符串数据时都会运行
+@passive_channel.on_receive(filter_func=lambda data: isinstance(data, str))
+async def on_passive_receive(data):
+    logger.info(f"Passive receive: {data}")
+
+
+# 注册一个函数在NoneBot启动后运行
+@driver.on_startup
+def on_startup():
+    while True:
+        data = active_channel.receive()
+        logger.info(f"Active receive: {data}")

启动后控制台输出

log
0000-00-00 00:00:00 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:00 [ℹ️信息] Active receive: I am liteyuki main process active
+0000-00-00 00:00:03 [ℹ️信息] Passive receive: I am liteyuki main process passive
+0000-00-00 00:00:03 [ℹ️信息] Active receive: I am liteyuki main process active
+...

共享内存通信

简介

  • 相比于普通进程通信,内存共享使得代码编写更加简洁,轻雪框架提供了一个内存共享通信的接口,你可以通过storage模块实现内存共享通信,该模块封装通道实现
  • 内存共享是线程安全的,你可以在多个线程中读写共享内存,线程锁会自动保护共享内存的读写操作

示例

在任意进程中均可使用

python
from liteyuki.comm.storage import shared_memory
+
+shared_memory.set("key", "value")  # 设置共享内存
+value = shared_memory.get("key")  # 获取共享内存

源代码:liteyuki/comm/storage.py

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/lyfunc.html b/en/dev/lyfunc.html new file mode 100644 index 00000000..a8de959a --- /dev/null +++ b/en/dev/lyfunc.html @@ -0,0 +1,45 @@ + + + + + + 轻雪函数 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

轻雪函数

轻雪函数 Liteyuki Function 是轻雪的一个功能,它允许你在轻雪中运行一些自定义的由数据驱动的命令,类似于Minecraft的mcfunction,属于资源包的一部分,但需单独起篇幅.

函数文件

函数文件放在资源包的functions目录下,文件名以.mcfunction .lyfunction .lyf结尾,例如test.mcfunction,文件内容为一系列的命令,每行一个命令,支持单行注释#(编辑时的语法高亮可采取shell格式),例如:

shell
# 在发信器输出"hello world"
+cmd echo hello world
+
+# 如果你想同时输出多行内容可以尝试换行符(Python格式)
+cmd echo hello world\nLiteyuki bot

也支持句末注释,例如:

shell
cmd echo hello world # 输出"hello world"

命令文档

shell
var <var1=value1> [var2=value2] ...  # 定义变量
+cmd <command>  # 在设备上执行命令
+api <api_name> [var=value...]  # 调用Bot API
+function <func_name> # 调用函数,可递归
+sleep <time>  # 异步等待,单位s
+nohup <command>  # 使用新的task执行命令,即不等待
+end # 结束函数关键字,包括子task
+await # 等待所有异步任务结束,若函数中启动了其他task,需要在最后调用,否则task对象会被销毁

示例

shell
# 疯狂戳好友
+# 使用 /function poke user_id=123456 执行
+# 每隔0.2s戳两次,无限戳,会触发最大递归深度限制
+# 若要戳20s后停止,则需要删除await,添加sleep 20和end
+api friend_poke user_id=user_id
+api friend_poke user_id=user_id
+sleep 0.2
+nohup function poke
+await

API

理论上所有基于onebotv11的api都可调用,不同Adapter api也有差别.

Onebot v11 API文档

结束关键字

由于LiteyukiBot基于异步运行, 所以在编写lyfunction时也要注意异步的调用,避免出现"单线程走到底"的情况是效率提升的关键.

await 异步任务结束关键字,用于结束当前已完成function的执行

WARNING

但若出现非单function的情况,有一个task任务没有完成而await被执行了,那么当前所有函数包的task都会被截停销毁

TIP

编写轻雪函数推荐你使用VS Code插件Liteyuki Function实现语法高亮

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/plugin.html b/en/dev/plugin.html new file mode 100644 index 00000000..3c44256e --- /dev/null +++ b/en/dev/plugin.html @@ -0,0 +1,57 @@ + + + + + + 轻雪插件开发 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

简介

轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能

开始

创建插件

一个.py文件或一个包含__init__.py的文件夹即可被识别为插件

首先创建一个文件夹,例如watchdog_plugin,并在其中创建一个__init__.py文件,即可创建一个插件

__init__.py

python
from liteyuki.plugin import PluginMetadata, PluginType
+from .watch_dog import *    # 导入逻辑部分
+
+# 定义插件元数据
+__plugin_meta__ = PluginMetadata(
+    name="NoneDog",  # 插件名称
+    version="1.0.0",  # 插件版本
+    description="A simple plugin for nonebot developer",  # 插件描述
+    type=PluginType.SERVICE  # 插件类型
+)
+
+# 你的插件代码
+...

编写逻辑部分

轻雪主进程不涉及聊天部分,因此插件主要是一些后台任务或者与聊天机器人的通信 以下我们会编写一个简单的插件,用于开发NoneBot时进行文件系统变更重载 watch_dog.py

python
import os
+from liteyuki.dev import observer  # 导入文件系统观察器
+from liteyuki import get_bot, logger  # 导入轻雪Bot和日志
+from watchdog.events import FileSystemEvent  # 导入文件系统事件
+
+liteyuki = get_bot()  # 获取唯一的轻雪Bot实例
+
+exclude_extensions = (".pyc", ".pyo")  # 排除的文件扩展名
+
+
+# 用observer的on_file_system_event装饰器监听文件系统事件
+@observer.on_file_system_event(
+    directories=("src/nonebot_plugins",),
+    event_filter=lambda event: not event.src_path.endswith(exclude_extensions) and ("__pycache__" not in event.src_path) and os.path.isfile(event.src_path)
+)
+def restart_nonebot_process(event: FileSystemEvent):
+    logger.debug(f"File {event.src_path} changed, reloading nonebot...")
+    liteyuki.restart_process("nonebot")  # 调用重启进程方法

加载插件

方法1

  • 在配置文件中的liteyuki.plugins中添加你的插件路径,例如watchdog_plugin,重启轻雪即可加载插件。

方法2

  • 使用开发工具快速运行插件,无需手动创建实例
  • 创建入口文件,例如main.py,并在其中写入以下代码
python
from liteyuki.dev.plugin import run_plugins
+
+run_plugins("watchdog_plugin")

然后运行python main.py即可启动插件

启用插件后,我们在src/nonebot_plugins下创建一个文件,例如test.py,并在其中写入一些代码,保存后轻雪会自动重载NoneBot进程

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/dev/resource.html b/en/dev/resource.html new file mode 100644 index 00000000..e7ed0ec2 --- /dev/null +++ b/en/dev/resource.html @@ -0,0 +1,38 @@ + + + + + + 资源包开发 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

简介

资源包,亦可根据用途称为主题包、字体包、语言包等,它允许你一定程度上自定义轻雪的外观,并且不用修改源代码

  • 资源/主题商店提供了一些资源包供你选择,你也可以自己制作资源包
  • 资源包的制作很简单,如果你接触过Minecraft的资源包,那么你能够很快就上手,仅需按照原有路径进行文件替换即可,讲起打包成一个新的资源包。
  • 部分内容制作需要一点点前端基础,例如htmlcss
  • 轻雪原版资源包请查看LiteyukiBot/liteyuki/resources,可以在此基础上进行修改
  • 欢迎各位投稿资源包到轻雪资源商店

请注意,主题包中的html渲染使用Js来规定数据的渲染位置,请确保您所编写的html代码能被Bot解析,否则会导致渲染失败或渲染结果不理想/异常/错位等无法预料的事情发生。推荐在编写html时同时更改对应Js代码,以避免出现无法预料的问题。


加载资源包

  • 资源包通常是以.zip格式压缩的,只需要将其解压到根目录resources目录下即可,注意不要嵌套文件夹,正常的路径应该是这样的
shell
main.py
+resources
+└─resource_pack_1
+    ├─metadata.yml
+    ├─templates
+    └───...
+└─resource_pack_2
+    ├─metadata.yml
+    └─...
  • 你自己制作的资源包也应该遵循这个规则,并且应该在metadata.yml中填写一些信息
  • 若没有metadata.yml文件,则该文件夹不会被识别为资源包
yaml
name: "资源包名称"
+version: "1.0.0"
+description: "资源包描述"
+# 你可以自定义一些信息,但请保证以上三个字段
+...
  • 资源包加载遵循一个优先级,即后加载的资源包会覆盖前面的资源包,例如,你在A包中定义了一个index.html文件,B包也定义了一个index.html文件,那么加载B包后,A包中的index.html文件会被覆盖
  • 对于不同资源包的不同文件,是可以相对引用的,例如你在A中定义了templates/index.html,在B中定义了templates/style.css,可以在A的index.html中用./style.css相对路径引用B中的css

TIP

资源包的结构会随着轻雪的更新而有变动,第三方资源包开发者需要注意版本兼容性,同时用户也应该自行选择可用的资源包

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/index.html b/en/index.html new file mode 100644 index 00000000..031c2be0 --- /dev/null +++ b/en/index.html @@ -0,0 +1,26 @@ + + + + + + LiteyukiBot + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en/store/plugin.html b/en/store/plugin.html new file mode 100644 index 00000000..8b5393a1 --- /dev/null +++ b/en/store/plugin.html @@ -0,0 +1,26 @@ + + + + + + 插件商店 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/store/resource.html b/en/store/resource.html new file mode 100644 index 00000000..264a4298 --- /dev/null +++ b/en/store/resource.html @@ -0,0 +1,26 @@ + + + + + + 资源商店 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/usage/agreement.html b/en/usage/agreement.html new file mode 100644 index 00000000..6cf6ab88 --- /dev/null +++ b/en/usage/agreement.html @@ -0,0 +1,26 @@ + + + + + + 用户协议 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

用户协议

  1. 本项目遵循MIT协议,你可以自由使用,修改,分发,但是请保留原作者信息
  2. 你可以选择开启auto_report(默认开启),轻雪会收集以下内容
    • 运行环境的设备信息:CPU,内存,系统信息及Python信息
    • 插件信息(不含插件数据)
    • 部分异常信息,
    • 会话负载信息(不含隐私部分) 以上内容仅用于项目的优化,不包含任何隐私信息,且通过安全的方式传输到轻雪的服务器,若你不希望提供这些信息,可以在配置文件中把auto_report设定为false
  3. 本项目不会收集用户的任何隐私信息,但请注意甄别第三方插件的安全性
  4. 使用此项目代表你已经同意以上协议

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/usage/basic.html b/en/usage/basic.html new file mode 100644 index 00000000..ae3e0357 --- /dev/null +++ b/en/usage/basic.html @@ -0,0 +1,26 @@ + + + + + + 基础插件 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

基础插件


TIP

参数<param>为必填参数,[option]为可选参数。

命令别名:配置了命令别名的命令可以使用别名代替原命令,例如npm install ~可以使用插件 安装 ~代替。

轻雪命令liteyuki_command

命令说明权限举例可用参数
reload-liteyuki重载轻雪超级用户
update-liteyuki更新轻雪超级用户
liteecho查看当前bot 版本超级用户
status查看统计信息和状态超级用户
config set <key> value添加配置项,若存在则会覆盖,输入值会被执行以转换为正确的类型,"10"和10是不一样的超级用户config set name 'liteyuki-bot'<key>: 若存在则覆盖, 若不存在则创建于config.yml ; value: yml格式的所有合法内容
config get [key] 查询配置项,不带key返回配置项列表,推荐私聊使用超级用户config get name<key>: 若存在则返回, 若不存在则返回空
switch-image-mode 在普通图片和Markdown大图之间切换,该功能需要commit:505468b及以后的Lagrange.OneBot,默认普通图片超级用户switch-image-mode
/api api_name [args] 调用机器人API超级用户/api get_group_member_list group_id=1234567<args>: 参数列表, 格式为onebot v11协议api, 可用%20代替空格
/function function_name [args] [kwargs] 调用机器人函数(.lyfunction语法)超级用户/function send_group_msg group_id=1234567 message='hello'<args><kwargs>: 参数列表, api格式为onebot v11协议api
group enable/disable [group_id]在群聊启用/停用机器人,group_id仅超级用户可用超级用户,群聊仅群主、管理员、超级用户可用group enable 1145141919810<group_id>: 群号
liteyuki-docs查看轻雪文档所有人

命令别名

命令别名
status状态
reload-liteyuki重启轻雪
update-liteyuki更新轻雪
reload-resources重载资源
config配置, set 设置 / get 查询
switch-image-mode切换图片模式
liteyuki-docs轻雪文档
group群聊, enable 启用 / disable 停用

插件/包管理器 liteyuki_pacman

  • 插件管理
命令说明权限
npm update更新插件商店索引超级用户
npm install <plugin_name>安装插件超级用户
npm uninstall <plugin_name>卸载插件超级用户
npm search <keywords...>通过关键词搜索插件超级用户
npm enable-global/disable-global <plugin_name>全局启用/停用插件超级用户
npm enable/disable <plugin_name> [--group <group_id>]当前会话启用/停用插件群聊仅群主、管理员、超级用户可用,私聊所有人可用
npm list [page] [num]列出所有插件 page为页数,num为每页显示数量群聊仅群主、管理员、超级用户可用,私聊所有人可用
help <plugin_name>查看插件帮助所有人
  • 资源包管理
命令说明权限
rpm list [page] [num]列出所有资源包 page为页数,num为每页显示数量超级用户
rpm load <pack_name>加载资源包超级用户
rpm unload <pack_name>卸载资源包超级用户
rpm change <pack_name>修改优先级超级用户
rpm reload重载所有资源包超级用户

命令别名

命令别名
npm插件管理
update更新
install安装
uninstall卸载
search搜索
enable启用
disable停用
enable-global全局启用
disable-global全局停用
rpm资源包
load加载
unload卸载
change更改
reload重载
list列表
help帮助

WARNING

受限于NoneBot2钩子函数的依赖注入参数,插件停用只能阻断传入响应,对于主动推送的插件不生效,请阅读插件主页的说明。


用户管理liteyuki_user

命令说明权限
profile查看用户信息菜单所有人
profile set <key> [value]设置用户信息或打开属性设置菜单所有人
profile get <key>获取用户信息所有人

###命令别名

命令别名
profile个人信息
set设置
get查询

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/en/usage/extra.html b/en/usage/extra.html new file mode 100644 index 00000000..1d928d9d --- /dev/null +++ b/en/usage/extra.html @@ -0,0 +1,26 @@ + + + + + + 功能命令 | LiteyukiBot + + + + + + + + + + + + + + + +
Skip to content

功能插件命令

轻雪天气liteyuki_weather

查询实时天气,支持绑定城市,支持中英文城市名,支持多个关键词查询。

配置项

yaml
weather_key: "" # 和风天气的天气key,会自动判断key版本

命令

shell
weather <keywords...> # Keywords为城市名,支持中英文

查询目标地实时天气,例如:"天气 北京 海淀", "weather Tokyo Shinjuku"

shell
bind-city <keywords...> # Keywords为城市名,支持中英文

绑定查询城市,个人全局生效

命令别名

命令别名
weather天气
bind-city绑定城市

统计信息liteyuki_statistics

统计信息 命令

shell
statistic message --duration <duration> --period <period> --group [current|group_id] --bot [current|bot_id]

功能: 用于统计Bot接收到的消息, 统计周期为period, 统计时间范围为duration

参数格式
duration使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
period使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
groupcurrent (当前群聊) 或 group_id (QQ群号)
botcurrent (当前Bot) 或 bot_id

命令别名

命令别名
statisticstat
messagem
--duration-d
--period`-p
--group-g
--bot-b
currentc

Documentation built with VitePress | API references generated by litedoc

+ + + + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..73e9e36e9447447638891c806bf412cb332111a3 GIT binary patch literal 67646 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 E55V}>761SM literal 0 HcmV?d00001 diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 00000000..6e6fe822 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"deploy_config.md":"QRt04bcu","deploy_fandq.md":"BC91M77d","deploy_install.md":"DaqD6Ylg","dev_api_api.md":"BjidfGYh","dev_api_bot_bot.md":"CmVyYr_O","dev_api_bot_index.md":"DudPhKae","dev_api_bot_lifespan.md":"B4hpMOqt","dev_api_comm_channel.md":"CNJvRyvp","dev_api_comm_comm.md":"UNalIkKO","dev_api_comm_event.md":"C9P63b1v","dev_api_comm_index.md":"Bztx56-h","dev_api_comm_rpc.md":"Ctatb5Fy","dev_api_comm_socks_channel.md":"i5OohqUe","dev_api_comm_storage.md":"CquSLWbc","dev_api_config.md":"5YZEeFsT","dev_api_core_core.md":"D46kyvua","dev_api_core_index.md":"BN6y5dmE","dev_api_core_manager.md":"DiZst2H3","dev_api_dev_dev.md":"CnxR9aZA","dev_api_dev_index.md":"CbQNGO4N","dev_api_dev_observer.md":"rNRTx952","dev_api_dev_plugin.md":"B8-Pj2Gj","dev_api_exception.md":"BdaZK_3x","dev_api_index.md":"Bj6EsNxq","dev_api_log.md":"C1VDikdj","dev_api_message_event.md":"AxntDJi3","dev_api_message_index.md":"B1MCWTHF","dev_api_message_matcher.md":"CrqC3-lV","dev_api_message_message.md":"Cp-oF0Sy","dev_api_message_on.md":"BdoE0DiT","dev_api_message_rule.md":"UByA3TJk","dev_api_message_session.md":"ZRjlTcix","dev_api_mkdoc.md":"BPGO1Znu","dev_api_plugin_index.md":"3yEbVRtX","dev_api_plugin_load.md":"Bb_Kxjiz","dev_api_plugin_manager.md":"wxoQsnAr","dev_api_plugin_model.md":"CXJI2586","dev_api_plugin_plugin.md":"CSWk8lsR","dev_api_plugins_liteecho.md":"CPFGVTjw","dev_api_plugins_plugin_loader_index.md":"BKOtyJlM","dev_api_plugins_plugin_loader_plugin_loader.md":"Bfz2lNbM","dev_api_utils.md":"BfOyfADO","dev_comm.md":"BaLcrxQn","dev_lyfunc.md":"DGSAE6Uz","dev_plugin.md":"7WyHaDzB","dev_resource.md":"DU3Q8OBq","en_deploy_config.md":"CB-Epa0p","en_deploy_fandq.md":"lp1l61Jw","en_deploy_install.md":"BnEnd6Nu","en_dev_api_api.md":"D-5_3fUd","en_dev_api_bot_bot.md":"D0tmeTXy","en_dev_api_bot_index.md":"LrWFTh2D","en_dev_api_bot_lifespan.md":"EgH0pEuD","en_dev_api_comm_channel.md":"BLjPtV1B","en_dev_api_comm_comm.md":"nImwmKaA","en_dev_api_comm_event.md":"B8tSNpPu","en_dev_api_comm_index.md":"DXB5jsIP","en_dev_api_comm_rpc.md":"Db5NdJbe","en_dev_api_comm_socks_channel.md":"kerI5Mmv","en_dev_api_comm_storage.md":"CyNGUlpk","en_dev_api_config.md":"paJM3SZQ","en_dev_api_core_core.md":"DspKdKLc","en_dev_api_core_index.md":"Cu0gmuqG","en_dev_api_core_manager.md":"Bs82V5ER","en_dev_api_dev_dev.md":"C7bp0nFK","en_dev_api_dev_index.md":"B_Clatcv","en_dev_api_dev_observer.md":"DfB9VffK","en_dev_api_dev_plugin.md":"dVSn90qu","en_dev_api_exception.md":"DTnDyb4J","en_dev_api_index.md":"Da9OtAtQ","en_dev_api_log.md":"BD04gPQH","en_dev_api_message_event.md":"DkU7HnIc","en_dev_api_message_index.md":"DEGPA3Qg","en_dev_api_message_matcher.md":"fjcL64M7","en_dev_api_message_message.md":"D0iZgCWF","en_dev_api_message_on.md":"Bpf1nKZ0","en_dev_api_message_rule.md":"L6rc-HBj","en_dev_api_message_session.md":"DMwGauxy","en_dev_api_mkdoc.md":"EVvNGPKX","en_dev_api_plugin_index.md":"7EqtiaFh","en_dev_api_plugin_load.md":"BWXzuii9","en_dev_api_plugin_manager.md":"Cq1g681t","en_dev_api_plugin_model.md":"CeWxdiF_","en_dev_api_plugin_plugin.md":"C9viahSZ","en_dev_api_plugins_liteecho.md":"w4kQQyNd","en_dev_api_plugins_plugin_loader_index.md":"DYxIyTd3","en_dev_api_plugins_plugin_loader_plugin_loader.md":"CX7_cGXK","en_dev_api_utils.md":"D2AasRls","en_dev_comm.md":"Cn-onW1y","en_dev_lyfunc.md":"C5K1_qgM","en_dev_plugin.md":"Xb7vUDpJ","en_dev_resource.md":"CYdCh9wj","en_index.md":"DVQGNFEI","en_store_plugin.md":"DceXsbsh","en_store_resource.md":"DwD3Poel","en_usage_agreement.md":"DzIdKK2Q","en_usage_basic.md":"CxkJTStx","en_usage_extra.md":"CHJ4PN4s","index.md":"CQL2AFxv","store_plugin.md":"BMBIhTm1","store_resource.md":"CfhqcpPi","usage_agreement.md":"DBBkunJ_","usage_basic.md":"DJoTZ022","usage_extra.md":"AJu--2F9"} diff --git a/index.html b/index.html new file mode 100644 index 00000000..fdab4605 --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + 轻雪机器人 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteyuki.svg b/liteyuki.svg new file mode 100644 index 00000000..cb20885f --- /dev/null +++ b/liteyuki.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..f427901e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://bot.liteyuki.icu/en/deploy/config.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/deploy/config.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/deploy/fandq.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/deploy/fandq.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/deploy/install.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/deploy/install.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/en/dev/api/api.htmlhttps://bot.liteyuki.icu/dev/api/api.htmlhttps://bot.liteyuki.icu/en/dev/api/bot/bot.htmlhttps://bot.liteyuki.icu/dev/api/bot/bot.htmlhttps://bot.liteyuki.icu/en/dev/api/bot/https://bot.liteyuki.icu/dev/api/bot/https://bot.liteyuki.icu/en/dev/api/bot/lifespan.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/bot/lifespan.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/channel.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/comm/channel.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/comm.htmlhttps://bot.liteyuki.icu/dev/api/comm/comm.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/event.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/comm/event.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/https://bot.liteyuki.icu/dev/api/comm/https://bot.liteyuki.icu/en/dev/api/comm/rpc.htmlhttps://bot.liteyuki.icu/dev/api/comm/rpc.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/socks_channel.htmlhttps://bot.liteyuki.icu/dev/api/comm/socks_channel.htmlhttps://bot.liteyuki.icu/en/dev/api/comm/storage.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/comm/storage.htmlhttps://bot.liteyuki.icu/en/dev/api/config.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/config.htmlhttps://bot.liteyuki.icu/en/dev/api/core/core.htmlhttps://bot.liteyuki.icu/dev/api/core/core.htmlhttps://bot.liteyuki.icu/en/dev/api/core/https://bot.liteyuki.icu/dev/api/core/https://bot.liteyuki.icu/en/dev/api/core/manager.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/core/manager.htmlhttps://bot.liteyuki.icu/en/dev/api/dev/dev.htmlhttps://bot.liteyuki.icu/dev/api/dev/dev.htmlhttps://bot.liteyuki.icu/en/dev/api/dev/https://bot.liteyuki.icu/dev/api/dev/https://bot.liteyuki.icu/en/dev/api/dev/observer.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/dev/observer.htmlhttps://bot.liteyuki.icu/en/dev/api/dev/plugin.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/dev/plugin.htmlhttps://bot.liteyuki.icu/en/dev/api/exception.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/exception.htmlhttps://bot.liteyuki.icu/en/dev/api/https://bot.liteyuki.icu/dev/api/https://bot.liteyuki.icu/en/dev/api/log.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/log.htmlhttps://bot.liteyuki.icu/en/dev/api/message/event.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/message/event.htmlhttps://bot.liteyuki.icu/en/dev/api/message/https://bot.liteyuki.icu/dev/api/message/https://bot.liteyuki.icu/en/dev/api/message/matcher.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/message/matcher.htmlhttps://bot.liteyuki.icu/en/dev/api/message/message.htmlhttps://bot.liteyuki.icu/dev/api/message/message.htmlhttps://bot.liteyuki.icu/en/dev/api/message/on.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/message/on.htmlhttps://bot.liteyuki.icu/en/dev/api/message/rule.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/message/rule.htmlhttps://bot.liteyuki.icu/en/dev/api/message/session.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/message/session.htmlhttps://bot.liteyuki.icu/en/dev/api/mkdoc.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/mkdoc.htmlhttps://bot.liteyuki.icu/en/dev/api/plugin/https://bot.liteyuki.icu/dev/api/plugin/https://bot.liteyuki.icu/en/dev/api/plugin/load.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/plugin/load.htmlhttps://bot.liteyuki.icu/en/dev/api/plugin/manager.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/plugin/manager.htmlhttps://bot.liteyuki.icu/en/dev/api/plugin/model.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/plugin/model.htmlhttps://bot.liteyuki.icu/en/dev/api/plugin/plugin.htmlhttps://bot.liteyuki.icu/dev/api/plugin/plugin.htmlhttps://bot.liteyuki.icu/en/dev/api/plugins/liteecho.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/plugins/liteecho.htmlhttps://bot.liteyuki.icu/en/dev/api/plugins/plugin_loader/https://bot.liteyuki.icu/dev/api/plugins/plugin_loader/https://bot.liteyuki.icu/en/dev/api/plugins/plugin_loader/plugin_loader.htmlhttps://bot.liteyuki.icu/dev/api/plugins/plugin_loader/plugin_loader.htmlhttps://bot.liteyuki.icu/en/dev/api/utils.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/dev/api/utils.htmlhttps://bot.liteyuki.icu/en/dev/comm.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/dev/comm.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/en/dev/lyfunc.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/dev/lyfunc.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/dev/plugin.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/dev/plugin.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/dev/resource.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/dev/resource.html2024-08-31T11:05:37.000Zhttps://bot.liteyuki.icu/en/2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/store/plugin.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/store/plugin.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/store/resource.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/store/resource.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/usage/agreement.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/usage/agreement.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/usage/basic.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/usage/basic.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/en/usage/extra.html2024-08-31T10:57:48.000Zhttps://bot.liteyuki.icu/usage/extra.html2024-08-31T10:57:48.000Z \ No newline at end of file diff --git a/store/plugin.html b/store/plugin.html new file mode 100644 index 00000000..c4144d9c --- /dev/null +++ b/store/plugin.html @@ -0,0 +1,26 @@ + + + + + + 插件商店 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/store/resource.html b/store/resource.html new file mode 100644 index 00000000..f8c414a4 --- /dev/null +++ b/store/resource.html @@ -0,0 +1,26 @@ + + + + + + 资源商店 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/usage/agreement.html b/usage/agreement.html new file mode 100644 index 00000000..6c34044a --- /dev/null +++ b/usage/agreement.html @@ -0,0 +1,26 @@ + + + + + + 用户协议 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

用户协议

  1. 本项目遵循MIT协议,你可以自由使用,修改,分发,但是请保留原作者信息
  2. 你可以选择开启auto_report(默认开启),轻雪会收集以下内容
    • 运行环境的设备信息:CPU,内存,系统信息及Python信息
    • 插件信息(不含插件数据)
    • 部分异常信息,
    • 会话负载信息(不含隐私部分) 以上内容仅用于项目的优化,不包含任何隐私信息,且通过安全的方式传输到轻雪的服务器,若你不希望提供这些信息,可以在配置文件中把auto_report设定为false
  3. 本项目不会收集用户的任何隐私信息,但请注意甄别第三方插件的安全性
  4. 使用此项目代表你已经同意以上协议

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/usage/basic.html b/usage/basic.html new file mode 100644 index 00000000..77823cf4 --- /dev/null +++ b/usage/basic.html @@ -0,0 +1,26 @@ + + + + + + 基础插件 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

基础插件


TIP

参数<param>为必填参数,[option]为可选参数。

命令别名:配置了命令别名的命令可以使用别名代替原命令,例如npm install ~可以使用插件 安装 ~代替。

轻雪命令liteyuki_command

命令说明权限举例可用参数
reload-liteyuki重载轻雪超级用户
update-liteyuki更新轻雪超级用户
liteecho查看当前bot 版本超级用户
status查看统计信息和状态超级用户
config set <key> value添加配置项,若存在则会覆盖,输入值会被执行以转换为正确的类型,"10"和10是不一样的超级用户config set name 'liteyuki-bot'<key>: 若存在则覆盖, 若不存在则创建于config.yml ; value: yml格式的所有合法内容
config get [key] 查询配置项,不带key返回配置项列表,推荐私聊使用超级用户config get name<key>: 若存在则返回, 若不存在则返回空
switch-image-mode 在普通图片和Markdown大图之间切换,该功能需要commit:505468b及以后的Lagrange.OneBot,默认普通图片超级用户switch-image-mode
/api api_name [args] 调用机器人API超级用户/api get_group_member_list group_id=1234567<args>: 参数列表, 格式为onebot v11协议api, 可用%20代替空格
/function function_name [args] [kwargs] 调用机器人函数(.lyfunction语法)超级用户/function send_group_msg group_id=1234567 message='hello'<args><kwargs>: 参数列表, api格式为onebot v11协议api
group enable/disable [group_id]在群聊启用/停用机器人,group_id仅超级用户可用超级用户,群聊仅群主、管理员、超级用户可用group enable 1145141919810<group_id>: 群号
liteyuki-docs查看轻雪文档所有人

命令别名

命令别名
status状态
reload-liteyuki重启轻雪
update-liteyuki更新轻雪
reload-resources重载资源
config配置, set 设置 / get 查询
switch-image-mode切换图片模式
liteyuki-docs轻雪文档
group群聊, enable 启用 / disable 停用

插件/包管理器 liteyuki_pacman

  • 插件管理
命令说明权限
npm update更新插件商店索引超级用户
npm install <plugin_name>安装插件超级用户
npm uninstall <plugin_name>卸载插件超级用户
npm search <keywords...>通过关键词搜索插件超级用户
npm enable-global/disable-global <plugin_name>全局启用/停用插件超级用户
npm enable/disable <plugin_name> [--group <group_id>]当前会话启用/停用插件群聊仅群主、管理员、超级用户可用,私聊所有人可用
npm list [page] [num]列出所有插件 page为页数,num为每页显示数量群聊仅群主、管理员、超级用户可用,私聊所有人可用
help <plugin_name>查看插件帮助所有人
  • 资源包管理
命令说明权限
rpm list [page] [num]列出所有资源包 page为页数,num为每页显示数量超级用户
rpm load <pack_name>加载资源包超级用户
rpm unload <pack_name>卸载资源包超级用户
rpm change <pack_name>修改优先级超级用户
rpm reload重载所有资源包超级用户

命令别名

命令别名
npm插件管理
update更新
install安装
uninstall卸载
search搜索
enable启用
disable停用
enable-global全局启用
disable-global全局停用
rpm资源包
load加载
unload卸载
change更改
reload重载
list列表
help帮助

WARNING

受限于NoneBot2钩子函数的依赖注入参数,插件停用只能阻断传入响应,对于主动推送的插件不生效,请阅读插件主页的说明。


用户管理liteyuki_user

命令说明权限
profile查看用户信息菜单所有人
profile set <key> [value]设置用户信息或打开属性设置菜单所有人
profile get <key>获取用户信息所有人

###命令别名

命令别名
profile个人信息
set设置
get查询

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file diff --git a/usage/extra.html b/usage/extra.html new file mode 100644 index 00000000..83958174 --- /dev/null +++ b/usage/extra.html @@ -0,0 +1,26 @@ + + + + + + 功能命令 | 轻雪机器人 + + + + + + + + + + + + + + + +
Skip to content

功能插件命令

轻雪天气liteyuki_weather

查询实时天气,支持绑定城市,支持中英文城市名,支持多个关键词查询。

配置项

yaml
weather_key: "" # 和风天气的天气key,会自动判断key版本

命令

shell
weather <keywords...> # Keywords为城市名,支持中英文

查询目标地实时天气,例如:"天气 北京 海淀", "weather Tokyo Shinjuku"

shell
bind-city <keywords...> # Keywords为城市名,支持中英文

绑定查询城市,个人全局生效

命令别名

命令别名
weather天气
bind-city绑定城市

统计信息liteyuki_statistics

统计信息 命令

shell
statistic message --duration <duration> --period <period> --group [current|group_id] --bot [current|bot_id]

功能: 用于统计Bot接收到的消息, 统计周期为period, 统计时间范围为duration

参数格式
duration使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
period使用通用日期简写: 1d(天), 1h(小时), 45m(分钟), 14s(秒)
groupcurrent (当前群聊) 或 group_id (QQ群号)
botcurrent (当前Bot) 或 bot_id

命令别名

命令别名
statisticstat
messagem
--duration-d
--period`-p
--group-g
--bot-b
currentc

文档由 VitePress 构建 | API引用由 litedoc 生成

+ + + + \ No newline at end of file

用户协议