commit 318bbf3be273f123c4fba8b8f7415607ddfd37bb Author: OLDREDSTONE Date: Sun Jun 1 11:35:11 2025 +0800 new diff --git a/.hintrc b/.hintrc new file mode 100644 index 0000000..a9577fa --- /dev/null +++ b/.hintrc @@ -0,0 +1,8 @@ +{ + "extends": [ + "development" + ], + "hints": { + "highest-available-document-mode": "off" + } +} \ No newline at end of file diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.md b/404.md new file mode 100644 index 0000000..7283d6e --- /dev/null +++ b/404.md @@ -0,0 +1,11 @@ + + +# 404 + +### 奇怪,凹兔怎么没找到这个页面…… + +凹兔:疑惑 diff --git a/README.md b/README.md new file mode 100644 index 0000000..64f598d --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ + +> 此版本网页正在维护。 + +# 节奏医生中文编辑器教程 + +《节奏医生》编辑器中文教程旨在以教学的形式帮助您快速了解编辑器的界面,基础功能,设计技巧和做谱规范。未经授权不得以图文,视频等形式转载,也不得以本教程内素材进行二次创作。 + +编辑器视频教程点击[此链接](https://www.bilibili.com/video/BV1pr4y1k7gP)。教程内所有演示关卡下载放置于[百度网盘](https://pan.baidu.com/s/1Tb6ywVmge25ztMFnpa6q_Q),提取码:rdlv。 + +> 如果你看到[更新信息](/pages/changelog.md)增加了,但是又感觉什么也没更新,那就试着按一下`Ctrl + F5`,再不行就清空浏览器缓存。 + +## 联系我们 + +![我们的 QQ 群号是:951070053](/images/intro-02.png) + +如果你有做谱相关的问题,或是对本教程有什么意见和建议,可以点击链接加入 QQ 群 [951070053](https://jq.qq.com/?_wv=1027&k=nsPA09E4) 告知我们。你也可以在群里上传谱面给我们试玩,群友们都会热心为你提供谱面优化建议。真诚欢迎各位做谱萌新和大佬的加入。 + +(悄悄透露一句:官方也入驻了这个群哦~) + +戳这只看板娘可以获得随机 TIPS → \ No newline at end of file diff --git a/_coverpage.md b/_coverpage.md new file mode 100644 index 0000000..ed6ee59 --- /dev/null +++ b/_coverpage.md @@ -0,0 +1,7 @@ + + +# 节奏医生编辑器教程 + +> 官方指定中文编辑器教程网站 + +[开始使用](/pages/intro.md) \ No newline at end of file diff --git a/_navbar.md b/_navbar.md new file mode 100644 index 0000000..0cca24b --- /dev/null +++ b/_navbar.md @@ -0,0 +1 @@ + diff --git a/_sidebar.md b/_sidebar.md new file mode 100644 index 0000000..db9fd7e --- /dev/null +++ b/_sidebar.md @@ -0,0 +1,66 @@ + + + +- [

](/pages/intro.md) +- [

更新信息

](/pages/changelog.md) +- 入门:基础 + - [

修改游戏版本

](/pages/changegameversion.md) + - [

导入与导出

](/pages/importandexport.md) + - [

创建游戏内置角色

](/pages/createbuiltincharacter.md) + - [

编辑器界面与快捷键

](/pages/editorinterface.md) +- 入门:基础机制 + - [

普通拍子

](/pages/classicbeat.md) + - [

单发拍子

](/pages/oneshotbeat.md) + - [

长按

](/pages/holdbeat.md) +- 基础:文字 + - [

浮动文字

](/pages/floatingtext.md) + - [

其他文字事件

](/pages/captions.md) +- 基础:轨道特效 + - [

轨道移动

](/pages/moverow.md) + - [

场景与主题

](/pages/settheme.md) + - [

轨道视效

](/pages/rowfx.md) +- 进阶:节奏设计 + - [

普通拍子的衍生节奏型

](/pages/moreclassicbeats.md) + - [

单发拍子的衍生节奏型

](/pages/moreoneshotbeats.md) + - [

采音和节奏设计

](/pages/beatpatterndesign.md) + - [

关卡设计

](/pages/chartdesign.md) + - [

音效设计

](/pages/audiodesign.md) + - [

无障碍设计

](/pages/accessibledesign.md) +- 进阶:视觉特效 + - [

房间

](/pages/room.md) + - [

镜头移动

](/pages/camera.md) + - [

房间视效

](/pages/roomfx.md) + - [

镜头带来的额外视效

](/pages/camerafx.md) + - [

镜厅

](/pages/hallofmirror.md) + - [

视觉干扰

](/pages/vfx.md) + - [

窗口移动

](/pages/windowmove.md) + - [

](/pages/hand.md) +- 进阶:自制素材 + - [

自制角色与精灵资源

](/pages/spritesheet.md) + - [

使用精灵

](/pages/decoration.md) + - [

场景资源

](/pages/assets.md) +- 进阶:编程 + - [

标签

](/pages/tag.md) + - [

自定义方法

](/pages/custommethod.md) + - [

条件

](/pages/condition.md) + - [

变量

](/pages/variable.md) +- 附录 + - [

事件列表

](/pages/appendix_events.md) + - [

预设特效列表

](/pages/appendix_vfxs.md) + - [

音频列表

](/pages/appendix_audios.md) + - [

官方机制列表

](/pages/appendix_gimmicks.md) + - [

相关资源

](/pages/appendix_resources.md) + - [

自定义方法表

](/pages/appendix_custommethods.md) + - [

制谱规范

](/pages/appendix_levelrules.md) + - [

英汉对照

](/pages/appendix_translations.md) + - [

其他编写关卡的手段

](/pages/appendix_coding.md) + - [

工具

](/pages/appendix_tools.md) +- [

制作人员

](/pages/credits.md) \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..aff63c5 Binary files /dev/null and b/favicon.ico differ diff --git a/font/DinkieBitmap-7px.woff2 b/font/DinkieBitmap-7px.woff2 new file mode 100644 index 0000000..315eb81 Binary files /dev/null and b/font/DinkieBitmap-7px.woff2 differ diff --git a/font/DinkieBitmap-9px.woff2 b/font/DinkieBitmap-9px.woff2 new file mode 100644 index 0000000..943ac1c Binary files /dev/null and b/font/DinkieBitmap-9px.woff2 differ diff --git a/font/DinkieBitmap-9pxCode.woff2 b/font/DinkieBitmap-9pxCode.woff2 new file mode 100644 index 0000000..f83ec0e Binary files /dev/null and b/font/DinkieBitmap-9pxCode.woff2 differ diff --git a/font/DinkieBitmap-9pxItalic.woff2 b/font/DinkieBitmap-9pxItalic.woff2 new file mode 100644 index 0000000..16b3094 Binary files /dev/null and b/font/DinkieBitmap-9pxItalic.woff2 differ diff --git a/images/accessibledesign-otto.gif b/images/accessibledesign-otto.gif new file mode 100644 index 0000000..dde6391 Binary files /dev/null and b/images/accessibledesign-otto.gif differ diff --git a/images/assets-fillmode.png b/images/assets-fillmode.png new file mode 100644 index 0000000..9d032d3 Binary files /dev/null and b/images/assets-fillmode.png differ diff --git a/images/assets-road.gif b/images/assets-road.gif new file mode 100644 index 0000000..7c222ee Binary files /dev/null and b/images/assets-road.gif differ diff --git a/images/audodesign-rowsettings.png b/images/audodesign-rowsettings.png new file mode 100644 index 0000000..eb19fcc Binary files /dev/null and b/images/audodesign-rowsettings.png differ diff --git a/images/beatpatterndesign-amountofbeats.gif b/images/beatpatterndesign-amountofbeats.gif new file mode 100644 index 0000000..011ea26 Binary files /dev/null and b/images/beatpatterndesign-amountofbeats.gif differ diff --git a/images/beatpatterndesign-beatsthatoverlap.gif b/images/beatpatterndesign-beatsthatoverlap.gif new file mode 100644 index 0000000..2f6065d Binary files /dev/null and b/images/beatpatterndesign-beatsthatoverlap.gif differ diff --git a/images/beatpatterndesign-beatsthatscaredme.gif b/images/beatpatterndesign-beatsthatscaredme.gif new file mode 100644 index 0000000..56a02c1 Binary files /dev/null and b/images/beatpatterndesign-beatsthatscaredme.gif differ diff --git a/images/beatpatterndesign-beatsthatsofast.gif b/images/beatpatterndesign-beatsthatsofast.gif new file mode 100644 index 0000000..ea07681 Binary files /dev/null and b/images/beatpatterndesign-beatsthatsofast.gif differ diff --git a/images/beatpatterndesign-beatsthatstopped.gif b/images/beatpatterndesign-beatsthatstopped.gif new file mode 100644 index 0000000..0493a7f Binary files /dev/null and b/images/beatpatterndesign-beatsthatstopped.gif differ diff --git a/images/beatpatterndesign-coffeeshower.gif b/images/beatpatterndesign-coffeeshower.gif new file mode 100644 index 0000000..98920de Binary files /dev/null and b/images/beatpatterndesign-coffeeshower.gif differ diff --git a/images/beatpatterndesign-multiplerows.gif b/images/beatpatterndesign-multiplerows.gif new file mode 100644 index 0000000..ba1e6c5 Binary files /dev/null and b/images/beatpatterndesign-multiplerows.gif differ diff --git a/images/beatpatterndesign-wornouttapes.gif b/images/beatpatterndesign-wornouttapes.gif new file mode 100644 index 0000000..251f1a2 Binary files /dev/null and b/images/beatpatterndesign-wornouttapes.gif differ diff --git a/images/camera-croptheme - 副本.gif b/images/camera-croptheme - 副本.gif new file mode 100644 index 0000000..cef2e7a Binary files /dev/null and b/images/camera-croptheme - 副本.gif differ diff --git a/images/camera-haleyandheart.gif b/images/camera-haleyandheart.gif new file mode 100644 index 0000000..225d5ab Binary files /dev/null and b/images/camera-haleyandheart.gif differ diff --git a/images/camera-haleyrow.gif b/images/camera-haleyrow.gif new file mode 100644 index 0000000..d51727a Binary files /dev/null and b/images/camera-haleyrow.gif differ diff --git a/images/camera-heart.gif b/images/camera-heart.gif new file mode 100644 index 0000000..0f026f7 Binary files /dev/null and b/images/camera-heart.gif differ diff --git a/images/camera-minercutscene.gif b/images/camera-minercutscene.gif new file mode 100644 index 0000000..bd4d77f Binary files /dev/null and b/images/camera-minercutscene.gif differ diff --git a/images/camera-movecameraandmoveroom.png b/images/camera-movecameraandmoveroom.png new file mode 100644 index 0000000..6da5dbb Binary files /dev/null and b/images/camera-movecameraandmoveroom.png differ diff --git a/images/camera-movehorizontallytochangeroom.gif b/images/camera-movehorizontallytochangeroom.gif new file mode 100644 index 0000000..8e8d329 Binary files /dev/null and b/images/camera-movehorizontallytochangeroom.gif differ diff --git a/images/camera-nervouslucky.gif b/images/camera-nervouslucky.gif new file mode 100644 index 0000000..85629ca Binary files /dev/null and b/images/camera-nervouslucky.gif differ diff --git a/images/camera-nesting.gif b/images/camera-nesting.gif new file mode 100644 index 0000000..db20479 Binary files /dev/null and b/images/camera-nesting.gif differ diff --git a/images/camera-strenchmode.gif b/images/camera-strenchmode.gif new file mode 100644 index 0000000..48cd48e Binary files /dev/null and b/images/camera-strenchmode.gif differ diff --git a/images/camerafx-cameracroprow.gif b/images/camerafx-cameracroprow.gif new file mode 100644 index 0000000..9adf9bc Binary files /dev/null and b/images/camerafx-cameracroprow.gif differ diff --git a/images/camerafx-cameracroptrain.gif b/images/camerafx-cameracroptrain.gif new file mode 100644 index 0000000..0f79d5e Binary files /dev/null and b/images/camerafx-cameracroptrain.gif differ diff --git a/images/camerafx-cameracropwithscreenscrolling.gif b/images/camerafx-cameracropwithscreenscrolling.gif new file mode 100644 index 0000000..cef2e7a Binary files /dev/null and b/images/camerafx-cameracropwithscreenscrolling.gif differ diff --git a/images/camerafx-movecamera.gif b/images/camerafx-movecamera.gif new file mode 100644 index 0000000..24d9121 Binary files /dev/null and b/images/camerafx-movecamera.gif differ diff --git a/images/camerafx-reflection.png b/images/camerafx-reflection.png new file mode 100644 index 0000000..5cff8d5 Binary files /dev/null and b/images/camerafx-reflection.png differ diff --git a/images/camerafx-roomindex.png b/images/camerafx-roomindex.png new file mode 100644 index 0000000..3d7f640 Binary files /dev/null and b/images/camerafx-roomindex.png differ diff --git a/images/camerafx-strench.gif b/images/camerafx-strench.gif new file mode 100644 index 0000000..7b7235f Binary files /dev/null and b/images/camerafx-strench.gif differ diff --git a/images/camerafx-withmoveroom.gif b/images/camerafx-withmoveroom.gif new file mode 100644 index 0000000..706015c Binary files /dev/null and b/images/camerafx-withmoveroom.gif differ diff --git a/images/captions-danmaku.gif b/images/captions-danmaku.gif new file mode 100644 index 0000000..c75e1d0 Binary files /dev/null and b/images/captions-danmaku.gif differ diff --git a/images/captions-dialoguecontent.png b/images/captions-dialoguecontent.png new file mode 100644 index 0000000..4a30cd7 Binary files /dev/null and b/images/captions-dialoguecontent.png differ diff --git a/images/captions-dialogueproperties.png b/images/captions-dialogueproperties.png new file mode 100644 index 0000000..034e278 Binary files /dev/null and b/images/captions-dialogueproperties.png differ diff --git a/images/captions-statussign.png b/images/captions-statussign.png new file mode 100644 index 0000000..899cc56 Binary files /dev/null and b/images/captions-statussign.png differ diff --git a/images/changegameversion-beta.png b/images/changegameversion-beta.png new file mode 100644 index 0000000..12c04b5 Binary files /dev/null and b/images/changegameversion-beta.png differ diff --git a/images/changegameversion-rightclick.png b/images/changegameversion-rightclick.png new file mode 100644 index 0000000..6ae0b32 Binary files /dev/null and b/images/changegameversion-rightclick.png differ diff --git a/images/changegameversion-select.png b/images/changegameversion-select.png new file mode 100644 index 0000000..850ea58 Binary files /dev/null and b/images/changegameversion-select.png differ diff --git a/images/chartdesign-unclear.gif b/images/chartdesign-unclear.gif new file mode 100644 index 0000000..8698ed3 Binary files /dev/null and b/images/chartdesign-unclear.gif differ diff --git a/images/classicbeat-properties.png b/images/classicbeat-properties.png new file mode 100644 index 0000000..8fc4313 Binary files /dev/null and b/images/classicbeat-properties.png differ diff --git a/images/classicbeat-rowxssettings.png b/images/classicbeat-rowxssettings.png new file mode 100644 index 0000000..9e73e70 Binary files /dev/null and b/images/classicbeat-rowxssettings.png differ diff --git a/images/classicbeat-setnursecount.png b/images/classicbeat-setnursecount.png new file mode 100644 index 0000000..3674d63 Binary files /dev/null and b/images/classicbeat-setnursecount.png differ diff --git a/images/condition-actiontab.png b/images/condition-actiontab.png new file mode 100644 index 0000000..e605fb9 Binary files /dev/null and b/images/condition-actiontab.png differ diff --git a/images/condition-addtoevent.png b/images/condition-addtoevent.png new file mode 100644 index 0000000..5fc3af6 Binary files /dev/null and b/images/condition-addtoevent.png differ diff --git a/images/condition-buttons.png b/images/condition-buttons.png new file mode 100644 index 0000000..965ce18 Binary files /dev/null and b/images/condition-buttons.png differ diff --git a/images/condition-header.png b/images/condition-header.png new file mode 100644 index 0000000..d072cf7 Binary files /dev/null and b/images/condition-header.png differ diff --git a/images/condition-menu.png b/images/condition-menu.png new file mode 100644 index 0000000..647d870 Binary files /dev/null and b/images/condition-menu.png differ diff --git a/images/condition-mouseonevent.png b/images/condition-mouseonevent.png new file mode 100644 index 0000000..1fc7e46 Binary files /dev/null and b/images/condition-mouseonevent.png differ diff --git a/images/condition-properties.png b/images/condition-properties.png new file mode 100644 index 0000000..3072174 Binary files /dev/null and b/images/condition-properties.png differ diff --git a/images/createbuiltincharacter-16samurais.png b/images/createbuiltincharacter-16samurais.png new file mode 100644 index 0000000..c19d233 Binary files /dev/null and b/images/createbuiltincharacter-16samurais.png differ diff --git a/images/createbuiltincharacter-fourrows.png b/images/createbuiltincharacter-fourrows.png new file mode 100644 index 0000000..08c3a77 Binary files /dev/null and b/images/createbuiltincharacter-fourrows.png differ diff --git a/images/createbuiltincharacter-muterow.png b/images/createbuiltincharacter-muterow.png new file mode 100644 index 0000000..527428e Binary files /dev/null and b/images/createbuiltincharacter-muterow.png differ diff --git a/images/createbuiltincharacter-rowinfo.png b/images/createbuiltincharacter-rowinfo.png new file mode 100644 index 0000000..730b4e1 Binary files /dev/null and b/images/createbuiltincharacter-rowinfo.png differ diff --git a/images/createbuiltincharacter-samurai.png b/images/createbuiltincharacter-samurai.png new file mode 100644 index 0000000..99fcc6a Binary files /dev/null and b/images/createbuiltincharacter-samurai.png differ diff --git a/images/createbuiltincharacter-seperaterooms.png b/images/createbuiltincharacter-seperaterooms.png new file mode 100644 index 0000000..0b46256 Binary files /dev/null and b/images/createbuiltincharacter-seperaterooms.png differ diff --git a/images/custommethod-3-1n.gif b/images/custommethod-3-1n.gif new file mode 100644 index 0000000..0602601 Binary files /dev/null and b/images/custommethod-3-1n.gif differ diff --git a/images/custommethod-changecharacter.png b/images/custommethod-changecharacter.png new file mode 100644 index 0000000..04124e4 Binary files /dev/null and b/images/custommethod-changecharacter.png differ diff --git a/images/custommethod-disablereflection.png b/images/custommethod-disablereflection.png new file mode 100644 index 0000000..2105715 Binary files /dev/null and b/images/custommethod-disablereflection.png differ diff --git a/images/custommethod-grammar1.png b/images/custommethod-grammar1.png new file mode 100644 index 0000000..ce6ad91 Binary files /dev/null and b/images/custommethod-grammar1.png differ diff --git a/images/custommethod-grammar2.png b/images/custommethod-grammar2.png new file mode 100644 index 0000000..3def350 Binary files /dev/null and b/images/custommethod-grammar2.png differ diff --git a/images/custommethod-knowyou.gif b/images/custommethod-knowyou.gif new file mode 100644 index 0000000..a2682f3 Binary files /dev/null and b/images/custommethod-knowyou.gif differ diff --git a/images/custommethod-nuclear.png b/images/custommethod-nuclear.png new file mode 100644 index 0000000..b61d639 Binary files /dev/null and b/images/custommethod-nuclear.png differ diff --git a/images/custommethod-reflection.png b/images/custommethod-reflection.png new file mode 100644 index 0000000..abfc1b5 Binary files /dev/null and b/images/custommethod-reflection.png differ diff --git a/images/custommethod-statussignwidth.png b/images/custommethod-statussignwidth.png new file mode 100644 index 0000000..0a18119 Binary files /dev/null and b/images/custommethod-statussignwidth.png differ diff --git a/images/custommethod-truecameramove.png b/images/custommethod-truecameramove.png new file mode 100644 index 0000000..a96f1ab Binary files /dev/null and b/images/custommethod-truecameramove.png differ diff --git a/images/custommethod-wobblylines.png b/images/custommethod-wobblylines.png new file mode 100644 index 0000000..25cc378 Binary files /dev/null and b/images/custommethod-wobblylines.png differ diff --git a/images/decoration-ablackboard.png b/images/decoration-ablackboard.png new file mode 100644 index 0000000..e578379 Binary files /dev/null and b/images/decoration-ablackboard.png differ diff --git a/images/decoration-adofai.gif b/images/decoration-adofai.gif new file mode 100644 index 0000000..64a5f5f Binary files /dev/null and b/images/decoration-adofai.gif differ diff --git a/images/decoration-candle.gif b/images/decoration-candle.gif new file mode 100644 index 0000000..f14293e Binary files /dev/null and b/images/decoration-candle.gif differ diff --git a/images/decoration-depth.png b/images/decoration-depth.png new file mode 100644 index 0000000..b87251d Binary files /dev/null and b/images/decoration-depth.png differ diff --git a/images/decoration-mask.png b/images/decoration-mask.png new file mode 100644 index 0000000..81d83ec Binary files /dev/null and b/images/decoration-mask.png differ diff --git a/images/decoration-menu.png b/images/decoration-menu.png new file mode 100644 index 0000000..7ff2bc8 Binary files /dev/null and b/images/decoration-menu.png differ diff --git a/images/decoration-move.png b/images/decoration-move.png new file mode 100644 index 0000000..c4bb1c1 Binary files /dev/null and b/images/decoration-move.png differ diff --git a/images/decoration-star.gif b/images/decoration-star.gif new file mode 100644 index 0000000..8120a13 Binary files /dev/null and b/images/decoration-star.gif differ diff --git a/images/decoration-text.gif b/images/decoration-text.gif new file mode 100644 index 0000000..265fe64 Binary files /dev/null and b/images/decoration-text.gif differ diff --git a/images/editorinterface-bookmarks.png b/images/editorinterface-bookmarks.png new file mode 100644 index 0000000..fc71233 Binary files /dev/null and b/images/editorinterface-bookmarks.png differ diff --git a/images/editorinterface-editingarea.png b/images/editorinterface-editingarea.png new file mode 100644 index 0000000..5f5cfda Binary files /dev/null and b/images/editorinterface-editingarea.png differ diff --git a/images/editorinterface-grid.gif b/images/editorinterface-grid.gif new file mode 100644 index 0000000..7868c09 Binary files /dev/null and b/images/editorinterface-grid.gif differ diff --git a/images/editorinterface-mark.png b/images/editorinterface-mark.png new file mode 100644 index 0000000..fd9a23d Binary files /dev/null and b/images/editorinterface-mark.png differ diff --git a/images/editorinterface-menu.png b/images/editorinterface-menu.png new file mode 100644 index 0000000..0053f01 Binary files /dev/null and b/images/editorinterface-menu.png differ diff --git a/images/editorinterface-playingsettings.png b/images/editorinterface-playingsettings.png new file mode 100644 index 0000000..60392d9 Binary files /dev/null and b/images/editorinterface-playingsettings.png differ diff --git a/images/editorinterface-playingsettings2.png b/images/editorinterface-playingsettings2.png new file mode 100644 index 0000000..03dee80 Binary files /dev/null and b/images/editorinterface-playingsettings2.png differ diff --git a/images/editorinterface-previewarea.png b/images/editorinterface-previewarea.png new file mode 100644 index 0000000..35df82e Binary files /dev/null and b/images/editorinterface-previewarea.png differ diff --git a/images/editorinterface-previewsettings.png b/images/editorinterface-previewsettings.png new file mode 100644 index 0000000..0585ada Binary files /dev/null and b/images/editorinterface-previewsettings.png differ diff --git a/images/editorinterface-timeline.png b/images/editorinterface-timeline.png new file mode 100644 index 0000000..7fcfd78 Binary files /dev/null and b/images/editorinterface-timeline.png differ diff --git a/images/floatingtext-align.png b/images/floatingtext-align.png new file mode 100644 index 0000000..98d6352 Binary files /dev/null and b/images/floatingtext-align.png differ diff --git a/images/floatingtext-example.png b/images/floatingtext-example.png new file mode 100644 index 0000000..13aec1b Binary files /dev/null and b/images/floatingtext-example.png differ diff --git a/images/floatingtext-fontslyle.png b/images/floatingtext-fontslyle.png new file mode 100644 index 0000000..4aaaabb Binary files /dev/null and b/images/floatingtext-fontslyle.png differ diff --git a/images/floatingtext-jp.png b/images/floatingtext-jp.png new file mode 100644 index 0000000..1a14a44 Binary files /dev/null and b/images/floatingtext-jp.png differ diff --git a/images/floatingtext-position.png b/images/floatingtext-position.png new file mode 100644 index 0000000..eeae81d Binary files /dev/null and b/images/floatingtext-position.png differ diff --git a/images/floatingtext-rainbow.png b/images/floatingtext-rainbow.png new file mode 100644 index 0000000..162857a Binary files /dev/null and b/images/floatingtext-rainbow.png differ diff --git a/images/floatingtext-typing.gif b/images/floatingtext-typing.gif new file mode 100644 index 0000000..d860162 Binary files /dev/null and b/images/floatingtext-typing.gif differ diff --git a/images/hallofmirror-bluehighlight.gif b/images/hallofmirror-bluehighlight.gif new file mode 100644 index 0000000..e21db5c Binary files /dev/null and b/images/hallofmirror-bluehighlight.gif differ diff --git a/images/hallofmirror-danmaku.gif b/images/hallofmirror-danmaku.gif new file mode 100644 index 0000000..558eca9 Binary files /dev/null and b/images/hallofmirror-danmaku.gif differ diff --git a/images/hallofmirror-explode.gif b/images/hallofmirror-explode.gif new file mode 100644 index 0000000..99214e8 Binary files /dev/null and b/images/hallofmirror-explode.gif differ diff --git a/images/hallofmirror-flash.gif b/images/hallofmirror-flash.gif new file mode 100644 index 0000000..2fe33f4 Binary files /dev/null and b/images/hallofmirror-flash.gif differ diff --git a/images/hallofmirror-glich.gif b/images/hallofmirror-glich.gif new file mode 100644 index 0000000..93ae8e7 Binary files /dev/null and b/images/hallofmirror-glich.gif differ diff --git a/images/hallofmirror-gun.gif b/images/hallofmirror-gun.gif new file mode 100644 index 0000000..1a74158 Binary files /dev/null and b/images/hallofmirror-gun.gif differ diff --git a/images/hallofmirror-hmandvhs.gif b/images/hallofmirror-hmandvhs.gif new file mode 100644 index 0000000..60a1529 Binary files /dev/null and b/images/hallofmirror-hmandvhs.gif differ diff --git a/images/hallofmirror-homandfloatingthings.gif b/images/hallofmirror-homandfloatingthings.gif new file mode 100644 index 0000000..af1f184 Binary files /dev/null and b/images/hallofmirror-homandfloatingthings.gif differ diff --git a/images/hallofmirror-homandnoise.gif b/images/hallofmirror-homandnoise.gif new file mode 100644 index 0000000..6ba3fa9 Binary files /dev/null and b/images/hallofmirror-homandnoise.gif differ diff --git a/images/hallofmirror-homandpaint.gif b/images/hallofmirror-homandpaint.gif new file mode 100644 index 0000000..b959c95 Binary files /dev/null and b/images/hallofmirror-homandpaint.gif differ diff --git a/images/hallofmirror-homandrain.gif b/images/hallofmirror-homandrain.gif new file mode 100644 index 0000000..8ba9b81 Binary files /dev/null and b/images/hallofmirror-homandrain.gif differ diff --git a/images/hallofmirror-homandrainflowersquare.gif b/images/hallofmirror-homandrainflowersquare.gif new file mode 100644 index 0000000..d3eab02 Binary files /dev/null and b/images/hallofmirror-homandrainflowersquare.gif differ diff --git a/images/hallofmirror-homandsnowstorm.gif b/images/hallofmirror-homandsnowstorm.gif new file mode 100644 index 0000000..e16887c Binary files /dev/null and b/images/hallofmirror-homandsnowstorm.gif differ diff --git a/images/hallofmirror-homvert.gif b/images/hallofmirror-homvert.gif new file mode 100644 index 0000000..8422851 Binary files /dev/null and b/images/hallofmirror-homvert.gif differ diff --git a/images/hallofmirror-kaleidoscope.gif b/images/hallofmirror-kaleidoscope.gif new file mode 100644 index 0000000..23dc296 Binary files /dev/null and b/images/hallofmirror-kaleidoscope.gif differ diff --git a/images/hallofmirror-repeattttttttttt.gif b/images/hallofmirror-repeattttttttttt.gif new file mode 100644 index 0000000..c2d3efc Binary files /dev/null and b/images/hallofmirror-repeattttttttttt.gif differ diff --git a/images/hallofmirror-runningcole.gif b/images/hallofmirror-runningcole.gif new file mode 100644 index 0000000..d639ca2 Binary files /dev/null and b/images/hallofmirror-runningcole.gif differ diff --git a/images/hallofmirror-rush.png b/images/hallofmirror-rush.png new file mode 100644 index 0000000..d6e1b18 Binary files /dev/null and b/images/hallofmirror-rush.png differ diff --git a/images/hallofmirror-screenblock.gif b/images/hallofmirror-screenblock.gif new file mode 100644 index 0000000..0679969 Binary files /dev/null and b/images/hallofmirror-screenblock.gif differ diff --git a/images/hallofmirror-screenblock2.gif b/images/hallofmirror-screenblock2.gif new file mode 100644 index 0000000..9278b8a Binary files /dev/null and b/images/hallofmirror-screenblock2.gif differ diff --git a/images/hallofmirror-shockwave.gif b/images/hallofmirror-shockwave.gif new file mode 100644 index 0000000..9ce1f55 Binary files /dev/null and b/images/hallofmirror-shockwave.gif differ diff --git a/images/hallofmirror-square.gif b/images/hallofmirror-square.gif new file mode 100644 index 0000000..536f2da Binary files /dev/null and b/images/hallofmirror-square.gif differ diff --git a/images/hallofmirror-trail.gif b/images/hallofmirror-trail.gif new file mode 100644 index 0000000..a151fbc Binary files /dev/null and b/images/hallofmirror-trail.gif differ diff --git a/images/hallofmirror-trailblock.gif b/images/hallofmirror-trailblock.gif new file mode 100644 index 0000000..cf2a66a Binary files /dev/null and b/images/hallofmirror-trailblock.gif differ diff --git a/images/hallofmirror-trailinroom.gif b/images/hallofmirror-trailinroom.gif new file mode 100644 index 0000000..551e35c Binary files /dev/null and b/images/hallofmirror-trailinroom.gif differ diff --git a/images/hallofmirror-trailrepeat.gif b/images/hallofmirror-trailrepeat.gif new file mode 100644 index 0000000..f6d7be8 Binary files /dev/null and b/images/hallofmirror-trailrepeat.gif differ diff --git a/images/hallofmirror-wave.gif b/images/hallofmirror-wave.gif new file mode 100644 index 0000000..92bd683 Binary files /dev/null and b/images/hallofmirror-wave.gif differ diff --git a/images/hallofmirror-waverepeat.gif b/images/hallofmirror-waverepeat.gif new file mode 100644 index 0000000..4d37ca1 Binary files /dev/null and b/images/hallofmirror-waverepeat.gif differ diff --git a/images/hallofmirror-wavetrail.gif b/images/hallofmirror-wavetrail.gif new file mode 100644 index 0000000..fe87ac3 Binary files /dev/null and b/images/hallofmirror-wavetrail.gif differ diff --git a/images/hallofmirrorhomandhighlight.gif b/images/hallofmirrorhomandhighlight.gif new file mode 100644 index 0000000..0c0e9f8 Binary files /dev/null and b/images/hallofmirrorhomandhighlight.gif differ diff --git a/images/hand-align.gif b/images/hand-align.gif new file mode 100644 index 0000000..3039450 Binary files /dev/null and b/images/hand-align.gif differ diff --git a/images/hand-settings.png b/images/hand-settings.png new file mode 100644 index 0000000..1351e57 Binary files /dev/null and b/images/hand-settings.png differ diff --git a/images/hand-tint.png b/images/hand-tint.png new file mode 100644 index 0000000..501220a Binary files /dev/null and b/images/hand-tint.png differ diff --git a/images/holdbeat-lenght.png b/images/holdbeat-lenght.png new file mode 100644 index 0000000..a2130db Binary files /dev/null and b/images/holdbeat-lenght.png differ diff --git a/images/importandexport-bpmoffset.png b/images/importandexport-bpmoffset.png new file mode 100644 index 0000000..0c5c9d8 Binary files /dev/null and b/images/importandexport-bpmoffset.png differ diff --git a/images/importandexport-colorpalette.png b/images/importandexport-colorpalette.png new file mode 100644 index 0000000..a229be4 Binary files /dev/null and b/images/importandexport-colorpalette.png differ diff --git a/images/importandexport-colorpicker.png b/images/importandexport-colorpicker.png new file mode 100644 index 0000000..2c258ac Binary files /dev/null and b/images/importandexport-colorpicker.png differ diff --git a/images/importandexport-level.png b/images/importandexport-level.png new file mode 100644 index 0000000..337b5a2 Binary files /dev/null and b/images/importandexport-level.png differ diff --git a/images/importandexport-levelrankdescription.png b/images/importandexport-levelrankdescription.png new file mode 100644 index 0000000..a52f6fa Binary files /dev/null and b/images/importandexport-levelrankdescription.png differ diff --git a/images/importandexport-openfile.png b/images/importandexport-openfile.png new file mode 100644 index 0000000..d480173 Binary files /dev/null and b/images/importandexport-openfile.png differ diff --git a/images/importandexport-playsongoptions.png b/images/importandexport-playsongoptions.png new file mode 100644 index 0000000..74cfcfe Binary files /dev/null and b/images/importandexport-playsongoptions.png differ diff --git a/images/importandexport-selectplaysong.png b/images/importandexport-selectplaysong.png new file mode 100644 index 0000000..26fc787 Binary files /dev/null and b/images/importandexport-selectplaysong.png differ diff --git a/images/importandexport-setcolor.png b/images/importandexport-setcolor.png new file mode 100644 index 0000000..5cbf3c5 Binary files /dev/null and b/images/importandexport-setcolor.png differ diff --git a/images/importandexport-timelinescale.png b/images/importandexport-timelinescale.png new file mode 100644 index 0000000..92eaea7 Binary files /dev/null and b/images/importandexport-timelinescale.png differ diff --git a/images/importandexport-usecolorpallete.png b/images/importandexport-usecolorpallete.png new file mode 100644 index 0000000..487b498 Binary files /dev/null and b/images/importandexport-usecolorpallete.png differ diff --git a/images/intro-qqgroup.png b/images/intro-qqgroup.png new file mode 100644 index 0000000..8ede3ed Binary files /dev/null and b/images/intro-qqgroup.png differ diff --git a/images/intro_back.ase b/images/intro_back.ase new file mode 100644 index 0000000..aa6565c Binary files /dev/null and b/images/intro_back.ase differ diff --git a/images/intro_back.png b/images/intro_back.png new file mode 100644 index 0000000..f64466f Binary files /dev/null and b/images/intro_back.png differ diff --git a/images/intro_border.png b/images/intro_border.png new file mode 100644 index 0000000..61f153f Binary files /dev/null and b/images/intro_border.png differ diff --git a/images/moreclassicbeats-8beat.png b/images/moreclassicbeats-8beat.png new file mode 100644 index 0000000..c5c1f58 Binary files /dev/null and b/images/moreclassicbeats-8beat.png differ diff --git a/images/moreclassicbeats-endpulse.png b/images/moreclassicbeats-endpulse.png new file mode 100644 index 0000000..f5e1808 Binary files /dev/null and b/images/moreclassicbeats-endpulse.png differ diff --git a/images/moreclassicbeats-syn.png b/images/moreclassicbeats-syn.png new file mode 100644 index 0000000..1e9e3e3 Binary files /dev/null and b/images/moreclassicbeats-syn.png differ diff --git a/images/moreoneshotbeats-amountofsubdivision.png b/images/moreoneshotbeats-amountofsubdivision.png new file mode 100644 index 0000000..7a6fc8d Binary files /dev/null and b/images/moreoneshotbeats-amountofsubdivision.png differ diff --git a/images/moreoneshotbeats-blastbeat.png b/images/moreoneshotbeats-blastbeat.png new file mode 100644 index 0000000..f0988a7 Binary files /dev/null and b/images/moreoneshotbeats-blastbeat.png differ diff --git a/images/moreoneshotbeats-burnshot.png b/images/moreoneshotbeats-burnshot.png new file mode 100644 index 0000000..0cc9560 Binary files /dev/null and b/images/moreoneshotbeats-burnshot.png differ diff --git a/images/moreoneshotbeats-farmer.gif b/images/moreoneshotbeats-farmer.gif new file mode 100644 index 0000000..43e37c1 Binary files /dev/null and b/images/moreoneshotbeats-farmer.gif differ diff --git a/images/moreoneshotbeats-freezeshot.png b/images/moreoneshotbeats-freezeshot.png new file mode 100644 index 0000000..62d62a3 Binary files /dev/null and b/images/moreoneshotbeats-freezeshot.png differ diff --git a/images/moreoneshotbeats-setnursesay.png b/images/moreoneshotbeats-setnursesay.png new file mode 100644 index 0000000..a728e68 Binary files /dev/null and b/images/moreoneshotbeats-setnursesay.png differ diff --git a/images/moreoneshotbeats-subdivision.png b/images/moreoneshotbeats-subdivision.png new file mode 100644 index 0000000..a314a19 Binary files /dev/null and b/images/moreoneshotbeats-subdivision.png differ diff --git a/images/moverow-move.gif b/images/moverow-move.gif new file mode 100644 index 0000000..c30dc2a Binary files /dev/null and b/images/moverow-move.gif differ diff --git a/images/moverow-wyym.png b/images/moverow-wyym.png new file mode 100644 index 0000000..bb35f8c Binary files /dev/null and b/images/moverow-wyym.png differ diff --git a/images/moverow-wyymrow.gif b/images/moverow-wyymrow.gif new file mode 100644 index 0000000..85837be Binary files /dev/null and b/images/moverow-wyymrow.gif differ diff --git a/images/moverow-wyymrowmove.gif b/images/moverow-wyymrowmove.gif new file mode 100644 index 0000000..773fd2d Binary files /dev/null and b/images/moverow-wyymrowmove.gif differ diff --git a/images/oneshotbeat-heart.png b/images/oneshotbeat-heart.png new file mode 100644 index 0000000..64b6620 Binary files /dev/null and b/images/oneshotbeat-heart.png differ diff --git a/images/oneshotbeat-nicolewave.gif b/images/oneshotbeat-nicolewave.gif new file mode 100644 index 0000000..a2aeac2 Binary files /dev/null and b/images/oneshotbeat-nicolewave.gif differ diff --git a/images/oneshotbeat-oneshot.jpg b/images/oneshotbeat-oneshot.jpg new file mode 100644 index 0000000..5d395b2 Binary files /dev/null and b/images/oneshotbeat-oneshot.jpg differ diff --git a/images/oneshotbeat-oneshotsettings.png b/images/oneshotbeat-oneshotsettings.png new file mode 100644 index 0000000..7f6ae70 Binary files /dev/null and b/images/oneshotbeat-oneshotsettings.png differ diff --git a/images/oneshotbeat-oneshotwave.png b/images/oneshotbeat-oneshotwave.png new file mode 100644 index 0000000..3ef5d2c Binary files /dev/null and b/images/oneshotbeat-oneshotwave.png differ diff --git a/images/oneshotbeat-whatshouldnursesay.png b/images/oneshotbeat-whatshouldnursesay.png new file mode 100644 index 0000000..a1c8321 Binary files /dev/null and b/images/oneshotbeat-whatshouldnursesay.png differ diff --git a/images/otto-dark.gif b/images/otto-dark.gif new file mode 100644 index 0000000..1c56b87 Binary files /dev/null and b/images/otto-dark.gif differ diff --git a/images/otto-light.gif b/images/otto-light.gif new file mode 100644 index 0000000..9436746 Binary files /dev/null and b/images/otto-light.gif differ diff --git a/images/otto-puzzled-original.png b/images/otto-puzzled-original.png new file mode 100644 index 0000000..6ca4098 Binary files /dev/null and b/images/otto-puzzled-original.png differ diff --git a/images/otto-puzzled.png b/images/otto-puzzled.png new file mode 100644 index 0000000..9779b41 Binary files /dev/null and b/images/otto-puzzled.png differ diff --git a/images/otto-rd.gif b/images/otto-rd.gif new file mode 100644 index 0000000..257bd2b Binary files /dev/null and b/images/otto-rd.gif differ diff --git a/images/otto-rd2-1.png b/images/otto-rd2-1.png new file mode 100644 index 0000000..104179a Binary files /dev/null and b/images/otto-rd2-1.png differ diff --git a/images/otto-rd2-xmas-compressed.png b/images/otto-rd2-xmas-compressed.png new file mode 100644 index 0000000..6dc970d Binary files /dev/null and b/images/otto-rd2-xmas-compressed.png differ diff --git a/images/otto-rd2-xmas.png b/images/otto-rd2-xmas.png new file mode 100644 index 0000000..066cba9 Binary files /dev/null and b/images/otto-rd2-xmas.png differ diff --git a/images/otto-rd2.png b/images/otto-rd2.png new file mode 100644 index 0000000..e0775ec Binary files /dev/null and b/images/otto-rd2.png differ diff --git a/images/otto-wyym.png b/images/otto-wyym.png new file mode 100644 index 0000000..b54cc70 Binary files /dev/null and b/images/otto-wyym.png differ diff --git a/images/room-animation.gif b/images/room-animation.gif new file mode 100644 index 0000000..44c44d6 Binary files /dev/null and b/images/room-animation.gif differ diff --git a/images/room-eventselectroom.png b/images/room-eventselectroom.png new file mode 100644 index 0000000..94e9a77 Binary files /dev/null and b/images/room-eventselectroom.png differ diff --git a/images/room-eventsettings.png b/images/room-eventsettings.png new file mode 100644 index 0000000..7db6b8d Binary files /dev/null and b/images/room-eventsettings.png differ diff --git a/images/room-layer.png b/images/room-layer.png new file mode 100644 index 0000000..3d7f640 Binary files /dev/null and b/images/room-layer.png differ diff --git a/images/room-theme.png b/images/room-theme.png new file mode 100644 index 0000000..03ef507 Binary files /dev/null and b/images/room-theme.png differ diff --git a/images/room-visible.png b/images/room-visible.png new file mode 100644 index 0000000..1a51c2a Binary files /dev/null and b/images/room-visible.png differ diff --git a/images/roomfx-hexagon.png b/images/roomfx-hexagon.png new file mode 100644 index 0000000..acd583f Binary files /dev/null and b/images/roomfx-hexagon.png differ diff --git a/images/roomfx-mickey1.png b/images/roomfx-mickey1.png new file mode 100644 index 0000000..ec692e8 Binary files /dev/null and b/images/roomfx-mickey1.png differ diff --git a/images/roomfx-mickey2.png b/images/roomfx-mickey2.png new file mode 100644 index 0000000..9164ab1 Binary files /dev/null and b/images/roomfx-mickey2.png differ diff --git a/images/roomfx-perspective.png b/images/roomfx-perspective.png new file mode 100644 index 0000000..a4c648e Binary files /dev/null and b/images/roomfx-perspective.png differ diff --git a/images/roomfx-zoom.gif b/images/roomfx-zoom.gif new file mode 100644 index 0000000..0dac433 Binary files /dev/null and b/images/roomfx-zoom.gif differ diff --git a/images/rowfx-bassdrop.gif b/images/rowfx-bassdrop.gif new file mode 100644 index 0000000..105465f Binary files /dev/null and b/images/rowfx-bassdrop.gif differ diff --git a/images/rowfx-count.gif b/images/rowfx-count.gif new file mode 100644 index 0000000..7ffab13 Binary files /dev/null and b/images/rowfx-count.gif differ diff --git a/images/rowfx-heart.gif b/images/rowfx-heart.gif new file mode 100644 index 0000000..46dfdc0 Binary files /dev/null and b/images/rowfx-heart.gif differ diff --git a/images/rowfx-heartcrop.gif b/images/rowfx-heartcrop.gif new file mode 100644 index 0000000..3bc719b Binary files /dev/null and b/images/rowfx-heartcrop.gif differ diff --git a/images/rowfx-heighlight.gif b/images/rowfx-heighlight.gif new file mode 100644 index 0000000..51d5cf1 Binary files /dev/null and b/images/rowfx-heighlight.gif differ diff --git a/images/rowfx-kaleidoscope.gif b/images/rowfx-kaleidoscope.gif new file mode 100644 index 0000000..5aee585 Binary files /dev/null and b/images/rowfx-kaleidoscope.gif differ diff --git a/images/rowfx-shake.gif b/images/rowfx-shake.gif new file mode 100644 index 0000000..f89431b Binary files /dev/null and b/images/rowfx-shake.gif differ diff --git a/images/rowfx-tintrow.png b/images/rowfx-tintrow.png new file mode 100644 index 0000000..51723aa Binary files /dev/null and b/images/rowfx-tintrow.png differ diff --git a/images/settheme-4rows.png b/images/settheme-4rows.png new file mode 100644 index 0000000..eb6f46b Binary files /dev/null and b/images/settheme-4rows.png differ diff --git a/images/settheme-hideheart.png b/images/settheme-hideheart.png new file mode 100644 index 0000000..4f9b665 Binary files /dev/null and b/images/settheme-hideheart.png differ diff --git a/images/settheme-rowposition.png b/images/settheme-rowposition.png new file mode 100644 index 0000000..80fefb1 Binary files /dev/null and b/images/settheme-rowposition.png differ diff --git a/images/settheme-rowshowfaster.gif b/images/settheme-rowshowfaster.gif new file mode 100644 index 0000000..7581743 Binary files /dev/null and b/images/settheme-rowshowfaster.gif differ diff --git a/images/spritesheet-characters.png b/images/spritesheet-characters.png new file mode 100644 index 0000000..306449c Binary files /dev/null and b/images/spritesheet-characters.png differ diff --git a/images/spritesheet-expression.png b/images/spritesheet-expression.png new file mode 100644 index 0000000..df650bd Binary files /dev/null and b/images/spritesheet-expression.png differ diff --git a/images/spritesheet-farmer.png b/images/spritesheet-farmer.png new file mode 100644 index 0000000..299029e Binary files /dev/null and b/images/spritesheet-farmer.png differ diff --git a/images/spritesheet-openfile.png b/images/spritesheet-openfile.png new file mode 100644 index 0000000..6526741 Binary files /dev/null and b/images/spritesheet-openfile.png differ diff --git a/images/spritesheet-showextension.png b/images/spritesheet-showextension.png new file mode 100644 index 0000000..a53008f Binary files /dev/null and b/images/spritesheet-showextension.png differ diff --git a/images/spritesheet-step01.png b/images/spritesheet-step01.png new file mode 100644 index 0000000..a8fc382 Binary files /dev/null and b/images/spritesheet-step01.png differ diff --git a/images/spritesheet-step02.png b/images/spritesheet-step02.png new file mode 100644 index 0000000..9e5f3fa Binary files /dev/null and b/images/spritesheet-step02.png differ diff --git a/images/spritesheet-step03.png b/images/spritesheet-step03.png new file mode 100644 index 0000000..b066eb2 Binary files /dev/null and b/images/spritesheet-step03.png differ diff --git a/images/spritesheet-step04.png b/images/spritesheet-step04.png new file mode 100644 index 0000000..4fbc531 Binary files /dev/null and b/images/spritesheet-step04.png differ diff --git a/images/spritesheet-step05.png b/images/spritesheet-step05.png new file mode 100644 index 0000000..9312df2 Binary files /dev/null and b/images/spritesheet-step05.png differ diff --git a/images/spritesheet-step06.png b/images/spritesheet-step06.png new file mode 100644 index 0000000..c96c5d3 Binary files /dev/null and b/images/spritesheet-step06.png differ diff --git a/images/spritesheet-step07.png b/images/spritesheet-step07.png new file mode 100644 index 0000000..66a9070 Binary files /dev/null and b/images/spritesheet-step07.png differ diff --git a/images/spritesheet-thisisspritesheet.gif b/images/spritesheet-thisisspritesheet.gif new file mode 100644 index 0000000..f74d7f8 Binary files /dev/null and b/images/spritesheet-thisisspritesheet.gif differ diff --git a/images/tag-actionfilter.png b/images/tag-actionfilter.png new file mode 100644 index 0000000..42382f6 Binary files /dev/null and b/images/tag-actionfilter.png differ diff --git a/images/tag-comment.png b/images/tag-comment.png new file mode 100644 index 0000000..a2a5865 Binary files /dev/null and b/images/tag-comment.png differ diff --git a/images/tag-runtag.png b/images/tag-runtag.png new file mode 100644 index 0000000..28fa5a4 Binary files /dev/null and b/images/tag-runtag.png differ diff --git a/images/tag-settag.gif b/images/tag-settag.gif new file mode 100644 index 0000000..234ff67 Binary files /dev/null and b/images/tag-settag.gif differ diff --git a/images/tag-tagusageexample.gif b/images/tag-tagusageexample.gif new file mode 100644 index 0000000..c31ed91 Binary files /dev/null and b/images/tag-tagusageexample.gif differ diff --git a/images/vfx-electronicgirlglich.gif b/images/vfx-electronicgirlglich.gif new file mode 100644 index 0000000..fbad775 Binary files /dev/null and b/images/vfx-electronicgirlglich.gif differ diff --git a/images/vfx-electronicgirlrotate.gif b/images/vfx-electronicgirlrotate.gif new file mode 100644 index 0000000..7bfcbbf Binary files /dev/null and b/images/vfx-electronicgirlrotate.gif differ diff --git a/images/vfx-settings.jpg b/images/vfx-settings.jpg new file mode 100644 index 0000000..eecb8bc Binary files /dev/null and b/images/vfx-settings.jpg differ diff --git a/images/vfx-witch.gif b/images/vfx-witch.gif new file mode 100644 index 0000000..133f198 Binary files /dev/null and b/images/vfx-witch.gif differ diff --git a/images/windowmove-window.png b/images/windowmove-window.png new file mode 100644 index 0000000..1bfd0a3 Binary files /dev/null and b/images/windowmove-window.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..21e0e5d --- /dev/null +++ b/index.html @@ -0,0 +1,91 @@ + + + + + + 节奏医生编辑器教程 + + + + + + + + + + + + + + +
加载中...
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/indexicon/accessibledesign.png b/indexicon/accessibledesign.png new file mode 100644 index 0000000..60a26da Binary files /dev/null and b/indexicon/accessibledesign.png differ diff --git a/indexicon/assets.png b/indexicon/assets.png new file mode 100644 index 0000000..bd0d60a Binary files /dev/null and b/indexicon/assets.png differ diff --git a/indexicon/audiodesign.png b/indexicon/audiodesign.png new file mode 100644 index 0000000..faed185 Binary files /dev/null and b/indexicon/audiodesign.png differ diff --git a/indexicon/audios.png b/indexicon/audios.png new file mode 100644 index 0000000..5f4c70e Binary files /dev/null and b/indexicon/audios.png differ diff --git a/indexicon/beatpatterndesign.png b/indexicon/beatpatterndesign.png new file mode 100644 index 0000000..5ea3086 Binary files /dev/null and b/indexicon/beatpatterndesign.png differ diff --git a/indexicon/camera.png b/indexicon/camera.png new file mode 100644 index 0000000..9eddbba Binary files /dev/null and b/indexicon/camera.png differ diff --git a/indexicon/camerafx.png b/indexicon/camerafx.png new file mode 100644 index 0000000..a380fb7 Binary files /dev/null and b/indexicon/camerafx.png differ diff --git a/indexicon/camerafx2.png b/indexicon/camerafx2.png new file mode 100644 index 0000000..3f97358 Binary files /dev/null and b/indexicon/camerafx2.png differ diff --git a/indexicon/captions.png b/indexicon/captions.png new file mode 100644 index 0000000..1e705fa Binary files /dev/null and b/indexicon/captions.png differ diff --git a/indexicon/changegameversion.png b/indexicon/changegameversion.png new file mode 100644 index 0000000..b890595 Binary files /dev/null and b/indexicon/changegameversion.png differ diff --git a/indexicon/changelog.png b/indexicon/changelog.png new file mode 100644 index 0000000..dce1632 Binary files /dev/null and b/indexicon/changelog.png differ diff --git a/indexicon/character.png b/indexicon/character.png new file mode 100644 index 0000000..d1a4c11 Binary files /dev/null and b/indexicon/character.png differ diff --git a/indexicon/chartdesign.png b/indexicon/chartdesign.png new file mode 100644 index 0000000..8982807 Binary files /dev/null and b/indexicon/chartdesign.png differ diff --git a/indexicon/classicbeat.png b/indexicon/classicbeat.png new file mode 100644 index 0000000..412f31c Binary files /dev/null and b/indexicon/classicbeat.png differ diff --git a/indexicon/coding.png b/indexicon/coding.png new file mode 100644 index 0000000..03cc1d8 Binary files /dev/null and b/indexicon/coding.png differ diff --git a/indexicon/comparison.png b/indexicon/comparison.png new file mode 100644 index 0000000..d2a8d71 Binary files /dev/null and b/indexicon/comparison.png differ diff --git a/indexicon/condition.png b/indexicon/condition.png new file mode 100644 index 0000000..89a4a84 Binary files /dev/null and b/indexicon/condition.png differ diff --git a/indexicon/createbuiltincharacter.png b/indexicon/createbuiltincharacter.png new file mode 100644 index 0000000..8cfd654 Binary files /dev/null and b/indexicon/createbuiltincharacter.png differ diff --git a/indexicon/credits.png b/indexicon/credits.png new file mode 100644 index 0000000..14f5e0a Binary files /dev/null and b/indexicon/credits.png differ diff --git a/indexicon/custommethod.png b/indexicon/custommethod.png new file mode 100644 index 0000000..9bfedfd Binary files /dev/null and b/indexicon/custommethod.png differ diff --git a/indexicon/custommethods.png b/indexicon/custommethods.png new file mode 100644 index 0000000..371a1de Binary files /dev/null and b/indexicon/custommethods.png differ diff --git a/indexicon/decoration.png b/indexicon/decoration.png new file mode 100644 index 0000000..d48a94d Binary files /dev/null and b/indexicon/decoration.png differ diff --git a/indexicon/editorinterface.png b/indexicon/editorinterface.png new file mode 100644 index 0000000..f0bd48e Binary files /dev/null and b/indexicon/editorinterface.png differ diff --git a/indexicon/epilogue.png b/indexicon/epilogue.png new file mode 100644 index 0000000..c10df1e Binary files /dev/null and b/indexicon/epilogue.png differ diff --git a/indexicon/events.png b/indexicon/events.png new file mode 100644 index 0000000..e6488d0 Binary files /dev/null and b/indexicon/events.png differ diff --git a/indexicon/floatingtext.png b/indexicon/floatingtext.png new file mode 100644 index 0000000..012fb22 Binary files /dev/null and b/indexicon/floatingtext.png differ diff --git a/indexicon/gimmicks.png b/indexicon/gimmicks.png new file mode 100644 index 0000000..6f8ae18 Binary files /dev/null and b/indexicon/gimmicks.png differ diff --git a/indexicon/hallofmirror.png b/indexicon/hallofmirror.png new file mode 100644 index 0000000..c5554e3 Binary files /dev/null and b/indexicon/hallofmirror.png differ diff --git a/indexicon/hand.png b/indexicon/hand.png new file mode 100644 index 0000000..fb0c414 Binary files /dev/null and b/indexicon/hand.png differ diff --git a/indexicon/holdbeat.png b/indexicon/holdbeat.png new file mode 100644 index 0000000..c17dfd2 Binary files /dev/null and b/indexicon/holdbeat.png differ diff --git a/indexicon/importandexport.png b/indexicon/importandexport.png new file mode 100644 index 0000000..b2f92bf Binary files /dev/null and b/indexicon/importandexport.png differ diff --git a/indexicon/intro.png b/indexicon/intro.png new file mode 100644 index 0000000..3625b32 Binary files /dev/null and b/indexicon/intro.png differ diff --git a/indexicon/moreclassicbeats.png b/indexicon/moreclassicbeats.png new file mode 100644 index 0000000..a529ce8 Binary files /dev/null and b/indexicon/moreclassicbeats.png differ diff --git a/indexicon/moreoneshotbeats.png b/indexicon/moreoneshotbeats.png new file mode 100644 index 0000000..1d655d7 Binary files /dev/null and b/indexicon/moreoneshotbeats.png differ diff --git a/indexicon/moverow.png b/indexicon/moverow.png new file mode 100644 index 0000000..c02e142 Binary files /dev/null and b/indexicon/moverow.png differ diff --git a/indexicon/oneshotbeat.png b/indexicon/oneshotbeat.png new file mode 100644 index 0000000..e99f674 Binary files /dev/null and b/indexicon/oneshotbeat.png differ diff --git a/indexicon/quickref.png b/indexicon/quickref.png new file mode 100644 index 0000000..c3b72aa Binary files /dev/null and b/indexicon/quickref.png differ diff --git a/indexicon/relativeassets.png b/indexicon/relativeassets.png new file mode 100644 index 0000000..860784d Binary files /dev/null and b/indexicon/relativeassets.png differ diff --git a/indexicon/room.png b/indexicon/room.png new file mode 100644 index 0000000..5e1db69 Binary files /dev/null and b/indexicon/room.png differ diff --git a/indexicon/roomfx.png b/indexicon/roomfx.png new file mode 100644 index 0000000..bd5e4fe Binary files /dev/null and b/indexicon/roomfx.png differ diff --git a/indexicon/rowfx.png b/indexicon/rowfx.png new file mode 100644 index 0000000..5b7d95d Binary files /dev/null and b/indexicon/rowfx.png differ diff --git a/indexicon/settheme.png b/indexicon/settheme.png new file mode 100644 index 0000000..15cb526 Binary files /dev/null and b/indexicon/settheme.png differ diff --git a/indexicon/specifications.png b/indexicon/specifications.png new file mode 100644 index 0000000..d3d183f Binary files /dev/null and b/indexicon/specifications.png differ diff --git a/indexicon/syringe_dark.png b/indexicon/syringe_dark.png new file mode 100644 index 0000000..ee1a89a Binary files /dev/null and b/indexicon/syringe_dark.png differ diff --git a/indexicon/syringe_light.png b/indexicon/syringe_light.png new file mode 100644 index 0000000..e9d1afa Binary files /dev/null and b/indexicon/syringe_light.png differ diff --git a/indexicon/tag.png b/indexicon/tag.png new file mode 100644 index 0000000..0b34c4c Binary files /dev/null and b/indexicon/tag.png differ diff --git a/indexicon/variable.png b/indexicon/variable.png new file mode 100644 index 0000000..39e43e2 Binary files /dev/null and b/indexicon/variable.png differ diff --git a/indexicon/vfx.png b/indexicon/vfx.png new file mode 100644 index 0000000..d3fb5ec Binary files /dev/null and b/indexicon/vfx.png differ diff --git a/indexicon/vfxs.png b/indexicon/vfxs.png new file mode 100644 index 0000000..16808f2 Binary files /dev/null and b/indexicon/vfxs.png differ diff --git a/indexicon/windowmove.png b/indexicon/windowmove.png new file mode 100644 index 0000000..c4fa174 Binary files /dev/null and b/indexicon/windowmove.png differ diff --git a/pages/accessibledesign.md b/pages/accessibledesign.md new file mode 100644 index 0000000..a66c254 --- /dev/null +++ b/pages/accessibledesign.md @@ -0,0 +1,46 @@ +# 无障碍设计 +本节我还想再次强调一下《节奏医生》这款游戏的特殊性。在官方的UI设计以及剧情模式里面,是完整地设计了无障碍模式的。也就是说,里面的每一关理论上你都可以闭着眼睛打出S+,并且是只靠声音提示,不靠记忆节奏(背板)。如果你不相信的话,可以看看这个[系列视频](https://www.bilibili.com/video/BV1iK4y1d7cY)。 + +另外,本节部分内容不仅用于无障碍,也同样适用于视觉干扰过强以至于影响读谱的情况。 + +至于说要如何做到这一点,详细铺开来说就比较复杂了,并且由于网页上没有办法直接发音频,很多内容并不容易靠文字说明。对于下面的长篇大论请给与理解。 + +### 1、轨道音效切不可重复 + +多轨道关卡中,同时响起节奏的轨道不可使用相同的音效,否则只听声音的话节奏会全部混在一起无法辨别。 + +### 2、调整轨道音效的声像 + +多个轨道的节奏比较相近的情况下,为了把节奏音效区分得更明显,可以让一个声音偏左声道,另一个偏右声道。 + +### 3、官方已有的节奏尽量仿照官方 + +例如`-x-x-x ---♥`使用玄凤叫声,`-xx-xx ---♥`使用猫头鹰叫声。这些已经存在的节奏型音效是能让玩家很快回忆起该怎么打的。 + +但注意,如果这样的提示音非常破坏音乐的氛围,要考虑调整音效的声音大小或是考虑其他的提示形式。 + +### 4、节奏型不要随意突变 + +一根轨道原本是`------ ---♥`,突然变成`-x-x-x ---♥`且节拍速度还有变化,在没有额外的音效或者护士提示的情况下,只靠声音无法区分变化后的轨道是响了1,3,5,7拍还是1,2,3,4拍。 + +变化时如果加入护士数拍(例如第3点中的情况),读谱就会轻松许多。或者用自定义音效提示一下变速后的节奏速度,例如加入“**嘀嘟嘀嘟**”的音效。 + +### 5、即使是电脑演示也要有声音提示 + +不能觉得反正是电脑在玩,自己瞎按空格键也不会判错,就随意设置了。当轨道切换到电脑时,可以考虑加入一个“**凹兔启动**”音效,当电脑轨道切换到玩家时,可以考虑加入一个“**凹兔停机**”音效。 + +![我就是凹兔](../images/accessibledesign-otto.gif) + +并且在电脑演示时最好只设置一根轨道,否则听声音无法辨别是哪个轨道的节奏正在被演示。 + +### 6、让玩家按出空拍也是问题 + +玩家在没有节奏的位置误以为有节奏而按下空格,结果听到“啵”的一声。这一下音效的响起对后续的节奏声音判断也是会产生干扰的,所以在设计节奏的时候应尽量避免令人误解/误导的情况。 那么,为何空拍音效会对节奏的判断产生干扰? + +节奏医生在第一次打开剧情模式时通常都会让你校准你的视觉和输入偏移,这是因为节奏医生所使用的游戏引擎在不同的设备上会产生不同的延迟,尤其是声音延迟极为明显,严重点的可以多达200毫秒以上。通俗点讲,你会感觉你按下按键后需要等一小会儿才会听到你的按键音效,而作为一个音乐游戏,如果出现这样的偏移现象,会非常影响节奏的判断,不仅仅是听觉受到干扰,如果不解决这种情况的话,就会出现你在正确的节拍点上按确被系统判定为失误,那就有点不太妥当了,所以节奏医生通过校准偏移的方式,适当的通过玩家的偏移量提前或延后判定时机。 + +但是请注意,判定时机被调节了,音效位置是不会一起被调节的,不然如果因为音效位置一起被调节所导致的无法避免的音效偏移,那就有点得不偿失了。 + +举个例子,假如你的设备输入延迟比较大,又或者你用的是蓝牙耳机,更甚至是Steam远程畅玩或是和好友远程玩双人关卡,此时你会发现,你按下空格键,会等大概一秒钟才会听到空拍音效,节奏点也会因为网络延迟延后判断,通常这时候我们会通过调整输入偏移来解决,但即使是调整了输入偏移,你在按空拍的时候还是会因为网络延迟等原因延后一秒钟才会播放空拍音效。 + +这也就是为什么说空拍音效的响起会对后续节奏判断产生影响了,偏移量小的玩家还没什么,无非就是多响一声而已,但偏移量大的玩家呢?所以制作过程中尽量不要让玩家在没有节拍的位置误认为有节拍并按了一个空拍,毕竟如果延迟比较大的话,这种误导性影响还是挺大的。 diff --git a/pages/appendix_audios.md b/pages/appendix_audios.md new file mode 100644 index 0000000..e409040 --- /dev/null +++ b/pages/appendix_audios.md @@ -0,0 +1,297 @@ +# 内置音频 + +### 护士语音 + +| 音效名 | 内容 | +| :--- | :--- | +| sndJyi - RDGS_Rea | 护士说:Rea | +| sndJyi - RDGS_Dy | 护士说:Dy | +| sndJyi - RDGS_Get | 护士说:Get | +| sndJyi - RDGS_Set | 护士说:Set | +| sndJyi - RDGS_Go | 护士说:Go | +| sndJyi - RDGS_Ready | 护士说:Ready | +| sndJyi - AndStop_And | 护士说:And | +| sndJyi - AndStop_And_ver2 | 护士说:And | +| sndJyi - AndStop_And_verLong | 护士拖长了说:And | +| sndJyi - AndStop_Stop | 护士说:Stop | +| sndJyi - AndStop_AndStop | 护士说:And-Stop | +| sndJyi - AndStop_AndStop_r2 | 护士说:And-Stop | +| sndJyi - AndStop_AndStop_r3 | 护士说:And-Stop | +| sndJyi - Ready_breathy | 护士有力地说:Ready | +| sndJyi - ChineseCount1 | 护士说:一(最后数字可以改成1~7) | +| sndJyi - ChineseCountCalm1 | 护士冷静地说:一(最后数字可以改成1~7) | +| sndJyi - ChineseCountFast1 | 护士快速地说:一(最后数字可以改成1~7) | +| sndJyi - ChineseCountTired1 | 护士疲惫地说:一(最后数字可以改成1~7) | +| sndJyi - ChineseCountVTired1 | 护士虚脱地说:一(最后数字可以改成1~7) | +| sndJyi - CountEnglish1 | 护士说:One(最后数字可以改成1~10) | +| sndJyi - JapaneseCount1 | 护士说:イチ(最后数字可以改成1~10) | +| sndJyi - RankS | 护士说:S(等级评定,最后字母可以改成A, B, C, D, F,还可以加上+-) | +| sndJyi - GoodJob | 护士说:Good Job! | +| sndJyi - Watch | 护士说:Watch | +| sndJyi - Watch_2 | 护士冷静地说:Watch | +| sndJyi - Play | 护士说:Play | +| sndJyi - Listen | 护士说:Listen | +| sndJyi - ListenSlow | 护士缓慢地说:Listen | +| sndJyi - ListenSlow_2 | 护士缓慢地说:Listen | +| sndJyi - Up | 护士说:Up | +| sndJyi - Up_2 | 护士说:Up | +| sndJyi - Up_3 | 护士说:Up | +| sndJyi - Up_4 | 护士说:Up | +| sndJyi - UpCalm | 护士冷静地说:Up | +| sndJyi - UpCalm_2 | 护士冷静地说:Up | +| sndJyi - UpFast | 护士快速地说:Up | +| sndJyi - UpFast_2 | 护士快速地说:Up | +| sndJyi - down | 护士说:down(注意这里字母d必须是小写) | +| sndJyi - Down_2 | 护士说:Down | +| sndJyi - DownFast | 护士快速地说:Down | +| sndJyi - Down_falling | 护士高调地说:Down! | +| sndJyi - Down_falling_2 | 护士高调地说:Down! | +| sndJyi - DownCalm | 护士冷静地说:Down | +| sndJyi - DownCalm_2 | 护士冷静地说:Down | +| sndJyi - AndSwitch_Switch | 护士说:Switch | +| sndJyi - AndSwitch_AndSwitch | 护士说:And Switch | +| sndJyi - AndSwitch_AndSwitch_2 | 护士说:And Switch | +| sndJyi - AndSwitch_AndSwitch_3 | 护士说:And Switch | +| sndJyi - RDDT_Double | 护士说:Double | +| sndJyi - RDDT_Double_r2 | 护士说:Double | +| sndJyi - RDDT_Dy | 护士说:Dy | +| sndJyi - RDDT_Dy_r2 | 护士说:Dy | +| sndJyi - RDDT_Go | 护士说:Go | +| sndJyi - RDDT_Go_r2 | 护士说:Go | +| sndJyi - RDDT_Go_r3 | 护士说:Go | +| sndJyi - RDDT_Rea | 护士说:Rea | +| sndJyi - RDDT_Time | 护士说:Time | +| sndJyi - RDDT_Time_r2 | 护士说:Time | + +### 伊恩语音 + +| 音效名 | 内容 | +| :--- | :--- | +| sndIan - RDGS_Rea | 伊恩说:Rea | +| sndIan - RDGS_Dy | 伊恩说:Dy | +| sndIan - RDGS_Get | 伊恩说:Get | +| sndIan - RDGS_Set | 伊恩说:Set | +| sndIan - RDGS_Go | 伊恩说:Go | +| sndIan - And | 伊恩说:And | +| sndIan - AndStop_Stop | 伊恩说:Stop | +| sndIan - ChineseFang | 伊恩说:放! | +| sndIan - ChineseShou | 伊恩说:收! | +| sndIan - ChineseCount1 | 伊恩说:一(最后数字可以改成1~7) | +| sndIan - ChineseCountCalm1 | 伊恩冷静地说:一(最后数字可以改成1~7) | +| sndIan - ChineseCountFast1 | 伊恩快速地说:一(最后数字可以改成1~7) | +| sndIan - ChineseCountSlow1 | 伊恩缓慢地说:一(最后数字可以改成1~7) | +| sndIan - CountSlower1 | 伊恩缓慢地说:一(最后数字可以改成1~7) | +| sndIan - CountEnglish1 | 伊恩说:One(最后数字可以改成1~7) | +| sndIan - GoodToGo | 伊恩说:Good to go. | +| sndIan - Great | 伊恩说:Great | +| sndIan - Great_ver2 | 伊恩说:Great | +| sndIan - Great_ver3 | 伊恩说:Great | +| sndIan - Heh | 伊恩说:Heh | +| sndIan - Hmm | 伊恩说:Hmm | +| sndIan - Huh | 伊恩说:Huh | +| sndIan - LetsDoThis | 伊恩说:Let\'s do this | +| sndIan - Listen | 伊恩说:Listen | +| sndIan - Player1 | 伊恩说:Player1 | +| sndIan - Player2 | 伊恩说:Player2 | +| sndIan - SadOkay | 伊恩叹气并说:Okay | +| sndIan - SighUgh | 伊恩叹气地说:Ugh | +| sndIan - ThatsGood | 伊恩说:That\'s good(怎么感觉有点哲学) | +| sndIan - TryAgain | 伊恩说:You want to try that once again? | +| sndIan - Uhh | 伊恩说:Uhh | +| sndIan - Up | 伊恩说:Up | +| sndIan - Watch | 伊恩说:Watch | +| sndIan - Well | 伊恩说:Well | +| sndIan - What | 伊恩说:What | +| sndIan - YourTurn | 伊恩说:One!(和英文报数的1其实是同一个) | +| sndIan - OKAS_Fast_And | 伊恩快速地说:And | +| sndIan - OKAS_Fast_Kay | 伊恩快速地说:Kay | +| sndIan - OKAS_Fast_O | 伊恩快速地说:O | +| sndIan - OKAS_Fast_Switch | 伊恩快速地说:Switch | +| sndIan - OKAS_kay | 伊恩说:kay | +| sndIan - OKAS_O | 伊恩说:O | +| sndIan - OKAS_Switch | 伊恩说:Switch | + +### 政客语音 + +| 音效名 | 内容 | +| :--- | :--- | +| sndPoliticianHurryUp0 | 政客说:Oh, come on! Make a move! Hurry up! | +| sndPoliticianHurryUp1 | 政客说:You can do it! Come on! Hurry up! | +| sndPoliticianHurryUp2 | 政客说:Any time now. Come on! Let\'s go! | +| sndPoliticianHurryUp3 | 政客说:Make a move already, would you? | +| sndPoliticianHurryUp4 | 政客说:Oh, bloody hell. Hurry up already! | + +### 在EA版本中出现的音效 + +| 音效名 | 内容 | +| :--- | :--- | +| sndKick | 底鼓 | +| sndKickEcho | 回音底鼓 | +| sndSizzle | 镲片 | +| sndShaker | 沙锤 | +| sndShakerHi | 高音沙锤 | +| sndStick | 鼓棒 | +| sndRide2 | 定音钹2 | +| sndChuck | 低音底鼓 | +| sndHammer | 音锤 | +| sndClosedHat | 闭镲 | +| sndPunch | 击打 | +| sndClapHit | 拍掌 | +| sndReverbClap | 混响拍掌 | +| sndClapHitP2 | 拍掌2 | +| sndClapHitMassivePreEcho | 前回音拍掌 | +| sndClapHitMassivePreEchoCut1 | 前回音拍掌 - 回音部分 | +| sndClapHitMassivePreEchoCut2 | 前回音拍掌 - 拍掌部分 | +| sndClapHitEcho | 回音拍掌 | +| sndClapHitMassivePreecho | 前回音拍掌 | +| sndClapHitMassivePreechoCut1 | 前回音拍掌 - 回音部分 | +| sndClapHitMassivePreechoCut2 | 前回音拍掌 - 拍掌部分 | +| sndClickLow | 护士提示聚光灯音效 - 低 | +| sndClickMid | 护士提示聚光灯音效 - 中 | +| sndClickHi | 护士提示聚光灯音效 - 高 | +| sndMistakeBig | 大失误 | +| sndScribble | 涂鸦声(游戏 Logo 出现时的音效) | +| sndMenuPop | 菜单 - 按钮弹起 | +| sndMenuSelect | 菜单 - 选择 | +| sndMenuSquelch | 菜单 - ? | +| sndSwitch | 开关声(开始关卡的音效) | +| sndWhistle1 | 口哨声第1拍 | +| sndWhistle3 | 口哨声第3拍 | +| sndWhistle5 | 口哨声第5拍 | +| sndWhistle7 | 口哨声第7拍 | +| sndApplause | 鼓掌声 | +| sndCalibrationBeep | 校准界面哔声 | +| sndMelonMorse | Melon 摩尔斯电码 | + +### 未使用的音效 + +| 音效名 | 内容 | +| :--- | :--- | +| sndTypewriter | 打字机音效 | +| sndRide1 | 定音钹1 | +| sndRide3 | 定音钹3 | +| sndTaikoRim | 太鼓鼓边 | +| sndTsuzumi | 日本鼓 | +| sndTaikoOpen | 太鼓鼓面 | +| sndDjembeSlap | 非洲鼓拍打 | +| sndUdu | 吨声 | +| sndFrog | 青蛙声 | +| sndGlockE | 钟琴 E | +| sndHammerold | 旧音锤 | +| sndCymbalSwish | | +| sndEchoClap | | +| sndEchoClapold | | +| sndClapHitPreEcho | 小前回音拍掌 | +| sndClap2 | 拍手2 | +| sndClap3 | 拍手3 | +| sndClaves | 响棒 | +| sndCoplandDrum | Copland 鼓 | +| sndBassDrum | 低音鼓 | +| bassdrum2 | 底鼓2 | +| note | 叮 | +| sndKickEcho2 | 回响底鼓2 | +| sndKickMassive | 大底鼓 | +| sndKickTest | 底鼓测试1 | +| sndKickTest2 | 底鼓测试2 | +| sndPing | 叮 | +| sndShakerEgg | 蛋形沙锤 | +| sndShakerEggHi | 高音蛋形沙锤 | +| sndSnap | 响指 | +| sndTapeSnare | 胶带军鼓? | +| sndTapeSnarePreEcho | 前回音胶带军鼓? | +| sndWoodblockLong | 木块 - 长 | +| sndWoodblockShort | 木块 - 短 | +| sndBeepHigh | 哔 - 高 | +| sndBeepLow | 哔 - 低 | +| sndDrumroll | | +| sndExplodeNew1 | | +| sndExplodeNew2 | | +| sndExplodeNew3 | | +| sndBossStageText | | +| sndChargedLaser | 蓄力激光 | +| sndCorridorScroll | | +| sndCrowdCheer | 人群欢呼声 | +| sndKnuckles | 指关节 | +| sndBassExp | 低音心爆音效 | +| sndBassExplosionR | 低音心爆音效(右声道) | +| sndBassExplosionL | 低音心爆音效(左声道) | + +### 未分类 + +| 音效名 | 内容 | +| :--- | :--- | +| sndMistakeSmall | 小失误1 | +| sndMistakeSmall2 | 小失误2 | +| sndMistakeSmall3 | 小失误3 | +| sndBossVirusDie | | +| sndBossDisappear | | +| sndExplodeNewv1_1 | 心爆音效v1 - 1 | +| sndExplodeNewv1_2 | 心爆音效v1 - 2 | +| sndExplodeNewv2_2 | 心爆音效v2 - 2 | +| sndExplodeNewv1_3 | 心爆音效v1 - 3 | +| sndExplodeNewv2_3 | 心爆音效v2 - 3 | +| sndMenuButtonPush | 菜单 - 按钮按下 | +| sndMenuButtonPush2 | 菜单 - 按钮按下2 | +| sndMenuButtonpush2 | 菜单 - 按钮按下2 | +| sndMenuPop2 | 菜单 - 按钮弹起2 | +| sndMenuSelectunedit | 菜单 - 选中(未编辑) | +| sndNoise | 噪音 | +| sndNoiseMed | 噪音 | +| sndRankAppear | | +| sndLowHealthEB | 低血量警告音 EB | +| sndLowHealthDA | 低血量警告音 DA | +| sndLowHealthB | 低血量警告音 B | +| sndLowHealthCG | 低血量警告音 CG | +| sndLowHealthCSharpA | 低血量警告音 CA# | +| sndLowHealthE | 低血量警告音 E | + +### 在EA版本中出现的音乐 + +| 音效名 | 内容 | 曲速 | +| :--- | :--- | :--- | +| sndIntro2 | 菜单界面 | 82 | +| sndTutorial | 教程音乐 | 88 | +| sndTutorialNoPrebar | 教程音乐,无开头空白 | 88 | +| sndTutorialSynth | 2-12-2的教程音乐 | 88 | +| sndTutorialSynthShakerLayer | 2-12-2的教程音乐,沙锤音轨 | 88 | +| sndTutorialSynthDrumLayer | 2-12-2的教程音乐,鼓音轨 | 88 | +| sndTutorialFunk_Straight | 2-1N的教程音乐 | 88 | +| sndTutorialFunk_StraightBassless | 2-1N的教程音乐,无贝斯 | 88 | +| sndTutorialFunk_Skip | 2-1N的教程音乐 | 88 | +| sndTutorialTriplet | 2-3的教程音乐 | 88 | +| sndTutorialDubstep | MD-1的教程音乐 | 114 | +| sndTutorialDubstep_Bassless | MD-1的教程音乐,无贝斯 | 114 | +| sndTutorialDubstep_Dotted | MD-1的教程音乐,有附点 | 114 | +| sndOrientalTechno | 1-1东方电舞曲 | 100 | +| sndOrientalTechnodown | 1-1N东方回响贝斯的开头部分 | | +| sndOrientalDubstep | 1-1N东方回响贝斯 | 130 | +| sndIntimate | 1-2亲密 | 90 | +| sndOrientalInsomniac | 1-X东方不眠夜 | 180 | +| sndOrientalInsomniac1 | 1-X 东方不眠夜 第一部分 | | +| sndOrientalInsomniac2 | 1-X 东方不眠夜 第二部分 | | +| sndOrientalInsomniac3 | 1-X 东方不眠夜 第三部分 | | +| sndOrientalInsomniacHardRep | 1-XN超东方不眠夜 | 160~180 | +| sndSupraventricular88 | 2-2室上性心动过速 | 88 | +| sndTutorialBeans | 2-B1武士豆子跳 | 110 | +| sndLounge | 3-1N休息室 | 75 | +| sndBarbra | 3-2典雅 | 115 | +| sndLesMisBar1 | 3-X轮班之歌 | 100 | +| sndLesMisBar39 | 3-X轮班之歌 从第39小节开始 | | +| sndSteinway | 4-3斯坦威 | 80 | +| sndMurmurs | 4-4N喃喃细语 | 65 | +| sndOsmBluesRadio | 夜间的病房内过剧情 | 98? | +| SoftPianoIntimate | 第一章末尾的过剧情 | 88 | + +### 未使用的音乐 + +| 音效名 | 内容 | 曲速 | +| :--- | :--- | :--- | +| sndIntro | 开场动画音乐 | | +| snd8DelayPart1 | Delay Pedal 第一部分 | 100~120 | +| snd8DelayPart2Easy | Delay Pedal 第二部分 简单难度 | 80~130 | +| snd8DelayPart2Hard | Delay Pedal 第二部分 困难难度 | 60~130 | +| sndBarbraC | Mannequin Challenge | 129.97 | +| sndChopin | Op.10 No.4 | | +| sndOrientalInsomniacHardRepOld | 超东方不眠夜(旧版) | | +| sndGreenlightInsomniac | 超东方不眠夜(预告片版) | | +| sndOpeningCredits | | diff --git a/pages/appendix_coding.md b/pages/appendix_coding.md new file mode 100644 index 0000000..e27df7f --- /dev/null +++ b/pages/appendix_coding.md @@ -0,0 +1,173 @@ +# 代码编写关卡 + +点击[此处](../resources/compiler.exe)下载。项目作者:硫酸铜。项目来源:[PyRD - 为视障谱师写节奏医生谱子的一种全新的尝试](https://github.com/qwedc001/pyrd)。 + +本附录为了介绍更为简明化,部分计算机术语被替代,可以前往我的github项目查找原文档(*作者注:有人能帮我写一下文档就好了,文档苦手伤不起*) + +项目介绍:PyRD,又名Python Rhythm Doctor,旨在使用代码创建Rhythm Doctor的自定义关卡,这个项目发起的本心是为了方便节奏医生的视障玩家去制作优质的谱面,而不是对着一个冗长的JSON文件发愁。 + +后来经过节奏医生官方开发huantian的建议,将原有的Python写代码转换成了学习成本更低的YAML标记格式,引出github分支yaml,文档上方提供的下载就是用于翻译yaml为rdlevel的解释器(我并没有做检查语法功能,有大佬会写可以来提交pr) + +此处文档以介绍分支yaml为主,在此分支下,解释器解释的文件后缀为.sprd(Simple RD) + +如果你想直接使用python写rdlevel,你可以直接git clone以后将pyrd.py引入项目,然后根据里面提供的函数进行编写。 + +先通俗的解释一下.sprd文件的构造,建议配合文档末尾提供的示例对比学习。 + +.sprd文件主要分为三大块,分别是metadata(关卡信息),角色和小节具体内容。 + +## Metadata关卡信息的填写 + +在每一块内,每一句是通过换行来分隔的,且在开头有1个空格,比如: +```yaml +metadata: + 艺术家 硫酸铜 + 歌曲 SimpleRD + 难度 简单 + 癫痫 关 +``` +以上四句话分占四行,在中间有空格,空格前为参数,空格后为内容 + +metadata可以填写的参数有: +```yaml +metadata: + 艺术家:艺术家名称 + 歌曲:歌曲名称 + 作者:作者名称 + 描述:描述 + 癫痫:是/否 + 难度:简单/普通/困难/噩梦 + 标签:标签 + rank所需错误数:[20,15,10,5] + rank描述:["F","D","C","B","A","S"] +``` +当然,如果你选择全空着也不是不行,所有metadata此时都会填空。 + +## Character角色信息的填写 + +角色是一行一个角色,角色只有参数,中间用英文逗号分割。 +角色一共有十个参数,其中有五个参数是必填的,剩下五个是你想要填才填,不想填可以不填的。 +如果你想要填一个,空一个,再填一个,那么要空过去的那个参数用英文句号.代替。 + +角色的五个必填参数按照顺序是: +角色名(不想写可以填无),节拍类型(普通拍/单发拍),角色在第几个房间,角色在第几个轨道,角色节拍音效(还没有写对照表,后期补上) + +角色的五个选填参数按照顺序是: +在开始时隐藏轨道,节拍音量,节拍音调高低,节拍声象,节拍偏移,比如: + +```yaml + - [武士,普通拍,0,1,Stick] + - [科尔,单发拍,0,2,Kick] +``` +## Bar每个小节的填写 + +针对于节拍部分,从第三块开始,接下来每一个小节都标上对应的数字,在之后的内容前再加上一个空格。比如: +```yaml +1: + - [播放音乐,1,sndOrientalTechno,100,0] +``` +这里的语法是:- [内容,参数],内容之间/参数和内容之间用英文逗号分隔。 + +几个已经支持的语法:(带星号为可选参数,并且最后有一个“条件”参数,这个参数因为所有语法都支持所以不单独列出) + +```yaml +- [播放音乐,事件在当前小节第几拍,音乐名,BPM,偏移,*音乐音量,*音乐音高,*音乐音像] +- [普通拍,事件在当前小节第几拍,事件在第几轨道,普通拍长度,摇摆拍设置] +- [单发拍,事件在当前小节第几拍,事件在第几轨道,单发拍长度,*单发拍循环,*是否跳过此拍,*冰冻拍间隔,*单发拍类型,*是否播放方块音] +- [设置静音,事件在当前小节第几拍,事件在第几轨道,静音模式(由6个字符组成,-代表正常,x代表静音),切分音拍,切分音摇摆] +- [长按拍,事件在当前小节第几拍,事件在第几轨道,长按拍长度,长按拍摇摆,长按拍按住长度,长按拍X模式] +- [自由拍开始,事件在当前小节第几拍,事件在第几轨道] +- [自由拍脉冲,事件在当前小节第几拍,事件在第几轨道,脉冲行为,自定义脉冲] +- [设置护士音效,事件在当前小节第几拍,说的内容是什么,*是谁的声音,*要提示的单发拍拍长,*音量] +- [设置BPM,事件在当前小节第几拍,bpm] +- [播放音效,事件在当前小节第几拍,音效文件,*音量,*音高,*音像,*偏移,*是否为自定义音效] +- [设置数拍音效,事件在当前小节第几拍,事件在第几轨道,*数拍音效声音,*是否开启,*音量] +- [朗读轨道,事件在当前小节第几拍,事件在第几轨道,信息种类,轨道自定义X,*是否跳过朗读"紊乱",*只发出声音,*朗读X拍] +- [朗读说明,事件在当前小节第几拍,朗读文本,*说明分类] +- [显示对话,事件在当前小节第几拍,对话文字,对话速度,*立绘位置,*播放音效] + +``` +详细的参数类型可以在pyrd.py中找到,更详细的docs需要等到有时间再进行维护,或者你们谁维护了给我提交个pull request也行。 +编写完成后,请执行python compiler.py 你的sprd文件名 + + +(进阶)VFX语法(由群内0x4D2提供): + +```yaml +- [预设特效,事件在当前小节第几拍,事件在第几轨道,特效名称,*是否激活,*属性] +``` +只有个别特效具有 属性 参数。 + + - 对于 落雨/JPEG失真/马赛克/海底波浪/电影噪点/暴风雪/素描/色像差/模糊/径向模糊/色调偏移:强度,缓速时长,缓速 + + - 对于 自定义屏幕块/自定义滚屏:x/y + + - 对于 高光:阈值,强度,颜色,缓速时长,缓速 + +```yaml +- [设置背景,事件在当前小节第几拍,事件在第几轨道,模式,*颜色,*图片,*fps,*填充模式,*过滤器] +``` + + * 模式: 颜色/图片 + + * 对于 平铺 填充模式,有额外的参数:速度x,速度y,时长,缓速 + +```yaml +- [轨道涂色,事件在当前小节第几拍,事件在第几轨道,*受影响的轨道编号,*边框样式,*边框颜色,*边框透明度,*是否启动电击效果,*透明度,*是否填充,*填充颜色,*填充透明度] +``` + + +* 受影响的轨道编号 如果为-1或"全部",则全部轨道均受影响, + +* 边框样式 无边框/轮廓/发光 + +* 透明度最大为100(不透明) + +```yaml +- [闪烁,事件在当前小节第几拍,事件在第几轨道,时长] +``` + +* 时长 短/中/长 + +```yaml +- [注释,事件在当前小节第几拍,事件在第几轨道,注释文字,*播放时是否显示注释,*注释颜色] +``` + +## 示例:Github项目 exampleYAML.sprd + +```yaml +metadata: + 艺术家: 节奏医生 + 歌曲: 1-1 + 作者: 卢毅 + 难度: 简单 + 癫痫: 关 + 描述: 这是一个关卡。 +角色: + - [武士,普通拍,0,1,Stick] + - [科尔,单发拍,0,2,Kick] +小节: + 1: + - [PlayMusic,1,sndOrientalTechno,100,0] + - [预设特效,1,0,落雨,开] + - [设置背景,1,1,颜色,626262FF] + - [轨道涂色,1,2,全部,发光] + - [普通拍,1,1,1,0] + 2: + - [普通拍,1,1,1,0] + 3: + - [普通拍,1,1,1,0] + 4: + - [普通拍,1,1,1,0] + - [设置护士音效,5,SayReaDyGetSetGoNew,.,1,100] + 5: + - [单发拍,1,2,1] + - [单发拍,3,2,1] + - [单发拍,5,2,1] + - [单发拍,7,2,1] + - [设置护士音效,8,JustSayStop,.,1,100] + - [闪烁,1,0,长] + - [闪烁,5,0,长] + - [注释,1,1,插入两个闪光,动作,开] + +``` \ No newline at end of file diff --git a/pages/appendix_custommethods.md b/pages/appendix_custommethods.md new file mode 100644 index 0000000..af38e75 --- /dev/null +++ b/pages/appendix_custommethods.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/appendix_events.md b/pages/appendix_events.md new file mode 100644 index 0000000..9be81c5 --- /dev/null +++ b/pages/appendix_events.md @@ -0,0 +1,92 @@ +# 事件列表 + +## 红色版块(声音) + +| 功能 | 快捷键 | 章节 | 内容 | +| :--- | :--- | :--- | :--- | +| 播放音乐 | `P` | [导入与导出](../pages/importandexport.md#导入音乐)  | 设置谱面的音乐 | +| 设置音节长度 | `C` | | 设置每个小节的拍子数量 | +| 播放音效 | `S` | [音效设计](../pages/audiodesign.md#播放音效) | 播放游戏内置的音效或是导入的音效 | +| 设置BPM | `B` | [导入与导出](../pages/importandexport.md#调整曲速和偏移) | 设置音乐的BPM | +| 设置按拍音效 | `L` | [音效设计](../pages/audiodesign.md#设置按拍音效) | 设置玩家正确击中拍子时的音效 | +| 设置心跳音量 | `H` | [音效设计](../pages/audiodesign.md#心爆) | 设置正确击中拍子时心跳的音效音量    | +| 设置心爆间隔 | `I` | [音效设计](../pages/audiodesign.md#心爆) | 设置心爆效果的延迟方式与间隔 | +| 护士语音设置 | `R` | [音效设计](../pages/oneshotbeat.md#护士节奏提示) | 添加用于提示单发拍子的护士语音 | +| 设置游戏音效 | `G` | [音效设计](../pages/audiodesign.md#设置游戏音效) | 设置玩家按键时的各种音效声 | +| 设置节拍音效 | `T` | [音效设计](../pages/audiodesign.md#设置节拍音效) | 重新设置替换指定轨道的节拍音效 | +| 设置数拍音效   | `U` | [普通拍子](../pages/classicbeat.md#护士节奏提示) | 设置普通拍子的数拍音效 | +| 注释 | `M` | [标签](../pages/tag.md#让事件摆放更有条理) | 添加注释内容或插入注释型自定义方法 | + +## 蓝色版块(轨道) + +| 功能 | 快捷键 | 章节 | 内容 | +| :--- | :--- | :--- | :--- | +| 设置波    | | [单发拍子](../pages/oneshotbeat.md#单发拍子视觉效果) | 设置单发拍子脉冲的形状和大小   | + +## 紫色版块(动作) + +| 功能 | 快捷键 | 章节 | 内容 | +| :--- | :--- | :--- | :--- | +| **玩法类** | | | | +| 结束关卡 | `L` | [导入与导出](../pages/importandexport.md#导出关卡) | 制作关卡必需的特效,放置三个来结束关卡 | +| 设置播放模式   | `9` | | 设置播放头的运动方式 | +| **环境类** | | | | +| 设置主题 | `T` | [场景与主题](../pages/settheme.md) | 给房间添加游戏内置的主题效果 | +| 设置背景 | `B` | [房间](../pages/room.md#背景图片) | 给房间添加纯色背景或是导入自制背景图片 | +| 设置前景 | `G` | [房间](../pages/room.md#前景图片) | 给房间导入自制的前景图片 | +| **轨道类** | | | | +| 隐藏轨道 | `X` | [轨道移动](../pages/moverow.md#轨道的显示与隐藏) | 改变轨道的显示和隐藏状态 | +| 移动轨道 | `O` | [轨道移动](../pages/moverow.md#轨道的移动) | 让轨道在画面中移动,缩放,旋转等 | +| 播放表情 | `J` | [自制角色与精灵资源](../pages/spritesheet.md#播放表情) | 改变轨道中角色的表情 | +| 轨道涂色 | `R` | [轨道视效](../pages/rowfx.md#轨道涂色) | 设置轨道的边框、涂色、透明度 | +| 切换轨道 | `Y` | [采音和节奏设计](../pages/beatpatterndesign.md) | 切换轨道的游玩者:1P,2P或是CPU | +| **镜头类** | | | | +| 移动摄像头 | `C` | [镜头移动](../pages/camera.md) | 设置摄像头动画 | +| 屏幕震动 | `H` | [轨道视效](../pages/rowfx.md#适合配合轨道或节拍一起使用的特效) | 添加屏幕震动效果,可指定震动幅度 | +| 翻转屏幕 | `N` | [视觉干扰](../pages/vfx.md) | 上下,左右,或是中心反转屏幕 | +| 脉冲摄像机 | `P` | [轨道视效](../pages/rowfx.md#和轨道相关的特效) | 添加一个按一定时间和频次缩放画面的效果 | +| **视效类** | | | | +| 预设特效 | `V` | [ex2](../appendix/2.html) | 插入编辑器预置的特效 | +| 设置速度 | `S` | [轨道视效](../pages/vfx.md#设置速度) | 改变整个画面中物件及特效的运行速度 | +| 闪烁 | `F` | [轨道视效](../pages/rowfx.md#适合配合轨道或节拍一起使用的特效) | 简单地屏幕闪烁 | +| 自定义闪烁 | `U` | [轨道视效](../pages/rowfx.md#适合配合轨道或节拍一起使用的特效) | 自定义屏幕闪烁的图层位置,颜色,透明度 | +| 重低音震动 | `K` | [轨道视效](../pages/rowfx.md#适合配合轨道或节拍一起使用的特效) | 添加一次大幅度的色像差加大幅度屏幕缩放 | +| 反转颜色 | `I` | [镜厅](../pages/hallofmirror.md) | 给画面添加反色效果 | +| 卡带效果 | `0` | [视觉干扰](../pages/vfx.md#卡带效果) | 反复重现某个画面造成卡顿错觉 | +| 窗口动效 | `W` | [窗口移动](../pages/windowmove.md) | 把关卡变成窗口模式,并设置窗口的移动 | +| **文本类** | | | | +| 弹幕效果 | `E` | [其他文字事件](../pages/captions.md#弹幕效果) | 添加一个从右至左的弹幕飘过效果 | +| 显示对话 | `D` | [其他文字事件](../pages/captions.md#显示对话) | 添加一个悬浮在屏幕上方或下方的对话窗口 | +| 显示状态牌 | `Q` | [其他文字事件](../pages/captions.md#显示状态牌) | 在画面左上角显示一个状态牌 | +| 浮动文字 | `A` | [浮动文字](../pages/floatingtext.md) | 在画面中显示一段文字 | +| **手 类** | | | | +| 显示手 | `5` | [手](../pages/hand.md#显示手) | 显示或者隐藏手 | +| 手涂色 | `6` | [手](../pages/hand.md#手涂色) | 改变手的颜色 | +| 手分配 | `7` | [手](../pages/hand.md#手分配) | 为手设置所属角色 | +| **组件类** | | | | +| 标签动作 | `8` | [标签](../pages/tag.md#设置标签事件) | 运行/禁用指定标签带有的事件 | +| 自定义方法 | `Z` | [自定义方法](../pages/custommethod.md) | 运行指令,执行无法用常规手段达成的效果 | +| 注释 | `M` | [标签](../pages/tag.md#让事件摆放更有条理) | 添加注释内容或插入注释型自定义方法 | + +## 绿色版块(精灵) + +| 功能 | 快捷键 | 章节 | 内容 | +| :--- | :--- | :--- | :--- | +| 移动精灵图    | `O` | [自制角色与精灵资源](../pages/spritesheet.md#移动精灵图) | 设置精灵的位置、大小、角度、轴点    | +| 绘制精灵图 | `T` | [自制角色与精灵资源](../pages/spritesheet.md#绘制精灵图) | 设置精灵的边框、涂色、透明度 | +| 播放表情 | `P` | [自制角色与精灵资源](../pages/spritesheet.md#播放表情) | 播放精灵的表情 | +| 显示/隐藏 | `V` | [自制角色与精灵资源](../pages/spritesheet.md#显示/隐藏) | 显示或隐藏精灵 | +| 注释 | `M` | [标签](../pages/tag.md#让事件摆放更有条理) | 添加注释内容或插入注释型自定义方法 | + +## 黄色版块(房间) + +| 功能 | 快捷键 | 章节 | 内容 | +| :--- | :--- | :--- | :--- | +| 排列显示房间 | `S` | [房间](../pages/room.md#排列显示房间) | 改变四个房间的前后顺序 | +| 移动房间 | `M` | [镜头移动](../pages/camera.md) | 让房间在画面中移动,缩放,旋转等 | +| 重新排序房间 | `O` | [房间](../pages/room.md#房间的前后关系) | 改变四个房间的前后顺序 | +| 设置房间内容模式 | `C` | [镜头移动](../pages/camera.md) | 设置房间在缩小时是缩放房间还是剪裁房间 | +| 房间遮罩 | `K` | [房间视效](../pages/roomfx.md#房间遮罩) | 为房间设置遮罩 | +| 淡入淡出房间 | `F` | [镜头移动](../pages/camera.md) | 设置房间的透明度 | +| 设置房间视角 | `P` | [房间视效](../pages/roomfx.md#设置房间视角) | 设置房间的四个角的位置 | +| 注释 | `M` | [标签](../pages/tag.md#让事件摆放更有条理) | 添加注释内容或插入注释型自定义方法 | \ No newline at end of file diff --git a/pages/appendix_gimmicks.md b/pages/appendix_gimmicks.md new file mode 100644 index 0000000..a61b060 --- /dev/null +++ b/pages/appendix_gimmicks.md @@ -0,0 +1,131 @@ +# 节奏机制 + +### 普通拍子 + +在编辑器中翻译为普通拍子。听音乐,在节拍音效响了六次之后,你需要在**第七**拍子的时候狠狠按下空格。 + +在`1-1 东方电舞曲`中被首次引入。 + +### 带X拍子 + +在编辑器中翻译为X字拍子。心跳有时候会**跳过一些拍子**,但我们仍然需要在拍子抵达时抓住时机按键。当电图线路上出现**红色的X字**时,就意味着这些拍子会被跳过。这个时候你需要在头脑里继续数数,然后照常在第普通拍处按键。 + +在`1-2 亲密`中被首次引入,且在大量关卡中出现。 + +
在剧情模式中出现过的一些带X拍子 + +
+ +### 摇摆普通拍子 + +也称心脏梗阻。他们的心跳会出现不规则的拍子,因为心跳信号的工作不正常,节拍也会呈现不规则的感觉。无论如何,也请在第普通拍按下空格。 + +在`3-3 分离二重唱`中被首次引入。 + +### 网好卡菌 + +在编辑器中应设置为电击拍子。无论发生什么都要在音乐的第普通拍按下空格。 + +在`1-X 东方不眠夜`中被首次引入。 + +### 切分音 + +简单来说,就是第七下拍子会比你以为的要来的**略早一些**。在第6.5拍的时候按键。 + +在`X-MAT Meet and Tweet`中被首次引入。 + +### 长按拍子 + +需要**长按**按键而非只是按一下。引导节拍会提示你需要长按多久时间。按拍的节奏音和松拍的节奏音要分别听 速度可以不同。 + +在`4-1 实习医生 培训演练 表现评估`中被首次引入。 + +### 标准单发拍子 + +也称室上性心搏过速、室上速拍子,在编辑器中翻译为单发拍子。护士会用英语的[Rea,dy,Get,Set,Go]来提示拍子的节奏。即使拍子响起多次,或者早响晚响,都要按着护士的提示来按键。 + +在`2-1 Lo-fi Hip-Hop Beats To Treat Patients To`中被首次引入。 + +### 变速单发拍子 + +当时室上性心搏过速患者突然发作时,他们的心率会**翻倍**,当发作平复后,又会恢复为高峰的**一半**。 + +在`2-2 室上性心搏过速`中被首次引入。 + +### 摇摆单发拍子 + +间隔时间不等于拍长2倍的单发拍子,注意护士的节奏提示。 + +在`2-3 缭绕`中被首次引入。 + +### 进阶单发拍子 + +以多个单发拍子为一组来循环,护士的`Rea Dy`和`Get Set`提示的是不同的单发拍子。 + +在`4-4N 喃喃细语` + +### 跳过拍子 + +心电图上会出现红色的X,也会有相应的音效提示“咯咯……”,这时跳过一次单发拍子按键。 + +在`2-1N wish i could care less`中被首次引入。 + +### 方框拍子 + +有时候,病人会经历仅此一次、意想不到的心率波动。你只需要在合适的时机按一次。如果护士姐姐累了,你可能会只听到一声“咚!”,也是一样的。 + +在`X-1 美术练习`中被首次引入。 + +### 细分拍子 + +把接下来的一个单发拍子平均拆成多份,按多次。 + +在`MD-1 Blackest Luxury Car`中被首次引入,只涉及到均分两次。在第五章中被丰富,最多时要按五次。 + +### 冻结拍子 + +单发拍子根据冻结音效的提示来延迟按拍。 + +在`5-2 Lo-fi Beats For Patients To Chill To`中被首次引入。 + +### 灼热拍子 + +单发拍子根据火焰音效的提示来提早按拍。 + +在`5-2N 无以为继的伤心欲绝`中被首次引入。 + +### 冲击拍子 + +单发拍子根据哨声提示在脉冲和按拍时全都按拍。 + +在`5-X 梦想永不歇`中被首次引入。 + +### 八拍子 + +在第八拍的时候按键。 + +社区机制。 + +### 附点变速拍 + +普通拍子在中途改变一次速度,速度变为与它相近的附点拍或者整拍。 + +社区机制。 + +### 倍速变速拍 + +普通拍子在中途改变一次速度,速度加倍或是减半。 + +社区机制。 \ No newline at end of file diff --git a/pages/appendix_levelrules.md b/pages/appendix_levelrules.md new file mode 100644 index 0000000..6faaebb --- /dev/null +++ b/pages/appendix_levelrules.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/appendix_resources.md b/pages/appendix_resources.md new file mode 100644 index 0000000..12c9542 --- /dev/null +++ b/pages/appendix_resources.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/appendix_tools.md b/pages/appendix_tools.md new file mode 100644 index 0000000..70e9acb --- /dev/null +++ b/pages/appendix_tools.md @@ -0,0 +1,23 @@ +# RDView Playground +
+ +--- \ No newline at end of file diff --git a/pages/appendix_translations.md b/pages/appendix_translations.md new file mode 100644 index 0000000..ee366bb --- /dev/null +++ b/pages/appendix_translations.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/appendix_vfxs.md b/pages/appendix_vfxs.md new file mode 100644 index 0000000..915b393 --- /dev/null +++ b/pages/appendix_vfxs.md @@ -0,0 +1,74 @@ +# 预设特效 + +注:标记为红色的预设特效已经在编辑器中默认隐藏了,如果你打开了一个较早的谱面文件且文件内使用过这些标红的预设特效,那么在预设特效列表里你还能找到它们。 + +| 特效名称 | 具体效果 | +| :--- | :--- | +| **摄像头类** | | +| 屏幕块2x2 | 把屏幕块变成2x2个相同的部分 | +| 屏幕块3x3 | 把屏幕块变成3x3个相同的部分 | +| 屏幕块4x4 | 把屏幕块变成4x4个相同的部分 | +| 自定义屏幕块 | 把屏幕块变成任意个相同的部分,注意这里是可以填写小数的 | +| 水平滚屏 | 画面向左移动,并且从右方重复出现 | +| 垂直滚屏 | 画面向上移动,并且从下方重复出现;需要注意:水平垂直滚屏只能存在一个 | +| VHS | 画面带有横条和轻微抖动,有老式录像机的感觉 | +| 水平滚屏+VHS  | 上面两个的叠加,实际上分开放两个物块效果也是一样的 | +| 垂直滚屏+VHS | 上面两个的叠加,实际上分开放两个物块效果也是一样的 | +| 自定义滚屏 | 允许同时设置水平和垂直的滚屏,并且自由设置滚屏速度 | +| 过场模式 | 屏幕上下方出现黑条,类似于很多游戏出过场动画时的效果 | +| 按键低重音 | 每次按拍后画面产生震动和色像差 | +| | | +| **画风突变类** | | +| 黑屏 | 别多想,真的就是屏幕全黑了 | +| 噪点 | 就是那种老电视收不到信号的马赛克 | +| 电影噪点 | 在保持画面的基础上加一些噪点 | +| 色调偏移 | 改变画面的色调,每隔100%是一个色调循环 | +| 亮度 | 改变画面的亮度,小于等于0的情况下等效于黑屏 | +| 对比度 | 改变画面的色彩对比度,负数的情况下等效于反色 | +| 饱和度 | 改变画面的色彩饱和度,负数的情况下等效于反色 | +| 灰度 | 画面变成黑白灰的 | +| 怀旧 | 画面发黄 | +| JPEG失真 | 出现类似信号不稳定时的画面割裂效果 | +| 马赛克 | 与普通的打码不太一样,能感觉到画面依然清晰但是割裂成了一个个小格子 | +| 海底波浪 | 屏幕左右扭曲 | +| 放克 | 精神污染,屏幕上滚动着高饱和度的纯色 | +| 素描 | 添加一张揉皱的白纸背景,将原始画面自动抽取关键部分变成黑色画在纸上 | +| 色像差 | 有点像红蓝眼镜3D视频不戴眼镜时看到的效果 | +| 干扰 | 一个闪烁的,反色的,鬼畜的东方不眠夜背景 | +| 橙色高光 | 给屏幕加一个橙色的高光 | +| 蓝色高光 | 给屏幕加一个蓝色的高光 | +| 高光 | 给屏幕加一个自定义颜色和亮度的高光 | +| 晕影 | 给屏幕加一个边缘变暗的效果 | +| 闪烁晕影 | 给屏幕加一个边缘变暗同时还跟着心跳闪烁的效果 | +| 彩色冲击波 | 每次正确按拍后背景颜色的主色调会改变 | +| 模糊 | 让画面变得模糊 | +| 径向模糊 | 由中心向四周放射性地产生模糊效果 | +| 镜厅 | 给画面做一个延迟叠加,用不好就会非常阴间 | +| | | +| **添加物类** |   | +| 落雨 | 添加一个下雨效果,和`1-2`这关是一样的,可以和前景背景叠加起来显示 | +| 矩阵 | 添加一个绿色音符上升的效果,和`1-XN`这关是一样的,可以和前景背景叠加起来显示 | +| 落花 | 屏幕上方开始落下花瓣,可以和前景背景叠加起来显示 | +| 落花即刻 | 屏幕上方落下花瓣,同时屏幕上已生成一些花瓣,可以和前景背景叠加起来显示 | +| 飘雪 | 屏幕上方开始落下雪花,可以和前景背景叠加起来显示 | +| 雪花 | 屏幕上方开始落下快速的雪花,短时间内充满屏幕,可以和前景背景叠加起来显示 | +| 暴风雪 | 屏幕上方开始落下暴风雪,可以和前景背景叠加起来显示 | +| 钻石 | 屏幕上出现很多方块 | +| 教程音符 | 屏幕铺满剧情模式教程中的音符背景,可以自定义颜色等 | +| | | +| **轨道类** | | +| 心跳剪影 | 先添加一个轨道涂色然后加入心跳剪影,每一拍心跳轨道都会改变颜色 | +| 轨道亮白 | 给轨道加一个白色高光,需要事先布置一个轨道涂色物件 | +| 轨道轮廓 | 给轨道加一个黑边轮廓,需要事先布置一个轨道涂色物件 | +| 轨道阴影 | 给轨道加一个浅黑色阴影,不能轨道涂色 | +| 轨道全白 | 把轨道变成纯白色,需要事先布置一个轨道涂色物件 | +| 轨道轮廓光 | 把轨道变成纯黑色白边,需要事先布置一个轨道涂色物件 | +| 轨道普通 | 把轨道变成普通样子,需要事先布置一个轨道涂色物件 | +| 波状轨道 | 轨道自己上下来回移动,类似于`2-3N`这关 | +| 脉冲计数 | 对普通拍子轨道有效,轨道上方随节奏出现1~7的数字,每个房间只能有一条轨道显示 | +| 心跳震屏 | 每个心跳拍子都会让轨道抖动一下 | +| 按键震屏 | 每个按键拍子都会让轨道抖动一下 | +| 垂直亮纹 | 在有节拍的时候只让节拍位置高亮,其他地方暗下去 | +| | | +| **特殊** | | +| 禁用全部 | | \ No newline at end of file diff --git a/pages/assets.md b/pages/assets.md new file mode 100644 index 0000000..bc3ece3 --- /dev/null +++ b/pages/assets.md @@ -0,0 +1,66 @@ +# 场景资源 + +## 背景和前景图片 + +在房间的前后关系里我们提到了背景图片和前景图片这两个概念,也就是说,除了使用编辑器内自带的一些主题之外,其实自己也是可以自定义画面的背景和前景图案的。这个功能同样十分灵活,但是如果想要完全靠自己来原创或是临摹背景图片的话,可能需要对画像素画有一些掌握。 + +选择紫色的版块,放置一个**设置背景**的事件,发现里面有两种形式,一种是纯色,这个比较好理解,唯独要注意的是**纯色的默认值是黑色而不是透明**,另一种是插入图片。 + +> 插入的图片必须是.png格式,如果你是自己画背景图,建议使用画布大小为352\*198像素。 + +颜色选项,看似意义不明,但其实也有一定的用处。如果你导入的图片只有纯白和透明两种颜色,这个功能就可以为纯白的部分染色,染成你自己设置的颜色。但是因为一次只能设置一种颜色,使用起来也有些限制。 + +缩放功能其实类似于操作系统里壁纸的填充方式,具体效果点开小箭头查看。 + +
填充方式 +填充方式图例 + +
+ +> 如果你想做一个动图效果,需要把.gif拆解成一连串的.png图片,在选择图片时同时选择所有的图点击确定。接下来就会多出一个设置帧数的选项,来确定动图的播放速度。帧数 = \(背景图总画面数 / 一个循环占节拍数量\) \* 曲速/60。 +设置背景一样,但使用这个功能的主要目的还是为了能产生一个图片覆盖轨道和手的效果,这样在画面效果的处理上可以更加灵活。 + +## 平铺背景 + +唯独平铺选项会多冒出来一个速度设置,它可以让背景图片始终保持设置的速度移动。 + +* 在滚屏模式下,效果类似于4-2的天空在慢慢移动,速度和缓速则是调整背景从静止到目标速度的变化过程。 +* 在脉冲模式下,背景的移动速度变化就是周期性的,用间隔来调整周期。另外,如果你想设计这样的移动背景,在作画的时候也需要考虑画面左右两端和上下两端的连续,否则画面运动起来会感觉到割裂。 + +举个例子,公路,山坡,白云,蓝天的运动速度都不一样,毕竟在画面中的远近关系不一样,把他们分别画在四个背景图片里,放在四个房间,然后设置四个移动房间事件,把位置都改为`(50%, 50%)`,把大小都改为`(100%, 100%)`,设置四个背景图片,使用平铺的方式,设置不同的水平移动速度,就得到了在公路上慢慢前进的效果。 + +![灵 魂 公 路](../images/assets-road.gif) + +另外,使用小图片像地砖一样平铺才是更为原本的用法。 + +## 还原PV效果 + +有些音乐是自带PV/MV/BGA的,直接将原视频的风格或内容搬运到节奏医生中也不失为一种选择。但编辑器也有其自己的像素风格,有节奏医生自己的游戏特色,还原时也要讲究融合。 + +我们能想到的最简单粗暴的方式就是将原视频逐帧抠图,添加到节奏医生的背景中。虽然可行,但会导致关卡包巨大,进而导致部分电脑由于性能原因无法打开关卡导致游戏崩溃甚至蓝屏,所以非必要情况下请避免使用大量的帧动画。 + +最好的方法还是思考如何拆解画面成分,将画面中的各个元素利用诸如“轨道移动”、“精灵图移动”等方法展现。这些独立元素你可以从视频中抠图,也可以自己进行像素化重绘,甚至直接改成编辑器内自带的一些物件。 + +对于一些契合轨道的独立元素,可以把它们改造成轨道,例如: + +> 1. 选取背景素材或原PV中的直线状物体,让一条轨道与其重合 +> 2. 选取背景素材或原PV中的短线状物体,尝试将轨道拆分成多个精灵图,替代轨道来设计节拍 +> 3. 选取背景素材或原PV中的大量相同的物品,参考[自制角色与精灵资源](../pages/spritesheet.md)用各种物品代替轨道 +> 4. 使用任何有两种状态的物品,一种表示脉冲,一种表示按拍,就能制作出单发拍子 +> 5. 某种运动效果的变化,例如物件砸在地上或屏幕某个位置,也可以用于区分脉冲和按拍 +> 6. 完全隐藏单发拍轨道,但将烟花出现在屏幕某个位置 +> 7. 直接把轨道放在屏幕的上下两侧或是左右两侧,不干扰画面中间区域 + +此外,一些原本就炫酷的视觉效果,也可以尝试通过多个预设特效的叠加来实现。如果实在是出现了超出你制作能力的镜头,也只能考虑对画面进行一定程度的简化了。 + +
+ +## 完全自主绘画的场景 + +**实际上到这里就没有太多可说的了,你的创造会是完全自由的,充分发挥你的想象力吧。** \ No newline at end of file diff --git a/pages/audiodesign.md b/pages/audiodesign.md new file mode 100644 index 0000000..9bbb2cb --- /dev/null +++ b/pages/audiodesign.md @@ -0,0 +1,135 @@ +# 音效设计 + +在介绍音效的各种功能之前先要插一句话。在所有的声音有关的设置里面都会出现一个小扳手的按钮,点开之后可以设置声音的音量(也就是声音大小),音高(也就是音调高低)和声像(也就是左右声道),这些设置别看好像藏得有点深,但其实用得巧妙的话是能极大提升关卡的细节感的。 + +同时还有一个文件夹按钮,可以支持你插入自定义的音效文件,格式必须是.ogg。如果要导入其他游戏里面的音效文件会很方便。如果要自己制作一个音频文件,要注意不要给音效文件前面留空白的时间,这样放在游戏里会感觉到音效出现延迟。 + +前面的铺垫完,接下来本节要介绍的主要是下面这五个功能:设置节拍音效、设置按拍音效、设置游戏音效、心爆以及播放音效。 + +## 设置节拍音效 + +如果你还有印象的话,在添加一个人物之后,里面就自带了一个设置节拍音效的选项: + +![轨道属性页面](../images/audodesign-rowsettings.png) + +如上图所示,沙锤就是洛根登场之后出现的节拍音效。如果你想在中途改变洛根的音效,就需要在红色的界面里面添加一个**设置节拍音效**事件,然后在轨道里面选择洛根,在音效里选择其他的。 + +点一下下面的“复制轨道节拍音效设置”,就会把添加人物时设置好的节拍音效(包括音量音高声像)的具体内容全部粘贴到这个事件里面来。 + +## 设置按拍音效 + +在编辑器中节拍音效和按拍音效是分开设置的。想要改变按拍时候的音效用的就是**设置按拍音效**,里面普通轨道(普通拍子)和单发轨道(单发拍子)又是分开设置的。但是不能对每一个人物单独设置,这一点需要注意。 + +## 设置游戏音效 + +除了节奏音效和按拍音效之外,游戏里还有一些地方会出现音效,主要是失误的时候(分为微小失误和严重失误),没有节拍却按了空格的时候(默认是“啵”一声,所以在编辑器里面叫“手掌-啵音”),第普通拍按下之后第八拍“咚”地一声回音(叫做心爆,这时候心脏图标也会小抖一下),以及跳过拍(嘎↘的声音),长按拍,冻结拍,灼热拍的音效。 + +这些音效在设置的时候是无法下拉列表选择更改的,只能通过键入游戏内置的音效文件名,或者导入自定义的音效来改变。目前已公开的内置音效文件名因为数量太多,集中收录在了[附录3](../appendix/3.html)中。 + +## 心爆 + +在玩家正确按拍后,心会发光跳动并伴随有“嘣”的声音,这种现象叫做**心爆**。 + +### 设置游戏音效 + +在红色声音版块的**设置游戏音效**事件中,心爆具有三种音效,分别是**心爆**、**心爆 2** 、**心爆 3** 。 + +**心爆**:一次单独按拍产生的心爆。 +**心爆 2** :两次累计的按拍 / 两个重叠的按拍产生的心爆。 +**心爆 3** :三次及以上累计的按拍 / 三个及以上重叠的按拍产生的心爆。 + +```rdview 3 5 +eb.AddFreeTimeBeat 1 1[pulse=7]; +eb.AddFreeTimeBeat 1 2[pulse=7]; +eb.AddFreeTimeBeat 1 2[pulse=7]; +eb.AddFreeTimeBeat 1 3[pulse=7]; +eb.AddFreeTimeBeat 1 3[pulse=7]; +eb.AddFreeTimeBeat 1 3[pulse=7]; +``` + +### 设置心跳音量 + +顾名思义,就是调整心爆的音量。三个音效音量会**一起调整**。 + +### 设置心爆间隔 + +心爆延迟选项下有一个“**间隔**”选项,用于调整**按拍之后多久再播放心爆音效**。 + +心爆延迟选项有四:**固定间隔**、**即刻**、**固定间隔组合**、**强排组合**。 + +**固定间隔**:每次按拍后经过一个固定时长都各会响一次心爆。注意,间隔处填 0 拍长**不能达到立刻心爆效果**。 +**即刻**:每次按拍立刻心爆,但是心爆音效会**消失**。无视间隔处的拍长参数。 +**固定间隔组合**:**累计在阈值内的所有按拍**并在最后一次按拍后固定间隔形成**一次**心爆。 +**强拍组合**:累计在阈值内的所有按拍并在最后一次按拍后**一定间隔的强拍上**形成一次心爆。 + +后面俩组合得好好说道说道。 + +首先带**组合**后缀的这两个选项可以**在心爆之前**检测**是否还存在按拍**,存在则累计按拍不心爆,并以新的按拍开始判定按拍。**直到完全到达判定区间尾部时,心爆才会发生。** + +对**强拍组合**而言,其按拍判定如下: +按拍固定间隔后,如果尾部**刚好**在小节线上,则判定范围仍与间隔**相等**; +如果尾部**不在小节线上**,则判定范围会**延长至下一小节线**。 + +```rdview 4 9 +g 1 1{ + g 1 0 0 1 #08f{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1.25 3 1.75 1 #08f{ + g{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1.5 5 1.5 1 #08f{ + g{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1.75 7 1.25 1 #08f{ + g{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +``` + +对**固定间隔按拍**而言,其按拍判定如下: +当间隔设置为 1 拍长及以下时,判定范围是**间隔 + 0.2 秒**; +当间隔设置为 1 拍长以上时,判定范围不会变化。 + +图例为 BPM=150(即每拍 0.4 秒)下的情况: +```rdview 7 9 +g 1 1 0.75 1 #08f{ + g 0 0 0.25{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1 3 1.25 1 #08f{ + g 0 0 0.75{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1 5 1.25{ + g 1.25 0 0 1 #08f{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 1 7 1.75 { + g 1.75 0 0 1 #08f{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 4 1 1 1 #08f{ + g 0 0 0.5{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 4 3 1.5 1 #08f{ + g{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 4 5 1.5{ + g 1.5 0 0 1 #08f{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +g 4 7 2 { + g 2 0 0 1 #08f{}; + eb.AddFreeTimeBeat [pulse=7]; +}; +``` + +## 播放音效 +**播放音效**是所有音效设置里面自由度最高的一个,可以在任意的时间开始播放一个音效文件,和游戏的轨道与按键没有任何关联。如果处理得当,你甚至可以用这个功能写一个打击乐段在游戏里面。 + +另外,剧情模式里面的内置音效也可以在这里通过写文件名的形式添加进自己的谱面。但是官方目前并没有公开所有的音效文件,我们收集了其中的一部分放在了[附录3](../appendix/3.html)中整理成了表格,需要的话可以自取。 diff --git a/pages/beatpatterndesign.md b/pages/beatpatterndesign.md new file mode 100644 index 0000000..dc36528 --- /dev/null +++ b/pages/beatpatterndesign.md @@ -0,0 +1,120 @@ +# 采音和节奏设计 + +## 采音 + +把一段音乐里面所有出现节奏点的地方都至少放上一个心跳或者按拍,这是很多萌新都会想去做的事情。但我们要清楚,很多时候旋律本身其实是很随性的,如果全部采到音,那么整个谱面会变成一大堆的自由拍子。 + +普通普通拍子把`X`算到一起,一定是七个等距的采音,所以有一些微弱的不搭,是可以忽略的。比如说音乐是弹录的钢琴曲,那么钢琴师没法像软件那样精确时间弹奏每一个音,总可能会多多少少有些误差,或者是自己兴致起来有些自己发挥的节奏(实际上`4-3`这关就是弹录的)。这些就可以不用把精度调到非常高去慢慢抠了。 + +普通拍子的时间段里面还有一些其它的音在八分之一或者甚至十六分之一拍上,导致总采音量应当是超过七个的时候,多的那些中间旮旯的就可以无视掉了,保持普通拍子稳定即可。 + +有些配器的旋律虽然在音乐里听感非常突出,但是完全不需要为其设置轨道,例如`3-2`[典雅](https://www.bilibili.com/video/BV1PZ4y1P7yE?p=24)的1分41秒开始高音部分虽然很动感但是没有对应轨道;`4-2`[隐形](https://www.bilibili.com/video/BV1PZ4y1P7yE?p=36)的1分02秒开始高音部分也没有对应轨道,`4-2N`的玄凤是对应此声部的,但并没有把所有音都压上,空出了一些,保持了`-x-x-x----♥`的节奏。 + +而反过来,如果你觉得音乐的节奏感不足,那么配以合适的音效声是可以把轨道直接融入在音乐里的。相当于设计节奏的同时为音乐本身添加了新的配器。例如`3-2`[典雅](https://www.bilibili.com/video/BV1PZ4y1P7yE?p=24)的政客轨道,其实音乐本身是没有这部分音轨的。 + +## 独立的轨道设计 + +**一、谨慎处理速度过快的拍子** + +首先一个很重要的点,对于一个非常快速的节奏,一定要给玩家一个提前量,让他能感受到前方高能。这一点在`2-2`是做的非常好的,游戏从非常慢开始,逐渐加快,让你知道这一关要挑战速度变化,然后休整一段时间慢下去,最后高潮部分速度最快,玩家就会有一种预期,能感觉到后面肯定有非常快的节奏。如果不给这样一个渐进那么游玩体验一定是非常痛苦的,节拍很难找准。 + +![突然出现的快速普通拍子让玩家没法反应过来](../images/beatpatterndesign-beatsthatsofast.gif) + +做自制谱的时候也是一样,如果要设计一个突然速度飞快的节奏,一定要给玩家充足的心理准备。 + +**二、轨道该加就加,切莫重叠节奏** + +同时在一根轨道里也不要把几个节奏都堆在一起,一般来说同一轨道内出现一次性出现多个节奏时会把节奏声加重,很影响听歌体验。更不要前一个慢节奏正走着呢,后面一个快节奏超过去。并不是说这样就绝对不能读出谱了,只是说这样的设计思路并不符合思考的直觉。 + +![叠在一起的两个拍子会增加读谱压力](../images/beatpatterndesign-beatsthatoverlap.gif) + +**三、谨慎处理第一拍带×** + +谈到这个问题你一瞬间想到的不出意外就是`4-4`《懂你》,那我们不妨就以此为例讲讲首拍带X的使用场景有多么严苛。 + +《懂你》最早是社区谱,后来被选入剧情模式。在这关里出现了两种新的机制,其中一个是五拍子。五拍子在轨道表现上是`xx---- ---♥`,即前面两拍都跳过,在第五声响的时候按拍。 + +也就是说,光凭听觉,五拍子的`3-4-5-6-7`和普通拍子的`1-2-3-4-5`是无法区分的。普通拍子比五拍子常见,节奏规则的转变需要给人一段适应的时间。游戏在`4-4`设置了专门的教程部分介绍五拍子节奏,并且在教程环节和关卡中使用了相同且易辨识的`定音钹2`音效。这就给了玩家一个心理预期:这关会出现不少五拍子,并且当我听到定音钹2的声音时,即意味着五拍子来了。 + +经过这样的铺垫,五拍子机制也就做到无障碍了,也就是说,去掉电脑屏幕,一个不依赖视觉的盲人也能完成这首歌的体验。 + +五拍子的第二次出现就到了联动关卡`X-WOT`,这关没有设置前置教程,但依然多次出现了五拍子。在联动时期这首音乐完全属于大家从未耳闻的“新歌”,对于会出现五拍子机制是无法构成心理预期的,此时官方的做法就变为了给前几次的五拍子加上了熟悉的`定音钹2`音效和护士数拍`3-4-5-6-7`。这样就依然确保了玩家能够反应过来这个曾经熟悉的节奏机制。 + +![Worn Out Tapes](../images/beatpatterndesign-wornouttapes.gif) + +官方的做法固然如此,对于我们自制谱而言又有何参考呢? + +首先,剧情模式出现两次五拍子机制,它们出现的位置在节奏上都是连续附点的,即两个心跳之间的间隔都是1.5拍,这样五拍子的有声拍长也是6,和普通的普通拍子是完全一致的。在这种连续附点的压迫感之下设置五拍,与音乐非常契合。 + +```rdview 14 4 +eb.AddClassicBeat 6 1[tick=6]; +eb.SetRowXs 1 2[rowxs=xx----]; +eb.AddFreeTimeBeat 3 2[pulse=1]; +eb.PulseFreeTimeBeat 4.5 2[pulse=9]; +eb.PulseFreeTimeBeat 6 2[pulse=9]; +eb.PulseFreeTimeBeat 7.5 2[pulse=9]; +eb.PulseFreeTimeBeat 9 2[pulse=9]; +eb.PulseFreeTimeBeat 10.5 2[pulse=9]; +eb.PulseFreeTimeBeat 12 2[pulse=9]; +``` + +而我们自选音乐时很多时候遇到的情况都是连续五个采音点,但间隔都是1拍,这种情况与其精准采音`xx----`反而不如额外增加一个不存在的采音变成`-x----`或者`-----x`,这样既不损失与音乐的契合,又能把节奏归化简单。 + +如果真的是太想要五拍子了,那就加上电脑演示或者护士数拍吧。其他的首拍带X的情况也是同理。 + +**四、避免添加过多的×** + +当你想要在普通拍子中加入`X`记号的时候,**注意不要一次性加入超过四个**`X`。 + +如果轨道中有四个,那么带给玩家的压力会很大,想必你也能回想起猫头鹰节奏带来的恐惧,第一次玩的时候其实很难反应过来。如果有强烈的意愿需要加入四个`X`,还是需要加入显眼的节奏提示,对于高BPM歌曲还需要给出更多的节奏提前量让玩家不至于反应不过来,或者干脆让电脑先演示一遍。 + +如果轨道中有五个,那么实际上它和单发拍子的节奏是完全相同的,没有强烈的必要的情况下还是建议直接改成单发拍子;即使非要保留这种节奏也需要和单发拍子一样加入护士提示。 + +![心 肺 骤 停](../images/beatpatterndesign-beatsthatstopped.gif) + +如果轨道中有六个,那就相当于没有前置节奏,凭空冒出来一个按拍。有的同学可能会说,不会呀,心跳经过`X`记号的时候`X`记号也会弹一下,可以通过数这个微弱的弹跳来感受节奏。对于目押来说,这确实是可行的,但是一个优质谱我们还需要考虑视力障碍玩家游玩的可行性。对于纯音押来说,节奏上的`X`记号是完全无声的,也就是不可读谱的。 + +## 整体的节奏设计 + +即使把单个的轨道梳理清楚,全部融合在一起同时出现的时候也有不少麻烦。如果处理得不好,还是会留给人节奏凌乱,无法理解的印象。 + +**一、**并行轨道的数量最好是**循序渐进**,刚入场就咣咣咣咣四个轨道容易把玩家吓着。特别是有新节奏的情况下,最好能拿一段时间来单独为新节奏进行教学,然后再与其他轨道组合。 + +![你有没有发现把我吓死了](../images/beatpatterndesign-beatsthatscaredme.gif) + +**二、**多轨道情况下如果有某条轨道**长期没有节拍请一定将它隐藏**起来。玩家看到过多的闲置轨道是并不能意识到它们会在什么时候出现拍子的,只会提心吊胆地玩下去。 + +![医生和政客穿插出现,而不是全都堆在屏幕上](../images/beatpatterndesign-multiplerows.gif) + +**三、**每一条轨道的**节奏功能做出严格的区分**,如果场上本身就有多轨,不要给一条轨道设计过多差距太大的节奏类型。同时,非必要尽量不要增添太多轨道。让很多轨道展现出花里胡哨的节奏但却在同一拍按键也会让人感觉很牵强。 + +```rdview 14 4 +eb.AddClassicBeat 0 0[tick=1.5,swing=0.25]; +eb.AddClassicBeat 2 0[tick=3,swing=0.5]; +eb.AddClassicBeat 6 0[tick=3,hold=0.5,swing=0.5]; +eb.AddFreeTimeBeat 10 0[pulse=1]; +eb.PulseFreeTimeBeat 10.25[pulse=9]; +eb.PulseFreeTimeBeat 11[pulse=9]; +eb.PulseFreeTimeBeat 11.25[pulse=9]; +eb.PulseFreeTimeBeat 12[pulse=9]; +eb.PulseFreeTimeBeat 12.25[pulse=9]; +eb.PulseFreeTimeBeat 13[pulse=9]; +eb.AddClassicBeat 0 1[tick=6]; +eb.AddClassicBeat 7 1[tick=1.5,swing=0.25]; +eb.AddClassicBeat 9 1[tick=1.5,swing=0.25]; +eb.AddClassicBeat 0 2[tick=3,hold=0.5,swing=0.5]; +eb.AddClassicBeat 4 2[tick=3,swing=0.5]; +eb.AddClassicBeat 7 2[tick=6]; +``` + +**四、**不要过度采音。更不要为了精准采音做出种类繁多,重复次数又少的自由拍子。节奏医生的游戏机制是和一般的音乐游戏不同的。音乐游戏是可以给每一个节奏点都设计按键(Note)的,但节奏医生却不能这样。节奏医生的本质是“提示拍 + 按键拍”的组合,**所有的提示拍全都应该按照没有按键的节奏点来设计**。如果像其他音乐游戏一样来设计节奏医生的谱面,得到的一定是塞爆谱。 + +![有一个人前来打谱](../images/beatpatterndesign-amountofbeats.gif) + +**五、**如果涉及一些全新的节奏型,特别是多轨道组合或者是自由节拍,一定要做好**充足的提示**。如何确认自己的提示足够了?最好是找一些水平适中的群友或者朋友**玩一次初见**(注意最好是第一次玩,次数多了可能会背谱过),看他们的反馈,有没有不明所以的节拍,做出调整和增加提示。 + +## 详细的采音教程 + +详细的采音教程更适合通过视频来介绍,所以下面请看视频: + +
\ No newline at end of file diff --git a/pages/camera.md b/pages/camera.md new file mode 100644 index 0000000..64b8aca --- /dev/null +++ b/pages/camera.md @@ -0,0 +1,80 @@ +# 镜头移动 + +## 概述 +移动房间应该是整个编辑器内灵活性最高的功能之一了。它的灵活性本身并不是基于对编辑器功能的理解的,而是更类似于对摄影或是视频制作手法的理解。我们观看电影也总是会说“镜头语言”,这话同样适用于作谱。合理的镜头运用可以极大程度提升谱面的视觉观感。 + +当然了,我们做谱面也并非是拍电影或者是画动画,并且大多数时候都是一个人作图,肝的数量也比较有限。在**有限的时间成本之内**最大化地设计好镜头才是最重要的。 + +就其功能本身而言,实际上内容和移动轨道并无太多差别,只是作用的对象分别是摄像头和房间而已。移动摄像头在紫色的版块中,移动房间在黄色的版块中。 + +![移动摄像头和移动房间的设置界面](../images/camera-movecameraandmoveroom.png) + +如果你还不理解“位置”,“大小”,“角度”,“轴点”,“动画时长”,“缓速”的具体意思,请参考[移动轨道](../pages/moverow.md)。 + +> 但还是有一点需要强调,在没有做任何房间类设置的情况下,房间1的默认大小是`(100%, 100%)`,而其他的房间都是`(0%, 0%)`。 + +## 以移动摄像头为主的技巧举例 + +**1、**所谓的移动摄像头,画一个三维空间出来也许可以让你更好地理解。它就像是我们举着一台摄像机拍摄自己的家一样,你的手或者身子移动,那么摄像头跟着移动,拍摄下来的整体画面位置就会不同。 + +![拍摄房间里的爱心和海莉](../images/camera-haleyandheart.gif) + +**2、**移动摄像头最基本的用法就是把摄像头跟着节奏晃来晃去,与全程静止不动的背景相比,这样会给谱面增加一些动感。这个轨道移动的弹跳设计原理是一样的,仅仅是呈现的画面效果稍显不同。 + +![移动摄像头让漂浮之心跳动起来](../images/camera-heart.gif) + +**3、**让摄像头移动到画面中你想要突出强调的地方,例如某个轨道,或者是某个你想要展示的物件/画面。 + +![移动摄像头让镜头跟着心跳移动](../images/camera-haleyrow.gif) +![紧张的路吉](../images/camera-nervouslucky.gif) + +## 以移动房间为主的技巧举例 + +**1、平移切换场景** + +和移动摄像头不同,移动房间你可以理解成一个情景剧的拍摄现场,观众和摄像头都是固定不动的,但是要更换场景时,需要道具组挪开先前的场景,放置新的场景。当然了,这种视觉上如同PPT换页动画一般的移动房间形式也只是最基本的。 + +![水平移动切换房间](../images/camera-movehorizontallytochangeroom.gif) + +上图的例子的实现方法实际上是在屏幕之外`(154%, 50%)`的位置放置房间2,然后将房间1和房间2同时向左移动。 + +> 也许你们会觉得,运动是相对的,把房间左移其实和把摄像头右移完全等效,这样的想法是正确的,但要注意在移动摄像头时选择移动“**顶部**”而非某个房间的摄像头。 + +**2、缩放房间** + +房间也是可以放大和缩小的,而且有两种不同的缩放模式。第一种是普通的缩放,需要在黄色版块放置一个“设置房间内容模式”然后将其选择为“拉伸”。另一种类似于剪裁图片,需要在**设置房间内容模式**中选择“保持长宽比”。 + +![拉伸与保持长宽比的区别](../images/camera-strenchmode.gif) + +在拉伸的模式下,如果把画面的一部分镂空(在图片编辑软件里面显示为透明),然后在里面放置其他的画面,让他们一起运动,会产生奇妙的效果。还记得`2-1N`中科尔房间的电脑与武士房间之间放大缩小的转场方式吗?就是靠这个来实现的。 + +![禁 止 套 娃](../images/camera-nesting.gif) + +在保持长宽比的模式下,可以做出`4-1N`这样的转场效果。 + +![4-1N 的转场](../images/camera-minercutscene.gif) + +**3、房间透明度** +**淡入淡出房间**事件倒是没有太多可说的,调节的是房间整体的透明度。同样也可以选择时长和缓速模式。 + +最基本的用法就是把一个房间的透明度从`0`调到`100`,另一个从`100`调到`0`,完成淡入淡出的转场。 + +**4、排列显示房间** + +在[这一节](../pages/room.md)我们介绍过这个功能,但是使用这个软件自带的排列显示房间有一个略显僵硬的限制:房间的上下关系是不可变更的。如果想要自己定义谁在上谁在下,那就不能再使用这个默认功能了,需要我们添加移动房间功能来实现。 + +![放假顺序](../images/camerafx-roomindex.png) + +这样房间顺序就是和默认的相反的。 + +**5、剪裁预置主题** + +我们在[这一节](../pages/settheme.md)中提到了可以在房间中**设置主题**来添加编辑器预制的场景。通过移动房间和摄像头可以在一定程度上改造主题的呈现效果。前文提到的跳动的浮动之心只是其中一例,多尝试尝试可以改造出更多效果。 + +## 演示关卡 + +由于移动摄像头和移动房间两个功能联系十分紧密,我们在设计演示谱面时会把两个功能融合在一起,以和逐一地文字介绍功能的形式进行区分。 + +如果需要先了解移动房间为主的技巧举例,可以先翻阅下一节教程,然后回来看这个演示关卡。 + +
\ No newline at end of file diff --git a/pages/camerafx.md b/pages/camerafx.md new file mode 100644 index 0000000..610865d --- /dev/null +++ b/pages/camerafx.md @@ -0,0 +1,69 @@ +# 镜头带来的额外视效 + +我们在第7节中详细介绍了**浮动文字**事件的所有功能,但是细心的你也许会想到一个问题:功能如此强大的事件却好像并没有设计能让字符移动的办法。 + +没错,它确实没法移动。但是,有条件上,没有条件创造条件也要上。现在我们已经掌握了**移动房间**的功能,也学会了如何把多个房间重叠在一起显示,那么只要房间整个在画面上移动,相对地浮动文字不就也在移动了吗? + +所以本节将会列举一些好用的浮动文字和移动房间组合的方法,供学习参考。 + +## 简单粗暴地移动房间 + +直接让字幕所对应的房间从屏幕外移动进来,就做好了一个飘入式的字幕。 + +![](../images/camerafx-movecamera.gif) + +当然**设置房间内容模式**为“拉伸”之后,你也可以改变房间的大小,这样文字也会跟着变大变小。配合着长按拍子也许会有奇效哦。 + +![](../images/camerafx-strench.gif) + +房间的旋转自然也是有用的,毕竟官方有一个内置主题花房,地面是可以反射出倒影的。如果我们把倒置文本的房间用**淡入淡出房间**将透明度调节到15%,再旋转180°,字幕就会和倒影完美融合。 + +![](../images/camerafx-reflection.png) + +如果将移动房间中的各种小功能组合起来,就能做出非常丰富的字幕效果。 + +![](../images/camerafx-withmoveroom.gif) + +## 再配合移动摄像头 + +当设置房间内容模式为 “保持长宽比” 时,把房间缩小,再把浮动文字写在缩小后的显示范围之外,就看不到了。但是!在这个基础上  移动摄像头,然后把位置移动到浮动文字对应的地方,文字就又能出现了。如此一来,就可以做到在屏幕上的任何位置字幕时隐时现。如果此时再配合  移动房间,就可以做到下面这些效果: + +![字幕在轨道浮动的中间出现并消失](../images/camerafx-cameracroprow.gif) +![列车的门外冒出字了](../images/camerafx-cameracroptrain.gif) + +## 配合自定义滚屏 + +自定义滚屏这个**预设特效**和普通的移动房间不一样,他的屏幕是上下左右接续的。但是只要是移动的屏幕,自然就可以配合浮动文字。为了方便操控文字的出现,一般也可以考虑剪裁房间的大小,并且配合遮罩。接下来就只需要安排好文字出现和消失的时机,文字就会像弹幕一样播放起来了。 + +![飞屋环街记?](../images/camerafx-cameracropwithscreenscrolling.gif) + +## 再配合更多预设特效 + +有不少预设特效是可以对浮动文字产生影响的,如果再把它们利用起来,字幕效果会更加华丽。这里我就不一一截图了,直接放在下面的表格里: + +| 预设特效 | 配合效果 | +| :--- | :--- | +| 自定义屏幕块 | 当然是把字也分成多块,没什么特别的 | +| 自定义滚屏 | 见上面那段 | +| 黑屏 | 不出意外地全黑了 | +| 噪点、干扰 | 对浮动文字无效 | +| 电影噪点、高光、JPEG失真、马赛克、海底波浪 | 正常地产生效果 | +| 怀旧 | 字也会全部偏黄 | +| 灰度 | 字也会全部变成黑白灰 | +| 放克 | 至少你还是能识别出字的 | +| 素描 | 默认的100%强度就是变成黑框字,但是此功能强度值对结果影响巨大 | +| 落雨 | 浮动文字也会产生类似被雨点击打的效果 | +| 暴风雪 | 会覆盖在浮动文字之上,但不对文字产生影响 | +| 其他落花落雪矩阵 | 会在浮动文字之下 | +| 垂直亮纹 | 对浮动文字无效 | +| 屏幕震动 | 对浮动文字无效 | +| 低重音震动 | 正常地产生效果 | +| 颜色反转 | 正常地产生效果 | +| 屏幕翻转 | 正常地产生效果 | + + +## 演示关卡 + +这一节的演示关卡我们引用的是吾夜犹明制作的《Stay》,这个关卡中的歌词字幕方框其实都是一个缩小的房间,让我们看看浮动文字和移动房间两个功能的融合会有怎样的奇效。 + +
\ No newline at end of file diff --git a/pages/captions.md b/pages/captions.md new file mode 100644 index 0000000..da3a0b0 --- /dev/null +++ b/pages/captions.md @@ -0,0 +1,98 @@ +# 其他文字事件 + +## 显示对话 + +在不少剧情关卡里面角色都会有聊天的过程,这在编辑器内也是可以轻松实现的,需要的是紫色版块中的**显示对话**功能。 + +点开后能很清晰地看到文本框,我们就是在这里输入对话。点击右下角的微笑脸可以选择出现的人物立绘:先选择人物,再选择动作。对于使用官方角色的情况下,这是一种比较直观的方法。对于自制角色的立绘表情,将在[这里](../pages/spritesheet.md#选择立绘)介绍,此处暂且不表。 + +下面的三个设置内容都非常直观,就不再多赘述了。 + +![对话事件的属性](../images/captions-dialogueproperties.png) + + +**需要注意的是:** + +**1、**你可以一次性输入多行文本,这样在实际显示时就会在同一对话框内逐步刷新每一行台词;如果使用多个显示对话事件,每个事件只输入一行文本,那么对话框有可能在一个事件之后消失再生成,影响连贯性。 + +**2、**显示对话事件一次只能显示一个对话框,如果前一个事件的台词没有走完下一个事件就开始了,那么前一个会直接被顶替掉。即使设置为屏幕上方和屏幕下方各一个也会被顶替。 + +**3、**一个对话框只能显示两行文字,多出来的会无法显示,请注意分段。分段后需要再输入一次立绘人物,否则立绘就不再显示了。 + +**4、** 如果需要实现像官方教程一样的可以手动跳过的对话框效果,可以添加自定义方法`activeDialogues = true`或`activeDialoguesImmediately = true`。 +- 如果启用`activeDialogues = true`, +在对话事件所在小节已经播放完毕而对话仍未结束时,游戏会等待至游戏音乐的下一个小节开始时继续播放; +- 如果启用`activeDialoguesImmediately = true`, + - 如果对话事件结束时所在小节仍然未播放完毕, + 游戏会等待至游戏音乐的下一个节拍开始时立即从时间轴的下一个小节继续播放。 + - 如果对话事件所在小节已经播放完毕而对话仍未结束, + 游戏会等待至游戏音乐的下一个节拍开始时继续播放。 + +**5、**编辑器会自动识别标点符号,并在标点符号的位置自动添加不同程度的语句停顿,非常智能。但要注意,数学上的小数点“.”是会被判定为英文的句号的,从而产生停顿,非常不智能。 + +**6、**从外界复制粘贴进入的文本中,换行符是有问题的,要退格两次才能被删掉,否则台词会叠在一起;最好的做法当然是不要复制进多余的换行符号。 + +![对话事件](../images/captions-dialoguecontent.png) + +**7、**可以使用对话标签控制对话的显示效果,这些标签总是被包裹在中括号里的。支持的标签如下: + +- `[vslow]` - 非常慢 +- `[slow]` - 慢 +- `[normal]` - 正常速度 +- `[fast]` - 快 +- `[vfast]` - 非常快 +- `[shout]` - 闪烁屏幕,高速显示 +- `[flash]` - 闪烁屏幕 +- `[#]` - 暂停\#秒 +- `[shake]` - 让位于该标签后的文本摇晃。 +- `[shakeRadius=X]` - 若与 \[shake\] 标签相邻,则设定摇晃的距离。 +- `[wave]` - 让文本波浪式摇摆。 +- `[waveHeight=Y]` +- `[waveSpeed=X]` +- `[swirl]` - 让文本以圆周运动的方式旋转。 +- `[swirlRadius=Y]` - 文本转起来 +- `[swirlSpeed=X]` +- `[static]` - 让此前设置移动方式的标签失效,位于该标签后的文本将不受前面的标签影响。 + +**8、**可以使用颜色标签更改文字的颜色,只需按以下格式输入:`要更改颜色的文字`。代码中的颜色可以使用十六进制颜色值(不透明的 #RRGGBB 或包含透明度信息的 #RRGGBBAA) ,也可以使用[Unity富文本的颜色名](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html): + +| 颜色(中文) | 颜色(英文) | RGB | 示例 | +| :--- | :--- | :--- | :--- | +| 黑色 | black | `#000000` | 示例 | +| 银色 | silver | `#c0c0c0` | 示例 | +| 栗色 | maroon | `#800000` | 示例 | +| 红色 | red | `#ff0000` | 示例 | +| 深蓝色 | navy | `#000080` | 示例 | +| 蓝色 | blue | `#0000ff` | 示例 | +| 浅蓝色 | lightblue | `#add8e6` | 示例 | +| 紫色 | purple | `#800080` | 示例 | +| 品红色 | fuchsia / magenta | `#ff00ff` | 示例 | +| 绿色 | green | `#008000` | 示例 | +| 莱姆色 | lime | `#00ff00` | 示例 | +| 橄榄色 | olive | `#808000` | 示例 | +| 黄色 | yellow | `#ffff00` | 示例 | +| 墨绿色 | teal | `#008080` | 示例 | +| 青色 | cyan / aqua | `#00ffff` | 示例 | +| 灰色 | gray | `#808080` | 示例 | +| 橙色 | orange | `#ffa500` | 示例 | +| 白色 | white | `#ffffff` | 示例 | + +## 显示状态牌 + +除了浮动文字和对话框外,游戏里还有两个可以显示文字的事件。**显示状态牌**会在屏幕的左上角弹出一个带文字的状态牌,效果如下: + +![显示状态牌事件](../images/captions-statussign.png) + +状态牌的文字只可以显示一行,最好给状态牌文字设计得简洁一点。如果屏幕上已经存在状态牌,新的显示状态牌事件会修改当前状态牌上的文字,并重置状态牌的显示时长。另外,状态牌不会被任何干扰特效遮挡,是可信度最高的提示,非特殊机制,建议不要用来误导玩家判断或作为干扰。 + +持续时间里的“节拍”可以按,更换为以秒计时。 + +## 弹幕效果 + +另一个事件是**弹幕效果**,会刷出一大堆相同的字符串,同样的,只支持输入一行文字。 + +颜色可以选择单一的颜色,也可以选择随机的彩色。 + +弹幕移动方向也可以选择从左向右或是从右向左,这是个好文明,弹幕能选择方向之后也许会有些奇效。 + +![弹幕事件](../images/captions-danmaku.gif) diff --git a/pages/changegameversion.md b/pages/changegameversion.md new file mode 100644 index 0000000..bfd9904 --- /dev/null +++ b/pages/changegameversion.md @@ -0,0 +1,34 @@ +# 修改游戏版本 + +## 说明 + +目前玩家能玩到的版本实际上有两个,一个是安装游戏时默认的稳定版本,另一个是需要手动选择进入的Beta版本。二者的区别在于,Beta版本更新更快,能更早看到编辑器内新增或改进的功能,但同时也意味着游戏的稳定性更难以保证。 + +如果你是在Beta版本中制作的谱面,那么玩家在普通版本下有可能会在游玩过程中出现演出和你的预想并不相同的情况;甚至玩家有可能压根搜索不到这个关卡,它直接在关卡列表中消失了。 + +但**本教程的介绍为了谋求制作内容上的丰富,使用的是Beta版本**。如果你在看这篇教程时仍然使用的是默认版本,那么你可以: + +* 按照下述操作更新到Beta版本:实际上大多数谱面作者都是这么做的; +* 继续使用默认版本:在你发现你的界面或功能和教程中并不一致时避免惊慌失措,这可能是版本不同导致的。 + +最后说明的是,不论你使用的是哪个版本,由于近期官方对编辑器的更新极为频繁,请务必将游戏更新设置为**始终保持此游戏为最新**,否则真的是……脑壳痛。 + +## 进入方式 + +接下来介绍进入Beta版本的方法: + +第一步,在Steam游戏列表中`鼠标右键`点击节奏医生,选择属性; + +![鼠标右键单击节奏医生弹出菜单](../images/changegameversion-rightclick.png) + +第二步,找到测试版选项卡,并选择**beta - public beta testing**,之后无视掉下面的检查代码,直接关闭这个窗口; + +![在测试版选项卡内选择 beta - public beta testing](../images/changegameversion-select.png) + +第三步,等待200+Mb的更新,此时游戏标题会增加beta字样,说明已经更新到Beta版本了; + +![带有 beta 后缀的节奏医生](../images/changegameversion-beta.png) + +第四步,直接打开游戏即可。 + +> 一切准备就绪,那么开始我们的节奏医生编辑器中文教程吧! \ No newline at end of file diff --git a/pages/changelog.md b/pages/changelog.md new file mode 100644 index 0000000..8d5b447 --- /dev/null +++ b/pages/changelog.md @@ -0,0 +1,341 @@ +# 更新信息 + +#### 2025-06-01 +- 修复了一些小问题,更正了一些错别字 + +#### 2025-05-05 +- 更正了普通拍子、单发拍子和修饰拍子(旧称七拍子、二拍子和不可见拍子)的译名 + +#### 2025-04-26 +- 修复了互动板块加载问题 +- 添加了[工具页面](../pages/tools.md) + +#### 2025-04-24 +- 主题切换时更自然了 +- 添加了小广告 +- 添加了场景坐标互动板块 + +#### 2025-04-19 +- 更新了制作人员表样式 +- 修复了一级目录下子目录的缩进问题 +- 更新了图像块、rdview 块的样式 +- 更新了制作人员表及其样式 +- 将所有外链嵌入了教程页面,并更新了嵌入页面的样式 +- 添加了凹兔隐藏功能 +- 修复了目录选项卡部分区域无法收回的问题 +- 镜厅添加了一个视频 + +#### 2025-02-11 +- 将凹兔迁移到了新网页 +- 更改域名 +- 将旧网页归档至[此处](https://2024.rd.rdlevel.cn) + +#### 2025-02-10 +- 将所有插图迁移到了新网页 +- 更改了所有页面和图片的路由 +- 修复 rdview 的部分渲染问题 + +> 本页面现已完全使用 docsify 驱动。 + +#### 2025-01-09 +- 添加了 RDView 渲染支持 + +#### 2024-11-08 +- 更换了运行框架 +- 替换了页面的地址,现在使用更可读的名称 +- 添加了侧边栏索引图标 + +#### 2024-09-21 +- 由于站长个人原因,此网站转移至 obugs 名下 + +#### 2024-06-01 +- 03\.加入了拖拽缩放时间轴的功能 +- 03\.为时间轴的滚动条加入了播放指示器 +- 03\.增加了快捷键G、H +- 04\.介绍计数音效的自定义选项 +- 13\.为跳拍提示添加了时间间隔 +- 27\.加入了瓷砖精灵图事件 +- ex02\.在预设视效中加入了教程音符和钻石 + +#### 2024-05-13 +- 为事件增加了小图标 +- 将一些图片替换成了可以点击事件的时间轴 +- 07\.加了一张基准图 + +#### 2024-05-05 +- 人员名单增加了!!! +- 出现了自定义的404页面 +- 增加了更详细的偏移教学文档 +- 全新的群号图 + +#### 2024-04-30 +- 新的凹兔看板娘出现了! + +#### 2024-04-06 +- 人员名单增加了!!! +- 采音教程做完了!!! + +#### 2024-03-31 +- 12\.附点普通拍子换了个图 +- 13\.细分拍的描述进行了少量修正 +- 27\.增加了标签递归的内容 +- 31\.精简了还原PV效果的相关内容 + +#### 2024-03-15 +- 16\.重写了心爆相关内容 +- 增加了第32节 +- 索引页加了一些图 + +#### 2024-03-12 +- 08\.显示状态牌增加了以秒计时的介绍 +- 18\.增加了激活其他房间的介绍 +- 19\.增加了剪裁预置主题的描述 +- 增加了31节 + +#### 2024-03-06 +- 更新了附录9 术语英汉对照 +- 更新了一些索引 +- 03\.加速播放实为1.5倍速 +- 12\.区分了附点变速拍和倍速变速拍 +- 13\.更新了冲击拍子 +- 19\.修复一个失效的超链接 +- 28\.恢复了一张失效的动图 +- 29\.增加了埃德加 + +#### 2023-11-17 +- 修正了少量错误。 + +#### 2023-11-15 +- 热烈祝贺第五幕更新! +- 人员名单大量增加了!!!!! +- 全文校对。精炼了语言表述,修改了不准确和不适应当前编辑器版本的内容 +- 考虑到目前教程全文过于冗长,取消了花里胡哨的章节名,改为入门篇、基础篇、进阶篇和补遗篇四大版块。看完入门篇之后剩下的都可以尝试自行探索了,或者在有需求的时候进行自学 +- 将章节序号逻辑递增了(强迫症狂喜) +- 重构了索引页,改成了高频数据速查表,好高级的样子 +- 重编了节奏类型的内容,涉及第04、05、06、12、13节 +- 将移动房间和移动摄像头的技巧合并在一节中 +- 删去了首页的相关链接,放在了附录5中 +- 附录1增加了设置波和注释 +- 网页视频不会再自动播放 +- 更新了少量凹兔Tips +- 由于本次更新工程较大,我们为喜欢怀旧的同学开放了老版本的入口:[2023版](http://2023.rdlevel.cn)、[2022版](http://2022.rdlevel.cn)、[2021版](https://2021.rdlevel.cn)。老版本仅供查阅,我们不再对内容的正误负任何责任。 +- 如有更新不彻底带来的错误,敬请指正。 + +#### 2023-04-09 +- 01\. 更新了部分翻译变化,和图片 +- 03\. 更新了网格捕捉的自定义设置 +- 更正了部分错别字 +- 更新了一些凹兔tips + +#### 2023-04-08 +- 重编了附录7 +- 重编了第21节 +- 更新了缓速的跳转链接 +- 更正了部分错别字 +- 01\. 增加了调色板的介绍 +- 03\. 更新了一些快捷键 + +#### 2022-12-29 +- 修改了部分章节的部分措辞 +- 增加了附录7 + +#### 2022-12-18 +- 修改了部分章节的部分措辞 +- 完善了附录四 + +#### 2022-12-15 +- 赶在2023年到来之前赶紧更新一次吧>_< +- 04\. 更新了鸟叫 +- 05\. 更新了设置波 +- 28\. 更新了延展和透明度 +- 29\. 更新了精灵深度表格,虽然它现在变成图片了 +- ex02\. 更新了被隐藏的预设特效 +- 修改了部分章节的部分措辞 + +#### 2022-10-13 +- 修正了一些表述不准确的措辞。 +- 03\. 书签有了更新;当关卡发生更改且尚未保存时菜单会显示星号 +- 06\. 长按拍松手的时刻允许有按拍了 +- 12\. 增加了新的切分音设置 +- 12\. 修改了变速拍子的描述 +- 24\. 注释事件在可以在红色、紫色、绿色、黄色的版块里找到 +- 24\. 相同标签的一组事件允许横跨多个小节,但这在早版本的编辑器里是不允许的。 +- ex2\. 增加了模糊和径向模糊 + +#### 2022-09-20 +- 教程编写阶段性地完结了。真不容易啊。这个教程一版本一版本地逐渐趋近于心中理想的样子,直到现在,已然是应有尽有。 +- 接下来,就等官方更新游戏了。 + +#### 2022-09-17 +一部分内容从wiki移回了教程。 + +#### 2022-09-16 +在14节加入了一个规范汇总,希望有人能找得到这个地方吧( +善用搜索啊亲们 + +#### 2022-09-14 +偷天换日了一下,12,13,14节的整体架构完全变了。 + +#### 2022-09-13 +突然发现可以把30节给扔到13节里面去,于是就这么做了。 +这节之前写的都是些什么玩意,准备整体重写,好好探讨一下自创机制的问题。 + +#### 2022-08-26 +这个网站从2021年8月23日建立,到现在已经一年啦! +这次可以说是本年度的重磅更新了,加入了非常多的新内容,也重新修订了不少条目: +- 03\. 增加了Ctrl+Y这个快捷键 +- 07\. 修改了浮动文字位置基准的表述 +- 08\. 增加了一些使用对话时的小技巧,以及要注意的点 +- 09\. 新加了一个轴点的二级标题,重新讲了一下这个;虽说这玩意使用率也不是很高但是既然讲了就再讲清晰一点 +- 20\. 修改了关于表情的描述 +- 23\. 几乎是重写了一份,增加了综述,增加了卡带效果的使用实例,增加了设置速度的介绍 +- 24\. 增加了关于筛选事件的功能的介绍,加入了特殊标签的介绍 +- 29\. 增加了深度的描述,增加了用精灵图代替轨道,修改了部分措辞 +- 30\. 关于社区机制的介绍 +- 31\. 准关于条件的介绍 +- 附录1 删除了设置播放模式;在23节介绍了设置速度;修改了一部分翻译不对应的问题和链接不对应的问题 +- 人员名单大量增加了!!! + +#### 2022-07-08 +- 27\. 稍微完善了自定义方法的介绍 + +#### 2022-07-07 +- 18\. 房间遮罩的部分描述一直是有问题的,这是为什么呢( +- 人员名单增加了!!!!!总之感谢NoMath对此的勘误 + +#### 2022-06-02 +- 不要慌,虽然好久不见,但是我还在( +- 这次更新了太多的勘误了所以我也记不太清楚了就随便写几条吧第1节删去了ogg文件转化的部分措辞并且把新建改成了新关卡这么低级的错误竟然一路错了一年同时还加入了勤保存的提示第3节加入了菜单界面的介绍并且加入了几个选择蓝色版块房间的快捷键第4节官方翻译有了变化切换为修饰拍子设置变成了切换为X字拍子设置于是就同步修改了一下文字和相关图片还更正了错别字点击变为电击第11节轨道涂色增加了透明度的相关介绍第12节Node改成了Note +- 摆烂( + +#### 2022-03-23 +- 29\. 终于写了 +- 02\. 官方翻译将“可视化”改为了“可视性”,故同步更新 +- 20\. 删除了“奇技淫巧”部分 +- 03\. 增加了绿色(精灵)版块的描述 +- ex1\. 增加了绿色(精灵)版块的描述 +- 26\. 增加了演示关卡 + +#### 2022-03-01 +- 25\. 更新了伪窗口动效的介绍 +- 26\. 更新了房间视角的介绍 +- 02\. 将标题“创建游戏内置的角色”改为“创建编辑器内置角色” +- 20\. 将标题“制作一个自己的人物”改为“创建编辑器自制角色” +- 增加了附录8 制谱规范指南 + +#### 2022-02-27 +- 编辑器更新了“精灵”版块,我们更新了新文件29.md +- 也不是什么都没做嘛!还更新了一个favicon +- 格式索引中添加了对目前章节序号编排的解释 + +#### 2022-02-08 +- 再次进行了一遍全文校对,修改了若干细节 + +#### 2022-02-06 +- 每一位看到这里的小伙伴新年快乐啊! +- 在这一年里,节奏医生中文社区在逐渐凝聚起来,节奏医生拜年祭也完美收官,一切都在稳中向好。如果你还没有看过拜年祭的话,可以戳[这里](https://www.bilibili.com/video/BV1Tb4y1779W) +- 27\.几乎是重新写了这一节,作为新年第一更吧 +- 人员名单增加了!!!!! + +#### 2022-01-09 +- 增加了第28小节,介绍手! +- 当然还有很多其他细节上的修改就不列举了 + +#### 2022-01-06 +- 好久不见,我又回来了!这次没有大范围的更新,只更新了一些图片,以及图片注释 +- 增加了一个演示关卡,在第14节 + +#### 2021-12-09 +- 05\. 方框单发拍子和三角单发拍子终于更新了 +- 人员名单增加了!!!!! + +#### 2021-12-08 +- 03\. 工作区现在不限制行数了,更新了相关内容 +- 08\. 把颜色的表格做了示例,看上去更直观了 +- 01\. 重新编排了一下关卡设置的部分,这下就尴尬了,第26节只剩一个显示手/手涂色了 +- 26\. 不过倒也不着急,也许以后还是会有一些边边角角的功能更新的,届时再写到此处 +- 00\. 更新了第00节,因为最近发生的一些版本不同步的问题让我们对此有了一些警惕 + +#### 2021-12-07 +- 嘿!我还没忘了更新,这次更新了第19节,它不再是**移动镜头与房间之 3**了,而是变成了**给歌曲加上歌词之 2**!因为我尝试了不少炫酷的字幕显示效果,但是放在前面介绍似乎太早啦,还是应该放在移动房间的介绍之后呢。 +- 07\. 于是这一节的内容编排也就随之改动了 +- 17\. 也是如此 +- 18\. 亦是如此 +- 人员名单增加了!!!!! + +#### 2021-11-20 +- 附录1用手机看全挤在一堆了,所以重新调整了一下表格 +- 08\.弹幕效果事件更新了,现在支持选择弹幕移动方向了 +- 下面是一些牢骚: +> 从五月份开始立项,起稿,到八月份初稿定型,再到十一月正式版本定型,以及视频版教程的立项,不知不觉半个年头就过去了。
+> 当初只是本着一腔热血,觉得自己的谱子有人认可,觉得就应该要为整个节奏医生中文圈子的建设做点什么,
+> 一路过来从最早的word文案,到gitbook电子书,再到现在用个人的服务器,个人的域名,集结了一帮子大佬做网站模板,像素画素材,还有视频演示·解说,
+> 也许这本教程或多或少还有不尽人意的地方,也许最后也只是为了整个圈子做了一点微小的工作,但坚持下来圆满完成一件事情的成就感,无以复加。
+> 感谢你们:每一位参与制作的小伙伴,每一位读到这段话的小伙伴。 + +#### 2021-11-16 +- 加入了演示关卡视频,太棒了! +- 修改了大量语句的表述方式 +- 话说不会真的有人时不时地打开这个页面吧?如果你看到了这条消息,就在饭制部发一句“**凹兔娘我想请你喝机油**”吧,让我知道这个界面是有人看的 +- 26\. 设置音节长度调整到24节 +- 20\. 增加了自制人物文件夹的相关内容 + + +#### 2021-11-13 +- 04\. 修改了不少内容,就不一一罗列了 +- 05\. 同上 +- 06\. 同上 + +#### 2021-11-12 +- 我都不知道更新了些啥( + +#### 2021-10-25 +- 更新了好多界面和内容上的东西,说不清了 +- 上面那条不是重点,重点是现在有凹兔娘了,点她就可以随机获得一条Tips +- 序言里的“我们以后会做视频版教程的”不见了,笑死(咕咕咕 + +#### 2021-10-24 +- 由于Gitbook突然被墙,我们紧急赶制了一个个人网站,现在编辑器教程也就算是基本上恢复了 +- 因为不能保证我们制作的示例关卡的音乐都是有授权的,所以暂时先不把下载链接挂出来了,回头我们还会商议一下怎么弄 +- 界面相对来说还是比较简洁的,就先这么着吧 -_-!! +- 增加了大的章节名称之后,我们稍微调整了一下小节的顺序,但是无论是按目录从上往下阅读还是按数字从小到大阅读其实都不影响 + +#### 2021-09-06 + +- 更新了一些自定义方法 + +#### 2021-09-03 + +- 优化了目录的编排逻辑 +- 鸣谢名单增加了!!!!! + +#### 2021-09-02 + +- 给首页加了个大图,希望加群的人能多一点( + +#### 2021-08-28 + +- 鸣谢名单增加了!!!!! +- 20\. 进行了一个用于导出 json 文件的网页的介绍的加入 + +#### 2021-08-27 + +- 08\. 内置文本颜色的来源勘误 + +#### 2021-08-26 + +- 16\. 画面大小 192 像素 → 198 像素,打字错误 +- 09\. 编辑器修复了自制人物不能单独改变大小的 bug,故随之修改教程内容 +- 20\. 加入了显示文件后缀名的相关提示 +- 12\. 加入一张图片 + +#### 2021-08-23 + +- 27\. 给谷歌文档链接注明了需翻墙 +- 20\. 再次 → 在此 +- 04\. 重新编排了一下普通拍子中自由节拍的介绍 +- 04\. 优化了一下本节的演示关卡和相关说明 +- 05\. 这样的改变间隔在没有提示的情况下是不要去轻易使用的 → 每次改变单发拍子的节奏都需要护士出来提示 +- 05\. 优化了一下本节的演示关卡和相关说明 +- 09\. 增加了新版本加入的仅移动角色和心脏的功能介绍 +- 20\. 加入了一张图片 \ No newline at end of file diff --git a/pages/chartdesign.md b/pages/chartdesign.md new file mode 100644 index 0000000..7c87a2c --- /dev/null +++ b/pages/chartdesign.md @@ -0,0 +1,89 @@ +# 关卡设计 + +在这一节,我想试图告诉你如何避免玩家在玩自制谱的时候感到不明所以。 + +想要理解这一节所讲的内容,也许你得现在脑海中有一个这样的感知:有的关卡虽然难度很高,拍子很复杂,但是你一玩就知道理应在哪里按下,即使你先前都没有听过这首曲子;而有的关卡虽然难度不高,但是你就是弄不懂作者想要做什么样的节奏,完全摸不着头脑。 + +这种区别来自于很多方面。有节奏设计本身带来的,游戏引导提示带来的,也有特效设置合理程度带来的等等。我们会在下面主要讨论。 + +## 符合制谱规范 + +如果做谱不满足大家对游戏基本的共识,那必然会做出让人血压升高的谱面来。我们在前面已经讲述了各种各样做谱时需要满足的规范,但都比较零碎,现在我们在这里进行一个完整的总结,当你做完谱面的时候,可以来这里核对一遍有没有出现如下的问题。 + +**基本信息** + +> 正确设置曲速和偏移值 [详情→](../pages/importandexport.md#调整曲速和偏移) +> +> 正确填写关卡的基本信息,特别是癫痫警告 [详情→](../pages/importandexport.md#关卡设置导出) +> +> 使用ogg格式的音乐进行做谱 + +**节奏设计** + +> 不要把摇摆拍子的摇摆程度拉到最右端 +> +> X记号不要超过四个 +> +> 谨慎设置第一拍X记号 +> +> 谨慎权衡新的机制,避免一关内新机制种类过多或新机制利用不足 +> +> 避免出现两个按拍时间间隔过短,即伪双押 +> +> 避免出现过快的节奏 +> +> 避免过度采音,拒绝塞爆 + +**节奏提示** + +> 正确使用玄凤、口哨来提示1,3,5,7拍,正确使用猫头鹰来提示1,4,7拍 +> +> 正确使用护士来提示单发拍子 [详情→](../pages/oneshotbeat.md#单发拍子基本用法) +> +> 正确使用跳过拍、方块拍、冻结拍、灼热拍、细分拍、冲击拍 [详情→](../pages/moreoneshotbeats.md) +> +> 单发拍子结尾使用`Stop`或者`And`+`Stop`,避免使用`And Stop` [详情→](../pages/oneshotbeat.md#停止) +> +> 正确使用社区机制,允许不对社区机制进行教学 [详情→](../pages/moreclassicbeats.md) +> +> 自创的自由拍子使用电脑演示等提示 + +**音效选择** + +> 轨道一定要设置节拍音效,且不可被音乐掩盖 +> +> 避免两个同时出现的节奏的节拍音效相同或过于相似,即同声共奏 +> +> 避免使用令人分散注意力的音效干扰音乐本身 + +**视觉表现** + +> 拒绝制作伤害视力的画面 +> +> 拒绝使用镜厅+反色,除非你真的确信已经完全掌握镜厅的规律了 + +## 特效与节奏的平衡 + +我们回忆一下官方的所有关卡就能发现,游戏节奏的复杂程度和游戏画面的花哨程度往往都是成反比的。东方不眠夜和咖啡之歌的演出效果非常惊艳,他们的节奏也就并不复杂,从头到尾都是一根轨道。像典雅或者是隐形,节奏设计非常复杂,那么所有轨道都是一行行排开固定不动(或许有一些小范围的移动,但不影响),方便你能看清心电图。 + +在早版本的`4-2`《隐形》里面。轨道还是会颠过来倒过去的,但因为读谱难度过大,官方在后续的版本里删去了这个设计。 + +![看不懂的节奏](../images/chartdesign-unclear.gif) + +从官谱里面总结经验往往是最方便的。总的来说,如果画面的视觉干扰太大的话,玩家的注意力是有限的,就只能面对一个比较稳定的节奏。在里面添加变化的时候,可能会完全观察不到或者反应不过来。 + +## 游戏引导提示 + +这个在上一节里面详细讲述了。上一节主要是介绍方法,这里来讲一讲为什么。节奏医生说到底是一款偏向于打节奏的游戏,而且面向群体很广,作为做谱者不能像其他音乐游戏那样要求玩家的进化速度惊人。我们要做的并非是魔王曲,而是一个能让大多数玩家顺利完成的曲子。对于玩家而言面对一首全新的曲子(很多时候都是全新的,对于全原创的官方谱更是),是并不能预先猜测到会出现怎样的节奏的。节奏医生官方谱里面的节奏到目前为止每一个单独的轨道都不复杂,到现在为止官方还没有让玩家真正操作自由节拍。但即使是这样,游戏的教程环节也占据了很大一部分时长,为的就是让玩家能对接下来会遇到什么有一个心理预期。 + +所以我们在制作自制谱的时候也应该秉承这个理念,虽然没办法加入教程环节,但也可以用各种各样的办法实现类似的效果。 + +## 总结 + +总而言之,我们制作一个谱面的时候,至少要把每一个玩家都当作从没听过这个曲子来做谱。因为你是谱师,这曲子翻来覆去的听,你心里都熟透了;而玩家并不知道这个曲子之后的律动是什么,也就无法知道你究竟会如何设计谱子。 + +**节奏医生是一个让玩家了解音乐的游戏,而不是让了解音乐的玩家来玩游戏。** + +这一节的最后放一个演示关卡,演示的是一些节奏设计的反面案例。这些都来源于玩家真实的反馈,它们各有各的不合理之处。看过视频之后,请尽量避免这些设计,争取让自己的谱面更加规范,这样既能为玩家提供更顺畅的游玩体验,也能为自己的关卡赢得口碑。但这些反面案例并不绝对,重在提示要得当,一切都是为了尽可能减少初见杀而设计的。 + +
\ No newline at end of file diff --git a/pages/classicbeat.md b/pages/classicbeat.md new file mode 100644 index 0000000..2ef988d --- /dev/null +++ b/pages/classicbeat.md @@ -0,0 +1,60 @@ +# 普通拍子 + +## 普通拍子功能介绍 + +第一章介绍了做谱的基本流程以及编辑器的主体界面,第二章开始介绍如何在编辑器中设计基础节奏。 + +首先我们从普通拍子开始。新建一个人物,节奏类型使用默认的“**普通**”。 在工作区随便点击一下就会产生一个带有 7 拍的普通拍子(俗称“七拍子”)节奏,这个节奏一般是比较慢的,如果想改变速度,可以修改左上角的“**拍长**”数值,也可以在下方的工作区直接按住鼠标拖动拍子的两端来缩放。另外`Ctrl + 鼠标滚轮`可以根据当前的吸附设置调整拍长。 + +![普通拍子的基本设置](../images/classicbeat-properties.png) + +第二个选项“**摇摆**”就是剧情模式里老奶奶那样的摇摆普通拍子,可以使用拖动条来调节,对照下方绿色竖线的移动可以很直观地看到摇摆效果。不过拖动滑条你只能得到一些倍数十分规整的摇摆拍子,例如摇摆值为0.25,0.5,0.75等,如果你的音乐里真的有些更为不同寻常的摇摆幅度,那就要直接在框里填写数字了。 + +```rdview 8 9 +eb.AddClassicBeat 1 1[swing=0.25,tick=6]; +eb.AddClassicBeat 1 2[swing=0.5,tick=6]; +eb.AddClassicBeat 1 3[swing=0.75,tick=6]; +eb.AddClassicBeat 1 4[tick=6]; +eb.AddClassicBeat 1 5[swing=1.25,tick=6]; +eb.AddClassicBeat 1 6[swing=1.5,tick=6]; +eb.AddClassicBeat 1 7[swing=1.75,tick=6]; +``` + +> 不要把摇摆程度拖到滑条的最右端,这样会产生一个不带`X`记号但只有2,4,6,7拍的节奏,无法读谱。 + +第三个选项“**按下时间**”就是剧情模式里矿工的长按节奏,我们暂时不算在普通拍子的节奏里,而是放到[这里](/pages/holdbeat)再介绍。 + +## 切换为X字拍子设置 + +如何加入类似于`1-2亲密`的`X`记号呢?在生成一个节奏之后,点击“**切换为X字拍子设置**”就可以调节。需要注意的是:你需要在一串普通拍子开始的**同时**或是**之前**就放置好修饰拍子设置。如果在普通拍子已经响起之后再添加`X`,虽然画面上能即时生效,但是节拍音效是没法立刻改变的。 + +> 在没有节奏的地方放置一连串的“切换为X字拍子设置”来改变`X`的排布也可以视为一种画面演出。 + +当然,这个功能也不仅仅是为轨道加`X`,按下鼠标左键是加入`X`记号,按下鼠标右键一次是`↑`箭头记号,两次是`↓`箭头记号。按下鼠标中键一次是摇摆心跳记号,两次是抖动心跳记号。 + +![设置修饰拍子](../images/classicbeat-rowxssettings.png) + +> 尽量不要在第一拍设置`X`记号,这对纯音押玩家是不可预知的,在轨道数量多的情况下也会显得比较难理清节奏。如果你觉得你的音乐中这段节奏第一拍不放`X`就浑身难受,那也需要打开护士数拍(参考`X-WOT`这关中的`xx-----`)。 + +最后的选项“**分解为自由时长节拍**”较为复杂,我们放到[这里](/pages/moreclassicbeats)再介绍。 + +## 护士节奏提示 + +如果想给一个人物的普通拍子节奏加上“一二三四五六七”的护士报数,需要在红色的版块里面添加一个**设置数拍音效**,然后选择对应轨道的人物。 + +![护士节奏提示](../images/classicbeat-setnursecount.png) + +注意尽量调节到合适的音量大小,不要让护士太吵也不要让她听不清。更不要一次性给好几个轨道加上护士报数,这简直是魔音贯耳。 + +当语音选择“自定义”时,可以给每个拍子设置不同的声音。 + +如果想要在后期关闭报数,需要再添加这个事件,然后点选“**关闭**”。 + +> 如果你想要鸟叫声,它们也属于护士报数,而并非是独立的音效。玄凤、鹦鹉、黄鹂只在1,3,5,7拍有声音,猫头鹰只在1,4,7拍有声音,细尾鹩莺只在1,3,5,6,7拍有声音,金丝雀在1,2,3,4,5,6,7拍都有声音。 +> 口哨声出现在`4-1N`这关,同样只在1,3,5,7拍有声音。 + +## 演示关卡 + +普通拍子能实现的基本功能就是这么多,说了这么半天其实都不如实际上手做一个谱,这里我们给大家展示一下仅包含普通拍子的成品是什么样的。 + +
\ No newline at end of file diff --git a/pages/condition.md b/pages/condition.md new file mode 100644 index 0000000..f2cf181 --- /dev/null +++ b/pages/condition.md @@ -0,0 +1,59 @@ +# 条件 + +## 概述 + +有些事件我们是想要在关卡中达成特定状态后才生效,否则不生效的,想要做到这样的效果就必须用到“条件”功能。有两种打开条件菜单的方法: + +**1. 在选中一个事件时点击位于左上角的指路牌按钮** + +![](../images/condition-header.png) + +**2. 点击紫色版块中的“条件”按钮** + +![](../images/condition-actiontab.png) + +条件菜单是这样子的: + +![](../images/condition-menu.png) + +创造条件一共需要进行两个大的步骤,第一步是在总的条件列表里面添加条件,第二步将添加好的条件插入具体的事件中。下面我们分别进行说明。 + +## 创建一个条件 + +我们点击“新建……”就能开始编辑一个新的条件,里面有如下参数可以设置: + +![](../images/condition-properties.png) + +**标签**:无任何实际作用,只用于显示,且不能使用中文。 + +**描述**:鼠标停顿在小旗子上时显示的字,写入中文会显示一片空白。 + +**类型**:分为五种: + +- **上一击** 基于上一次击中节拍的结果进行判断。可以进一步限定轨道和击中结果。 +- **自定义** 基于表达式的结果进行判断。这是一个较为复杂的条件类型,更多细节将在后文中说明。 +- **执行次数** 基于事件被执行的次数进行判断。注意:为了使一个事件被执行多次,你的关卡中必须存在循环或标签调用。 +- **语言** 基于当前的游戏语言进行判断。可以用于使关卡中的浮动文字和对话内容根据游戏语言的不同而显示不同语言。 +- **玩家模式** 基于当前的玩家数量(单人/双人)进行判断。 + +**删除**:删除这个条件。需要注意的是,删除条件的同时也会使关卡中的所有事件不再附有这个条件。 + +创建条件之后,把鼠标移到条件之上可以选择对条件进行复制和修改。分别对应点击下图中的复制和修改按钮。 + +![](../images/condition-buttons.png) + +## 为一个事件添加条件 + +在条件列表里面写好一大堆条件之后,你就可以把它们放进具体的事件中了。点击一次条件出现蓝框,代表只有这个条件成立时才执行事件;点击两次条件出现红框,代表只有这个条件不成立时才执行事件。如果你一次选择了好几个条件,那就必须要让所有选出来的条件都达到要求事件才能成功执行。 + +![上一击完美且游戏语言不为英语时执行事件](../images/condition-addtoevent.png) + +将鼠标移到一个事件的指路标之上,会显示这个事件所附有的所有条件。 + +![](../images/condition-mouseonevent.png) + +## 条件持续时间 + +位于右上角的钟表图标可以让你为条件设置**持续时间**,默认值是0,即时间轴经过这个事件的瞬间判定是否满足事件规定的条件。如果你放宽这个判定的时间跨度,就可以填写这个持续时间。 + +需要注意的是,事件所附条件会在持续时间内的**每一帧**都被判断一次,这也意味着一个事件可能在他的条件持续时间内被反复执行。举例来说,一个带有8拍持续时间的事件会在他所在时间点接下来的8拍内不断检测是否所有条件都被满足,这可能会使这个事件被触发多次。 \ No newline at end of file diff --git a/pages/createbuiltincharacter.md b/pages/createbuiltincharacter.md new file mode 100644 index 0000000..2f6fe08 --- /dev/null +++ b/pages/createbuiltincharacter.md @@ -0,0 +1,43 @@ +# 创建游戏内置角色 + +有了音乐之后就需要添加角色轨道了,与轨道相关的功能在蓝色的版块。编辑器默认存在一个武士的普通拍子轨道。 + +![关卡默认存在的武士轨道](../images/createbuiltincharacter-samurai.png) + +如果想要更多轨道,在蓝色的版块按一下`+`按钮就可以新增一个轨道,每个房间最多创建四个轨道。 + +![每个房间最多容纳 4 个轨道](../images/createbuiltincharacter-fourrows.png) + +另外,你也可以点击上方的`房间 1234`来更换房间,如果在每个房间都创建一个角色,那么效果就类似于,他们的背景是可以互不相同的。有关房间的详细介绍我们放在了[这里](../pages/room.md)。 + +![轨道可以分布在不同的房间](../images/createbuiltincharacter-seperaterooms.png) + +也就是说,编辑器最多支持`4×4=16`名角色。 + +![16 轨](../images/createbuiltincharacter-16samurais.png) + +在新建一个角色之后需要对角色的基本设置进行调整,共有如下选项。 + +![轨道的设置界面](../images/createbuiltincharacter-rowinfo.png) + +**类型:**“**普通**”表示像武士一样的普通拍子节奏,“**单发**”表示像咖啡师一样的单发拍子节奏。需要注意的是,切换轨道类型的同时也会清空轨道上的所有节拍,因此建议在一开始就确定好轨道的类型。 + +**玩家:**P1,P2表示玩家1和玩家2,CPU表示电脑演示。 + +> 在单人模式下游玩时,设置的2p轨道会自动转为1p轨道,所以设置2p轨道时可以同时兼容单人模式和双人模式。 + +**角色:**就是选择人物的地方,点开箭头,游戏内已有的人物都在里面,也可以用`×`代表无人物。右边的文件夹按钮是导入自己设计的人物,这个功能会在[自制角色与精灵资源](../pages/spritesheet.md)详细介绍。 + +**节拍音效:**也就是绿色轨道上的节奏会发出什么声音。如果你不知道选什么音效合适就一个个多试试。这里也同样支持导入自己设计的音效,只需要按下右边的文件夹按钮选择音频文件即可。 + +**重新排列:**用来调整四个人物的上下顺序,不过多介绍。 + +**房间:**可以把一个角色整体移动到其他的房间去,也不多介绍。 + +**可视化:**可以把轨道隐藏,隐藏时在游戏画面里就不会看到这个角色,但是节奏会正常进行。 + +**删除:**删除角色。 + +另外,在人物图像右边的这个绿色心电图是可以点击的,点击后再播放音乐,即使这个人物有节拍也不会播放。如果想要专门听清某个轨道的节奏就可以将其他先静音。 + +![禁用轨道](../images/createbuiltincharacter-muterow.png) \ No newline at end of file diff --git a/pages/credits.md b/pages/credits.md new file mode 100644 index 0000000..f97896c --- /dev/null +++ b/pages/credits.md @@ -0,0 +1,60 @@ +
+ +## 制作人员表 + +- 文档编撰: + - [山不转水到渠成](https://space.bilibili.com/4870582) + - [Sterix_Craft砹氪硒](https://space.bilibili.com/349090681) + - [T_Terrence](https://space.bilibili.com/455443751) + - [mfgujhgh](https://space.bilibili.com/1369651) + - [喜欢精灵宝可梦的黄黄](https://space.bilibili.com/589687399) + - [卢毅](https://space.bilibili.com/26101629) + - [RaYmondCheung](https://space.bilibili.com/1579208) + - [NoMathExpectation](https://space.bilibili.com/184862524) +- 视频制作: + - [吾夜犹明](https://space.bilibili.com/29219948) + - [山不转水到渠成](https://space.bilibili.com/4870582) + - [T_Terrence](https://space.bilibili.com/455443751) + - [是-玉玉-啊](https://space.bilibili.com/72337040) + - [丘露帆](https://space.bilibili.com/365306801) + - [o0O0o0l0o0O0o](https://space.bilibili.com/272324550) +- 技术支持: + - [ud2_](https://space.bilibili.com/36068407) + - [mfgujhgh](https://space.bilibili.com/1369651) + - [o0O0o0l0o0O0o](https://space.bilibili.com/272324550) + - [NoMathExpectation](https://space.bilibili.com/184862524) + - [obugs](https://space.bilibili.com/498017546) +- 关卡引用: + - [吾夜犹明](https://space.bilibili.com/29219948) + - [山不转水到渠成](https://space.bilibili.com/4870582) + - [obugs](https://space.bilibili.com/498017546) + - [解说员印豆白](https://space.bilibili.com/301077767) + - [Winkle雪线](https://space.bilibili.com/2198423/) + - [NoMathExpectation](https://space.bilibili.com/184862524) + - [3q4a](https://space.bilibili.com/226610908) + - [卢毅](https://space.bilibili.com/26101629) + - [魔法少女亚梓莎](https://space.bilibili.com/89836540) + - [狗小白](https://space.bilibili.com/1129425006) + - [sleepy101](https://space.bilibili.com/299915682) + - 慕萄 +- 表格维护: + - [自定义方法表](/pages/appendix_custommethods.md) + - [RaYmondCheung](https://space.bilibili.com/1579208) + - [ChocoWeat](https://space.bilibili.com/588693542) + - [制谱规范](/pages/appendix_levelrules.md) + - [o0O0o0l0o0O0o](https://space.bilibili.com/272324550) + - [相关资源](/pages/appendix_resources.md) + - [mfgujhgh](https://space.bilibili.com/1369651) + - [英汉对照](/pages/appendix_translations.md) + - [obugs](https://space.bilibili.com/498017546) +- 特别鸣谢: + - [IcedDog_冷狗](https://space.bilibili.com/357428794) + - [月之头脑小永琳](https://space.bilibili.com/259265677) + - [瓶子RAC](https://space.bilibili.com/1579208) + - [无名菜鸟君_](https://space.bilibili.com/348935136) + - [来因洛特](https://space.bilibili.com/406743035) + - [普通且平平无奇的人](https://space.bilibili.com/634704103) + - [花米酱](https://space.bilibili.com/37545809) + - [末影苦力怕](https://space.bilibili.com/322387132) + +感谢《节奏医生》全体制作组为我们呈现了如此精彩的游戏,并在我们撰稿的过程中提供了大量帮助。 \ No newline at end of file diff --git a/pages/custommethod.md b/pages/custommethod.md new file mode 100644 index 0000000..275c51e --- /dev/null +++ b/pages/custommethod.md @@ -0,0 +1,99 @@ +# 自定义方法 + +## 功能介绍 + +编辑器中有一部分内容是没有以独立的事件的形式来设计的,也就是说,没有办法直观地设置这些内容,而是需要以代码的形式对游戏内的变量进行赋值,或是执行一些函数,这就是**调用自定义方法**。如果对编程没有太多了解的话,也许会觉得这个功能略有门槛。但没关系,可以不用试图去理解太多背后的原理,只需学会如何使用自定义方法就好了。下面我将以一系列的例子来介绍具体的使用方法,其他没有介绍的自定义方法可以在[这里](https://docs.qq.com/sheet/DQUJxb0puSFFOVWpz)中查表进行举一反三。 + +## 基本格式 + +在使用自定义方法前,先来了解一下自定义方法表里的基本样式,搞清楚各个单词代表的功能: + +![以调整失误权重的方法为例](../images/custommethod-grammar1.png) + +与程序上函数的写法非常类似,括号框起来的即为使用时需要替换掉的单词。**简单点说,括号内的粗体字**(也即图里的变量名)**需要自行填入相应的数字,而没有加粗的部分直接删掉即可。** + +在表格里,你可能会遇见以下这种相对不规范,但更好理解的自定义方法格式: + +![](../images/custommethod-grammar2.png) + +这种写法的自定义方法只要填入相应数值并去掉 `<>` 即可。**注意 `str:` 也要一并填入** + +那么接下来你可能会有新的问题:我怎么知道这个单词需要填入怎样的数值呢? + +还记得图里面蓝色下划线的数据类型吗?它就给你指出了需要填入的数值格式: + +### 数据类型 + +#### 布尔型(Bool) + +布尔型是最好理解的一种数据类型,它能够包含的值只有两个,就是真(true)和假(false),就也可以想象成让某个功能开启和关闭。举个最常用的例子,在`4-4`懂你这关中,单发拍子的轨道是可以抖动的,与其相关的参数是 wobblyLines, 如果你在自定义方法中输入`wobblyLines = true`: + +![注意大小写不能错](../images/custommethod-wobblylines.png) + +轨道就会变成这种抖动形式。 + +![懂你](../images/custommethod-knowyou.gif) + +如果你想要在后面关掉这个功能,那么就再加入一个自定义方法,填上`wobblyLines = false`,这样抖动效果就取消了。 + +#### 浮点型(Float) + +显然很多参数并不仅仅只用开启和关闭两个状态就足够了,它可能是需要用一个数值来控制的。我们在其他的事件中也经常需要填入各种值,例如轨道的位置`(0~100%)`,节拍的长度等等。这个值可以是整数也可以是小数,总之他得是一个数字。举个例子:statusSignWidth这个参数可以控制**显示状态牌**的实际宽度。默认情况下它是会自动适配文本量的,如果想要固定在某个宽度,我们在自定义方法中输入例如`statusSignWidth = 199.99`: + +![](../images/custommethod-statussignwidth.png) + +状态牌就比文字部分更长了。 + +![](../images/custommethod-nuclear.png) + +你也可以在编辑器里试试其他数值,甚至是负数。 + +#### 整型(Int) + +有的参数也并非是允许填写任意的数字的,它必须得是一个整数,诸如指定第几号房间,第几号轨道或是移动多少个像素都是如此。举个例子,想要打开或是关闭某个房间的地面反射效果,在自定义方法中输入`DisableRowReflections(0)` + +> **注意:自定义方法里四个房间的编号并非是 1, 2, 3, 4,而是 0, 1, 2, 3。轨道编号也是如此。** + +![](../images/custommethod-disablereflection.png) + +这样第一个房间中就不会再出现反射效果了。 + +![关闭和开启反射](../images/custommethod-reflection.png) + +#### 文本型(String) + +有些参数的值既不是开/关,也不是数字,它必须得是用一串词才能描述出来,比如游戏里角色的名字。这里介绍一个自定义方法,可以随时修改轨道上对应的人物,其函数是ChangeCharacter,里面需要填两个空,分别是角色的名字(文本型),以及轨道的编号(整型),中间用英文逗号隔开。举个例子,我们要把第1个轨道的科尔变成洛根(他的角色名字是**Boy**),在自定义方法中输入`ChangeCharacter(str:Boy, 0)` + +![](../images/custommethod-changecharacter.png) + +就能替换人物了。 + +## 注释类自定义方法 + +还有一种特殊的自定义方法,代码是由“`()=>`”开头的,需要在紫色版块中添加一个**注释**,然后直接写在注释里。举个例子,有些内置主题的实际大小是超出一个屏幕的,例如`4-1`中的火车,我们也能在关卡中看到镜头在火车上的移动。这并非是只用移动摄像头就能做到的,而是需要移动“真实摄像头”。举个例子,我们把主题就设置为夜之列车,然后在注释中输入`()=>trueCameraMove(0, 0, 45, 1, Outsine)`: + +![](../images/custommethod-truecameramove.png) + +这里头要填写的变量有些多,但本质上也并没有太多区别,只要我们明确每个地方要填进去什么就可以了。第一个数字指的是房间号(整型),第二个数字指的是移动x轴的像素量(整型),第三个数字指的是移动y轴的像素量(整型),第四个数字指的是移动镜头的动画时长(浮点型),最后一个要填写的是缓速模式(枚举型)。不必太在乎什么叫做枚举型,你要做的就和设置移动房间与摄像头无异,区别只不过需要自己打字进去而已。 + +![](../images/custommethod-3-1n.gif) + +## 执行时间与排位顺序 + +你可能发现了,自定义方法里除了填写方法名称的框之外,下面还有两个参数:`执行时间` 和 `排位顺序`: + +![](../images/custommethod-wobblylines.png) + +通常而言**这两个参数保持默认设置即可**,需要更改这两个参数的特殊情况在表里也会有特殊说明,按照说明设置即可。但在这里还是要说说具体作用: + +`执行时间`:拥有两个选项 `OnBar` 和 `OnPreBar`。默认为 `OnBar`, 即时间到达这个事件时立刻执行。而另一个参数 `OnPreBar` 则会让这个事件提前`600ms`执行。(这也是为什么需要避免600ms以上偏移) + +`排位顺序`:同一时间设置多个自定义方法时,你可能需要让这些事件按一定顺序生效,这个时候就需要设置这个参数了。这个参数支持负数,数字越小,事件越早生效。 + +## 我知道你还想问什么 + +你也许会有这种疑问:为什么官方要设置一个“调用自定义方法”,像写代码一样完成一些明明是很成熟的功能和特效?为什么不把它们也做成普通的事件直接添加就好了? + +按照官方的说法,凡是官方图中有,但编辑器内没有的效果,都是官方并不希望在自制图里被玩家大量使用的。有些功能会考虑到在某些特定的剧情关里使用一次,比较应景,但并不一定适用于绝大多数关卡。~~当然,也有一部分功能是没来得及做界面而暂时以自定义方法的形式出现。~~ + +总之,不使用“调用自定义方法”完全不妨碍每个玩家制作出优秀的关卡。使用这些,甚至更丰富的“条件”功能,甚至在编辑器里编写各种逻辑事件,只能起到锦上添花的作用。归根到底这依然是一个普通的可音押的单键节奏游戏,节奏的排布,镜头的运用,素材的创意,才是自制关卡的核心。 diff --git a/pages/decoration.md b/pages/decoration.md new file mode 100644 index 0000000..5ab7a05 --- /dev/null +++ b/pages/decoration.md @@ -0,0 +1,143 @@ +# 使用精灵 + +## 精灵是什么 + +实际上回答这个问题之前不如先说一说“在没有精灵功能之前的编辑器版本中能够做些什么”。如果我们需要创造一些小物件放在屏幕上移动或者变化,但是又并不需要对其设计节奏,例如花草树木,云彩鸟儿,爱心,圆圈方块图形等等,那么必须将其作为一个自制人物导入进来。使用**移动轨道**来操作。 + +但是这样制作小物件并不方便,并且也受轨道最多数量为16个的限制。于是这个功能被单独拿出来作为一个版块了,称之为“**精灵**”。 + +## 制作一个精灵 + +从上面的描述我们也能直观地感受到,实际上精灵就是一个简化的自制人物。如果你想到了这一层的话,那么看完第20节也就学会制作精灵了。将制作好的自制人物精灵图和json文件直接作为**精灵**导入进编辑器是没有任何问题的。 + +不过精灵功能支持一个更为简便的做法:如果你的精灵就只是一张仅有1帧的精灵图,那么是可以不写json文件的,直接导入即可。 + +导入精灵之后首先要进行基本设置: + +![](../images/decoration-menu.png) + +**精灵图数据**:右方的文件夹图标即可导入精灵; + +**重排序**:和轨道排序一样,决定精灵在画面上的上下层关系; + +**房间**:规定精灵所在的房间; + +**可见性**:决定精灵在初始状态下是否可见,默认为可见,但建议都选为隐藏; + +**深度**:**只能填整数但可以是负数**,决定精灵在画面上的上下层关系,深度判断的优先级高于重排序,也就是说深度不同的两个精灵,深度值越大精灵越处于下层,深度相同的两个精灵,排序越下精灵越处于下层; + +这里需要额外介绍的是,每个房间的四个轨道也都是有固定的深度值的,且无法被改变,如果你想要让精灵去到轨道的前方,就要填写比轨道深度值更小的数字。 + +![轨道、手、击打效果的深度值](../images/decoration-depth.png) + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +**删除**:删除这个精灵。 + +## 移动精灵图 +移动精灵图的设置和轨道移动如出一辙,仅有少量的区别,详细设置如下: + +![](../images/decoration-move.png) + +**位置:**将精灵移动到填写的位置,默认参考的是精灵的中心点坐标,`x`为横坐标,`y`为纵坐标(左下角坐标:`0%, 0%`;右上角坐标:`100%, 100%`),左侧的红十字准星选择后可直接点击视窗选择位置。点击右方的`%`按钮可以改为输入像素值(左下角坐标:`0, 0`;右上角坐标:`352, 198`)。如果填写的值小于`0%`或者大于`100%`精灵会移动到屏幕之外,但是是可行的。 + +**大小:**精灵的大小,分为`x`(精灵宽度,即横向)和`y`(精灵高度,即纵向)两个变量,单位必须为百分比(`%`)而不能是像素,这点需要注意(初始大小为`x: 100%,y: 100%`)。注意,这两个值都是可以填写负数的,例如`x: -100%`即为水平镜像翻转,`y: -100%`即为垂直镜像翻转。 + +**角度:**即旋转的角度(一周`360°`),正数为顺时针转动,负数为逆时针转动。计算规则为与`0°`(初始位置)的夹角,而非与当前位置的夹角。打个比方第一次旋转了`90°`,第二次还想再旋转`90°`的话就应该填写`180°`,第二次想旋转回原始位置的话就应该填写`0°`。 + +**轴点:**设置位置和缩放的基准点,相比于轨道,精灵需要设置两个变量,`x: 50% y: 50%`为角色的中心位置,也是默认位置。 + +**动画时长:**执行动画的时长,单位为节拍。如果此处填写`0`则是瞬间完成移动。填写负数则视为`0`。 + +**缓速:**动画的速度变化,可自行尝试。这东西在很多需要持续一段时间的特效里都会存在,里面会有很多模式,只要把握以下原则就能快速明白了:`In`代表由慢至快,`Out`代表由快至慢,`InOut`代表由慢至快再变慢。后面不同的形式也就是快慢速的细微差距,可以根据自己的需要慢慢尝试。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 绘制精灵图 +绘制精灵图和轨道涂色如出一辙,仅有少量的区别,详细设置如下: + +**边框:**边缘的三种样式。自左向右分别为:无边框,轨道边缘线,轨道阴影(除无边框外均可设置颜色)。 + +**涂色:**轨道内部全部涂成一个颜色,选择“开启”后可选择要涂色的颜色。 + +**透明度:**可以直接更改精灵的透明度。 + +**时长与缓速:**和其他特效中的完全一致,不过多赘述。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 播放表情 +播放表情仅有一个改变表情的功能。和自制人物的改变表情不同的是,改变精灵的表情只能是持续生效的,没有“一次”的选择。 + +## 显示/隐藏 +显示/隐藏可以更改精灵的显示或隐藏状态。建议在初始状态设置为隐藏,在需要的时候改为可见,用完之后继续隐藏。 + +## 瓷砖精灵图 +瓷砖精灵图可以让精灵直接做成平铺状态,但是保持原像素大小。 + +**平铺:**把原图平铺成长宽各多少份。 + +**偏移:**填写0~1的小数进行偏移,偏移的矢量方向为图像右上指向左下。 + +**速度:**平铺图的移动速度。 + +**时长与缓速:**同其他事件。 + +## 精灵的使用技巧 + +**1、作为场景物体** + +最基本的用法,作为场景里的物件,便于做出动画效果。别看一句话就概括完了,仅这一条,加之较多的精灵数量就已经能做到相当复杂的视觉呈现了。 + +![](../images/decoration-ablackboard.png) + +**2、精灵作为文字** + +除了使用浮动文字,还可以将文字的图片作为精灵导入,来实现移动文字、染色等更高级的效果。因为是以图片的形式,原理上你是可以自己在绘画软件中写好字再导入的,这就是属于你的专属字体。 + +![](../images/decoration-text.gif) + +**3、作为镜厅遮罩** + +将一块纯色的精灵赋予极低的透明度,即可使精灵覆盖的区域不受镜厅影响,保持精灵的颜色,同时保留精灵后面的画面。 + +![](../images/decoration-mask.png) + +**4、用精灵替代轨道** + +内置的轨道功能里轨道线总归都是连为一体的,在有了精灵之后,我们能够最直观想到的做法就是,把轨道的每个部分都做成一个精灵,这样每个脉冲单位都可以独自进行移动了,他们随时可以分散,可以整合,可以拼接成各种有趣的形状。 + +更进一步地想想,轨道其实也不一定非得是轨道的样子,只要做七个一模一样的物件按照节奏变化,那么都可以替代标准的普通拍子。 + +![将轨道转化为海星](../images/decoration-star.gif) +![将轨道转化为蜡烛](../images/decoration-candle.gif) +![将轨道转化为冰与火之舞](../images/decoration-adofai.gif) + +所以当你千辛万苦阅读了二十多个章节来到这里的时候,是时候尝试一次跳出节奏医生玩法本身的框架了,也许能寻找到一个独具一格又眼前一亮的玩法。 \ No newline at end of file diff --git a/pages/editorinterface.md b/pages/editorinterface.md new file mode 100644 index 0000000..28a7fb3 --- /dev/null +++ b/pages/editorinterface.md @@ -0,0 +1,163 @@ +# 编辑器界面和快捷键 + +## 预览画面 + +这一节介绍进入关卡编辑器时能直观看到的界面。下图这个黑框,就是我们关卡制作时预览画面的地方。 + +![预览区](../images/editorinterface-previewarea.png) + +下面的这些图标的功能也很直观: + +![播放设置](../images/editorinterface-playingsettings.png) + +**左边绿色**的是自动开关,打开以后就会自动按拍子; + +**中间黄色**的是切换单双人模式的开关,点击就会变成两个小人,如果你想测试双人轨道的话可以点开这个; + +**右边蓝色**的是节拍器,是专门用来找节奏的,点开它可以方便校对BPM和偏移。 + +![播放设置](../images/editorinterface-playingsettings2.png) + +**\|<<:**一般是会倒退到最左边的,如果你添加了书签(在下面有介绍),就会倒退到最近的一个书签处。 + +**\|<:**回到上一小节,也就是倒退到上一个数字的位置,**该功能仅在暂停播放时有效**。 + +**▶:**中间白色的是播放/暂停按钮,**按住**`Ctrl`**再点击播放可以0.75倍速播放**,**按住**`Shift`**再点击播放可以1.5倍速播放**。 + +**>\|:**跳到下一节,也就是快进到下一个数字的位置,**该功能仅在正常播放时有效**。 + +**窗口倍数:**设置预览窗口放大倍数,可以选择1倍或者是多倍。 + +**全屏放大:**可以将预览窗口拓展到全屏,很全面地看到这个关卡在正常游玩时呈现的情况。 + +![预览设置](../images/editorinterface-previewsettings.png) + +右上角还有三个按钮,分别是:变更窗口动效播放模式、全局开启/关闭音量、截图。 + +## 时间轴 + +![时间轴](../images/editorinterface-timeline.png) + +左边这个长长的水平滚动条可以理解为进度条,可以拖拽、点击,也可以用鼠标滚轮来移动。 + +`-`号和`+`号用于缩放网格,放大可以进行更精细的操作,缩小可以看到更多的事件。 + +磁铁符号为网格捕捉功能。一开始默认是`1/4`,即在工作区里拖动事件的最小移动单位是四分之一格,也就是四分之一拍,`左键点击`这个按钮可以缩小单位,`右键点击`则会放大这个单位。多次左键点击之后则会激活自定义模式,可以直接手动输入一个正整数。 + +最右边的按钮就是跟随进度条,会让时间轴在播放音乐时保持在工作区的正中间。 + +下方带有阿拉伯数字的区域是标尺栏,`左键点击`可以跳转至相应小节的开头。`右键点击`可以放一个蓝色书签。放置书签后,点击前面介绍的倒带 **\|<<**,则会跳到这个标签位置。按住`Ctrl`或者`Shift`再`鼠标右键`点击书签可以改变颜色,支持蓝、绿、黄、红四种颜色循环切换。进度条上也会显示书签的位置。 + +![书签](../images/editorinterface-bookmarks.png) + +还有一种白色的标尺显示的是正在预览播放的位置。 + +## 工作区 + +在这一大堆网格里面,点击左键可以添加一个事件,点击右键可以删除一个事件。重叠在一起的多个事件可以通过多次点击左键找到。 + +![工作区](../images/editorinterface-editingarea.png) + +工作区一共分为五个部分,分别是**声音**,**轨道**,**动作**,**精灵**以及**房间**,在本教程中为了便于理解,我们直接按照颜色将其命名为了红色蓝色紫色绿色以及黄色版块。 + +蓝色和黄色版块最多只能有四行格子,但是红色,绿色和紫色版块是没有上限的。在水平滚动条的左边,**▲**按钮可以展开格子,也可以按住拖拽;旁边的按钮可以压缩显示格子。 + +![水印](../images/editorinterface-mark.png) + +既然对工作区的行数没有限制,那么在里面写字画画来充当作者水印也是完全可行的。 + +## 菜单 + +界面左上角的**菜单**按钮点击展开后有如下条目: + +![菜单](../images/editorinterface-menu.png) + +**\***:当关卡发生更改且尚未保存时菜单会显示星号 + +**新关卡**:新建一个谱面。 + +**打开**:打开一个保存过的谱面文件。 + +**打开main**:打开一个最近保存过的谱面文件(当然也不一定就是main啦,是你的谱面文件夹和文件名)。按住`Ctrl`之后就会变成**显示main**,这时再点击就会打开谱面所在的文件夹。 + +**打开URL**:插入链接到包含节奏医生关卡的.rdzip文件或.zip文件的URL(为什么这里有六个点呢,很奇怪)。 + +**保存**:当然是用来保存的。 + +**另存为**:保存为额外的一个文件。 + +**导出以发布**:导出以发布:将谱面导出为 .rdzip 文件,或将谱面上传至创意工坊。 + +**退出**:退出编辑器,记得先保存。 + +**界面大小**:按`-`和`+`按钮改变各个界面的大小。 + +## 设置栏显示模式 + +对于一些带有右侧拖动条的事件,点击拖动条下方的小按钮可以改变编辑器的整体布局。 + +![布局](../images/editorinterface-grid.gif) + +## 快捷键 + +说完这些最基本的功能后我们来认识一下常用的快捷键。这部分一定要好好看看。 + +| 按键 | 效果 | +| :--- | :--- | +| `A` | 打开/关闭电脑演示 | +| `M` | 打开/关闭节拍器 | +| `F` | 打开/关闭全屏显示预览画面       | +| `P` | 播放/暂停 | +| `PageUp` | 重新开始当前小节 | +| `PageDown` | 跳至下一小节 | +| `Home` | 回到关卡开始,如果已经设置书签,则回到第一个书签处 | +| `J` | 进度条向右移动 | +| `K` | 进度条向左移动 | +| `G` | 进度条跳转到上一标签 | +| `H` | 进度条跳转到下一标签 | +| `1` | 切换到红色版块 | +| `2` | 切换到蓝色版块 | +| `3` | 切换到紫色版块 | +| `4` | 切换到绿色版块 | +| `5` | 切换到黄色版块 | +| `Ctrl + 1` | 切换到蓝色版块1号房间 | +| `Ctrl + 2` | 切换到蓝色版块2号房间 | +| `Ctrl + 3` | 切换到蓝色版块3号房间 | +| `Ctrl + 4` | 切换到蓝色版块4号房间 | +| `Ctrl + W` | 调整窗口模式下窗口的大小 | +| `Ctrl + +/-` | 缩放界面大小 | +| `Ctrl + Shift + ↑/↓` | 调整预览区与工作区的屏占比 | +| `Ctrl + O`\(字母\) | 打开关卡 | +| `Ctrl + S` | 保存关卡 | +| `Ctrl + N` | 新建关卡 | +| `Ctrl + U` | 从URL地址打开关卡,弹出对话尚不支持键盘 | +| `Ctrl + Shift + P` | 发布关卡,弹出对话尚不支持键盘 | +| `Alt + Q` | 退出编辑器,返回主菜单 | +| `Shift + F1` | 显示提示(之前的快捷键为F1) | +| `Tab` | 打开帮助 | + +| 按键 | 效果 | +| :--- | :--- | +| `Ctrl + X` | 剪切 | +| `Ctrl + C` | 复制 | +| `Ctrl + V` | 粘贴 | +| `Ctrl + D` | 将所选的事件原地复制粘贴一份 | +| `Ctrl + B` | 粘贴到下一个小节的同一拍 | +| `Ctrl + Shift + V` | 粘贴到下一个小节的同一拍 | +| `Ctrl + Z` | 撤销 | +| `Ctrl + Y` | 还原刚才的撤销 | +| `Ctrl + 左键` | 隐藏这个事件,再点一次取消隐藏 | +| `Shift + 左键` | 逐个点击选择多个事件 | +| `Alt + 左键拖拽空白区域` | 框选多个事件 | +| `Alt + 左键拖拽事件` | 快速复制并拖拽出选定的一个事件或多个事件 | +| `Shift + Home` | 把某根轨道里所选事件之前的所有事件都一起选择 | +| `Shift + End` | 把某根轨道里所选事件之后的所有事件都一起选择 | +| `Ctrl + Shift + Home` | 把红蓝紫绿黄五个版块里所选事件之前的所有事件都一起选择 | +| `Ctrl + Shift + End` | 把红蓝紫绿黄五个版块里所选事件之后的所有事件都一起选择 | +| `Shift + C` | 在关卡编辑器内打开或关闭数字量化判定功能 | +| `Shift + O`\(字母\) | 在关卡编辑器内打开或关闭详细的关卡结果功能 | + + + + + diff --git a/pages/epilogue.md b/pages/epilogue.md new file mode 100644 index 0000000..effc8ff --- /dev/null +++ b/pages/epilogue.md @@ -0,0 +1,55 @@ +# 尾声 +我们还有些想说的话 + +--- +到此为止,编辑器教程的正文部分就完全结束了,一不小心这个网站也经营了一年了,不知道总结出的这个教程质量如何,心中诚惶诚恐。因为我等几人也并非什么神仙大佬,编辑器怎么用,全凭自己费时间摸索。教程里技巧虽多,但也都带点每个人自己的使用习惯,示例关卡更是如此。 + +虽搁笔至此,但每人心中都还是憋着几句话想要一吐为快。不如就以此作为整个教程的收尾吧。 + +> 整本编辑器教程写到此处收工,通读下来不知各位看官是否注意到了一点。要做出一个谱子其实非常容易,把编辑器的第一大章看完,再加上自己随便这点点,那戳戳,该有的该会的都能做得像那么回事。但为什么这本教程写了足足九万二千多字,不惜笔墨花了三十多章节来一点点的教学?因为每个功能虽然界面一说就懂,但是背后暗藏的细节太多了。 +> +> 整个学习的过程大概也分三个阶段。第一个阶段要慢慢熟悉编辑器,理解官方为什么要把剧情模式的每一关设计成现在玩到的样子。第二个阶段要逐渐把节奏设计和视觉效果的技术力提高,做出一个体验完整的谱面。第三个阶段,当技术力已经提升到优秀的线以上的时候,就要开始琢磨跳脱出节奏医生之外的玩法设计、画面叙事以及情感表达了。 +> +> 所以我对于每一位看到这里的读者都有一个期待,除了把功能都用会之外,一定再多花一些时间让关卡变得更好。既然教程都已看过,切莫再抱以“我的做谱水平就到这了,不想再改了”的心态把视频和关卡一发了之。我们毫无保留地把自己的做谱经验分享出来,虽不妄图让各位严格遵照,成为诸如编辑器的教科书云云,但殷切期待所有学成者都能以此为契机打开思路,能意识到一些之前未曾考虑过的想法,并让下一个谱子变得比之前更好。 +> +> 愿你我共勉。 +> +> ——养老院里安享晚年的山不转水到渠成 + +> 《节奏医生》真的是一款很棒的游戏,而关卡编辑器又给这款游戏的内容赋予了极高的上限,让玩家能够在欣赏完官方剧情后能够发挥创意自行创作并分享给更多玩家。但是这款游戏的热度一直以来都比较低,很少人愿意在体验完官方剧情后尝试创作关卡,而坚持下来的人少之又少,这种情况很大程度上是由编辑器一定的上手门槛导致的。因此我们联合为大家带来了编辑器的教程,希望能够帮助大家理解编辑器的各种功能和学习制作关卡的一些技巧,当然还有更重要的一点:了解制作一个合格关卡的基本要求。 +> +> 我们过去看过许多社区的自制关卡,其中虽然有很多的优秀作品,但也有不少不够规范,粗制滥造的劣质关卡(包括本人一开始制作的几个关卡),这些关卡或多或少地影响了路人对这款游戏的第一印象和《节奏医生》玩家对自制关卡的第一印象,并对自制关卡的制作产生了一些误解(最典型的是误把《节奏医生》当成硬核音游,并按照硬核音游的标准来制作关卡),进而产生了更多的劣质关卡,这种恶性循环对游戏社区的构建和人们对这款游戏的认识都有非常不好的影响。 +> +> 我们制作教程的初衷是希望大家在学会使用编辑器制作关卡后能够为社区带来更好的作品,减少劣质关卡的产生,既然官方把制作关卡的权力交给了玩家,我们玩家就不应该辜负官方的信任,这个游戏不该在玩家手里变烂(我们所制作的关卡可能会影响人们对这款游戏的认识,进而影响人们对这款游戏的评判)。因此我希望各位能在这个教程的帮助下创作出更多优秀的作品,为《节奏医生》这款游戏带来更加精彩的内容。 +> +> 新世界大门的钥匙已经准备好了,祝你们好运! +> +> (省流大师:编辑器不难,好学又好玩。做烂关卡影响不利,做好关卡皆大欢喜。) +> +> ——吾夜犹明 + +> 我曾讨论过一个问题:《节奏医生》是音游还是亚音游。也得到了很多种结果。我最支持的是《节奏医生》是新式音游,主要在于游戏中的普通拍和长按拍都增加对应的提示拍。而且这是一款单键音游,设计时考虑到了盲人玩家也可游玩(就像节奏天国一样)。因此,《节奏医生》的铺面设计和其他音游也存在不同。本作和 7th Beat Games 的另一部作品《冰与火之舞》一样,提供了关卡编辑器,让玩家在打完官谱后有发挥自己想象力和创造力的空间。《节奏医生》因独特的玩法,使得关卡编辑器的内容更加丰富,做出来的关卡更加深层次,多元化、立体化。 +> +> 但同时,也因为独特的读谱机制,使得自制谱的潜规则更加复杂(Adofai里边只要能看清轨道就没什么问题),官方节奏和自创节奏的提示也有严格的要求。因此,节奏医生关卡编辑器的人气不是很高,而且国内优秀的谱师和自制谱也没有很多(说实话我并不觉得我是“优秀的谱师”)。最后,希望通过本部教程,能让更多的人喜爱这款游戏,并且在尝试完主线关卡后有兴趣钻研关卡编辑器的相关内容。认真遵循官方发布的社区关卡制谱规范,拒绝塞爆。 +> +> 留给大家钻研的彩蛋: +> +> 45 39 氚 1 101 8 6 氚 8 86 5 +> +> 102 16 氚 92 9 9 49 g +> +> Менделе́ев-Периодична таблица на еле +> +> ——喜欢精灵宝可梦的黄黄 + +> 感想什么的,感觉跟学校的语文作业一样,好为难啊…… +> +> 关于这次教程,我的参与面是比较少的,但我玩过的谱面还是比较多的,毕竟经常直播打谱了,良谱屑谱奇葩谱都有接触过,自己也写了两份很简单并没有太多特效的谱面了,就从游玩者和编辑器初学者的角度来谈谈我对于自定义关卡跟编辑器的感受和对于谱面的一些想法吧。 +> +> 首先是作为一个玩家来说,节奏医生是主打单键节奏的音游,所以节奏感一定是很重要的,视觉效果不讲,如果单纯的拍子都没有跟音乐对应那玩起来肯定很难受。我打了很多谱碰到的节奏都对不好的谱还真的比我想象中的要多很多,如果你是看到这里的跟我一样的萌新宝宝,记得一定要先学会对好节奏,找好节拍哦,这点很重要,就像盖房子的地基,打好了才能稳定。 +> +> 其次呢是作为一个编辑器的初学者,编辑器特效那么多,再加上各种自定义代码可以解决的就更多了,肯定有你不懂的地方,这个时候一定要厚着脸皮去多问比自己懂得多的前辈们,问多了自然就记住了。也可以没事就自己开个编辑器玩,多尝试自己没有使用过的效果,自己试多了之后有创作灵感了才能有办法去实施。初学者可能会有很多想法不知道怎么去实现,只要敢想敢问敢尝试,一定能做出自己想要的效果的。 +> +> 做到上面这两点并不难,其实作谱也就是这样。编辑器上手门槛也并不算难,我也没有特别多的想跟大家说的,毕竟我也只是个初学者,就感谢一下制作本教程的其他大佬能给我这个B站超级鸽子这个和大家谈话的机会吧,希望大家都能做出能让自己喜欢,被大家认可的谱吧,我们一起进步。 +> +> ——一个希望自己能火却经常咕这咕那的鸽子,丘露帆 \ No newline at end of file diff --git a/pages/floatingtext.md b/pages/floatingtext.md new file mode 100644 index 0000000..14c985e --- /dev/null +++ b/pages/floatingtext.md @@ -0,0 +1,148 @@ +# 浮动文字 + +## 浮动文字基本设置 + +如果我们要制作一首歌曲的谱面,一般而言都会考虑将歌词显示在画面中,这是一种简单粗暴,但能快速提升整体观感的做法。要在画面中加上字幕,我们需要在紫色的版块中找到**浮动文字**事件。 + +选择这个事件后,我们可以发现最开始的两行很有Word的感觉。 + +![](../images/floatingtext-fontslyle.png) + +**aA**:可以调整字号大小,字号基本上没有上限,如果设置太大的话,文字就会**超出屏幕**。 + +**旋转**:可以旋转浮动文字框,注意是**整个文本框的旋转**,而不是每个字单独旋转。 + +**AB**:两个颜色分别是字的颜色和字符描边的颜色,刚才所说的字号里面,**只会包含字符本体的大小**,描边是没有算在里面的。 + +**↔**:指定浮动文字横向的基准位置。 + +**↕**:指定浮动文字纵向的基准位置。 + +![](../images/floatingtext-position.png) + +**位置**:指的是基准的位置。可以按一下准星符号再在预览画面窗口中点选位置。有条件精准找到位置的话还是建议在`X`和`Y`栏中输入具体数值。**点击右边的`%`按键可以切换屏幕像素点和屏幕百分比两种输入方式**。 + +![不同基准在同一位置下的不同效果](../images/floatingtext-align.png) + +**文字**:就是输入文本的地方了。纯英文文本是使用的像素字体,带有中文字符的情况下会全部变成矢量字体,如果你想要纯英文文本也显示矢量字体的话,可以回车键再在第二行输入一些中文,如下图所示。当文字框里没有中文时就无法输入中文,需在游戏外部打好要插入的文本,并通过复制粘贴的方式输入。 + +![](../images/floatingtext-example.png) + +另外,目前已知中文繁体以及日语假名都可以在画面中正常显示。 + +![二次元歌曲狂喜](../images/floatingtext-jp.png) + +**创建文本递进**:如果想要把一整句歌词按歌词节奏一个一个地显示出来,就需要在文本中使用“`/`”将它们隔开。如果想要一个一个地覆盖掉之前显示的内容,就需要在文本中使用`回车键`将他们隔开。之后点击下面的“创建文本递进”,在工作区里面可以拖动右箭头事件来调整时机。如果你做好了又不想要了,那么再把下面的开启改成关闭即可,无需手动删除。如果你又反悔了,还是想要,再改成开启,又会恢复记录。 + +```rdview 8 3 +ea.FloatingText 1 1; +ea.AdvanceText 2 1; +ea.AdvanceText 3 1; +ea.AdvanceText 4 1; +ea.AdvanceText 5 1; +ea.AdvanceText 6 1; +ea.AdvanceText 7 1; +``` + +音节的消失方式选择**淡出**就是慢慢消失,**立即**就是瞬间消失,音节显示的时长是按创建文本递进的最后一个事件往后数拍子的。 + +```rdview 13 3 +ea.FloatingText 1 1; +g 3 1 4 1; +g 7 1 0 1 #f80; +ea.AdvanceText 3 1; +g 8 1 4 1; +g 12 1 0 1 #f80; +ea.AdvanceText 8 1; +``` + +## 更丰富的效果和技巧 + +这个模块的基本功能就是上面那些,但是实际使用起来其实非常灵活。如果想要制作视觉效果更为丰富的字幕,就需要我们打开脑洞,多去深挖这些基础功能。下面我举几个例子给大家做一些启发。 + +**1、**如果想一次性显示多行,需要在换行的地方加上`\n`。输入`\/`才能打出“/”。 + +**2、**文本旋转效果是整个文本框的旋转,如果想要做到每个字都旋转,那么同样需要添加多个浮动文字模块,添加相同的旋转角度。如果想要让文本围绕一个中心旋转,那么直接用准星功能去找位置会方便一些。 + +**3、**如果在同一时刻同一位置有多个不同的浮动文字,那么字在屏幕中的上下层顺序只和你添加事件的先后顺序有关,先加入的事件在下层,后加入的事件在上层。这个机制无法进行修改。 + +**4、**如果想要给文本做颜色渐变的效果,可以在相同时间相同位置添加两个浮动文字,其中一个消失方式选择淡出,另一个选择立即,这样就获得了渐变效果。 + +**5、**把文字递进里面添加很多错误的文字,然后全部一个字一个字回车,就可以做到文字在同一位置的乱码效果。 + +**6、**在文本的最后放一个竖线“\|”或者下划线“\_”就可以做出打字的效果了。 + +![](../images/floatingtext-typing.gif) + +``` +ぼ| +ぼく| +僕| +僕の| +僕のゆ| +僕のゆめ| +僕の夢| +僕の夢 + +そ| +そう、| +そう、わ| +そう、わた| +そう、わたし| +そう、私| +そう、私の| +そう、私のゆ| +そう、私のゆめ| +そう、私の夢| +``` + +**7、**创建了一组文本递进之后,只需要双击浮动文字事件本身,整组字幕都会被选中。不需要一个个手动去点选了。 + +**8、**基准的左中右会影响文本递进效果。靠左时从左向右出现文本递进;靠中时从中间挤向两侧出现文本递进;靠右时从右向左出现文本递进。 + +**9、**在文本框的最后加一个空行,就可以通过文本递进的方式设置文本的结束时间,避免了一点点数格子的烦恼。 + +**10、**在文字中的个别字符前面加上``,后面加上``可以改变这几个字的颜色和透明度。关于颜色的介绍由于篇幅关系将放在下一小节。 + +![](../images/floatingtext-rainbow.png) + +对应文本框内容为: + +```html +Welcome to Wonderland!`
+色 +``` + +## 演示关卡 + +你以为这里会有一个我们制作的关卡?其实并不。在这里我想介绍的是官方联动关卡`MD-2`,不知道你们在游玩这关感受爆炸难度的同时有没有注意到字幕的表现?如果你没有什么印象的话可以先看看下面这个视频: + +
+ +看完之后我们再来回忆一下其中一段歌词的表现: + +> `夜深了 月光也换了颜色`
+> 【换了颜色】字体为黑色 +> +> `要更迷幻更鲜艳眩目得赤裸`
+> 【鲜艳炫目】字体为亮蓝色 +> +> `我也将披上褪浅的音色`
+> 【褪浅的音色】消失更早 +> +> `逃离这个现实的现在时分的陷落`
+> 这句意外的正常 +> +> `像逆行在通往大人的公路`
+> 【像逆行在】四个字是从右往左出现的,也就是位置基准改成了靠右 +> +> `粉红的喇叭裤 墨镜里装星空`
+> 【粉红】两字为粉红色,【星空】两字为蓝色和紫色 +> +> `忽闪忽灭的影子中`
+> 【忽】字反复出现和淡出了几次,【影子】是黑色 +> +> `撞见了另一个我`
+> 【另一个我】有两份文字略微偏移重叠在一起 + +有没有发现不管是颜色效果还是显示效果,在设计上都和歌词本身有着些许联系,也就让平淡无奇的歌词字幕一下子变得生动起来。 \ No newline at end of file diff --git a/pages/hallofmirror.md b/pages/hallofmirror.md new file mode 100644 index 0000000..21e0efa --- /dev/null +++ b/pages/hallofmirror.md @@ -0,0 +1,169 @@ +# 镜厅 + +> 预警放在最前面:观看本节教程图片可能会引发光敏性癫痫,在编辑器中使用此功能也请慎重处理。 + +> 本节动图较多,如遇加载卡顿,请耐心等待。 + +所谓的镜厅效果,就是画面在变化的时候并不清除变化过程中产生的效果,画面效果会一直叠加,然后逐渐变得混乱。 + +
+ +镜厅一共能在两个地方找到,一是设置主题中的 “镜厅”,二是预设特效中的“镜厅”。**但最好使用预设特效中的**。 + +如果只是直接使用镜厅加上预设特效,效果一般只会越来越阴间,所以我们一般会使用预设特效里的“晕影”和“闪烁晕影”或者半透明的背景或半透明的后背景板闪光(由于设备性能差别,镜厅的效果显示可能每个人会有所不同,我一般使用20的透明度)来起到抑制的效果,同时这样也能直接做出最简单的拖尾效果。 + +![](../images/hallofmirror-trail.gif) + +拖尾效果(可以注意到镜厅留下了痕迹 ,如果想去除就需要再加上其他的效果,比如-1强度的高光)。这里再附上一些特效在遮罩后的组合(默认都已经打开了镜厅)。 + +![x=1,y=1 的自定义滚屏 + 20 透明度的黑色背景](../images/hallofmirror-trailrepeat.gif) +![2x2 屏幕块 + 晕影](../images/hallofmirror-screenblock.gif) +![0% 强度海底波浪 + 20 透明度的黑色背景](../images/hallofmirror-wavetrail.gif) +![蓝色高光 + 晕影](../images/hallofmirror-bluehighlight.gif) + +一般来说直接用这些效果是不会太好的,用的时候会使用更多其他的特效进行组合。 + +### 反色(HOMVERT) + +镜厅+反色的结果往往是会让眼睛难以承受的高频闪烁,因此直接使用是禁止的,但是加上一点遮罩就可以避免这种结果。 + +![镜厅 + 反色 + 20 透明度背景的效果](../images/hallofmirror-homvert.gif) + +另外,值得一提的是护士语音自带的灯光实际上是一片反色的区域,因此如果使用了镜厅,就要注意是否产生了镜厅反色(实在没办法也可以用音效代替直接使用语音来避免出现灯光)。 + +### 背景 + +如果直接使用背景加上镜厅使用是不会有效果的,但如果我们把背景的颜色设成半透明在加上镜厅就能在保留背景的情况下加上镜厅的效果。 + +![在医院走廊奔跑的科尔](../images/hallofmirror-runningcole.gif) + +如果图片本身有透明部分,则镜厅的效果会只在透明的部分显示。 + +![镜厅的效果附在了每个方块后面](../images/hallofmirror-trailblock.gif) + +### 顶部镜厅 + +预设特效里的镜厅除了四个房间外,还可以选择在“顶部”生效,这样就能做出只用房间做不出的效果,或者通过缩放和移动房间让整个房间受到镜厅影响。我们可以利用这个干很多事。 + +![用顶部镜厅来画边框](../images/hallofmirror-danmaku.gif) +![](../images/hallofmirror-kaleidoscope.gif) + +直接在使用主题的房间使用镜厅是不会有效果的,但如果设置透明背景再使用顶部镜厅就能起到作用(需要注意的是,有些主题设置的时候会自动设置一些效果,可以在设置主题后0.0001拍再设置其他效果来避免与主题冲突)。 + +![](../images/hallofmirror-trailinroom.gif) + +对于本身没有透明部分的主题,我们可以把主题单独放在一个房间然后把那个房间半透明化,之后把轨道单独叠在那个房间上面来达成效果。 + +### 透明化 + +虽然在大部分情况下使用了镜厅就意味着房间的背景不再能透明,但在少数特效影响下的情况是可以的。 + +![镜厅 + 负数强度的落雨](../images/hallofmirror-homandrain.gif) +![镜厅 + 负数强度的高光](../images/hallofmirrorhomandhighlight.gif) + +也有一些特效会让背景半透明。 + +![镜厅 + VHS](../images/hallofmirror-hmandvhs.gif) +![镜厅 + 电影噪点](../images/hallofmirror-homandnoise.gif) + +与之相对的,也有部分特效会让镜厅无法透明,加上其他的特效也一样。 + +![镜厅 + 暴风雪(同时有 VHS 效果但并没有透明)](../images/hallofmirror-homandsnowstorm.gif) +![镜厅 + 素描(同时有 VHS 效果但并没有透明)](../images/hallofmirror-homandpaint.gif) + +### 特殊效果 + +镜厅其实不只能用来做特效,也可以用来做一些特殊的效果。比如用来画画或者猜单词,当然这些都是一般用不到且比较难实现的,放在这里只是让你们知道一下。 + +### 组合 + +上面提到的都是镜厅的一些基本的用法。但做谱的时候不可能只用这些效果,这样是做不出花样来的。要做出更多变数,就要尝试更多的组合,甚至把组合再组合,这样就能做出很多不同的效果。在想不到怎么做特效的时候这是个很好用的方法试的时候也要注意效果不能太伤眼,也不是叠的特效越多越好。丰富谱面的内容才是第一目的。 + +与此同时,我们也要知道,镜厅只是做谱时的一种手段,做特效如果只是一味的试各种特效还不去了解其他方面,是没法提高的。希望你们做谱的时候能够合理使用镜厅,让内容更丰富。 + +## 一些陈旧的示例 + +### 镜厅 + 悬浮物 + +添加诸如矩阵,落雪,落花等不断漂浮移动的特效,它们都会拖出长长的一条轨迹出来,直到屏幕被占满。 + +![落雪 + 矩阵 + 落花](../images/hallofmirror-homandfloatingthings.gif) + +### 镜厅 + 落雨 + +落雨效果的雨滴是高密度向左下滴落的,如果加上镜厅,雨点会很快将屏幕涂满白色,此时再有其他的物件在屏幕上,也会拖挂一个朝向左下角的尾巴。但是其他物件不会再屏幕上拖尾太长,因为它们马上又会被带镜厅的雨滴给覆盖掉。 + +![落雨 + 矩阵 + 落花](../images/hallofmirror-homandrainflowersquare.gif) + +### 镜厅 + 彩色冲击波 + +冲击波会在镜厅的影响下变成彩色条带,而且还会随着按拍的次数叠加。 + +![彩 色 冲 击 波](../images/hallofmirror-shockwave.gif) + +### 镜厅 + JPEG失真 + +画面割裂开并持续向左滚动。 + +![你 屏 坏 了](../images/hallofmirror-glich.gif) + +### 镜厅 + 海底波浪 + +这种屏幕扭动类的会逐渐变得更加扭曲。 + +![扭 曲 树 精](../images/hallofmirror-wave.gif) +![影 流 之 主](../images/hallofmirror-waverepeat.gif) + +### 镜厅 + 滚屏 + +直接崩坏。 + +![巨 硬 报 错](../images/hallofmirror-repeattttttttttt.gif) + +### 镜厅 + 屏幕块 + +这个需要配合晕影使用,不然也会直接崩坏。 + +![千 人 一 面](../images/hallofmirror-screenblock2.gif) + +要注意屏幕块是可以填写小数的,例如填写`x = 1.05, y = 1`,自定义闪烁透明度`15%~0%`。 + +![](../images/hallofmirror-rush.png) + +### 镜厅 + 高光 + +火光冲天。 + +![核 反 应 堆](../images/hallofmirror-explode.gif) + +但是如果叠加上屏幕滚动和晕影就会出现奇效。 + +![超 电 磁 炮](../images/hallofmirror-gun.gif) + +### 镜厅 + 晕影 + +晕影效果可以大幅度地减弱镜厅的拖尾,让画面拖动变得柔和很多。 + +![](../images/hallofmirror-square.gif) + +### 镜厅 + 闪烁 + +添加屏幕闪烁可以把屏幕上所有的滞留画面都暂时清除干净,但如果不关掉镜厅本身,接下来很快屏幕还是会被镜厅填满。但要注意,在自定义闪烁中设置的结束时的颜色,会余留在屏幕背景上。 + +![分别添加绿,蓝,红,紫的闪烁](../images/hallofmirror-flash.gif) + +### 镜厅 + 设置背景 + +虽然背景的优先级很靠后,但是实际上背景图片会盖住镜厅效果,只有背景图中透明的部分才能看到镜厅所造成的拖尾。 + +另外,给背景设置一定的透明度也可以有效降低镜厅产生的目害。 + +### 镜厅 + 移动房间 + +虽然背景本身不会受镜厅的影响,但是如果把整个房间缩放和移动,那么房间整体就会在最后方的黑屏上开始堆叠起来。 + +### 镜厅 + 颜色反转 + +> 罗老师,别这样。 + +这么做的后果是屏幕会高频率反色闪烁,非常伤眼。 \ No newline at end of file diff --git a/pages/hand.md b/pages/hand.md new file mode 100644 index 0000000..bff9d9e --- /dev/null +++ b/pages/hand.md @@ -0,0 +1,50 @@ +# 手 + +手的出现主要为了契合远程按拍的设定,因此官方的绝大多数关卡里手都有出现,个别没有出现的关卡一般来说包含两种情况:关卡本身的设定和治病关联不大;关卡的房间上下排列过多以至于没有足够的空间显示手。 + +## 显示手 +**显示手**事件就可以将手从画面中调入或是调出。 + +![显示手的设置内容](../images/hand-settings.png) + +**手:**可以调整手出现的位置,以空间上的左右,或是以玩家的12(红色版块的**校准**里可以互换双人游戏手位置);如果选择两边,则会出现两只手。 + +**动作:**显示和隐藏可以控制手从屏幕左右两侧进入或离开;如果手选择了两边,那么会多出升起和降下两个选项,可以控制手从屏幕下方进入或离开。在没有节奏的时间段里面要适时让手离开屏幕。 + +**延展:**当只有一只手时,手在屏幕中横跨大半还是小半。 + +**对齐房间可视区域:**这是配合房间大小缩放来设置的,在设置房间内容模式为“保持长宽比”的模式下,如果选择了关闭,同时缩小房间,手会从画面中消失;而如果选择了开启,手会始终保持在房间的显示边缘。 + +![开启对齐的效果](../images/hand-align.gif) + +**过度方式:**可以控制手的出现或消失动画是平滑过度或是瞬间完成。 + +**还有一件事:**在多房间的情况下,手可以设置为顶部。 + +## 手涂色 +**手涂色**和轨道涂色的原理是完全一致的。 + +**受影响手:**选择要为哪只手涂色。 + +**边框:**边缘的三种样式。自左向右分别为:无边框,手边缘线,手阴影(除无边框外均可设置颜色)。 + +**涂色:**手内部全部涂成一个颜色,选择“开启”后可选择要涂色的颜色。 + +**透明度:**改变手在画面中的透明度。 + +**时长与缓速:**和其他特效中的完全一致,不过多赘述。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 手分配 +**手分配**事件可以更换手的所属角色,包含玩家,伊恩,佩奇和埃德加共四个选项。 + +![手涂色的设置内容](../images/hand-tint.png) + +**玩家**:玩家的手默认是蓝色,可以在剧情模式中的袖管涂鸦功能中修改。按钮与玩家所选的难度对应。 + +**伊恩**:伊恩的手默认是银白色。按钮是弹簧。 + +**佩奇**:佩奇的手默认是银白色。按钮是大按钮。 + +**埃德加**:埃德加的手默认是银白色。按钮是普通按钮。 \ No newline at end of file diff --git a/pages/holdbeat.md b/pages/holdbeat.md new file mode 100644 index 0000000..e24f94e --- /dev/null +++ b/pages/holdbeat.md @@ -0,0 +1,65 @@ +# 长按 + +## 长按拍子功能介绍 + +在编辑器里面,长按拍子并不是一个单独的种类,而是归属在普通拍子里面的,想要创建一个长按拍子,只需要建立一个普通拍子之后设置“**按下时间**”这个选项。这时就能在工作区看到一个紫色的格子区域,代表在这个时间段内必须按住空格键。 + +![](../images/holdbeat-lenght.png) + +如果不对其添加任何其他设置,那么轨道就会自动变成 `—x—x—x————♥` 的模式,像`4-1`这关的矿工一样,也就是在1,3,5,7拍有按压的动画效果。当然你可以在“设置X标记”这个项目里面选择跳过节拍的形式,默认有三种情况,如果想使用“切换为修饰拍子设置”来自由决定跳过也是可以的,先在“设置X标记”里面选择NO,然后设置好自己决定的修饰拍子就行了。 + +```rdview 7 3 +eb.AddClassicBeat 3 1[tick=3,hold=0.3,swing=0.5]; +eb.SetRowXs 1 1[rowxs=---x--]; +``` + +另外长按拍子在编辑器里面也可以分解为自由节拍,使用自由节拍时,需将脉冲出现与脉冲消失分别构成两个合法的普通拍,也即所有脉冲出现的相隔时长相同,且所有脉冲消失的相隔时长相同。 + +```rdview 7 8 +g 1 2 0 5 #f00{}; +g 2 3 0 4 #d20{}; +g 3 4 0 3 #b40{}; +g 4 5 0 2 #960{}; +g 5 2 0 5 #f00{}; +g 5.5 3 0 4 #d20{}; +g 6 4 0 3 #b40{}; +g 6.5 5 0 2 #960{}; +eb.AddFreeTimeBeat 1 1[offset=0 1,hold=4]; +eb.PulseFreeTimeBeat 2 1[offset=0 2,hold=3.5,pulse=3]; +eb.PulseFreeTimeBeat 3 1[offset=0 3,hold=3,pulse=5]; +eb.PulseFreeTimeBeat 4 1[offset=0 4,hold=2.5,pulse=7]; +eb.AddClassicBeat 1 6[tick=3,swing=0.5]; +eb.AddClassicBeat 5 6[tick=1.5,swing=0.25]; +``` + +## 演示关卡 + +这一期的界面部分没有太多内容,接下来我们欣赏演示关卡,里面会包含一些需要避免的错误示范。我也会在下面列举出来。 + +
+ +**1、**在长按拍松手的时刻可以有其他的按拍。这在曾经的编辑器版本里是不允许的,目前官方修正了这一机制。 + +```rdview 9 4 +eb.AddClassicBeat 1 1[tick=6,hold=1]; +eb.AddClassicBeat 2 2[tick=6]; +``` + +**2、**当同时存在多个长按拍子时,这些长按拍的长按时间段必须完全一致。也就是说,长按时间段之间不能是包含、交叉或首尾相连的关系。 + +```rdview 16 7 +eb.AddClassicBeat 1 1[tick=3,hold=1,swing=0.5]; +eb.AddClassicBeat 1 2[tick=3,hold=0.5,swing=0.5]; +eb.AddClassicBeat 6 1[tick=3,hold=1,swing=0.5]; +eb.AddClassicBeat 6.25 2[tick=3,hold=0.5,swing=0.5]; +eb.AddClassicBeat 11 1[tick=3,hold=1,swing=0.5]; +eb.AddClassicBeat 11.5 2[tick=3,hold=1,swing=0.5]; +eb.AddClassicBeat 1.5 4[tick=1.5,hold=1,swing=0.25]; +eb.AddClassicBeat 1 5[tick=3,hold=0.5,swing=0.5]; +eb.AddClassicBeat 6 4[tick=3,hold=1,swing=0.5]; +eb.AddClassicBeat 6.5 5[tick=3,hold=0.5,swing=0.5]; +``` + +**3、**凹兔的自动演示对于长按拍的处理十分诡异,可能会提前松掉长按拍子,但不必惊慌,这不是你的问题。 + +![凹兔娘:怪我咯?](../images/otto-puzzled.png) \ No newline at end of file diff --git a/pages/importandexport.md b/pages/importandexport.md new file mode 100644 index 0000000..f296cae --- /dev/null +++ b/pages/importandexport.md @@ -0,0 +1,198 @@ +# 导入与导出 + +## 导入音乐 + +制作一个自制谱的第一步就是导入一首音乐。虽然编辑器本身对音频文件格式无严格要求,但还是**请使用.ogg格式的音频文件**,以减少出BUG的可能性,对后续的调整偏移和选关界面试听也有帮助。如果你需要.ogg格式但是手头只有.mp3可以使用[aconvert](https://www.aconvert.com/cn/audio/mp3-to-ogg)等软件转换。**音乐的文件名尽量只包含字母、数字和半角符号**。 + +点击左上角的**菜单→新关卡**来创建新关卡,编辑器会帮我们选择到默认位置(C:\用户\你自己的用户名\文档\Rhythm Doctor)。如果你有长期做谱的需求,建议另取一个独立文件夹,会方便管理。在这个文件夹里创建的文件夹,就代表着你制作的不同的谱面。创建文件夹后进入,输入好谱面文件名,点击确定,就成功创建了一个谱面。 + +> 在编辑已保存的关卡时,编辑器会每隔 5 分钟在此关卡相同目录生成一个 `backup.rdlevel` 备份文件并覆盖原有 `backup.rdlevel` 文件,如果做到一半编辑器崩了没保存就可以打开这个文件来恢复数据。 + +接下来看到下方红色的界面,在这堆格子(我们姑且称之为**工作区**)的角落点一下, + +![关卡默认带有的播放音乐事件](../images/importandexport-selectplaysong.png) + +可以看到这是一个名为**播放音乐**的事件,左上角出现了如下的几个选项 + +![点击播放音乐事件的打开文件图标](../images/importandexport-playsongoptions.png) + +然后点击文件夹图标,找到准备好的音乐,双击文件即可。**如果你导入的音乐不在创建关卡的文件夹里面,编辑器会自动复制一份音乐文件进去**。 + +## 调整曲速和偏移 + +接下来一点十分重要,那就是调节BPM,也就是一分钟有多少拍的意思,只有设置对了BPM才能让游戏节奏和音乐速度保持一致。排除掉一些变速曲我们可以用[ArrowVortex](https://arrowvortex.ddrnl.com/)。或者你不想额外下载软件的话,也有一些在线网站可以测试,比如[vocalremover](https://vocalremover.org/zh/key-bpm-finder)、[all8](https://www.all8.com/tools/bpm.htm)或者是[Tunebat](https://tunebat.com/Analyzer)。 + +调整好BPM之后还需要调整偏移。我们看一下下面波形图案,点击`‐`和`+`两个按钮进行缩小和放大。 + +![缩放时间轴](../images/importandexport-timelinescale.png) + +一般来说,声波比较强的地方都会是音乐里卡准拍子的那一下,所以我们需要把它精确地对齐这些格子线。在BPM的下方有一个**音频偏移**的选项,改变这个数值,可以看到数字变大,波形整体左移,数字越小,波形整体右移,具体移动多少,多试几次就行。 + +在编辑器内调整偏移对耳力要求相对高一些,如果想要借助外部软件,可以使用[Audacity](https://www.audacityteam.org/)。软件的详细教程参见[这里](../resources/offset.pdf),偏移练习曲下载点[这里](https://bv.rdlevel.cn/offset.zip)。 + +![BPM 与偏移](../images/importandexport-bpmoffset.png) + +> 游戏在处理`600ms`以上的偏移时容易出现各种奇怪的bug,因此如果调整出来的偏移超过了`600`,请考虑把音乐裁剪到偏移为`600ms`以下后再重新进行偏移调整。 + +设置好了之后这首音乐就算是和我们游戏的心电图完全对准了,只有这样才能算是一个可以玩的谱面。 + +由于这部分操作用图文说明比较抽象,我们制作了一个视频版本的教程供大家参考学习。 + +
+ +## 导出关卡 + +接下来在左下角点击紫色星星图标进入紫色的版块,在能看到波形结束的地方点一下,然后往下翻到**结束关卡**按钮,这样的按钮一共必须放三个。 + +```rdview 5 5 +ea.FinishLevel 1 1; +ea.FinishLevel 2 2; +ea.FinishLevel 3 3; +``` + +最后我们回到红色的版块,点击**关卡设置**,选择上方的导出,有几个空栏是必须要填写的: + +**歌手**就是填写歌手名,一般来说不限制语种。 + +**歌曲名称**就是填写歌曲名,一般来说不限制语种。 + +**预览图片**都是你能在选关界面看到的。预览图片、预览歌曲不能有中文字符。 + +**关卡作者**填上自己名字或是昵称。 + +**癫痫警告**在特效非常花哨和晃眼的时候一定要选上,这也是对广大游戏玩家负责。 + +![关卡信息](../images/importandexport-level.png) + +写完之后点击左上角的**菜单→保存**,然后点击**菜单→导出以发布→以rdzip格式导出**,我们就可以玩到这个谱了。 + +> 要经常保存啊!!!养成好习惯,随手按下`Ctrl + S`。 + +虽然对于歌曲信息的必填项目不多,但是整体上填写还是要遵循一套规则的。关卡设置页面的每一条项目的填写规则我们会在下面逐一介绍。 + +## 关卡设置→一般 + +上半部分填写的是成绩S到F分别失误的拍子数量,以及显示的评价文字。这东西最好**不要一股脑保持默认值**,而是根据做谱的情况来合理修改,难度不大,那就数字写小,难度很大,那留出来的容错空间也应该更大。 + +有的同学可能会想:反正最后都是要刷到S+的,至于其他等级如何评定,完全无所谓。这种想法稍欠妥当,玩家第一次打出的成绩也是会影响其是否能有平稳的心态和兴趣收歌的。 + +![关卡评级信息](../images/importandexport-levelrankdescription.png) + +### 调色盘 + + +下半部分是可供自定义的调色盘,制作谱面的时候,可能需要频繁地选择颜色。但形如 `#FFFFFFFF` 的颜色代码实在是不便于记忆。这时候,调色盘就可以派上用场。 + +![调色盘](../images/importandexport-colorpalette.png) + +点击任何一种颜色都可以进行颜色的配置。例如,将第二行倒数第一个颜色改为 `#243834FF` : + +![在子窗口中选择颜色](../images/importandexport-setcolor.png) + +或者点击颜色代码左边的十字,可以从画面中直接取色: + +![在预览窗口上选择颜色](../images/importandexport-colorpicker.png) + +在需要设置颜色的地方,可以直接使用调色盘里的颜色: + +![在其他事件中可以直接使用调色盘颜色](../images/importandexport-usecolorpallete.png) + +当调色盘的颜色被更改时,所有使用这个调色盘颜色的事件也会自动改变颜色。 + +## 关卡设置→导出 + +>这部分无需详细学习或者记忆,只是当你不知道该怎么填写的时候可以回来翻一翻内容。 + +**歌手** + +* 对于音乐就写音乐作者,歌曲就写演唱者 +* 对于使用语言没有要求(一般而言就是书写原语言或是字母罗马音) +* 如果有好几个作者,用**英文逗号隔开**(例如:ななひら, れをる, kradness, そらる, 96猫) +* 如果作者多到写不下,就挑选几个重要的作者,剩下的写进标签里 +* 使用目前歌手正用且常用的名字,避免粉丝对其的昵称等写法 +* 如果是Remix,那么先写Remix作者再写原作者,写不下就写在关卡描述里;如果是你自己Remix的音乐,那写不写自己就看你的喜好了 +* 如果是Vocaloid等虚拟歌姬曲目,可以只写虚拟歌姬的名字,也可以在其后注明UP主名字 +* 如果一个关卡里面有好几段音乐,就写“多位作者\(Various Artists\)”,然后都写在关卡描述里;如果都是同一作者就无视这一条 +* 如果原作者不知道是谁了,那就写它出自哪个原声带/专辑(例如:SEGA/baker\[TOKYO LOGIC\])或者是原声带/专辑所属的公司(例如:任天堂) +* 如果音乐作者写的是匿名,那就也写匿名(Anonymous或是Anonymous Artist) + +**特殊授权** + +* 如果只是私下交流和学习谱面,可以不管。 +* 如果想要上传到Steam社区,则音乐必须取得授权。 +* 官方在主页上公布了一批已经对官方授权的音乐作者,如果你使用这些作者的歌曲就无需再单独取得授权了,详细内容参见[这个网页](https://7thbe.at/verified-artists/rd)。 + +**歌曲名称** + +* 准确写出作品名称,不要标题党(非要标题党请在B站等视频平台发布视频时,于视频标题中整活) +* 对于使用语言没有要求(一般而言就是书写原语言或是字母罗马音) +* 如果是Remix,那么最好加上Remix版本说明(例如:写《Roll The Dice》就不如《Roll the Dice Noisemaker Remix》) +* 如果一个关卡里面有好几段音乐,那么标题随便写其中一个就好了,然后在关卡描述里面补全其他的(例如:《Square》这个谱面就有很多段音乐,但这样的标题没有问题) +* 如果一个关卡里面有好几段同作者同标题的音乐,随便写哪个都行(例如:《Space Oddity》和《Space Oddity \[2015 Remaster\]》都行) +* 如果你自己做了同样音乐的多个不同谱面,那就需要在名称后加以区分(例如:《xxx\(修改后\)》或者《xxx\(困难\)》) +* 如果一个关卡没有音乐,那就随便取名 +* 如果歌手没有为音乐取名,那么只打一个空格 +* 如果要打的字符是编辑器里面无法显示的,那么打一个近似的符号就好(例如:KIVΛ --> KIVA, Æsir --> AEsir) + +**预览图片** + +* 尽量保证图片与你的关卡是相关的 + +**预览歌曲** + +* 请务必使用.ogg格式 +* 可以导入完整的音乐,然后在下方选取播放的时间段 +* 最好选取音乐最重点的一个小片段,不要不假思索地从头开始播放 + +**关卡作者** + +* 写下你的名字,如果有多位关卡作者,中间用**英文逗号隔开** +* 如果你打算长期做谱,那么写一个你会长期使用的名字方便大家记住你 +* 不要写与这张谱的制作无关的人 +* 如果其他作者只是帮了一些忙,有条件还是要写上,写不下就写在关卡描述里 + +**难度** + +* 自行斟酌;如果你不确定难度,可以找其他人试玩 +* 不要故意瞎填搞人心态 + +**显示癫痫警告** + +* 在特效非常花哨和晃眼的时候一定要选上,这也是对广大游戏玩家的生命安全负责 +* 一般规定,在一秒钟内包含超过 3 个突然的高对比度变化的关卡都需要此标记 + +**针管图标** + +* 是选关界面最左边的小图标,**像素大小必须是19\*15** +* 可以为自己制作一个长期使用的像素图标以便大家记住你 + +**描述** + +* 上面说的写不下的都写在这里 +* 然后其他还想写什么都随便 + +**标签** + +* 可选项包括但不限于以下这些: +* 曲风 +* 单人/双人 +* 参加的社区活动(例如饭制部不定期就会有哦) +* 来源(游戏,电影,专辑等) +* 非英文歌名对应地英文翻译、罗马音等 +* 前述中写不下的信息 + +**艺术家链接** + +* 可以填写音乐作者发布音乐的平台链接,或者是他的个人网站网址 + +**支持下列模式** + +* 这个关乎于你的关卡制作是单人关卡还是双人关卡 + +**单独的双人模式关卡(可选)** + +* 字面意思 + +**关卡标签取色** + +* 这是选关界面中音乐名称处的背景颜色 \ No newline at end of file diff --git a/pages/intro.md b/pages/intro.md new file mode 100644 index 0000000..eaaaaea --- /dev/null +++ b/pages/intro.md @@ -0,0 +1,25 @@ +
+ +
+

节奏医生夏季打谱活动正在招募中!

+
+ +# 节奏医生中文编辑器教程 + +> 此网页正在维护中。如有任何问题,欢迎指出。 + +《节奏医生》编辑器中文教程旨在以教学的形式帮助您快速了解编辑器的界面,基础功能,设计技巧和做谱规范。未经授权不得以图文,视频等形式转载,也不得以本教程内素材进行二次创作。 + +编辑器视频教程点击[此链接](https://www.bilibili.com/video/BV1pr4y1k7gP)。教程内所有演示关卡下载放置于[百度网盘](https://pan.baidu.com/s/1Tb6ywVmge25ztMFnpa6q_Q),提取码:rdlv。 + +## 联系我们 + +![我们的 QQ 群号是:951070053](../images/intro-qqgroup.png) + +如果你有做谱相关的问题,或是对本教程有什么意见和建议,可以点击链接加入 QQ 群 [951070053](https://jq.qq.com/?_wv=1027&k=nsPA09E4) 告知我们。你也可以在群里上传谱面给我们试玩,群友们都会热心为你提供谱面优化建议。真诚欢迎各位做谱萌新和大佬的加入。 + +> **当前群聊即将满员,我们将在 6 月 10 日之前将群聊变动信息更新于此。** + +(悄悄透露一句:官方也入驻了这个群哦~) + +> 戳这只看板娘可以获得随机 TIPS → \ No newline at end of file diff --git a/pages/moreclassicbeats.md b/pages/moreclassicbeats.md new file mode 100644 index 0000000..998b915 --- /dev/null +++ b/pages/moreclassicbeats.md @@ -0,0 +1,240 @@ +# 普通拍子的衍生节奏型 + +## 分解为自由时长节拍 + +所谓分解为自由时长节拍,也就是可以随意定义拍子的节奏。有的时候我们为了契合音乐,或者实在是把剧情模式已有节奏打到审美疲劳了,就会想要利用自由拍在节奏机制上引入一些新花样。这个功能非常强大,但是对玩家的挑战也同样很大,如果没用充裕的节奏提示,那么对玩家来说势必就是一次初见杀。 + +我们把一个普通的普通拍子分解为自由时长节拍后,可以看到它变成了一个大的`1`和六个小的`>` 。 + +```rdview 8 2 +eb.AddFreeTimeBeat 1 0[pulse=1]; +eb.PulseFreeTimeBeat 2 0[pulse=9]; +eb.PulseFreeTimeBeat 3 0[pulse=9]; +eb.PulseFreeTimeBeat 4 0[pulse=9]; +eb.PulseFreeTimeBeat 5 0[pulse=9]; +eb.PulseFreeTimeBeat 6 0[pulse=9]; +eb.PulseFreeTimeBeat 7 0[pulse=9]; +``` + +我们选中数字1对应的节拍,发现这个是设置起始脉冲位置的。你甚至可以将它改为第普通拍,然后把六个小的`>`删掉,这样就没有任何节拍提示。如果你设计的关卡是一个和节奏医生没什么关联的创意谱(梦幻联动?),且按键密度很大,则可以考虑这样使用。相比于工作区里面重叠摆放一大堆普通普通拍子,这样会看上去更清爽。但如果你设计的就是节奏医生,**请不要在完全无节奏提示的情况下直接响起第普通拍**。 + +![](../images/moreclassicbeats-endpulse.png) + +剩下的大于号`>`即意味着心跳向右移动一格,数到7的时候则需要按拍。点选之后,把它改成 `<`,心跳还能向左移动一格;点击自定义,还可以任意指定到第几个节拍。每一组自由拍**必须使用较大的节拍作为开头**,较小的则数量不限,直到数到第普通拍为止。 + +```rdview 10 2 +eb.AddFreeTimeBeat 1 0[pulse=1]; +eb.PulseFreeTimeBeat 2 0[pulse=9]; +eb.PulseFreeTimeBeat 2.75 0[pulse=9]; +eb.PulseFreeTimeBeat 3.5 0[pulse=9]; +eb.PulseFreeTimeBeat 4 0[pulse=9]; +eb.PulseFreeTimeBeat 4.5 0[pulse=9]; +eb.PulseFreeTimeBeat 5 0[pulse=9]; +eb.AddFreeTimeBeat 5 0[pulse=1]; +eb.PulseFreeTimeBeat 6 0[pulse=9]; +eb.PulseFreeTimeBeat 6.75 0[pulse=9]; +eb.PulseFreeTimeBeat 7.5 0[pulse=9]; +eb.PulseFreeTimeBeat 8 0[pulse=9]; +eb.PulseFreeTimeBeat 8.5 0[pulse=9]; +eb.PulseFreeTimeBeat 9 0[pulse=9]; +``` + +如果你想让一串自由节拍最后不需要按拍,而是节奏直接消失,就把这一组自由节拍的最后一个点选**垃圾桶**符号。 + +> 如果你设计了一段无法数到第普通拍的节奏且不放置垃圾桶,那么心电图就会一直停在轨道中间。这很诡异。 + +接下来介绍一些社区机制。社区玩家们通过合理设计自由拍,并加以适当的提示,创造出了一些全新的节奏类型。其中一些节奏被广泛使用,并在社区中形成共识,从而延续下来。使用这些机制制作自定义关卡无需额外设计教学环节。当然如果你担心玩家不了解社区,或是你有其它自己的想法,也可以为这些节奏类型自行设计节奏提示的方法,唯一的宗旨是保证提示恰当准确。 + +> 学习使用社区机制之前建议先掌握[播放音效](../pages/audiodesign.md#播放音效)事件和[轨道涂色](../pages/rowfx.md#轨道涂色)事件。下文使用的所有自定义音效可以在这里下载。 + +## 切分音(Syncopation) + +切分音的概念不难理解,拍子的数量仍然为七个,但是最后一个拍子响起的时间是在6.5拍的时候,即提早了半拍。这少的半拍时间是可以发生在任意相邻两拍之间的。早期版本的编辑器需要使用自由拍来制作切分音,现在在**切换为X字拍子设置**里,点亮激活拍子下方的`->>>>>-`符号,就会将这一拍的时间缩短一半。每个轨道最多只能设置一个切分音位置。 + +![](../images/moreclassicbeats-syn.png) + +**如何提示** + +> 1. 将轨道边缘染成黄色(参考颜色: `#FFFF00FF` ) +> 2. 在切分发生前的奇数拍使用“切分音嘟声-低”音效 +> 3. 在切分发生后的第一拍使用“切分音嘟声-中”音效 +> 4. 在第7拍使用“切分音嘟声-高”音效 + +需要额外注意的是,无论拍子之中是否有`X`,切分的第一个提示音、最后一个提示音以及可能存在的切分中音效都要保留,只有剩下的切分低音效是可以自行选择放置与否的。 + +## 八拍子(8 Beats) + +八拍子就更好理解了,我们直接额外增加一个节拍,让按拍的时机在第八拍响起的时候。但是轨道上是只能显示七个拍子的,所以我们依然要依赖**分解成自由拍**,以`2 1 2 3 4 5 6 7`的形式响起节拍。设置的方法如下图所示: + +```rdview 10 3 +eb.AddClassicBeat 1 0[tick=6]; +eb.AddFreeTimeBeat 1 1[pulse=2]; +eb.PulseFreeTimeBeat 2 1[pulse=8]; +eb.PulseFreeTimeBeat 3 1[pulse=9]; +eb.PulseFreeTimeBeat 4 1[pulse=9]; +eb.PulseFreeTimeBeat 5 1[pulse=9]; +eb.PulseFreeTimeBeat 6 1[pulse=9]; +eb.PulseFreeTimeBeat 7 1[pulse=9]; +eb.PulseFreeTimeBeat 8 1[pulse=9]; +``` + +**如何提示** + +> 1. 将轨道边缘染成红色(参考颜色: `#FF0000FF` ) +> 2. 在第1拍使用 `beep_mid.ogg` 自定义音效 + +不要使用内置的 `sndBeepMid` 音效! + +八拍子也可以是摇摆拍子,只需要将所有偶数拍选择并拖动即可变成摇摆拍: + +```rdview 10 3 +eb.AddClassicBeat 1 0[tick=6,swing=0.5]; +eb.AddFreeTimeBeat 1 1[pulse=2]; +eb.PulseFreeTimeBeat 2.5 1[pulse=8]; +eb.PulseFreeTimeBeat 3 1[pulse=9]; +eb.PulseFreeTimeBeat 4.5 1[pulse=9]; +eb.PulseFreeTimeBeat 5 1[pulse=9]; +eb.PulseFreeTimeBeat 6.5 1[pulse=9]; +eb.PulseFreeTimeBeat 7 1[pulse=9]; +eb.PulseFreeTimeBeat 8.5 1[pulse=9]; +``` + +在八拍子中,**激活拍子**与八拍子的对应关系如下图所示。不要给第1拍和第3拍设置X拍子,这样做它就相当于变回普通拍子了。 + +![](../images/moreclassicbeats-8beat.png) + + +## 附点变速拍(Temporal Shift) + +如果普通拍中间存在变速,则要使用变速普通拍,而其中的附点变速拍可以实现整拍长和附点拍长之间的转换。 + +整拍:以4拍为基准时长,加之它们对半分下去的拍子,如0.25,0.5,1,2,4拍。 + +附点拍:整数拍时长加上其本身一半时长构成对应的附点拍,如0.375,0.75,1.5,3拍。 + +整数拍和附点拍是交错排列的,即`0.25<->0.375<->0.5<->0.75<->1<->1.5<->2<->3<->4`。附点变速拍可以将整拍长变成附点拍长,也可以反过来,但只能变化到排列里它**相邻**的拍长上。 + +```rdview 9 3 +eb.AddFreeTimeBeat 1 0; +eb.PulseFreeTimeBeat 2 0[pulse=9]; +eb.PulseFreeTimeBeat 3 0[pulse=9]; +eb.PulseFreeTimeBeat 4 0[pulse=9]; +g 4 0 0.5 1 #08f[offset=0 0 #08f0]{ + eb.PulseFreeTimeBeat 1 0[pulse=9]; + g 1 0 0.5 1 #000[offset=0 0 #0000]{ + g 0 0 0 0 #0000[offset=0.25]{ + eb.PulseFreeTimeBeat 0.75 0[pulse=9,offset=0.25]; + g 0.75 0 0.5 1 #0000[offset=0.25]{ + eb.PulseFreeTimeBeat 0.75 0[pulse=9]; + g -1.75 0 3 1 #0000{}; + }; + }; + }; +}; +eb.AddFreeTimeBeat 1 1; +eb.PulseFreeTimeBeat 2 1[pulse=9]; +eb.PulseFreeTimeBeat 3 1[pulse=9]; +eb.PulseFreeTimeBeat 4 1[pulse=9]; +g 4 1 0.5 1 #80f[offset=0 0 #08f0]{ + eb.PulseFreeTimeBeat 1 0[pulse=9]; + g 1 0 0.5 1 #000[offset=0 0 #0000]{ + g 0 0 0 0 #0000[offset=-0.5]{ + eb.PulseFreeTimeBeat 1.5 0[pulse=9]; + g 1.5 0 0.5 1 #0000[offset=-0.5]{ + eb.PulseFreeTimeBeat 1.5 0[pulse=9]; + g -2.5 0 4.5 1 #0000{}; + }; + }; + }; +}; +``` + +**如何提示** + +> 1. 在原节奏的即将换速的前一拍将轨道边缘染色,加速时染成`#0083FFFF`,减速时染成`#5C00FFFF`,并播放自定义音效,加快时播放click_mid_amp.ogg,减慢时播放click_high_amp.ogg +> 2. 在新节奏的第一拍取消轨道边缘染色,并播放自定义音效,加快时播放click_high_amp.ogg,减慢时播放click_mid_amp.ogg + + + +## 倍速变速拍(Arrow Clicks) + +变速普通拍的另一种形式是倍速变速拍,变速是拍长翻倍或减半,注意与附点变速拍区分。 + +```rdview 11 3 +eb.AddFreeTimeBeat 1 0; +eb.PulseFreeTimeBeat 2 0[pulse=9]; +eb.PulseFreeTimeBeat 3 0[pulse=9]; +eb.PulseFreeTimeBeat 4 0[pulse=9]; +g 4 0 0.5 1 #08f[offset=0 0 #08f0]{ + eb.PulseFreeTimeBeat 1 0[pulse=9]; + g 1 0 0.5 1 #000[offset=0 0 #0000]{ + g 0 0 0 0 #0000[offset=0.5]{ + eb.PulseFreeTimeBeat 0.5 0[pulse=9]; + g 0.5 0 0.5 1 #0000[offset=0.5]{ + eb.PulseFreeTimeBeat 0.5 0[pulse=9]; + g -1.75 0 3 1 #0000{}; + }; + }; + }; +}; +eb.AddFreeTimeBeat 1 1; +eb.PulseFreeTimeBeat 2 1[pulse=9]; +eb.PulseFreeTimeBeat 3 1[pulse=9]; +eb.PulseFreeTimeBeat 4 1[pulse=9]; +g 4 1 0.5 1 #08f[offset=0 0 #08f0]{ + eb.PulseFreeTimeBeat 1 0[pulse=9]; + g 1 0 0.5 1 #000[offset=0 0 #0000]{ + g 0 0 0 0 #0000[offset=-1]{ + eb.PulseFreeTimeBeat 2 0[pulse=9]; + g 2 0 0.5 1 #0000[offset=-1]{ + eb.PulseFreeTimeBeat 2 0[pulse=9]; + g -2.5 0 4.5 1 #0000{}; + }; + }; + }; +}; +``` + +**如何提示** + +> 1. 在变速前一拍的地方播放音效,加快时播放arrow_up.ogg,减慢时播放arrow_down.ogg +> 2. 使用“切换为X字拍子设置”将变速前1拍设置为箭头(右键点击对应的位置,如果由慢到快则为上箭头,由快到慢则为下箭头) + +## 自创机制 + +对于超出社区机制之外的,完全由你自己创造的机制,一般而言都会使用电脑演示,演示几遍之后再切换给玩家游玩。在时间轴里是可以随时将轨道切换为玩家和电脑的,使用到的是紫色版块的**切换玩家轨道**事件。 + +界面也非常直观,这个并不需要过多介绍。只需要注意,在蓝色版块添加人物时也有这样一个功能,设置的是初始状态下人物由玩家还是电脑操作。 + +**什么时候需要引入自创机制** + +> 1. 新机制的重复度高,即反复次数足够多 +> 2. 易于采音 +> 3. 简短易记,令人印象深刻 + +如果你想引入的机制在关卡中只有适合插入一两次,那就没有太大的必要强加机制。改为用其他采音或者干脆放弃这段采音,不要给玩家增加无谓的负担。 + +如果你想引入的机制连介绍起来都过于复杂,以至于玩家还没能在游戏中理解你的机制,就进入游玩环节了,那就要考虑考虑这个机制的合计是否合理了。 + +**引入机制需要注意什么** + +> 1. 避免一个关卡内自创机制类型太多 +> 2. 以玩家的游戏体验为基础 +> 3. 节奏提示充足 + +机制过剩的核心概念就是,玩家所预期的机制种类越多,相对应玩家的游戏负担也就越重,同时关卡本身的节奏设计也会越发混乱。通常情况下一个关卡引入一到两个新机制就足够了。 + +当玩家打开编辑器的时候,就不能再是玩家了。这句话高度概括了节奏设计的思路。当你以谱师的身份打开编辑器,而非单纯的一个音乐/游戏分享者时,绝不可仅仅为了自己的“爽”而做谱,而是要为了真正玩到这个谱,甚至是初见这个谱的玩家来做谱。玩家会不会明白这里节奏的采音或者是节奏,能不能反应过来这里节奏的变化……这都是需要考虑的因素。 + +至于节奏的提示,除了电脑演示之外,还可以有一些画面和音乐方向的额外设计。画面提示,依然是以简单为基本,最好能清晰明了简单易懂。例如八拍子的提示仅仅是一个轨道涂色,但是清楚地提示了节奏的变化。声音提示,这对于一个机制来说是最重要的。八拍子亦如此,有着一个哔声。对于节奏医生来说,显然声音上的提示与画面上的提示同样重要,这也是无障碍设计的基础,因此不容小觑。 + +## 视频介绍 + +
\ No newline at end of file diff --git a/pages/moreoneshotbeats.md b/pages/moreoneshotbeats.md new file mode 100644 index 0000000..570612a --- /dev/null +++ b/pages/moreoneshotbeats.md @@ -0,0 +1,373 @@ +# 单发拍子的衍生节奏型 + +## 单发拍子进阶用法 + +本小节的内容可能会稍显冗长和晦涩,希望大家能保持耐心多多琢磨。 + +我们前面说过,护士提示的 Rea 和 Get 对应脉冲,Dy 和 Set 对应按拍,Go 代表单发拍开始,这种规则当然不仅仅适用于普通单发拍。先来看一个简单的摇摆单发拍: + +```rdview 11 3 +es.SayReadyGetSetGo_Get 1[]; +es.SayReadyGetSetGo_Set 2.5[]; +es.SayReadyGetSetGo_Go 5[]; +eb.AddOneshotBeat 5 1[loop=1,tick=1.5,interval=4]; +``` + +可以看到,虽然 Get-Set 与 Set-Go 之间的间隔不同,但依然保持了上述的对应关系。实际上,这就是`4-4`使用的单发拍子。 + +在`2-3`中也出现了摇摆单发拍子,可以试着自己理解一下这关的单发拍子提示: + +```rdview 10 2 +eb.AddOneshotBeat 1[]; +eb.AddOneshotBeat 3[]; +eb.AddOneshotBeat 5[tick=0.75]; +eb.AddOneshotBeat 6[tick=0.75]; +eb.AddOneshotBeat 7[tick=0.75]; +eb.AddOneshotBeat 8[tick=0.75]; +``` + +如果我们在此基础上更进一步,会发生什么呢?来看看`4-4N`中出现过的这段单发拍子: + +```rdview 12 4 +g 1 1 4 2[offset=4]{ + es.SayReadyGetSetGo_Rea 0 0[]; + es.SayReadyGetSetGo_Dy 0.75 1[]; + es.SayReadyGetSetGo_Get 1.5 0[]; + es.SayReadyGetSetGo_Set 2.25 1[]; + es.SayReadyGetSetGo_Go 4 0[]; + g 0 -1 0.75 3 #0f8[]{}; + g 1.5 -1 0.75 3 #0f8[]{}; + g 4 -1 0 3 #0f8[]{}; +}; +eb.AddOneshotBeat 5[tick=0.75]; +eb.AddOneshotBeat 6.5[tick=0.75]; +eb.AddOneshotBeat 9[tick=0.75]; +eb.AddOneshotBeat 10.5[tick=0.75]; +``` + +可以看到,图中的单发拍子已不再局限于一个单发拍子不断重复了,而是变成了若干个单发拍子构成的单发拍子组的不断重复,但前面讲过的与护士提示之间的对应关系仍保持不变。由此我们可以得到单发拍子的核心规则: + +单发拍子本质上是对一段节奏(循环节)的不断重复,这段节奏可以由一个或多个单发拍子构成。在单发拍子开始之前,会使用护士提示,以 Rea、Dy、Get、Set 的形式,重复一次(或多次)这段单发拍子循环节,并在最后用 Go 表示单发拍子的开始。 + +当对一段较为复杂的单发拍子进行提示的时候,由于循环节由多个单发拍组成,护士必然会提示多个脉冲和按拍的位置,这时仍然需要遵循只在最后一对脉冲和按拍处使用 Get Set,其余部分均使用 Rea Dy。 + +```rdview 13 4 +g 1 1 4 2[offset=4]{ + es.SayReadyGetSetGo_Rea 0 0[]; + es.SayReadyGetSetGo_Dy 1 0[]; + es.SayReadyGetSetGo_Rea 2 0[]; + es.SayReadyGetSetGo_Dy 2.5 1[]; + es.SayReadyGetSetGo_Get 3 0[]; + es.SayReadyGetSetGo_Set 3.5 1[]; + es.SayReadyGetSetGo_Go 4 0[]; + g 0 -1 1 2 #0f8[]{}; + g 2 -1 0.5 3 #0f8[]{}; + g 3 -1 0.5 3 #0f8[]{}; + g 4 -1 0 3 #0f8[]{}; +}; +eb.AddOneshotBeat 5[]; +eb.AddOneshotBeat 7[tick=0.5]; +eb.AddOneshotBeat 8[tick=0.5]; +eb.AddOneshotBeat 9[]; +eb.AddOneshotBeat 11[tick=0.5]; +eb.AddOneshotBeat 12[tick=0.5]; +``` + +当你不确定一段单发拍提示是否正确时,可以把这段单发拍提示向后复制几份,首尾相连,如果发现所有的 Dy 和 Set 均对齐了按拍时机,就说明单发拍提示是正确的。 + +## 复杂脉冲 + +正如`2-1`所说的那样,单发拍子的脉冲位置并不重要,只要保证按拍位置不变,脉冲位置是可以任意变化的。 + +同时,一个单发拍子也可能拥有不止一个脉冲。若要实现这种效果,只需将几个单发拍子的尾端对齐,首端放在不同位置即可。 + +以下单发拍子均是合法的: + +```rdview 9 2 +eb.AddOneshotBeat 1[]; +eb.AddOneshotBeat 3[]; +eb.AddOneshotBeat 3.5[tick=0.5]; +eb.AddOneshotBeat 4.75[tick=1.25]; +eb.AddOneshotBeat 5[]; +eb.AddOneshotBeat 5.75[tick=0.25]; +eb.AddOneshotBeat 7.5[tick=0.5]; +``` +![](../images/moreoneshotbeats-farmer.gif) + +但这样一来,前面所说的“Rea、Get 对应单发拍脉冲”就没有意义了吗?其实不然,Rea、Get 的作用如下: + +1. 护士提示的第一个词必然是 Rea 或 Get,也就意味着这个词代表单发拍子循环节的开始,与末尾的 Go 对应。 + +2. Rea、Get 可以辅助玩家掌握单发拍子的节奏型。在实际游玩中,玩家通常是会以 Rea、Get 为基础来进行单发拍子的演奏的。所以通常要使 Rea、Get 契合音乐或节拍设计,来达到方便玩家记忆或丰富游戏体验的效果。 + +举个例子:Rea-Dy-Get-Set-Go 与 Rea-Dy--GetSet-Go,尽管两者的按拍时机相同,但不同的 Rea、Get 位置会给人带来不同的游玩体验。 + +```rdview 12 6 +eb.AddOneshotBeat 5[]; +eb.AddOneshotBeat 7.5[tick=0.5]; +eb.AddOneshotBeat 9[]; +eb.AddOneshotBeat 11.5[tick=0.5]; +g 1 1 4 1 [offset=4]{ + es.SayReadyGetSetGo_Rea 0[]; + es.SayReadyGetSetGo_Dy 1[]; + es.SayReadyGetSetGo_Get 2.5[]; + es.SayReadyGetSetGo_Set 3[]; + es.SayReadyGetSetGo_Go 4[]; + g 0 -1 1 2 #0f8[]{}; + g 2.5 -1 0.5 2 #0f8[]{}; + g 4 -1 0 2 #0f8[]{}; +}; + +eb.AddOneshotBeat 5 3[]; +eb.AddOneshotBeat 7 3[]; +eb.AddOneshotBeat 9 3[]; +eb.AddOneshotBeat 11 3[]; +g 1 4 4 1 [offset=4]{ + es.SayReadyGetSetGo_Rea 0[]; + es.SayReadyGetSetGo_Dy 1[]; + es.SayReadyGetSetGo_Get 2[]; + es.SayReadyGetSetGo_Set 3[]; + es.SayReadyGetSetGo_Go 4[]; + g 0 -1 1 2 #0f8[]{}; + g 2 -1 1 2 #0f8[]{}; + g 4 -1 0 2 #0f8[]{}; +}; +``` + +## 跳过单发拍子 + +游戏在`2-1N`中引入了一种全新的单发拍子机制:跳过单发拍子。这种单发拍子的规则很简单:跳过单发拍子之后的一次单发拍子按拍会被跳过。跳过单发拍子无需手动添加提示,只需在单发拍子修饰符中选择跳过单发拍子,相关的视效与音效提示会被自动添加到关卡中。 + +当然,在被跳过的单发拍子的这段空白时间里,也可以放置多个单发拍子脉冲,以丰富谱面的节奏设计。跳过拍子的“间隔”参数会影响跳过符号的动画时长。 + +需要注意的是,跳过单发拍子会跳过下一次**击拍**,而不是下一个循环节。 + +```rdview 7 4 +eb.AddOneshotBeat 1[type=skipshot]; +eb.AddOneshotBeat 5[]; +eb.AddOneshotBeat 1 2[type=skipshot]; +eb.AddOneshotBeat 3 2[tick=3]; +eb.AddOneshotBeat 3.75 2[tick=2.25]; +eb.AddOneshotBeat 4.5 2[tick=1.5]; +eb.AddOneshotBeat 5.25 2[tick=0.75]; +``` + +另外,在剧情关卡中,跳过拍子的位置如果按下空格会计算成失误,但编辑器中默认是不会失误的。 + +## 方块单发拍子 + +常规的单发拍子是针对一个节奏型的不断重复,而**方块单发拍子**是“一次性”的单发拍子,即没有重复,只需按拍一次。 + +方块单发拍子最早出现于`MD-1`,在第五章更新后也出现在了`5-X`用于预警细分拍子的出现。 + +选中一个单发拍子,在修饰符中选择方块符号`◇`,将细分数量设为 1 ,便创建了一个方块单发拍子。方块单发拍子出现时需要添加特殊音效,在方块单发拍子的声音栏选择“特殊”即可自动添加提示音。 + +![](../images/moreoneshotbeats-subdivision.png) + +除此之外,方块单发拍子也需要护士提示。这种护士提示与普通单发拍子的提示类似,唯一的不同点在于最后的 Go 被替换为了 One。 + +```rdview 5 3 +eb.AddOneshotBeat 3[]; +es.SayReadyGetSetGo_Get 1 1[]; +es.SayReadyGetSetGo_Set 2 1[]; +es.SayReadyGetSetGo_Go 3 1[]; +``` + +如果相同拍长的方块单发拍子连续出现了多次,无需为每次出现添加完整的护士提示。可以逐步减少护士提示,直到完全没有护士提示,只剩下特殊提示音。 + +## 细分拍子 + +与方块单发拍子的概念类似,**细分拍子**也是“一次性”的单发拍,但是会产生多次等间距的心跳脉冲,按键的次数也变为多次。 + +细分拍子最早出现于`MD-1`,当时官方谱面没有官方名称,且最多仅有两个三角拍;后来第五章更新后三角拍首次出现在`5-1`并正式更名为**细分拍子**,并出现了多个细分。 + +在修饰符中选择方块后,将细分数量设为大于 1 的值或者点击细分符号`△`,即可创建细分拍子。特殊音效的添加与方块单发拍子类似。最多可以将细分数量设置为 10 。 + +![](../images/moreoneshotbeats-amountofsubdivision.png) + +```rdview 4 5 +eb.AddOneshotBeat 1[type=subdivision,subdivision=2]; +eb.AddOneshotBeat 1 1[type=subdivision,subdivision=3]; +eb.AddOneshotBeat 1 2[type=subdivision,subdivision=4]; +eb.AddOneshotBeat 1 3[type=subdivision,subdivision=5]; +``` + +在护士提示方面,不同于方块单发拍子,细分拍子需要在出拍前的半拍长开始数拍提示。 + +```rdview 13 +eb.AddOneshotBeat 1[type=subdivision,subdivision=2]; +g 1 1 0.5 1 #0f0[]{}; +g 1 1 1 1 #0f0[]{}; +g 0.5 1 0.5 1[offset=0.5]{ + es.SayReadyGetSetGo_2 0 1[]; +}; +eb.AddOneshotBeat 4[tick=2,type=subdivision,subdivision=2,interval=4]; +g 4 1 1 1 #0f0[]{}; +g 4 1 2 1 #0f0[]{}; +g 3 1 1 1[offset=1]{ + es.SayReadyGetSetGo_2 0 1[]; +}; +eb.AddOneshotBeat 9[tick=2,type=subdivision,subdivision=3,interval=4]; +g 9 1 1 1 #0f0[]{}; +g 9 1 2 1 #0f0[]{}; +g 8 1 1 1[offset=1]{ + es.SayReadyGetSetGo_3 0 1[]; +}; +``` + +如果你搞不懂数拍事件提前放置的规则,可以直接使用第五章新增的单发拍数拍功能。只需将细分偏移设置为 0.5 即可自动且正确地为方块拍和细分拍数拍。*但需要注意数拍不会影响单发拍护士提示事件,容易导致聚光灯滞留,可以在第一个数拍处放置一个音量 0% 的单发拍护士数拍事件即可。* + +![](../images/moreoneshotbeats-setnursesay.png) + +> 注意:非必要情况下,不要关闭方块单发拍子和细分拍子本身的声音。这对于仅靠听觉游玩的玩家而言是必要的。 + +### 单独的细分拍子 + +跟 `MD-1` 一样,你可以通过 `Rea Dy Get Set Two~Ten` 来提示单独出现的细分 2 至细分 10 。 + +单独细分的提示**与正常单发拍的提示类似**,Rea Dy 或 Get Set 之间的间隔同样用于提示细分拍子的拍长,且数字提示**和 Go! 提示一样不需要提前**。 + +```rdview 14 3 +eb.AddOneshotBeat 3[type=subdivision,subdivision=2]; +es.SayReadyGetSetGo_Get 1 1[]; +es.SayReadyGetSetGo_Set 2 1[]; +es.SayReadyGetSetGo_2 3 1[]; +eb.AddOneshotBeat 9[tick=2,type=subdivision,subdivision=4,interval=4]; +es.SayReadyGetSetGo_Get 5 1[]; +es.SayReadyGetSetGo_Set 7 1[]; +es.SayReadyGetSetGo_4 9 1[]; +``` + +## 冻结拍子🧊 + +**冻结拍子**会将单发拍子冻住,使下一拍相比正常按拍位置延后一些。 + +冻结拍子很早就存在于编辑器中,但尚未在官方关卡出现,第五章更新后终于在`5-2`首次露面,并且有了新的特效。 + +在修饰符中选中冰块符号`🧊`,就创建了一个冻结拍子。创建一个冻结拍子后,会多出“延迟”与“间隔”选项,同时相比于更新前,冻结拍子在编辑器内的样式也有所变化。 + +![](../images/moreoneshotbeats-freezeshot.png) + +```rdview 8 2 +eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2]; +eb.AddOneshotBeat 5[type=freezeshot,delay=0.5,interval=2,tick=2]; +``` + +对于一个冻结拍子而言,一共有五个关键的时间点:左十字,右十字,出拍点(绿线),原按拍点(蓝线),实际按拍点(黄线)。 + +```rdview 4 2 +eb.AddOneshotBeat 2[type=freezeshot,delay=0.5,interval=2]; +``` + +- **左十字**和**右十字**会显示两次冰冻特效并分别播放不同的冰冻音效,用于预示拍子延长的时间。 +- **绿线**代表单发拍会在此响一次。 +- **蓝线**处会将人物冻成冰块,再显示一次冰冻特效并播放一次冰冻音效,表示拍子延长的开始。 +- **黄线**处拍子会解冻并播放最后一次冰冻音效,也是玩家应该按拍的时机。 +- **绿线**与**蓝线**之间的间隔就是`拍长`的时间。 +- **左十字**与**右十字**或者**蓝线**与**黄线**之间的间隔就是`延迟`的时间。 +- **左十字**与**蓝线**或者**右十字**与**黄线**之间的间隔就是`间隔`的时间。 +- 以前由于冻结拍子尚不完善导致**绿线**不允许夹在**两个十字**之间,现在这种操作已经允许了。 + +若设计冻结拍子,还必须满足以下两个时间点正确: + +- **蓝线**所在时间应在正常单发拍子的按拍位置上; +- **左十字**必须和上一个普通单发拍子的按拍位置重合。 + +```rdview 5 3 +eb.AddOneshotBeat 1[]; +eb.AddOneshotBeat 3[type=freezeshot,delay=0.5,interval=2]; +eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80]; +eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80]; +``` + +## 灼热拍子🔥 + +与**冻结拍子**相反,**灼热拍子**会形成一股热浪,使下一拍的按拍位置提前一些。 + +第五章更新后,灼热拍子在`5-2N`首次出现。 + +在修饰符中选中火焰符号`🔥`,就创建了一个灼热拍子。创建一个灼热拍子后,会多出“间隔”选项。 + +![](../images/moreoneshotbeats-burnshot.png) + +类似地,对于一个灼热拍子,一共有四个关键的时间点:左十字,右十字,出拍点(绿线),按拍点。为作区分且方便表述,将会把按拍点称为红线。 + +```rdview 5 2 +eb.AddOneshotBeat 3[tick=0.5,type=burnshot,interval=2]; +``` + +- **左十字**和**右十字**会显示两次热浪特效并分别播放不同的灼热音效,用于预示拍子实际的时间。 +- **绿线**处会再显示一次热浪特效并播放一次灼热特效,同时单发拍会在此响一次。 +- **红线**处拍子会解除灼热状态并播放最后一次灼热音效,也是玩家应该按拍的时机。 +- **左十字**与**右十字**或者**绿线**与**红线**之间的间隔就是`拍长`的时间。 +- **左十字**与**绿线**或者**右十字**与**红线**之间的间隔就是`间隔`的时间。 + +若设计灼热拍子,还必须满足以下两个时间点正确: + +- **绿线**所在时间应在正常单发拍子的原定出拍位置上; +- **左十字**必须和上一个普通单发拍子的原定出拍位置重合。 + +```rdview 5 3 +eb.AddOneshotBeat 1[]; +eb.AddOneshotBeat 3[tick=0.5,type=burnshot,interval=2]; +eb.AddOneshotBeat 1 1[grayscale=100,offset_grayscale=80]; +eb.AddOneshotBeat 3 1[grayscale=100,offset_grayscale=80]; +``` + +最后我们针对细分拍子、冻结拍子、灼热拍子做一个技术总结: + +```rdview 19 7 +eb.AddOneshotBeat 1[loop=1]; +eb.AddOneshotBeat 5[type=freezeshot,delay=0.5,interval=2]; +eb.AddOneshotBeat 1 1[loop=1]; +eb.AddOneshotBeat 5 1[]; +eb.AddOneshotBeat 1 2[loop=1]; +eb.AddOneshotBeat 5 2[tick=0.5,type=burnshot,interval=2]; +eb.AddOneshotBeat 1 4[loop=1]; +eb.AddOneshotBeat 5 4[tick=1,type=subdivision,subdivision=2,interval=2]; +eb.AddOneshotBeat 7 4[tick=0.5,loop=1,interval=1]; +eb.AddOneshotBeat 9 4[tick=0.5,type=subdivision,subdivision=2,interval=1]; +eb.AddOneshotBeat 10 4[tick=2]; +eb.AddOneshotBeat 14 4[tick=2,type=subdivision,subdivision=3,interval=4]; +g 5 5 0.5 1 #0f0[]{}; +g 5 5 1 1 #0f0[]{}; +g 4.5 5 0.5 1[offset=0.5]{ + es.SayReadyGetSetGo_2 0 1[]; +}; +g 9 5 0.25 1 #0f0[]{}; +g 9 5 0.5 1 #0f0[]{}; +g 8.75 5 0.25 1[offset=0.25]{ + es.SayReadyGetSetGo_2 0 1[]; +}; +g 14 5 1 1 #0f0[]{}; +g 14 5 2 1 #0f0[]{}; +g 13 5 1 1[offset=1]{ + es.SayReadyGetSetGo_2 0 1[]; +}; +``` + +## 冲击拍子 + +**冲击拍子**属于一种单发拍子,但在通常情况下相比正常的单发拍而言更快,护士在喊口令的同时会伴有新的哨声提示。 + +第五章更新后,冲击拍子在`5-X`首次出现。虽然`2-2`中最快的单发拍子也相当快,但并不属于冲击拍子。 + +冲击拍子的本质是**护士提示带有哨声的单发拍**,**正拍按拍**以及**快速**是其显著特征,这两点在`5-X`中也有所体现。 + +冲击拍子除了正常的护士提示之外,开始前后还会分别会伴随四声哨子,顺序分别为**短低短低**和**高高高高**,每声哨子之间的间隔相同,且四声哨子 - 高音效与前四下按拍重合,如下图上半部分。 + +同时,仅当面临如下图下半部分特定的冲击像正常单发拍转化时,最后三个冲击拍子的按拍会伴随三声哨子,顺序分别为**高高低**。 + +![](../images/moreoneshotbeats-blastbeat.png) + +![](/images/13-23.png) +*请注意,灰色的护士提示事件只是为了方便理解单发拍机制,实际只需要放置红色护士语音事件即可。* + +虽然`5-X`引入了冲击拍子,但有几点仍需注意: +1. **冲击拍子依旧是一种单发拍子**,其护士提示方式与正常拍长的单发拍基本无异,只不过在拍长较短时需要多加两个 Rea Dy 延长预先提示。 +2. **冲击拍子并没有正拍按拍以及高速度的强制要求**,只要是一组循环的单发拍子,无论正反拍都可以加上哨声提示当作冲击拍子使用,只需注意使用场景、合理性与便捷性。 +3. 哨声虽然是判定冲击拍子的指标,但是**这只是一种新的提示方式**,只是为了让玩家更好地应对单发拍,请勿为了创造冲击拍子而随意添加哨声堆砌提示,否则会显得相当冗杂。 + +简言之,冲击拍子并不是什么新东西,只是加了哨子提示的单发拍子,仅此而已。尽管在`5-X`里其速度和正反按拍切换令人印象深刻,但只需像正常单发拍子一样使用即可。 + +总的来说,冲击拍子只是为了符合`5-X`剧情而设计的机制,其提示方式相较于正常单发拍更为复杂,如果有需要可以添加哨声提示以创造出冲击拍子,但是只使用护士语音提示也是完全合理的,需根据个人需求进行选择。~~虽然我不推荐用就是了,提示整得那么麻烦还容易出错。~~ diff --git a/pages/moverow.md b/pages/moverow.md new file mode 100644 index 0000000..12bfc0b --- /dev/null +++ b/pages/moverow.md @@ -0,0 +1,94 @@ +# 轨道移动 + +## 轨道的显示与隐藏 + +轨道在关卡进行的过程中是可以随时调整其显示和隐藏状态的,这个功能可在紫色版块的**隐藏轨道**中找到。打开后有三个设置项: + +![](../images/moverow-wyym.png) + +**轨道**:要显示/隐藏的是哪条轨道。注意一次只能选择一个,所以如果需要大批量地显示和隐藏只能一点点加入事件了。 + +**动作**:四个选项(显示/隐藏/仅显示角色/仅显示轨道),显示和隐藏比较好理解;仅显示角色的意思是没有中间的横线和右边的心脏;仅显示轨道的意思是没有左边的人物图。 + +> 如果你想要不显示心脏,最简单的办法是使用移动轨道事件将心脏移到屏幕外。如果想要隐藏所有轨道的心脏,也可以通过调用自定义方法 invisibleHeart = true 来实现,参考[自定义方法](../pages/custommethod.md)。 + +**过渡方式**:顺滑(有烟雾特效);即刻(瞬间显示/隐藏);全动画(仅限“动作”中选择“显示”,有完整的出场及轨道延伸动画)。 + +## 轨道的移动 + +想要让轨道移动位置,变大变小,以及旋转,都要依靠紫色的版块中的**移动轨道**事件。里面可以设置的项目很多,是这样的: + +![](../images/moverow-move.gif) + +> 位置,大小,角度,轴点这四个选项都可以按下这些字所在的位置来激活和关闭。关闭则表示不产生变化。 + +**轨道:**选择需要操作的轨道。 + +**目标:**可以选择移动整个轨道;移动角色与轨道的相对位置;移动心脏与轨道的相对位置。 + +**自定义位置:**选择关闭时无需输入坐标,游戏会为房间内所有非自定义位置的轨道平均分配位置。所有轨道默认均处于自定义位置关闭的状态。 + +**位置:**将轨道移动到填写的位置,默认参考的是轨道人物的中心点坐标,`x`为横坐标,`y`为纵坐标(左下角坐标:`0%, 0%`;右上角坐标:`100%, 100%`),左侧的红十字准星选择后可直接点击视窗选择位置。点击右方的`%`按钮可以改为输入像素值(左下角坐标:`0, 0`;右上角坐标:`352, 198`)。如果填写的值小于`0%`或者大于`100%`轨道会移动到屏幕之外,但是是可行的。 + +**大小:**轨道的大小,分为`x`(轨道宽度,即横向)和`y`(轨道高度,即纵向)两个变量,单位必须为百分比(`%`)而不能是像素,这点需要注意(初始大小为`x: 100%, y: 100%`)。注意,这两个值都是可以填写负数的,例如`x: -100%`即为水平镜像翻转,`y: -100%`即为垂直镜像翻转。 + +**角度:**即旋转的角度(一周`360°`),正数为顺时针转动,负数为逆时针转动。计算规则为与`0°`(初始位置)的夹角,而非与当前位置的夹角。打个比方第一次旋转了`90°`,第二次还想再旋转`90°`的话就应该填写`180°`,第二次想旋转回原始位置的话就应该填写`0°`。 + +**轴点:有关轴点的详细理解见下文。** + +**动画时长:**执行动画的时长,单位为节拍。如果此处填写`0`则是瞬间完成移动。填写负数则视为`0`。 + +**缓速:**动画的速度变化,可自行尝试。这东西在很多需要持续一段时间的特效里都会存在,里面会有很多模式,只要把握以下原则就能快速明白了:`In`代表由慢至快,`Out`代表由快至慢,`InOut`代表由慢至快再变慢。后面不同的形式也就是快慢速的细微差距,可以根据自己的需要慢慢尝试。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 轴点 + +轴点影响的是轨道位置的判断和旋转的方式,仅有一个变量,`0%`为轨道的左端角色的中心位置,`100%`为轨道的右端心脏的中心位置;默认不开启则为轨道左侧角色的正中心。 + +**轴点对于轨道位置基准的影响**:你在位置中填写的坐标即为轴点将要移动至的坐标。如果轴点为默认值,则轨道位置按轨道人物的正中心计算。如果轴点设置为`0%`,则填写的坐标为角色的中心位置将要移动至的坐标;如果轴点设置为`100%`,则填写的坐标为心脏的中心位置将要移动至的坐标。 + +由此观之,即使轨道位置坐标不变化,但轴点改变了的话,轨道在画面中的实际位置还是会变化。 + +**轴点对于轨道大小的影响**:没有。 + +**轴点对于轨道旋转效果的影响**:轨道旋转时的旋转中心即为轴点的位置。如果轴点为默认值,则绕轨道角色的中心位置旋转。如果轴点设置为`0%`,则绕轨道角色的中心位置旋转;如果轴点设置为`100%`,则绕轨道心脏的中心位置旋转。 + +当轨道已被旋转后就不要轻易改变轴点,改变轴点后先前的旋转效果都会跟着被牵连,这时运动就会变成异常复杂。例如将轴点设置为`0%`并旋转`90°`,轨道就会绕角色顺时针旋转90度,然后再把轴点改为`100%`,轨道就会变化成绕心脏顺时针旋转90度的样子。 + +既然后续轴点的改变能影响到先前的旋转和缩放的参考位置,这个时候就需要额外添加一个轨道移动来做补偿,以消除改变轴点之后轨道产生的移动,具体的补偿方式需要你在实际应用中慢慢琢磨。如果你能试着复原下面这个四方运动,那相信你已经完全理解轴点的概念了。 + +![轴点不断地在吾夜犹明和心脏之间交换](../images/moverow-wyymrowmove.gif) + +## 移动轨道的技巧 + +这一版块我们介绍一个轨道移动的组合方式,不用把这几个例子作为教科书来看待,这只是为了引导每一个作者开拓自己的脑洞。轨道移动的方式是多种多样的。 + +1、**画弧线:**x和y坐标可以单独设置,如果只想移动x轴,那么可以把y轴空着不填,这个时候再添加一个只移动y轴而把x轴空着不填的移动,它们之间就是互相独立的,允许有不同的时长和缓速方式。 + +这套动作的特点在于y轴上`OutSine`和`InSine`的交替,配合线性的x轴就形成了正弦曲线轨迹。 + +![](../images/moverow-wyymrow.gif) + +如果删掉x轴移动,那么就会变成原地弹跳。 + +如果缩短时长,那么跳跃就会变得更加动感,可以从按下空格的时间点开始设置一套这样的移动,就变成随着按拍小跳一下。`3-1`的末尾就出现了这样的小跳。 + +如果延长时长,那么跳跃就会变得更加顺滑,像是`2-3N`博美犬一样随着节奏上下舞动。 + +2、**横向翻转:**把x坐标设置为`-100%`轨道就横向翻转过来了,这样的设置其实总的来说会给读谱增加一些难度,尤其是正反轨道同时存在的情况下。因为在玩顺了官方谱的情况下我们实际上已经形成一些惯性思维了,从左到右的心跳能够更快地识别,但是从右到左会相对来说慢一些。 + +3、**多轨道:**像画画奖励关那样,有时会需要一个角色多条轨道,甚至一个角色既有单发拍子又有普通拍子,这是怎么做到的呢? + +其实原理也不复杂,一条轨道正常显示,另一条轨道在隐藏角色中选择“仅显示轨道”或是设置轨道角色时选择×;然后把两个轨道的坐标设置得相同即可。如果想要更为动感,可加入旋转等动画以增添风味。 + + +4、**移动轨道到其他房间:**当移动轨道的距离超过`852.2727%`或者是`3000px`之后,轨道就会被强制移动到相邻的房间去。这种方法可以让轨道超出每个房间最多四条的限制,但是有小概率发生一些问题,非必要情况下最好不要做这种骚操作。 + +5、**移动角色和心脏:**角色和心脏的移动是以他们在轨道中的位置为原点来移动的,比如填写`x: 0, y: 20px`则角色或者心脏向上移动20个像素。你可以使用这个功能把整个轨道挪到屏幕外面去,再以此为原点把心脏挪回来,就可以做到在屏幕内只显示心脏。 + +## 演示关卡 + +版面已经占的有些多了,更多的轨道移动脑洞我们留在演示关卡中间。 + +
\ No newline at end of file diff --git a/pages/multiplewindow.md b/pages/multiplewindow.md new file mode 100644 index 0000000..22eb0ef --- /dev/null +++ b/pages/multiplewindow.md @@ -0,0 +1,5 @@ +# 多窗口 + +> 本小节涉及未发布内容,此内容暂时仅在 2025/5/1 上海 mankalive 活动中透露。这不是最终内容,请注意甄别。 + +多窗口功能于第六章作为一个全新的板块添加进了编辑器。 \ No newline at end of file diff --git a/pages/oneshotbeat.md b/pages/oneshotbeat.md new file mode 100644 index 0000000..8741458 --- /dev/null +++ b/pages/oneshotbeat.md @@ -0,0 +1,195 @@ +# 05 单发拍子 + +## 单发拍子功能介绍 + +节奏医生中的节拍大体上可以分为两类:普通拍与单发拍,本节我们看看单发拍子如何使用。我们创建一个角色,轨道类型选择“**单发**”,将这条轨道变为单发拍子轨道。单发拍子对应的英文是“OneShot”。 + +![OneShot](../images/oneshotbeat-oneshot.jpg) + +在空白处随便点一下,就会生成一个单发拍子,并且在屏幕左上角出现一些设置。 + +![单发拍子的基本设置](../images/oneshotbeat-oneshotsettings.png) + +**拍长**指的是下图中每一组绿线到黄线之间的长度,默认值为`1`。更改数值就会改变拍长,也可以在工作区中直接拖动单发拍子首尾两端来改变,或是通过`Ctrl+鼠标滚轮`来调整拍长。 + +在“**循环**”的空栏里输入次数,这个单发拍就会被**额外**重复这么多次。当然了,直接输入循环次数的方法并不够方便,因为很多时候不听具体音乐自己也不知道该循环多少次。更方便的方法是,把鼠标移动到工作区的这个单发拍子上,右上角就会出现一个**红色的箭头符号**,按住它并拖动即可。 + +```rdview 7 3 +eb.AddOneshotBeat 1 1[tick=1,loop=2]; +``` + +在循环设置后,左上角又会多出一个“**间隔**”的设置,指的是两个绿线之间的时间长度。大多数时候,我们会将间隔设为拍长的两倍,这也就构成了一个普通单发拍子。但如果你想设计更为复杂的单发拍子节奏型,也可以试着将间隔改为其他数值:例如,把间隔改成`1`,拍长改成`0.75`,就变成了一种摇摆单发拍子。 + +```rdview 10 3 +eb.AddOneshotBeat 1 1[loop=1]; +eb.AddOneshotBeat 5 1[tick=0.75,loop=3,interval=1]; +``` + +配置好带有循环的单发拍之后,按一下“**分解为单发节拍**”,会发现它被拆散成了若干个没有循环的单发拍事件。分解后的单发拍更加便于修改,你可以为它们单独添加修饰符或额外的脉冲。 + +## 单发拍子护士提示 + +单发拍子与普通拍子不同之处在于,普通拍子可以观察前六次脉冲,推测出第普通拍的正确按键时机;但单发拍子只有一次脉冲,玩家无法仅通过单发拍子的脉冲得知按键时机。因此,为了能让玩家正确击打单发拍子,**必须为单发拍子添加护士提示**。 + +![护士语音设置](../images/oneshotbeat-whatshouldnursesay.png) + +要添加护士提示,我们需要切换到红色版块,并创建一个**护士语音设置**事件。 + +**护士应当说什么?**里,可以选择想让护士说的话。对于一个普通单发拍子,通常会使用`Get, Set, Go!`或`Rea, Dy, Get, Set, Go!`进行提示,速度较快时建议选择后者。 + +**语音**选项可以任选,但最好保证前后语音的一致性。列表最下面的“无-顶部/底部灯光”是为自定义提示或其他特殊用法准备的,不能单独作为单发拍提示。 + +将护士语音的拍长与单发拍的拍长保持一致,并将护士**喊出`Go!`的位置**与 **第一个普通单发拍的脉冲位置** 对齐即可,这样就完成了对一个普通单发拍的提示。 + +```rdview 16 12 +eb.AddOneshotBeat 5 1[tick=2]; +eb.AddOneshotBeat 9 1[tick=2]; +eb.AddOneshotBeat 13 1[tick=2]; +g 1 2 4 1[offset=4 0]{ + g 0 -1 0 2 #0f08{ + es.SayReadyGetSetGo_Get 0 1; + }; + g 2 -1 0 2 #ff08{ + es.SayReadyGetSetGo_Set 0 1; + }; + g 4 -1 0 2 #f008{ + es.SayReadyGetSetGo_Go 0 1; + }; +}; +eb.AddOneshotBeat 5 4; +eb.AddOneshotBeat 7 4; +eb.AddOneshotBeat 9 4; +eb.AddOneshotBeat 11 4; +eb.AddOneshotBeat 13 4; +g 1 5 4 2[offset=4 0]{ + es.SayReadyGetSetGo_ReaDyGetSetGo 0 0; + g 0 -1 0 3 #0f08{ + es.SayReadyGetSetGo_Rea 0 2; + }; + g 1 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Dy 0 2; + }; + g 2 -1 0 3 #0f08{ + es.SayReadyGetSetGo_Get 0 2; + }; + g 3 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Set 0 2; + }; + g 4 -1 0 3 #F008{ + es.SayReadyGetSetGo_Go 0 2; + }; +}; +eb.AddOneshotBeat 5 8[tick=0.5]; +eb.AddOneshotBeat 6 8[tick=0.5]; +eb.AddOneshotBeat 7 8[tick=0.5]; +eb.AddOneshotBeat 8 8[tick=0.5]; +eb.AddOneshotBeat 9 8[tick=0.5]; +eb.AddOneshotBeat 10 8[tick=0.5]; +eb.AddOneshotBeat 11 8[tick=0.5]; +eb.AddOneshotBeat 12 8[tick=0.5]; +eb.AddOneshotBeat 13 8[tick=0.5]; +eb.AddOneshotBeat 14 8[tick=0.5]; +g 1 9 4 2[offset=4 0]{ + g 0 -1 0 2 #0f08{ + es.SayReadyGetSetGo_Rea 0 1; + }; + g 0.5 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Dy 0 2; + }; + g 1 -1 0 2 #0f08{ + es.SayReadyGetSetGo_Rea 0 1; + }; + g 1.5 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Dy 0 2; + }; + g 2 -1 0 2 #0f08{ + es.SayReadyGetSetGo_Rea 0 1; + }; + g 2.5 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Dy 0 2; + }; + g 3 -1 0 2 #0f08{ + es.SayReadyGetSetGo_Get 0 1; + }; + g 3.5 -1 0 3 #ff08{ + es.SayReadyGetSetGo_Set 0 2; + }; + g 4 -1 0 2 #F008{ + es.SayReadyGetSetGo_Go 0 1; + }; +}; +``` + +但是为什么要这样摆放护士提示?将护士提示**分解为独立事件**,如上图中“独立的形式”所示,让我们研究一下护士提示的各个组成部分。 + +## 单发拍子提示原理 + +护士提示本质上是在单发拍子开始之前请护士用语音为玩家演示了一遍单发拍子的脉冲时机(Get)与按拍时机(Set),并在最后用 Go 告知玩家单发拍子的开始。而玩家只需要按照护士的提示,在脑中不断重复“Get Set Go(Get) Set Go(Get) Set”,并以这个节奏按拍即可。 + +而如果我们分解`Rea, Dy, Get, Set, Go!`,原理也是相同的。Rea和Get一样,用来标识单发拍脉冲位置;Dy和Set一样,用来对应单发拍按拍位置。如果还想让护士提示更多,就只在最后一组使用`Get`和`Set`,前面使用多次`Rea`和`Dy`,例如在`2-2`中的`Rea Dy Rea Dy Get Set Go!`。 + +也可以让单发拍子在几种拍速之间来回切换,提示方法与前面所讲的相同。只需要注意一点:单发拍子的节奏型应该在**Go!的瞬间**完成切换,Go之前的护士提示不会影响当前正在进行的单发拍子,而 Go 之后也不应再出现前一种单发拍子的节拍。 + +```rdview 20 5 +eb.AddOneshotBeat 3 1; +eb.AddOneshotBeat 5 1; +eb.AddOneshotBeat 7 1[tick=0.5]; +eb.AddOneshotBeat 8 1[tick=0.5]; +eb.AddOneshotBeat 9 1[tick=0.5]; +eb.AddOneshotBeat 10 1[tick=0.5]; +eb.AddOneshotBeat 11 1; +eb.AddOneshotBeat 13 1; +eb.AddOneshotBeat 15 1[tick=0.75]; +eb.AddOneshotBeat 16 1[tick=0.75]; +eb.AddOneshotBeat 17 1[tick=0.75]; +eb.AddOneshotBeat 18 1[tick=0.75]; +es.SayReadyGetSetGo_Get 1 2; +es.SayReadyGetSetGo_Set 2 2; +es.SayReadyGetSetGo_Go 3 2; +es.SayReadyGetSetGo_Get 6 2; +es.SayReadyGetSetGo_Set 6.5 3; +es.SayReadyGetSetGo_Go 7 2; +es.SayReadyGetSetGo_Get 9 2; +es.SayReadyGetSetGo_Set 10 2; +es.SayReadyGetSetGo_Go 11 2; +es.SayReadyGetSetGo_Get 14 2; +es.SayReadyGetSetGo_Set 14.75 3; +es.SayReadyGetSetGo_Go 15 2; +``` + +一个单发拍子不可能无限循环下去,总会有停下来的时候,可以使用护士提示中的`Stop`告知玩家单发拍子的结束。通常情况下,应使`Stop`对齐单发拍子的**最后一次击拍位置**。 + +为了给玩家预留更多的反应时间并提升整体听感,可以在`Stop`前的任一合适位置额外放置一个`And`语音。但注意:由于整体的`And Stop!`语音的语速是固定的,无法与BPM保持一致,因此不建议使用。 + +如果单发拍子的停止时机足够符合直觉,可以省略单发拍子的Stop,但必须保证玩家下意识多打出的拍子不会判Miss。最稳妥的方法永远是为所有单发拍子的停止都添加 Stop 提示。 + +```rdview 10 3 +eb.AddClassicBeat 2.5[tick=6]; +eb.AddOneshotBeat 1 1[]; +eb.AddOneshotBeat 3 1[]; +eb.AddOneshotBeat 5 1[]; +g 7 1 1 1{ + eb.AddOneshotBeat[grayscale=100]; +}; +``` + +如果到目前位置的内容你都已经理解了,恭喜你,已经完全掌握了基本的单发拍子的使用方法。进阶单发拍子、复杂脉冲、方块拍子、细分拍子、冻结拍子、灼热拍子以及冲击拍子我们放在[单发拍子的衍生节奏型](../pages/moreoneshotbeats.md)。 + +## 单发拍子视觉效果 + +创建一个单发拍子,点击**切换到设置波**即可生成一个**设置单发波**事件,用于修改当前轨道上单发拍子的形状和大小。修改是立即生效的,会作用在轨道上已存在的单发拍与之后的所有单发拍上,因此可以通过紧密放置多个设置单发波事件来实现单发拍子脉冲大小逐渐变化的效果。 + +![设置波](../images/oneshotbeat-oneshotwave.png) +![设置波效果](../images/oneshotbeat-nicolewave.gif) + +选中一个单发拍子,按住`Shift + H`,会发现多出了一个爱心脉冲的修饰符。启用这个修饰符,可以将单发拍的形状变成`2-X`结尾的超大爱心。 + +![隐藏的爱心](../images/oneshotbeat-heart.png) + +> 此外像`4-4`关的抖动轨道单发拍子,需调用自定义方法来完成,语句为`wobblyLines = true`。如果你还不明白自定义方法是什么,需要先翻到[自定义方法](../pages/custommethod.md)看看。考虑到这玩意问的人比较多,所以就先写在此处了。 + +## 演示关卡 + +最后依然是呈上一个示范谱面。 + +
\ No newline at end of file diff --git a/pages/room.md b/pages/room.md new file mode 100644 index 0000000..e8b7c40 --- /dev/null +++ b/pages/room.md @@ -0,0 +1,85 @@ +# 房间 + +完全掌握了节奏医生的节奏设计之后,我们要把目光放在谱面的视觉呈现上了,这一节我们就从理解“房间”的概念开始。 + +编辑器总共支持四个房间,你可以想象成一栋房子有四层楼,每层楼最多住四个人,同时,每层楼的装修可以随意摆设互不干扰。这四层楼不一定刚刚好叠在一起,可以随时移动,互不交叠,只是高度不同。我们飞在空中从上往下看,就能看到目视所及范围内的大楼景象。同时,如果空中飘扬着其他物件,也会被我们的眼睛捕捉到,如果大楼的天花板和地板是透明的,那么地基里有什么东西也会被看到。 + +当我们使用**排列显示房间**事件时,房间就只能从上到下地排列在屏幕上,而如果使用**移动房间**事件,则可以随便移动。 + +## 排列显示房间 + +![排列房间设置(左)与实际效果(右)](../images/room-visible.png) + +将左边的可见房间点亮为黄色,屏幕上就会显示这个房间,高度可以自定义,填写数据后房间高度将自动分配。详细的分配规则点击下方箭头展开。如果你懒得理解分配规则,只需永远保证**不点亮多余的房间,并且将存在的房间高度总和设置到100%**即可。 + +### 房间分配规则 +- 如果全部不填,那么 + 所有房间高度为 `25%`; +- 否则 + - 计算已填房间高度的总和 `Sum` + - 如果 `Sum = 100%`,那么 + 按实际数据设置房间高度,未填写的视为 `0%`; + - 如果 `Sum < 100%`,那么 + - 如果有未填写房间高度的房间,设个数为 `n`,那么 + 未填写高度的房间高度 `height = (100% - Sum) / n`,即均分未分配的房间高度; + - 否则 + 每个房间的房间高度 `height = height * 100% / Sum`,即等比例拉伸房间高度至高度总和为 `100%`; + - 如果 `Sum > 100%`,那么 + 每个房间的房间高度 `height = height * 100% / Sum`,即等比例缩小房间高度至高度总和为 `100%`; + +下面还留有一个时长和缓速的选项,这个和轨道移动的时所介绍的设置规律是完全相同的。如果填写0拍就是瞬间完成房间分配。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 房间的前后关系 + +但实际上很多时候我们并不想就让房间这样死板地上下排布,甚至想让这些房间交叠在一起。要做到这一点,我们得先明确各个房间叠在一起的时候,它们的前后关系是怎样的。 + +![](../images/room-animation.gif) + +首先看一个房间内,各种事件的由前往后关系是: + +> [浮动文字] + [弹幕效果] + [前景图片] + [轨道4] + [轨道3] + [轨道2] + [轨道1] + [背景图片(图片)] + [背景图片(颜色)] + +它们的前后顺序是不可改变的。 + +各个房间整体之间又有前后顺序,默认由前往后关系是: + +> [显示状态牌] + [应用到:顶部] + [房间1] + [房间2] + [房间3] + [房间4] + +四个房间的顺序是可以改变的,只需要在黄色版块内添加一个**重新排序房间**事件,把前后顺序拖动到想要的即可。 + +![](../images/room-layer.png) + +## 激活其他房间 + +在刚打开编辑器的状态下,实际上只能看到房间1。并不是另外三个房间不存在,而是房间大小被设置成了`0%`。在黄色版块中找到**移动房间**事件,事件放置在工作区的哪一行,就是对应的哪个房间被移动。创建三个移动房间事件置于234行,将“大小”设置为`(100%,100%)`,这样所有的房间都以屏幕大小叠在一起了。 + +还记得[这里](../pages/settheme.md)提到了**设置主题**事件吗,我们再添加一个“花房·昼”。由于黄色版块不再是空白的,设置主题的事件的右上角出现了新的按钮,这是将事件设置到具体房间的功能。 + +![](../images/room-theme.png) + +将带有花房·昼主题的事件选择房间4,预览效果会发现我们看到的依然是武士电子,因为现在不透明的房间1完全遮住了房间4。删掉武士电子主题,会发现背景全黑,依然看不到花房。这是因为默认状态下房间并不是透明背景,而是纯黑背景。 + +在紫色的版块找到**设置背景**事件,将背景颜色选择为纯透明,应用到123房间。再次预览,终于能看到房间4了。“应用到”选项是可以多选的。 + +![](../images/room-eventselectroom.png) + +有时还会有第五个按钮“顶部”,如果你理解了本节最开头的比喻的话,应用到顶部的事件是直接在大楼与你之间的空中生效的。房间怎么移动都不会影响到顶部。 + +![](../images/room-eventsettings.png) + +经此示例,相信你已经能理解房间的基本运作原理了。 diff --git a/pages/roomfx.md b/pages/roomfx.md new file mode 100644 index 0000000..63270fe --- /dev/null +++ b/pages/roomfx.md @@ -0,0 +1,49 @@ +# 房间视效 + +## 房间遮罩 + +### 图片遮罩 + +如果完整图片已经做好了,不想再把图片本身挖空一部分了怎么办呢,就需要用到**房间遮罩**事件。它的本质其实有点像图片编辑类软件中的图层蒙版。看下图就很好理解。 + +![](../images/roomfx-mickey1.png) + +房间1是东方不眠日,房间2是东方失眠夜。在房间1中添加一个某老鼠的头像图片,图片中的其他部分均为透明,那么最终的效果就是房间1只剩下某老鼠的部分,而剩下部分可以看到房间2。 + +![](../images/roomfx-mickey2.png) + +如果点击反转,就能看到白天的主体场景和夜晚的遮罩场景。 + +另外,对于一些瞎眼的特效,添加一个好看的遮罩会有奇效。 + +![](../images/roomfx-hexagon.png) + +遮罩还有一个神奇的用法,当你把房间放大,再放大,~~直到每一根毛都看得清清楚楚~~,直到遮罩被放大到超过屏幕而显示出下层房间的内容,这样连贯起来就可以做出《日常》的片头曲风格了。 + +![](../images/roomfx-zoom.gif) + +遮罩也是可以选择多张图片的,此时会额外出现一个帧数选项,可以让多张图片按照自己设置的速度进行循环切换,做出动图的效果。 + +### 房间遮罩 + +可以将整个房间作为遮罩去遮盖其它的房间。 + +### 颜色遮罩 + +选取特定的颜色作为遮罩。 + +## 设置房间视角 + +在前面几个小节的叙述中大家可能会发现,房间无论放大缩小总是会以一个矩形来展现。但使用了**设置房间视角**事件之后,房间的形状就可以改变为任意的四边形了。 + +此事件需要设置的条目并不复杂,而且也很直观。我们只需要将房间初始状态下的四个**角位置**进行重新定义,编辑器就会自动改变房间的整体形状了。 + +![](../images/roomfx-perspective.png) + +而**时长**和**缓速**两个条目也是见过多次了,这里也不再赘述。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/cn)。 + +## 演示关卡 + +
\ No newline at end of file diff --git a/pages/rowfx.md b/pages/rowfx.md new file mode 100644 index 0000000..0497228 --- /dev/null +++ b/pages/rowfx.md @@ -0,0 +1,75 @@ +# 轨道视效 + +## 轨道涂色 + +之前我们都在介绍和轨道移动有关的操作,这一节我们就换个方向,讲一讲轨道相关的视觉特效。首先我们能直观想到的就是给轨道涂上颜色。需要用到**轨道涂色**事件。里面有如下的一些设置项: + +![](../images/rowfx-tintrow.png) + +**受影响轨道:**选择的轨道目标,即要为哪个轨道涂色。与移动轨道不同的是,轨道涂色可以选择全部轨道。 + +**边框:**边缘的三种样式。自左向右分别为:无边框,轨道轮廓,轨道发光(除无边框外均可设置颜色)。 + +**涂色:**轨道内部全部涂成一个颜色,选择“开启”后可选择要涂色的颜色。 + +**特效:**目前仅加入了一种特效——电击,选择后轨道将出现电击的花纹,并在执行该特效的瞬间发出“刺——”的声音。注意:电击特效仅对普通拍子轨道生效,主要用来提示电击拍的,不建议乱用。 + +**透明度:**修改轨道本体的透明度,轨道边框不受此影响。想要修改边框的透明度,直接在边框的调色板中拖动透明度滑条即可。 + +> 当你把透明度调节为`0%`并打开轨道边框时,就会看到轨道线是插入进人物和心脏的像素图的。 + +**时长与缓速:**和其他特效中的完全一致,不过多赘述。 + +> 如果你想直观地看看各种移动方式的速度区别,可以[看看这里](https://easings.net/zh-cn)。 + +## 和轨道相关的特效 + +**心跳剪影:**在出现心跳拍子的同时,为轨道涂色,且每次心跳拍子都会更换颜色。但需要注意的是,心跳剪影会取消原有的轨道涂色效果。但是又必须提前添加一个轨道涂色事件,之后心跳剪影才会生效。 + +![](../images/rowfx-heartcrop.gif) + +**彩色冲击波:**在心爆时更改场景的色相,每次心爆都会更改一次(例如`1-1N`) + +> 心爆:击打拍子后心脏变白膨胀并发出“咚”的声音,伴随一圈画面微小失真。默认在普通拍子节奏的第八拍出现,或是在单发拍子节奏的之后一拍出现。可在红色版块中自由调整心爆时机。 + +![](../images/rowfx-heart.gif) + +**按键重低音:**在击打拍子时创造色像差特效。提示:在击打拍子时放慢关卡速度可创造出更精彩的特效。 + +![](../images/rowfx-bassdrop.gif) + +**心跳震屏:**在每次脉冲时产生微小的屏幕震动。注意:有些主题的背景也会跟着震动,但是有些不会。 + +**按键震屏:**在击打拍子的同时产生中等程度的屏幕震动。 + +![](../images/rowfx-shake.gif) + +**波状轨道:**很常用的特效,设置后使轨道上下波状漂浮。注意:波状轨道和之前提到的移动轨道并不冲突干涉。 + +![](../images/rowfx-kaleidoscope.gif) + +**脉冲计数:**在心跳节拍出现时,伴随脉冲数字的跳动。注意:一个房间内同时只能计一个数,如果有多个轨道的节奏同时存在,这个功能可能会显示得非常混乱。 + +![](../images/rowfx-count.gif) + +**垂直亮纹:**在心跳节拍出现时,伴随竖直的带状亮纹。注意:一个房间内同时只能高亮一个轨道,如果在高亮中其他的轨道也出现了节奏那依然是暗的。 + +![](../images/rowfx-heighlight.gif) + +## 适合配合轨道或节拍一起使用的特效 + +**闪烁:**屏幕白色闪烁,分为短,中,长三种。 + +**自定义闪烁:**可以自由设置闪烁时的颜色,透明度变化,持续时间和缓速模式等。其中有一个闪烁版选项,指的是把闪烁放在房间内的哪一图层上,左边为放在前景图之上,右边为放在背景图之上。层级先后的相关概念需要参见[这里](../pages/room.md#房间的前后关系)。 + +> 频繁闪烁的谱面请务必加上癫痫警告! + +**屏幕震动:**创造一个屏幕震动(无色像差),分为轻微、中等、剧烈三种。 + +**重低音震动:**播放颜色变化特效,即大幅度色像差加大幅度屏幕缩放。 + +## 演示关卡 + +当然了,上面这些都是逐一地介绍和演示各种特效,如果把它们融合在一起效果会非常华(目)丽(害)。下面请看演示关卡。 + +
\ No newline at end of file diff --git a/pages/settheme.md b/pages/settheme.md new file mode 100644 index 0000000..7d28810 --- /dev/null +++ b/pages/settheme.md @@ -0,0 +1,59 @@ +# 场景与主题 + +当我们在同一房间里设置了多个轨道的时候,角色位置会自动生成在屏幕上。不同的轨道数量下默认的位置也会不同: + +* 一根轨道在屏幕的`(9.94%, 50.00%)`处 +* 两根轨道在屏幕的`(9.94%, 60.61%)`,`(9.94%, 39.39%)`处 +* 三根轨道在屏幕的`(9.94%, 71.21%)`,`(9.94%, 50.00%)`,`(9.94%, 28.79%)`处 +* 四根轨道在屏幕的`(9.94%, 81.82%)`,`(9.94%, 60.61%)`,`(9.94%, 39.39%)`,`(9.94%, 18.18%)`处 + +![](../images/settheme-rowposition.png) + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

,

+

,

+

+
+
+ + +此处的坐标原点为屏幕左下角,轨道的参考位置是人物像素画的中心点。如果任其按默认位置排布,会显得有些缺乏设计感。 + +![](../images/settheme-4rows.png) + +所以在设计全程静止不动的轨道位置的时候,我们应该在一开始就让他们站在合适的位置上,并且最好能契合背景画面。下面我们拿官方自带的一些场景来举例子。使用这些场景需要在紫色版块里面添加**设置主题**,再选择“花房·昼”。然后在时间轴最开始的位置设好三个人物的轨道移动。 + +这样三个角色都**站在地上**并且有一定的交错。没错,这就是`3-1`沉睡花园。 + +![](../images/settheme-rowshowfaster.gif) + +我们预览播放一下会发现还是存在一些问题。角色是在**默认位置生成后再闪现**到设置好的位置的。 + +要解决这个问题,我们先要回到蓝色版块的人物设置里,把每个人物都选择“**隐藏**”,然后在时间轴的最开始加入三个**隐藏轨道**事件,让他们**“即刻”出现**。这样才是一开始就在理想位置的。 + +![](../images/settheme-hideheart.png) + +实际上大家在做谱的时候也不必觉得轨道一定要完全展现在画面之内,像咖啡洗头神曲中咖啡师的心脏是全程看不见的。 + +甚至轨道可以大部分位置都不可见。比如制作只显示脉冲心跳部位的单发拍子,并做成纯色等。 + +> 调用自定义方法`invisibleHeart = true`可以让轨道上的心脏消失。如果不选择角色,那么就只剩下一根线了,在一些极简色块画风的关卡里效果拔群。 diff --git a/pages/spritesheet.md b/pages/spritesheet.md new file mode 100644 index 0000000..b0126e2 --- /dev/null +++ b/pages/spritesheet.md @@ -0,0 +1,171 @@ +# 自制角色与精灵资源 + +## 像素画 + +完全自制一个角色的前提当然是要学会画像素画,因为游戏关卡内的画面都是像素风格的。能画像素画的软件市面上非常多,包括但不限于商业软件[Photoshop](https://www.adobe.com/cn/creativecloud/buying-plans.html),[SAI](https://www.systemax.jp/ja/sai/),Steam平台上的[Aseprite](https://store.steampowered.com/app/431730/Aseprite)等。当然免费的软件也是存在的,例如在线像素画软件[Piskel](https://www.piskelapp.com/),在一票免费软件中,这款的好用程度谁用谁知道。 + +具体的软件教学和像素画绘画技巧就不在这里献丑了,去[B站](https://search.bilibili.com/all?keyword=%E5%83%8F%E7%B4%A0%E7%94%BB)能找到相当多的教学视频。本节要讲的只是最后一步,导出精灵图(Sprite)。 + +当然首先得知道精灵图是什么。我们查看游戏的内置人物,会发现它们都不是静止的图片,而是会随着节奏摇摆的(例如武士的点头),也是能做出各种动作的(例如咖啡师左右互搏做咖啡),这些动作在编辑器中并非是以.gif动图的形式来存放的,而是把每一帧都拆出来,并排放在一起保存成.png。这就叫做精灵图。 + +![](../images/spritesheet-thisisspritesheet.gif) +![](../images/spritesheet-farmer.png) + +要注意,每一帧所留出的画布大小都必须是相同的,画多大的人物在绘画之前就应当考虑清楚。在像素画软件里,通常都有直接导出精灵图的功能。 + +## 导出一个.JSON文件 + +图片现在是有了,但是想要编辑器识别这个图片,还没有那么简单,我们还需要准备一个.json文件。你可以在[这个网站](https://cc.rdlevel.cn/)里导出.json文件。我们已经将网站进行了汉化,不过具体的操作流程和之前版本给出的原始网站是相同的。下面给出的具体操作流程: + +![](../images/spritesheet-step01.png) +![](../images/spritesheet-step02.png) +![](../images/spritesheet-step03.png) +![](../images/spritesheet-step04.png) +![](../images/spritesheet-step05.png) +![](../images/spritesheet-step06.png) +![](../images/spritesheet-step07.png) + +## .JSON文件的具体内容 + +老话说得好,知其然也要知其所以然。json文件也是可以手动写一个的,只要你能明白文件的编排方式就行。如果需要使用,只需要把这一堆复制下来保存到.txt中,数据按自己的来改动,最后把文件后缀名改成.json即可。**注意这个文件的文件名必须和精灵图的完全一致**。模板在下面: + +
点我展开 +```json +{ + "size": [64,64], + "name":"吾夜犹明", + "rowPreviewFrame": 1, + "rowPreviewOffset": [0, 13], + "clips": [ + { + "name": "neutral", + "frames": [0,1,2,3,4,5,6,7], + "loop": "onBeat", + "fps": 8, + "loopStart": 0, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "happy", + "frames": [8,9,10,11,12,13,14,15], + "loop": "no", + "fps":12, + "loopStart": 0, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "barely", + "frames": [16,17,18,19,20,21,22,23], + "loop": "no", + "fps": 12, + "loopStart": 0, + "portraitOffset": [16,24 + ], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "missed", + "frames": [24,25,26,27,28,29,30,31], + "loop": "yes", + "fps": 12, + "loopStart": 2, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + ] +} +``` + +
+ +> 请注意在操作系统中显示文件的拓展名,以Windows10系统举例,在文件窗口上方的【查看】列表里,文件拓展名这一项应该是✔打勾的。 如下图所示。 +> +> ![](../images/spritesheet-showextension.png) + +至于这段代码里到底要改些什么,我们一个个看。 + +- **`"size"`** + 这里填写的数字是精灵图里每一帧图片的像素大小,必须要和自己设计的大小完全一致,编辑器才能把图片正常切分。 +- **`"name"`** + 第一次出现的name里填写的名字会显示在对话中。 +- **`"rowPreviewFrame"`** + 在蓝色版块的缩略图里面显示第几帧画面。 +- **`"rowPreviewOffset"`** + 显示这个缩略图的时候,画面正中心偏移多少像素。 +- **`"clips"`** + 里面是对每个表情分别进行设置。 +- **`"name"`** + 后续出现的name指的是人物的各个表情, + 以下四个表情是默认存在的,因为和按拍效果有关,但你也可以在此基础上增加新的表情,自己命名一个其他表情,这会在紫色版块**播放表情**中有效。 + - `neutral`表示普通表情, + - `happy`表示拍子按对时的表情, + - `barely`表示拍子按歪时的表情, + - `missed`表示漏过没按时的表情。 +- **`"frames"`** + 这是每种状态所涉及的帧数。在精灵图里从左往右,从0开始计算。例如: + - `[0,1]`:第1张和第2张组合成两帧的动图; + - `[3,5]`:第4张和第6张组合成两帧的动图; + - `[0,1,1,1]`第1张和第2张组合成四帧的动图,其中第2张播放三次。 +- **`"loop"`** + 动图的循环模式,如果是`no`那么播放完就会自动回到neutral状态,如果是`onbeat`就会一直循环。 +- **`"loopStart"`** + 如果设置为循环,首先按列表播放一次完整动画,接着再从列表内第loopstart+1项播放到结尾,并以此为循环。打比方做了一个5帧的骑车的动画`[助力,上车,坐下,蹬左脚,蹬右脚]`,loopstart:3,则实际效果为骑上车后循环骑车动作。 +- **`"fps"`** + 动图播放的帧数,填大于0的帧数,就是按填写的帧数播放;填0就自动随着音乐bpm改变。 +- **`"portaitOffset"`** + 截取动图中的一部分作为显示对话时的立绘,两个数字表示截取立绘的起始位置。以每一帧画面的左下角作为原点,第一个数字为横坐标,第二个数字为纵坐标。 +- **`"portaitSize"`** + 截取动图中的一部分作为显示对话时的立绘,两个数字表示截取立绘图片的像素大小。第一个数字为立绘的宽度,第二个数字为立绘的高度。 +- **`"portaitScale"`** + 图片放大比例,这是显示对话时的立绘用的,因为立绘画面一般都只是人物的头部和上身,且立绘窗口也比较大,这里最好填写大于1的数字。 + +## 回到编辑器添加人物 + +一切准备就绪,现在进入编辑器添加一个人物,然后在人物设置里面点一下文件夹图标,选择刚才我们写好的.json文件。 + +![](../images/spritesheet-openfile.png) + +编辑器会提示你没有找到人物阴影相关的文件,是否自动创建,选择是就可以了。这样人物就被我们成功导入进来了。 + +当然了,如果你设计好了一个人物需要长期使用,可以将这一堆文件保存在节奏医生自制人物的文件夹里(`C:\用户\你自己的用户名\Documents\Rhythm Doctor\Characters\给你角色取名的文件夹`),就可以在编辑器选择人物下拉界面里面直接选取了。 + +![](../images/spritesheet-characters.png) + + +## 播放表情 + +我们在前面提到了,人物在节奏按对按错时都会自动变化表情。在没有节奏的时候手动变化表情也是允许的。在紫色的版块里面可以找到**播放表情**事件。 + +![](../images/spritesheet-expression.png) + +轨道就是选择需要变化表情的轨道,表情和json文件中的表情名是一一对应的。模式里的“一次”指的是播放新表情一遍之后自动回到原表情,“替换”指的是完全切换为新选择的表情。 + +## 选择立绘 + +在[这里](../pages/captions.md#显示对话)我们已经提到过,显示对话的对话框中手动写下立绘名字也是可以插入立绘的。如果我们在这里导入一个文件名为“吾夜犹明”的猫猫,然后在对话框的开头写下`吾夜犹明:`,那么播放的立绘就是默认的neutral那一项。**依然需要注意是英文的冒号**。如果想要选择其他表情作为立绘,则需要额外写一个下划线,后面加上表情名,例如`吾夜犹明_happy:`,`吾夜犹明_barely:`和`吾夜犹明_missed:`。 + +如果我们在json文件中自己添加了名为`Error`自定义表情,例如: + +```json +{ + "name": "Error", + "frames": [0, 1, 2, 3, 4, 5], + "loop": "onBeat", + "fps": 0, + "portraitOffset": [10, 20], + "portraitSize": [24, 45], + "portraitScale": 2 +}, +``` + +那么想要插入对应的立绘,就要在对话框里面写`吾夜犹明_Error:`,依然是下划线加上对应表情的名字。 + +## 最后的补充 + +> 好看的自制角色往往在谱面中能形成锦上添花的效果,但自制角色绝不是一个评价一个谱面好坏的唯一指标。想要把一个关卡的整体观感做好,必须是节奏,画面,玩法上的俱佳。要时刻铭记哦! \ No newline at end of file diff --git a/pages/tag.md b/pages/tag.md new file mode 100644 index 0000000..00086c0 --- /dev/null +++ b/pages/tag.md @@ -0,0 +1,359 @@ +# 标签 + +## 设置标签事件 + +有时候我们需要大量重复地完成一些特效,例如轨道和房间的循环移动等,每次都是好几个移动事件作为一组。如果每次都是大段大段地复制粘贴,那么事件栏里面的空间就会变得非常拥挤。 + +尽管紫色版块的空间已经近乎无穷大,但还是有一种让事件栏变得清爽的方案。只要把一组事件都添加一个标签,那么接下来想要运行这一整组事件,只需要再添加一个**标签动作**事件即可。 + +```rdview 18 3 +g 1 0 4 2 #ff0{ + g 0 -1 0 3 #08f[]{}; + ea.MoveRow [tag=true]; + ea.MoveRow 1[tag=true]; + ea.MoveCamera 2[tag=true]; + ea.Flash 2.5[tag=true]; + ea.HideRow 0 1[tag=true]; + ea.SetVFXPreset 1.5 1[tag=true]; + ea.SetVFXPreset 2 1[tag=true]; + ea.HideRow 3 1[tag=true]; + + g 5 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[offset_opacity=0]; + g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ + g 0 -1 0 3 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + ea.MoveCamera 2[]; + ea.Flash 2.5[]; + ea.HideRow 0 1[]; + ea.SetVFXPreset 1.5 1[]; + ea.SetVFXPreset 2 1[]; + ea.HideRow 3 1[]; + }; + }; + g 9 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ + g 0 -1 0 3 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + ea.MoveCamera 2[]; + ea.Flash 2.5[]; + ea.HideRow 0 1[]; + ea.SetVFXPreset 1.5 1[]; + ea.SetVFXPreset 2 1[]; + ea.HideRow 3 1[]; + }; + }; + g 13 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 4 2 #ff0[opacity=0,offset_opacity=100]{ + g 0 -1 0 3 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + ea.MoveCamera 2[]; + ea.Flash 2.5[]; + ea.HideRow 0 1[]; + ea.SetVFXPreset 1.5 1[]; + ea.SetVFXPreset 2 1[]; + ea.HideRow 3 1[]; + }; + }; +}; +``` + +### 基本操作 + +要给事件添加标签,首先需要选中一个事件,点击左上角**小节**两个字(或者按下快捷键`Shift + 0`),这时就能看到事件的上方多了一个名为标签的栏目。在里面填好自己设置的标签名,例如move。这个时候应该能看到轨道移动的图标左下角多了一个黄色的小三角(如上图所示)。 + +![](../images/tag-settag.gif) + +有了标签之后,再去紫色的版块添加**标签动作**事件。在标签栏同样填写move。 + +![](../images/tag-runtag.png) + +这时播放一下音乐你就会发现,带标签的轨道移动本身已经不生效了,只有时间轴走到“标签动作”的对应时刻才会让标签动作生效。 + +如果有多个事件都设置了同一个标签名,那么标签动作也就会按照这些事件的相对时间顺序依次生效。 + +![](../images/tag-tagusageexample.gif) + +> 相同标签的一组事件允许横跨多个小节,但这在早版本的编辑器里是不允许的。 + +### 特殊标签 + +另外,标签开头可以附加有特殊标签,如下表所示。这些标签会在满足特定条件时被自动调用,而不需要使用标签动作手动调用。 + +![](/images/39-14.png) + +| 标签 | 条件 | +| :-------------------- | :------------ | +| `[onHit]` | 每当有节拍被击中 | +| `[onMiss]` | 每当有节拍被错过 | +| `[onHeldPressHit]` | 每当有长按拍按下判定被击中 | +| `[onHeldReleaseHit]` | 每当有长按拍松开判定被击中 | +| `[onHeldPressMiss]` | 每当有长按拍按下判定被错过 | +| `[onHeldReleaseMiss]` | 每当有长按拍松开判定被错过 | +| `[row0]` ~ `[row15]` | 使特殊标签只作用于特定轨道 | + +对于`[rowX]`标签,X是从0开始计数的。例如,标签`[onHit][row0]`会在每次第一条轨道上有拍子被击中时被调用。如果输入的轨道编号不存在,则会应用于所有轨道(即这个特殊标签会被忽略)。 + +> 编辑器是支持只输入特殊标签的,但不推荐这样做;最好在特殊标签后都加上自己设置的标签名。 + +### 标签递归 + +如果这组事件需要在**固定周期**下循环触发,可以在这组事件循环周期完全结束的时间点上再放置一个标签动作事件,并且给这个标签动作事件添加标签,那么这个标签事件就自带循环。需要停止时再放置一个标签动作事件,动作选项中选择**禁用**。 + +```rdview 16 5 +g 1 1 2 1 #df0{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow [tag=true]; + ea.MoveRow 1[tag=true]; + + g 4 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + }; + }; + g 6 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + }; + }; + g 8 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + }; + }; + g 10 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + g 0 -1 1 1 #0000[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + }; + }; +}; +g 1 3 3 1 #df0{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow [tag=true]; + ea.MoveRow 1[tag=true]; + ea.TagAction 2[tag=true]; + g 4 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[offset_opacity=0]; + g 0 1 3 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + g 2 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + g 2 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + g 2 0 0 0 #0000[offset=0 -1]{ + ea.TagAction[]; + g 0 1 2 1 #ff0[opacity=20,offset_opacity=100]{ + g 0 -1 0 2 #08f[]{}; + ea.MoveRow []; + ea.MoveRow 1[]; + g -6 -4 1 5 #0000[]{}; + }; + }; + }; + }; + }; + }; + }; + }; + ea.TagAction 12[]; +}; +``` + +> 禁用标签不一定会立马停止运行,而是会让最后一次标签事件执行完,所以禁用事件一般需要略微提前。 + +## 筛选事件 + +当事件栏里的事件数量大到一定程度的时候,想要再从中寻找到想编辑修改的那个事件有时就会煞费时间。编辑器仍然为我们提供了一种寻找事件的方式,那就是筛选仅显示特定的事件,将其余的隐藏。 + +![](../images/tag-actionfilter.png) + +点击图中的“**显示:全部**”按钮,即可打开筛选界面。接下来点击左上角的“**不选**”按钮,所有紫色版块中的事件就都会被隐藏,此时在列表里寻找你只想要的事件并点击按钮,那么这个事件就取消隐藏了。如果想要所有的事件全都恢复显示,则再点击一次左上角的“**全选**”按钮。 + +## 让事件摆放更有条理 + +考虑到还是会有一些情况下事件并非都是重复的,而是零零散散真的有一大堆。这种情况下把事件摆放清楚会在作谱的过程中事倍功半。 + +**1、**每一行放些什么事件最好能由明确的区分,方便后期梳理自己设计了一些什么。比如把贯穿全程的浮动文字歌词都放在同一行,把移动轨道都放在同一行等。 + +```rdview 19 4 +g 0 0 19 1 #f00[]{ + ea.Comment []; + ea.FloatingText 0.5[]; + ea.FloatingText 1[]; + ea.FloatingText 1.5[]; + ea.FloatingText 2[]; + ea.FloatingText 2.5[]; + ea.FloatingText 3[]; + ea.FloatingText 3.5[]; + ea.FloatingText 4[]; + ea.AdvanceText 4.5[]; + ea.AdvanceText 5[]; + ea.AdvanceText 5.5[]; + ea.AdvanceText 6[]; + ea.AdvanceText 6.5[]; + ea.AdvanceText 7[]; + ea.AdvanceText 7.5[]; + ea.FloatingText 8[]; + ea.FloatingText 8.75[]; + ea.Comment 9.75[]; + ea.FloatingText 11.75[]; + ea.FloatingText 12.5[]; + ea.FloatingText 13.5[]; + ea.FloatingText 14[]; + ea.FloatingText 14.5[]; + ea.FloatingText 15[]; + ea.FloatingText 15.5[]; + ea.FloatingText 16[]; + ea.FloatingText 16.5[]; + ea.FloatingText 17[]; + ea.FloatingText 17.5[]; +}; +g 0 1 6.25 1 #08f[]{ + ea.MoveCamera []; + ea.MoveCamera 0.5[]; + ea.MoveCamera 1[]; + ea.MoveCamera 1.5[]; + ea.MoveCamera 2[]; + ea.MoveCamera 2.5[]; + ea.MoveCamera 3[]; + ea.MoveCamera 3.5[]; + ea.MoveCamera 4[]; + ea.MoveCamera 5[]; + ea.SetForeground 5.25[]; +}; +ea.Comment 6.25 1[]; +ea.MoveRow 7.75 1[]; +ea.MoveRow 8 1[]; +ea.MoveRow 8.75 1[]; +ea.MoveCamera 12 1[]; +ea.SetForeground 12.25 1[]; +ea.FloatingText 14.5 1[]; +ea.FloatingText 15 1[]; +ea.FloatingText 15.5 1[]; +ea.FloatingText 16 1[]; +ea.FloatingText 16.5 1[]; +ea.SetVFXPreset 18 1[]; +g 0 2 13.875 1 #06f[]{ + ea.MoveRow []; + ea.MoveRow []; + ea.Comment 1.75[]; + ea.MoveRow 2.75[]; + ea.MoveRow 3[]; + ea.MoveRow 4.5[]; + ea.MoveRow 4.75[]; + ea.MoveRow 5[]; + ea.MoveRow 5.25[]; + ea.MoveRow 6.75[]; + ea.MoveRow 7[]; + ea.MoveRow 7.5[]; + ea.MoveRow 7.75[]; + ea.MoveRow 8.5[]; + ea.MoveRow 10[]; + ea.MoveRow 10.25[]; + ea.HideRow 11.5[]; + ea.HideRow 11.5[]; + ea.MoveRow 12.5[]; + ea.MoveRow 12.75[]; +}; +ea.Comment 14 2[]; +g 0 3 18 1 #f80[]{ + ea.FloatingText 0.5[]; + ea.AdvanceText 1[]; + ea.AdvanceText 1.5[]; + ea.AdvanceText 2.5[]; + ea.AdvanceText 3[]; + ea.AdvanceText 4.5[]; + ea.AdvanceText 5[]; + ea.AdvanceText 5.5[]; + ea.AdvanceText 6[]; + ea.AdvanceText 6.5[]; + ea.AdvanceText 7[]; + ea.AdvanceText 8[]; + ea.AdvanceText 10.5[]; + ea.AdvanceText 11.5[]; + ea.AdvanceText 12[]; + ea.AdvanceText 12.5[]; + ea.AdvanceText 13[]; + ea.AdvanceText 13.5[]; + ea.AdvanceText 14[]; + ea.AdvanceText 14.5[]; + ea.AdvanceText 15[]; + ea.AdvanceText 15.5[]; + ea.AdvanceText 16[]; + ea.AdvanceText 16.5[]; + ea.AdvanceText 17[]; + ea.AdvanceText 17.5[]; +}; +``` + +**2、**如果有一串同类型的事件紧密排布,例如每1/4格或者1/2格放一个,那么可以考虑不放在同一行,而是上下交错排开。 + +```rdview 16 4 +ea.MoveRow []; +ea.MoveRow 1[]; +ea.MoveRow 2[]; +ea.MoveRow 4[]; +ea.MoveRow 5[]; +ea.MoveRow 6[]; +ea.MoveRow 8[]; +ea.MoveRow 9[]; +ea.MoveRow 10[]; +ea.MoveRow 12[]; +ea.MoveRow 13[]; +ea.MoveRow 14[]; +ea.MoveRow 0.5 1[]; +ea.MoveRow 1.5 1[]; +ea.MoveRow 3 1[]; +ea.MoveRow 4.5 1[]; +ea.MoveRow 5.5 1[]; +ea.MoveRow 7 1[]; +ea.MoveRow 8.5 1[]; +ea.MoveRow 9.5 1[]; +ea.MoveRow 11 1[]; +ea.MoveRow 12.5 1[]; +ea.MoveRow 13.5 1[]; +ea.MoveRow 15 1[]; +ea.Comment 4 3[]; +``` + +**3、**对于事件总体数量不太高的情况,如果有操作房间和轨道类型的特效,可以考虑把他们放在对应数量的行里,找起来会更加方便。 + +**4、**如果你发现在音乐初始位置需要叠放大量特效来给各个轨道和主题等做初始化,那么也最好把同类特效叠在一起。这分为两种情况:一种是相同的特效叠在一起;另一种是操作相同的对象的叠在一起。这两种都是非常直观的。 + +**5、**如果需要花费一个比较长的时间跨度来制作一个谱面,那么最好放置一些注释来解释每一个小段的设计思路,以免在咕咕了一阵子之后完全失去了方向。**注释**事件在可以在红色、紫色、绿色、黄色的版块里找到。 + +![](../images/tag-comment.png) diff --git a/pages/variable.md b/pages/variable.md new file mode 100644 index 0000000..3c907bd --- /dev/null +++ b/pages/variable.md @@ -0,0 +1,68 @@ +# 变量 + +## 变量 + +变量,顾名思义可以简单理解为可变的量,类似于数学中的用字母表示量,可参加一定的运算。如果你学过Python、C++等高级语言,那么恭喜你,节奏医生中变量的表达与之接近;如果没有学过也无需顾虑,本节向大家介绍变量的使用。 + +变量分为两种,只读变量和可写变量。 + +### 只读变量 + +只读变量多表示游戏中的即时参数,提供有关游戏当前状态的信息。它们的值随游戏进行可以发生变化,但是不可人为修改。下面提供了只读变量的变量名及其有关定义: + +| 变量名 | 定义 | +| :--- | :--- | +| bpm | 当前的bpm | +| barNumber | 当前所在的小节编号 | +| numEarlyHits | 目前过早按拍的次数 | +| numLateHits | 目前过晚按拍的次数 | +| numPerfectHits | 目前完美按拍的次数 | +| numMisses | 目前错过拍子的次数(不考虑错误权重) | +| numMistakes | 目前错过拍子的次数(考虑错误权重) | +| XPress | 当X被按下的瞬间值为true,其余时刻为false | +| XRelease | 当X被松开的瞬间值为true,其余时刻为false | +| XIsPressed | 当X被按下时值为true,否则为false | + +特别地,上表中后三行变量名中的X特指按键名,使用时将X替换为对应的按键名,分别为p1(玩家1)、p2(玩家2)、anyPlayer(任意玩家)、up(上)、down(下)、left(左)、right(右)。 + +### 可写变量 + +可写变量与只读变量类似,其参数可以随游戏进程变化,与只读变量不同的是,可写变量的值可人为更改。可写变量大致可分为三类: + +> 1. **整型**(int):整型变量可以存储整数,变量名写作i0、i1、...、i9。 +> 2. **浮点型**(float):浮点型变量可以存储浮点数(也就是小数。特别地,形如1.0的值为浮点数),变量名写作f0、f1、...、f9。 +> 3. **布尔型**(boolean, 也可简写为 bool):布尔型变量可以存储布尔值。布尔值包含且仅包含True(真)和False(伪)。布尔型变量名写作b0、b1、...、b9。 + +需要注意的是上述三类变量,每类有且仅有所列举的10个,且无法修改变量名。一般地,整形变量的值属于区间[-2147483648, 2147483647],而浮点型变量取值范围相对广泛。 + +特别地,存在一额外的整型变量,写作buttonPressCount,用法与一般整型变量相同,区别在于该变量的值在玩家按键时自动+1。 + +## 变量的运算、比较与使用 +变量的运算需要使用运算符,运算符可分为三类,分别为赋值运算符、算术运算符、比较运算符。语法如下表: + +| 表达式 | 含义 | +| :--- | :--- | +| ++ | 值+1 | +| \-\- | 值-1 | +| = | 赋值为 | +| + | 加 | +| - | 减 | +| * | 乘 | +| / | 除 | +| % | 模 | +| == | 相等 | +| != | 不等 | +| < | 小于 | +| > | 大于 | + +变量可以在调用自定义方法;浮动文字、显示对话、显示状态牌;条件中使用。 + +> 1. **调用自定义方法** +> 可以在调用自定义方法的表达式框里对变量进行读写、赋值,可使用赋值运算符。 +> 例如:i1++(使i1的值+1),i4=4(将i4的值赋为4) +> 2. **浮动文字、显示对话、显示状态牌** +> 变量可以嵌入到这些事件的显示内容中,使用时将表达式用大括号包裹起来,可使用算数运算符连接。 +> 例如:“武士有{i0}个朋友,洛根比武士多{i1}个朋友,所以洛根有{i0+i1}个朋友。”这句话在i0==4且i1==6时输出为“武士有4个朋友,洛根比武士多6个朋友,所以洛根有10个朋友。” +> 3. **条件** +> 变量可用于自定义类型条件的表达式框中。通常与比较运算符结合使用。 +> 例如:i0==10(i0等于10)、i5 在关卡中出现对比度较高画面快速交替,如红蓝、黑白快速闪烁,必须开启癫痫警告。使用“放克”特效,必须开启癫痫警告。使用“干扰”特效较多,建议开启癫痫警告。一秒出现3次以上快速闪烁,建议开启癫痫警告。 + +> 即使开启了癫痫警告,也不要设计出会伤害视力的干扰效果。 + +## 综述 + +视觉干扰效果算是节奏医生做谱的一大特色了。因为游戏玩法本身是可以做到纯音押的,所以在视觉上对玩家进行考验不仅可以增大难度,同时又可以有很新奇的观赏效果。在剧情模式中,视觉干扰主要集中在`1-X 东方失眠夜`,`1-XN 超·东方失眠夜`两关,其余还有关卡的小部分环节用到了视觉干扰,效果都极具震撼。 + +需要注意的是,**视觉干扰不等于读谱不能**,更不等于塞爆。这些干扰是为重复或单一的节奏增添趣味与挑战性而添加的,虽然一定意义上增加了读谱难度,但是仍应当给玩家留有恰当的反应时间。如果节奏设计本身就有难度,还刻意阻挡玩家进行识谱,效果将会是适得其反的。 + +另外,视觉干扰设计的主要原则依然是采音。音乐具有这样的特色,且不好转变为轨道节奏的话,就把这部分采音对应到视觉的同步变化和卡顿,完美地解决节奏设计与画面设计两个问题。 + +## 卡带效果 + +如果你对剧情关卡`1-X`东方不眠夜还有印象的话,或许能回忆起节奏配合着音乐一卡一卡的效果,这就是靠**卡带效果**做到的,它可以让心跳在某一拍卡住。 + +![](../images/vfx-settings.jpg) + +这样看图似乎也不够直观,我们举几个实例来看看是怎么做到的: + +![拍子源 2 长度 0.25 循环 3 的卡带效果](../images/vfx-witch.gif) + +能看到其中一个单发拍子拍下空格之后蓝条是**反复闪烁了3次**的,这就是循环的作用;而这三次闪烁之间的**时间间隔均为0.25拍**,这就是长度的作用;循环的是该小节**第2拍起头时的画面**,这就是拍子源的作用。 + +![拍子源 1 长度 0.25 循环 7 的卡带效果 + 拍子源 3 长度 0.5 循环 1 的卡带效果](../images/vfx-electronicgirlrotate.gif) + +这里的音乐段是一个密集的鼓点,于是就按照鼓点的节奏同步地设计了卡带效果,并且反复。这个卡带的位置刚好放置了一个轨道的旋转,进而做到了轨道卡壳转不动的效果。 + +这似乎也给了我们一个很好的提示:卡带效果往往都是和音乐中的配器节奏同步的,画面跟随着音乐一起卡才能卡在一个最爽的位置。密集的采音往往本身也就不适合用来做节奏,将其转化为卡带效果反而能够出奇制胜。 + +## 设置速度 +**设置速度**事件修改的是画面的播放速度,但注意,音乐速度并不会跟着改变,改变的只有设置主题里的动画速度,平铺背景的移动速度,所有带有“动画时长”设置的事件的变化速度等。 + +其中带有“动画时长”设置的事件(例如轨道移动,浮动文字)是要特别注意的,例如你填写了动画时长为`2拍`,同时又设置速度为`2倍`,那么该事件就在1拍的时间里完成了。 + +设置速度事件可以填写小数,并且最低可以修改为`0`。当速度为0时画面就会静止,但很邪门的是轨道上的人物和节奏脉冲是对此免疫的,要注意考虑好是否隐藏这些轨道以免造成违和感。 + +![频繁地设置速度为 0 与正常值交替带来卡机效果](../images/vfx-electronicgirlglich.gif) + +## 预设特效的多重叠合 + +很多预设特效都自带一点画面干扰的倾向,而将这些效果叠加就能加剧干扰效果,如果再叠加上一节所述的镜厅效果则会更加一发不可收拾。堆预设特效可以玩玩,但也要适度。 + +除镜厅外,放克特效也是要谨慎使用的,过大的饱和度会让眼部急剧不适,往往可以放在整个场景的最底层空区域进行一个小面积适度的铺设。 + +下面举几个例子: + +**竖直滚屏+VHS+电影噪点+高光** + +带来信号干扰、丢失的感觉 + +**顶部镜厅+摄像头/房间动画** + +旋转,跳跃,残影,你画面拉出了完美的拖尾 + +**屏幕翻转+颜色反转+滚屏** + +画面你别乱跑 + +**短暂的噪点/干扰** + +默数拍子开启 + +**放克+落雨+灰度+慢游戏速度** + +听话,别把灰度去掉 + +**25%白色前景闪烁+暴风雪+雪花+VHS+关闭竖直滚屏+电影噪点+JPEG失真+落雨+快游戏速度** + +最后的绝望(《冰与火之舞》 “XH-X 最后的希望”类似效果) \ No newline at end of file diff --git a/pages/windowmove.md b/pages/windowmove.md new file mode 100644 index 0000000..9b8569f --- /dev/null +++ b/pages/windowmove.md @@ -0,0 +1,31 @@ +# 窗口移动 + +## 演示关卡 + +考虑到这一章节截图不太方便,我们先奉上演示关卡。直接在关卡内看注释会更直白。 + +
+ +## 需要注意的地方 + +1. 如果在编辑器中加入了窗口动效,编辑器也会固定窗口化。退出编辑器会回到全屏状态。在编辑器中按下`Alt + Enter`可以暂时进入全屏,但是只是单纯地放大画面,导致高糊,并且在播放状态下仍旧会强制回到窗口状态。 + +1. 在播放过程中如果无法点击到屏幕上的暂停键可以按快捷键`P`。 + +1. 在插入窗口动效之后一整关都得以窗口模式游玩,不能在窗口和全屏之间来回切换。窗口本身虽然更灵活了,但画面内容的表现力会有所下降。 + +1. 根据上一点,游戏画面内的特效就可以相对来说做简单一些。并不是不能做太多,而是在投入了相当的时间成本之后,画面本身的效果提升收益有限。参考`2-X`,游戏主题主要集中在万花筒,`4-1N`,游戏主题主要集中在沙漠和列车。实际上窗口在移动和跳跃的情况下画面内的特效本身就是难以捕捉到的,做多了反而还会变成干扰效果。 + +1. 有没有考虑过一个大多数时间段窗口都在屏幕外面的图?如果音押设计合理的话,这也是可以实现的。~~做特效就可以偷懒~~。 + +1. 目前版本已经有模拟窗口模式的功能了,不妨试试。 + +## 伪窗口动效 + +实际上窗口动效这一事件所能带来的视觉效果并无太多深度。在玩过几个以这样方式演出的关卡之后,对窗口动效的新鲜感就会大打折扣。但是别忘了我们是能够使用房间移动的。假如我们缩小一个房间,给它加上一个Windows风格的窗口作为前景,再给后方的房间布置一个Windows风格的桌面,如此一来就做出了伪窗口动效效果。 + +![](../images/windowmove-window.png) + +相比于窗口动效,房间移动可以做到改变“窗口”的大小和角度,使用起来会更加灵活。同时,自制的桌面背景也是用房间来构成,所以也就能够在其中设计花样。 + +额外需要提及的一点是,伪窗口动效会很轻易被玩家识破,所以不要觉得“我只需要动一动房间玩家就会觉得满足了”,这样的谱面见得多了一样会出现审美疲劳。如果从桌面系统的角度去思考,制作一些能够打破第四面墙的“互动”感,做出来的谱子会更有意思。 \ No newline at end of file diff --git a/resources/Appendix8.md b/resources/Appendix8.md new file mode 100644 index 0000000..cc2b6ec --- /dev/null +++ b/resources/Appendix8.md @@ -0,0 +1,174 @@ +--- +title: "附录8 代码编写关卡" +--- +点击[此处](../stuff/compiler.exe)下载。项目作者:硫酸铜。项目来源:[PyRD - 为视障谱师写节奏医生谱子的一种全新的尝试](https://github.com/qwedc001/pyrd)。 + +本附录为了介绍更为简明化,部分计算机术语被替代,可以前往我的github项目查找原文档(*作者注:有人能帮我写一下文档就好了,文档苦手伤不起*) + +项目介绍:PyRD,又名Python Rhythm Doctor,旨在使用代码创建Rhythm Doctor的自定义关卡,这个项目发起的本心是为了方便节奏医生的视障玩家去制作优质的谱面,而不是对着一个冗长的JSON文件发愁。 + +后来经过节奏医生官方开发huantian的建议,将原有的Python写代码转换成了学习成本更低的YAML标记格式,引出github分支yaml,文档上方提供的下载就是用于翻译yaml为rdlevel的解释器(我并没有做检查语法功能,有大佬会写可以来提交pr) + +此处文档以介绍分支yaml为主,在此分支下,解释器解释的文件后缀为.sprd(Simple RD) + +如果你想直接使用python写rdlevel,你可以直接git clone以后将pyrd.py引入项目,然后根据里面提供的函数进行编写。 + +先通俗的解释一下.sprd文件的构造,建议配合文档末尾提供的示例对比学习。 + +.sprd文件主要分为三大块,分别是metadata(关卡信息),角色和小节具体内容。 + +## Metadata关卡信息的填写 + +在每一块内,每一句是通过换行来分隔的,且在开头有1个空格,比如: +```yaml +metadata: + 艺术家 硫酸铜 + 歌曲 SimpleRD + 难度 简单 + 癫痫 关 +``` +以上四句话分占四行,在中间有空格,空格前为参数,空格后为内容 + +metadata可以填写的参数有: +```yaml +metadata: + 艺术家:艺术家名称 + 歌曲:歌曲名称 + 作者:作者名称 + 描述:描述 + 癫痫:是/否 + 难度:简单/普通/困难/噩梦 + 标签:标签 + rank所需错误数:[20,15,10,5] + rank描述:["F","D","C","B","A","S"] +``` +当然,如果你选择全空着也不是不行,所有metadata此时都会填空。 + +## Character角色信息的填写 + +角色是一行一个角色,角色只有参数,中间用英文逗号分割。 +角色一共有十个参数,其中有五个参数是必填的,剩下五个是你想要填才填,不想填可以不填的。 +如果你想要填一个,空一个,再填一个,那么要空过去的那个参数用英文句号.代替。 + +角色的五个必填参数按照顺序是: +角色名(不想写可以填无),节拍类型(普通拍/单发拍),角色在第几个房间,角色在第几个轨道,角色节拍音效(还没有写对照表,后期补上) + +角色的五个选填参数按照顺序是: +在开始时隐藏轨道,节拍音量,节拍音调高低,节拍声象,节拍偏移,比如: + +```yaml + - [武士,普通拍,0,1,Stick] + - [科尔,单发拍,0,2,Kick] +``` +## Bar每个小节的填写 + +针对于节拍部分,从第三块开始,接下来每一个小节都标上对应的数字,在之后的内容前再加上一个空格。比如: +```yaml +1: + - [播放音乐,1,sndOrientalTechno,100,0] +``` +这里的语法是:- [内容,参数],内容之间/参数和内容之间用英文逗号分隔。 + +几个已经支持的语法:(带星号为可选参数,并且最后有一个“条件”参数,这个参数因为所有语法都支持所以不单独列出) + +```yaml +- [播放音乐,事件在当前小节第几拍,音乐名,BPM,偏移,*音乐音量,*音乐音高,*音乐音像] +- [普通拍,事件在当前小节第几拍,事件在第几轨道,普通拍长度,摇摆拍设置] +- [单发拍,事件在当前小节第几拍,事件在第几轨道,单发拍长度,*单发拍循环,*是否跳过此拍,*冰冻拍间隔,*单发拍类型,*是否播放方块音] +- [设置静音,事件在当前小节第几拍,事件在第几轨道,静音模式(由6个字符组成,-代表正常,x代表静音),切分音拍,切分音摇摆] +- [长按拍,事件在当前小节第几拍,事件在第几轨道,长按拍长度,长按拍摇摆,长按拍按住长度,长按拍X模式] +- [自由拍开始,事件在当前小节第几拍,事件在第几轨道] +- [自由拍脉冲,事件在当前小节第几拍,事件在第几轨道,脉冲行为,自定义脉冲] +- [设置护士音效,事件在当前小节第几拍,说的内容是什么,*是谁的声音,*要提示的单发拍拍长,*音量] +- [设置BPM,事件在当前小节第几拍,bpm] +- [播放音效,事件在当前小节第几拍,音效文件,*音量,*音高,*音像,*偏移,*是否为自定义音效] +- [设置数拍音效,事件在当前小节第几拍,事件在第几轨道,*数拍音效声音,*是否开启,*音量] +- [朗读轨道,事件在当前小节第几拍,事件在第几轨道,信息种类,轨道自定义X,*是否跳过朗读"紊乱",*只发出声音,*朗读X拍] +- [朗读说明,事件在当前小节第几拍,朗读文本,*说明分类] +- [显示对话,事件在当前小节第几拍,对话文字,对话速度,*立绘位置,*播放音效] + +``` +详细的参数类型可以在pyrd.py中找到,更详细的docs需要等到有时间再进行维护,或者你们谁维护了给我提交个pull request也行。 +编写完成后,请执行python compiler.py 你的sprd文件名 + + +(进阶)VFX语法(由群内0x4D2提供): + +```yaml +- [预设特效,事件在当前小节第几拍,事件在第几轨道,特效名称,*是否激活,*属性] +``` +只有个别特效具有 属性 参数。 + + - 对于 落雨/JPEG失真/马赛克/海底波浪/电影噪点/暴风雪/素描/色像差/模糊/径向模糊/色调偏移:强度,缓速时长,缓速 + + - 对于 自定义屏幕块/自定义滚屏:x/y + + - 对于 高光:阈值,强度,颜色,缓速时长,缓速 + +```yaml +- [设置背景,事件在当前小节第几拍,事件在第几轨道,模式,*颜色,*图片,*fps,*填充模式,*过滤器] +``` + + * 模式: 颜色/图片 + + * 对于 平铺 填充模式,有额外的参数:速度x,速度y,时长,缓速 + +```yaml +- [轨道涂色,事件在当前小节第几拍,事件在第几轨道,*受影响的轨道编号,*边框样式,*边框颜色,*边框透明度,*是否启动电击效果,*透明度,*是否填充,*填充颜色,*填充透明度] +``` + + +* 受影响的轨道编号 如果为-1或"全部",则全部轨道均受影响, + +* 边框样式 无边框/轮廓/发光 + +* 透明度最大为100(不透明) + +```yaml +- [闪烁,事件在当前小节第几拍,事件在第几轨道,时长] +``` + +* 时长 短/中/长 + +```yaml +- [注释,事件在当前小节第几拍,事件在第几轨道,注释文字,*播放时是否显示注释,*注释颜色] +``` + +## 示例:Github项目 exampleYAML.sprd + +```yaml +metadata: + 艺术家: 节奏医生 + 歌曲: 1-1 + 作者: 卢毅 + 难度: 简单 + 癫痫: 关 + 描述: 这是一个关卡。 +角色: + - [武士,普通拍,0,1,Stick] + - [科尔,单发拍,0,2,Kick] +小节: + 1: + - [PlayMusic,1,sndOrientalTechno,100,0] + - [预设特效,1,0,落雨,开] + - [设置背景,1,1,颜色,626262FF] + - [轨道涂色,1,2,全部,发光] + - [普通拍,1,1,1,0] + 2: + - [普通拍,1,1,1,0] + 3: + - [普通拍,1,1,1,0] + 4: + - [普通拍,1,1,1,0] + - [设置护士音效,5,SayReaDyGetSetGoNew,.,1,100] + 5: + - [单发拍,1,2,1] + - [单发拍,3,2,1] + - [单发拍,5,2,1] + - [单发拍,7,2,1] + - [设置护士音效,8,JustSayStop,.,1,100] + - [闪烁,1,0,长] + - [闪烁,5,0,长] + - [注释,1,1,插入两个闪光,动作,开] + +``` \ No newline at end of file diff --git a/resources/Background.png b/resources/Background.png new file mode 100644 index 0000000..63dddd1 Binary files /dev/null and b/resources/Background.png differ diff --git a/resources/Beta.png b/resources/Beta.png new file mode 100644 index 0000000..3e4b0da Binary files /dev/null and b/resources/Beta.png differ diff --git a/resources/BombBeats.png b/resources/BombBeats.png new file mode 100644 index 0000000..66d9b2a Binary files /dev/null and b/resources/BombBeats.png differ diff --git a/resources/Cues.png b/resources/Cues.png new file mode 100644 index 0000000..cb3208a Binary files /dev/null and b/resources/Cues.png differ diff --git a/resources/Cues2.png b/resources/Cues2.png new file mode 100644 index 0000000..c9163fd Binary files /dev/null and b/resources/Cues2.png differ diff --git a/resources/Depth.png b/resources/Depth.png new file mode 100644 index 0000000..b87251d Binary files /dev/null and b/resources/Depth.png differ diff --git a/resources/Hotkey.svg b/resources/Hotkey.svg new file mode 100644 index 0000000..b6a855c --- /dev/null +++ b/resources/Hotkey.svg @@ -0,0 +1,1467 @@ + + + + + + 帮助 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESC + BACK + DELETE + PRTSCSYSRQ + SCRLOCK + PAUSEBREAK + INSERT + HOME + HOME + PAGEUP + NUMLOCK + PGUP + PGDN + PAGEDOWN + END + END + 7 + 8 + 9 + 4 + 5 + 6 + 1 + 0 + 2 + 3 + + + + + + + + + DELETE + ENTER + ENTER + SHIFT + SHIFT + ALT + APP + + ALT + WIN + WIN + CTRL + CTRL + CAPS LOCK + TAB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESC + BACK + DELETE + PRTSCSYSRQ + SCRLOCK + PAUSEBREAK + INSERT + HOME + HOME + PAGEUP + NUMLOCK + PGUP + PGDN + PAGEDOWN + END + END + 7 + 8 + 9 + 4 + 5 + 6 + 1 + 0 + 2 + 3 + + + + + + + + + DELETE + ENTER + ENTER + SHIFT + SHIFT + ALT + APP + + ALT + WIN + WIN + CTRL + CTRL + CAPS LOCK + TAB + 房间 + 房间 + 房间 + 房间 + 缩小界面 + 打开关卡 + 关闭关卡 + 窗口大小 + 游玩模式 + 剪切 + 撤销 + 重做 + 复制 + 粘贴 + 粘贴至下一节 + 原地粘贴 + 新建关卡 + 下载关卡 + 放大界面 + + + + + + 显示/隐藏事件慢速播放 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESC + BACK + DELETE + PRTSCSYSRQ + SCRLOCK + PAUSEBREAK + INSERT + HOME + HOME + PAGEUP + NUMLOCK + PGUP + PGDN + PAGEDOWN + END + END + 7 + 8 + 9 + 4 + 5 + 6 + 1 + 0 + 2 + 3 + + + + + + + + + DELETE + ENTER + ENTER + SHIFT + SHIFT + ALT + APP + + ALT + WIN + WIN + CTRL + CTRL + CAPS LOCK + TAB + + + + + + 退出 + 框选复制 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESC + BACK + DELETE + PRTSCSYSRQ + SCRLOCK + PAUSEBREAK + INSERT + HOME + HOME + PAGEUP + NUMLOCK + PGUP + PGDN + PAGEDOWN + END + END + 7 + 8 + 9 + 4 + 5 + 6 + 1 + 0 + 2 + 3 + + + + + + + + + DELETE + ENTER + ENTER + SHIFT + SHIFT + ALT + APP + + ALT + WIN + WIN + CTRL + CTRL + CAPS LOCK + TAB + + + + + + 帮助 + 容错判定 + 详细关卡结算 + 多选快速播放 + 向前全选 + 向后全选 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ESC + BACK + DELETE + PRTSCSYSRQ + SCRLOCK + PAUSEBREAK + INSERT + HOME + HOME + PAGEUP + NUMLOCK + PGUP + PGDN + PAGEDOWN + END + END + 7 + 8 + 9 + 4 + 5 + 6 + 1 + 0 + 2 + 3 + + + + + + + + + DELETE + ENTER + ENTER + SHIFT + SHIFT + ALT + APP + + ALT + WIN + WIN + CTRL + CTRL + CAPS LOCK + TAB + CPU演示 + 声音 + 帮助 + 轨道 + 动作 + 精灵 + 房间 + 节拍器 + 重播当前小节 + 回到开始 + 下一小节 + 全屏预览 + 左滚动 + 右滚动 + 播放/暂停 + + + + + + + 选择 + 删除 + + 发布关卡 + 粘贴至下一节 + 减少显示行数 + 增加显示行数 + 所有栏向前全选 + 所有栏向后全选 + \ No newline at end of file diff --git a/resources/JSON.txt b/resources/JSON.txt new file mode 100644 index 0000000..c0c79a0 --- /dev/null +++ b/resources/JSON.txt @@ -0,0 +1,49 @@ +{ + "size": [64,64], + "name":"吾夜犹明", + "rowPreviewFrame": 1, + "rowPreviewOffset": [0, 13], + "clips": [ + { + "name": "neutral", + "frames": [0,1,2,3,4,5,6,7], + "loop": "onBeat", + "fps": 8, + "loopStart": 0, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "happy", + "frames": [8,9,10,11,12,13,14,15], + "loop": "no", + "fps":12, + "loopStart": 0, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "barely", + "frames": [16,17,18,19,20,21,22,23], + "loop": "no", + "fps": 12, + "loopStart": 0, + "portraitOffset": [16,24 + ], + "portraitSize": [32,32], + "portraitScale": 2 + }, + { + "name": "missed", + "frames": [24,25,26,27,28,29,30,31], + "loop": "yes", + "fps": 12, + "loopStart": 2, + "portraitOffset": [16,24], + "portraitSize": [32,32], + "portraitScale": 2 + }, + ] +} \ No newline at end of file diff --git a/resources/PositionOfRows.png b/resources/PositionOfRows.png new file mode 100644 index 0000000..80fefb1 Binary files /dev/null and b/resources/PositionOfRows.png differ diff --git a/resources/Syncopated.png b/resources/Syncopated.png new file mode 100644 index 0000000..98a91f4 Binary files /dev/null and b/resources/Syncopated.png differ diff --git a/resources/Syncopated2.png b/resources/Syncopated2.png new file mode 100644 index 0000000..8eed952 Binary files /dev/null and b/resources/Syncopated2.png differ diff --git a/resources/Syncopated3.png b/resources/Syncopated3.png new file mode 100644 index 0000000..ce931b1 Binary files /dev/null and b/resources/Syncopated3.png differ diff --git a/resources/TSAC.png b/resources/TSAC.png new file mode 100644 index 0000000..079d7f2 Binary files /dev/null and b/resources/TSAC.png differ diff --git a/resources/Window.png b/resources/Window.png new file mode 100644 index 0000000..1bfd0a3 Binary files /dev/null and b/resources/Window.png differ diff --git a/resources/compiler.exe b/resources/compiler.exe new file mode 100644 index 0000000..4e05404 Binary files /dev/null and b/resources/compiler.exe differ diff --git a/resources/epilogue.md b/resources/epilogue.md new file mode 100644 index 0000000..fca1b7c --- /dev/null +++ b/resources/epilogue.md @@ -0,0 +1,61 @@ +--- +title: "尾声" +description: "我们还有些想说的话" +permalink: /epilogue.html +--- + +到此为止,编辑器教程的正文部分就完全结束了,一不小心这个网站也经营了一年了,不知道总结出的这个教程质量如何,心中诚惶诚恐。因为我等几人也并非什么神仙大佬,编辑器怎么用,全凭自己费时间摸索。教程里技巧虽多,但也都带点每个人自己的使用习惯,示例关卡更是如此。 + +虽搁笔至此,但每人心中都还是憋着几句话想要一吐为快。不如就以此作为整个教程的收尾吧。 + +> 整本编辑器教程写到此处收工,通读下来不知各位看官是否注意到了一点。要做出一个谱子其实非常容易,把编辑器的第一大章看完,再加上自己随便这点点,那戳戳,该有的该会的都能做得像那么回事。但为什么这本教程写了足足九万二千多字,不惜笔墨花了三十多章节来一点点的教学?因为每个功能虽然界面一说就懂,但是背后暗藏的细节太多了。 +> +> 整个学习的过程大概也分三个阶段。第一个阶段要慢慢熟悉编辑器,理解官方为什么要把剧情模式的每一关设计成现在玩到的样子。第二个阶段要逐渐把节奏设计和视觉效果的技术力提高,做出一个体验完整的谱面。第三个阶段,当技术力已经提升到优秀的线以上的时候,就要开始琢磨跳脱出节奏医生之外的玩法设计、画面叙事以及情感表达了。 +> +> 所以我对于每一位看到这里的读者都有一个期待,除了把功能都用会之外,一定再多花一些时间让关卡变得更好。既然教程都已看过,切莫再抱以“我的做谱水平就到这了,不想再改了”的心态把视频和关卡一发了之。我们毫无保留地把自己的做谱经验分享出来,虽不妄图让各位严格遵照,成为诸如编辑器的教科书云云,**但殷切期待所有学成者都能以此为契机打开思路,能意识到一些之前未曾考虑过的想法,并让下一个谱子变得比之前更好**。 +> +> 愿你我共勉。 +> +> {:.align-right} +> ——养老院里安享晚年的山不转水到渠成 + +> 《节奏医生》真的是一款很棒的游戏,而关卡编辑器又给这款游戏的内容赋予了极高的上限,让玩家能够在欣赏完官方剧情后能够发挥创意自行创作并分享给更多玩家。但是这款游戏的热度一直以来都比较低,很少人愿意在体验完官方剧情后尝试创作关卡,而坚持下来的人少之又少,这种情况很大程度上是由编辑器一定的上手门槛导致的。因此我们联合为大家带来了编辑器的教程,希望能够帮助大家理解编辑器的各种功能和学习制作关卡的一些技巧,当然还有更重要的一点:了解制作一个合格关卡的基本要求。 +> +> 我们过去看过许多社区的自制关卡,其中虽然有很多的优秀作品,但也有不少不够规范,粗制滥造的劣质关卡(包括本人一开始制作的几个关卡),这些关卡或多或少地影响了路人对这款游戏的第一印象和《节奏医生》玩家对自制关卡的第一印象,并对自制关卡的制作产生了一些误解(最典型的是误把《节奏医生》当成硬核音游,并按照硬核音游的标准来制作关卡),进而产生了更多的劣质关卡,这种恶性循环对游戏社区的构建和人们对这款游戏的认识都有非常不好的影响。 +> +> 我们制作教程的初衷是希望大家在学会使用编辑器制作关卡后能够为社区带来更好的作品,减少劣质关卡的产生,既然官方把制作关卡的权力交给了玩家,我们玩家就不应该辜负官方的信任,这个游戏不该在玩家手里变烂(我们所制作的关卡可能会影响人们对这款游戏的认识,进而影响人们对这款游戏的评判)。因此我希望各位能在这个教程的帮助下创作出更多优秀的作品,为《节奏医生》这款游戏带来更加精彩的内容。 +> +> 新世界大门的钥匙已经准备好了,祝你们好运! +> +> **(省流大师:编辑器不难,好学又好玩。做烂关卡影响不利,做好关卡皆大欢喜。)** +> +> {:.align-right} +> ——吾夜犹明 + +> 我曾讨论过一个问题:《节奏医生》是音游还是亚音游。也得到了很多种结果。我最支持的是《节奏医生》是新式音游,主要在于游戏中的普通拍和长按拍都增加对应的提示拍。而且这是一款单键音游,设计时考虑到了盲人玩家也可游玩(就像节奏天国一样)。因此,《节奏医生》的铺面设计和其他音游也存在不同。本作和 [7th Beat Games](https://store.steampowered.com/search/?developer=7th%20Beat%20Games) 的另一部作品《冰与火之舞》一样,提供了关卡编辑器,让玩家在打完官谱后有发挥自己想象力和创造力的空间。《节奏医生》因独特的玩法,使得关卡编辑器的内容更加丰富,做出来的关卡更加深层次,多元化、立体化。 +> +> 但同时,也因为独特的读谱机制,使得自制谱的潜规则更加复杂(Adofai里边只要能看清轨道就没什么问题),官方节奏和自创节奏的提示也有严格的要求。因此,节奏医生关卡编辑器的人气不是很高,而且国内优秀的谱师和自制谱也没有很多(说实话我并不觉得我是“优秀的谱师”)。最后,希望通过本部教程,能让更多的人喜爱这款游戏,并且在尝试完主线关卡后有兴趣钻研关卡编辑器的相关内容。**认真遵循官方发布的社区关卡制谱规范,拒绝塞爆**。 +> +> 留给大家钻研的彩蛋: +> +> 45 39 氚 1 101 8 6 氚 8 86 5 +> +> 102 16 氚 92 9 9 49 g +> +> Менделе́ев-Периодична таблица на еле +> +> {:.align-right} +> ——喜欢精灵宝可梦的黄黄 + +> 感想什么的,感觉跟学校的语文作业一样,好为难啊…… +> +> 关于这次教程,我的参与面是比较少的,但我玩过的谱面还是比较多的,毕竟经常直播打谱了,良谱屑谱奇葩谱都有接触过,自己也写了两份很简单并没有太多特效的谱面了,就从游玩者和编辑器初学者的角度来谈谈我对于自定义关卡跟编辑器的感受和对于谱面的一些想法吧。 +> +> 首先是作为一个玩家来说,节奏医生是主打单键节奏的音游,所以节奏感一定是很重要的,视觉效果不讲,如果单纯的拍子都没有跟音乐对应那玩起来肯定很难受。我打了很多谱碰到的节奏都对不好的谱还真的比我想象中的要多很多,如果你是看到这里的跟我一样的萌新宝宝,记得一定要先学会对好节奏,找好节拍哦,这点很重要,就像盖房子的地基,打好了才能稳定。 +> +> 其次呢是作为一个编辑器的初学者,编辑器特效那么多,再加上各种自定义代码可以解决的就更多了,肯定有你不懂的地方,这个时候一定要厚着脸皮去多问比自己懂得多的前辈们,问多了自然就记住了。也可以没事就自己开个编辑器玩,多尝试自己没有使用过的效果,自己试多了之后有创作灵感了才能有办法去实施。初学者可能会有很多想法不知道怎么去实现,只要敢想敢问敢尝试,一定能做出自己想要的效果的。 +> +> 做到上面这两点并不难,其实作谱也就是这样。编辑器上手门槛也并不算难,我也没有特别多的想跟大家说的,毕竟我也只是个初学者,就感谢一下制作本教程的其他大佬能给我这个B站超级鸽子这个和大家谈话的机会吧,希望大家都能做出能让自己喜欢,被大家认可的谱吧,我们一起进步。 +> +> {:.align-right} +> ——一个希望自己能火却经常咕这咕那的鸽子,丘露帆 diff --git a/resources/offset.pdf b/resources/offset.pdf new file mode 100644 index 0000000..0dc6af4 --- /dev/null +++ b/resources/offset.pdf @@ -0,0 +1,214 @@ +基于《节奏医生》的音频 BPM 与偏移量获取方法 + + 作者:花米酱 + 2024 年 5 月 + 摘要 + + (也可以把这段话看成是引言/绪论之类的。不规范的论文格式,请勿参考。) + 在各类音乐游戏进行自定义关卡制作前,首先需要获取正确的 BPM 与偏移 +值。本文基于游戏《节奏医生》,提供多种获取音频 BPM 与偏移值的方法,其他 +音乐游戏可适当参考。本文将以视觉为主,获取音乐偏移值。本文所介绍的方法, +是个人习惯的做法,没有考虑乐理或其它专业的做法。如有不懂的部分或建议, +请务必向我提出,感谢。 + +关键词:偏移;BPM;《节奏医生》 + + 目录 + + 摘要........................................................................................................................ 1 + 一 准备工作.......................................................................................................... 2 + 二 基本术语.......................................................................................................... 2 + + 2.1 BPM .........................................................................................................2 + 2.2 音频偏移................................................................................................. 2 + 三 步骤.................................................................................................................. 3 + 3.1 转格式..................................................................................................... 3 + 3.2 获取 BPM ...............................................................................................3 + + 3.2.1 软件获取 BPM ............................................................................3 + 3.2.2 手按获取 BPM ............................................................................3 + 3.3 获取偏移................................................................................................. 4 + 3.3.1 偏移 0 法.......................................................................................4 + 3.3.2 声音寻找法...................................................................................4 + 3.3.3 手动找节拍法...............................................................................5 + 四 总结.................................................................................................................. 8 + + 1 + 一 准备工作 + + 本人常用以下软件,可用其它功能相似的软件或网站代替。 + 格式工厂(用于音频文件的格式转换) + MixMeister BPM Analyzer(用于获取 BPM) + Audacity(用于查看音频的波形图) + + 二 基本术语 + +2.1 BPM + + Beat Per Minute,即每分钟的节拍数。 + 例如,BPM 为 120,则每分钟 120 节拍,即 60/120=0.5s 一拍。 + + BPM 的值乘以一个值,等效于所有事件的时长(包括所有节拍的拍长)乘 +以该值。在还没开始制谱的情况下,BPM 可以适当增减整数倍以方便后续制谱。 +(本人习惯调成 120~240,仅供参考) + +2.2 音频偏移 + + Offset,简称偏移值、偏移,即整个音频往前/后移动的毫秒数。 + 偏移增加,则音频向前移动,即更快听到音频,即编辑器内音频向左移动一 +点。偏移减少反之。 + + 偏移值(单位为 s)±60/BPM 值*整数,相当于音频向前/后移动整数拍,配 +合“设置音节长度”事件可以等效音频的位置不变。建议在制谱前,按上述公式 +调整偏移值,使其绝对值最小,以减少 bug。(请至少调节到±600ms 以内) + + 2 + 三 步骤 + +3.1 转格式 + + 用格式工厂将音频转换成 ogg。若音频文件非 mp3 或 wav,额外转一份。 + + 对于节奏医生来说,建议使用 ogg 或 wav 格式的音频文件(mp3 的音频会 +导致偏移不准),更推荐文件体积相对较小的 ogg 格式。 + + mp3 与转换的 ogg,两者 BPM 相同但偏移不同。 + wav 与转换的 ogg,两者偏移与 BPM 都相同。 + +3.2 获取 BPM + + 3.2.1 软件获取 BPM + mp3 或 wav(我这版本只能识别这俩)导入到 MixMeister BPM Analyzer,获 +取 BPM,然后删掉,只留 ogg。 + + 如果 BPM 接近整数(或 0.5 倍数等)的值,建议四舍五入至整数(本人习 +惯±0.1 以内可舍入,仅供参考)。如果舍入后感觉歌曲前后偏移不一致,可尝试 +调回原来的值。 + + 软件获取的 BPM 可能有误(特别是时长较短的音频与变 BPM 音频),需大 +致确认全曲的 BPM 值是否正确,再进行偏移获取。 + + 对于变速曲,软件获取的 BPM 一般是开头段的 BPM(或错误的 BPM)。 + + 3.2.2 手按获取 BPM + 在节奏医生编辑器“播放音乐”与“设置 BPM”事件里,按空格对 BPM。 + + 也有一些网站可以实现这个功能。 + 对于变速段时长较短的音频,还没按完就到另一段变速,可以尝试每拍按两 +(或更多)次。(必须等间隔按,比较考验个人能力) + + 3 + 在节奏医生里,对于 BPM 较高的音乐,可以按住 ctrl 点播放(0.75 倍速), +再点“BPM 计算”的按钮,最后将对出的 BPM 值/0.75 填入,需注意误差极大, +不推荐使用。 + +3.3 获取偏移 + + 3.3.1 偏移 0 法 + 新建关卡,导入 ogg,将音频的 BPM 填好,尝试偏移填 0,打开节拍器听一 +下是否对上,对上就直接用。 + + 3.3.2 声音寻找法 + 打开 Audacity,导入 ogg,点轨道左下的“选择”全选轨道,界面上面的“分 +析”,“声音寻找”,“将低于此电平的音频视作静音(-dB)”填入 30~42(仅供参 +考,默认值为 30),出现一条标签轨,点一下标签轨的第一个标签并对齐光标, +看下面“选区的起点和终点”获取起点,记得单位转换成 ms(注意 min 和 s 的 +转换是 60,s 和 ms 是 1000),即为偏移,填入关卡,打开节拍器听一下是否对 +上,对上就直接用。 + + 对于歌曲类的音频,本人不常用此方法,可跳过。 + 此方法只适用于音频开头第一个声音就是第一拍的情况,一般用于对音效的 +偏移。 + 但是此方法误差较大,因为这个值是十的倍数 ms,可以结合下面的手动找 +节拍法使用。 + 可自行探究“将低于此电平的音频视作静音(-dB)”的值改为更小的值(即 +更大的声音才会出现标签),寻找波形图开头的第一个尖峰当作偏移值。(比较麻 +烦,并且误差更大,不推荐使用) + + 4 + 3.3.3 手动找节拍法 + 打开 Audacity,导入 ogg,缩放移动轨道,寻找波形图有落差(一般是从低 +到高)的地方,听一下是不是整拍的节奏,如果是的话放大,光标对准“刚好开 +始有落差”的位置,跟上一步骤一样获取起点即为偏移。 + “刚好开始有落差”的位置如下。(看不清楚的话,也可以对第一个最高的 +尖尖,但会有少许误差) + + 图 1 beignet - re-new Memory + + 建议整首歌寻找,而不建议只看开头,说不定可能后面有好看的地方。 + 建议找到节拍后放大轨道来精准定位,减少误差。 + 建议在不同地方重复该步骤多次,取平均值。 + 尽量寻找落差比较清晰的地方(或者长得比较细的节拍)。以下波形图从上 +到下是从清晰到难以看清。 + + 5 + 图 2 beignet - re-new Memory + + 尽量寻找一些落差很大的地方。以下波形图从左到右是从落差小到落差大。 + + 图 3 Kirara Magic - Chaos Nya + + 可以尝试右键左侧数轴,选“分贝”,这时可以寻找疏密交界线(从疏到密) +的地方,部分情况下可能比“线性”好看一点。建议“线性”和“分贝”两者综 +合来看。以下波形图左侧是“线性”,右侧是“分贝”。 + + 6 + 图 4 beignet - re-new Memory + + 3.4 变 BPM 音频的处理方法 + 在确保开头到变速段的 BPM 与偏移是正确的情况下,找到变速的大致位置 + +(打开节拍器播放,直到偏移突然对不准的地方),第一个方法是用 Audacity 把 +变速之后的段落剪下来,按上述步骤,软件获取 BPM(需注意是否正确)。第二 +个方法是按上述步骤,手按获取 BPM。 + + 改变 BPM 的时刻大部分在整拍的地方。 + 对于极小部分音频(例如真人演奏的音乐等),BPM 不是固定值,需每隔一 +段时间调整一次 BPM,十分麻烦。 + 部分变 BPM 的音频可以在网上找到其 BPM 变化情况。 + + 7 + 四 总结 + + (参考文献省略了,只稍微参考了一下编辑器教程 https://rd.rdlevel.cn/) + BPM 与偏移可认为是有一个客观正确的范围,而获取 BPM 与偏移的方法却 +有很多种主观方法。BPM 比较容易获取,一般都没问题,一般都是偏移的问题。 +每个人对出来的偏移值可能会有少许差异,只要听起来玩起来没有特别大的问题 +就可以看成是一个对好了的偏移了。最后,还是建议回到听觉上,听一下 BPM +与偏移是否正确。如果认真看完了上述教程,还是没把握的话,可以把你对出来 +的值给我或者别人看看是否正确。 + +练习题,参考答案在下一页(仅供参考)。 +此教程非盈利,以下是所使用的歌曲一览,如有侵权请联系我修改或删除。 + +曲师/歌手 - 歌名(文件名) 备注 +beignet - re-new Memory 教程中使用,不作习题 +Kirara Magic - Chaos Nya 教程中使用,不作习题 +ナナツカゼ, PIKASONIC & nakotanmaru - 春めく 极简,没啥难点 +Mitsukiyo - Pixel Time 简单,节拍清晰,但是多 +Neko Hacker - Sweet Dreams (feat. 利香) 中等,看全曲,有几个很好对的点 +YUC'e - Future Cαndy 困难,节拍不清晰 +塞壬唱片-MSR - 我的生活 困难,节拍难找 +YOASOBI - アイドル 变速曲 +Neko Hacker - 夢追う者よ(feat.をとは) 变速曲 + +没有音效偏移的习题。 +变速曲的变速时间点在对应的 rdlevel 文件。 +BPM 增减整数倍,偏移值(单位为 s)±60/BPM 值*整数,等效正确答案。 +不建议使用偏移 0 法,除非你想浪费这几个练习题。请在实际制谱时使用。 +如需重复练习,可以自己剪一下开头,再对一次偏移。 + +8 + BPM 偏移(ms) 曲师/歌手 - 歌名(文件名) +150 0 beignet - re-new Memory +128 0 Kirara Magic - Chaos Nya +120 0 ナナツカゼ, PIKASONIC & nakotanmaru - 春めく +120 -116 Mitsukiyo - Pixel Time +140 0 Neko Hacker - Sweet Dreams (feat. 利香) +180 0 YUC'e - Future Cαndy +175 74 塞壬唱片-MSR - 我的生活 +166-150-158.5-166 0 YOASOBI - アイドル +180-200-150-180 183 Neko Hacker - 夢追う者よ(feat.をとは) + + 9 + diff --git a/resources/rdview-example.md b/resources/rdview-example.md new file mode 100644 index 0000000..d287596 --- /dev/null +++ b/resources/rdview-example.md @@ -0,0 +1,125 @@ +--- +title: "rdview-example" +use_rdview: true +--- + +行内 事件。 + + + + + + BPM: + + + + + + 四分音符数 + + 节拍视效倍率 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sounds.zip b/resources/sounds.zip new file mode 100644 index 0000000..a86b27a Binary files /dev/null and b/resources/sounds.zip differ diff --git a/resources/变量.docx b/resources/变量.docx new file mode 100644 index 0000000..42e9cb5 --- /dev/null +++ b/resources/变量.docx @@ -0,0 +1,101 @@ +用可变数据进行运算 + + +一、变量 +顾名思义,变量可以简单理解为可变的量,类似于数学中的用字母表示量,可参加一定的运算。如果你学过Python、C++等高级语言,那么恭喜你,节奏医生中变量的表达与之接近;如果没有学过也无需顾虑,本节向大家介绍变量的使用。 + +变量分为两种,只读变量和可写变量。 + + 只读变量 +只读变量多表示游戏中的即时参数,提供有关游戏当前状态的信息。它们的值随游戏进行可以发生变化,但是不可人为修改。下面提供了只读变量的变量名及其有关定义: +变量名 +定义 +bpm +当前的bpm +barNumber +当前所在的小节编号 +numEarlyHits +目前过早按拍的次数 +numLateHits +目前过晚按拍的次数 +numPerfectHits +目前完美按拍的次数 +numMisses +目前错过拍子的次数(不考虑错误权重) +numMistakes +目前错过拍子的次数(考虑错误权重) +XPress +当X被按下的瞬间值为true,其余时刻为false +XRelease +当X被松开的瞬间值为true,其余时刻为false +XIsPressed +当X被按下时值为true,否则为false +特别地,上表中后三行变量名中的X特指按键名,使用时将X替换为对应的按键名,分别为p1(玩家1)、p2(玩家2)、anyPlayer(任意玩家)、up(上)、down(下)、left(左)、right(右)。 + + 可写变量 +可写变量与只读变量类似,其参数可以随游戏进程变化,与只读变量不同的是,可写变量的值可人为更改。可写变量大致可分为三类: + 整型(int) +整型变量可以存储整数,变量名写作i0、i1、...、i9。 + 浮点型(float) +浮点型变量可以存储浮点数(也就是小数。特别地,形如1.0的值为浮点数),变量名写作f0、f1、...、f9。 + 布尔型(boolean) +布尔型变量可以存储布尔值。布尔值包含且仅包含True(真)和False(伪)。布尔型变量名写作b0、b1、...、b9。 + +需要注意的是上述三类变量,每类有且仅有所列举的10个,且无法修改变量名。一般地,整形变量的值属于区间[-2147483648, 2147483647],而浮点型变量取值范围相对广泛。 + +特别地,存在一额外的整型变量,写作buttonPressCount,用法与一般整型变量相同,区别在于该变量的值在玩家按键时自动+1。 + + +三、变量的运算、不比较与使用 +变量的运算需要使用运算符,运算符可分为三类,分别为赋值运算符、算术运算符、比较运算符。语法如下表 + +表达式 +含义 +赋值运算符 +++ +值+1 + +-- +值-1 + += +赋值为 +算术运算符 ++ +加 + +- +减 + +* +乘 + +/ +除 + +% +模(即取余数,负数的余数为负数或0) +比较运算符 +== +相等 + +!= +不等 + +< +小于 + +> +大于 + +变量可以在调用自定义方法;浮动文字、显示对话、显示状态牌;条件中使用。 + + 调用自定义方法 +可以在调用自定义方法的表达式框里对变量进行读写、赋值,可使用赋值运算符。 +例如:i1++(使i1的值+1),i4=4(将i4的值赋为4) + 浮动文字、显示对话、显示状态牌 +变量可以嵌入到这些事件的显示内容中,使用时将表达式用大括号包裹起来,可使用算数运算符连接。 +例如:"武士有{i0}个朋友,洛根比武士多{i1}个朋友,所以洛根有{i0+i1}个朋友。"这句话在i0==4且i1==6时输出为"武士有4个朋友,洛根比武士多6个朋友,所以洛根有10个朋友。" + 条件 +变量可用于自定义类型条件的表达式框中。通常与比较运算符结合使用。 +例如:i0==10(i0等于10)、i50.375<->0.5<->0.75<->1<->1.5<->2之间一个层级的变化(而不能跨两个层级) + +图4-1 从1->1.5的Temp Shift和1->0.75的Temp Shift(第5拍发生变速) + +图4-1 从1->1.5的Temp Shift和1->0.75的Temp Shift(第5拍发生变速) + + 提示方法: + 1)在变速发生的前1拍将轨道涂色(参考下方表格,下同),并播放音效 + 2)在发生变速的拍子取消染色,并播放音效 + + 图4-2 Temp Shift的提示方法 + 图4-2 Temp Shift的提示方法 + +5.倍速变速拍(Arrow Clicks) + 和Temp Shift一样,也是7拍中间存在变速,但是这个变速是时长翻倍或减半而不是附点的变化,注意区分. + + 图5-1 时长减半和时长翻倍的Arrow Clicks(在第5拍发生变速) + 注意与Temp Shift区分 + 图5-1 时长减半和时长翻倍的Arrow Clicks(在第5拍发生变速) + 注意与Temp Shift区分 + + 提示方法: + 1)在变速前一拍的地方播放音效(如果由慢到快播放arrow_up.ogg,由快到慢播放arrow_down.ogg) + 2)使用"X拍子设置"将变速前1拍设置为箭头(使用右键点击对应的位置,如果由慢到快则为上箭头,由快到慢则为下箭头),例如5-1中的两个Arrow Clicks应该如下图设置: + + + 图5-2,5-3 因为在第5拍变速,所以将第4拍改为对应的箭头 + 图5-2,5-3 因为在第5拍变速,所以将第4拍改为对应的箭头 + + + + + + + + +6.6-beat tresillo + 首先科普一下:Tresillo是一种3拍形式,由2个附点拍和一个其对应的整数拍构成 + 而6-beat tresillo就是将两个tresillo节奏放在一起,分别放在123拍和567拍,组成一个6拍 + + 图6-1 6-beat tresillo在编辑器中的形式 + (轨道上任意地方都可以打X,第4拍会被跳过) + 图6-1 6-beat tresillo在编辑器中的形式 + (轨道上任意地方都可以打X,第4拍会被跳过) + + 提示方法: + 在需要6-beat tresillo的上一个打击拍处播放tresillocue.ogg,同时将轨道发光设定为蓝色#0080FFFF + 需要自定义精灵图Tresillo.json(在imags文件夹中),在需要6-beat tresillo的上一个打击拍处播放表情"Trans",并将发光设定为蓝色#0080FFFF. + 在即将关闭6-BT的最后一个打击拍时播放tresillooffcue.ogg,播放表情Return,关闭轨道和精灵图的发光 +图6-2 精灵图中心坐标与角色立绘坐标重合时,感叹号会出现在第4拍的位置上(注意保证角度,大小也要一致) +图6-2 精灵图中心坐标与角色立绘坐标重合时,感叹号会出现在第4拍的位置上(注意保证角度,大小也要一致) + 注意:在6-beat tresillo关闭之前保证精灵图与轨道移动保持重合(轨道轴点为0,精灵图轴点为50,50,其余的各个参数需保持一致,这样精灵图中的感叹号才会出现在第4拍的位置) + + + +7.3-peat + 将7拍分为3+3+1的3部分,前两个部分为2个速度相同的匀速3拍,第3部分为打击拍,1,2部分,2,3部分之间都有一个较长间隔,该间隔必须大于前两个部分3拍的拍长,且两个间隔必须相等. +图7-1 7拍被分为3+3+1的3部分前2部分为2个匀速3拍,最后为打击拍,部分之间的间隔必须大于3拍的拍长且需要相等 +图7-1 7拍被分为3+3+1的3部分前2部分为2个匀速3拍,最后为打击拍,部分之间的间隔必须大于3拍的拍长且需要相等 + + + 提示方法: + 1)在第1拍播放tringHi.ogg,并将轨道标亮蓝色#29C4FFC7 + 2)在第7拍时取消染色(同理,如果连续出现,则只需要在最后一个取消染色) + + + + + + + + + + + +8.Metronomic tachycardia(撞轨拍子) + 这实际上是一种变种的二拍子,用类似于节拍器的方法连续打拍.两个打击之间的间隔作为拍长. + + + + + + + 图8-1 一条轨道固定,另一条轨道以一定频率上下摆动 + 图8-1 一条轨道固定,另一条轨道以一定频率上下摆动 + 如图8-1,其中一条轨道固定,另一条轨道上下周期性摆动,每次两条轨道重合时需要按键,摆动时记得加缓速(由于难以描述,请一定记得参考演示关卡) + 提示方法: + 在第一拍的前4,3,2个拍长的地方播放metronomelow.ogg,在前1个拍长的地方播放metronomehi.ogg,并添加倒计时的浮动文字. + 在第一拍前1个拍长的地方,其中一条轨道开始摆动,每次打拍的时候两条轨道需恰好重合 + 最后一拍时播放护士的Stop(可以提前1拍放And,也可以不放) + 如果中途存在变速,需要像1中一样重新提示,类似于二拍 + 可以在开始时加入任意颜色的发光或不加入,但建议是给摆动的轨道完全涂色+发光,固定的轨道发光,颜色随意. diff --git a/resources/还原向谱面教学.docx b/resources/还原向谱面教学.docx new file mode 100644 index 0000000..ff8266a --- /dev/null +++ b/resources/还原向谱面教学.docx @@ -0,0 +1,29 @@ + 节奏医生还原向谱面教学 +概述 + 节奏医生作为一个以画面为特点的音游,很多新人谱师刚开始是很难凭借自己的想象设计出一个良好的动画效果的。因此很多人可能会选择有PV/BGA的音乐,并尝试还原其中的画面。最终的成品就是画面尽量保证与原PV一致或相近,这就是我们所说的还原向谱面。 + 注意:这只是节奏医生中的一种谱面风格,谱面并不仅限于这种风格。这种风格可能比较适合初学制谱的新人谱师,如果想要得到更多的提升空间,这种风格可能会限制进步。 + 这里的还原向谱面仅包括还原PV/MV/BGA的情况,不包括游戏玩法,东方弹幕或各种其他东西的还原 +说在前面 + 你可能会想:节奏医生可以放置逐帧背景,那么可以将PV的逐帧动画作为背景放后面。虽然这确实是一个办法,但是如果这样做可能会导致关卡包巨大,进而导致部分电脑由于性能原因无法打开关卡导致游戏崩溃甚至蓝屏,所以非必要情况下请避免使用大量的帧动画。 +曲目/PV选择 + 很多有PV的音乐,可能原PV的画面非常吸引人,但是并不是所有PV都适合做在RD里面(你可以尝试,但是可能会异常困难,而且最终效果可能会不尽人意)。RD本身是像素风2D游戏,那么选曲尽量不要选特别写实风的,或立体感特别强的PV。写实风可能会导致素材被压缩,立体感本身并没有大问题,但是还是不建议写PV中有大量很明显的场景视角变化的曲子(如由平视逐渐抬头看向天空,或是以拍摄者为中心的水平视角旋转)。 +关于采音 + 对于还原向谱面,画面往往非常复杂,此时为了难度相对平衡,采音不建议过于复杂,避免不必要的读谱困难。 + 你可以在一开始就决定采音,也可以在确定画面之后再采音。从经验上看,兼容性最好的是双轨采音(七拍+二拍或两个七拍),有时候也可以使用三轨采音(2个七拍+1个二拍),如果你的采音超过4轨,那么你可能需要考虑如何在画面中安排轨道的位置以及难度是否合理了,因为轨道越多就越考验把轨道融入谱面的想象力(不排除可以把自己的想象力加入到谱子里,如果融入的好你可以惊艳众人,但是有时候会非常困难)。所以写还原谱的时候,建议先有一个大体上的预设。 +关于素材 + 如果需要还原PV中的场景,你很可能会需要PV中的素材。如背景,装饰物等。这些素材你可以去使用抠图软件,或擦除物体的软件来获取这些素材。这种软件可以自行去b站等地方寻找,网上这种软件还是不少的。 + 当然,如果你觉得原PV的素材不合适,自己又不会画画,你可以使用官方的素材。比如可以使用官方的角色来代替PV中的主角,或各种在编辑器或官方关卡中出现的东西来出现在关卡中。如果是游戏相关的曲子,你可以去游戏中寻找素材。你也可以动用你身边所有渠道去寻找你需要的素材。总之,素材来源多种多样,即使不会画画你也可以在你的能力范围内去找到你需要的尽可能多的素材。 +关于轨道/节拍动画 + 轨道尽量不要太违和,能融入场景是最好的。你可以仔细观察你的背景素材或原PV中是否有直线状物体,如果有,可以尝试让一条轨道与其重合。同样的可以观察一下是否有大量短线状物体,此时可以尝试去用ClassyBeat做节拍。如果画面存在大量相同的物品,可以参考精灵图章节用各种物品代替轨道。而对于二拍轨道来说,操作会更加灵活。可以使用任何有两种状态的物品,状态切换表示按拍或脉冲;或是某种东西的运动表示,如某个东西砸在地上或屏幕某个位置(此时可以调整按拍烟花的位置与运动终点重合)。如果这些都不合适,那么二拍轨道可以完全隐藏,将烟花出现在屏幕某个位置(因为二拍本身就无法目押,所以即使完全不可见也是可以接受的) + 然而,如果你使用的是双轨采音,画面中也没有很适合作为轨道的物品,你可以使用一种双轨"万金油"摆法:将轨道旋转90度,排在屏幕两侧,此时可以让轨道跟随节奏左右跳动。然后再两个轨道中间的区域随意发挥。因为这种摆法轨道是完全可见的,也不会挡住中间的画面。但是这种摆法比较适合偏手书风格的动画,其他的风格可能会有点奇怪。 + 有时候七拍轨道上的X在场景中是非常违和的,此时可以在对应位置放一个可以融入场景的精灵图,在拍子经过时做一个动画(不一定需要表情,可以只是简单的旋转或缩放),就可以代替X的作用。此时节拍栏里面就需要X拍子设置为没有X(可以先打开X看精灵图和X是否重合,确认重合之后再把X全关闭),同时节拍也要用设置自由拍来跳过对应位置。 +关于精灵图 + 精灵图在场景塑造和搭建中有着不可或缺的作用,因为没有数量的限制,而且各种调整都十分方而便。因此有时候在一个谱子里面会有上百的精灵图,有的是表示节拍,有的作为视觉提示出现,有的则是作为谱面的一种装饰物。此时如果不整理,很容易找不到需要操作的对象。 + 所以整理精灵图是非常重要的。比如可以将相同的精灵图在添加时放在一起,或需要一起操作的精灵图放在一起,这样在操作时可以根据预览图片快速找到你需要操作的精灵图。如果同一种精灵图大量出现,可以用一些方法进行分组。比如好几行或几列一样的东西可以按行或列分组。在编辑器中,你可以在每一组开头的那一个精灵图的行中加一个代表性的,但是不影响整体效果的事件(比如空的注释指令,因为颜色和其他事件不一样),或者组之间用一个其他的精灵图作为分割线(这个精灵图不一定需要使用,所以可以只是一个初始隐藏的豆子)。 + 在使用完后,为了方便下次使用,请记得在不需要用的时候隐藏(尤其对于习惯把设置精灵图初始情况的事件提前的玩家)。无论在使用完后精灵图是直接消失了,移出屏幕了还是淡出了,都建议先隐藏,下次使用时再显示出来,避免出现不必要的bug。 +其他注意事项 + PV最初设计并不是为了RD关卡而设计的,所以不一定所有场景都适合去还原。那么有些场景可能会过于复杂以至于难以还原,或轨道难以融入。 + 还原其实只是一种表现方式,很多时候完全的还原是很难做到的。所以这时不要过度追求还原度,不要局限于还原,否则可能会导致画面过于复杂,进而导致读谱困难。所以有时候可以对原PV部分内容进行一定程度上的简化。或干脆放弃这一段的还原,用其他表现手法。 + 如果素材难以获取,可以用官方素材代替。这样可以制作类似RD手书的形式的谱子 + 此外,有时候看起来特别炫酷的东西可能可以通过简单的预设特效的叠加就可以实现。看起来特别复杂的地方进一步思考,可能会发现更简单的实现方法。 + 还有,多看看教程,多听取大佬建议,避免技术缺陷导致无法达成预期效果。 diff --git a/script/docsify-copy-code.min.js b/script/docsify-copy-code.min.js new file mode 100644 index 0000000..02a83a3 --- /dev/null +++ b/script/docsify-copy-code.min.js @@ -0,0 +1,9 @@ +/*! + * docsify-copy-code + * v3.0.0 + * https://github.com/jperasmus/docsify-copy-code + * (c) 2017-2023 JP Erasmus + * MIT license + */ +!function(){"use strict";function e(o){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(o)}!function(e,o){void 0===o&&(o={});var t=o.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=e:c.appendChild(document.createTextNode(e))}}(".docsify-copy-code-button,.docsify-copy-code-button>span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{background:grey;background:var(--theme-color,grey);border:0;border-radius:0;color:#fff;font-size:1em;opacity:0;outline:0;overflow:visible;padding:.65em .8em;position:absolute;right:0;top:0;z-index:1}.docsify-copy-code-button>span{background:inherit;border-radius:3px;pointer-events:none}.docsify-copy-code-button>.error,.docsify-copy-code-button>.success{font-size:.825em;opacity:0;padding:.5em .65em;position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:-100}.docsify-copy-code-button.error>.error,.docsify-copy-code-button.success>.success{opacity:1;right:100%;transform:translate(-25%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}.docsify-copy-code-button>[aria-live]{height:1px;left:-10000px;overflow:hidden;position:absolute;top:auto;width:1px}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(e,o){e.ready((function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")}))}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,t){var n={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};o.doneEach((function(){var o=Array.from(document.querySelectorAll("pre[data-lang]"));t.config.copyCode&&Object.keys(n).forEach((function(o){var c=t.config.copyCode[o];"string"==typeof c?n[o]=c:"object"===e(c)&&Object.keys(c).some((function(e){var t=location.href.indexOf(e)>-1;return n[o]=t?c[e]:n[o],t}))}));var c=['"].join("");o.forEach((function(e){e.insertAdjacentHTML("beforeend",c)}))})),o.mounted((function(){var e=document.querySelector(".content");e&&e.addEventListener("click",(function(e){if(e.target.classList.contains("docsify-copy-code-button")){var o="BUTTON"===e.target.tagName?e.target:e.target.parentNode,t=document.createRange(),c=o.parentNode.querySelector("code"),i=o.querySelector("[aria-live]"),r=window.getSelection();t.selectNode(c),r&&(r.removeAllRanges(),r.addRange(t));try{document.execCommand("copy")&&(o.classList.add("success"),i.innerText=n.successText,setTimeout((function(){o.classList.remove("success"),i.innerText=""}),1e3))}catch(e){console.error("docsify-copy-code: ".concat(e)),o.classList.add("error"),i.innerText=n.errorText,setTimeout((function(){o.classList.remove("error"),i.innerText=""}),1e3)}(r=window.getSelection())&&("function"==typeof r.removeRange?r.removeRange(t):"function"==typeof r.removeAllRanges&&r.removeAllRanges())}}))}))}].concat(window.$docsify.plugins||[])}(); +//# sourceMappingURL=docsify-copy-code.min.js.map \ No newline at end of file diff --git a/script/docsify.min.js b/script/docsify.min.js new file mode 100644 index 0000000..18e85aa --- /dev/null +++ b/script/docsify.min.js @@ -0,0 +1 @@ +!function(){function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:JSON.stringify(e);return o[n]||(o[n]=i(e))}}var a=c(function(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}),u=Object.prototype.hasOwnProperty,m=Object.assign||function(e){for(var n=arguments,i=1;i=e||n.classList.contains("hidden")?S(h,"add","sticky"):S(h,"remove","sticky"))}function ee(e,n,o,i){var t=[];null!=(n=l(n))&&(t=k(n,"a"));var a,r=decodeURI(e.toURL(e.getCurrentPath()));return t.sort(function(e,n){return n.href.length-e.href.length}).forEach(function(e){var n=decodeURI(e.getAttribute("href")),i=o?e.parentNode:e;e.title=e.title||e.innerText,0!==r.indexOf(n)||a?S(i,"remove","active"):(a=e,S(i,"add","active"))}),i&&(v.title=a?a.title||a.innerText+" - "+J:J),a}function ne(e,n){for(var i=0;ithis.end&&e>=this.next}[this.direction]}},{key:"_defaultEase",value:function(e,n,i,o){return(e/=o/2)<1?i/2*e*e+n:-i/2*(--e*(e-2)-1)+n}}]),re);function re(){var e=0c){n=n||p;break}n=p}!n||(r=fe[ve(e,n.getAttribute("data-id"))])&&r!==a&&(a&&a.classList.remove("active"),r.classList.add("active"),a=r,!pe&&h.classList.contains("sticky")&&(e=i.clientHeight,r=a.offsetTop+a.clientHeight+40,a=a.offsetTop>=t.scrollTop&&r<=t.scrollTop+e,i.scrollTop=a?t.scrollTop:+r"']/),xe=/[&<>"']/g,Se=/[<>"']|&(?!#?\w+;)/,Ae=/[<>"']|&(?!#?\w+;)/g,$e={"&":"&","<":"<",">":">",'"':""","'":"'"};var ze=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function Fe(e){return e.replace(ze,function(e,n){return"colon"===(n=n.toLowerCase())?":":"#"===n.charAt(0)?"x"===n.charAt(1)?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""})}var Ee=/(^|[^\[])\^/g;var Re=/[^\w:]/g,Te=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var Ce={},je=/^[^:]+:\/*[^/]*$/,Le=/^([^:]+:)[\s\S]*$/,Oe=/^([^:]+:\/*[^/]*)[\s\S]*$/;function qe(e,n){Ce[" "+e]||(je.test(e)?Ce[" "+e]=e+"/":Ce[" "+e]=Pe(e,"/",!0));var i=-1===(e=Ce[" "+e]).indexOf(":");return"//"===n.substring(0,2)?i?n:e.replace(Le,"$1")+n:"/"===n.charAt(0)?i?n:e.replace(Oe,"$1")+n:e+n}function Pe(e,n,i){var o=e.length;if(0===o)return"";for(var t=0;tn)i.splice(n);else for(;i.length>=1,e+=e;return i+e},We=we.defaults,Xe=Be,Qe=Ze,Je=Me,Ke=Ve;function en(e,n,i){var o=n.href,t=n.title?Je(n.title):null,n=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:i,href:o,title:t,text:n}:{type:"image",raw:i,href:o,title:t,text:Je(n)}}var nn=function(){function e(e){this.options=e||We}return e.prototype.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1=i.length?e.slice(i.length):e}).join("\n")}(i,n[3]||"");return{type:"code",raw:i,lang:n[2]&&n[2].trim(),text:e}}},e.prototype.heading=function(e){var n=this.rules.block.heading.exec(e);if(n){var i=n[2].trim();return/#$/.test(i)&&(e=Xe(i,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(i=e.trim())),{type:"heading",raw:n[0],depth:n[1].length,text:i}}},e.prototype.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var n={type:"table",header:Qe(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(n.header.length===n.align.length){for(var i=n.align.length,o=0;o ?/gm,"");return{type:"blockquote",raw:n[0],text:e}}},e.prototype.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var n,i,o,t,a,r=e[0],c=e[2],u=1s[1].length:o[1].length>s[0].length||3/i.test(e[0])&&(n=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:n,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]}},e.prototype.link=function(e){var n=this.rules.inline.link.exec(e);if(n){e=n[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;var i=Xe(e.slice(0,-1),"\\");if((e.length-i.length)%2==0)return}else{var o=Ke(n[2],"()");-1$/.test(e)?i.slice(1):i.slice(1,-1):i)&&i.replace(this.rules.inline._escapes,"$1"),title:o&&o.replace(this.rules.inline._escapes,"$1")},n[0])}},e.prototype.reflink=function(e,n){if((i=this.rules.inline.reflink.exec(e))||(i=this.rules.inline.nolink.exec(e))){var e=(i[2]||i[1]).replace(/\s+/g," ");if((e=n[e.toLowerCase()])&&e.href)return en(i,e,i[0]);var i=i[0].charAt(0);return{type:"text",raw:i,text:i}}},e.prototype.strong=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.strong.middle.exec(n.slice(0,o.index+3)))return{type:"strong",raw:e.slice(0,t[0].length),text:e.slice(2,t[0].length-2)}}},e.prototype.em=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.em.middle.exec(n.slice(0,o.index+2)))return{type:"em",raw:e.slice(0,t[0].length),text:e.slice(1,t[0].length-1)}}},e.prototype.codespan=function(e){var n=this.rules.inline.code.exec(e);if(n){var i=n[2].replace(/\n/g," "),o=/[^ ]/.test(i),e=/^ /.test(i)&&/ $/.test(i);return o&&e&&(i=i.substring(1,i.length-1)),i=Je(i,!0),{type:"codespan",raw:n[0],text:i}}},e.prototype.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},e.prototype.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},e.prototype.autolink=function(e,n){e=this.rules.inline.autolink.exec(e);if(e){var i,n="@"===e[2]?"mailto:"+(i=Je(this.options.mangle?n(e[1]):e[1])):i=Je(e[1]);return{type:"link",raw:e[0],text:i,href:n,tokens:[{type:"text",raw:i,text:i}]}}},e.prototype.url=function(e,n){var i,o,t,a;if(i=this.rules.inline.url.exec(e)){if("@"===i[2])t="mailto:"+(o=Je(this.options.mangle?n(i[0]):i[0]));else{for(;a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0],a!==i[0];);o=Je(i[0]),t="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:t,tokens:[{type:"text",raw:o,text:o}]}}},e.prototype.inlineText=function(e,n,i){e=this.rules.inline.text.exec(e);if(e){i=n?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]:Je(this.options.smartypants?i(e[0]):e[0]);return{type:"text",raw:e[0],text:i}}},e}(),Ze=De,Ve=Ne,De=Ue,Ne={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Ze,table:Ze,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Ne.def=Ve(Ne.def).replace("label",Ne._label).replace("title",Ne._title).getRegex(),Ne.bullet=/(?:[*+-]|\d{1,9}[.)])/,Ne.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Ne.item=Ve(Ne.item,"gm").replace(/bull/g,Ne.bullet).getRegex(),Ne.listItemStart=Ve(/^( *)(bull)/).replace("bull",Ne.bullet).getRegex(),Ne.list=Ve(Ne.list).replace(/bull/g,Ne.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Ne.def.source+")").getRegex(),Ne._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ne._comment=/|$)/,Ne.html=Ve(Ne.html,"i").replace("comment",Ne._comment).replace("tag",Ne._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ne.paragraph=Ve(Ne._paragraph).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.blockquote=Ve(Ne.blockquote).replace("paragraph",Ne.paragraph).getRegex(),Ne.normal=De({},Ne),Ne.gfm=De({},Ne.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Ne.gfm.nptable=Ve(Ne.gfm.nptable).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.gfm.table=Ve(Ne.gfm.table).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.pedantic=De({},Ne.normal,{html:Ve("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Ne._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ze,paragraph:Ve(Ne.normal._paragraph).replace("hr",Ne.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Ne.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});Ze={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Ze,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Ze,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};Ze.punctuation=Ve(Ze.punctuation).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Ze._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Ze._comment=Ve(Ne._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Ze.em.start=Ve(Ze.em.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.middle=Ve(Ze.em.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.em.endAst=Ve(Ze.em.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.endUnd=Ve(Ze.em.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.start=Ve(Ze.strong.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.middle=Ve(Ze.strong.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.strong.endAst=Ve(Ze.strong.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.endUnd=Ve(Ze.strong.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.blockSkip=Ve(Ze._blockSkip,"g").getRegex(),Ze.overlapSkip=Ve(Ze._overlapSkip,"g").getRegex(),Ze._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Ze._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Ze._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Ze.autolink=Ve(Ze.autolink).replace("scheme",Ze._scheme).replace("email",Ze._email).getRegex(),Ze._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Ze.tag=Ve(Ze.tag).replace("comment",Ze._comment).replace("attribute",Ze._attribute).getRegex(),Ze._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Ze._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Ze._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Ze.link=Ve(Ze.link).replace("label",Ze._label).replace("href",Ze._href).replace("title",Ze._title).getRegex(),Ze.reflink=Ve(Ze.reflink).replace("label",Ze._label).getRegex(),Ze.reflinkSearch=Ve(Ze.reflinkSearch,"g").replace("reflink",Ze.reflink).replace("nolink",Ze.nolink).getRegex(),Ze.normal=De({},Ze),Ze.pedantic=De({},Ze.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Ve(/^!?\[(label)\]\((.*?)\)/).replace("label",Ze._label).getRegex(),reflink:Ve(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ze._label).getRegex()}),Ze.gfm=De({},Ze.normal,{escape:Ve(Ze.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(i?e:gn(e,!0))+"\n":"
"+(i?e:gn(e,!0))+"
\n"},e.prototype.blockquote=function(e){return"
\n"+e+"
\n"},e.prototype.html=function(e){return e},e.prototype.heading=function(e,n,i,o){return this.options.headerIds?"'+e+"\n":""+e+"\n"},e.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},e.prototype.list=function(e,n,i){var o=n?"ol":"ul";return"<"+o+(n&&1!==i?' start="'+i+'"':"")+">\n"+e+"\n"},e.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},e.prototype.checkbox=function(e){return" "},e.prototype.paragraph=function(e){return"

    "+e+"

    \n"},e.prototype.table=function(e,n){return"\n\n"+e+"\n"+(n=n&&""+n+"")+"
    \n"},e.prototype.tablerow=function(e){return"\n"+e+"\n"},e.prototype.tablecell=function(e,n){var i=n.header?"th":"td";return(n.align?"<"+i+' align="'+n.align+'">':"<"+i+">")+e+"\n"},e.prototype.strong=function(e){return""+e+""},e.prototype.em=function(e){return""+e+""},e.prototype.codespan=function(e){return""+e+""},e.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},e.prototype.del=function(e){return""+e+""},e.prototype.link=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;e='"},e.prototype.image=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;i=''+i+'":">"},e.prototype.text=function(e){return e},e}(),ln=function(){function e(){}return e.prototype.strong=function(e){return e},e.prototype.em=function(e){return e},e.prototype.codespan=function(e){return e},e.prototype.del=function(e){return e},e.prototype.html=function(e){return e},e.prototype.text=function(e){return e},e.prototype.link=function(e,n,i){return""+i},e.prototype.image=function(e,n,i){return""+i},e.prototype.br=function(){return""},e}(),vn=function(){function e(){this.seen={}}return e.prototype.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},e.prototype.getNextSafeSlug=function(e,n){var i=e,o=0;if(this.seen.hasOwnProperty(i))for(o=this.seen[e];i=e+"-"+ ++o,this.seen.hasOwnProperty(i););return n||(this.seen[e]=o,this.seen[i]=0),i},e.prototype.slug=function(e,n){void 0===n&&(n={});e=this.serialize(e);return this.getNextSafeSlug(e,n.dryrun)},e}(),hn=we.defaults,_n=Ie,mn=function(){function i(e){this.options=e||hn,this.options.renderer=this.options.renderer||new sn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ln,this.slugger=new vn}return i.parse=function(e,n){return new i(n).parse(e)},i.parseInline=function(e,n){return new i(n).parseInline(e)},i.prototype.parse=function(e,n){void 0===n&&(n=!0);for(var i,o,t,a,r,c,u,f,p,d,g,s,l,v,h,_="",m=e.length,b=0;bAn error occurred:

    "+wn(e.message+"",!0)+"
    ";throw e}}xn.options=xn.setOptions=function(e){return bn(xn.defaults,e),yn(xn.defaults),xn},xn.getDefaults=Me,xn.defaults=we,xn.use=function(a){var n,e=bn({},a);if(a.renderer){var i,r=xn.defaults.renderer||new sn;for(i in a.renderer)!function(o){var t=r[o];r[o]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.renderer[o].apply(r,e);return i=!1===i?t.apply(r,e):i}}(i);e.renderer=r}if(a.tokenizer){var t,c=xn.defaults.tokenizer||new nn;for(t in a.tokenizer)!function(){var o=c[t];c[t]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.tokenizer[t].apply(c,e);return i=!1===i?o.apply(c,e):i}}();e.tokenizer=c}a.walkTokens&&(n=xn.defaults.walkTokens,e.walkTokens=function(e){a.walkTokens(e),n&&n(e)}),xn.setOptions(e)},xn.walkTokens=function(e,n){for(var i=0,o=e;iAn error occurred:

    "+wn(e.message+"",!0)+"
    ";throw e}},xn.Parser=mn,xn.parser=mn.parse,xn.Renderer=sn,xn.TextRenderer=ln,xn.Lexer=fn,xn.lexer=fn.lex,xn.Tokenizer=nn,xn.Slugger=vn;var Sn=xn.parse=xn;function An(e,i){if(void 0===i&&(i='
      {inner}
    '),!e||!e.length)return"";var o="";return e.forEach(function(e){var n=e.title.replace(/(<([^>]+)>)/g,"");o+='
  • '+e.title+"
  • ",e.children&&(o+=An(e.children,i))}),i.replace("{inner}",o)}function $n(e,n){return'

    '+n.slice(5).trim()+"

    "}function zn(e,o){var t=[],a={};return e.forEach(function(e){var n=e.level||1,i=n-1;o?@[\]^`{|}~]/g;function Rn(e){return e.toLowerCase()}function Tn(e){if("string"!=typeof e)return"";var n=e.trim().replace(/[A-Z]+/g,Rn).replace(/<[^>]+>/g,"").replace(En,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),e=Fn[n],e=u.call(Fn,n)?e+1:0;return n=(Fn[n]=e)?n+"-"+e:n}Tn.clear=function(){Fn={}};var Cn={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function jn(e,t){return e.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,function(e){return e.replace(/:/g,"__colon__")}).replace(//g,function(e){return e.replace(/:/g,"__colon__")}).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,function(e){return e.replace(/:/g,"__colon__")}).replace(/:([a-z0-9_\-+]+?):/g,function(e,n){return i=e,o=n,e=t,n=Cn.data[o],i,i=n?e&&/unicode/.test(n)?''+n.replace("unicode/","").replace(/\.png.*/,"").split("-").map(function(e){return"&#x"+e+";"}).join("‍").concat("︎")+"":''+o+'':i;var i,o}).replace(/__colon__/g,":")}function Ln(e){var o={};return{str:e=(e=void 0===e?"":e)&&e.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,function(e,n,i){return-1===n.indexOf(":")?(o[n]=i&&i.replace(/"/g,"")||!0,""):e}).trim(),config:o}}function On(e){return(e=void 0===e?"":e).replace(/(<\/?a.*?>)/gi,"")}var qn,Pn=be(function(e){var u,f,p,d,n,g=function(u){var i=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},R={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=r.reach);m+=_.value.length,_=_.next){var b=_.value;if(i.length>n.length)return;if(!(b instanceof T)){var k,w=1;if(l){if(!(k=C(h,m,n,s))||k.index>=n.length)break;var y=k.index,x=k.index+k[0].length,S=m;for(S+=_.value.length;S<=y;)_=_.next,S+=_.value.length;if(S-=_.value.length,m=S,_.value instanceof T)continue;for(var A=_;A!==i.tail&&(Sr.reach&&(r.reach=E);b=_.prev;z&&(b=j(i,b,z),m+=z.length),L(i,b,w);$=new T(c,g?R.tokenize($,g):$,v,$);_=j(i,b,$),F&&j(i,_,F),1r.reach&&(r.reach=E.reach))}}}}}(e,t,n,t.head,0),function(e){var n=[],i=e.head.next;for(;i!==e.tail;)n.push(i.value),i=i.next;return n}(t)},hooks:{all:{},add:function(e,n){var i=R.hooks.all;i[e]=i[e]||[],i[e].push(n)},run:function(e,n){var i=R.hooks.all[e];if(i&&i.length)for(var o,t=0;o=i[t++];)o(n)}},Token:T};function T(e,n,i,o){this.type=e,this.content=n,this.alias=i,this.length=0|(o||"").length}function C(e,n,i,o){e.lastIndex=n;i=e.exec(i);return i&&o&&i[1]&&(o=i[1].length,i.index+=o,i[0]=i[0].slice(o)),i}function a(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function j(e,n,i){var o=n.next,i={value:i,prev:n,next:o};return n.next=i,o.prev=i,e.length++,i}function L(e,n,i){for(var o=n.next,t=0;t"+t.content+""},!u.document)return u.addEventListener&&(R.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),i=n.language,e=n.code,n=n.immediateClose;u.postMessage(R.highlight(e,R.languages[i],i)),n&&u.close()},!1)),R;var o=R.util.currentScript();function t(){R.manual||R.highlightAll()}return o&&(R.filename=o.src,o.hasAttribute("data-manual")&&(R.manual=!0)),R.manual||("loading"===(e=document.readyState)||"interactive"===e&&o&&o.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)),R}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=g),void 0!==me&&(me.Prism=g),g.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},g.languages.markup.tag.inside["attr-value"].inside.entity=g.languages.markup.entity,g.languages.markup.doctype.inside["internal-subset"].inside=g.languages.markup,g.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(g.languages.markup.tag,"addInlined",{value:function(e,n){var i={};i["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:g.languages[n]},i.cdata=/^$/i;i={"included-cdata":{pattern://i,inside:i}};i["language-"+n]={pattern:/[\s\S]+/,inside:g.languages[n]};n={};n[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:i},g.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(g.languages.markup.tag,"addAttribute",{value:function(e,n){g.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:g.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),g.languages.html=g.languages.markup,g.languages.mathml=g.languages.markup,g.languages.svg=g.languages.markup,g.languages.xml=g.languages.extend("markup",{}),g.languages.ssml=g.languages.xml,g.languages.atom=g.languages.xml,g.languages.rss=g.languages.xml,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+n.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;e=e.languages.markup;e&&(e.tag.addInlined("style","css"),e.tag.addAttribute("style","css"))}(g),g.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},g.languages.javascript=g.languages.extend("clike",{"class-name":[g.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),g.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,g.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:g.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:g.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:g.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:g.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:g.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),g.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:g.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),g.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),g.languages.markup&&(g.languages.markup.tag.addInlined("script","javascript"),g.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),g.languages.js=g.languages.javascript,void 0!==g&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),u={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},d="pre[data-src]:not(["+(f="data-src-status")+'="loaded"]):not(['+f+'="'+(p="loading")+'"])',g.hooks.add("before-highlightall",function(e){e.selector+=", "+d}),g.hooks.add("before-sanity-check",function(e){var t,n,i,o,a,r,c=e.element;c.matches(d)&&(e.code="",c.setAttribute(f,p),(t=c.appendChild(document.createElement("CODE"))).textContent="Loading…",i=c.getAttribute("data-src"),"none"===(e=e.language)&&(n=(/\.(\w+)$/.exec(i)||[,"none"])[1],e=u[n]||n),g.util.setLanguage(t,e),g.util.setLanguage(c,e),(n=g.plugins.autoloader)&&n.loadLanguages(e),i=i,o=function(e){c.setAttribute(f,"loaded");var n,i,o=function(e){if(i=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"")){var n=Number(i[1]),e=i[2],i=i[3];return e?i?[n,Number(i)]:[n,void 0]:[n,n]}}(c.getAttribute("data-range"));o&&(n=e.split(/\r\n?|\n/g),i=o[0],o=null==o[1]?n.length:o[1],i<0&&(i+=n.length),i=Math.max(0,Math.min(i-1,n.length)),o<0&&(o+=n.length),o=Math.max(0,Math.min(o,n.length)),e=n.slice(i,o).join("\n"),c.hasAttribute("data-start")||c.setAttribute("data-start",String(i+1))),t.textContent=e,g.highlightElement(t)},a=function(e){c.setAttribute(f,"failed"),t.textContent=e},(r=new XMLHttpRequest).open("GET",i,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?o(r.responseText):400<=r.status?a("✖ Error "+r.status+" while fetching file: "+r.statusText):a("✖ Error: File does not exist or is empty"))},r.send(null))}),n=!(g.plugins.fileHighlight={highlight:function(e){for(var n,i=(e||document).querySelectorAll(d),o=0;n=i[o++];)g.highlightElement(n)}}),g.fileHighlight=function(){n||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),n=!0),g.plugins.fileHighlight.highlight.apply(this,arguments)})});function Mn(e,n){return"___"+e.toUpperCase()+n+"___"}qn=Prism,Object.defineProperties(qn.languages["markup-templating"]={},{buildPlaceholders:{value:function(o,t,e,a){var r;o.language===t&&(r=o.tokenStack=[],o.code=o.code.replace(e,function(e){if("function"==typeof a&&!a(e))return e;for(var n,i=r.length;-1!==o.code.indexOf(n=Mn(t,i));)++i;return r[i]=e,n}),o.grammar=qn.languages.markup)}},tokenizePlaceholders:{value:function(f,p){var d,g;f.language===p&&f.tokenStack&&(f.grammar=qn.languages[p],d=0,g=Object.keys(f.tokenStack),function e(n){for(var i=0;i=g.length);i++){var o,t,a,r,c,u=n[i];"string"==typeof u||u.content&&"string"==typeof u.content?(t=g[d],a=f.tokenStack[t],o="string"==typeof u?u:u.content,c=Mn(p,t),-1<(r=o.indexOf(c))&&(++d,t=o.substring(0,r),a=new qn.Token(p,qn.tokenize(a,f.grammar),"language-"+p,a),r=o.substring(r+c.length),c=[],t&&c.push.apply(c,e([t])),c.push(a),r&&c.push.apply(c,e([r])),"string"==typeof u?n.splice.apply(n,[i,1].concat(c)):u.content=c)):u.content&&e(u.content)}return n}(f.tokens))}}});function In(t,e){var a=this;this.config=t,this.router=e,this.cacheTree={},this.toc=[],this.cacheTOC={},this.linkTarget=t.externalLinkTarget||"_blank",this.linkRel="_blank"===this.linkTarget?t.externalLinkRel||"noopener":"",this.contentBase=e.getBasePath();var n=this._initRenderer();this.heading=n.heading;var r=o(e=t.markdown||{})?e(Sn,n):(Sn.setOptions(m(e,{renderer:m(n,e.renderer)})),Sn);this._marked=r,this.compile=function(i){var o=!0,e=c(function(e){o=!1;var n="";return i&&(n=f(i)?r(i):r.parser(i),n=t.noEmoji?n:jn(n,t.nativeEmoji),Tn.clear(),n)})(i),n=a.router.parse().file;return o?a.toc=a.cacheTOC[n]:a.cacheTOC[n]=[].concat(a.toc),e}}var Nn={},Hn={markdown:function(e){return{url:e}},mermaid:function(e){return{url:e}},iframe:function(e,n){return{html:'"}},video:function(e,n){return{html:'"}},audio:function(e,n){return{html:'"}},code:function(e,n){var i=e.match(/\.(\w+)$/);return{url:e,lang:i="md"===(i=n||i&&i[1])?"markdown":i}}};In.prototype.compileEmbed=function(e,n){var i,o,t=Ln(n),a=t.str,t=t.config;if(n=a,t.include)return R(e)||(e=q(this.contentBase,C(this.router.getCurrentPath()),e)),t.type&&(o=Hn[t.type])?(i=o.call(this,e,n)).type=t.type:(o="code",/\.(md|markdown)/.test(e)?o="markdown":/\.mmd/.test(e)?o="mermaid":/\.html?/.test(e)?o="iframe":/\.(mp4|ogg)/.test(e)?o="video":/\.mp3/.test(e)&&(o="audio"),(i=Hn[o].call(this,e,n)).type=o),i.fragment=t.fragment,i},In.prototype._matchNotCompileLink=function(e){for(var n=this.config.noCompileLinks||[],i=0;i/g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore} --\x3e",""),e.title=On(o),e.ignoreSubHeading=!0),/{docsify-ignore}/g.test(o)&&(o=o.replace("{docsify-ignore}",""),e.title=On(o),e.ignoreSubHeading=!0),//g.test(o)&&(o=o.replace("\x3c!-- {docsify-ignore-all} --\x3e",""),e.title=On(o),e.ignoreAllSubs=!0),/{docsify-ignore-all}/g.test(o)&&(o=o.replace("{docsify-ignore-all}",""),e.title=On(o),e.ignoreAllSubs=!0);i=Tn(t.id||o),t=a.toURL(a.getCurrentPath(),{id:i});return e.slug=t,g.toc.push(e),"'+o+""},t.code={renderer:e}.renderer.code=function(e,n){var i=Pn.languages[n=void 0===n?"markup":n]||Pn.languages.markup;return'
    '+Pn.highlight(e.replace(/@DOCSIFY_QM@/g,"`"),i,n)+"
    "},t.link=(i=(n={renderer:e,router:a,linkTarget:n,linkRel:i,compilerClass:g}).renderer,c=n.router,u=n.linkTarget,n.linkRel,f=n.compilerClass,i.link=function(e,n,i){var o=[],t=Ln(n=void 0===n?"":n),a=t.str,t=t.config;return u=t.target||u,r="_blank"===u?f.config.externalLinkRel||"noopener":"",n=a,R(e)||f._matchNotCompileLink(e)||t.ignore?(R(e)||"./"!==e.slice(0,2)||(e=document.URL.replace(/\/(?!.*\/).*/,"/").replace("#/./","")+e),o.push(0===e.indexOf("mailto:")?"":'target="'+u+'"'),o.push(0!==e.indexOf("mailto:")&&""!==r?' rel="'+r+'"':"")):(e===f.config.homepage&&(e="README"),e=c.toURL(e,null,c.getCurrentPath())),t.disabled&&(o.push("disabled"),e="javascript:void(0)"),t.class&&o.push('class="'+t.class+'"'),t.id&&o.push('id="'+t.id+'"'),n&&o.push('title="'+n+'"'),'"+i+""}),t.paragraph={renderer:e}.renderer.paragraph=function(e){e=/^!>/.test(e)?$n("tip",e):/^\?>/.test(e)?$n("warn",e):"

    "+e+"

    ";return e},t.image=(o=(i={renderer:e,contentBase:o,router:a}).renderer,p=i.contentBase,d=i.router,o.image=function(e,n,i){var o=e,t=[],a=Ln(n),r=a.str,a=a.config;return n=r,a["no-zoom"]&&t.push("data-no-zoom"),n&&t.push('title="'+n+'"'),a.size&&(n=(r=a.size.split("x"))[0],(r=r[1])?t.push('width="'+n+'" height="'+r+'"'):t.push('width="'+n+'"')),a.class&&t.push('class="'+a.class+'"'),a.id&&t.push('id="'+a.id+'"'),R(e)||(o=q(p,C(d.getCurrentPath()),e)),0":''+i+'"}),t.list={renderer:e}.renderer.list=function(e,n,i){n=n?"ol":"ul";return"<"+n+" "+[/
  • /.test(e.split('class="task-list"')[0])?'class="task-list"':"",i&&1"+e+""},t.listitem={renderer:e}.renderer.listitem=function(e){return/^(]*>)/.test(e)?'
  • ":"
  • "+e+"
  • "},e.origin=t,e},In.prototype.sidebar=function(e,n){var i=this.toc,o=this.router.getCurrentPath(),t="";if(e)t=this.compile(e);else{for(var a=0;a{inner}");this.cacheTree[o]=n}return t},In.prototype.subSidebar=function(e){if(e){var n=this.router.getCurrentPath(),i=this.cacheTree,o=this.toc;o[0]&&o[0].ignoreAllSubs&&o.splice(0),o[0]&&1===o[0].level&&o.shift();for(var t=0;t\n'+e+"\n"}]).links={}:(n=[{type:"html",text:e}]).links={}),a({token:t,embedToken:n}),++u>=c&&a({})}}(n);n.embed.url?X(n.embed.url).then(o):o(n.embed.html)}}({compile:i,embedTokens:c,fetch:n},function(e){var n,i=e.embedToken,e=e.token;e?(n=e.index,p.forEach(function(e){n>e.start&&(n+=e.length)}),m(f,i.links),r=r.slice(0,n).concat(i,r.slice(n+1)),p.push({start:n,length:i.length-1})):(Bn[t]=r.concat(),r.links=Bn[t].links=f,o(r))})}function Yn(e,n,i){var o,t,a,r;return n="function"==typeof i?i(n):"string"==typeof i?(a=[],r=0,(o=i).replace(V,function(n,e,i){a.push(o.substring(r,i-1)),r=i+=n.length+1,a.push(t&&t[n]||function(e){return("00"+("string"==typeof Y[n]?e[Y[n]]():Y[n](e))).slice(-n.length)})}),r!==o.length&&a.push(o.substring(r)),function(e){for(var n="",i=0,o=e||new Date;i404 - Not found","Vue"in window)for(var a=0,r=k(".markdown-section > *").filter(n);ascript").filter(function(e){return!/template/.test(e.type)})[0])||(e=e.innerText.trim())&&new Function(e)()),"Vue"in window){var u,f,p=[],d=Object.keys(i.vueComponents||{});2===t&&d.length&&d.forEach(function(e){window.Vue.options.components[e]||window.Vue.component(e,i.vueComponents[e])}),!Un&&i.vueGlobalOptions&&"function"==typeof i.vueGlobalOptions.data&&(Un=i.vueGlobalOptions.data()),p.push.apply(p,Object.keys(i.vueMounts||{}).map(function(e){return[b(o,e),i.vueMounts[e]]}).filter(function(e){var n=e[0];e[1];return n})),(i.vueGlobalOptions||d.length)&&(u=/{{2}[^{}]*}{2}/,f=/<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/,p.push.apply(p,k(".markdown-section > *").filter(function(i){return!p.some(function(e){var n=e[0];e[1];return n===i})}).filter(function(e){return e.tagName.toLowerCase()in(i.vueComponents||{})||e.querySelector(d.join(",")||null)||u.test(e.outerHTML)||f.test(e.outerHTML)}).map(function(e){var n=m({},i.vueGlobalOptions||{});return Un&&(n.data=function(){return Un}),[e,n]})));for(var g=0,s=p;g([^<]*?)

    $'))&&("color"===n[2]?o.style.background=n[1]+(n[3]||""):(e=n[1],S(o,"add","has-mask"),R(n[1])||(e=q(this.router.getBasePath(),n[1])),o.style.backgroundImage="url("+e+")",o.style.backgroundSize="cover",o.style.backgroundPosition="center center"),i=i.replace(n[0],"")),this._renderTo(".cover-main",i),K()):S(o,"remove","show")},n.prototype._updateRender=function(){var e,n,i,o;e=this,n=l(".app-name-link"),i=e.config.nameLink,o=e.route.path,n&&(f(e.config.nameLink)?n.setAttribute("href",i):"object"==typeof i&&(e=Object.keys(i).filter(function(e){return-1':"")),e.coverpage&&(f+=(o=", 100%, 85%",'
    \x3c!--cover--\x3e
    ')),e.logo&&(o=/^data:image/.test(e.logo),n=/(?:http[s]?:)?\/\//.test(e.logo),i=/^\./.test(e.logo),o||n||i||(e.logo=q(this.router.getBasePath(),e.logo))),f+=(i=(n=e).name||"","
    "+('')+'
    \x3c!--main--\x3e
    '),this._renderTo(u,f,!0)):this.rendered=!0,e.mergeNavbar&&s?p=b(".sidebar"):(c.classList.add("app-nav"),e.repo||c.classList.add("no-badge")),e.loadNavbar&&y(p,c),e.themeColor&&(v.head.appendChild(w("div","").firstElementChild),a=e.themeColor,window.CSS&&window.CSS.supports&&window.CSS.supports("(--v:red)")||(e=k("style:not(.inserted),link"),[].forEach.call(e,function(e){"STYLE"===e.nodeName?Q(e,a):"LINK"===e.nodeName&&(e=e.getAttribute("href"),/\.css$/.test(e)&&X(e).then(function(e){e=w("style",e);_.appendChild(e),Q(e,a)}))}))),this._updateRender(),S(h,"ready")},n}(function(e){function n(){e.apply(this,arguments)}return e&&(n.__proto__=e),((n.prototype=Object.create(e&&e.prototype)).constructor=n).prototype.routes=function(){return this.config.routes||{}},n.prototype.matchVirtualRoute=function(t){var a=this.routes(),r=Object.keys(a),c=function(){return null};function u(){var e=r.shift();if(!e)return c(null);var n=A(o=(i="^",0===(o=e).indexOf(i)?o:"^"+o),"$")?o:o+"$",i=t.match(n);if(!i)return u();var o=a[e];if("string"==typeof o)return c(o);if("function"!=typeof o)return u();n=o,e=Xn(),o=e[0];return(0,e[1])(function(e){return"string"==typeof e?c(e):!1===e?c(null):u()}),n.length<=2?o(n(t,i)):n(t,i,o)}return{then:function(e){c=e,u()}}},n}(function(i){function e(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];i.apply(this,e),this.route={}}return i&&(e.__proto__=i),((e.prototype=Object.create(i&&i.prototype)).constructor=e).prototype.updateRender=function(){this.router.normalize(),this.route=this.router.parse(),h.setAttribute("data-page",this.route.file)},e.prototype.initRouter=function(){var n=this,e=this.config,e=new("history"===(e.routerMode||"hash")&&t?D:H)(e);this.router=e,this.updateRender(),U=this.route,e.onchange(function(e){n.updateRender(),n._updateRender(),U.path!==n.route.path?(n.$fetch(d,n.$resetEvents.bind(n,e.source)),U=n.route):n.$resetEvents(e.source)})},e}(function(e){function n(){e.apply(this,arguments)}return e&&(n.__proto__=e),((n.prototype=Object.create(e&&e.prototype)).constructor=n).prototype.initLifecycle=function(){var i=this;this._hooks={},this._lifecycle={},["init","mounted","beforeEach","afterEach","doneEach","ready"].forEach(function(e){var n=i._hooks[e]=[];i._lifecycle[e]=function(e){return n.push(e)}})},n.prototype.callHook=function(e,t,a){void 0===a&&(a=d);var r=this._hooks[e],c=this.config.catchPluginErrors,u=function(n){var e=r[n];if(n>=r.length)a(t);else if("function"==typeof e){var i="Docsify plugin error";if(2===e.length)try{e(t,function(e){t=e,u(n+1)})}catch(e){if(!c)throw e;console.error(i,e),u(n+1)}else try{var o=e(t);t=void 0===o?t:o,u(n+1)}catch(e){if(!c)throw e;console.error(i,e),u(n+1)}}else u(n+1)};u(0)},n}(we))))))));function Kn(e,n,i){return Qn&&Qn.abort&&Qn.abort(),Qn=X(e,!0,i)}window.Docsify={util:Me,dom:n,get:X,slugify:Tn,version:"4.13.1"},window.DocsifyCompiler=In,window.marked=Sn,window.Prism=Pn,e(function(e){return new Jn})}(); \ No newline at end of file diff --git a/script/emoji.min.js b/script/emoji.min.js new file mode 100644 index 0000000..8915160 --- /dev/null +++ b/script/emoji.min.js @@ -0,0 +1 @@ +!function(){var o="https://github.githubassets.com/images/icons/emoji/",i={100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accessibility:"accessibility.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",dependabot:"dependabot.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fishsticks:"fishsticks.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"};window&&window.console&&console.info("Docsify emoji plugin has been deprecated as of v4.13"),window.emojify=function(n,e){return!1===Object.prototype.hasOwnProperty.call(i,e)?n:''+e+''}}(); \ No newline at end of file diff --git a/script/imagetip.js b/script/imagetip.js new file mode 100644 index 0000000..2fb5dce --- /dev/null +++ b/script/imagetip.js @@ -0,0 +1,45 @@ +const plugin = (hook, vm) => { + hook.init(() => { + const style = document.createElement('style') + style.setAttribute('type', 'text/css'); + style.innerHTML = ` + .imagetip { + position: absolute; + z-index: 9999; + display: none; + border: 1px solid #ccc; + background-color: #fff; + padding: 5px; + box-shadow: 0 0 10px rgba(0,0,0,0.5); + } + ` + document.head.appendChild(style); + }); + hook.doneEach(() => { + const images = document.querySelectorAll('img:not([src*="data:image"])'); + const imagetip = document.createElement('div'); + imagetip.className = 'imagetip'; + document.body.appendChild(imagetip); + + images.forEach((img) => { + img.addEventListener('mouseover', (e) => { + imagetip.style.display = 'block'; + imagetip.innerHTML = ``; + imagetip.style.left = `${e.pageX + 10}px`; + imagetip.style.top = `${e.pageY + 10}px`; + }); + img.addEventListener('mousemove', (e) => { + imagetip.style.left = `${e.pageX + 10}px`; + imagetip.style.top = `${e.pageY + 10}px`; + }); + img.addEventListener('mouseout', () => { + imagetip.style.display = 'none'; + }); + }); + }); +} +import plugin from './plugin'; +if (!window.$docsify) { + window.$docsify = {}; +} +window.$docsify.plugins = (window.$docsify.plugins || []).concat(plugin); \ No newline at end of file diff --git a/script/otto.js b/script/otto.js new file mode 100644 index 0000000..ce55c36 --- /dev/null +++ b/script/otto.js @@ -0,0 +1,132 @@ +var node, tips; +var currentImageIndex; +var isHidingTips = false; +var show = true; +var anim; +var tipTexts = [""]; + +function showOtto(callback) { + node.style.opacity = 1; + anim = node.animate([ + { bottom: "-100%", transform: "rotate(-30deg)", easing: "cubic-bezier(0.16, 1, 0.3, 1)", offset: 0 }, + { bottom: 0, offset: 1 }, + ], 750); + anim.onfinish = function () { + if (callback) { + callback(); + } + } +} +function hideOtto(callback) { + anim = node.animate([ + { bottom: 0, transform: "rotate(0deg)", easing: "cubic-bezier(0.7, 0, 0.84, 0)", offset: 0 }, + { bottom: "-100%", transform: "rotate(-30deg)", offset: 1 }, + ], 750); + anim.onfinish = function () { + node.style.opacity = 0; + if (callback) { + callback(); + } + } +} + +window.onload = function () { + fetch("tips.json").then(response => response.json()).then(data => { + tipTexts = data; + }); + addOtto(document); + showOtto() +} + +window.$docsify.onLightDarkModeChange = function () { + if (show) { + if (anim.playState != "running") + hideOtto(() => { + image.src = getCurrentImage(); + showOtto(); + }); + } + else + image.src = getCurrentImage(); +} +window.$docsify.onOttoShow = function () { + if (!anim.playState || anim.playState != "finished") { + return; + } + show = !show; + if (show) { + showOtto(); + } else { + hideOtto(); + } +} +function addOtto(document) { + node = document.createElement("div"); + node.className = "otto"; + image = document.createElement("img"); + image.src = getCurrentImage(); + image.alt = "Otto"; + tips = document.createElement("div"); + tips.className = "tips"; + tips.style.opacity = 0; + tips.style.transition = "transform 0.5s"; + node.appendChild(tips); + node.appendChild(image); + node.addEventListener("click", clickOtto); + document.body.appendChild(node); +} +function clickOtto() { + switch (anim.playState) { + case "running": + if (isHidingTips) { + return; + } + isHidingTips = true; + anim.pause(); + temp = anim; + anim = tips.animate([ + { transform: "translateY(0) rotate(0deg)", opacity: 100, offset: 0.5, easing: "ease-in" }, + { transform: "translateY(-10px) rotate(-3deg)", opacity: 0 } + ], 400); + anim.onfinish = function () { + temp.cancel(); + tips.innerHTML = randomTips(); + isHidingTips = false; + playTips(); + } + break; + case "paused": + break; + case "finished": + tips.innerHTML = randomTips(); + playTips(); + break; + } +} + +function playTips() { + anim = tips.animate([ + { transform: "translateY(-10px) rotate(3deg)", opacity: 0, offset: 0, easing: "ease-out" }, + { transform: "translateY(0) rotate(0deg)", opacity: 100, offset: 0.1 }, + { transform: "translateY(0) rotate(0deg)", opacity: 100, offset: 0.9, easing: "ease-in" }, + { transform: "translateY(-10px) rotate(-3deg)", opacity: 0, offset: 1 } + ], 4000); + anim.onfinish = function () { + } +} + +function randomTips() { + return tipTexts[Math.floor(Math.random() * tipTexts.length)]; +} + +function getCurrentImage() { + currentImageIndex = window.$docsify.currentThemeModeIndex; + switch (currentImageIndex) { + case 0: //light + return "/images/otto-rd2.png"; + case 1: //dark + return "/images/otto-rd2-xmas-compressed.png"; + case 2: //default + return "/images/otto-wyym.png"; + } +} \ No newline at end of file diff --git a/script/rdview.js b/script/rdview.js new file mode 100644 index 0000000..90f77ca --- /dev/null +++ b/script/rdview.js @@ -0,0 +1,995 @@ +"use strict"; +var tilePosition = { + "events": { + "sounds": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetCrotchetsPerBar_1", "position": [0, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_2", "position": [1, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_3", "position": [2, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_4", "position": [3, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_5", "position": [4, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_6", "position": [5, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_7", "position": [6, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_8", "position": [7, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_9", "position": [8, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar", "position": [9, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_1", "position": [0, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_2", "position": [1, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_3", "position": [2, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_4", "position": [3, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_5", "position": [4, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_6", "position": [5, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_7", "position": [6, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_8", "position": [7, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_9", "position": [8, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_10", "position": [9, 2, 1, 1] }, + { "name": "PlaySong", "position": [0, 3, 2, 1] }, + { "name": "PlaySound", "position": [2, 3, 1, 1] }, + { "name": "SetBeatsPerMinute", "position": [3, 3, 1, 1] }, + { "name": "SetClapSounds", "position": [4, 3, 1, 1] }, + { "name": "SetHeartExplodeVolume", "position": [5, 3, 1, 1] }, + { "name": "SetHeartExplodeInterval", "position": [6, 3, 1, 1] }, + { "name": "SetGameSound", "position": [7, 3, 1, 1] }, + { "name": "SetBeatSound", "position": [8, 3, 1, 1] }, + { "name": "SetCountingSound", "position": [9, 3, 1, 1] }, + { "name": "SayReadyGetSetGo_Rea", "position": [1, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Dy", "position": [2, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Get", "position": [3, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Set", "position": [4, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Go", "position": [5, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Ready", "position": [10, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_And", "position": [10, 1, 1, 1] }, + { "name": "SayReadyGetSetGo_GetSetGo", "position": [11, 0, 3, 1] }, + { "name": "SayReadyGetSetGo_GetSetOne", "position": [11, 1, 3, 1] }, + { "name": "SayReadyGetSetGo_Stop", "position": [14, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_AndStop", "position": [14, 1, 1, 1] }, + { "name": "SayReadyGetSetGo_ReaDyGetSetGo", "position": [10, 2, 5, 1] }, + { "name": "SayReadyGetSetGo_ReaDyGetSetOne", "position": [10, 3, 5, 1] }, + { "name": "Comment", "position": [15, 0, 1, 1] } + ], + "rows": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetOneshotWave", "position": [1, 0, 1, 1] } + ], + "actions": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetTheme", "position": [1, 0, 1, 1] }, + { "name": "SetVFXPreset", "position": [2, 0, 1, 1] }, + { "name": "SetBackgroundColor", "position": [3, 0, 1, 1] }, + { "name": "SetForeground", "position": [4, 0, 1, 1] }, + { "name": "SetSpeed", "position": [5, 0, 1, 1] }, + { "name": "Flash", "position": [6, 0, 1, 1] }, + { "name": "CustomFlash", "position": [7, 0, 1, 1] }, + { "name": "NewWindowDance", "position": [8, 0, 1, 1] }, + { "name": "MoveCamera", "position": [0, 1, 1, 1] }, + { "name": "PulseCamera", "position": [1, 1, 1, 1] }, + { "name": "TextExplosion", "position": [2, 1, 1, 1] }, + { "name": "ShowDialogue", "position": [3, 1, 1, 1] }, + { "name": "ShowStatusSign", "position": [4, 1, 1, 1] }, + { "name": "FloatingText", "position": [5, 1, 1, 1] }, + { "name": "AdvanceText", "position": [6, 1, 0.5, 1] }, + { "name": "ChangePlayersRows", "position": [7, 1, 1, 1] }, + { "name": "Comment", "position": [8, 1, 1, 1] }, + { "name": "FinishLevel", "position": [0, 2, 1, 1] }, + { "name": "Stutter", "position": [1, 2, 1, 1] }, + { "name": "HideRow", "position": [2, 2, 1, 1] }, + { "name": "MoveRow", "position": [3, 2, 1, 1] }, + { "name": "PlayExpression", "position": [4, 2, 1, 1] }, + { "name": "TintRows", "position": [5, 2, 1, 1] }, + { "name": "BassDrop", "position": [6, 2, 1, 1] }, + { "name": "ShakeScreen", "position": [7, 2, 1, 1] }, + { "name": "FlipScreen", "position": [0, 3, 1, 1] }, + { "name": "InvertColors", "position": [1, 3, 1, 1] }, + { "name": "ShowHands", "position": [2, 3, 1, 1] }, + { "name": "PaintHands", "position": [3, 3, 1, 1] }, + { "name": "SetHandOwner", "position": [4, 3, 1, 1] }, + { "name": "SetPlayStyle", "position": [5, 3, 1, 1] }, + { "name": "TagAction", "position": [6, 3, 1, 1] }, + { "name": "CallCustomMethod", "position": [7, 3, 1, 1] } + ], + "decorations": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "PlayAnimation", "position": [1, 0, 1, 1] }, + { "name": "Tint", "position": [0, 1, 1, 1] }, + { "name": "Comment", "position": [1, 1, 1, 1] }, + { "name": "SetVisible", "position": [0, 2, 1, 1] }, + { "name": "Move", "position": [0, 3, 1, 1] } + ], + "rooms": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "MoveRoom", "position": [0, 1, 1, 1] }, + { "name": "FadeRoom", "position": [0, 2, 1, 1] }, + { "name": "MaskRoom", "position": [0, 3, 1, 1] }, + { "name": "ShowRooms", "position": [1, 0, 1, 4] }, + { "name": "ReorderRooms", "position": [2, 0, 1, 4] }, + { "name": "SetRoomContentMode", "position": [3, 0, 1, 1] }, + { "name": "SetRoomPerspective", "position": [3, 1, 1, 1] }, + { "name": "Comment", "position": [3, 2, 1, 1] } + ], + "custom": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "Comment", "position": [0, 1, 1, 1] } + ], + "beatsSpecial": [ + "AddClassicBeat", + "AddOneshotBeat", + "AddFreeTimeBeat", + "PulseFreeTimeBeat", + "SetRowXs" + ] + } +}; +function loadRDView() { + window.RDViewRender = RDViewRender; +} +class Color { + constructor(red, green, blue, alpha) { + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; + } + ; +} +var EventType; +(function (EventType) { + EventType["sounds"] = "sounds"; + EventType["rows"] = "rows"; + EventType["actions"] = "actions"; + EventType["decorations"] = "decorations"; + EventType["rooms"] = "rooms"; + EventType["custom"] = "custom"; +})(EventType || (EventType = {})); +var BeatsSpecial; +(function (BeatsSpecial) { + BeatsSpecial[BeatsSpecial["AddClassicBeat"] = 0] = "AddClassicBeat"; + BeatsSpecial[BeatsSpecial["AddFreeTimeBeat"] = 1] = "AddFreeTimeBeat"; + BeatsSpecial[BeatsSpecial["PulseFreeTimeBeat"] = 2] = "PulseFreeTimeBeat"; + BeatsSpecial[BeatsSpecial["AddOneshotBeat"] = 3] = "AddOneshotBeat"; + BeatsSpecial[BeatsSpecial["SetRowXs"] = 4] = "SetRowXs"; +})(BeatsSpecial || (BeatsSpecial = {})); +var EventCondition; +(function (EventCondition) { + EventCondition["true"] = "true"; + EventCondition["false"] = "false"; + EventCondition["both"] = "both"; +})(EventCondition || (EventCondition = {})); +class RDViewWindow { + constructor() { + this.Objects = []; + this.Row = 4; + this.Column = 8; + this.Scale = 1; + } +} +class RDEvent { + constructor() { + this.SubType = EventType.custom; + this.BeatType = undefined; + this.Width = 1; + this.Height = 1; + this.EventX = 0; + this.EventY = 0; + this.Style = { Beat: 0, Y: 0 }; + } +} +class RDDescription { + constructor() { + this.Width = 4; + this.Lines = []; + } +} +class RDDescriptionLine { + constructor() { + this.BoxCount = 1; + this.IconCount = 0; + this.Items = []; + } +} +class RDDescriptionText { + constructor() { + this.Text = ""; + } +} +class RDDescriptionBox { + constructor() { + this.Items = []; + } +} +class RDDescriptionBoxInput { + constructor() { + this.Tips = ""; + this.Text = ""; + } +} +class RDDescriptionBoxScroll { + constructor() { + this.Scroll = 0; + } +} +class RDDescriptionBoxButton { + constructor() { + this.Text = ""; + } +} +class RDDescriptionBoxSelect { + constructor() { + this.Items = []; + this.SelectedIndex = 0; + } +} +class RDDescriptionIcon { +} +class RDStyle { + constructor() { + this.Beat = 0; + this.Y = 0; + } +} +class RDBeatStyle { + constructor() { + this.OneshotBeatSubType = []; + this.RowXs = '------'; + } +} +var RDOneshotBeatSubType; +(function (RDOneshotBeatSubType) { + RDOneshotBeatSubType[RDOneshotBeatSubType["Freezeshot"] = 0] = "Freezeshot"; + RDOneshotBeatSubType[RDOneshotBeatSubType["Burnshot"] = 1] = "Burnshot"; + RDOneshotBeatSubType[RDOneshotBeatSubType["Skipshot"] = 2] = "Skipshot"; + RDOneshotBeatSubType[RDOneshotBeatSubType["Subdivision"] = 3] = "Subdivision"; +})(RDOneshotBeatSubType || (RDOneshotBeatSubType = {})); +class RDGroup { + constructor() { + this.Width = 1; + this.Height = 1; + this.Outline = new Color(255, 0, 0, 255); + this.Style = new RDStyle(); + this.ClickStyle = new RDStyle(); + this.Children = []; + } +} +function RDViewRender(lang, code) { + const lines = code.split('\n'); + const window = new RDViewWindow(); + var objs = []; + try { + window.Objects = ReadObjs(code); + } + catch (error) { + return errorHtml(`${error}`); + } + const args = lang.split(/\s+/g); + if (1 < args.length && args.length <= 4) { + if (args[1]) { + window.Column = parseInt(args[1]); + } + if (args[2]) { + window.Row = parseInt(args[2]); + } + if (args[3]) { + window.Scale = parseFloat(args[3]); + } + } + return ConstructObjs(window); +} +function errorHtml(message = "") { + return `
    ${message.length ? `${message}` : ""}
    `; +} +function ReadObjs(line) { + const objs = []; + var reader = new Reader(line); + while (!reader.IsEnd()) { + var event; + try { + const type = reader.ReadSymbol().toLowerCase(); + event = ReadType(type); + } + catch (e) { + event = new RDEvent(); + } + if (event instanceof RDEvent) { + reader.TestRead('.', true); + const name = reader.ReadSymbol(); + var collection; + switch (event.SubType) { + case EventType.sounds: + collection = tilePosition.events.sounds; + break; + case EventType.rows: + collection = tilePosition.events.rows; + switch (name) { + case 'AddClassicBeat': + event.BeatType = BeatsSpecial.AddClassicBeat; + break; + case 'AddFreeTimeBeat': + event.BeatType = BeatsSpecial.AddFreeTimeBeat; + break; + case 'PulseFreeTimeBeat': + event.BeatType = BeatsSpecial.PulseFreeTimeBeat; + break; + case 'AddOneshotBeat': + event.BeatType = BeatsSpecial.AddOneshotBeat; + break; + case 'SetRowXs': + event.BeatType = BeatsSpecial.SetRowXs; + break; + default: + break; + } + break; + case EventType.actions: + collection = tilePosition.events.actions; + break; + case EventType.decorations: + collection = tilePosition.events.decorations; + break; + case EventType.rooms: + collection = tilePosition.events.rooms; + break; + case EventType.custom: + collection = tilePosition.events.custom; + break; + default: + collection = tilePosition.events.custom; + break; + } + const pos = collection.filter(i => i.name.toLowerCase() === name.toLowerCase())[0]; + if (pos) { + event.EventX = pos.position[0]; + event.EventY = pos.position[1]; + event.Width = pos.position[2]; + event.Height = pos.position[3]; + } + try { + event.Style.Beat = reader.ReadFloat(); + } + catch (e) { } + try { + event.Style.Y = reader.ReadInt(); + } + catch (e) { } + if (reader.TestPeek('[')) { + const pairString = reader.ReadQuoted('[', ']'); + const keyvalues = new Reader(pairString, reader).ReadPairs(); + ReadProperties(reader, event, keyvalues); + } + reader.TestRead(';', true); + } + else if (event instanceof RDGroup) { + try { + event.Style.Beat = reader.ReadFloat(); + } + catch (e) { } + try { + event.Style.Y = reader.ReadInt(); + } + catch (e) { } + try { + event.Width = reader.ReadFloat(); + } + catch (e) { } + try { + event.Height = reader.ReadInt(); + } + catch (e) { } + try { + event.Outline = reader.ReadColor(); + } + catch (e) { } + if (reader.TestPeek('[')) { + const pairString = reader.ReadQuoted('[', ']'); + const keyvalues = new Reader(pairString, reader).ReadPairs(); + ReadProperties(reader, event, keyvalues); + } + if (reader.TestPeek('{')) { + const pairString = reader.ReadQuoted('{', '}'); + const objs2 = ReadObjs(pairString); + event.Children = objs2; + } + reader.TestRead(';', true); + } + objs.push(event); + } + return objs; +} +function IsEmptyOrSpace(string) { + return (string) ? /\s/.test(string) : false; +} +class Reader { + constructor(string, reader = undefined) { + this.position = 0; + this.line = 0; + this.offl = 0; + this.offp = 0; + this.string = string; + if (reader) { + this.offl = reader.line; + this.offp = reader.position; + } + } + ; + IsEnd() { + this.JumpSpace(); + return this.position >= this.string.length; + } + JumpSpace() { + while (IsEmptyOrSpace(this.string[this.position])) { + if (this.string[this.position] === '\n') { + this.line++; + } + this.position++; + } + } + Peek() { + this.JumpSpace(); + return this.string[this.position]; + } + TestPeek(str, allowThrow = false) { + this.JumpSpace(); + var c = this.string.substring(this.position, this.position + str.length); + if (c === str) { + return true; + } + else { + if (allowThrow) { + throw new Error(`Expecting a string '${str}' but got '${c}': ${this.GetPositionDescription()}.`); + } + else { + return false; + } + } + } + TestRead(str, allowThrow = false) { + this.JumpSpace(); + var c = this.string.substring(this.position, this.position + str.length); + if (c === str) { + this.position++; + return true; + } + else { + if (allowThrow) { + throw new Error(`Expecting a char '${str}' but got '${c}': ${this.GetPositionDescription()}.`); + } + else { + return false; + } + } + } + ReadChar() { + var c = this.string[this.position]; + if (c === '\n') { + this.line++; + } + this.position++; + return c; + } + ReadSymbol() { + var _a; + this.JumpSpace(); + var name = (_a = this.string.substring(this.position).match(/^\w+/)) === null || _a === void 0 ? void 0 : _a[0]; + if (name) { + this.position += name.length; + return name; + } + throw new Error(`Expecting a key but missing: ${this.GetPositionDescription()}.`); + } + ReadColor() { + var _a; + this.JumpSpace(); + var color = (_a = this.string.substring(this.position).match(/^#[0-9A-Fa-f]{3}([0-9A-Fa-f]{1}([0-9A-Fa-f]{2}([0-9A-Fa-f]{2})?)?)?/)) === null || _a === void 0 ? void 0 : _a[0].substring(1); + if (!color) { + throw new Error(`Expecting a color but missing: ${this.GetPositionDescription()}`); + } + var result; + switch (color.length) { + case 3: + result = new Color(parseInt(color.substring(0, 1), 16) * 16, parseInt(color.substring(1, 2), 16) * 16, parseInt(color.substring(2, 3), 16) * 16, 255); + break; + case 4: + result = new Color(parseInt(color.substring(0, 1), 16) * 16, parseInt(color.substring(1, 2), 16) * 16, parseInt(color.substring(2, 3), 16) * 16, parseInt(color.substring(3, 4), 16) * 16); + break; + case 6: + result = new Color(parseInt(color.substring(0, 2), 16), parseInt(color.substring(2, 4), 16), parseInt(color.substring(4, 6), 16), 255); + break; + case 8: + result = new Color(parseInt(color.substring(0, 2), 16), parseInt(color.substring(2, 4), 16), parseInt(color.substring(4, 6), 16), parseInt(color.substring(6, 8), 16)); + break; + default: + result = new Color(255, 0, 0, 255); + break; + } + this.position += color.length + 1; + return result; + } + ReadInt() { + var _a; + this.JumpSpace(); + var name = (_a = this.string.substring(this.position).match(/^[+-]?[0-9]+/)) === null || _a === void 0 ? void 0 : _a[0]; + if (name) { + this.position += name.length; + return parseInt(name); + } + throw new Error(`Expecting an int but missing: ${this.GetPositionDescription()}.`); + } + ReadFloat() { + var _a; + this.JumpSpace(); + var name = (_a = this.string.substring(this.position).match(/^[+-]?([0-9]*[.])?[0-9]+/)) === null || _a === void 0 ? void 0 : _a[0]; + if (name) { + this.position += name.length; + return parseFloat(name); + } + throw new Error(`Expecting a float but missing: ${this.GetPositionDescription()}.`); + } + ReadPairs(separator = ',', equals = '=') { + var pairs = []; + var flag = !this.IsEnd(); + while (flag) { + if (this.IsEnd()) { + break; + } + const index = this.position + this.offp; + const name = this.ReadSymbol(); + this.TestRead(equals, true); + const value = this.ReadWhileNotEnd([separator]); + pairs.push({ Key: name, Value: value, Index: index }); + if (flag = !this.IsEnd()) { + this.TestRead(separator, true); + } + } + return pairs; + } + ReadWhileNotEnd(ends = [',', ']']) { + var str = ''; + while (!(this.position >= this.string.length) && !ends.find(i => this.string.startsWith(i, this.position))) { + str += this.string[this.position]; + this.position++; + } + return str.trim(); + } + ReadQuoted(left, right) { + this.JumpSpace(); + var level = 0; + var result = ''; + if (this.string.startsWith(left, this.position)) { + level++; + this.position += left.length; + } + else { + throw new Error(`Cannot find the left half "${left}": ${this.GetPositionDescription()}`); + } + while (!(this.position >= this.string.length) && level > 0) { + if (this.string.startsWith(left, this.position)) { + level++; + this.position += left.length; + result += left; + } + if (this.string.startsWith(right, this.position)) { + level--; + this.position += right.length; + if (level === 0) { + return result; + } + else { + result += right; + } + } + result += this.string[this.position]; + this.position++; + } + throw new Error(`Cannot find the right half "${right}": ${this.GetPositionDescription()}`); + } + GetPositionDescription(position = undefined) { + const s = this.string.split('\n'); + var curp = this.offp; + var line = this.offl; + if (position !== undefined) { + while (curp + s[line].length + 1 < position - this.offp) { + curp += s[line].length + 1; + line += 1; + } + } + else { + curp += s.slice(0, this.line).reduce((sum, i) => sum + i.length + 1, 0); + line += this.line; + position = this.position; + } + return `
    at "${s[line]}".`; //, at ${line + 1}:${position - curp}`; + } +} +function FindValue(pairs, key) { + const finded = pairs.find(i => i.Key === key); + if (finded) { + return finded; + } + return undefined; +} +function ReadType(typename) { + var t = EventType.custom; + var event; + switch (typename[0]) { + case 'e': + event = new RDEvent(); + switch (typename[1]) { + case 's': + t = EventType.sounds; + break; + case 'b': + t = EventType.rows; + break; + case 'a': + t = EventType.actions; + break; + case 'd': + t = EventType.decorations; + break; + case 'r': + t = EventType.rooms; + break; + case 'c': + t = EventType.custom; + break; + default: + t = EventType.custom; + } + event.SubType = t; + break; + case 'g': + event = new RDGroup(); + break; + default: + event = new RDEvent(); + } + return event; +} +function ReadProperties(reader, event, pairs) { + var _a, _b, _c, _d, _e, _f; + if (event instanceof RDGroup) { + if (value = FindValue(pairs, "hue")) { + try { + event.Style.Hue = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "brightness")) { + try { + event.Style.Brightness = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "grayscale")) { + try { + event.Style.Grayscale = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "opacity")) { + try { + event.Style.Opacity = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "offset")) { + reader = new Reader(value.Value); + (_a = event.ClickStyle) !== null && _a !== void 0 ? _a : (event.ClickStyle = new RDStyle()); + try { + event.ClickStyle.Beat = reader.ReadFloat(); + } + catch (e) { } + try { + event.ClickStyle.Y = reader.ReadInt(); + } + catch (e) { } + try { + event.ClickOutline = reader.ReadColor(); + } + catch (e) { } + } + if (value = FindValue(pairs, "offset_hue")) { + (_b = event.ClickStyle) !== null && _b !== void 0 ? _b : (event.ClickStyle = new RDStyle()); + event.ClickStyle.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_brightness")) { + (_c = event.ClickStyle) !== null && _c !== void 0 ? _c : (event.ClickStyle = new RDStyle()); + event.ClickStyle.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_grayscale")) { + (_d = event.ClickStyle) !== null && _d !== void 0 ? _d : (event.ClickStyle = new RDStyle()); + event.ClickStyle.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_opacity")) { + (_e = event.ClickStyle) !== null && _e !== void 0 ? _e : (event.ClickStyle = new RDStyle()); + event.ClickStyle.Opacity = parseFloat(value.Value); + } + } + else if (event instanceof RDEvent) { + var value; + if (value = FindValue(pairs, "if")) { + if (["true", "false", "both"].find(i => i === (value === null || value === void 0 ? void 0 : value.Value))) { + event.Condition = value.Value === "true" ? EventCondition.true : + value.Value === "false" ? EventCondition.false : EventCondition.both; + } + else { + throw new Error(`Expecting "true", "false" or "both", but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "tag")) { + event.Tag = value.Value === "true" ? true : false; + } + if (value = FindValue(pairs, "hue")) { + event.Style.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "brightness")) { + event.Style.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "grayscale")) { + event.Style.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "opacity")) { + event.Style.Opacity = parseFloat(value.Value); + } + (_f = event.ClickStyle) !== null && _f !== void 0 ? _f : (event.ClickStyle = new RDStyle()); + if (value = FindValue(pairs, "offset")) { + reader = new Reader(value.Value); + try { + event.ClickStyle.Beat = reader.ReadFloat(); + } + catch (e) { } + try { + event.ClickStyle.Y = reader.ReadInt(); + } + catch (e) { } + } + if (value = FindValue(pairs, "offset_hue")) { + event.ClickStyle.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_brightness")) { + event.ClickStyle.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_grayscale")) { + event.ClickStyle.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_opacity")) { + event.ClickStyle.Opacity = parseFloat(value.Value); + } + if (event.BeatType !== undefined) { + event.BeatStyle = new RDBeatStyle(); + if (value = FindValue(pairs, "tick")) { + event.BeatStyle.Tick = parseFloat(value.Value); + } + switch (event.BeatType) { + case BeatsSpecial.AddClassicBeat: + if (value = FindValue(pairs, "swing")) { + event.BeatStyle.Swing = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.AddFreeTimeBeat: + if (value = FindValue(pairs, "pulse")) { + event.BeatStyle.Pulse = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.PulseFreeTimeBeat: + if (value = FindValue(pairs, "pulse")) { + event.BeatStyle.Pulse = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.SetRowXs: + if ((value = FindValue(pairs, "rowxs"))) { + if (value.Value.match(/^[-x]{6}$/)) { + event.BeatStyle.RowXs = value.Value; + } + else { + throw new Error(`Expect a string of length 6, consisting of "x" and "-", instead of "${value === null || value === void 0 ? void 0 : value.Value}".`); + } + } + break; + case BeatsSpecial.AddOneshotBeat: + if (value = FindValue(pairs, "type")) { + const types = value.Value.split(/\s+/); + var illegal; + if ((illegal = types.filter(i => { + ![ + "freezeshot", + "burnshot", + "skipshot", + "subdivision" + ].includes(i); + })).length) { + throw new Error(`Expecting "freezeshot", "burnshot", "skipshot" or "subdivision", but find ${illegal.map(i => `"${i}"`).join(', ')}.`); + } + else { + types.map(i => { + var _a, _b, _c, _d; + switch (i) { + case "freezeshot": + (_a = event.BeatStyle) === null || _a === void 0 ? void 0 : _a.OneshotBeatSubType.push(RDOneshotBeatSubType.Freezeshot); + break; + case "burnshot": + (_b = event.BeatStyle) === null || _b === void 0 ? void 0 : _b.OneshotBeatSubType.push(RDOneshotBeatSubType.Burnshot); + break; + case "skipshot": + (_c = event.BeatStyle) === null || _c === void 0 ? void 0 : _c.OneshotBeatSubType.push(RDOneshotBeatSubType.Skipshot); + break; + case "subdivision": + (_d = event.BeatStyle) === null || _d === void 0 ? void 0 : _d.OneshotBeatSubType.push(RDOneshotBeatSubType.Subdivision); + break; + } + }); + } + } + if (value = FindValue(pairs, "interval")) { + event.BeatStyle.Interval = parseFloat(value.Value); + } + if ((value = FindValue(pairs, "delay")) + && event.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Freezeshot)) { + event.BeatStyle.Delay = parseFloat(value.Value); + } + if ((value = FindValue(pairs, "subdivision")) + && event.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Subdivision)) { + event.BeatStyle.Subdivision = parseFloat(value.Value); + } + if (value = FindValue(pairs, "loop")) { + event.BeatStyle.Loop = parseInt(value.Value); + } + break; + default: + break; + } + } + } +} +function ConstructObjs(window) { + var html = `
    ` + + `
    `; + for (var obj of window.Objects) { + html += ConstructDivObject(obj); + } + html += `
    `; + return html; +} +function ConstructDivObject(obj) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; + if (obj instanceof RDEvent) { + return `
    ${ConstructSubDiv([obj.Condition !== undefined, `condition-${obj.Condition}`, () => ''], [obj.Tag === true, `tag`, () => ''], [obj.BeatType === BeatsSpecial.AddClassicBeat, `classicbeat`, () => { + var result = ''; + for (var i = 0; i < 6; i++) { + result += `
    `; + } + return result; + }], [obj.BeatType === BeatsSpecial.AddFreeTimeBeat, `add freetime`, () => { return ''; }], [obj.BeatType === BeatsSpecial.PulseFreeTimeBeat, `pulse freetime`, () => ''], [((_q = obj.BeatStyle) === null || _q === void 0 ? void 0 : _q.Loop) !== undefined && obj.BeatStyle.Loop > 0, `loop`, () => { + var _a, _b; + var result = ''; + for (var i = 0; i < ((_b = (_a = obj.BeatStyle) === null || _a === void 0 ? void 0 : _a.Loop) !== null && _b !== void 0 ? _b : 0); i++) { + result += `
    `; + } + return result; + }], [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Freezeshot), `freezeshots`, () => { + var _a, _b; + var result = ''; + for (var i = 0; i < ((_b = (_a = obj.BeatStyle) === null || _a === void 0 ? void 0 : _a.Loop) !== null && _b !== void 0 ? _b : 0) + 1; i++) { + result += `
    `; + } + return result; + }], [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Burnshot), `burnshots`, () => { + var _a, _b; + var result = ''; + for (var i = 0; i < ((_b = (_a = obj.BeatStyle) === null || _a === void 0 ? void 0 : _a.Loop) !== null && _b !== void 0 ? _b : 0) + 1; i++) { + result += `
    `; + } + return result; + }], [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Subdivision), `subdivisions`, () => { + var _a, _b, _c, _d; + var result = ''; + for (var l = 0; l < ((_b = (_a = obj.BeatStyle) === null || _a === void 0 ? void 0 : _a.Loop) !== null && _b !== void 0 ? _b : 0) + 1; l++) { + result += `
    `; + for (var i = 0; i < ((_d = (_c = obj.BeatStyle) === null || _c === void 0 ? void 0 : _c.Subdivision) !== null && _d !== void 0 ? _d : 1); i++) { + result += `
    `; + } + result += `
    `; + } + return result; + }], [obj.BeatType === BeatsSpecial.SetRowXs, `row-xs`, () => { + var _a; + var result = ''; + for (var i = 0; i < 6; i++) { + result += (((_a = obj.BeatStyle) === null || _a === void 0 ? void 0 : _a.RowXs[i]) === 'x') ? `
    ` : `
    `; + } + return result; + }], [(obj.BeatType === BeatsSpecial.AddClassicBeat || obj.BeatType === BeatsSpecial.AddFreeTimeBeat || obj.BeatType === BeatsSpecial.PulseFreeTimeBeat) && ((_s = (_r = obj.BeatStyle) === null || _r === void 0 ? void 0 : _r.Hold) !== null && _s !== void 0 ? _s : 0) > 0, `holdbeat`, () => ''], [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Skipshot), `skipshot`, () => ''])}
    `; + } + else if (obj instanceof RDGroup) { + return `
    ${obj.Children.map(i => ConstructDivObject(i)).join('')}
    `; + } + else { + return ''; + } +} +function ConstructCssPropertiesIfExists(pairs) { + var result = ''; + for (const [key, value] of pairs) { + result += value !== undefined ? `--${key}:${value};` : ``; + } + return result; +} +function ConstructCssProperties(pairs) { + var result = ''; + for (const [key, value] of pairs) { + result += `--${key}:${value};`; + } + return result; +} +function ConstructSubDiv(...pairs) { + var result = ''; + for (const [key, name, func] of pairs) { + result += key ? `
    ${func()}
    ` : ``; + } + return result; +} +function ToHex(color) { + const hex = parseInt(color.red.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.green.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.blue.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.alpha.toFixed(0)).toString(16).padStart(2, '0'); + return '#' + hex; +} +window.loadRDView = loadRDView; diff --git a/script/rdview.ts b/script/rdview.ts new file mode 100644 index 0000000..756f7a9 --- /dev/null +++ b/script/rdview.ts @@ -0,0 +1,986 @@ +var tilePosition = { + "events": { + "sounds": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetCrotchetsPerBar_1", "position": [0, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_2", "position": [1, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_3", "position": [2, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_4", "position": [3, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_5", "position": [4, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_6", "position": [5, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_7", "position": [6, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_8", "position": [7, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar_9", "position": [8, 1, 1, 1] }, + { "name": "SetCrotchetsPerBar", "position": [9, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_1", "position": [0, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_2", "position": [1, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_3", "position": [2, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_4", "position": [3, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_5", "position": [4, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_6", "position": [5, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_7", "position": [6, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_8", "position": [7, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_9", "position": [8, 2, 1, 1] }, + { "name": "SayReadyGetSetGo_10", "position": [9, 2, 1, 1] }, + { "name": "PlaySong", "position": [0, 3, 2, 1] }, + { "name": "PlaySound", "position": [2, 3, 1, 1] }, + { "name": "SetBeatsPerMinute", "position": [3, 3, 1, 1] }, + { "name": "SetClapSounds", "position": [4, 3, 1, 1] }, + { "name": "SetHeartExplodeVolume", "position": [5, 3, 1, 1] }, + { "name": "SetHeartExplodeInterval", "position": [6, 3, 1, 1] }, + { "name": "SetGameSound", "position": [7, 3, 1, 1] }, + { "name": "SetBeatSound", "position": [8, 3, 1, 1] }, + { "name": "SetCountingSound", "position": [9, 3, 1, 1] }, + { "name": "SayReadyGetSetGo_Rea", "position": [1, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Dy", "position": [2, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Get", "position": [3, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Set", "position": [4, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Go", "position": [5, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_Ready", "position": [10, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_And", "position": [10, 1, 1, 1] }, + { "name": "SayReadyGetSetGo_GetSetGo", "position": [11, 0, 3, 1] }, + { "name": "SayReadyGetSetGo_GetSetOne", "position": [11, 1, 3, 1] }, + { "name": "SayReadyGetSetGo_Stop", "position": [14, 0, 1, 1] }, + { "name": "SayReadyGetSetGo_AndStop", "position": [14, 1, 1, 1] }, + { "name": "SayReadyGetSetGo_ReaDyGetSetGo", "position": [10, 2, 5, 1] }, + { "name": "SayReadyGetSetGo_ReaDyGetSetOne", "position": [10, 3, 5, 1] }, + { "name": "Comment", "position": [15, 0, 1, 1] } + ], + "rows": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetOneshotWave", "position": [1, 0, 1, 1] } + ], + "actions": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "SetTheme", "position": [1, 0, 1, 1] }, + { "name": "SetVFXPreset", "position": [2, 0, 1, 1] }, + { "name": "SetBackgroundColor", "position": [3, 0, 1, 1] }, + { "name": "SetForeground", "position": [4, 0, 1, 1] }, + { "name": "SetSpeed", "position": [5, 0, 1, 1] }, + { "name": "Flash", "position": [6, 0, 1, 1] }, + { "name": "CustomFlash", "position": [7, 0, 1, 1] }, + { "name": "NewWindowDance", "position": [8, 0, 1, 1] }, + { "name": "MoveCamera", "position": [0, 1, 1, 1] }, + { "name": "PulseCamera", "position": [1, 1, 1, 1] }, + { "name": "TextExplosion", "position": [2, 1, 1, 1] }, + { "name": "ShowDialogue", "position": [3, 1, 1, 1] }, + { "name": "ShowStatusSign", "position": [4, 1, 1, 1] }, + { "name": "FloatingText", "position": [5, 1, 1, 1] }, + { "name": "AdvanceText", "position": [6, 1, 0.5, 1] }, + { "name": "ChangePlayersRows", "position": [7, 1, 1, 1] }, + { "name": "Comment", "position": [8, 1, 1, 1] }, + { "name": "FinishLevel", "position": [0, 2, 1, 1] }, + { "name": "Stutter", "position": [1, 2, 1, 1] }, + { "name": "HideRow", "position": [2, 2, 1, 1] }, + { "name": "MoveRow", "position": [3, 2, 1, 1] }, + { "name": "PlayExpression", "position": [4, 2, 1, 1] }, + { "name": "TintRows", "position": [5, 2, 1, 1] }, + { "name": "BassDrop", "position": [6, 2, 1, 1] }, + { "name": "ShakeScreen", "position": [7, 2, 1, 1] }, + { "name": "FlipScreen", "position": [0, 3, 1, 1] }, + { "name": "InvertColors", "position": [1, 3, 1, 1] }, + { "name": "ShowHands", "position": [2, 3, 1, 1] }, + { "name": "PaintHands", "position": [3, 3, 1, 1] }, + { "name": "SetHandOwner", "position": [4, 3, 1, 1] }, + { "name": "SetPlayStyle", "position": [5, 3, 1, 1] }, + { "name": "TagAction", "position": [6, 3, 1, 1] }, + { "name": "CallCustomMethod", "position": [7, 3, 1, 1] } + ], + "decorations": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "PlayAnimation", "position": [1, 0, 1, 1] }, + { "name": "Tint", "position": [0, 1, 1, 1] }, + { "name": "Comment", "position": [1, 1, 1, 1] }, + { "name": "SetVisible", "position": [0, 2, 1, 1] }, + { "name": "Move", "position": [0, 3, 1, 1] } + ], + "rooms": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "MoveRoom", "position": [0, 1, 1, 1] }, + { "name": "FadeRoom", "position": [0, 2, 1, 1] }, + { "name": "MaskRoom", "position": [0, 3, 1, 1] }, + { "name": "ShowRooms", "position": [1, 0, 1, 4] }, + { "name": "ReorderRooms", "position": [2, 0, 1, 4] }, + { "name": "SetRoomContentMode", "position": [3, 0, 1, 1] }, + { "name": "SetRoomPerspective", "position": [3, 1, 1, 1] }, + { "name": "Comment", "position": [3, 2, 1, 1] } + ], + "custom": [ + { "name": "Empty", "position": [0, 0, 1, 1] }, + { "name": "Comment", "position": [0, 1, 1, 1] } + ], + "beatsSpecial": [ + "AddClassicBeat", + "AddOneshotBeat", + "AddFreeTimeBeat", + "PulseFreeTimeBeat", + "SetRowXs" + ] + } +} +function loadRDView() { + (window as any).RDViewRender = RDViewRender; +} +class Color { + readonly red: number; + readonly green: number; + readonly blue: number; + readonly alpha: number; + constructor(red: number, green: number, blue: number, alpha: number) { + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; + }; +} +enum EventType { + sounds = "sounds", + rows = "rows", + actions = "actions", + decorations = "decorations", + rooms = "rooms", + custom = "custom", +} +enum BeatsSpecial { + AddClassicBeat, + AddFreeTimeBeat, + PulseFreeTimeBeat, + AddOneshotBeat, + SetRowXs, +} +enum EventCondition { + true = "true", + false = "false", + both = "both", +} +class RDViewWindow { + Objects: (RDEvent | RDGroup)[] = []; + Row: number = 4; + Column: number = 8; + Scale: number = 1; +} +class RDEvent { + SubType: EventType = EventType.custom; + BeatType?: BeatsSpecial = undefined; + BeatStyle?: RDBeatStyle; + Width: number = 1; + Height: number = 1; + EventX: number = 0; + EventY: number = 0; + Style: RDStyle = { Beat: 0, Y: 0 }; + ClickStyle?: RDStyle; + Condition?: EventCondition; + Tag?: boolean; + Description?: RDDescription; +} +class RDDescription { + Width: number = 4; + Lines: RDDescriptionLine[] = []; +} +class RDDescriptionLine { + BoxCount: number = 1; + IconCount: number = 0; + Items: (RDDescriptionText | RDDescriptionBox | RDDescriptionIcon)[] = []; +} +class RDDescriptionText { + Middle?: boolean; + Hoverable?: boolean; + FGray?: boolean; + Highlight?: boolean; + Text: string = ""; +} +class RDDescriptionBox { + Items: (RDDescriptionBoxButton | RDDescriptionBoxInput | RDDescriptionBoxScroll | RDDescriptionBoxSelect)[] = []; +} +class RDDescriptionBoxInput { + Tips?: string = ""; + Middle?: boolean; + FGray?: boolean; + BlackBack?: boolean; + Highlight?: boolean; + Text: string = ""; +} +class RDDescriptionBoxScroll { + Scroll: number = 0; +} +class RDDescriptionBoxButton { + Middle?: boolean; + Active?: boolean; + GrayBack?: boolean; + Highlight?: boolean; + Text: string = ""; +} +class RDDescriptionBoxSelect { + Items: string[] = []; + SelectedIndex: number = 0; +} +class RDDescriptionIcon { +} +class RDStyle { + Beat: number = 0; + Y: number = 0; + Brightness?: number; + Hue?: number; + Grayscale?: number; + Opacity?: number; +} +class RDBeatStyle { + Tick?: number; + OneshotBeatSubType: RDOneshotBeatSubType[] = []; + Interval?: number; + Delay?: number; + Subdivision?: number; + Swing?: number; + Hold?: number; + Pulse?: number; + RowXs: string = '------'; + Loop?: number; +} +enum RDOneshotBeatSubType { + Freezeshot, + Burnshot, + Skipshot, + Subdivision, +} +class RDGroup { + Width: number = 1; + Height: number = 1; + Outline: Color = new Color(255, 0, 0, 255); + Style: RDStyle = new RDStyle(); + ClickStyle: RDStyle = new RDStyle(); + ClickOutline?: Color; + Children: (RDEvent | RDGroup)[] = []; +} +function RDViewRender(lang: string, code: string): string { + const lines: string[] = code.split('\n'); + const window: RDViewWindow = new RDViewWindow(); + var objs: (RDEvent | RDGroup)[] = []; + try { + window.Objects = ReadObjs(code); + } catch (error) { + return errorHtml(`${error}`); + } + const args = lang.split(/\s+/g); + if (1 < args.length && args.length <= 4) { + if (args[1]) { + window.Column = parseInt(args[1]); + } + if (args[2]) { + window.Row = parseInt(args[2]); + } + if (args[3]) { + window.Scale = parseFloat(args[3]); + } + } + return ConstructObjs(window); +} +function errorHtml(message: string = ""): string { + return `
    ${message.length ? `${message}` : ""}
    `; +} +function ReadObjs(line: string): (RDEvent | RDGroup)[] { + const objs: (RDEvent | RDGroup)[] = []; + var reader = new Reader(line); + while (!reader.IsEnd()) { + var event: (RDEvent | RDGroup); + try { + const type = reader.ReadSymbol().toLowerCase(); + event = ReadType(type); + } + catch (e) { + event = new RDEvent(); + } + if (event instanceof RDEvent) { + reader.TestRead('.', true); + const name = reader.ReadSymbol(); + var collection; + switch (event.SubType) { + case EventType.sounds: + collection = tilePosition.events.sounds; + break; + case EventType.rows: + collection = tilePosition.events.rows; + switch (name) { + case 'AddClassicBeat': + event.BeatType = BeatsSpecial.AddClassicBeat; + break; + case 'AddFreeTimeBeat': + event.BeatType = BeatsSpecial.AddFreeTimeBeat; + break; + case 'PulseFreeTimeBeat': + event.BeatType = BeatsSpecial.PulseFreeTimeBeat; + break; + case 'AddOneshotBeat': + event.BeatType = BeatsSpecial.AddOneshotBeat; + break; + case 'SetRowXs': + event.BeatType = BeatsSpecial.SetRowXs; + break; + default: + break; + } + break; + case EventType.actions: + collection = tilePosition.events.actions; + break; + case EventType.decorations: + collection = tilePosition.events.decorations; + break; + case EventType.rooms: + collection = tilePosition.events.rooms; + break; + case EventType.custom: + collection = tilePosition.events.custom; + break; + default: + collection = tilePosition.events.custom; + break; + } + const pos = collection.filter(i => i.name.toLowerCase() === name.toLowerCase())[0]; + if (pos) { + event.EventX = pos.position[0]; + event.EventY = pos.position[1]; + event.Width = pos.position[2]; + event.Height = pos.position[3]; + } + try { event.Style.Beat = reader.ReadFloat(); } catch (e) { } + try { event.Style.Y = reader.ReadInt(); } catch (e) { } + if (reader.TestPeek('[')) { + const pairString: string = reader.ReadQuoted('[', ']'); + const keyvalues = new Reader(pairString, reader).ReadPairs(); + ReadProperties(reader, event, keyvalues); + } + reader.TestRead(';', true); + } + else if (event instanceof RDGroup) { + try { event.Style.Beat = reader.ReadFloat(); } catch (e) { } + try { event.Style.Y = reader.ReadInt(); } catch (e) { } + try { event.Width = reader.ReadFloat(); } catch (e) { } + try { event.Height = reader.ReadInt(); } catch (e) { } + try { event.Outline = reader.ReadColor(); } catch (e) { } + if (reader.TestPeek('[')) { + const pairString: string = reader.ReadQuoted('[', ']'); + const keyvalues = new Reader(pairString, reader).ReadPairs(); + ReadProperties(reader, event, keyvalues); + } + if (reader.TestPeek('{')) { + const pairString: string = reader.ReadQuoted('{', '}'); + const objs2 = ReadObjs(pairString); + event.Children = objs2; + } + reader.TestRead(';', true); + } + objs.push(event); + } + return objs; +} +interface KeyValuePair { + Index: number; + Key: string; + Value: string; +} +function IsEmptyOrSpace(string: string): boolean { + return (string) ? /\s/.test(string) : false; +} +class Reader { + private string: string; + private position: number = 0; + private line: number = 0; + private offl: number = 0; + private offp: number = 0; + constructor(string: string, reader: Reader | undefined = undefined) { + this.string = string; + if (reader) { + this.offl = reader.line; + this.offp = reader.position; + } + }; + public IsEnd(): boolean { + this.JumpSpace(); + return this.position >= this.string.length; + } + private JumpSpace(): void { + while (IsEmptyOrSpace(this.string[this.position])) { + if (this.string[this.position] === '\n') { + this.line++; + } + this.position++; + } + } + public Peek(): string { + this.JumpSpace(); + return this.string[this.position]; + } + public TestPeek(str: string, allowThrow: boolean = false): boolean { + this.JumpSpace(); + var c = this.string.substring(this.position, this.position + str.length); + if (c === str) { + return true; + } + else { + if (allowThrow) { + throw new Error(`Expecting a string '${str}' but got '${c}': ${this.GetPositionDescription()}.`); + } + else { + return false; + } + } + } + public TestRead(str: string, allowThrow: boolean = false): boolean { + this.JumpSpace(); + var c = this.string.substring(this.position, this.position + str.length); + if (c === str) { + this.position++; + return true; + } + else { + if (allowThrow) { + throw new Error(`Expecting a char '${str}' but got '${c}': ${this.GetPositionDescription()}.`); + } + else { + return false; + } + } + } + public ReadChar(): string { + var c = this.string[this.position]; + if (c === '\n') { + this.line++; + } + this.position++; + return c; + } + public ReadSymbol(): string { + this.JumpSpace(); + var name = this.string.substring(this.position).match(/^\w+/)?.[0]; + if (name) { + this.position += name.length; + return name; + } + throw new Error(`Expecting a key but missing: ${this.GetPositionDescription()}.`); + } + public ReadColor(): Color { + this.JumpSpace(); + var color = this.string.substring(this.position).match(/^#[0-9A-Fa-f]{3}([0-9A-Fa-f]{1}([0-9A-Fa-f]{2}([0-9A-Fa-f]{2})?)?)?/)?.[0].substring(1); + if (!color) { + throw new Error(`Expecting a color but missing: ${this.GetPositionDescription()}`); + } + var result: Color; + switch (color.length) { + case 3: + result = new Color( + parseInt(color.substring(0, 1), 16) * 16, + parseInt(color.substring(1, 2), 16) * 16, + parseInt(color.substring(2, 3), 16) * 16, + 255 + ); + break; + case 4: + result = new Color( + parseInt(color.substring(0, 1), 16) * 16, + parseInt(color.substring(1, 2), 16) * 16, + parseInt(color.substring(2, 3), 16) * 16, + parseInt(color.substring(3, 4), 16) * 16 + ); + break; + case 6: + result = new Color( + parseInt(color.substring(0, 2), 16), + parseInt(color.substring(2, 4), 16), + parseInt(color.substring(4, 6), 16), + 255 + ); + break; + case 8: + result = new Color( + parseInt(color.substring(0, 2), 16), + parseInt(color.substring(2, 4), 16), + parseInt(color.substring(4, 6), 16), + parseInt(color.substring(6, 8), 16) + ); + break; + default: + result = new Color(255, 0, 0, 255); + break; + } + this.position += color.length + 1; + return result; + } + public ReadInt(): number { + this.JumpSpace(); + var name = this.string.substring(this.position).match(/^[+-]?[0-9]+/)?.[0]; + if (name) { + this.position += name.length; + return parseInt(name); + } + throw new Error(`Expecting an int but missing: ${this.GetPositionDescription()}.`); + } + public ReadFloat(): number { + this.JumpSpace(); + var name = this.string.substring(this.position).match(/^[+-]?([0-9]*[.])?[0-9]+/)?.[0]; + if (name) { + this.position += name.length; + return parseFloat(name); + } + throw new Error(`Expecting a float but missing: ${this.GetPositionDescription()}.`); + } + public ReadPairs(separator: string = ',', equals: string = '='): KeyValuePair[] { + var pairs: KeyValuePair[] = []; + var flag: boolean = !this.IsEnd(); + while (flag) { + if (this.IsEnd()) { + break; + } + const index = this.position + this.offp; + const name = this.ReadSymbol(); + this.TestRead(equals, true); + const value = this.ReadWhileNotEnd([separator]); + pairs.push({ Key: name, Value: value, Index: index }); + if (flag = !this.IsEnd()) { + this.TestRead(separator, true); + } + } + return pairs; + } + public ReadWhileNotEnd(ends: string[] = [',', ']']): string { + var str: string = ''; + while (!(this.position >= this.string.length) && !ends.find(i => this.string.startsWith(i, this.position))) { + str += this.string[this.position]; + this.position++; + } + return str.trim(); + } + public ReadQuoted(left: string, right: string): string { + this.JumpSpace(); + var level: number = 0; + var result = ''; + if (this.string.startsWith(left, this.position)) { level++; this.position += left.length; } + else { throw new Error(`Cannot find the left half "${left}": ${this.GetPositionDescription()}`); } + while (!(this.position >= this.string.length) && level > 0) { + if (this.string.startsWith(left, this.position)) { + level++; + this.position += left.length; + result += left; + } + if (this.string.startsWith(right, this.position)) { + level--; + this.position += right.length; + if (level === 0) { + return result; + } + else { + result += right; + } + } + result += this.string[this.position]; + this.position++; + } + throw new Error(`Cannot find the right half "${right}": ${this.GetPositionDescription()}`); + } + public GetPositionDescription(position: number | undefined = undefined): string { + const s = this.string.split('\n'); + var curp: number = this.offp; + var line: number = this.offl; + if (position !== undefined) { + while (curp + s[line].length + 1 < position - this.offp) { + curp += s[line].length + 1; + line += 1; + } + } + else { + curp += s.slice(0, this.line).reduce((sum, i) => sum + i.length + 1, 0); + line += this.line; + position = this.position; + } + return `
    at "${s[line]}".`;//, at ${line + 1}:${position - curp}`; + } +} +function FindValue(pairs: KeyValuePair[], key: string): KeyValuePair | undefined { + const finded = pairs.find(i => i.Key === key); + if (finded) { + return finded; + } + return undefined; +} +function ReadType(typename: string): (RDEvent | RDGroup) { + var t: EventType = EventType.custom; + var event: RDEvent | RDGroup; + switch (typename[0]) { + case 'e': + event = new RDEvent(); + switch (typename[1]) { + case 's': + t = EventType.sounds; + break; + case 'b': + t = EventType.rows; + break; + case 'a': + t = EventType.actions; + break; + case 'd': + t = EventType.decorations; + break; + case 'r': + t = EventType.rooms; + break; + case 'c': + t = EventType.custom; + break; + default: + t = EventType.custom; + } + event.SubType = t; + break; + case 'g': + event = new RDGroup(); + break; + default: + event = new RDEvent(); + } + return event; +} +function ReadProperties(reader: Reader, event: RDEvent | RDGroup, pairs: KeyValuePair[]) { + + if (event instanceof RDGroup) { + if (value = FindValue(pairs, "hue")) { + try { + event.Style.Hue = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "brightness")) { + try { + event.Style.Brightness = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "grayscale")) { + try { + event.Style.Grayscale = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "opacity")) { + try { + event.Style.Opacity = parseFloat(value.Value); + } + catch (e) { + throw new Error(`Expecting a number, but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "offset")) { + reader = new Reader(value.Value); + event.ClickStyle ??= new RDStyle(); + try { event.ClickStyle.Beat = reader.ReadFloat(); } catch (e) { } + try { event.ClickStyle.Y = reader.ReadInt(); } catch (e) { } + try { event.ClickOutline = reader.ReadColor(); } catch (e) { } + } + if (value = FindValue(pairs, "offset_hue")) { + event.ClickStyle ??= new RDStyle(); + event.ClickStyle.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_brightness")) { + event.ClickStyle ??= new RDStyle(); + event.ClickStyle.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_grayscale")) { + event.ClickStyle ??= new RDStyle(); + event.ClickStyle.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_opacity")) { + event.ClickStyle ??= new RDStyle(); + event.ClickStyle.Opacity = parseFloat(value.Value); + } + } + else if (event instanceof RDEvent) { + var value: KeyValuePair | undefined; + if (value = FindValue(pairs, "if")) { + if (["true", "false", "both"].find(i => i === value?.Value)) { + event.Condition = value.Value === "true" ? EventCondition.true : + value.Value === "false" ? EventCondition.false : EventCondition.both; + } + else { + throw new Error(`Expecting "true", "false" or "both", but find "${value.Value}".`); + } + } + if (value = FindValue(pairs, "tag")) { + event.Tag = value.Value === "true" ? true : false; + } + if (value = FindValue(pairs, "hue")) { + event.Style.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "brightness")) { + event.Style.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "grayscale")) { + event.Style.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "opacity")) { + event.Style.Opacity = parseFloat(value.Value); + } + event.ClickStyle ??= new RDStyle(); + if (value = FindValue(pairs, "offset")) { + reader = new Reader(value.Value); + try { event.ClickStyle.Beat = reader.ReadFloat(); } catch (e) { } + try { event.ClickStyle.Y = reader.ReadInt(); } catch (e) { } + } + if (value = FindValue(pairs, "offset_hue")) { + event.ClickStyle.Hue = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_brightness")) { + event.ClickStyle.Brightness = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_grayscale")) { + event.ClickStyle.Grayscale = parseFloat(value.Value); + } + if (value = FindValue(pairs, "offset_opacity")) { + event.ClickStyle.Opacity = parseFloat(value.Value); + } + if (event.BeatType !== undefined) { + event.BeatStyle = new RDBeatStyle(); + if (value = FindValue(pairs, "tick")) { + event.BeatStyle.Tick = parseFloat(value.Value); + } + switch (event.BeatType) { + case BeatsSpecial.AddClassicBeat: + if (value = FindValue(pairs, "swing")) { + event.BeatStyle.Swing = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.AddFreeTimeBeat: + if (value = FindValue(pairs, "pulse")) { + event.BeatStyle.Pulse = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.PulseFreeTimeBeat: + if (value = FindValue(pairs, "pulse")) { + event.BeatStyle.Pulse = parseFloat(value.Value); + } + if (value = FindValue(pairs, "hold")) { + event.BeatStyle.Hold = parseFloat(value.Value); + } + break; + case BeatsSpecial.SetRowXs: + if ((value = FindValue(pairs, "rowxs"))) { + if (value.Value.match(/^[-x]{6}$/)) { + event.BeatStyle.RowXs = value.Value; + } + else { + throw new Error(`Expect a string of length 6, consisting of "x" and "-", instead of "${value?.Value}".`); + } + } + break; + case BeatsSpecial.AddOneshotBeat: + if (value = FindValue(pairs, "type")) { + const types: string[] = value.Value.split(/\s+/); + var illegal: string[] | undefined; + if ((illegal = types.filter(i => { + ![ + "freezeshot", + "burnshot", + "skipshot", + "subdivision" + ].includes(i); + })).length) { + throw new Error(`Expecting "freezeshot", "burnshot", "skipshot" or "subdivision", but find ${illegal.map(i => `"${i}"`).join(', ')}.`); + } + else { + types.map(i => { + switch (i) { + case "freezeshot": + event.BeatStyle?.OneshotBeatSubType.push(RDOneshotBeatSubType.Freezeshot); + break; + case "burnshot": + event.BeatStyle?.OneshotBeatSubType.push(RDOneshotBeatSubType.Burnshot); + break; + case "skipshot": + event.BeatStyle?.OneshotBeatSubType.push(RDOneshotBeatSubType.Skipshot); + break; + case "subdivision": + event.BeatStyle?.OneshotBeatSubType.push(RDOneshotBeatSubType.Subdivision); + break; + } + }); + } + } + if (value = FindValue(pairs, "interval")){ + event.BeatStyle.Interval = parseFloat(value.Value); + } + if ((value = FindValue(pairs, "delay")) + && event.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Freezeshot)) { + event.BeatStyle.Delay = parseFloat(value.Value); + } + if ((value = FindValue(pairs, "subdivision")) + && event.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Subdivision)) { + event.BeatStyle.Subdivision = parseFloat(value.Value); + } + if (value = FindValue(pairs, "loop")) { + event.BeatStyle.Loop = parseInt(value.Value); + } + break; + default: + break; + } + } + } +} +function ConstructObjs(window: RDViewWindow) { + var html: string = `
    ` + +`
    `; + for (var obj of window.Objects) { + html += ConstructDivObject(obj); + } + html += `
    `; + return html; +} +function ConstructDivObject(obj: RDEvent | RDGroup): string { + if (obj instanceof RDEvent) { + return `
    ${ConstructSubDiv( + [obj.Condition !== undefined, `condition-${obj.Condition}`, () => ''], + [obj.Tag === true, `tag`, () => ''], + [obj.BeatType === BeatsSpecial.AddClassicBeat, `classicbeat`, () => { + var result: string = ''; + for (var i = 0; i < 6; i++) { + result += `
    `; + } + return result; + }], + [obj.BeatType === BeatsSpecial.AddFreeTimeBeat, `add freetime`, () => {return '';}], + [obj.BeatType === BeatsSpecial.PulseFreeTimeBeat, `pulse freetime`, () => ''], + [obj.BeatStyle?.Loop !== undefined && obj.BeatStyle.Loop > 0, `loop`, () => { + var result: string = ''; + for (var i = 0; i < (obj.BeatStyle?.Loop ?? 0); i++) { + result += `
    `; + } + return result; + }], + [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Freezeshot), `freezeshots`, () => { + var result: string = ''; + for (var i = 0; i < (obj.BeatStyle?.Loop ?? 0) + 1; i++) { + result += `
    `; + } + return result; + }], + [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Burnshot), `burnshots`, () => { + var result: string = ''; + for (var i = 0; i < (obj.BeatStyle?.Loop ?? 0) + 1; i++) { + result += `
    `; + } + return result; + }], + [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Subdivision), `subdivisions`, () => { + var result: string = ''; + for(var l = 0; l < (obj.BeatStyle?.Loop ?? 0) + 1; l++){ + result += `
    `; + for (var i = 0; i < (obj.BeatStyle?.Subdivision ?? 1); i++) { + result += `
    `; + } + result += `
    `; + } + return result; + }], + [obj.BeatType === BeatsSpecial.SetRowXs, `row-xs`, () => { + var result: string = ''; + for (var i = 0; i < 6; i++) { + result += (obj.BeatStyle?.RowXs[i] === 'x') ? `
    ` : `
    `; + } + return result; + }], + [(obj.BeatType === BeatsSpecial.AddClassicBeat || obj.BeatType === BeatsSpecial.AddFreeTimeBeat || obj.BeatType === BeatsSpecial.PulseFreeTimeBeat) && (obj.BeatStyle?.Hold ?? 0) > 0, `holdbeat`, () => ''], + [obj.BeatType === BeatsSpecial.AddOneshotBeat && obj.BeatStyle !== undefined && obj.BeatStyle.OneshotBeatSubType.includes(RDOneshotBeatSubType.Skipshot), `skipshot`, () => ''], + )}
    `; + } + else if (obj instanceof RDGroup) { + return `
    ${obj.Children.map(i => ConstructDivObject(i)).join('')}
    `; + } + else { return ''; } +} +function ConstructCssPropertiesIfExists(pairs: Map): string { + var result: string = ''; + for (const [key, value] of pairs) { + result += value !== undefined ? `--${key}:${value};` : ``; + } + return result; +} +function ConstructCssProperties(pairs: Map): string { + var result: string = ''; + for (const [key, value] of pairs) { + result += `--${key}:${value};`; + } + return result; +} +function ConstructSubDiv(...pairs: [shouldDo: boolean, name: string, func: () => string][]) { + var result: string = ''; + for (const [key, name, func] of pairs) { + result += key ? `
    ${func()}
    ` : ``; + } + return result; +} +function ToHex(color: Color) { + const hex = + parseInt(color.red.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.green.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.blue.toFixed(0)).toString(16).padStart(2, '0') + + parseInt(color.alpha.toFixed(0)).toString(16).padStart(2, '0'); + return '#' + hex; +} + +(window as any).loadRDView = loadRDView; \ No newline at end of file diff --git a/script/search.min.js b/script/search.min.js new file mode 100644 index 0000000..9719f65 --- /dev/null +++ b/script/search.min.js @@ -0,0 +1 @@ +!function(){function u(e){return e.replace(//,"").replace(/{docsify-ignore}/,"").replace(//,"").replace(/{docsify-ignore-all}/,"").trim()}var f={},m={EXPIRE_KEY:"docsify.search.expires",INDEX_KEY:"docsify.search.index"};function g(e){var n={"&":"&","<":"<",">":">",'"':""","'":"'"};return String(e).replace(/[&<>"']/g,function(e){return n[e]})}function y(e){return e.text||"table"!==e.type||(e.cells.unshift(e.header),e.text=e.cells.map(function(e){return e.join(" | ")}).join(" |\n ")),e.text}function v(e){return e.text||"list"!==e.type||(e.text=e.raw),e.text}function b(o,e,s,c){void 0===e&&(e="");var d,e=window.marked.lexer(e),l=window.Docsify.slugify,p={},h="";return e.forEach(function(e,n){var t,a,i,r;"heading"===e.type&&e.depth<=c?(t=(a=(i=e.text,r={},{str:i=(i=void 0===i?"":i)&&i.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,function(e,n,t){return-1===n.indexOf(":")?(r[n]=t&&t.replace(/"/g,"")||!0,""):e}).trim(),config:r})).str,i=a.config,a=u(e.text),d=i.id?s.toURL(o,{id:l(i.id)}):s.toURL(o,{id:l(g(a))}),t&&(h=u(t)),p[d]={slug:d,title:h,body:""}):(0===n&&(d=s.toURL(o),p[d]={slug:d,title:"/"!==o?o.slice(1):"Home Page",body:e.text||""}),d&&(p[d]?p[d].body?(e.text=y(e),e.text=v(e),p[d].body+="\n"+(e.text||"")):(e.text=y(e),e.text=v(e),p[d].body=e.text||""):p[d]={slug:d,title:"",body:""}))}),l.clear(),p}function p(e){return e&&e.normalize?e.normalize("NFD").replace(/[\u0300-\u036f]/g,""):e}function o(e){var n=[],t=[];Object.keys(f).forEach(function(n){t=t.concat(Object.keys(f[n]).map(function(e){return f[n][e]}))});var a=(e=e.trim()).split(/[\s\-,\\/]+/);1!==a.length&&(a=[].concat(e,a));for(var i=0;il.length&&(t=l.length),a=c&&"..."+c.substring(n,t).replace(a,function(e){return''+e+""})+"...",o+=a)}),0\n
    \n

    '+e.title+"

    \n

    "+e.content+"

    \n
    \n"}),t.classList.add("show"),a.classList.add("show"),t.innerHTML=r||'

    '+c+"

    ",s.hideOtherSidebarContent&&(i&&i.classList.add("hide"),n&&n.classList.add("hide"))}function l(e){s=e}function h(e,n){var t,a,i=n.router.parse().query.s;l(e),Docsify.dom.style("\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}"),function(e){void 0===e&&(e="");var n=Docsify.dom.create("div",'
    \n \n
    \n \n \n \n \n \n
    \n
    \n
    \n '),e=Docsify.dom.find("aside");Docsify.dom.toggleClass(n,"search"),Docsify.dom.before(e,n)}(i),n=Docsify.dom.find("div.search"),a=Docsify.dom.find(n,"input"),e=Docsify.dom.find(n,".input-wrap"),Docsify.dom.on(n,"click",function(e){return-1===["A","H2","P","EM"].indexOf(e.target.tagName)&&e.stopPropagation()}),Docsify.dom.on(a,"input",function(n){clearTimeout(t),t=setTimeout(function(e){return d(n.target.value.trim())},100)}),Docsify.dom.on(e,"click",function(e){"INPUT"!==e.target.tagName&&(a.value="",d())}),i&&setTimeout(function(e){return d(i)},500)}function x(e,n){var t,a,i,r,o;l(e),t=e.placeholder,a=n.route.path,(r=Docsify.dom.getNode('.search input[type="search"]'))&&("string"==typeof t?r.placeholder=t:(i=Object.keys(t).filter(function(e){return-1span.x"); + let pery = theme_positions.querySelector(".per>span.y"); + let pxx = theme_positions.querySelector(".px>span.x"); + let pxy = theme_positions.querySelector(".px>span.y"); + let infobox = theme_positions.querySelector(".infobox"); + let selectbox = theme_positions.querySelector(".selectbox"); + let other = theme_positions.querySelector(".other"); + perx.innerText = "100%"; + pery.innerText = "100%"; + pxx.innerText = "352px"; + pxy.innerText = "198px"; + infobox.style.right = "calc(10px)"; + infobox.style.top = "calc(10px)"; + selectbox.style.left = "50%"; + selectbox.style.bottom = "50%"; + selectbox.style.width = "0"; + selectbox.style.height = "0"; + other.innerText = ""; + theme_positions.addEventListener("mouseenter", function (event) { + }); + theme_positions.addEventListener("mousemove", function (event) { + let x = event.clientX - theme_positions.getBoundingClientRect().left; + let y = event.clientY - theme_positions.getBoundingClientRect().top; + let width = theme_positions.offsetWidth; + let height = theme_positions.offsetHeight; + + let x_percent = parseFloat(((x / width) * 100).toFixed(2)); + let y_percent = parseFloat(((y / height) * 100).toFixed(2)); + + x = parseFloat((x_percent * 3.52).toFixed(0)); + y = parseFloat((y_percent * 1.98).toFixed(0)); + + rowx = null; + columny = null; + for (let key in positions) { + if (positions[key].x !== null && Math.abs(x - positions[key].x) < 5) + rowx = positions[key].x; + if (positions[key].y !== null && Math.abs(y - positions[key].y) < 5) + columny = positions[key].y; + } + + if (rowx) { + perx.innerText = (rowx / 3.52).toFixed(2) + "%" + perx.classList.add("c") + pxx.innerText = rowx + "px" + pxx.classList.add("c") + } + else { + perx.innerText = x_percent.toFixed(2) + "%" + perx.classList.remove("c") + pxx.innerText = x + "px" + pxx.classList.remove("c") + } + if (columny) { + pery.innerText = (100 - columny / 1.98).toFixed(2) + "%" + pery.classList.add("c") + pxy.innerText = 198 - columny + "px" + pxy.classList.add("c") + } + else { + pery.innerText = (100 - y_percent).toFixed(2) + "%" + pery.classList.remove("c") + pxy.innerText = 198 - y + "px" + pxy.classList.remove("c") + } + infobox.style.right = "calc(" + (100 - x_percent) + "% + 10px)"; + infobox.style.top = "calc(" + (y_percent) + "% + 10px)"; + selectbox.style.left = rowx ? (rowx / 3.52 - 3.41) + "%" : columny ? "0" : "calc(" + x_percent + "% - 3px"; + selectbox.style.bottom = columny ? (100 - columny / 1.98 - 5.305) + "%" : rowx ? "0" : "calc(" + (100 - y_percent) + "% - 3px)"; + selectbox.style.width = rowx ? "6.82%" : columny ? "100%" : "6px"; + selectbox.style.height = columny ? "10.61%" : rowx ? "100%" : "6px"; + let rowname = rowx ? positions[Object.keys(positions).find(key => positions[key].x === rowx)].name : ""; + let columnname = columny ? positions[Object.keys(positions).find(key => positions[key].y === columny)].name : ""; + theme_positions.querySelector(".other").innerText = rowname && columnname ? columnname + "上的" + rowname : rowname ? rowname : columnname ? columnname : ""; + }); + theme_positions.addEventListener("mouseleave", function (event) { + perx.innerText = "100%"; + pery.innerText = "100%"; + pxx.innerText = "352px"; + pxy.innerText = "198px"; + infobox.style.right = "calc(10px)"; + infobox.style.top = "calc(10px)"; + selectbox.style.left = "50%"; + selectbox.style.bottom = "50%"; + selectbox.style.width = "0"; + selectbox.style.height = "0"; + perx.classList.remove("c") + pery.classList.remove("c") + pxx.classList.remove("c") + pxy.classList.remove("c") + other.innerText = ""; + }); + +} + +function rdview() { + let rdview = document.getElementsByClassName("rdview")[0]; + if (!rdview) return; + let rdcanvas = rdview.querySelector(".canvas"); + let textarea = rdview.querySelector("textarea.area"); + let number = rdview.querySelector(".number"); + const textareaStyles = window.getComputedStyle(textarea); + [ + 'fontFamily', 'fontSize', 'fontWeight', + 'letterSpacing', 'lineHeight', 'padding', + ].forEach(property => { + number.style[property] = textareaStyles[property]; + }); + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + const font = `${textareaStyles.fontSize} ${textareaStyles.fontFamily}`; + context.font = font; + function calcStringLines(sentence, width) { + if (!width) return 0; + const words = sentence.split(''); + let lineCount = 0; + + let currentLine = ''; + for (let i = 0; i < words.length; i++) { + const wordWidth = context.measureText(words[i]).width; + const lineWidth = context.measureText(currentLine).width; + if (lineWidth + wordWidth > width) { + lineCount++; + currentLine = words[i]; + } else { + currentLine += words[i]; + } + } + if (currentLine.trim() !== '') lineCount++; + return lineCount; + } + function calcLines() { + const lines = textarea.value.split('\n'); + const textareaWidth = textarea.getBoundingClientRect().width; + const textareaScrollWidth = textareaWidth - textarea.clientWidth; + const parseNumber = (v) => v.endsWith('px') ? parseInt(v.slice(0, -2), 10) : 0; + const textareaPaddingLeft = parseNumber(textareaStyles.paddingLeft); + const textareaPaddingRight = parseNumber(textareaStyles.paddingRight); + const textareaContentWidth = textareaWidth - textareaPaddingLeft - textareaPaddingRight - textareaScrollWidth; + const numLines = lines.map(lineString => calcStringLines(lineString, textareaContentWidth)); + let lineNumbers = []; + let i = 1; + while (numLines.length > 0) { + const numLinesOfSentence = numLines.shift(); + lineNumbers.push(i); + if (numLinesOfSentence > 1) { + Array(numLinesOfSentence - 1) + .fill('') + .forEach((_) => lineNumbers.push('')); + } + i++; + } + return lineNumbers; + } + function initLineNumbers() { + const lines = calcLines(); + const lineDoms = Array.from({ + length: lines.length, + }, (_, i) => `
    ${lines[i] || ' '}
    `); + number.innerHTML = lineDoms.join(''); + } + function initCanvas() { + const lang = textarea.value.split('\n')[0] + const code = textarea.value.split('\n').slice(1).join('\n') + rdcanvas.innerHTML = RDViewRender(lang, code) + } + initCanvas() + initLineNumbers() + textarea.addEventListener('input', initLineNumbers); + textarea.addEventListener('input', initCanvas); +} + +window.$docsify.plugins = [].concat(window.$docsify.plugins, function (hook) { + hook.doneEach(function () { + themePosition(); + rdview(); + document.documentElement.scrollTop = document.body.scrollTop = 0; + }); +}); diff --git a/script/svg1.svg b/script/svg1.svg new file mode 100644 index 0000000..b018c33 --- /dev/null +++ b/script/svg1.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/script/switchLightDarkMode.js b/script/switchLightDarkMode.js new file mode 100644 index 0000000..3eda813 --- /dev/null +++ b/script/switchLightDarkMode.js @@ -0,0 +1,190 @@ +/* + * @Author: pikapikapikaori pikapikapi_kaori@icloud.com + * @Date: 2023-04-30 12:57:52 + * @LastEditors: pikapikapikaori pikapikapi_kaori@icloud.com + * @LastEditTime: 2023-05-05 22:29:02 + * @FilePath: /pikapikapi-blog/docs/utils/countWords.js + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// default values +var switchLightDarkModeOptions = { + useSwitchMode: true, + top: 130, + right: 26, + svgColor: '#7d7b75', +} + +window.$docsify.currentThemeModeIndex = 2; + +// Docsify plugin functions +function plugin(hook, vm) { + + if (!switchLightDarkModeOptions.useSwitchMode) { + return + } + + let themeModes = ['light', 'dark', 'auto',] + + let currentThemeModeIndex = 2 + + hook.mounted(function () { + // let lightTheme = Docsify.dom.findAll('[href="/style/light.css"]')[0] + // let darkTheme = Docsify.dom.findAll('[href="/style/dark.css"]')[0] + + var switchSpan = document.createElement('span') + + switchSpan.id = 'switchLightDarkModeDivBeforeArticle' + switchSpan.style.position = 'fixed' + switchSpan.style.right = switchLightDarkModeOptions.right.toString() + 'px' + switchSpan.style.top = switchLightDarkModeOptions.top.toString() + 'px' + + const lightModeIconXml = '' + const darkModeIconXml = '' + const autoModeIconXml = '' + const zoomInIconXml = '' + const zoomOutIconXml = '' + const zoomDefaultIconXml = '' + const ottoIconXml = ` + + + + + + + + + + + + + + + +` + let setThemeMode = function (currentTheme) { + switch (currentTheme) { + case 'light': + // lightTheme.disabled = false + // darkTheme.disabled = true + document.body.classList.remove('dark') + document.body.classList.add('light') + switchSpan.innerHTML = lightModeIconXml + break + case 'dark': + // lightTheme.disabled = true + // darkTheme.disabled = false + document.body.classList.remove('light') + document.body.classList.add('dark') + switchSpan.innerHTML = darkModeIconXml + break + case 'auto': + var isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches + // lightTheme.disabled = isDarkMode + // darkTheme.disabled = !isDarkMode + if (isDarkMode) { + document.body.classList.remove('light') + document.body.classList.add('dark') + } + else { + document.body.classList.remove('dark') + document.body.classList.add('light') + } + switchSpan.innerHTML = autoModeIconXml + break + } + } + + setThemeMode(themeModes[currentThemeModeIndex]) + let preferredThemeChangeEventListenerFunction = function () { + if (currentThemeModeIndex === 2) { + setThemeMode(themeModes[currentThemeModeIndex]) + } + } + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', preferredThemeChangeEventListenerFunction) + + switchSpan.onclick = function (e) { + if (currentThemeModeIndex === 2) { + currentThemeModeIndex = 0 + } + else { + currentThemeModeIndex ++ + } + window.$docsify.currentThemeModeIndex = currentThemeModeIndex + window.$docsify.onLightDarkModeChange(); + setThemeMode(themeModes[currentThemeModeIndex]) + } + + document.body.appendChild(switchSpan) + + var zoomInSpan = document.createElement('span') + zoomInSpan.id = 'zoomInSpan' + zoomInSpan.style.position = 'fixed' + zoomInSpan.style.right = switchLightDarkModeOptions.right.toString() + 'px' + zoomInSpan.style.top = (switchLightDarkModeOptions.top + 35).toString() + 'px' + zoomInSpan.innerHTML = zoomInIconXml + + var zoomOutSpan = document.createElement('span') + zoomOutSpan.id = 'zoomOutSpan' + zoomOutSpan.style.position = 'fixed' + zoomOutSpan.style.right = switchLightDarkModeOptions.right.toString() + 'px' + zoomOutSpan.style.top = (switchLightDarkModeOptions.top + 70).toString() + 'px' + zoomOutSpan.innerHTML = zoomOutIconXml + + var zoomDefaultSpan = document.createElement('span') + zoomDefaultSpan.id = 'zoomDefaultSpan' + zoomDefaultSpan.style.position = 'fixed' + zoomDefaultSpan.style.right = switchLightDarkModeOptions.right.toString() + 'px' + zoomDefaultSpan.style.top = (switchLightDarkModeOptions.top + 105).toString() + 'px' + zoomDefaultSpan.innerHTML = zoomDefaultIconXml + + var ottoSpan = document.createElement('span') + ottoSpan.id = 'ottoSpan' + ottoSpan.style.position = 'fixed' + ottoSpan.style.right = switchLightDarkModeOptions.right.toString() + 'px' + ottoSpan.style.top = (switchLightDarkModeOptions.top + 140).toString() + 'px' + ottoSpan.innerHTML = ottoIconXml + + let defaultSize = 1.0 + let currentSize = defaultSize + + function set(targetSize) { + document.body.style.zoom = targetSize + document.body.style.cssText += '; -moz-transform: scale(' + targetSize + ');-moz-transform-origin: 0 0; ' + } + + function showOtto(show) { + window.$docsify.onOttoShow(show) + } + + zoomInSpan.onclick = function () { + currentSize = currentSize + 0.1 + set(currentSize) + } + + zoomOutSpan.onclick = function () { + currentSize = currentSize - 0.1 + set(currentSize) + } + + zoomDefaultSpan.onclick = function () { + currentSize = defaultSize + set(currentSize) + } + + ottoSpan.onclick = function () { + showOtto() + } + + document.body.appendChild(zoomInSpan) + document.body.appendChild(zoomOutSpan) + document.body.appendChild(zoomDefaultSpan) + document.body.appendChild(ottoSpan) + }) +} + +// Docsify plugin options +window.$docsify['switchLightDarkMode'] = Object.assign( + switchLightDarkModeOptions, + window.$docsify['switchLightDarkMode'] +) +window.$docsify.plugins = [].concat(plugin, window.$docsify.plugins) \ No newline at end of file diff --git a/script/tsconfig.json b/script/tsconfig.json new file mode 100644 index 0000000..276fa60 --- /dev/null +++ b/script/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es2015", + "lib": [ + "es2017", + "dom" + ], + "module": "es6", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "files": [ + "rdview.ts" + ], +} \ No newline at end of file diff --git a/script/tsconfig.tsbuildinfo b/script/tsconfig.tsbuildinfo new file mode 100644 index 0000000..d091f01 --- /dev/null +++ b/script/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./rdview.ts","./rdviewtag.ts","./rdviewreader.ts","./rdviewconstructor.ts"],"version":"5.7.2"} \ No newline at end of file diff --git a/script/typescript.compile.min.js b/script/typescript.compile.min.js new file mode 100644 index 0000000..d008ba4 --- /dev/null +++ b/script/typescript.compile.min.js @@ -0,0 +1,16 @@ +/* ***************************************************************************** +Copyright (c) niu tech. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +(function(){if(!window.console){window.console={log:function(){}}}hashCode=function(c){var d=0,b,a;if(c.length==0){return d}for(a=0;a35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1c 2c;(1b(e){1b t(e,t){1d(e&t)!=0}1b h(e){1d e}1b g(e,t){1c n="";1w(1c r=1;r<1<<31;r<<=1)if((t&r)!=0)1w(1c i in e)if(e[i]==r){n.1n>0&&(n+="|"),n+=i;1B}1d n}e.1s=t,1b(e){e.1r=[],e.1q=0,e.2Y=1,e.2R=2,e.2S=4,e.3U=8,e.6R=16,e.3H=32,e.3T=64,e.4H=8Z,e.5j=dJ,e.gz=bY,e.gB=dN,e.4N=eH,e.cZ=kJ,e.hB=lc,e.3y=lh,e.7B=lI,e.Bc=m3,e.aB=1<<17,e.mn=1<<18,e.mE=1<<19,e.6l=1<<20,e.fW=1<<21,e.7L=1<<22,e.aL=1<<23,e.3j=1<<24,e.gH=1<<25,e.aP=1<<26,e.dg=1<<27,e.dk=1<<28,e.5I=1<<29,e.8d=1<<30,e.a1=e.2R|e.gB|e.4N|e.cZ|e.hB|e.3y|e.7B|e.3j|e.gH|e.dg|e.dk|e.aP,e.8H=e.a1|e.2R|e.fW|e.7L|e.aL|e.8d,e.uK=e.4H|e.3y|e.7B}(e.1v||(e.1v={}));1c n=e.1v;(1b(e){e.1r=[],e.1q=0,e.fb=1,e.dA=2,e.d4=4,e.i0=8,e.l6=16,e.kM=32,e.kL=64,e.tu=dJ,e.tj=bY,e.kK=dN,e.kG=eH,e.5M=e.fb|e.dA|e.kM|e.kL,e.kA=e.fb|e.dA|e.d4|e.i0|e.l6|e.kK,e.p8=e.fb|e.dA,e.so=e.kM|e.dA|e.d4|e.i0|e.l6|e.kL|e.fb|e.kK,e.sk=e.kM|e.dA|e.fb|e.kL|e.kG,e.A7=e.tu|e.tj,e.sg=e.kA|e.kG})(e.4O||(e.4O={}));1c r=e.4O;(1b(e){e.1r=[],e.1q=0,e.3h=1,e.4u=2,e.7x=4,e.2s=8,e.2x=16,e.6d=32,e.7v=64,e.3x=8Z})(e.1V||(e.1V={}));1c i=e.1V;(1b(e){e.1r=[],e.1q=0,e.rw=1,e.ku=2,e.ew=4,e.2k=8,e.zg=16,e.eB=32,e.kn=64,e.wf=8Z,e.ke=dJ,e.pG=bY,e.c9=dN})(e.2M||(e.2M={}));1c s=e.2M;(1b(e){e.1r=[],e.1q=0,e.2x=1,e.3h=2,e.4u=4,e.2s=8,e.3x=16,e.bn=32,e.6C=64,e.8D=8Z})(e.8c||(e.8c={}));1c o=e.8c;(1b(e){e.1r=[],e.1q=0,e.2x=1,e.3h=2,e.4u=4,e.2s=8,e.3x=16,e.bn=32,e.6C=64,e.8D=8Z,e.6F=dJ,e.eQ=bY,e.k6=dN,e.9q=eH})(e.3r||(e.3r={}));1c u=e.3r;(1b(e){e.1r=[],e.1q=0,e.2x=1,e.3h=2,e.4u=4,e.2s=8,e.3x=16,e.bn=32,e.6C=64,e.8D=8Z,e.3k=dJ,e.7x=bY,e.9r=dN,e.C7=eH,e.EB=kJ,e.q9=lc,e.qg=lh,e.ed=lI,e.9w=m3,e.fh=1<<17,e.qA=1<<18})(e.2j||(e.2j={}));1c a=e.2j;(1b(e){e.1r=[],e.1q=0,e.2x=1,e.3h=2,e.4u=4,e.2s=8,e.3x=16,e.bn=32,e.6C=64,e.8D=8Z,e.ju=dJ,e.3k=bY,e.7x=dN,e.4K=eH,e.Ad=kJ,e.xP=lc,e.qG=lh,e.df=lI,e.ed=m3})(e.1U||(e.1U={}));1c f=e.1U;(1b(e){e.1r=[],e.1q=0,e.2x=1,e.3h=2,e.4u=4,e.2s=8,e.3x=16,e.bn=32,e.6C=64,e.8D=8Z,e.aJ=dJ,e.7F=bY,e.fS=dN,e.ja=eH,e.qW=kJ,e.j4=lc,e.iZ=lh,e.8v=lI,e.j5=m3,e.aH=1<<17,e.6U=1<<18,e.fV=1<<19})(e.1O||(e.1O={}));1c l=e.1O;(1b(e){e.1r=[],e.1q=0,e.qX=1,e.j9=2,e.jc=4})(e.8C||(e.8C={}));1c c=e.8C;e.6A=h,1b(e){e.1r=[],e.1q=0,e.qO=1,e.iZ=2,e.E0=4,e.6F=8,e.il=16,e.jg=32,e.jh=64,e.i4=8Z}(e.4w||(e.4w={}));1c p=e.4w;(1b(e){e.1r=[],e.xI=0,e.Eo=1,e.t5=2,e.jv=4,e.uT=3,e.xK=16,e.y4=32,e.rP=64})(e.8V||(e.8V={}));1c d=e.8V;(1b(e){e.1r=[],e.qo=0,e.5S=1})(e.8a||(e.8a={}));1c v=e.8a;(1b(e){e.1r=[],e.q7=0,e.f7=1,e.q0=2})(e.9m||(e.9m={}));1c m=e.9m;e.7K=v.qo,e.9l=m.q7,e.kC=!0,e.AY=g})(2c||(2c={}));1c 2c;(1b(e){(1b(e){e.1r=[],e.1r[0]="1q",e.1q=0,e.1r[1]="7s",e.7s=1,e.1r[2]="e4",e.e4=2,e.1r[3]="ef",e.ef=3,e.1r[4]="fd",e.fd=4,e.1r[5]="e7",e.e7=5,e.1r[6]="9k",e.9k=6,e.1r[7]="6a",e.6a=7,e.1r[8]="av",e.av=8,e.1r[9]="9Q",e.9Q=9,e.1r[10]="8X",e.8X=10,e.1r[11]="7c",e.7c=11,e.1r[12]="9V",e.9V=12,e.1r[13]="2Y",e.2Y=13,e.1r[14]="co",e.co=14,e.1r[15]="ci",e.ci=15,e.1r[16]="eE",e.eE=16,e.1r[17]="oj",e.oj=17,e.1r[18]="aB",e.aB=18,e.1r[19]="4H",e.4H=19,e.1r[20]="li",e.li=20,e.1r[21]="hn",e.hn=21,e.1r[22]="hf",e.hf=22,e.1r[23]="eU",e.eU=23,e.1r[24]="7w",e.7w=24,e.1r[25]="3L",e.3L=25,e.1r[26]="aj",e.aj=26,e.1r[27]="7y",e.7y=27,e.1r[28]="5U",e.5U=28,e.1r[29]="bj",e.bj=29,e.1r[30]="2S",e.2S=30,e.1r[31]="ap",e.ap=31,e.1r[32]="bf",e.bf=32,e.1r[33]="bc",e.bc=33,e.1r[34]="ba",e.ba=34,e.1r[35]="b7",e.b7=35,e.1r[36]="9N",e.9N=36,e.1r[37]="b3",e.b3=37,e.1r[38]="ab",e.ab=38,e.1r[39]="b1",e.b1=39,e.1r[40]="b0",e.b0=40,e.1r[41]="9S",e.9S=41,e.1r[42]="6x",e.6x=42,e.1r[43]="aX",e.aX=43,e.1r[44]="aU",e.aU=44,e.1r[45]="a3",e.a3=45,e.1r[46]="8T",e.8T=46,e.1r[47]="a9",e.a9=47,e.1r[48]="Eq",e.Eq=48,e.1r[49]="h8",e.h8=49,e.1r[50]="aQ",e.aQ=50,e.1r[51]="aN",e.aN=51,e.1r[52]="gr",e.gr=52,e.1r[53]="gm",e.gm=53,e.1r[54]="ge",e.ge=54,e.1r[55]="iy",e.iy=55,e.1r[56]="7z",e.7z=56,e.1r[57]="ao",e.ao=57,e.1r[58]="aq",e.aq=58,e.1r[59]="aC",e.aC=59,e.1r[60]="hO",e.hO=60,e.1r[61]="az",e.az=61,e.1r[62]="b4",e.b4=62,e.1r[63]="aG",e.aG=63,e.1r[64]="da",e.da=64,e.1r[65]="fK",e.fK=65,e.1r[66]="fu",e.fu=66,e.1r[67]="fq",e.fq=67,e.1r[68]="fo",e.fo=68,e.1r[69]="fn",e.fn=69,e.1r[70]="ff",e.ff=70,e.1r[71]="2t",e.2t=71,e.1r[72]="9i",e.9i=72,e.1r[73]="3m",e.3m=73,e.1r[74]="9e",e.9e=74,e.1r[75]="eS",e.eS=75,e.1r[76]="cX",e.cX=76,e.1r[77]="ey",e.ey=77,e.1r[78]="cs",e.cs=78,e.1r[79]="gq",e.gq=79,e.1r[80]="iO",e.iO=80,e.1r[81]="cB",e.cB=81,e.1r[82]="aL",e.aL=82,e.1r[83]="im",e.im=83,e.1r[84]="5M",e.5M=84,e.1r[85]="hX",e.hX=85,e.1r[86]="bB",e.bB=86,e.1r[87]="e3",e.e3=87,e.1r[88]="en",e.en=88,e.1r[89]="ct",e.ct=89,e.1r[90]="ak",e.ak=90,e.1r[91]="6l",e.6l=91,e.1r[92]="4o",e.4o=92,e.1r[93]="6Y",e.6Y=93,e.1r[94]="4K",e.4K=94,e.1r[95]="5h",e.5h=95,e.1r[96]="4h",e.4h=96,e.1r[97]="ec",e.ec=97,e.1r[98]="9K",e.9K=98,e.1r[99]="eY",e.eY=99,e.1r[gl]="f6",e.f6=gl,e.1r[jT]="q8",e.q8=jT,e.1r[ih]="qe",e.qe=ih,e.1r[jB]="8S",e.8S=jB,e.1r[jy]="2k",e.2k=jy,e.1r[jr]="7W",e.7W=jr,e.1r[jl]="iL",e.iL=jl,e.xq=e.2t,e.qN=e.9S})(e.1f||(e.1f={}));1c t=e.1f})(2c||(2c={}));1c 2c;(1b(e){1b i(e){1c t=Dz;1d e=e^61^e>>>16,e+=e<<3,e^=e>>>4,e*=t,e^=e>>>15,e}1b s(e,t){1d t^(e>>5)+e}1c t=1b(){1b e(){1a.1e=2i,1a.5v=2i,1a.DG=2i,1a.DJ=2i,1a.qP=2i,1a.DQ=2i,1a.DU=2i,1a.6J=2i}1d e}();e.Ee=t;1c n=1b(){1b e(){1a.bM=0,1a.5b=1h t}1d e.1e.8e=1b(){1c e=[];1w(1c t in 1a.5b)1a.5b[t]!=2i&&(e[e.1n]=t);1d e},e.1e.4L=1b(e,t){1d 1a.5b[e]!=2i?!1:(1a.5b[e]=t,1a.bM++,!0)},e.1e.j1=1b(e,t){1d 1a.5b[e]!=2i?(1a.5b[e]=t,!1):(1a.5b[e]=t,1a.bM++,!0)},e.1e.5p=1b(e,t){1w(1c n in 1a.5b){1c r=1a.5b[n];r!=2i&&e(n,1a.5b[n],t)}},e.1e.iY=1b(e,t){1w(1c n in 1a.5b){1c r=1a.5b[n];if(r!=2i&&!e(n,1a.5b[n],t))1d!1}1d!0},e.1e.kZ=1b(e,t){1w(1c n in 1a.5b){1c r=1a.5b[n];if(r!=2i&&e(n,1a.5b[n],t))1d!0}1d!1},e.1e.3f=1b(){1d 1a.bM},e.1e.4r=1b(e){1c t=1a.5b[e];1d t!=2i?t:1g},e}();e.2h=n;1c r=1b(){1b e(e,t){1a.9J=e,1a.7m=t,1a.di=!0}1d e.1e.8e=1b(){1d 1a.9J.8e().4E(1a.7m.8e())},e.1e.4L=1b(e,t){1d 1a.di?1a.9J.4L(e,t):1a.7m.4L(e,t)},e.1e.j1=1b(e,t){1d 1a.di?1a.9J.j1(e,t):1a.7m.j1(e,t)},e.1e.5p=1b(e,t){1a.9J.5p(e,t),1a.7m.5p(e,t)},e.1e.iY=1b(e,t){1d 1a.9J.iY(e,t)&&1a.7m.iY(e,t)},e.1e.kZ=1b(e,t){1d 1a.9J.kZ(e,t)||1a.7m.kZ(e,t)},e.1e.3f=1b(){1d 1a.9J.3f()+1a.7m.3f()},e.1e.4r=1b(e){1c t=1a.9J.4r(e);1d t!=2i?t:1a.7m.4r(e)},e}();e.3M=r,e.EK=i,e.EJ=s;1c o=1b(){1b e(e,t){1a.j2=e,1a.r0=t}1d e}();e.EF=o;1c u=1b(){1b e(e,t,n){1a.fR=e,1a.j6=t,1a.jb=n,1a.bM=0,1a.5b=1h 2T;1w(1c r=0;r<1a.fR;r++)1a.5b[r]=1g}1d e.1e.4L=1b(e,t){1c n,r=1h o(e,t),i=1a.j6(e);i%=1a.fR;1w(n=1a.5b[i];n!=1g;n=n.d0)if(1a.jb(e,n.j2))1d!1;1d r.d0=1a.5b[i],1a.5b[i]=r,1a.bM++,!0},e.1e.Ej=1b(e){1c t,n=1a.j6(e);n%=1a.fR;1c r=1g,i=1g;1w(t=1a.5b[n];t!=1g;t=t.d0){if(1a.jb(e,t.j2)){r=t.r0,1a.bM--,i?i.d0=t.d0:1a.5b[n]=t.d0;1B}i=t}1d r},e.1e.3f=1b(){1d 1a.bM},e.1e.4r=1b(e){1c t,n=1a.j6(e);n%=1a.fR;1w(t=1a.5b[n];t!=1g;t=t.d0)if(1a.jb(e,t.j2))1d t.r0;1d 1g},e}();e.Eg=u})(2c||(2c={}));1c 2B=1a.2B||1b(e,t){1b n(){1a.6J=e}n.1e=t.1e,e.1e=1h n},2c;(1b(e){1c t=1b(){1b t(t){1a.1o=t,1a.1i=1g,1a.1M=e.2M.ew,1a.1u=-1,1a.1x=-1,1a.DI=e.6w.hd,1a.5s=1g,1a.5q=1g,1a.7o=!1}1d t.1e.5P=1b(){1d!1},t.1e.cC=1b(){1d!1},t.1e.xj=1b(){1d 1a.5P()&&!1a.cC()},t.1e.1P=1b(t){3S(1a.1o){1t e.1f.2k:1t e.1f.e4:1a.1i=t.1Q;1B;1t e.1f.e7:1d t.wQ(1a);1t e.1f.9Q:1a.1i=t.7t;1B;1t e.1f.fd:1t e.1f.ef:1a.1i=t.5B;1B;1t e.1f.9k:1d t.wr(1a);1t e.1f.8S:1t e.1f.7s:1t e.1f.9V:1a.1i=t.3O;1B;4G:3K 1h 2k("6S 6b in 6Q 3g")}1d 1a},t.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);3S(1a.1o){1t e.1f.e7:t.2U&&e.1s(t.2U.1S,e.1O.8v)?t.1H("k5"):t.1H("1a");1B;1t e.1f.9Q:t.1H("1g");1B;1t e.1f.fd:t.1H("k7");1B;1t e.1f.ef:t.1H("d3");1B;1t e.1f.9k:t.vD();1t e.1f.8S:1B;1t e.1f.2k:1t e.1f.e4:1B;1t e.1f.7s:t.1H("; ");1B;1t e.1f.9V:t.1H("a7 ");1B;4G:3K 1h 2k("6S 6b in 6Q 3g")}t.2C(1a),t.2w(1a,!1)},t.1e.6E=1b(t){t.cd();1c n={2K:-1,3c:-1},r={2K:-1,3c:-1};t.4t!==1g&&(t.4t.ex(n,1a.1u),t.4t.ex(r,1a.1x),t.vx("("+n.2K+","+n.3c+")--"+"("+r.2K+","+r.3c+"): "));1c i=1a.6t();e.1s(1a.1M,e.2M.2k)&&(i+=" (2k)"),t.vq(i)},t.1e.6t=1b(){1d e.br[1a.1o]!==2i?e.br[1a.1o]:e.1f.1r[1a.1o]},t.1e.5C=1b(e){e.6O.2o.4s=!1,e.8M(1a)},t.1e.zQ=1b(e,t){},t.1e.a4=1b(){1d e.1f.1r[1a.1o]},t}();e.5y=t;1c n=1b(t){1b n(n,r){t.1K(1a,e.1f.2k),1a.1u=n,1a.1x=r}1d 2B(n,t),n}(t);e.vc=n;1c r=1b(t){1b n(){t.1K(1a,e.1f.4o),1a.kj=1g,1a.1p=1h 2T}1d 2B(n,t),n.1e.5C=1b(e){1c t=1a.1p.1n;1w(1c n=0;n0||1a.fZ.1n>0)},n}(t);e.2t=b;1c w=1b(){1b e(e,t,n){1a.ae=e,1a.5x=t,1a.3d=n}1d e}();e.wB=w,e.n1=1h w("n2",1g,-1);1c E=1b(t){1b n(n,r){t.1K(1a,1h i("aR"),1g,!1,1g,n,r,1g,e.1f.6Y),1a.2v=1g,1a.vQ=!1,1a.n8=!1,1a.9A=!1,1a.n9=!1,1a.mp=!1,1a.ng=1g,1a.4U=0,1a.4R=0,1a.bG=n,1a.c5=r}1d 2B(n,t),n.1e.1P=1b(e){1d e.vz(1a)},n.1e.a4=1b(){1d"6Y"},n.1e.nh=1b(){if(!1a.n9&&!1a.9A&&1a.3C)1w(1c t=0,n=1a.3C.1p.1n;t0&&(t.2E.3Z(n),t.2E=n)},n.1e.1P=1b(e){1d e.1j.5r.m1||(1a.6g===1g||1a.6g.1p.1n==0)&&e.1j.1L.6D(1a,"A6 bF"),e.1P(1a.6g),1a},n}(k);e.5M=A;1c O=1b(t){1b n(e){t.1K(1a,e),1a.3A=1g,1a.lS=1g,1a.5A=e}1d 2B(n,t),n.1e.nX=1b(){1d 1a.3A},n.1e.lR=1b(t,n){1d n.aZ()?(1a.lS=n,!0):1a.5A===e.1f.ey?(t.1T("3P 4m yC 4e to Ff"),!1):n.1o==e.1f.bB||1a.nX()?(1a.lS=n,!0):(t.1T("1B 4m 5F no o8 8u f3 4e to a lE or 3S 4m"),!1)},n.1e.5C=1b(n){t.1e.5C.1K(1a,n),n.sK(1a.lS,1a.5A==e.1f.ey)},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),1a.5A==e.1f.cX?t.1H("1B"):t.1H("3P"),1a.nX()&&t.1H(" "+1a.3A),t.1H(";"),t.2C(1a),t.2w(1a,!1)},n}(k);e.sC=O;1c M=1b(t){1b n(n){t.1K(1a,e.1f.aL),1a.3V=n,1a.1W=1g}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.aZ=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);t.1H("3q("),t.2D(1a.3V,e.1k.f2,!1),t.1H(")"),t.bd(1a.1W,!1,!1),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.sn(1a)},n.1e.5C=1b(t){1c n=t.2E,r=1h e.4Q,i=1h e.4Q;n.3Z(r),t.2E=r,t.8M(1a.3V);1c s=t.2E,o=1g;1a.1W&&(t.2E=1h e.4Q,s.3Z(t.2E),t.9P(1a,r,i),t.2d(1a.1W,1a),o=t.9O());if(!t.5d){1c u=t.2E;u.3Z(r)}t.2E=i,s.3Z(i),t.5d=!1,t.6O.2o.4s=!1},n}(k);e.sj=M;1c 6B=1b(t){1b n(){t.1K(1a,e.1f.im),1a.1W=1g,1a.dR=1g,1a.3V=1g}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.aZ=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);t.1H("do"),t.bd(1a.1W,!0,!1),t.2A(1a.dR),t.1H("3q"),t.2C(1a.dR),t.1H("("),t.2D(1a.3V,e.1k.3T,!1),t.1H(")"),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.si(1a)},n.1e.5C=1b(t){1c n=t.2E,r=1h e.4Q,i=1h e.4Q;n.3Z(r),t.2E=r;1c s=1g;1a.1W&&(t.9P(1a,r,i),t.2d(1a.1W,1a),s=t.9O());if(!t.5d){1c o=t.2E;o.3Z(r),t.8M(1a.3V),t.2E=i,o.3Z(i)}1y t.kk(1a.3V);t.6O.2o.4s=!1},n}(k);e.sf=6B;1c D=1b(t){1b n(n){t.1K(1a,e.1f.cB),1a.3V=n,1a.7Q=1g}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.cC=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);t.1H("if("),t.2D(1a.3V,e.1k.gI,!1),t.1H(")"),t.bd(1a.9f,!0,!1),1a.7Q&&(t.1H(" 1y"),t.bd(1a.7Q,!0,!0)),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.s5(1a)},n.1e.5C=1b(t){1a.3V.5C(t);1c n=1h e.4Q,r=t.2E;t.9P(1a,r,n);1c i=!1;t.2E=1h e.4Q,r.3Z(t.2E),t.2d(1a.9f,1a),t.5d||(i=!0,t.2E.3Z(n)),1a.7Q?(t.2E=1h e.4Q,t.5d=!1,r.3Z(t.2E),t.2d(1a.7Q,1a),t.5d?i&&(t.5d=!1):(i=!0,t.2E.3Z(n))):(r.3Z(n),t.5d=!1,i=!0);1c s=t.9O();n.b5.1n>0&&(t.5d=!1,i=!0),i&&(t.2E=n),t.6O.2o.4s=!1},n}(k);e.s4=D;1c P=1b(t){1b n(){t.1K(1a,e.1f.eS),1a.6i=1g}1d 2B(n,t),n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);1a.6i?(t.1H("1d "),t.2D(1a.6i,e.1k.2R,!1)):t.1H("1d;"),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.5C=1b(e){t.1e.5C.1K(1a,e),e.p0()},n.1e.1P=1b(e){1d e.s3(1a)},n}(k);e.oa=P;1c H=1b(t){1b n(){t.1K(1a,e.1f.8S)}1d 2B(n,t),n}(t);e.8S=H;1c B=1b(t){1b n(n,r){t.1K(1a,e.1f.iO),1a.7u=n,1a.ad=r,1a.7u&&1a.7u.1o==e.1f.3m&&(1a.7u.1Y|=e.1U.ju)}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.aZ=1b(){1d!0},n.1e.rV=1b(){if(1a.1W){1c t=1g;if(1a.1W.1o==e.1f.4o){1c n=1a.1W;n.1p.1n==1&&(t=n.1p[0])}1y t=1a.1W;if(t!==1g){if(t.1o==e.1f.5M){1c r=t;r.6g!==1g&&r.6g.1p.1n==1&&(t=r.6g.1p[0])}if(t.1o==e.1f.cB){1c i=t.3V;if(i.1o==e.1f.5U){1c s=i.3A;if(s.1o==e.1f.4H){1c o=s;if(o.2l.1o==e.1f.3L&&1a.ad.1o==e.1f.3L&&o.2l.1G==1a.ad.1G){1c u=o.2f;if(u.1G=="qP"){1c a=i.2p;if(a!==1g&&a.1p.1n==1){1c f=a.1p[0];if(f.1o==e.1f.3L&&1a.7u.1o==e.1f.3L&&1a.7u.1G==f.1G)1d!0}}}}}}}}1d!1},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);t.1H("1w("),t.2D(1a.7u,e.1k.9d,!1),t.1H(" in "),t.2D(1a.ad,e.1k.9d,!1),t.1H(")"),t.bd(1a.1W,!0,!1),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.1j.5r.lq&&(1a.rV()||e.1j.1L.6D(1a,"no qP cW")),e.rT(1a)},n.1e.5C=1b(t){1a.7u&&t.8M(1a.7u),1a.ad&&t.8M(1a.ad);1c n=t.2E,r=1h e.4Q,i=1h e.4Q;n.3Z(r),t.2E=r,1a.1W&&(t.9P(1a,r,i),t.2d(1a.1W,1a),t.9O());if(!t.5d){1c s=t.2E;s.3Z(r)}t.2E=i,t.5d=!1,n.3Z(i),t.6O.2o.4s=!1},n}(k);e.rN=B;1c j=1b(t){1b n(n){t.1K(1a,e.1f.gq),1a.2m=n}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.aZ=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a);1c s=t.5J(!1);t.1H("1w("),1a.2m&&(1a.2m.1o!=e.1f.4o?t.2D(1a.2m,e.1k.9d,!1):t.rL(1a.2m)),t.1H("; "),t.2D(1a.3V,e.1k.9d,!1),t.1H("; "),t.2D(1a.9a,e.1k.9d,!1),t.1H(")"),t.bd(1a.1W,!0,!1),t.5J(s),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.rJ(1a)},n.1e.5C=1b(t){1a.2m&&t.8M(1a.2m);1c n=t.2E,r=1h e.4Q,i=1h e.4Q;n.3Z(r),t.2E=r;1c s=1g,o=r,u=1g;1a.9a&&(u=1h e.4Q,o=u),1a.3V&&(s=t.2E,t.8M(1a.3V),t.2E=1h e.4Q,s.3Z(t.2E));1c a=1g;1a.1W&&(t.9P(1a,o,i),t.2d(1a.1W,1a),a=t.9O()),1a.9a&&(t.5d?u.b5.1n==0&&t.kk(1a.9a):(t.2E.3Z(u),t.2E=u,t.8M(1a.9a)));1c f=t.2E;t.5d||f.3Z(r),s&&(s.3Z(i),t.5d=!1),i.b5.1n>0&&(t.5d=!1,t.2E=i),t.6O.2o.4s=!1},n}(k);e.rH=j;1c F=1b(t){1b n(n){t.1K(1a,e.1f.9K),1a.6h=n,1a.rF=1g}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.cC=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),t.1H("5F ("),1a.6h&&t.2D(1a.6h,e.1k.hi,!1),t.1H(")"),t.bd(1a.1W,!0,!1),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d e.rB(1a)},n}(k);e.rx=F;1c I=1b(t){1b n(n){t.1K(1a,e.1f.bB),1a.c6=n,1a.c7=1g}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.cC=1b(){1d!0},n.1e.3o=1b(t,n,r){t.2w(1a,!0),t.2A(1a);1c i=t.5J(!1);t.1H("3S("),t.2D(1a.c6,e.1k.3j,!1),t.2y(") {"),t.5Q();1c s=1a.6I.1p.1n;1w(1c o=0;o0?(t.5d=!1,t.2E=i):t.5d=!0,t.6O.2o.4s=!1},n}(k);e.rp=I;1c q=1b(t){1b n(){t.1K(1a,e.1f.hX),1a.6h=1g}1d 2B(n,t),n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),1a.6h?(t.1H("1t "),t.2D(1a.6h,e.1k.3j,!1)):t.1H("4G"),t.1H(":"),t.bd(1a.1W,!1,!1),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d 1a.6h=e.1P(1a.6h),e.1P(1a.1W),1a.1i=e.3O,1a},n.1e.5C=1b(t){1c n=1h e.4Q,r=t.hu[t.hu.1n-1];if(1a.6h){1c i=1h e.4Q;t.2E=i,r.3Z(i),t.8M(1a.6h),i.3Z(n)}1y r.3Z(n);t.2E=n,1a.1W&&t.2d(1a.1W,1a),t.5d=!1,t.6O.2o.4s=!1},n}(k);e.rm=q;1c R=1b(t){1b n(n,r){t.1K(1a,e.1f.aj),1a.ca=n,1a.hy=r}1d 2B(n,t),n.1e.3o=1b(e,t,n,r){3K 1h 2k("lU 2g 3o a 1i At")},n.1e.1P=1b(t){1c n=t.hA;t.hA=!0;1c r=e.cb(1a,t.1j,!0);1d t.1j.7D(t.2a,r,!1),t.op(r.1i,1a),1a.1i=r.1i,1a.ca&&(1a.ca.1i=1a.1i),t.hA=n,1a},n}(t);e.eD=R;1c U=1b(t){1b n(n,r){t.1K(1a,e.1f.ct),1a.7e=n,1a.cj=r}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.cC=1b(){1d!0},n.1e.3o=1b(t,n,r){t.2A(1a),t.2D(1a.7e,e.1k.dl,!1),t.2D(1a.cj,e.1k.eC,!1),t.2C(1a)},n.1e.1P=1b(e){1d 1a.7e=e.1P(1a.7e),1a.cj=e.1P(1a.cj),1a.1i=e.3O,1a},n.1e.5C=1b(t){1c n=1h e.4Q;t.2d(1a.7e,1a);1c r=1h e.4Q;t.2E&&t.2E.3Z(r),t.2E=r,t.9P(1a,1g,n),t.2d(1a.cj,1a),!t.5d&&t.2E&&t.2E.3Z(n),n.b5.1n>0?t.2E=n:t.5d=!0,t.9O(),t.6O.2o.4s=!1},n}(k);e.ct=U;1c z=1b(t){1b n(n,r){t.1K(1a,e.1f.en),1a.7e=n,1a.cz=r}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.cC=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),t.2D(1a.7e,e.1k.dl,!1),t.2D(1a.cz,e.1k.eA,!1),t.2C(1a),t.2w(1a,!1)},n.1e.5C=1b(t){1c n=t.2E,r=1h e.4Q;n.3Z(r),t.2E=r;1c i=1h e.4Q;t.9P(1a,1g,i),t.2d(1a.7e,1a),t.5d||t.2E&&t.2E.3Z(i),t.2E=1h e.4Q,n.3Z(t.2E),t.2d(1a.cz,1a),t.9O(),t.5d||t.2E&&t.2E.3Z(i),t.2E=i,t.6O.2o.4s=!1},n.1e.1P=1b(e){1d 1a.7e=e.1P(1a.7e),1a.cz=e.1P(1a.cz),1a.1i=e.3O,1a},n}(k);e.en=z;1c W=1b(t){1b n(n){t.1K(1a,e.1f.e3),1a.1W=n}1d 2B(n,t),n.1e.5P=1b(){1d!0},n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),t.1H("9Y "),t.2D(1a.1W,e.1k.dl,!1),t.2C(1a),t.2w(1a,!1)},n.1e.1P=1b(e){1d 1a.1W=e.1P(1a.1W),1a},n.1e.5C=1b(e){1a.1W&&e.2d(1a.1W,1a),e.6O.2o.4s=!1,e.5d=!1},n}(k);e.e3=W;1c X=1b(t){1b n(n,r){t.1K(1a,e.1f.6l),1a.6M=n,1a.1W=r,1a.3v=1g,1a.6M&&(1a.6M.1Y|=e.1U.ju)}1d 2B(n,t),n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),t.1H(" 7X ("),t.2D(1a.6M,e.1k.3y,!1),t.1H(")"),t.2D(1a.1W,e.1k.eA,!1),t.2C(1a),t.2w(1a,!1)},n.1e.5C=1b(t){if(1a.6M){t.8M(1a.6M);1c n=1h e.4Q;t.2E.3Z(n),t.2E=n}1a.1W&&t.2d(1a.1W,1a),t.5d=!1,t.6O.2o.4s=!1},n.1e.1P=1b(t){1c n=t.2a;t.2a=1a.3v,1a.6M=t.1P(1a.6M);1c r=1h e.7T,i=1h e.hW(1a.6M.id.1G,1a.6M.1u,t.1j.2v.3d,r);r.1A=i,r.2H=1h e.7p,r.2H.1i=t.1Q;1c s=t.2U;s&&s.1i?r.1A.1R=s.1i.1A:r.1A.1R=1g,1a.6M.2z=r.1A,t.2a.6W(r.1A.1R,1a.6M,r.1A,t.1j.1L,!1,!1,!1),1a.1W=t.1P(1a.1W);if(t.1j.9s()){1c o=t.2a.lf();o.7m.5b[r.1A.1C]=2i}1d 1a.1i=t.3O,t.2a=n,1a},n}(k);e.6l=X;1c V=1b(t){1b n(n){t.1K(1a,e.1f.ak),1a.1W=n}1d 2B(n,t),n.1e.3o=1b(t,n,r,i){t.2w(1a,!0),t.2A(1a),t.1H("i3"),t.2D(1a.1W,e.1k.eC,!1),t.2C(1a),t.2w(1a,!1)},n.1e.5C=1b(e){1a.1W&&e.2d(1a.1W,1a),e.6O.2o.4s=!1,e.5d=!1},n.1e.1P=1b(e){1d 1a.1W=e.1P(1a.1W),1a},n}(k);e.ak=V;1c $=1b(t){1b n(n,r,i){t.1K(1a,e.1f.7W),1a.6c=n,1a.ld=r,1a.dC=i,1a.1G=1g}1d 2B(n,t),n.1e.3b=1b(){if(1a.1G==1g)if(1a.ld){1a.1G=1a.6c.cw("\\n");1w(1c e=0;e<1a.1G.1n;e++)1a.1G[e]=1a.1G[e].8W(/^\\s+|\\s+$/g,"")}1y 1a.1G=[1a.6c.8W(/^\\s+|\\s+$/g,"")];1d 1a.1G},n}(t);e.7W=$;1c J=1b(t){1b n(){t.1K(1a,e.1f.iL)}1d 2B(n,t),n.1e.3o=1b(e,t,n,r){e.2w(1a,!0),e.2A(1a),e.2y("oy;"),e.2C(1a),e.2w(1a,!1)},n}(k);e.xi=J})(2c||(2c={}));1c 2c;(1b(e){1b s(){1d i||(i=1h r),i}1c t=1b(){1b e(){1a.4s=!0,1a.3J=!0,1a.es=!1}1d e.1e.l9=1b(e){5i e=="2i"&&(e=!0),1a.4s=!e,1a.3J=!e},e}();e.oB=t;1c n=1b(){1b e(e,t,n,r,i){1a.1Z=e,1a.wO=t,1a.oG=n,1a.2o=r,1a.5o=i}1d e.1e.2d=1b(e,t){1c n=1a.wO(e,t,1a);n===2i&&(n=e);if(1a.2o.4s){1c r=1a.2o.3J;1a.2o.3J=!0,1a.1Z[e.1o](e,t,1a),1a.2o.3J=r}1y 1a.2o.4s=!0;if(1a.oG){1c i=1a.oG(n,t,1a);1d i===2i&&(i=n),i}1d n},e}(),r=1b(){1b r(){1a.1Z=[],1a.wE()}1d r.1e.2d=1b(e,t,n,r,i){1d 1a.mW(t,n,r,i).2d(e,1g)},r.1e.mW=1b(e,t,n,r){1d 1a.wD(e,t,n,r)},r.1e.wD=1b(e,r,i,s){1d i||(i=1h t),1h n(1a.1Z,e,r,i,s)},r.1e.wE=1b(){1a.1Z[e.1f.1q]=o.5N,1a.1Z[e.1f.7s]=o.5N,1a.1Z[e.1f.e4]=o.5N,1a.1Z[e.1f.ef]=o.5N,1a.1Z[e.1f.fd]=o.5N,1a.1Z[e.1f.e7]=o.5N,1a.1Z[e.1f.9k]=o.5N,1a.1Z[e.1f.6a]=o.5N,1a.1Z[e.1f.av]=o.5N,1a.1Z[e.1f.9Q]=o.5N,1a.1Z[e.1f.8X]=o.7b,1a.1Z[e.1f.7c]=o.7b,1a.1Z[e.1f.9V]=o.5N,1a.1Z[e.1f.2Y]=o.3B,1a.1Z[e.1f.co]=o.7b,1a.1Z[e.1f.ci]=o.7b,1a.1Z[e.1f.eE]=o.7b,1a.1Z[e.1f.oj]=o.7b,1a.1Z[e.1f.aB]=o.3B,1a.1Z[e.1f.4H]=o.3B,1a.1Z[e.1f.li]=o.3B,1a.1Z[e.1f.hn]=o.3B,1a.1Z[e.1f.hf]=o.3B,1a.1Z[e.1f.eU]=o.7b,1a.1Z[e.1f.7w]=o.5N,1a.1Z[e.1f.3L]=o.5N,1a.1Z[e.1f.aj]=o.wC,1a.1Z[e.1f.7y]=o.3B,1a.1Z[e.1f.5U]=o.oI,1a.1Z[e.1f.bj]=o.oI,1a.1Z[e.1f.2S]=o.3B,1a.1Z[e.1f.ap]=o.3B,1a.1Z[e.1f.bf]=o.3B,1a.1Z[e.1f.bc]=o.3B,1a.1Z[e.1f.ba]=o.3B,1a.1Z[e.1f.b7]=o.3B,1a.1Z[e.1f.9N]=o.3B,1a.1Z[e.1f.b3]=o.3B,1a.1Z[e.1f.ab]=o.3B,1a.1Z[e.1f.b1]=o.3B,1a.1Z[e.1f.b0]=o.3B,1a.1Z[e.1f.9S]=o.3B,1a.1Z[e.1f.6x]=o.wn,1a.1Z[e.1f.aX]=o.3B,1a.1Z[e.1f.aU]=o.3B,1a.1Z[e.1f.a3]=o.3B,1a.1Z[e.1f.8T]=o.3B,1a.1Z[e.1f.a9]=o.3B,1a.1Z[e.1f.Eq]=o.3B,1a.1Z[e.1f.h8]=o.3B,1a.1Z[e.1f.aQ]=o.3B,1a.1Z[e.1f.aN]=o.3B,1a.1Z[e.1f.gr]=o.3B,1a.1Z[e.1f.gm]=o.3B,1a.1Z[e.1f.ge]=o.3B,1a.1Z[e.1f.iy]=o.3B,1a.1Z[e.1f.7z]=o.3B,1a.1Z[e.1f.ao]=o.3B,1a.1Z[e.1f.aq]=o.3B,1a.1Z[e.1f.aC]=o.3B,1a.1Z[e.1f.hO]=o.3B,1a.1Z[e.1f.az]=o.3B,1a.1Z[e.1f.b4]=o.3B,1a.1Z[e.1f.aG]=o.3B,1a.1Z[e.1f.da]=o.7b,1a.1Z[e.1f.fK]=o.7b,1a.1Z[e.1f.fu]=o.7b,1a.1Z[e.1f.fq]=o.7b,1a.1Z[e.1f.fo]=o.7b,1a.1Z[e.1f.fn]=o.7b,1a.1Z[e.1f.ff]=o.7b,1a.1Z[e.1f.2t]=o.wl,1a.1Z[e.1f.9i]=o.3B,1a.1Z[e.1f.3m]=o.oK,1a.1Z[e.1f.9e]=o.oK,1a.1Z[e.1f.eS]=o.wa,1a.1Z[e.1f.cX]=o.5N,1a.1Z[e.1f.ey]=o.5N,1a.1Z[e.1f.cs]=o.7b,1a.1Z[e.1f.gq]=o.w4,1a.1Z[e.1f.iO]=o.vU,1a.1Z[e.1f.cB]=o.vH,1a.1Z[e.1f.aL]=o.vA,1a.1Z[e.1f.im]=o.vr,1a.1Z[e.1f.5M]=o.vn,1a.1Z[e.1f.hX]=o.vh,1a.1Z[e.1f.bB]=o.ve,1a.1Z[e.1f.e3]=o.vd,1a.1Z[e.1f.en]=o.v8,1a.1Z[e.1f.ct]=o.v3,1a.1Z[e.1f.ak]=o.uX,1a.1Z[e.1f.6l]=o.uW,1a.1Z[e.1f.4o]=o.uP,1a.1Z[e.1f.6Y]=o.uF,1a.1Z[e.1f.4K]=o.uD,1a.1Z[e.1f.5h]=o.uB,1a.1Z[e.1f.4h]=o.uy,1a.1Z[e.1f.ec]=o.uw,1a.1Z[e.1f.9K]=o.uv,1a.1Z[e.1f.eY]=o.uu,1a.1Z[e.1f.f6]=o.ur,1a.1Z[e.1f.q8]=o.5N,1a.1Z[e.1f.qe]=o.5N,1a.1Z[e.1f.8S]=o.5N,1a.1Z[e.1f.2k]=o.5N,1a.1Z[e.1f.7W]=o.5N,1a.1Z[e.1f.iL]=o.5N;1w(1c t in e.1f.1r)if(1a.1Z[t]===2i)3K 1h 2k("D1 1b is 2g up to CX 5F kQ 6c!")},r}();e.CB=r;1c i;e.6f=s;1c o;(1b(e){1b t(e,t,n){}1b n(e,t,n){1c r=e.1p.1n;if(n.2o.es)1w(1c i=r-1;i>=0;i--)n.2o.3J&&(e.1p[i]=n.2d(e.1p[i],e));1y 1w(1c i=0;i0&&n.2o.3J&&(e.2p=n.2d(e.2p,e)),e.5m&&n.2o.3J&&(e.5m=n.2d(e.5m,e)),e.3C&&e.3C.1p.1n>0&&n.2o.3J&&(e.3C=n.2d(e.3C,e))}1b f(e,t,n){e.id&&(e.id=n.2d(e.id,e)),e.2m&&(e.2m=n.2d(e.2m,e)),e.4C&&n.2o.3J&&(e.4C=n.2d(e.4C,e))}1b l(e,t,n){e.6i&&(e.6i=n.2d(e.6i,e))}1b c(e,t,n){e.2m&&(e.2m=n.2d(e.2m,e)),e.3V&&n.2o.3J&&(e.3V=n.2d(e.3V,e)),e.9a&&n.2o.3J&&(e.9a=n.2d(e.9a,e)),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b h(e,t,n){e.7u=n.2d(e.7u,e),n.2o.3J&&(e.ad=n.2d(e.ad,e)),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b p(e,t,n){e.3V=n.2d(e.3V,e),e.9f&&n.2o.3J&&(e.9f=n.2d(e.9f,e)),e.7Q&&n.2o.3J&&(e.7Q=n.2d(e.7Q,e))}1b d(e,t,n){e.3V=n.2d(e.3V,e),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b v(e,t,n){e.3V=n.2d(e.3V,e),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b m(e,t,n){e.6g&&(e.6g=n.2d(e.6g,e))}1b g(e,t,n){e.6h&&(e.6h=n.2d(e.6h,e)),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b y(e,t,n){e.c6&&(e.c6=n.2d(e.c6,e)),e.6I&&n.2o.3J&&(e.6I=n.2d(e.6I,e))}1b b(e,t,n){e.1W&&(e.1W=n.2d(e.1W,e))}1b w(e,t,n){e.7e&&(e.7e=n.2d(e.7e,e)),e.cz&&n.2o.3J&&(e.cz=n.2d(e.cz,e))}1b E(e,t,n){e.7e&&(e.7e=n.2d(e.7e,e)),e.cj&&n.2o.3J&&(e.cj=n.2d(e.cj,e))}1b S(e,t,n){e.1W&&(e.1W=n.2d(e.1W,e))}1b x(e,t,n){e.6M&&(e.6M=n.2d(e.6M,e)),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b T(e,t,n){e.1C=n.2d(e.1C,e),n.2o.3J&&e.1p&&(e.1p=n.2d(e.1p,e))}1b N(e,t,n){T(e,t,n)}1b C(e,t,n){N(e,t,n),n.2o.3J&&e.7U&&(e.7U=n.2d(e.7U,e)),n.2o.3J&&e.6y&&(e.6y=n.2d(e.6y,e))}1b k(e,t,n){e.3C&&(e.3C=n.2d(e.3C,e))}1b L(e,t,n){N(e,t,n),n.2o.3J&&e.2V&&(e.2V=n.2d(e.2V,e)),n.2o.3J&&e.6y&&(e.6y=n.2d(e.6y,e))}1b A(e,t,n){T(e,t,n),n.2o.3J&&e.5k&&(e.5k=n.2d(e.5k,e))}1b O(e,t,n){e.id&&(e.id=n.2d(e.id,e)),e.5k&&(e.5k=n.2d(e.5k,e))}1b M(e,t,n){e.6h&&(e.6h=n.2d(e.6h,e)),e.1W&&n.2o.3J&&(e.1W=n.2d(e.1W,e))}1b 6B(e,t,n){}1b D(e,t,n){e.8I=n.2d(e.8I,e),n.2o.3J&&(e.7q=n.2d(e.7q,e))}e.5N=t,e.uP=n,e.7b=r,e.3B=i,e.wC=s,e.oI=o,e.wn=u,e.wl=a,e.oK=f,e.wa=l,e.w4=c,e.vU=h,e.vH=p,e.vA=d,e.vr=v,e.vn=m,e.vh=g,e.ve=y,e.vd=b,e.v8=w,e.v3=E,e.uX=S,e.uW=x,e.Cq=T,e.C4=N,e.uD=C,e.uF=k,e.uB=L,e.uy=A,e.uw=O,e.uv=M,e.uu=6B,e.ur=D})(o||(o={}))})(2c||(2c={}));1c 2c;(1b(e){1b t(e){1d e===1g||e.1n===0?1g:e[e.1n-1]}1b n(e,t){1d e>=t?e:t}1b r(e,t){1d e<=t?e:t}1b s(e){1d e===1g?!1:e.1u===-1||e.1x===-1?!1:!0}1b a(t,n,r){5i r=="2i"&&(r=u.tx);1c i=1b(e){if(e&&e.1n>0)1w(1c t=0;t=r&&n=h&&n=d.1u&&o.1x<=d.1x)&&f.5e.4b(o)}n=h&&i(o.5q),e.1s(r,u.tm)||(l.2o.4s=h<=n&&n<=p)}1d o},f=1h o;1d e.6f().2d(t,a,1g,1g,f),f.5e}1b f(t,r){1c i=0,s=1b(t,s,o){if(e.gw(t)){t.1u<=r&&(i=n(i,t.1u));if(t.1u>r||t.1x1a.3f())1a.1J.7a();1d e},n.1e.4b=1b(e){3q(1a.1J.1n>1a.3f())1a.1J.7a();1a.1I=1a.1J.1n,1a.1J.4b(e)},n.1e.up=1b(){if(1a.1I<=-1)3K 1h 2k("kz 1K to \'up\'");1a.1I--},n.1e.s6=1b(){if(1a.1I==1a.3I.1n-1)3K 1h 2k("kz 1K to \'s6\'");1a.1I++},n.1e.1o=1b(){1d 1a.3I()==1g?e.1f.1q:1a.3I().1o},n.1e.3I=1b(){1d n.p5(1a.1J,1a.1J.1n-(1a.1I+1))},n.1e.4c=1b(){1d n.p5(1a.1J,1a.1J.1n-1a.1I)},n.1e.3f=1b(){1d 1a.1I+1},n.1e.ac=1b(e){1d 1a.1J[e]},n.1e.zP=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.4K&&1a.4c().1C===1a.3I()},n.1e.zJ=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.5h&&1a.4c().1C===1a.3I()},n.1e.zG=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.9e&&1a.4c().id===1a.3I()},n.1e.zs=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.3m&&1a.4c().id===1a.3I()},n.1e.zp=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.4h&&1a.4c().1C===1a.3I()},n.1e.zm=1b(){1d 1a.3I()===1g||1a.4c()===1g?!1:1a.3I().1o===e.1f.3L&&1a.4c().1o===e.1f.2t&&1a.4c().1C===1a.3I()},n.1e.zl=1b(){1c n=t(1a.1J);1d 1a.3f()>=3&&1a.1J[1a.1I]===n&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.6Y},n.1e.zi=1b(){1c n=t(1a.1J);1d 1a.3f()>=3&&1a.1J[1a.1I]===n&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.4h},n.1e.zh=1b(){1c n=t(1a.1J);1d 1a.3f()>=3&&1a.1J[1a.1I]===n&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.4K},n.1e.ze=1b(){1c n=t(1a.1J);1d 1a.3f()>=5&&1a.1J[1a.1I]===n&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.2t&&1a.1J[1a.1I-3].1o===e.1f.4o&&1a.1J[1a.1I-4].1o===e.1f.4K&&1a.1J[1a.1I-2].3p&&1a.1J[1a.1I-2].2p===1a.1J[1a.1I-1]&&1a.1J[1a.1I-4].7V===1a.1J[1a.1I-2]},n.1e.yX=1b(){1c n=t(1a.1J);1d 1a.3f()>=3&&1a.1J[1a.1I]===n&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.5h},n.1e.yv=1b(){1d 1a.3f()>=1&&1a.1J[1a.1I].1o===e.1f.4h&&e.1s(1a.1J[1a.1I].3l,e.3r.k6)},n.1e.ys=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].1o===e.1f.4h&&1a.1J[1a.1I-1].1p==1a.1J[1a.1I-0]&&e.1s(1a.1J[1a.1I-1].3l,e.3r.k6)},n.1e.Fj=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.6Y&&1a.1J[1a.1I-1].3C==1a.1J[1a.1I-0]},n.1e.Fh=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.bB&&1a.1J[1a.1I-1].6I==1a.1J[1a.1I-0]},n.1e.ES=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.4h&&1a.1J[1a.1I-1].1p==1a.1J[1a.1I-0]},n.1e.ER=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.4K&&1a.1J[1a.1I-1].1p==1a.1J[1a.1I-0]},n.1e.EP=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.2t&&1a.1J[1a.1I-1].3C==1a.1J[1a.1I-0]},n.1e.DV=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.5h&&1a.1J[1a.1I-1].1p==1a.1J[1a.1I-0]},n.1e.D0=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.5M&&1a.1J[1a.1I-1].6g==1a.1J[1a.1I-0]},n.1e.CU=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.gq&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.vW=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.hX&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.Cj=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.e3&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.C0=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.6l&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.BL=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.im&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.Bw=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.aL&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.Bu=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.iO&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.Bg=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.9K&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.Bf=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.ak&&1a.1J[1a.1I-1].1W==1a.1J[1a.1I-0]},n.1e.B1=1b(){1d 1a.3f()>=3&&1a.1J[1a.1I-2].1o===e.1f.bB&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].6I==1a.1J[1a.1I-1]},n.1e.As=1b(){1d 1a.3f()>=3&&1a.1J[1a.1I-2].1o===e.1f.bB&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].6I==1a.1J[1a.1I-1]&&1a.1J[1a.1I-2].c7==1a.1J[1a.1I-0]},n.1e.uj=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.7c&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].2P==1a.1J[1a.1I-0]},n.1e.A9=1b(){1d 1a.uj()},n.1e.zW=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.7c&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].2P==1a.1J[1a.1I-0]&&1a.1J[1a.1I-0].1p.1n==0},n.1e.zV=1b(){1d 1a.3f()>=3&&1a.1J[1a.1I-2].1o===e.1f.7c&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-0].1o===e.1f.9i&&1a.1J[1a.1I-2].2P==1a.1J[1a.1I-1]},n.1e.zK=1b(){1d 1a.3f()>=4&&1a.1J[1a.1I-3].1o===e.1f.7c&&1a.1J[1a.1I-2].1o===e.1f.4o&&1a.1J[1a.1I-1].1o===e.1f.9i&&1a.1J[1a.1I-0].1o===e.1f.3L&&1a.1J[1a.1I-3].2P==1a.1J[1a.1I-2]},n.1e.zE=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.8X&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].2P==1a.1J[1a.1I-0]},n.1e.zn=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.9i&&1a.1J[1a.1I-1].2l===1a.1J[1a.1I-0]},n.1e.yS=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.9i&&1a.1J[1a.1I-1].2f===1a.1J[1a.1I-0]},n.1e.yQ=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.4o},n.1e.yA=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.cB&&1a.1J[1a.1I-1].9f==1a.1J[1a.1I-0]},n.1e.yw=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-1].1o===e.1f.cB&&1a.1J[1a.1I-1].7Q==1a.1J[1a.1I-0]},n.1e.Fp=1b(){1d 1a.vW()},n.1e.Fe=1b(){1d 1a.3f()>=1&&1a.1J[1a.1I].1o===e.1f.4o&&1a.1J[1a.1I].1p.1n===1},n.1e.EA=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].1o===e.1f.2t&&1a.1J[1a.1I-1].2p===1a.1J[1a.1I-0]},n.1e.Ey=1b(){1d 1a.3f()>=3&&1a.1J[1a.1I-1].1o===e.1f.4o&&1a.1J[1a.1I-2].1o===e.1f.2t&&1a.1J[1a.1I-2].2p===1a.1J[1a.1I-1]},n.1e.Ev=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].1o===e.1f.5U&&1a.1J[1a.1I-1].2p===1a.1J[1a.1I-0]},n.1e.DK=1b(){1d 1a.3f()>=2&&1a.1J[1a.1I-0].1o===e.1f.4o&&1a.1J[1a.1I-1].1o===e.1f.bj&&1a.1J[1a.1I-1].2p===1a.1J[1a.1I-0]},n.1e.Dt=1b(){1d 1a.3f()>=1&&1a.1J[1a.1I-0].1o===e.1f.5M&&1a.1J[1a.1I-0].8s===!1},n}();e.s1=i,e.gw=s;1c o=1b(){1b t(){1a.5e=1h e.s1}1d t}();e.C5=o,1b(e){e.1r=[],e.tx=0,e.tr=1,e.tm=2}(e.pX||(e.pX={}));1c u=e.pX;e.zU=a,e.zL=f,e.zB=l})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b t(e){1a.3n=e}1d t.1e.yz=1b(t){1c n=1a;1a.hs(t.2v.5x);1c r=[],i=1b(e,i){r.4b(e);1c s=(r.1n-1)*2;1d n.q1(t,e.5s,s),n.q2(t,e,s),n.q1(t,e.5q,s),e},s=1b(e,t){1d r.7a(),e};e.6f().2d(t,i,s)},t.1e.q2=1b(e,t,n){1c r=1a.b6("",n,"| ",!0);r=r.4E("+ "+t.a4()),r=1a.b6(r,70," ",!1),r+=1a.q3(e,t.1u),r=1a.b6(r,80," ",!1),r+="=> ",r+=1a.q3(e,t.1x),r=1a.b6(r,ih," ",!1),r=r.4E("["+1a.b6(t.1u.5v(),1," ",!0)+", "+1a.b6(t.1x.5v(),1," ",!0)+"]"),r=1a.b6(r,DY," ",!1),r=r.4E("2z="+t.2z),r=1a.b6(r,D6," ",!1),r=r.4E("1i="+(t.1i===1g?"1g":t.1i.3Q())),1a.3n.4S(r)},t.1e.q1=1b(e,t,n){if(t==1g)1d;1w(1c r=0;r0&&(t+=","),t+=e[n];t+="]",1a.3n.4S("CK: "+t)},t.1e.b6=1b(e,t,n,r){1c i=r?"":e;1w(1c s=e.1n;s=0&&n.3d<1a.1j.6e.1n&&(1a.1j.2v=1a.1j.6e[n.3d]);3S(n.4i()){1t e.4g.3z:if(n.1M&e.2j.qA)1B;1c i=n;i.1M|=e.2j.qA;if(i.9C&&!i.1i&&i.9C.5k.1o==e.1f.3L){1c s=i.9C.5k.1G,o=1a.1j.ix(s,1a.1j.2v.ae,1b(e){1d t.3u(e,!1,!0)});o&&(i.1i=o.2N())}if(i.1i&&i.1i!=1a.1j.wP){1a.i9(t,i.1i,i.3i);if(i.1i.e1())1w(1c u=0;u>=5,n>0&&(i|=32),r+=t.d2(i)}3q(n>0);1d r},e.Ax=1b(n){1c r=0,i=!1,s=0;1w(1c o=0;o>1&15):r|=(u&31)<1||e.dC){1a.2y("");1w(1c r=1;r0&&(1a.1H(", "),1a.7G(a,", ",e.1k.2Y,!1,!1,!1)),1a.1H(")")}1y s.1i&&s.1i.8R()&&(1a.2X(),1a.1H(n.1C.1G+".fv.6J"),1a.1H(".1K(1a)"))}1a.2C(n)},r.1e.c0=1b(n,r,i,s,o,u,a,f){5i a=="2i"&&(a=!1),5i f=="2i"&&(f=1a.4z.1R);1c l=n.3p&&e.1s(n.1S,e.1O.6U),c=l&&e.1s(1a.3s.1i.3i.4V,e.4w.jg)&&!e.1s(1a.3s.1i.3i.4V,e.4w.jh),h=c&&e.1s(1a.3s.1Y,e.1U.df);1a.2w(n,!0),1a.2A(n),(!n.4y()||!n.7k.qw)&&1a.1H("1b ");if(r){1c p=n.aI();p&&!n.4y()&&1a.1H(p)}1a.1H("("),a&&(a=1a.qv(n,!1,f));1c d=0,v=0,m,g=[];if(n.2p){1c y=1a.7r(t.iC);d=n.2p.1p.1n;1c b=d;n.8N&&b--;1w(v=0;v1)1d!1}1y if(t.1i.1K.2e.1n>1)1d!1;if(!1a.cr(e.6A(t.1S),r))1d!1;if(t.3p)1a.8j(),1a.2I.2Z("6J ");1y{1c i=t.aI();n?(1a.8j(),t.fM()?1a.2I.2Z("1h"):!t.mY()&&!t.d1()&&(1a.2I.2Z(i),e.1s(t.1C.1M,e.2M.c9)&&1a.2I.2Z("? "))):(1a.aa(e.6A(t.1S),"1b"),1a.2I.2Z(i))}1d t.d1()?1a.2I.2Z("["):1a.2I.2Z("("),!0},r.1e.qt=1b(e){if(e.8N){1c t=e.2p.1p[e.2p.1p.1n-1];e.2p.1p.1n>1?1a.2I.2Z(", ..."):1a.2I.2Z("..."),1a.mu(t)}e.d1()?1a.2I.2Z("]"):1a.2I.2Z(")"),!e.3p&&(e.5m||e.3F.2J.1i!=1a.1j.1Q)&&1a.jC(e.3F.2J.1i)&&1a.2I.2Z(": "+1a.dZ(e.3F.2J.1i)),e.iS()?1a.2I.3D(" {"):1a.2I.3D(";")},r.1e.dY=1b(e,t){5i t=="2i"&&(t=!1);1c n=1a.qv(e,t);if(n){if(e.2p){1c r=e.2p.1p.1n;e.8N&&r--;1w(1c i=0;i0){1a.2I.2Z(" "+t+" ");1c n=e.1p.1n;1w(1c r=0;r0&&1a.2I.2Z(", "),1a.2I.2Z(u)}}},r.1e.qm=1b(t){if(!1a.cr(e.6A(t.1Y)))1d!1;1c n=t.1C.1G;1d 1a.aa(e.6A(t.1Y),"3g"),1a.2I.2Z(n),1a.jJ(t.7U,"qk"),1a.jJ(t.6y,"tN"),1a.2I.3D(" {"),!0},r.1e.uh=1b(t){1c n=t.8E.1p.1n;1w(1c r=0;r0);if(n||i){1c s=t.1o==e.1f.5M||t.1o==e.1f.4o&&t.1p.1n==1&&t.1p[0].1o==e.1f.5M;1a.2A(t),s||(1a.2y(" {"),1a.5Q()),1a.7G(t,1g,e.1k.2R,!0,!1,!1),s||(1a.2y(""),1a.5L(),1a.2X(),1a.1H("}")),1a.2C(t)}}1y 1a.2D(t,e.1k.2R,!0);1y n&&1a.1H("{ }")},r.1e.xb=1b(t,n){if(t.1o!=e.1f.5M)if(t.1o==e.1f.4o){1c r=t;r.1p.1n==2&&r.1p[0].1o==e.1f.5M&&r.1p[1].1o==e.1f.8S?(1a.2D(r.1p[0],e.1k.2R,!0),1a.2y("")):1a.7G(t,1g,e.1k.2R,!0,!1,n)}1y 1a.2D(t,e.1k.2R,!0);1y 1a.2D(t,e.1k.2R,!0)},r.1e.2A=1b(t){if(1a.7A&&t){1c n={2K:-1,3c:-1},r=1h e.wN(t);r.iM=1a.4z.dj,r.iN=1a.4z.2K,e.dn(n,t.1u,1a.1j.2v.5x),r.r9=n.3c,r.ra=n.2K,e.dn(n,t.1x,1a.1j.2v.5x),r.AA=n.3c,r.AF=n.2K,r.4c=1a.7A.gb,1a.7A.gb=1a.7A.dG.1n,1a.7A.dG.4b(r);if(r.4c>=0){1c i=1a.7A.dG[r.4c];i.iQ==-1&&(i.iQ=1a.7A.gb)}}},r.1e.2C=1b(e){if(1a.7A&&e){1c t=1a.7A.gb,n=1a.7A.dG[t];n.AH=1a.4z.dj,n.AJ=1a.4z.2K,1a.7A.gb=n.4c}},r.1e.pW=1b(){e.ea.re(1a.qT)},r.1e.7G=1b(t,n,r,i,s,o,u){if(t==1g)1d;if(t.1o!=e.1f.4o)1a.2D(t,r,i,u);1y{1c a=t;if(a.1p.1n==0)1d;1a.2w(t,!0);1c f=a.1p.1n;1w(1c l=0;l0&&n.1o!=e.1f.4o&&n.1o!=e.1f.5M&&n.1o!=e.1f.5h&&(n.1o!=e.1f.3m||(n.1Y&e.1U.2s)!=e.1U.2s||n.2m!=1g)&&n.1o!=e.1f.8S&&(n.1o!=e.1f.2t||1a.4z.1R!=t.cl)&&1a.2X(),o&&1a.1H("("),n.3o(1a,r,i,s),o&&1a.1H(")"),r==e.1k.2R&&n.1o1)1w(1c s=1;s0&&(1a.1H(", "),1a.7G(t.2p,", ",e.1k.2Y,!1,!1,!1)),1a.1H(")"),!0}1d!1},r}();e.k2=r})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b t(e){1a.4F=e,1a.4t=1g,1a.1j=1g,1a.bg={2K:0,3c:0},1a.pT=!0,1a.pS=!1,1a.bi=!1,1a.hl=[]}1d t.1e.sp=1b(){1d 1a.hl},t.1e.sr=1b(){1a.hl=[]},t.1e.pR=1b(e){1a.hl[1a.hl.1n]=e},t.1e.sA=1b(e){1a.4F=e,1a.pT=!1},t.1e.pQ=1b(){1a.pT&&1a.4F.2Z("// "),1a.4F.2Z(1a.1j.2v.ae+"("+1a.bg.2K+","+1a.bg.3c+"): ")},t.1e.sN=1b(e){e?1a.sS(e):(1a.bg.2K=-1,1a.bg.3c=-1),1a.pQ()},t.1e.t3=1b(t){t&&1a.1j.2v.5x?e.dn(1a.bg,t.c1,1a.1j.2v.5x):(1a.bg.2K=-1,1a.bg.3c=-1),1a.pQ()},t.1e.sS=1b(t){t&&(t.1M|=e.2M.2k,1a.1j.2v.5x&&e.dn(1a.bg,t.1u,1a.1j.2v.5x))},t.1e.7O=1b(e,t){if(1a.bi){1a.pR(t);1d}1a.pS=!0;1c n=e.1x-e.1u;1a.4t.4A&&1a.4t.7M?1a.4t.7M(e.1u,n,t,1a.1j.2v.3d):(1a.sN(e),1a.4F.3D(t))},t.1e.pO=1b(e,t){if(1a.bi){1a.pR(t);1d}1a.pS=!0,1a.4t.4A&&1a.4t.7M?1a.4t.7M(e.c1,1,t,1a.1j.2v.3d):(1a.t3(e),1a.4F.3D(t))},t.1e.xC=1b(e,t){3K 1a.7O(e,t),2k("EU")},t.1e.cV=1b(e,t){1a.7O(e,"hh 7H \'"+t+"\'")},t.1e.yx=1b(e,t,n){1c r={2K:-1,3c:-1};1a.4t.ex(r,n.c1),1a.7O(e,"1A "+t+" pM at ("+r.2K+","+r.3c+")")},t.1e.k9=1b(e,t){1a.7O(e,"9R 1C \'"+t+"\' 6k 2g td in 5K 2E 2a")},t.1e.th=1b(e,t){1a.7O(e,"9R 1C \'"+t+"\' 6k 2g zt to a 4k")},t.1e.6D=1b(e,t){1c n=1a.bi;1a.bi=!1,1a.7O(e,"tw: "+t),1a.bi=n},t.1e.2q=1b(e,t){1a.7O(e,t)},t.1e.7g=1b(e,t){1a.pO(e,t)},t.1e.tB=1b(e){1a.2q(e,"hc \'d7\' 8u 4e be ka zO a 3g u2 eK")},t.1e.eJ=1b(e){1a.2q(e,"9R h9-Aa Ab of an pL 8B 8F be a 5O, 5u or Au")},t.1e.pK=1b(t,n,r){1c i=t.3A.1i,s=i.8b(r);if(i.2n&&n==e.1f.5U)1a.7O(t,"pJ of 1i \'"+s+"\' is 2g uo. pH ut uC to uR \'1h\'?");1y{1c o=n==e.1f.5U?"uo":"AU";1a.7O(t,"pJ of 1i \'"+s+"\' is 2g "+o)}},t.1e.AV=1b(e,t){1c n=e.2l.1i.8b(t),r=e.2f.1i.8b(t);1a.2q(e,"pJ of 1i \'"+n+"\' is 2g AZ by 1i \'"+r+"\'")},t.1e.dc=1b(e,t,n,r,i,s){t||(t=1a.1j.1Q),n||(n=1a.1j.1Q);1c o=s?s.7E:"";r?1a.7O(e,"h5 \'"+r+"\' h4 be eF to 9p \'"+t.8b(i)+"\' 8o \'"+n.8b(i)+"\'"+(o?": "+o:"")):1a.7O(e,"cg C1 \'"+t.8b(i)+"\' to \'"+n.8b(i)+"\'"+(o?": "+o:""))},t.1e.vg=1b(e){1a.2q(e,"2u 1c, 3g, 7f, or 6s")},t.1e.C9=1b(e,t,n){1a.7O(e,"h5 \'"+t+"\' h4 be eF to 1i \'"+n.3Q()+"\'")},t}();e.vy=t})(2c||(2c={}));1c 2c;(1b(e){1b s(t,n,r,s,o,u){1c a=r.3b(s,o);t.4S("Ci dm pF ("+s+","+o+\'): "\'+e.vK(a,gl)+\'"\');1c f=1h i;f.kg(1g,-1,-1),f.7M=u;1c l=1h e.m5(e.1f.4K,1g,1g,1g,1g,1g);f.h0=l;1c c=f.gZ(1h e.gY(a),"",0);1d c}(1b(e){e.1r=[],e.4l=0,e.kh=1,e.7d=2,e.pE=4,e.wG=e.7d|e.pE,e.Dw=e.7d|e.pE|e.kh})(e.pA||(e.pA={}));1c t=e.pA;(1b(e){e.1r=[],e.1r[0]="1q",e.1q=0,e.1r[1]="py",e.py=1,e.1r[2]="gX",e.gX=2,e.1r[3]="px",e.px=3,e.1r[4]="pu",e.pu=4,e.1r[5]="pt",e.pt=5,e.1r[6]="ps",e.ps=6,e.1r[7]="pr",e.pr=7,e.1r[8]="pq",e.pq=8,e.1r[9]="pl",e.pl=9,e.1r[10]="pk",e.pk=10,e.1r[11]="pj",e.pj=11,e.1r[12]="pi",e.pi=12})(e.ph||(e.ph={}));1c n=e.ph,r=1b(){1b e(e,t){1a.6Y=e,1a.y0=t}1d e}();e.EE=r;1c i=1b(){1b i(){1a.gW=[],1a.gV=[],1a.gU=[],1a.1l=1h e.pg,1a.1m=1g,1a.Fi=!1,1a.gS=!1,1a.yi=!1,1a.bp=!1,1a.h0=1g,1a.cn=!1,1a.yj=1h e.3R("ko"),1a.kp=!1,1a.pf=!0,1a.yK=!1,1a.4A=!1,1a.4F=2i,1a.7M=1g,1a.5o=n.gX,1a.pe=-1,1a.pc=-1,1a.rn=n.1q,1a.yU="",1a.6u=!1,1a.gP=!1,1a.ds=!0,1a.pb=-1,1a.7j=1g,1a.am=1h 2T,1a.gM=!1,1a.5a=!1,1a.4X=0,1a.ev=1g,1a.4n=1g,1a.9o=!1,1a.5w=!1,1a.bT=[],1a.9n=!1,1a.kv="",1a.rS=!1}1d i.1e.rU=1b(){1a.am=1h 2T},i.1e.rW=1b(){1w(1c e=1a.am.1n-1;e>=0;e--)if(1a.am[e].7q.aZ())1d!0;1d!1},i.1e.bs=1b(e,t){1c n={7q:e,8I:t};1a.am.4b(n)},i.1e.bt=1b(){1d 1a.am.7a()},i.1e.rZ=1b(t){1c n=1a.am.1n;1w(1c r=n-1;r>=0;r--){1c i=1a.am[r];if(t.3A){if(i.8I&&i.8I.1p.1n>0)1w(1c s=0,o=i.8I.1p.1n;s0)1a.1m.1z==e.1k.4N?i++:1a.1m.1z==e.1k.3H&&i--,1a.1m=1a.1l.1N(),n=e.1v.1q,r=e.eo(1a.1m.1z),r!=2i&&(n=r.p7)},i.1e.3t=1b(e,t,n){1a.1m.1z!=e?(1a.1T(t),1a.4A&&1a.6N(n)):1a.1m=1a.1l.1N()},i.1e.gC=1b(){1a.gU.4b(1h e.3X),1a.gW.4b(1h e.3X),1a.gV.4b(1h e.3X)},i.1e.em=1b(){1a.gU.7a(),1a.gW.7a(),1a.gV.7a()},i.1e.cF=1b(){1d 1a.gW[1a.gW.1n-1]},i.1e.cN=1b(){1d 1a.gV[1a.gV.1n-1]},i.1e.p3=1b(){1d 1a.gU[1a.gU.1n-1]},i.1e.t2=1b(t){if(t){1c n=1h e.7W(t.4k,t.kF,t.dC);n.1u=t.1X,n.1x=t.1X+t.4k.1n;if(!t.kF&&t.4k.1n>3&&t.4k.3e(0,3)=="///"){1c r=e.t4(t.4k);r&&1a.bT.4b(r)}1d n}1d 1g},i.1e.p1=1b(e){if(e){1c t=1h 2T;1w(1c n=0;n0){1c g=a.1n,y=a[g-1],b=1h e.dS(y,p,1a.cF(),1a.cN());if(1a.5w||e.1s(n,e.1V.2s))b.3l|=e.3r.2s;b.3l|=e.3r.2x,b.1u=l,b.1x=v,1a.em();1c w;1w(1c E=g-2;E>=0;E--){w=1h e.3X,w.4Y(b),y=a[E],b=1h e.dS(y,w,1h e.3X,1h e.3X),w.1u=b.1u=l,w.1x=b.1x=v;if(1a.5w||e.1s(n,e.1V.2s))b.3l|=e.3r.2s;b.3l|=e.3r.2x}w=1h e.3X,w.4Y(b),w.1u=l,w.1x=v,m=1h e.dS(u,w,1h e.3X,1h e.3X)}1y m=1h e.dS(u,p,1a.cF(),1a.cN()),1a.em();if(1a.5w||e.1s(n,e.1V.2s))m.3l|=e.3r.2s;1d e.1s(n,e.1V.2x)&&(m.3l|=e.3r.2x),c&&(m.3l|=e.3r.9q),m.5s=f,m.5q=1a.4Z(),1a.6u=s,1a.ds=o,m.4U=1a.1l.4U-r,m.4R=1a.1l.4R-i,m},i.1e.go=1b(t,n,r){1c i=1h e.eD(r,0);i.1u=n;3q(1a.1m.1z==e.1k.7B)1a.1m=1a.1l.1N(),i.hy++,1a.3t(e.1k.6R,"2u \']\'",t|e.1v.7B);1d i.1x=1a.1l.3a(),i},i.1e.gn=1b(t,n,r,i){1a.1m=1a.1l.1N();if(1a.1m.1z==e.1k.4H){1c s=1a.1l.1F;1a.1m=1a.1l.1N();if(1a.1m.1z==e.1k.3j||e.5z(1a.1m,1a.5a)){1c o=1h e.3R(1a.1m.3b());o.1u=1a.1l.1X,o.1x=1a.1l.1F;1c u=1h e.9D(e.1f.4H,r,o);1d u.1u=r.1u,u.1x=o.1x,1a.gn(t,n,u,i)}1a.1T("tU 7H kO \'.\'");if(1a.4A)1d r.1M|=e.2M.eB,r.1x=1a.1l.3a(),r;1c a=1h e.6p;a.1u=1a.1l.1F,a.1x=1a.1l.1F;1c f=1h e.9D(e.1f.4H,r,a);1d f.1M|=e.2M.2k,f.1u=r.1u,f.1x=a.1x,1a.gn(t,n,f,i)}1d i?1a.go(t,n,r):r},i.1e.cQ=1b(t,n){1c r=1a.1l.1X,i=!1;3S(1a.1m.1z){1t e.1k.kT:n||1a.1T("a7 2g a kU 1i in 1a 9W");1t e.1k.gk:1t e.1k.gj:1t e.1k.gi:1t e.1k.gh:1c s=e.a8[1a.1m.1z].1G,o=1h e.3R(s);1d o.1u=r,o.1x=1a.1l.1F,1a.1m=1a.1l.1N(),1a.go(t,r,o);1t e.1k.3j:1c u=1a.gF(1a.1m.3b(),r);1d u.1x=1a.1l.1F,1a.gn(t,r,u,!0);1t e.1k.4N:1a.1m=1a.1l.1N();1c a=1h e.3X;a.1u=r;1c f=1a.bp;1a.bp=!0,1a.oT(t|e.1v.3H,a),1a.bp=f,1a.3t(e.1k.3H,"2u \'}\'",t);1c l=1h e.m5(e.1f.5h,1a.yj,a,1g,1g,1g);1d l.1u=r,l.1x=a.1x,1a.go(t,r,l);1t e.1k.eh:1a.1m=1a.1l.1N(),1a.1m.1z!=e.1k.3y?1a.1T("2u \'(\'"):i=!0;1t e.1k.3y:1c c=1h e.3X,h=1a.gf(t|e.1v.3T,c,!1,!0,!1,!1,!1,1g);1a.3t(e.1k.a5,"2u \'=>\'",t);1c p=1a.cQ(t,!0),d=1h e.2t(1g,1g,!1,c,1g,1g,1g,e.1f.2t);1d d.5m=p,d.8N=h,d.1S|=e.1O.7F,i&&(d.1S|=e.1O.j4,d.6L="uQ",d.9F=1g),d.1u=r,1a.go(t,r,d);4G:1a.1T("2u 1i 1C");1c v=1h e.eD(1g,0);1d v.1M|=e.2M.2k,v.1u=1a.1l.1F,v.1x=1a.1l.1F,v}},i.1e.kW=1b(r,i,s,o,u,a,f,l,c){1a.gC();1c h=1a.am;1a.rU();1c p=1g,d=!1,v=!1;if(!l){p=1h e.3X;1c m=1a.1l.1X;1a.1m.1z==e.1k.a5&&(o&&1a.1T("\'=>\' 3G 2g be ka 1w 3g El"),d=!0,1a.1m=1a.1l.1N());if(d&&1a.1m.1z!=e.1k.4N){1c g=1a.4v(r|e.1v.2R,e.4q.2S,!0,t.4l),y=1h e.oa;y.6i=g,p.1u=m,p.4Y(y)}1y{1a.5o=n.gX,1a.3t(e.1k.4N,"2u \'{\'",r|e.1v.8H);1c b=1a.gS;v=d,1a.gS=!0,1a.eg(r|e.1v.3H|e.1v.8H,p,!0,!1,a,c),p.1u=m,p.1x=1a.1l.1F,1a.gS=b;1c w=1h e.8S;w.1u=p.1x,w.1x=w.1u,p.4Y(w)}}1c E=1h e.2t(i,p,s,u,1a.cF(),1a.cN(),1a.p3(),e.1f.2t);1a.em();1c S=1a.cN();S.4Y(E);1c x=!1,T=1a.1l.1F;1d l?1a.3t(e.1k.2R,"2u \';\'",r):!d||v?(1a.3t(e.1k.3H,"2u \'}\'",r),v&&(E.1S|=e.1O.8v)):(E.1S|=e.1O.8v,1a.1m.1z==e.1k.2R&&(1a.1m=1a.1l.1N())),E.1u=f,E.1x=T,l||(E.1S|=e.1O.aJ),1a.am=h,E},i.1e.oS=1b(t,n){1c r=1a,i=1b(n){if(n.1o==e.1f.2Y)r.oS(t,n);1y if(n.1o==e.1f.3L||n.1o==e.1f.2S){1c i=n.1o==e.1f.2S?n.2l:n,s=1h e.9e(i);s.5s=i.5s,s.5q=i.5q,s.1u=i.1u,s.1x=i.1x,e.1s(i.1M,e.2M.ke)&&(s.ar=!0),n.1o==e.1f.2S&&(s.2m=n.2f),t.4Y(s)}1y r.1T("kz Ep e2")};if(n)if(n.1o==e.1f.2Y){1c s=n;i(s.2l),i(s.2f)}1y i(n)},i.1e.gf=1b(n,r,i,s,o,u,a,f){r.1u=1a.1l.1X,o?1a.1m=1a.1l.1N():f||1a.3t(e.1k.3y,"2u \'(\'",n|e.1v.3T);1c l=!1,c=!0,h=!1,p=!1,d=!1;f&&(1a.oS(r,f),p=!0);1w(;;){1c v=!1,m=e.1U.1q,g=1a.1l.1X;1a.9n&&1a.1m.1z==e.1k.bD&&(i||1a.1T("v1 5u e0 v5 \'1a\' 3G 4e be ka in 3g oQ"),1a.1m=1a.1l.1N(),m|=e.1U.4u|e.1U.3k,1a.4n&&(1a.4n.1Y|=e.1U.df)),1a.1m.1z==e.1k.ei?(m|=e.1U.4u|e.1U.3k,1a.4n&&(1a.4n.1Y|=e.1U.df)):1a.1m.1z==e.1k.ej&&(m|=e.1U.3h|e.1U.3k,1a.4n&&(1a.4n.1Y|=e.1U.df)),m!=e.1U.1q?(i||1a.1T("4e 6J 2r 8u be iI"),1a.1m=1a.1l.1N(),1a.9n&&1a.1m.1z==e.1k.bD&&(i||1a.1T("v1 5u e0 v5 \'1a\' 3G 4e be ka in 3g oQ"),1a.1m=1a.1l.1N(),1a.1m=1a.1l.1N())):1a.1m.1z==e.1k.gL&&(l=!0,1a.1m=1a.1l.1N());1c y=1g;if(!p&&1a.1m.1z==e.1k.3j||e.5z(1a.1m,1a.5a))y=1h e.3R(1a.1m.3b()),y.1u=1a.1l.1X,y.1x=1a.1l.1F;if(p||y){v=!0;1c b=1g,w=1g;p&&r.1p.1n?(w=r.1p[r.1p.1n-1],w.ar&&(h=!0,d=!0)):(w=1h e.9e(y),u&&1a.1T("3k EY 3G 2g 8O 8r c4"),a&&!c&&1a.1T("3k oP 3G 4e 8O bA e2"),w.1u=g,w.5s=1a.4Z(),1a.1m=1a.1l.1N()),1a.1m.1z==e.1k.6x&&(w.ar=!0,h=!0,1a.1m=1a.1l.1N()),1a.1m.1z==e.1k.5j&&(1a.1m=1a.1l.1N(),b=1a.cQ(n,!1),f&&(d=!0)),1a.1m.1z==e.1k.2S&&(s&&1a.1T("Fl in 2e 3G 2g 8h 4G Fm"),h=!0,1a.1m=1a.1l.1N(),w.2m=1a.4v(e.1v.2Y|n,e.4q.8L,!1,t.4l)),h&&!w.hL()&&!l&&1a.1T("9w 2r 3G 4e be Fn by cY vs 2r"),l&&w.hL()&&1a.1T("yr 3G 2g be vs or 8h 4G 2r"),w.5q=1a.4Z(),w.4C=b,w.1x=1a.1l.3a(),w.1Y|=m,p?p=!1:r.4Y(w)}c=!1;if(1a.1m.1z!=e.1k.2Y)1B;if(v&&!l){1a.1m=1a.1l.1N();3P}1a.1T("oM \',\' in e2 yt");if(1a.4A){1a.1m=1a.1l.1N();3P}}1d o?1a.3t(e.1k.6R,"2u \']\'",n|e.1v.4N|e.1v.2R):(!f||d)&&1a.3t(e.1k.3T,"2u \')\'",n|e.1v.4N|e.1v.2R),r.1x=1a.1l.3a(),l},i.1e.dU=1b(t,r,i,s,o,u,a,f,l,c){1c h=1a.1l.4U,p=1a.1l.4R,d=1a.9o;1a.9o=!1;1c v=1g,m=1a.1l.1X,g=1a.1l.1F,y=1a.4X;1a.4X=0,!1a.pf&&1a.rW()&&1a.ky("1b 5V in lE");if(!s&&!a&&!u&&!c){1a.1m=1a.1l.1N(),1a.5o=n.pu;if(1a.1m.1z!=e.1k.3j&&!e.5z(1a.1m,1a.5a)){if(r)1d 1a.1T("aE 5V 8F uR 7H"),1a.4X=y,1h e.vc(m,1a.1l.1F)}1y v=1h e.3R(1a.1m.3b()),v.1u=1a.1l.1X,v.1x=1a.1l.1F,1a.1m=1a.1l.1N()}1y o&&(v=o);1a.5o=n.pt;1c b=1h e.3X,w=!1,E=!1,S=e.1s(l,e.1V.6d),x=e.1s(l,e.1V.7v);if(1a.1m.1z==e.1k.3y||u&&1a.1m.1z==e.1k.7B||c&&c.l1)w=1a.gf(t,b,!1,i,u,S,x,c?c.l1:1g);1a.5o=n.ps;1c T=1g;1a.1m.1z==e.1k.5j&&(1a.1m=1a.1l.1N(),e.1s(l,e.1V.7v)&&1a.1T("3k oP 3G 2g iE a 1d 1i"),T=1a.cQ(t,!0)),u&&b.1p.1n==0&&1a.1T("7y 2e jV a 3W 1i to be yy"),1a.5o=n.pr,r&&!1a.5w&&!f&&(!s||!(1a.6u||1a.gP||1a.bp))&&1a.1m.1z==e.1k.2R&&(E=!0,r=!1,i=!0);1c N=1a.cn;1a.cn=!0;1c C=1a.kW(t|e.1v.3H,v,!1,s,b,e.4O.p8,g,i,e.1V.1q);1d 1a.cn=N,C.8N=w,C.6Z=E,i||(C.1S|=e.1O.aJ),a&&(C.1S|=e.1O.3x),i&&(C.1S|=e.1O.7F),u&&(C.1S|=e.1O.j5),C.5m=T,s&&(C.1S|=e.1O.fS,C.1S|=e.1O.fV),C.4U=1a.1l.4U-h,C.4R=1a.1l.4R-p,1a.4X=y,1a.9o=d,C},i.1e.l2=1b(t){1c n;3S(t.1o){1t e.1f.aj:1d t;1t e.1f.3L:1d n=1h e.eD(t,0),n.1u=t.1u,n.1x=t.1x,n;1t e.1f.7y:1c r=t;n=1a.l2(r.2l);if(n)1d n.hy++,n.1u=r.1u,n.1x=r.1x,n;1c i=1h e.5y(e.1f.2k);1d i}1d 1g},i.1e.l3=1b(n){1c r=1h e.3X;r.1u=1a.1l.1X,1a.1m=1a.1l.1N();if(1a.1m.1z!==e.1k.3T)1w(;;){if(r.1p.1n>yH){1a.1T("cI cJ of 2p yM");1B}1c i=1a.4v(e.1v.2Y|n,e.4q.8L,!1,t.4l);r.4Y(i);if(1a.1m.1z!=e.1k.2Y)1B;1a.1m=1a.1l.1N()}1d r.1x=1a.1l.1F,r},i.1e.oL=1b(t,n,r,i,s){1c o=!0,u=t;1w(;;){o&&(1a.1m.1z==e.1k.ek&&(i&&1a.1T("xw 8u 2g 6b cY 9p"),u=n),1a.1m=1a.1l.1N(),o=!1);1c a=1g;if(1a.1m.1z==e.1k.3j||e.5z(1a.1m,1a.5a)){1c f=1a.1l.1X;a=1h e.3R(1a.1m.3b()),a.1u=f,a.1x=1a.1l.1F,a=1a.gn(r|e.1v.4N,f,a,!1)}1y 1a.1T("2u bz 1C"),1a.4A&&(a=1h e.6p,a.1u=1a.1l.1F,a.1x=1a.1l.1F,a.1M|=e.2M.2k);if(1a.1m.1z==e.1k.3y){s&&1a.1T("iz aV 3G 4e be wk z5 a \'d7\' 1K bx 5K 6J 1W");1c l=1a.l3(r|e.1v.3T),c=1h e.lb(e.1f.5U,a,l);1a.1m=1a.1l.1N(),c.1x=1a.1l.1F,u.4Y(c)}1y u.4Y(a);!i&&u==t&&t.1p.1n>1&&1a.1T("A 3g 3G 4e qp bA cY 3g");if(1a.1m.1z==e.1k.2Y){1a.1m=1a.1l.1N();3P}if(1a.1m.1z==e.1k.el||1a.1m.1z==e.1k.ek){u=t,o=!0;3P}1B}},i.1e.wo=1b(t,n,r){1c i=1a.1l.4U,s=1a.1l.4R;(r&e.1V.7x)!=e.1V.1q&&1a.1T("oJ wt is zk 1w 3g");if(1a.5w||1a.6u)r|=e.1V.2s,r|=e.1V.2x;1c o=1a.5w||(r&e.1V.2s)!=e.1V.1q,u=1a.gP;1a.gP=o,1a.1m=1a.1l.1N();1c a=1g;1a.1m.1z==e.1k.3j||e.5z(1a.1m,1a.5a)?(a=1h e.3R(1a.1m.3b()),a.1u=1a.1l.1X,a.1x=1a.1l.1F,1a.1m=1a.1l.1N()):(1a.1T("3g kS 1C"),1a.4A&&(a=1h e.6p,a.1u=1a.1l.1F,a.1x=1a.1l.1F,a.1M|=e.2M.2k));1c f=1g,l=1g,c=!1;if(1a.1m.1z==e.1k.el||1a.1m.1z==e.1k.ek)f=1h e.3X,l=1h e.3X,1a.oL(f,l,t,!1,!0);1c h=1h e.uL(a,1h e.3X,f,l);1a.4n=h,1a.wu(h,t,r);if(1a.6u||1a.5w||e.1s(r,e.1V.2x))h.1Y|=e.1U.2x;if(1a.6u||e.1s(r,e.1V.2s))h.1Y|=e.1U.2s;1d h.1Y|=e.1U.4K,1a.gP=u,h.4U=1a.1l.4U-i,h.4R=1a.1l.4R-s,h},i.1e.wu=1b(t,n,r){1c i=r,s=!1,o=1a.1l.1X;1a.3t(e.1k.4N,"2u \'{\'",n),1a.4X++;1c u=1a.1l.1X,a=!1;3q(1a.1m.1z!=e.1k.3H&&1a.1m.1z!=e.1k.5I){1c f=!0,l=e.1V.4u|e.1V.3h;if(1a.1m.1z==e.1k.cE)i&e.1V.6d&&1a.1T("hh \'ac\' 5V in 3g 1W"),i&e.1V.7v&&1a.1T("6d iv iq as a 7R"),i|=e.1V.6d;1y if(1a.1m.1z==e.1k.bv)i&e.1V.7v&&1a.1T("hh \'6q\' 5V in 3g 1W"),i&e.1V.6d&&1a.1T("7v iv iq as a 9t"),i|=e.1V.7v;1y if(1a.1m.1z==e.1k.ej)i&l&&1a.1T("oE 6X 3G 2g be eF to 3g 1p"),i|=e.1V.3h;1y if(1a.1m.1z==e.1k.ei)i&l&&1a.1T("oE 6X 3G 2g be eF to 3g 1p"),i|=e.1V.4u;1y if(1a.1m.1z==e.1k.io)i&e.1V.3x&&1a.1T("oE 6X 3G 2g be eF to 3g 1p"),i|=e.1V.3x;1y if(1a.1m.1z==e.1k.l7)i!=r&&1a.1T("oC 3G 2g 8h 6X"),1a.wZ(u,n,i),f=!1,s=!0;1y if(a||1a.1m.1z==e.1k.3j||e.cO(1a.1m)){1c c=a?i&e.1V.6d?"ac":"6q":1a.1m.3b(),h=1h e.3R(c);h.1u=1a.1l.1X,h.1x=1a.1l.1F,a?(i^=i&e.1V.6d?e.1V.6d:e.1V.7v,a=!1):1a.1m=1a.1l.1N();if(1a.1m.1z==e.1k.3y)1a.x0(h,u,n,i),f=!1;1y{(i&e.1V.6d||i&e.1V.7v)&&1a.1T("3k 8w 8F be x9");1c p=1a.ij(h,u,!1,n,i);p.2m&&p.2m.1o==e.1f.2t?1a.1m.1z==e.1k.3H&&(f=!1):p.2m&&p.2m.1o==e.1f.7c&&1a.1m.1z!=e.1k.2R?(f=!1,p.2m.1M|=e.2M.ku):1a.1m.1z!=e.1k.2R&&(1a.1T("2u \';\'"),f=!1)}s=!0}1y 1a.1m.1z==e.1k.ig?1a.1T("iz 3g xr 8F be 5K xt 4m in a 3g dF"):!a&&(i&e.1V.6d||i&e.1V.7v)&&1a.1m.1z==e.1k.3y||1a.1m.1z==e.1k.2S?(a=!0,f=!1):1a.1m.1z!=e.1k.2R&&(1a.1T("oM \'"+1a.1m.3b()+"\' in 3g dF"),s=!0);f&&(1a.1m=1a.1l.1N()),s&&(i=r,u=1a.1l.1X,s=!1)}1c d=1a.1l.1F;1a.1m.1z==e.1k.3H&&(1a.4n.8E.1p.1n||(1a.4n.5s=1a.4Z()),1a.1m=1a.1l.1N()),1a.4X--,1a.4n.1p.1u=o,1a.4n.1p.1x=d,1a.4n.1x=d,1a.4n=1g},i.1e.wZ=1b(t,n,r){1a.9o=!0;1c i=1a.5w||e.1s(r,e.1V.2s),s=1h e.3X,o=!1,u=1a.4Z();1a.1m=1a.1l.1N();if(1a.1m.1z==e.1k.3y){o=1a.gf(n,s,!0,i,!1,!1,!1,1g);if(s.1p.1n>0)1c a=s.1p[s.1p.1n-1]}1c f=i||1a.1m.1z==e.1k.2R;if(f)1w(1c l=0;l\'",n);if(o==1g)3S(1a.1m.1z){1t e.1k.3y:f=1a.1l.1F;1c d=1a.1l.od().1z;1a.1m=1a.1l.1N();1c v=d==e.1k.3y||d==e.1k.2Y||d==e.1k.EQ||d==e.1k.5j;v&&1a.1m.1z==e.1k.3T?(c=!0,1a.1m=1a.1l.1N()):(o=1a.4v(n|e.1v.3T,e.4q.1D,!0,t.4l),l=1a.1l.3a(),c=v&&(o.1o==e.1f.3L||o.1o==e.1f.2Y)&&(1a.1m.1z==e.1k.5j||1a.1m.1z==e.1k.6x)),o&&!c&&(1a.3t(e.1k.3T,"2u \')\'",n),o.7o=!0);1B;1t e.1k.7w:1c m=1a.1m;1a.1m=1a.1l.1N(),o=1h e.mh(m.4k),o.1u=f,l=1a.1l.3a();1B;1t e.1k.6a:o=1h e.gN(1a.1m.3b()),1a.1m=1a.1l.1N(),o.1u=f,l=1a.1l.3a();1B;1t e.1k.av:1c g=1a.1m;o=1h e.rK(g.gc),1a.1m=1a.1l.1N(),o.1u=f,l=1a.1l.3a();1B;1t e.1k.7B:f=1a.1l.1X,1a.1m=1a.1l.1N(),o=1a.ri(e.1v.6R|n),o.1u=f,l=1a.1l.1F,1a.3t(e.1k.6R,"2u \']\'",n);1B;1t e.1k.4N:f=1a.1l.1X,1a.1m=1a.1l.1N();1c y=1a.rf(e.1v.3H|n);1a.3t(e.1k.3H,"2u \'}\'",n),o=1h e.bS(e.1f.7c,y),o.1u=f,l=1a.1l.3a(),y.1u=f,y.1x=l;1B;1t e.1k.hj:f=1a.1l.1X,1a.1m=1a.1l.1N();1c b=1a.cQ(e.1v.3U,!1);1a.3t(e.1k.eI,"2u \'>\'",n),o=1h e.bS(e.1f.ff,1a.4v(n,e.4q.8y,!1,t.4l)),o.9X=b;1B;4G:if(1a.ev&&e.1s(1a.ev.1M,e.2M.ke))c=!0,o=1a.ev;1y{1a.1T("BX BZ of 8B ca");if(1a.4A){1c w=1h e.6p;w.1u=f,w.1M|=e.2M.2k,1a.6N(n|e.1v.uK),1a.1m.1z==e.1k.3j||e.5z(1a.1m,1a.5a)?(w.1G=1a.1m.3b(),1a.1m=1a.1l.1N(),l=1a.1l.3a()):l=1a.1l.3a(),o=w}}}c&&(1a.1m.1z==e.1k.a5||1a.1m.1z==e.1k.5j||1a.1m.1z==e.1k.2Y||1a.1m.1z==e.1k.3T?(o=1a.dU(n,!1,!1,!1,1g,!1,!1,!1,e.1V.1q,{l1:o}),o.1S|=e.1O.aH,o.1S|=e.1O.8v,o.1u=f,l=1a.1l.3a(),o.1x=l):o&&(o.7o=!0)),u&&i!=t.4l&&(i|=t.kh);1c E=1a.rE(n,o,r,a,i,f,l);if(E){if(u&&E.1o==e.1f.7y){1c S=E;S.2f==1g&&(E=1a.l2(E))}1d E.1u=f,E.1x=e.cI(E.1x,1a.1l.3a()),E}1d 1h e.5y(e.1f.2k)},i.1e.4v=1b(n,r,i,s){1c o=1g,u=e.eo(1a.1m.1z),a=!0,f=1g,l=1a.1l.1X,c=1a.4Z(),h=!1;if(u!=2i&&u.eO!=e.1f.1q){a=!1,1a.1m=1a.1l.1N();1c p=1a.4v(e.1v.3U|n,u.rG,i,t.4l);if(u.eO==e.1f.co&&p.1o==e.1f.7w)o=p;1y if(u.eO==e.1f.ci&&p.1o==e.1f.7w){1c d=p;d.4k=-d.4k,d.4k==0&&(d.nQ=!0),o=p}1y o=1h e.bS(u.eO,p),o.1x=p.1x;o.1u=l}1y{o=1a.oe(e.1v.3U|e.1v.gB|n,!0,s,!1);1c v,m;if(o.1o==e.1f.3L)v=o,f=v.1G;1y if(o.1o==e.1f.4H){1c g=!1;if(1a.9n&&(1a.1m.1z==e.1k.5j||1a.1m.1z==e.1k.2S)&&1a.9o&&1a.4X==1a.4n.nt&&o.2l.1o==e.1f.e7&&o.2f.1o==e.1f.3L){1c y=o.2f;1a.4n.mf[y.1G]||(o=1a.ij(y,o.1u,!0,n,e.1V.4u),g=!0)}if(!g){m=o;3q(m.1o==e.1f.4H){1c b=m;m=b.2f}m.1o==e.1f.3L&&(v=m,f=v.1G)}}if(!1a.1l.bl()&&(1a.1m.1z==e.1k.bh||1a.1m.1z==e.1k.bV)){a=!1;1c w=o;o=1h e.bS(1a.1m.1z==e.1k.bh?e.1f.fo:e.1f.fn,w),o.1x=1a.1l.1F,o.1u=w.1u,1a.1m=1a.1l.1N()}}1w(;;){u=e.eo(1a.1m.1z);if(u==2i||u.eP==e.1f.1q)1B;if(!i&&u.eP==e.1f.aB)1B;if(u.hb==e.4q.2S){if(u.hb0&&e.6w.lG(1a.b8);1c t=1a.fT[1a.9G];if(t===2i){t="";1w(1c n=0;n<1a.9G;n++)t+=1a.sY;1a.fT[1a.9G]=t}1a.b8+=t},t.1e.vx=1b(e){1a.b8+=e},t.1e.vq=1b(e){1a.b8+=e,1a.4F.3D(1a.b8),1a.b8=""},t}();e.o7=t,e.o5=n,e.o4=r})(2c||(2c={}));1c 2c;(1b(e){1b r(){e.t6(),t[e.lJ]=e.2G[e.1k.3y],t[e.lK]=e.2G[e.1k.3T],t[e.tc]=e.2G[e.1k.2Y],t[e.jo]=e.2G[e.1k.2R],t[e.i2]=e.2G[e.1k.7B],t[e.lL]=e.2G[e.1k.6R],t[e.te]=e.2G[e.1k.6v],t[e.tf]=e.2G[e.1k.6x],t[e.lM]=e.2G[e.1k.4N],t[e.lN]=e.2G[e.1k.3H],t[e.ti]=e.2G[e.1k.5j],e.gg=1h e.2h;1w(1c r in e.1k.1r)r<=e.1k.lO&&e.gg.4L(e.1k.1r[r].yI(),r);1w(1c i=0;i<8Z;i++)s(i)?n[i]=!0:n[i]=!1}1b i(t,n){1d t==e.i2||t==e.lM||t==e.lJ?n+1:t==e.lL||t==e.lN||t==e.lK?n-1:n}1b s(t){1d t>=97&&t<=yJ||t>=65&&t<=90||t==e.tk||t==e.tl}1b o(e){1d e>=48&&e<=57}1b u(e){1d n[e]||o(e)}1b a(t){1d t==e.lL?e.i2:t==e.lN?e.lM:t==e.lK?e.lJ:0}1b b(e){1d E(e,!0,!1)}1b w(e,t){1d E(e,!1,t)}1b E(t,n,r){if(!(t.1z<=e.1k.lO))1d!1;1c i=e.eo(t.1z);if(i==2i)1d!1;1c s=e.f4.o2|e.f4.nY;r&&(s|=e.f4.dw);if(n||!e.1s(i.tv,s))1d!0}1b S(e,t){if(t===-1)1d 0;1c n=0,r=e.1n-1;3q(n>1;t0&&(e.2K=r,e.3c=t-n[r])}1b T(e,t){1c n={2K:-1,3c:-1};1d x(n,t,e.2v.5x),n.3c>=0&&n.3c++,n}1b N(e,t,n){1d e.2v.5x[t]+(n-1)}e.f5=-1,e.f8=10,e.lT=13,e.tC=9,e.tD=11,e.tE="e".2L(0),e.tH="E".2L(0),e.tL="x".2L(0),e.tM="X".2L(0),e.nW="a".2L(0),e.tQ="A".2L(0),e.nU="f".2L(0),e.tY="F".2L(0),e.tZ="g".2L(0),e.u0="m".2L(0),e.u1="i".2L(0),e.iH="0".2L(0),e.lW="9".2L(0),e.u4="8".2L(0),e.u6="7".2L(0),e.nP="\\\\".2L(0),e.zM="#".2L(0),e.u8="!".2L(0),e.ub=\'"\'.2L(0),e.ud="\'".2L(0),e.uf="%".2L(0),e.nJ="&".2L(0),e.lJ="(".2L(0),e.lK=")".2L(0),e.lY="+".2L(0),e.lZ="-".2L(0),e.m0="*".2L(0),e.iF="/".2L(0),e.um="^".2L(0),e.tc=",".2L(0),e.f9=".".2L(0),e.nI="<".2L(0),e.6o="=".2L(0),e.ip=">".2L(0),e.tf="?".2L(0),e.i2="[".2L(0),e.lL="]".2L(0),e.Ac="6B".2L(0),e.lM="{".2L(0),e.lN="}".2L(0),e.nA="|".2L(0),e.te="~".2L(0),e.ti=":".2L(0),e.jo=";".2L(0),e.tl="6B".2L(0),e.tk="$".2L(0),e.i7=32,e.gg=2i;1c t=1h 2T(8Z),n=1h 2T(8Z);e.Af=r,e.Ah=i,e.Ai=s,e.Ak=o,e.Al=u,e.Am=a,1b(e){e.1r=[],e.1r[0]="8K",e.8K=0,e.1r[1]="fj",e.fj=1,e.1r[2]="ib",e.ib=2}(e.nz||(e.nz={}));1c f=e.nz;(1b(e){e.1r=[],e.1r[0]="8K",e.8K=0,e.1r[1]="ia",e.ia=1})(e.m6||(e.m6={}));1c l=e.m6;(1b(e){e.1r=[],e.1r[0]="9T",e.9T=0,e.1r[1]="b9",e.b9=1})(e.gt||(e.gt={}));1c c=e.gt;(1b(e){e.1r=[],e.1r[0]="9T",e.9T=0,e.1r[1]="5M",e.5M=1})(e.nx||(e.nx={}));1c h=e.nx,p=1b(){1b e(e){1a.1G=e}1d e.1e.3b=1b(e,t){1d 1a.1G.3e(e,t)},e.1e.aY=1b(){1d 1a.1G.1n},e}();e.gY=p;1c d=1b(){1b e(e,t,n){1a.7J=e,1a.fm=t,1a.cp=n}1d e.1e.2L=1b(e){1d 1a.cp.2L(e-1a.7J)},e.1e.3e=1b(e,t){1d 1a.cp.3e(e-1a.7J,t-1a.7J)},e}();e.AG=d;1c v=1b(){1b e(e,t){1a.6z=e,1a.eb=t}1d e.1e.2L=1b(e){1d 1a.6z.7J<=e&&e<1a.6z.fm?1a.6z.cp.2L(e-1a.6z.7J):1a.eb.cp.2L(e-1a.eb.7J)},e.1e.3e=1b(e,t){1d 1a.6z.7J<=e&&t<=1a.6z.fm?1a.6z.cp.3e(e-1a.6z.7J,t-1a.6z.7J):1a.eb.cp.3e(e-1a.eb.7J)+1a.6z.cp.3e(0,t-1a.6z.7J)},e}();e.AK=v;1c m=1b(){1b t(e){1a.nw=e,1a.8A=1h v(t.nu,t.nu),1a.9u=1a.nw.aY()}1d t.nu=1h d(0,0,""),t.1e.cI=1b(e,t){1d e>=t?e:t},t.1e.p4=1b(e,t){1d e<=t?e:t},t.1e.nr=1b(t,n){if(1a.8A.6z.7J<=t&&n<=1a.8A.6z.fm)1d 1a.8A.6z;if(1a.8A.eb.7J<=t&&n<=1a.8A.6z.fm)1d 1a.8A;1c r=1a.8A.6z,i=r.fm,s=e.cI(i+bY,n);s=e.p4(s,1a.9u);1c o=1a.nw.3b(i,s),u=1h d(i,s,o);1d 1a.8A.eb=r,1a.8A.6z=u,1a.8A},t.1e.2L=1b(e){1d 1a.nr(e,e+1).2L(e)},t.1e.3e=1b(e,t){1d 1a.nr(e,t).3e(e,t)},t}();e.AW=m;1c g=1b(){1b t(){1a.me=1g,1a.aT=1g,1a.mg=1g,1a.me=1g,1a.nq=0,1a.v7=1h 2T,1a.cU=1,1a.2K=1,1a.3c=0,1a.bO=l.8K,1a.6j=1h 2T}1d t.1e.od=1b(){1d 1a.me},t.1e.Bb=1b(){1a.nq=0},t.1e.va=1b(t,n){1a.v7[1a.nq++]=1h e.vb(t,n.1X,n.1F)},t.1e.1N=1b(){1a.cd=1a.2K,1a.1X=1a.3c;if(1a.a2==1a.9v.1n){if(!(1a.2K<1a.5x.1n))1d e.2G[e.1k.5I];1a.2K++,1a.3c=0,1a.a2=0,1a.9v=1a.nm[1a.2K]}if(1a.a2<1a.9v.1n){1a.me=1a.aT.1m,1a.mg=1a.aT,1a.aT=1a.9v[1a.a2++];1c t=1a.aT.1m;1d 1a.1F=1a.aT.1x,1a.3c+=1a.aT.1x-1a.aT.1u,1a.1X=1a.aT.1u,1a.cU=1a.2K,t}1d e.2G[e.1k.5I]},t.1e.Bz=1b(e){1a.2K=S(1a.5x,e),1a.a2=0;1c t=e-1a.5x[1a.2K];3q(1a.BJ[1a.2K]==l.ia&&1a.2K>0)1a.2K--,t=0;1c n=1a.5x.1n-1;1a.9v=1a.nm[1a.2K];3q(1a.9v.1n==0&&1a.2K1a.9v[1a.a2].1x)1a.a2++;if(1a.a2<1a.9v.1n)1d 1a.3c=1a.9v[1a.a2].1u,1a.3c+1a.5x[1a.2K]}1d-1},t.1e.3a=1b(){1d 1a.mg!==1g?1a.mg.1x:0},t.1e.bl=1b(){1d 1a.cU!=1a.cd},t.1e.mi=1b(e){1a.6j.4b(e)},t.1e.kH=1b(){1c e=1a.6j;1d 1a.6j=[],e},t.1e.oX=1b(e){1c t=1g;3q(1a.6j.1n>0&&1a.6j[0].2K==e)t==1g?t=[1a.6j.mj()]:t=t.4E([1a.6j.mj()]);1d t},t.1e.lD=1b(){1a.6j=[]},t.1e.gu=1b(e,t){},t}();e.BY=g;1c y=1b(){1b i(){1a.cU=1,1a.2K=1,1a.3c=0,1a.1F=0,1a.1X=0,1a.9u=0,1a.5x=[],1a.ch=e.f5,1a.bO=l.8K,1a.8x=c.b9,1a.fw=!0,1a.8g=!1,1a.bR=0,1a.4U=0,1a.4R=0,1a.6j=1h 2T,1a.ml=1g,1a.fE=e.2G[e.1k.5I],1a.ni=1a.3c,1a.cd=1a.2K,1a.5x[1]=0,e.gg||r()}1d i.1e.od=1b(){1d 1a.fE},i.1e.gu=1b(e,t){1a.8x=t,1a.fw=1a.8x===c.9T,1a.1F=0,1a.bR=0,1a.1X=0,1a.2K=1,1a.3c=0,1a.ni=1a.3c,1a.cd=1a.2K,1a.9u=0,1a.5H=e.3b(0,e.aY()),1a.9u=1a.5H.1n,1a.5x=[],1a.5x[1]=0,1a.6j=[],1a.4U=0,1a.4R=0},i.1e.Ca=1b(e){1a.ml=e},i.1e.vw=1b(e,t){1a.gu(1h p(e),t)},i.1e.Cc=1b(e){1a.fw=e},i.1e.Cd=1b(){1d 1a.bO},i.1e.Ce=1b(t,n){1a.bO=n;1c r=1h 2T;1a.vw(t,c.9T);1c i=1a.1N();3q(i.1z!=e.1k.5I)r[r.1n]=i,i=1a.1N();1d r},i.1e.dy=1b(){1a.1X=1a.1F,1a.cd=1a.2K,1a.ni=1a.3c,1a.8g=!1},i.1e.aS=1b(){1d 1a.1F<1a.9u?1a.5H.2L(1a.1F):e.f5},i.1e.4J=1b(t){1d t<1a.9u?1a.5H.2L(t):e.f5},i.1e.vB=1b(t){1d t>=e.iH&&t<=e.lW||t>=e.tQ&&t<=e.tY||t>=e.nW&&t<=e.nU},i.1e.vC=1b(t){1d t>=e.iH&&t<=e.u6||t>=e.nW&&t<=e.nU},i.1e.vE=1b(){1c t=!1;1w(;;){if(!1a.vB(1a.ch))1d t?1h e.bI(vG(1a.5H.3e(1a.1X,1a.1F))):1g;1a.3Y(),t=!0}},i.1e.vJ=1b(){1c t=!1;1w(;;){if(!1a.vC(1a.ch))1d t?1h e.bI(vG(1a.5H.3e(1a.1X,1a.1F))):1g;1a.3Y(),t=!0}},i.1e.mr=1b(t){1c n=!1,r=1a.1F,i=1a.3c;1w(;;)if(o(1a.ch))n=!0,1a.3Y();1y if(1a.ch==e.f9){if(t!=f.8K)1d n?1h e.bI(he(1a.5H.3e(1a.1X,1a.1F))):(1a.1F=r,1a.3c=i,1g);1a.3Y(),t=f.fj}1y if(1a.ch==e.tE||1a.ch==e.tH)if(t==f.8K){if(!n)1d 1a.1F=r,1a.3c=i,1g;n=!1,1a.3Y(),t=f.ib}1y{if(t!=f.fj)1d n?1h e.bI(he(1a.5H.3e(1a.1X,1a.1F))):(1a.1F=r,1a.3c=i,1g);1a.3Y(),t=f.ib,n=!1}1y{if(1a.ch!=e.lY&&1a.ch!=e.lZ)1d n?1h e.bI(he(1a.5H.3e(1a.1X,1a.1F))):(1a.1F=r,1a.3c=i,1g);if(t!=f.ib)1d t==f.fj?1h e.bI(he(1a.5H.3e(1a.1X,1a.1F))):n?1h e.bI(he(1a.5H.3e(1a.1X,1a.1F))):(1a.1F=r,1a.3c=i,1g);if(!!n)1d 1a.1F=r,1a.3c=i,1g;1a.3Y()}},i.1e.vP=1b(){if(1a.aS()!=e.iH)1d 1a.mr(f.8K);3S(1a.4J(1a.1F+1)){1t e.tL:1t e.tM:1d 1a.5g(2),1a.vE();1t e.u4:1t e.lW:1t e.f9:1d 1a.mr(f.8K);4G:1d 1a.vJ()}},i.1e.vT=1b(){1d 1a.mr(f.fj)},i.1e.n6=1b(){1a.3c=0,1a.8x==c.b9&&(1a.2K++,1a.5x[1a.2K]=1a.1F+1)},i.1e.n4=1b(){1c t;1a.bO=l.ia;3q(1a.1F<1a.9u){if(1a.ch==e.m0){t=1a.4J(1a.1F+1);if(t==e.iF)1d 1a.5g(2),1a.8x==c.b9&&1a.dy(),1a.bO=l.8K,!0}1y if(1a.ch==e.f8){1a.n6();if(1a.8x==c.9T)1d 1a.3Y(),!1}1a.3Y()}1d!1},i.1e.mi=1b(e){1a.6j.4b(e)},i.1e.kH=1b(){1c e=1a.6j;1d 1a.6j=[],e},i.1e.oX=1b(e){1c t=1g;3q(1a.6j.1n>0&&1a.6j[0].2K==e)t==1g?t=[1a.6j.mj()]:t=t.4E([1a.6j.mj()]);1d t},i.1e.lD=1b(){1a.6j=[]},i.1e.dC=1b(t){1d t==e.f8||t==e.lT||t==vX||t==vY},i.1e.vZ=1b(){3q(1a.1F<1a.9u){if(1a.dC(1a.ch))1B;1a.3Y()}1a.8x==c.b9&&1a.dy()},i.1e.CQ=1b(){1d 1a.5H.3e(1a.1X,1a.1F)},i.1e.w0=1b(){1c t=1a.1F,n=1a.5H.2L(t),r=0,i=!1;3q(!1a.dC(n)&&t<1a.9u){if(n==e.iF&&!i)1d t;r=n,t++,i?i=!1:i=r==e.nP,n=1a.5H.2L(t)}1d-1},i.1e.w2=1b(){if(e.7Z[1a.fE.1z]!=2i)1d 1g;1c t=1a.1F,n=1a.3c,r=1a.w0();if(r>0){1c i=1a.5H.3e(t,r),s="";1a.1F=r+1,1a.ch=1a.aS();1c o=1a.1F;3q(1a.ch==e.u1||1a.ch==e.tZ||1a.ch==e.u0)1a.3Y();if(1a.1F-o>3)1d 1g;s=1a.5H.3e(o,1a.1F);1c u=2i;9Y{u=1h hB(i,s)}7X(a){}if(u)1d 1a.3c=n+(1a.1F-1a.1X),1h e.w7(u)}1d 1a.1F=t,1a.3c=n,1g},i.1e.bl=1b(){1d 1a.cU!=1a.cd},i.1e.3a=1b(){1d 1a.8g?1a.bR:1a.1X},i.1e.5g=1b(e){1a.1F+=e,1a.3c+=e,1a.ch=1a.aS()},i.1e.3Y=1b(){1a.1F++,1a.3c++,1a.ch=1a.aS()},i.1e.1N=1b(){if(1a.bO==l.ia&&1a.fw){1a.ch=1a.aS();1c t=1a.2K;1a.n4();if(1a.1X<1a.1F){1c n=1a.5H.3e(1a.1X,1a.1F);1d 1a.dy(),1h e.mv(e.1k.7W,n,!0,1a.1X,t,!0)}1d e.2G[e.1k.5I]}1d 1a.cU=1a.2K,1a.fE=1a.wd(),1a.ml&&1a.ml.va(1a.fE,1a),1a.fE},i.1e.wd=1b(){1c r;1a.dy(),1a.ch=1a.aS();3q(1a.1F<1a.9u){if(n[1a.ch]){do 1a.3Y();3q(n[1a.ch]||o(1a.ch));1c i=1a.5H.3e(1a.1X,1a.1F),s;1d(s=e.gg.4r(i))!=1g?e.2G[s]:1h e.n3(e.1k.3j,i)}if(1a.ch==e.i7){1a.8g||(1a.bR=1a.1F);do 1a.3Y();3q(1a.ch==e.i7);if(1a.8x==c.9T){1c u=1a.5H.3e(1a.1X,1a.1F);1d 1h e.rb(e.1k.dh,u)}1a.dy(),1a.8g=!0}1y if(1a.ch==e.iF){1a.3Y();1c a;if(1a.ch==e.iF){1a.8g||(1a.bR=1a.1F-1);1c f=1a.1F-1,l=1a.2K;1a.vZ();1c a=1a.5H.3e(f,1a.1F),h=1h e.mv(e.1k.7W,a,!1,f,l,!1);if(1a.fw)1d 1a.1X=f,h;1a.mi(h),1a.8g=!0}1y{if(1a.ch!=e.m0){1c d=1a.w2();1d d?d:1a.4J(1a.1F)==e.6o?(1a.3Y(),e.2G[e.1k.bc]):e.2G[e.1k.aC]}1a.8g||(1a.bR=1a.1F-1);1c f=1a.1F-1,l=1a.2K;1a.3Y(),1a.n4();1c a=1a.5H.3e(f,1a.1F),p=1a.aS()==e.f8||1a.aS()==e.lT,h=1h e.mv(e.1k.7W,a,!0,f,l,p);if(1a.fw)1d 1a.1X=f,h;1a.mi(h),1a.8g=!0}}1y{if(1a.ch==e.jo)1d 1a.3Y(),e.2G[e.1k.2R];if(1a.ch==e.ud||1a.ch==e.ub){1c v=1a.ch,m=0,g=!1;do m=1a.ch,g?g=!1:g=m==e.nP,1a.3Y();3q(1a.ch!=e.f5&&(g||1a.ch!=v));1d 1a.ch!=e.f5&&1a.3Y(),1h e.n3(e.1k.6a,1a.5H.3e(1a.1X,1a.1F))}if(t[1a.ch]){1c y=t[1a.ch];1d y.1z==e.1k.4N?1a.4U++:y.1z==e.1k.3H&&1a.4R++,1a.3Y(),y}if(1a.ch>=e.iH&&1a.ch<=e.lW)1d r=1a.vP(),r?r:(1a.3Y(),e.2G[e.1k.2k]);3S(1a.ch){1t e.tC:1t e.tD:1a.8g||(1a.bR=1a.1F);if(1a.8x==c.9T){do 1a.3Y();3q(1a.ch==e.i7||1a.ch==9);1c b=1a.5H.3e(1a.1X,1a.1F);1d 1h e.rb(e.1k.dh,b)}1a.8g=!0;1t De:1t Df:1t Dh:1t Dj:1t Dk:1t vX:1t vY:1t e.f8:1t e.lT:if(1a.ch==e.f8){1a.n6();if(1a.8x==c.9T)1d e.2G[e.1k.5I]}1a.8g||(1a.bR=1a.1F),1a.3Y(),1a.dy(),1a.8g=!0;1B;1t e.f9:1d 1a.4J(1a.1F+1)==e.f9?1a.4J(1a.1F+2)==e.f9?(1a.5g(3),e.2G[e.1k.gL]):(1a.3Y(),e.2G[e.1k.4H]):(1a.3Y(),r=1a.vT(),r?r:e.2G[e.1k.4H]);1t e.6o:1d 1a.4J(1a.1F+1)==e.6o?1a.4J(1a.1F+2)==e.6o?(1a.5g(3),e.2G[e.1k.aQ]):(1a.5g(2),e.2G[e.1k.EQ]):1a.4J(1a.1F+1)==e.ip?(1a.5g(2),e.2G[e.1k.a5]):(1a.3Y(),e.2G[e.1k.2S]);1t e.u8:1d 1a.4J(1a.1F+1)==e.6o?1a.4J(1a.1F+2)==e.6o?(1a.5g(3),e.2G[e.1k.aN]):(1a.5g(2),e.2G[e.1k.my]):(1a.3Y(),e.2G[e.1k.ik]);1t e.lY:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.ap]):1a.4J(1a.1F+1)==e.lY?(1a.5g(2),e.2G[e.1k.bh]):(1a.3Y(),e.2G[e.1k.7z]);1t e.lZ:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.bf]):1a.4J(1a.1F+1)==e.lZ?(1a.5g(2),e.2G[e.1k.bV]):(1a.3Y(),e.2G[e.1k.ao]);1t e.m0:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.ba]):(1a.3Y(),e.2G[e.1k.mz]);1t e.uf:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.b7]):(1a.3Y(),e.2G[e.1k.mA]);1t e.nI:1d 1a.4J(1a.1F+1)==e.nI?1a.4J(1a.1F+2)==e.6o?(1a.5g(3),e.2G[e.1k.b1]):(1a.5g(2),e.2G[e.1k.az]):1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.mB]):(1a.3Y(),e.2G[e.1k.hj]);1t e.ip:1d 1a.4J(1a.1F+1)==e.ip?1a.4J(1a.1F+2)==e.6o?(1a.5g(3),e.2G[e.1k.b0]):1a.4J(1a.1F+2)==e.ip?1a.4J(1a.1F+3)==e.6o?(1a.5g(4),e.2G[e.1k.9S]):(1a.5g(3),e.2G[e.1k.aG]):(1a.5g(2),e.2G[e.1k.b4]):1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.mC]):(1a.3Y(),e.2G[e.1k.eI]);1t e.um:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.b3]):(1a.3Y(),e.2G[e.1k.8T]);1t e.nA:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.ab]):1a.4J(1a.1F+1)==e.nA?(1a.5g(2),e.2G[e.1k.aX]):(1a.3Y(),e.2G[e.1k.a3]);1t e.nJ:1d 1a.4J(1a.1F+1)==e.6o?(1a.5g(2),e.2G[e.1k.9N]):1a.4J(1a.1F+1)==e.nJ?(1a.5g(2),e.2G[e.1k.aU]):(1a.3Y(),e.2G[e.1k.a9]);4G:1d e.2G[e.1k.5I]}}}1d e.2G[e.1k.5I]},i}();e.pg=y,e.cO=b,e.5z=w,e.DD=S,e.dn=x,e.DE=T,e.DH=N})(2c||(2c={}));1c 2c;(1b(e){1b n(t,n,r,i,s){1c o=1h e.mD(1g,n.2b,t);o.3N=r,o.9B=i,o.af=s,n.2b=o}1b r(e){e.2b=e.2b.8Y}1b i(e,t){1d e==1g||!e.dT()?t:e}1b s(e){1d e.dT()}1b u(t,r){1c i=t,s=1g,o=1g;i.1C&&i.5c&&(i.1C.2z=i.5c.1A);1c u=i.5c;if(!u)1d;s=1h e.fI(u.1p,u.5E,u.4M,u.4f,u.1A),u.2W=s,r.fL.4b(i),r.2F.1j.4B=i,o=1h e.bH(u.1A),o.8f(s),o.8f(r.2b.2a),n(o,r,1g,1g,1g),u.3v=o,u.1A&&r.2F.gE(u.3v,u.1A,i.bG,u.1p.cK,!0)}1b a(t,r){1c i=t,s=1g,o=1g;i.1C&&i.1i&&(i.1C.2z=i.1i.1A);1c u=t.1i;if(u){1c a=u.1A;s=r.2F.1j.gv(u),o=1h e.bH(u.1A),o.8f(s),o.8f(r.2b.2a),u.3v=o,u.2W=s;1c f=u.3i;s=r.2F.1j.gv(f),f.2W=s,o=1h e.bH(f.1A),o.8f(r.2b.2a),n(o,r,f,u,1g),f.3v=o}1y t.1i=r.2F.1Q}1b f(t,r){1c i=t,s=1g,o=1g;i.1C&&i.1i&&(i.1C.2z=i.1i.1A);1c u=t.1i;s=r.2F.1j.gv(u),u.2W=s,o=1h e.bH(u.1A),o.8f(s),o.8f(r.2b.2a),n(o,r,1g,1g,1g),u.3v=o}1b l(t,r){1c i=t,s=i.1i,o=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),u=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),s=1h e.3z,a=1h e.vF(i.1u,r.2F.1j.2v.3d,s);s.1p=o,s.5E=u,s.1A=a,s.ah(),i.1i=s;1c f=1h e.ai(s.1p,s.5E,1g,1g,r.2b.2a,s.1A);n(f,r,1g,1g,1g),s.3v=f}1b c(t,r){1c i=t,s=1g,o=1g;i.1i&&(o=t.1i.1A);1c u=e.1s(i.1S,e.1O.3x),a=u&&r.2b.af!=1g,f=a?r.2b.af.1i.2W:r.2b.2a;if(r.2b.3N&&(!i.3p||e.1s(i.1S,e.1O.6U))){1c l=r.2b.3N;!(l.4V&e.4w.i4)&&!e.1s(i.1S,e.1O.6U)?!i.4T()||u?f=l.aM:f=l.3v:r.2b.8Y.2a.1R&&r.2b.8Y.2a.1R.1E&&r.2b.8Y.2a.1R.1E.1o==e.1f.2t&&r.2b.8Y.2a.1R.1E.3p?f=l.aM:u&&r.2b.9B?f=r.2b.9B.3v:f=l.3v,s=l.1A}1y i.3p&&r.2b.3N&&(s=r.2b.3N.1A);if(i.1i==1g||e.1s(i.1i.1A.1M,e.2j.qg)){r.2b.af&&r.2b.af.1i&&(s=r.2b.af.1i.1A);1c c=1g,h=r.2b.af,p=i.1C?i.1C.1G:1g,d=1g;u?(h.1i.1p==1g&&s.2N().2W&&(h.1i.1p=s.1i.2W.4p),c=r.2b.af.1i.2W,h.fZ[h.fZ.1n]=i):!i.3p&&s&&s.1E&&s.1E.1o==e.1f.2t&&s.1E.3p&&!i.4T()?c=r.2b.3N.aM:c=r.2b.2a,p&&p!="p6"&&!i.4y()&&(u?d=c.6n(p,!1,!1):d=c.6n(p,!1,!1)),r.2F.1j.cu(i,s,c,d,d==1g);if(!i.7k&&i.1S&e.1O.6U&&s&&(!d||d.1E.1o!=e.1f.2t)&&i.4y()||d&&d.4y())i.7k=r.2F.1j.mH(i,d,s.2N(),i.4T()&&u,!0,c,s);i.1i.1A.1M|=e.2j.qg}i.1C&&i.1i&&(i.1C.2z=i.1i.1A),i.iD=i.1i;if(i.6Z)1d;1c v=1h e.2h,m=1h e.4a(1h e.3M(v,1h e.2h)),g=1h e.2h,y=1h e.4a(1h e.3M(g,1h e.2h)),b=1h e.2h,w=1h e.4a(1h e.3M(b,1h e.2h)),E=1h e.2h,S=1h e.4a(1h e.3M(E,1h e.2h));i.3d=r.2F.1j.2v.3d;1c x=1h e.ai(m,y,1g,1g,f,o),T=1h e.ai(w,S,1g,1g,f,1g);i.3p&&r.2b.3N&&(r.2b.3N.aM=x),i.fP=v;if(!i.aO()){1c N=i.1i,C=i.3F;i.3p||(N.3v=x,x.1R=N.1A,N.2W=T,T.1R=N.1A),i.g2=r.2b.af,N.9E=u?r.2b.9B:r.2b.3N;1c d=t.1i.1A;(i.1S&e.1O.7F)==e.1O.1q&&i.bG&&(r.2F.gE(x,d,i.bG,v,!1),r.2F.gE(T,d,i.c8,b,!1));if(C.2r){1c k=C.2r.1n;1w(1c L=0;L=1&&(s.2F.1j.4B=s.fL[s.fL.1n-1])}1y if(t.1o==e.1f.4K)r(s);1y if(t.1o==e.1f.5h)r(s);1y if(t.1o==e.1f.9K)r(s);1y if(t.1o==e.1f.2t){1c a=t;(!a.3p||e.1s(a.1S,e.1O.6U))&&!a.6Z&&r(s)}1y if(t.1o==e.1f.6l){1c f=t;f.6M&&r(s)}1y o=!1;1d i.2o.4s=o,t}1c t=1b(){1b e(e,t,n){1a.2b=e,1a.2F=t,1a.fL=n}1d e}();e.x3=t,e.EG=n,e.EH=r,e.EI=i,e.EL=s;1c o=1b(){1b e(e,t){1a.x4=e,1a.x5=t,1a.aK=1g}1d e.1e.mV=1b(){1a.aK=1g},e.1e.fQ=1b(e){1d 1a.aK=1a.x4(1a.aK,e),1a.aK?1a.x5(1a.aK):!1},e}();e.EX=o,e.mS=1h o(i,s),e.EZ=u,e.F0=a,e.F2=f,e.F6=l,e.F9=c,e.Fb=h,e.xd=p,e.xe=d})(2c||(2c={}));1c 2c;(1b(e){1b i(t,n,r){1c i=r.5o;1d e.1s(t.1M,i.xf)&&(i.1F<0||i.1F==t.1x)&&(i.3I=t,t.1i==1g&&i.1F>=0&&i.xg.xh(t,i.2a),i.1i=t.1i,i.2o.l9()),t}1b s(t,n,r,i,s,o,u,a,f){1c l=1h e.ai(n,r,i,s,1g,t),c=1h e.mD(t,o.2b,l);c.3N=u,c.9B=a,c.5G=f,o.2b=c}1b o(e){e.2b=e.2b.8Y}1b u(t,n,r){1c i=r.5o,s=t.1u,o=t.1x;t.1o==e.1f.6Y&&i.1F>o&&(o=i.1F);if(s<=i.1F&&o>=i.1F){3S(t.1o){1t e.1f.6Y:1c u=t;i.bL=1b(){1d u.3C===1g?1g:u.3C.kj},i.5Y=u;1B;1t e.1f.4K:i.bL=1b(){1d t.1i===1g||t.1i.3i.3v===1g?1g:t.1i.3i.3v},i.5Y=t,i.fX=t;1B;1t e.1f.7c:1c a=t;a.gT&&(i.bL=1b(){1d a.gT.3v},i.mQ=1b(){1d a.gT.2W},i.mO=a);1B;1t e.1f.4h:i.p2=t,i.bL=1b(){1d t.1i===1g?1g:t.1i.3v},i.5Y=t;1B;1t e.1f.5h:i.bL=1b(){1d t.1i===1g?1g:t.1i.3v},i.5Y=t;1B;1t e.1f.2t:1c f=t;i.mP?i.mP=!1:(i.bL=1b(){1d f.3p&&e.1s(f.1S,e.1O.6U)&&t.1i&&t.1i.9E?t.1i.9E.aM:f.iD?f.iD.3v:f.1i?f.1i.3v:1g},i.5Y=t)}r.2o.4s=!0}1y r.2o.4s=!1;1d t}1b a(t,n,i,s,o){1c a=1h r(t,n,i,s,o);1d e.6f().2d(n,u,1g,1g,a),a.5Y===1g?1g:a}1c t=1b(){1b e(e,t){1a.2b=e,1a.1j=t,1a.aR=1g}1d e}();e.xL=t;1c n=1b(){1b t(t,n,r){1a.xg=t,1a.1F=n,1a.xf=r,1a.1i=1g,1a.3I=1g,1a.2o=1h e.oB}1d t}();e.xO=n;1c r=1b(){1b t(e,t,n,r,i){1a.3n=e,1a.aR=t,1a.1G=n,1a.1F=r,1a.fY=i,1a.bL=1g,1a.mQ=1g,1a.5Y=1g,1a.mP=!1,1a.p2=1g,1a.fX=1g,1a.mO=1g,1a.mL=!0,1a.xT=!1}1d t.1e.g0=1b(){1d 1a.bL()},t.1e.xV=1b(){1d 1a.mQ()},t.1e.yE=1b(){1d 1a.5Y},t.1e.yG=1b(){1d 1a.5Y.1u},t.1e.mT=1b(){1d 1a.5Y},t.1e.y1=1b(){1d 1a.mT().1u},t.1e.y2=1b(){if(1a.mU==1g){1c t=1a.mT(),n=t.1u,r=1a.fY?1a.1F:1a.1F+1;1a.mU=e.gZ(1a.3n,t,1a.1G,n,r,1g).6Y}1d 1a.mU},t}();e.yL=r,e.y5=i,e.mJ=s,e.mG=o,e.yR=u,e.mX=a})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b t(){1a.5Z=!1,1a.2r=1g,1a.1E=1g,1a.4d=e.5t.aD,1a.6r=0}1d t.1e.6m=1b(n,r,i){1c s=1h t;1a.5Z&&(s.5Z=!0),s.2J=1h e.7p,1a.2J.1i?s.2J.1i=1a.2J.1i.6m(n,r,i,!1):s.2J.1i=i.1Q;if(1a.2r){s.2r=[];1w(1c o=0,u=1a.2r.1n;o1&&(n=!1);1w(1c o=0;o1&&1a.2e[o]==1a.dz)3P;1a.1M&e.8C.qX?i[o]=1a.2e[o].mw(n,!0,r):i[o]=t+1a.2e[o].mw(n,!1,r)}1d i},t.1e.6m=1b(e,n,r){1c i=1h t;if(1a.2e)1w(1c s=0,o=1a.2e.1n;s0)1w(1c r=0;r0){1w(1c s=0;s=n.1E.1x:!1}1b r(e,t){3q(e.1R){if(e==t||n(e.1R,t))1d!0;e=e.1R}1d!1}(1b(e){e.1r=[],e.1r[0]="aD",e.aD=0,e.1r[1]="aA",e.aA=1,e.1r[2]="8n",e.8n=2})(e.5t||(e.5t={}));1c t=e.5t;e.zv=n,e.zw=r;1c i=1b(){1b t(t,n,r){1a.1C=t,1a.c1=n,1a.3d=r,1a.qV=!1,1a.1M=e.2j.1q,1a.qw=!1,1a.1E=1g,1a.5D=1g,1a.zx=e.6w.hd}1d t.1e.nb=1b(){1d 1g},t.1e.dP=1b(){1d!1},t.1e.f1=1b(){1d!1},t.1e.dX=1b(){1d!1},t.1e.rq=1b(){1d!1},t.1e.hC=1b(){1d!1},t.1e.8l=1b(){1d!1},t.1e.2N=1b(){1d 1g},t.1e.4y=1b(){1d!1},t.1e.dT=1b(){1d e.1s(1a.1M,e.2j.3k)&&!e.1s(1a.1M,e.2j.9r)},t.1e.3Q=1b(e){1d 1a.5v()},t.1e.g5=1b(){1d e.1s(1a.1M,e.2j.9w)?"?":""},t.1e.nd=1b(){1c t=1h 2T,n=1a;3q(n&&n.1C!=e.f0)t[t.1n]=n,n=n.1R;1d t},t.1e.ne=1b(e){if(1a.1R==1g)1d 1h 2T;1c t=1a.1R.nd(),n;e?n=e.nd():n=1h 2T;1c r=-1;1w(1c i=0,s=t.1n;i=0)1B}1d r>=0?t.ru(0,r):t},t.1e.nf=1b(e){if(e==1g)1d 1a.1C;1c t=1a.ne(e.1R),n="";1w(1c r=0,i=t.1n;r>=",e.1v.3U),s(t.9S,r.1q,n.2S,e.1f.9S,n.1D,e.1f.1q,">>>=",e.1v.3U),s(t.6x,r.1q,n.nK,e.1f.6x,n.1D,e.1f.1q,"?",e.1v.3U),s(t.5j,r.1q,n.1D,e.1f.1q,n.1D,e.1f.1q,":",e.1v.5j),s(t.aX,r.1q,n.nL,e.1f.aX,n.1D,e.1f.1q,"||",e.1v.3U),s(t.aU,r.1q,n.nM,e.1f.aU,n.1D,e.1f.1q,"&&",e.1v.3U),s(t.a3,r.1q,n.nN,e.1f.a3,n.1D,e.1f.1q,"|",e.1v.3U),s(t.8T,r.1q,n.8T,e.1f.8T,n.1D,e.1f.1q,"^",e.1v.3U),s(t.a9,r.1q,n.nO,e.1f.a9,n.1D,e.1f.1q,"&",e.1v.3U),s(t.EQ,r.1q,n.g3,e.1f.Eq,n.1D,e.1f.1q,"==",e.1v.3U),s(t.my,r.1q,n.g3,e.1f.h8,n.1D,e.1f.1q,"!=",e.1v.3U),s(t.aQ,r.1q,n.g3,e.1f.aQ,n.1D,e.1f.1q,"===",e.1v.3U),s(t.aN,r.1q,n.g3,e.1f.aN,n.1D,e.1f.1q,"!==",e.1v.3U),s(t.hj,r.1q,n.cA,e.1f.gr,n.1D,e.1f.1q,"<",e.1v.3U),s(t.mB,r.1q,n.cA,e.1f.gm,n.1D,e.1f.1q,"<=",e.1v.3U),s(t.eI,r.1q,n.cA,e.1f.ge,n.1D,e.1f.1q,">",e.1v.3U),s(t.mC,r.1q,n.cA,e.1f.iy,n.1D,e.1f.1q,">=",e.1v.3U),s(t.az,r.1q,n.gp,e.1f.az,n.1D,e.1f.1q,"<<",e.1v.3U),s(t.b4,r.1q,n.gp,e.1f.b4,n.1D,e.1f.1q,">>",e.1v.3U),s(t.aG,r.1q,n.gp,e.1f.aG,n.1D,e.1f.1q,">>>",e.1v.3U),s(t.7z,r.1q,n.7z,e.1f.7z,n.8y,e.1f.co,"+",e.1v.gB),s(t.ao,r.1q,n.7z,e.1f.ao,n.8y,e.1f.ci,"-",e.1v.gB),s(t.mz,r.1q,n.aq,e.1f.aq,n.1D,e.1f.1q,"*",e.1v.3U),s(t.aC,r.1q,n.aq,e.1f.aC,n.1D,e.1f.1q,"/",e.1v.3U),s(t.mA,r.1q,n.aq,e.1f.hO,n.1D,e.1f.1q,"%",e.1v.3U),s(t.6v,r.1q,n.1D,e.1f.1q,n.8y,e.1f.da,"~",e.1v.cZ),s(t.ik,r.1q,n.1D,e.1f.1q,n.8y,e.1f.fK,"!",e.1v.cZ),s(t.bh,r.1q,n.1D,e.1f.1q,n.8y,e.1f.fu,"++",e.1v.cZ),s(t.bV,r.1q,n.1D,e.1f.1q,n.8y,e.1f.fq,"--",e.1v.cZ),s(t.3y,r.1q,n.1D,e.1f.1q,n.1D,e.1f.1q,"(",e.1v.3y),s(t.7B,r.1q,n.1D,e.1f.1q,n.1D,e.1f.1q,"[",e.1v.7B),s(t.4H,r.1q,n.8y,e.1f.1q,n.1D,e.1f.1q,".",e.1v.4H),s(t.5I,r.1q,n.1D,e.1f.1q,n.1D,e.1f.1q,"<5I>",e.1v.5I),s(t.a5,r.1q,n.1D,e.1f.1q,n.1D,e.1f.1q,"=>",e.1v.1q),e.eo=o,1b(e){e.1r=[],e.1r[0]="nS",e.nS=0,e.1r[1]="hc",e.hc=1,e.1r[2]="h5",e.h5=2,e.1r[3]="7W",e.7W=3,e.1r[4]="dh",e.dh=4,e.1r[5]="3R",e.3R=5,e.1r[6]="aP",e.aP=6}(e.nT||(e.nT={}));1c u=e.nT,a=1b(){1b e(e,t,n){1a.1m=e,1a.1u=t,1a.1x=n}1d e}();e.vb=a;1c f=1b(){1b n(e){1a.1z=e}1d n.1e.5v=1b(){1d"Bx: "+1a.1z+" "+1a.3b()+" ("+t.1r[1a.1z]+")"},n.1e.6E=1b(e,t){t.3D(1a.5v()+",on 2K"+e)},n.1e.3b=1b(){1d e.a8[1a.1z].1G},n.1e.fN=1b(){if(1a.1z<=t.lO)1d u.hc;1c n=o(1a.1z);if(n!=2i)if(n.eO!=e.1f.1q||n.eP!=e.1f.1q)1d u.h5;1d u.nS},n}();e.BB=f;1c l=1b(e){1b n(n){e.1K(1a,t.7w),1a.4k=n}1d 2B(n,e),n.1e.3b=1b(){1d 1a.4k.5v()},n.1e.fN=1b(){1d u.aP},n}(f);e.bI=l;1c c=1b(e){1b n(t,n){e.1K(1a,t),1a.4k=n,1a.1z=t}1d 2B(n,e),n.1e.3b=1b(){1d 1a.4k},n.1e.fN=1b(){1d 1a.1z==t.3j?u.3R:u.aP},n}(f);e.n3=c;1c h=1b(e){1b t(t,n){e.1K(1a,t),1a.4k=n,1a.1z=t}1d 2B(t,e),t.1e.3b=1b(){1d 1a.4k},t.1e.fN=1b(){1d u.dh},t}(f);e.rb=h;1c p=1b(e){1b t(t,n,r,i,s,o){e.1K(1a,t),1a.4k=n,1a.kF=r,1a.1X=i,1a.2K=s,1a.dC=o,1a.BF=t}1d 2B(t,e),t.1e.3b=1b(){1d 1a.4k},t.1e.fN=1b(){1d u.7W},t}(f);e.mv=p;1c d=1b(e){1b n(n){e.1K(1a,t.av),1a.gc=n}1d 2B(n,e),n.1e.3b=1b(){1d 1a.gc.5v()},n.1e.fN=1b(){1d u.aP},n}(f);e.w7=d,e.2G=1h 2T,e.t6=v})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b e(){1a.lV=1g}1d e.1e.ss=1b(e,t){1d 1a.lV==1g&&(1a.lV=e.6m(t.e6.1i,1a.iA.3w,t,!0)),1a.lV},e}();e.BV=t;1c n=1b(){1b t(){1a.nV=!1,1a.1M=e.8V.xI,1a.7E=""}1d t.1e.d9=1b(e){1a.nV?1a.dd(e):1a.7E=1a.7E?e+":\\n "+1a.7E:e},t.1e.dd=1b(e){1a.7E=e},t}();e.ii=n,1b(e){e.1r=[],e.1r[0]="fJ",e.fJ=0,e.1r[1]="ic",e.ic=1}(e.bN||(e.bN={}));1c r=e.bN,i=1b(){1b t(t){1a.1L=t,1a.nZ=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),1a.o0=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),1a.fB=1g,1a.hT=1g,1a.hS=1g,1a.hM=1g,1a.sF=1h e.2h,1a.sG=1h e.2h,1a.sH=1h e.2h,1a.sI=1h e.2h,1a.sJ=!0,1a.5c=1g,1a.4W=1g,1a.e6=1g,1a.lP=1h e.ai(1g,1a.nZ,1g,1a.o0,1g,1g),1a.hK=1h e.3M(1a.sF,1h e.2h),1a.hJ=1h e.3M(1a.sG,1h e.2h),1a.hI=1h e.3M(1a.sH,1h e.2h),1a.hH=1h e.3M(1a.sI,1h e.2h);1c n=1h e.4a(1h e.3M(1a.hK,1h e.2h)),i=1h e.4a(1h e.3M(1a.hI,1h e.2h)),s=1h e.4a(1h e.3M(1a.hJ,1h e.2h)),o=1h e.4a(1h e.3M(1a.hH,1h e.2h));1a.5X=1h e.ai(n,i,s,o,1a.lP,1g),1a.3O=1a.c2(e.7d.9V,"a7"),1a.5B=1a.c2(e.7d.lH,"nR"),1a.6G=1a.c2(e.7d.o6,"cJ"),1a.lP.4f.bJ("cJ",1a.6G.1A),1a.5l=1a.c2(e.7d.hD,"e9"),1a.1Q=1a.c2(e.7d.ft,"8r"),1a.7t=1a.c2(e.7d.9Q,"1g"),1a.6H=1a.c2(e.7d.sV,"2i"),1a.fs(r.fJ),1a.e6=1h e.9I("sX",0,-1,1h e.3z),1a.o0.bJ(1a.e6.1C,1a.e6),1a.5c=1h e.lF(s,o),1a.5c.1p=n,1a.5c.5E=i,1a.5c.3v=1a.5X,1a.4W=1h e.9I(e.f0,0,-1,1a.5c),1a.5c.1p.bJ(1a.4W.1C,1a.4W),1a.sZ("2i",1a.6H)}1d t.1e.c2=1b(t,n){1c r=1h e.3z;r.8Q=t;1c i=1h e.9I(n,0,-1,r);1d i.4d=e.5t.8n,r.1A=i,1a.lP.6W(1g,1g,i,1a.1L,!0,!0,!0),r},t.1e.fs=1b(e){1a.sJ=1a.hK.di=1a.hJ.di=1a.hI.di=1a.hH.di=e==r.fJ},t.1e.t0=1b(){1a.fB=1h e.2h,1a.hT=1h e.2h,1a.hS=1h e.2h,1a.hM=1h e.2h,1a.hK.7m=1a.fB,1a.hJ.7m=1a.hT,1a.hI.7m=1a.hS,1a.hH.7m=1a.hM},t.1e.sZ=1b(t,n){1c r=1h e.7T;r.2H=1h e.7p;1c i=1h e.hW(t,0,-1,r);i.7i(n),i.4d=e.5t.8n,i.1R=1a.4W,1a.nZ.bJ(t,i)},t}();e.t1=i;1c s=1b(){1b e(e,t,n){1a.fr=e,1a.o9=t,1a.lt=n,1a.9Z=1g,1a.CT=1g,1a.oc=1g}1d e}();e.CV=s;1c o=1b(){1b t(e){1a.1j=e,1a.8z=[],1a.8m=!1}1d t.lt=e.5t.8n+1,t.1e.t8=1b(e,n){1a.8z.4b(1h s(e,n,t.lt++)),1a.1j.1L.bi=n},t.1e.t9=1b(){1c e=1a.8z.7a();1d 1a.1j.1L.bi=1a.lm(),1a.8m=1a.8m||e.o9&&1a.1j.1L.sp().1n,1a.1j.1L.sr(),e},t.1e.gR=1b(){1d 1a.8z.1n?1a.8z[1a.8z.1n-1]:1g},t.1e.oi=1b(){1d 1a.8z.1n?1a.8z[1a.8z.1n-1].lt:e.5t.8n},t.1e.lm=1b(){1d 1a.8z.1n?1a.8z[1a.8z.1n-1].o9:!1},t}();e.Dd=o;1c u=1b(){1b n(e){1a.7l=e,1a.1L=1g,1a.ok=!1,1a.ol=!1,1a.om=!1,1a.5r=1g,1a.6e=1g,1a.oo="ko",1a.2v=1g,1a.2F=1g,1a.Dq=1g,1a.Dr=1g,1a.4B=1g,1a.jf=!1,1a.lg=!1,1a.oq=!0,1a.aW=1g,1a.jH=!1,1a.gG=!1,1a.le={},1a.fl={},1a.7Y={},1a.fi=[],1a.3O=1a.7l.3O,1a.5B=1a.7l.5B,1a.5f=1a.7l.6G,1a.5l=1a.7l.5l,1a.1Q=1a.7l.1Q,1a.7t=1a.7l.7t,1a.6H=1a.7l.6H,1a.fB=1a.7l.hK,1a.hT=1a.7l.hJ,1a.hS=1a.7l.hI,1a.hM=1a.7l.hH,1a.wP=1a.7l.5c,1a.4W=1a.7l.4W,1a.e6=1a.7l.e6,1a.5X=1a.7l.5X,1a.8p=1h o(1a)}1d n.1e.tt=1b(e){1a.5r=e},n.1e.ow=1b(e,t){1a.8p.t8(e,t),1a.aW=1a.8p.gR()},n.1e.ox=1b(){1c e=1a.8p.t9();1d 1a.aW=1a.8p.gR(),e},n.1e.8m=1b(){1d 1a.8p.8m},n.1e.la=1b(){1a.8p.gR()||(1a.8p.8m=!1)},n.1e.7P=1b(e,t,n,r){n&&1a.ow(e,1a.8p.lm()||t),1a.2F.1P(r),n&&1a.ox()},n.1e.E3=1b(){1a.aW=1a.8p.gR()},n.1e.oz=1b(){1a.aW=1g,1a.1L.bi=!1},n.1e.fc=1b(){1d 1a.aW&&1a.aW.fr},n.1e.cL=1b(){1d 1a.aW},n.1e.9s=1b(){1d 1a.8p.lm()},n.1e.fa=1b(){1d 1a.9s()?1a.8p.oi():e.5t.8n},n.1e.aw=1b(t){1d t==e.5t.8n||1a.9s()&&t==1a.8p.oi()},n.1e.l8=1b(e){1a.9s()&&(1a.fi[1a.fi.1n]=e)},n.1e.dx=1b(){1w(1c t=0;t<1a.fi.1n;t++)1a.fi[t].4d=e.5t.aD;1a.fi=[]},n.1e.oD=1b(t){if(t.1o==e.1f.6Y){1c n=t;1a.2v=n.2v}1c r=1h e.mD(1a.4W,1g,1a.5X),i=1h e.xL(r,1a);e.6f().2d(t,e.tF,e.tG,1g,i)},n.1e.9x=1b(n){1d n.dE==1g&&(n.dE=1h t,n.dE.iA=1h e.3z,n.dE.iA.3w=n,n.dE.iA.1A=n.1A),n.dE.iA},n.1e.tI=1b(t,n){1c r=1g,i=1g,s=t.1p.1n,o=0,u=[];if(s>0){r=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),i=1h e.ai(r,1g,1g,1g,1g,n);1w(1c a=0;a0;S--)n.1i=1a.9x(n.1i);r&&n.1i==1g&&(n.1i=1a.1Q),n.3I&&(n.3I.1i=n.1i)}},n.1e.oR=1b(e,t){if(e.1n==1)1d{kX:e[0].3F,kV:!1};1c n=e[0],r=1g,i=1g,s=1g,o=1g,u=!1;1w(1c a=1;a=t[f].2r.1n)3P;s=t[f].2r[l].2N(),t[f].1E.8N&&l>=t[f].6r-1&&s.8i()&&(s=s.3w);if(s==1a.1Q)3P;if(n.1p[l].1o==e.1f.2t){if(1a.2F.7n&&s==1a.2F.7n)3P;if(!1a.kI(s,n.1p[l],!0)){if(!1a.kI(s,n.1p[l],!1))1B;1a.2F.1P(n.1p[l]);if(!1a.7C(n.1p[l].1i,s,r))1B}1y{1a.7P(s,!0,!0,n.1p[l]),1a.dx(),a=1a.8m(),1a.7C(n.1p[l].1i,s,r)||(r&&r.dd("eN 2g f3 1i \'"+s.3Q()+"\' to e2 "+(l+1)+", oZ is of 1i \'"+n.1p[l].1i.3Q()+"\'"),o=!0),a&&(u=1a.aW,1a.7P(1g,!0,!0,n.1p[l]),1a.7C(n.1p[l].1i,s)||(o=!0),1a.dx()),1a.la();if(o)1B}}1y if(n.1p[l].1o==e.1f.7c){if(1a.2F.6V&&s==1a.2F.6V)3P;1a.7P(s,!0,!0,n.1p[l]),1a.dx(),a=1a.8m(),1a.7C(n.1p[l].1i,s,r)||(r&&r.dd("eN 2g f3 1i \'"+s.3Q()+"\' to e2 "+(l+1)+", oZ is of 1i \'"+n.1p[l].1i.3Q()+"\'"),o=!0),a&&(1a.7P(1g,!0,!0,n.1p[l]),1a.7C(n.1p[l].1i,s)||(o=!0),1a.dx()),1a.la();if(o)1B}1y if(n.1p[l].1o==e.1f.8X){if(1a.2F.cc&&s==1a.2F.cc)3P;1a.7P(s,!0,!0,n.1p[l]),1a.dx(),a=1a.8m();if(!1a.7C(n.1p[l].1i,s,r)){r&&r.dd("eN 2g f3 1i \'"+s.3Q()+"\' to e2 "+(l+1)+", oZ is of 1i \'"+n.1p[l].1i.3Q()+"\'");1B}a&&(1a.7P(1g,!0,!0,n.1p[l]),1a.7C(n.1p[l].1i,s)||(o=!0),1a.dx()),1a.la();if(o)1B}}l==n.1p.1n&&(i[i.1n]={3F:t[f],8m:a}),a=!1}1d i},n.1e.kI=1b(e,t,n){if(t.7o||t.4T()||n&&t.5m||t.mR)1d!1;n=n||1a.2F.7n==e;if(!n)1d!0;t.3F||(1a.cu(t,1a.2F.2a.1R,1a.2F.2a,1g,1g),1a.2F.1P(t));1c r=t.3F,i=r.2r.1n;1w(1c s=0;s1?!1:!0},n.1e.yu=1b(t,n){if(t==1a.2F.6V)1d!0;1c r=n.2P;if(!r||!t.2W)1d!1;1c i=1g,s=1g,o="",u={};1w(1c a=0;ao&&!n.5Z)1d s&&(s.1M|=e.8V.uT,s.d9("5U 3F yP "+o+" or pd 2r")),!1;1c a=t.2J.1i,f=n.2J.1i;if(f!=1a.3O&&!1a.cq(a,f,r,i,s))1d s&&(s.1M|=e.8V.xK),!1;1c l=u=e.1f.2S&&t.1o<=e.1f.qN){1c a=t;if(a.2l&&a.2l.1o==e.1f.3L){1c l=a.2l;r(l.2z,o)}}1y t.1o==e.1f.2t&&(s.2o.4s=!1);1d t}1c n=1a,r=1b(e,t){if(t.po(e)){1c r=t.pp(e);n.8U[r]=1h 2T,n.km[r]=!0}},i=1b(e,t,r){if(t.po(e)){1c i=t.pp(e);n.8U[i]==2i&&(n.8U[i]=1h 2T);1c s=n.8U[i],o=t.uY(r);t.uZ(i,o),s.4b(o)}},o=1h e.oB;o.es=!0,e.6f().2d(1a.bb.6c,s,1g,o,t)},t.1e.v0=1b(e){1c t=1a.8U.1n,n=e.er.1n;1a.i1=1h i(n);1w(1c r=0;r0)1w(1c o=0,u=s.1n;oe.bC){1a.5n=1h 2T;1c n=m4.ns(1a.dK/e.bC);1w(1c r=0;re},t.1e.v9=1b(){1a.pv++},t.1e.3Z=1b(e){1a.dL[1a.dL.1n]=e,e.b5[e.b5.1n]=1a},t}();e.4Q=s;1c o=1b(){1b t(e,t){1a.2E=e,1a.pw=t,1a.ki=1g,1a.8q=1g,1a.5d=!1,1a.hk=1h 2T,1a.hu=1h 2T,1a.pz=0,1a.e5=1h 2T,1a.ki=1a.2E}1d t.1e.2d=1b(e,t){1d 1a.6O.2d(e,t)},t.1e.rv=1b(e){1a.hu.4b(e)},t.1e.rs=1b(){1d 1a.hu.7a()},t.1e.vf=1b(t){if(1a.8q&&1a.8q.1n>0){1c n=1a.8q.1n;1w(1c r=0;r0){1c o=s.7a();if(!o.iq(i)){o.v9(),e&&e(o);1c u=o.dL.1n;if(u>0){n&&n();1w(1c a=u-1;a>=0;a--){1c f=o.dL[a];f.iq(1a.pz)||(t&&t(o,f),s[s.1n]=f)}r&&r()}}}},t.1e.9j=1b(e,t){1c i=1a,s=1h r;s.mZ=t;1c o=1b(e){e.9j=1h n(e),e.9j.uV(s),i.e5[i.e5.1n]=e};1a.pC(o,1g,1g,1g);1c u,a;1w(u=0,a=1a.e5.1n;u=0&&n.3d<1a.1j.6e.1n?1a.1j.2v=1a.1j.6e[n.3d]:1a.1j.2v=e.n1;3q(f){if(f.4i()==e.4g.3z){1c l=f,c=l.1i;c.1K&&(1a.8G=l.4T);if(c.6P()){1a.3N=c.3i;1B}}f=f.1R}1a.nc(t),1a.2a=a}}1a.2U=r,1a.3N=i,1a.1j.2v=o,1a.8G=s},n.1e.k3=1b(e){if(e.4C)(e.4C.1i==1g||e.4C.1i&&e.4C.1i==1a.1Q&&1a.2a||e.4C.1i.1A==1g||!1a.1j.aw(e.4C.1i.1A.4d))&&1a.1P(e.4C),e.1i=e.4C.1i,e.2z&&e.2z.7i(e.1i);1y if(e.2m==1g){1a.1j.5r.c3&&1a.1j.1L.6D(e,"1i h6 6q to \'8r\'"),e.1i=1a.1Q;if(e.2z){if(e.2z.8l()){1c t=e.2z;if(t.4T){1a.1j.1L.2q(e,"cg 9z eK Ay to 5O. (pH ut uC to 9c \'iE 1b\' vM of \'iE 1c\'?)");1d}1a.1j.1L.2q(e,"cg 9z 1i to 5O");1d}e.2z.7i(e.1i)}}},n.1e.nc=1b(t){1c n=t.2z;if(n==1g)t.2m?(t.2m=1a.1P(t.2m),t.1i=1a.1j.ez(t.2m.1i)):(1a.1j.5r.c3&&1a.1j.1L.6D(t,"1i h6 6q to \'8r\'"),t.1i=1a.1Q);1y if(n.4d==e.5t.aA)1a.1j.5r.c3&&1a.1j.1L.6D(t,"1i h6 6q to \'8r\'"),t.1i=1a.1Q,n.7i(1a.1Q);1y if(n.4d==e.5t.aD){n.4d=e.5t.aA,1a.1j.l8(n);1c r=!1;t.1i==1g&&t.4C&&(1a.k3(t),r=!0,t.1i=t.4C.1i,n.4d=1a.1j.fa());if(t.2m){e.1s(t.1Y,e.1U.2s)&&1a.1j.1L.2q(t,"2s 5O 8u 2g 8h an i6");1c i=e.1s(t.1Y,e.1U.bn),s=1a.2a,o=!t.2m.7o;i&&(1a.2a=t.2z.1R.2N().2W),t.1Y&e.1U.3k&&(1a.hN=!0),1a.1j.7P(t.1i,1a.1j.9s(),o,t.2m),1a.hN&&(1a.hN=!1),1a.2a=s;if(t.1i){1c u=!1,a=1g;t.2m.1i&&(a=t.2m.1i.3v,u=!0,t.2m.1i==1a.3O&&1a.1j.1L.2q(t,"cg vN 1i \'a7\' to 5O \'"+t.id.1G+"\'")),t.2m=1a.hY(t.2m,t.1i,o,!1),u&&t.2m.1i.3v==1g&&(t.2m.1i.3v=a)}1y t.1i=1a.1j.ez(t.2m.1i),t.1i==1a.3O&&(1a.1j.1L.2q(t,"cg vN 1i \'a7\' to 5O \'"+t.id.1G+"\'"),t.1i=1a.1Q);n.7i(t.1i)}1y r||1a.k3(t);n.4d=1a.1j.fa()}1y 1a.1j.aw(n.4d)&&n.1E!=t&&t.2m&&(t.2m=1a.1P(t.2m),t.1i=n.2N(),t.2m=1a.bm(t.2m,t.1i));1d t.id&&t.2z&&(t.id.2z=t.2z),t},n.1e.wr=1b(e){1d 1a.3N&&1a.8G&&!1a.2U.na()&&1a.3N.7U()?e.1i=1a.3N.7U():(e.1i=1a.1Q,1a.1j.1L.tB(e)),e},n.1e.wQ=1b(t){1c n=!1;1a.2U==1g?1a.3N?1a.3s&&1a.3s.5A==e.1f.4K?(n=!0,t.1i=1a.1Q):t.1i=1a.3N:(1a.1j.4B&&1a.1j.1L.2q(t,"\'1a\' 3G 2g be iG bx 6s ls"),t.1i=1a.1Q):((1a.hN||1a.hp)&&1a.3s&&1a.3s.5A==e.1f.4K&&(n=!0),1a.2U.4T()||1a.2U.3p||1a.2U.mM?1a.3N&&!(1a.2U.1S&e.1O.3x)?t.1i=1a.3N:t.1i=1a.1Q:t.1i=1a.1Q);if(!1a.8G&&1a.2U&&e.1s(1a.2U.1S,e.1O.8v))if(1a.2U.mK){1c r=1a.2U.mK.2z.1R;r.1E.1o==e.1f.2t&&r.1E.mI()}1y{1c i=1a.2U.g2,s=i,o=!1;3q(i){if(i.4T()||i.3p||i.ce()){i.mI(),o=!0;1B}i=i.g2}!o&&s&&s.mI(),o&&1a.3N&&(t.1i=1a.3N)}1d n&&1a.1j.1L.2q(t,"hc \'1a\' h4 be iG in xr in a 3g 1W, or in d7 6J AB"),t},n.1e.vO=1b(t,n){if(n.dP()){if(n.dX()){1c r=n;r.1E&&!1a.1j.aw(r.4d)&&1a.k4(r.1E),1a.1j.5r.k0||r.1E&&r.1E.1o==e.1f.3m&&1a.4X=0&&t.3d<1a.1j.6e.1n?1a.1j.2v=1a.1j.6e[t.3d]:1a.1j.2v=e.n1,n.9E?1a.3N=n.9E:1a.3N=l;1c C=i.2r.1n;if(!t.3p&&t.3C&&!t.5T()){1c k=1a.2a,w=1a.2a;if(!t.4T()&&t.5m==1g){if(s&&t.1C&&!t.1C.bu()){1c L=s.e8(t.1C.1G,!1,!1);L&&L.1E&&L.1E.1i&&(1a.1j.ow(L.1E.1i,!1),p=!0)}if(1a.1j.fc()){1c A=1a.1j.cL(),O=A.fr;if(1a.1j.kI(O,t,!0)){1c M=O.2n?O.2n:O.1K;A.9Z=M.2e[0];1c 6B=A.9Z.2r;d=6B,v=A.9Z.2J.1i,A.9Z.1E&&(A.9Z.1E.3p?t.mM=!0:A.9Z.1E.4T()&&(t.mM=!0)),r.1i=A.fr}1y O&&t.4y()?(y=O,A.oc=y):1a.1j.oz()}}1c D=w.4p;1a.2a=1h e.ai(D,1g,1g,1g,s,f);1w(1c P=0;P=d.1n-1?d[d.1n-1].2N().3w:d[P].2N(),j.2z.7i(j.1i),j.2z.4d=1a.1j.fa()}1y 1a.1P(j);g&&y&&(j=1a.bm(j,y)),B.1R=f,D.3E.4L(B.1C,B)}1a.2a=k}1y{1a.1P(t.2p);1w(1c P=0;P1?1a.1j.1L.2q(t,"7y 2e 3G 8O 4e bA 3W"):t.2p.1p[0].1i==1a.1j.5f?n.2O.1M|=e.8C.jc:t.2p.1p[0].1i==1a.1j.5l?n.2O.1M|=e.8C.j9:1a.1j.1L.2q(t,"7y 2e 3G 4e 8O \'e9\' or \'cJ\' as Bm 3W"))}if(t.3C&&!t.5T()){if(!t.3p)1a.w3(f,i,h);1y{1a.q4(t.1i.1A,t.2p,h,e.1s(t.1S,e.1O.6U));if(1a.3s&&1a.3s.2V){1c I=1a.2a,q=1h e.4a(h);1a.2a=1h e.rX(q,s,t.1i.1A,1b(t){1d t.4i()==e.4g.iB}),1a.we(1a.3s.2V),1a.2a=I}}1c R=1a.1j.4B;t.1i&&t.1i.1A&&!t.4T()&&t.1i.1A.5D&&(1a.1j.4B=t.1i.1A.5D),1a.1P(t.3C),1a.1j.4B=R;if(1a.1j.ok){1c U=t.wX();1a.1j.ol&&U.6E(1a.1j.1L.4F),U.vf(1a.1j.1L),1a.1j.om&&U.9j(1a.1j.1L,t.1i.1A)}if(t.3p){1c z=t.c5,W=z.1p.1n,X,V,$=0;1w(;$0){1c K={aY:1b(){1d t.al.1n},kP:1b(e,n){t.al[e].1i=n},hw:1b(e){1d t.al[e].1i}},Q=t.al[0].1i;Q=1a.1j.kN(Q,1g,K);if(Q)i.2J.1i=1a.1j.ez(Q);1y{1w(1c G=0;G0&&t.3C.1p[0].1o==e.1f.cs;Y||1a.1j.1L.2q(t,"aE eu a wi-a7 1d 1i, ks wj no 1d 8B")}p&&1a.1j.ox();if(t.7k){1c y=t.7k.2N();y?(e.1s(t.1S,e.1O.6C)&&y!=i.2J.1i||t.2p.1p.1n>0&&y!=t.2p.1p[0].1i)&&1a.1j.1L.2q(t,"6d 8o 7R 9p do 2g oF"):e.1s(t.1S,e.1O.6C)?t.7k.7i(i.2J.1i):t.2p.1p.1n!=1?1a.1j.1L.2q(t,"Bv 3G 8h bA 8o 4e bA e2"):t.7k.7i(t.2p.1p[0].1i)}1d 1a.jS(n,t),t},n.1e.qb=1b(t){1c n=!1,r=t.2V;if(r){1c i=r.1n;1a.eM=!0,i>0&&(t.4V|=e.4w.jg);1w(1c s=0;s0){1c o=1h e.2h;if(i.8R())1w(1c u=0;u0);i.1p&&i.1p.3E.5p(1b(t,o,u){1c a=o;1w(1c f=0;f=e.1f.2S&&t.1o<=e.1f.qN&&1a.1j.1L.2q(t,"1I-s2 pL 4m in BW 8B")},n.1e.cD=1b(t,n){1a.1j.5r.jQ&&t&&t.1o!=e.1f.5M&&1a.1j.1L.6D(t,n+" bw a bF")},n.1e.s5=1b(e){1d e.3V=1a.1P(e.3V),1a.hZ(e.3V),e.9f=1a.1P(e.9f),e.7Q=1a.1P(e.7Q),1a.cD(e.9f,"if 4m"),1a.cD(e.7Q,"if 4m"),e.1i=1a.3O,e},n.1e.wv=1b(t){1d t.4y()?e.1s(t.1S,e.1O.6C)?t.1i.1K.2e[0].2J.1i:t.1i.1K.2e[0].2r[0].2N():1g},n.1e.u9=1b(t){1c n=1h e.3z;n.1A=1h e.9I(1a.1j.oo,t.1u,1a.1j.2v.3d,n),n.1p=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),n.2W=1h e.fI(n.1p,1g,1g,1g,1g);1c r=1h e.bH(n.1A);r.8f(n.2W),r.8f(1a.2a),n.3v=r;1c i=t.2P,s=1a.3N,o=!1,u=1g;1a.1j.fc()&&(u=1a.1j.cL().fr,u&&u.1A&&!1a.1j.aw(u.1A.4d)&&u.1A.1E&&1a.1P(u.1A.1E),o=!0);if(i)1w(1c a=0,f=i.1p.1n;a0)1w(1c n=0;n=s&&(e.5Z||t.1n<=o)&&(u=e.5Z?e.2r.1n:t.1n,a=!0);1c f=1g;if(a||e.5Z){e.5Z&&(u-=1,f=e.2r[u].3W.2H.1i,f=f.3w,a=t.1n>=u);1c l=t.1n,c=a,h=a;1w(1c p=0;p1,f=1h e.ii,l=1g,c=1g;if(t.1o==e.1f.5U||t.1o==e.1f.bj){1c h=t;l=h.2p,c=h.3A;if(h.2p){1c p=h.2p.1p.1n;1w(1c d=0;d0){1c w=1a.1j.oR(b,l);w.kV&&1a.1j.1L.2q(c,"wx 1K 8B - kw 2g wy wz"),u=w.kX}1y{1c E="C2 2r do 2g C3 8r 3F of 1K 3A";f.7E?1a.1j.1L.2q(c,E+":\\n "+f.7E):1a.1j.1L.2q(c,E)}}1y if(s.1n>1){1c S=[];1w(1c d=0;d=i.6r){n=!0;1c s=1g,o=t.2p.1p.1n=i.6r-1&&(s=s.3w);3S(t.2p.1p[r].1o){1t e.1f.2t:1t e.1f.7c:1t e.1f.8X:1a.1j.7P(s,1a.1j.9s(),!i.2r[r].1E.7o,t.2p.1p[r]);1B;4G:3P}}}}if(!n&&t.2p){1a.1j.oz();1w(r=0;r0?1a.2V[0]:1g},r.1e.pZ=1b(e,t){1d 1a.dE.ss(e,t)},r.1e.6P=1b(){1d 1a.3i!=1g},r.1e.8i=1b(){1d 1a.3w!=1g},r.1e.8R=1b(){1d 1a.1A&&!1a.3w&&1a.1A.1i.6P()},r.1e.kY=1b(){1d 1a.6P()?1a.3i:1a},r.1e.8P=1b(){1d e.1s(1a.4V,e.4w.qO)},r.1e.ah=1b(){1a.4V|=e.4w.qO},r.1e.wR=1b(){1d e.1s(1a.8Q,t.o6)},r.1e.jD=1b(){1d e.1s(1a.8Q,t.hD)},r.1e.wS=1b(){1d e.1s(1a.8Q,t.lH)},r.1e.Cs=1b(){1d e.1s(1a.8Q,t.9Q)},r.1e.3Q=1b(){1d 1a.dI("",!0,!1,1g)},r.1e.8b=1b(e){1d 1a.dI("",!0,!1,e)},r.1e.Ct=1b(e){1d 1a.jz("",!0,!1,e)},r.1e.qu=1b(){1c e=0;1d 1a.1K&&(e+=1a.1K.2e.1n),1a.2n&&(e+=1a.2n.2e.1n),1a.2O&&(e+=1a.2O.2e.1n),e},r.1e.dI=1b(e,t,n,r){1c i=1a.jz(e,t,n,r);1d i.5v()},r.1e.jz=1b(t,r,s,o){if(1a.3w)1d n.9M(1a.3w.jz(t,!1,!0,o),"","[]");if(1a.1A&&1a.1A.1C&&1a.1A.1C!="ko"&&(1a.1K==1g&&1a.2n==1g&&1a.2O==1g||e.1s(1a.4V,e.4w.il)||1a.1p&&!1a.6P())){1c u=1a.1A.nf(o);1d n.9M(u=="1g"?"8r":u)}if(1a.1p||1a.1K||1a.2n){if(e.1s(1a.4V,e.4w.il))1d n.9M("1a");1a.4V|=e.4w.il;1c a="",f=1h i,l=s,c=0,h=0,p="; ";1a.1p&&1a.1p.2Q.5p(1b(t,r,i){1c s=r;if(!e.1s(s.1M,e.2j.q9)){1c u=s.3Q(o);u.1n>=p.1n&&u.3e(u.1n-p.1n)==p&&(u=u.3e(0,u.1n-p.1n)),f.4L(n.9M(u)),h++;if(s.4i()==e.4g.3z){1c a=s.1i;a.qu()>1&&(l=!0)}1y l=!0}},1g);1c d,v,m=0,g=h==0&&1a.qu()==1&&r;g||(f.qs=p);if(1a.1K){d=1a.1K.mt(t,g,o);1w(v=0,m=d.1n;v1&&r)f.jI="{ ",f.jG="}";1d 1a.4V&=~e.4w.il,c==0&&h==0?n.9M("{}"):f}1d n.9M("{}")},r.1e.Cw=1b(e){(1a.8R()||1a.6P())&&1a.1A.1E&&e.2F.k4(1a.1A.1E)},r.1e.jK=1b(e){if(1a==e.1Q)1d 1g;if(1a.wR())1d e.cv?e.cv.2W:1g;if(1a.wS())1d e.cy?e.cy.2W:1g;if(1a==e.5l)1d e.cx?e.cx.2W:1g;if(1a.3w){if(e.cc){1c t=1a.3w.pZ(e.cc,e.1j);1d t.2W}1d 1g}1d 1a.2W},r.1e.jY=1b(){1d 1a.1p||1a.2V||1a.2n||1a.1K||1a.2O||1a.3w},r.1e.6m=1b(t,n,i,s){if(t==1a)1d n;1c o=1a;1d s?1a.jY()&&(o=1h r,1a.1p&&(o.1p=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),1a.1p.3E.5p(1b(e,r,s){1c u=r,a=u.6m(t,n,i);o.1p.bJ(a.1C,a)},1g),1a.1p.cK.5p(1b(e,r,s){1c u=r,a=u.6m(t,n,i);o.1p.nn(a.1C,a)},1g)),1a.5E&&(o.5E=1h e.4a(1h e.3M(1h e.2h,1h e.2h)),1a.5E.3E.5p(1b(e,r,s){1c u=r,a=u.6m(t,n,i);o.5E.bJ(a.1C,a)},1g),1a.5E.cK.5p(1b(e,r,s){1c u=r,a=u.6m(t,n,i);o.5E.nn(a.1C,a)},1g)),o.3v=i.gv(o),o.2W=o.3v):1a.3w?1a.3w==t?o=i.9x(n):1a.3w.3w==t&&(o=i.9x(i.9x(n))):1a.1K&&(o=1h r,o.1K=1a.1K.6m(t,n,i)),o},r.1e.pa=1b(e){if(e==1a)1d!0;if(1a.2V)1w(1c t=0,n=1a.2V.1n;t6&&e.3e(e.1n-6,e.1n)==".d.bU"?e.3e(0,e.1n-6):e.1n>4&&e.3e(e.1n-4,e.1n)==".bU"?e.3e(0,e.1n-4):e.1n>5&&e.3e(e.1n-5,e.1n)==".d.ts"?e.3e(0,e.1n-5):e.1n>3&&e.3e(e.1n-3,e.1n)==".ts"?e.3e(0,e.1n-3):e.1n>3&&e.3e(e.1n-3,e.1n)==".js"?e.3e(0,e.1n-3):e}1b u(e){1d e.1n>4&&e.3e(e.1n-4,e.1n)==".bU"}1b a(e){1d e.1n>3&&e.3e(e.1n-3,e.1n)==".ts"}1b f(e){1d e.1n>6&&e.3e(e.1n-6,e.1n)==".d.bU"}1b l(e){1d e.1n>5&&e.3e(e.1n-5,e.1n)==".d.ts"}1b c(e,n,i){5i n=="2i"&&(n=!0),5i i=="2i"&&(i=!1);1c u=i?s(e):o(t(e)),a=u.cw("/");1d a.1n?n?r(a[a.1n-1]):a[a.1n-1]:e}1b h(e){1c n=o(t(e)),i=b(n);if(i=="")1d e;1c s=n.cw(i),u=s.1n>1?1:0;1d r(s[u])}1b p(e){1d o(t(e))+".bU"}1b d(e){1d o(t(e))+".d.bU"}1b v(e){1d o(t(e))+".ts"}1b m(e){1d o(t(e))+".d.ts"}1b g(e){1d e.dW(0)=="."}1b y(e){1d e.dW(0)=="\\\\"||e.dW(0)=="/"||e.9H(":\\\\")!=-1||e.9H(":/")!=-1}1b b(e){if(e=="")1d e;1c t=e.9H("/")!=-1;1d t?w(e):""}1b w(e){e=s(e);1c t=e.cw("/"),n=t.ru(0,t.1n-1);1d n.j0("/")+"/"}1b E(e){1c t=/^(Cz?:\\/\\/[\\-\\w\\.]+(:\\d+)?\\/)(.*)$/i,n=t.db(e);if(n){1c r=n[1],i=n[3];1d r+S(i)}1d S(e)}1b S(e){e=s(e);1c t=e.dW(0)==="/",n=e.cw("/");1w(1c r=0;r0&&n[r]===".."&&n[r-1]!==".."&&(n.jx(r-1,2),r-=2)}1d(t?"/":"")+n.j0("/")}1b x(e){1d S(e)}e.8k=t,e.gs=n,e.rd=r,e.tT=i,e.dD=s,e.x8=o,e.du=u,e.dr=a,e.sP=f,e.sR=l,e.iV=c,e.yk=h,e.l4=p,e.eR=d,e.qx=v,e.bZ=m,e.ho=g,e.qy=y,e.tW=b,e.CE=w,e.CF=E,e.CG=/\\//g,e.iw=S,e.CH=x})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b e(e,t){1a.5e=e,1a.6c=t}1d e.1e.3b=1b(e,t){1d 1a.6c.3e(e,t)},e.1e.aY=1b(){1d 1a.6c.1n},e}();e.CI=t;1c n=1b(){1b e(e,t){1a.qz=e,1a.x2=t,1a.CL=[],1a.cT=[]}1d e}();e.CM=n;1c r=1b(){1b n(e){1a.jw=e,1a.jt={}}1d n.1e.qC=1b(n,r,i,s){1c o={6c:"",5e:n},u=1a.jw.x2,a=e.ho(n),f=a?!1:e.qy(n),l=a?u.x6(r+"/"+n):f||!r||i?n:r+"/"+n;!e.du(l)&&!e.dr(l)&&(l+=".ts"),l=e.dD(e.8k(l));1c c=1a.jw.qz.x7?l:l.CS();if(!1a.jt[c]){if(a||f||!i)9Y{e.6w.ag(" jq cT a6 "+l);9Y{o.6c=u.jp(l)}7X(h){9Y{e.du(l)?l=e.qx(l):e.dr(l)&&(l=e.l4(l)),e.6w.ag(" jq cT a6 "+l),o.6c=u.jp(l)}7X(h){l=e.eR(l),e.6w.ag(" jq cT a6 "+l);9Y{o.6c=u.jp(l)}7X(h){l=e.bZ(l),e.6w.ag(" jq cT a6 "+l),o.6c=u.jp(l)}}}e.6w.ag(" CW cT at "+l),o.5e=l,1a.jt[c]=!0}7X(h){e.6w.ag(" pH 2g 3u cT 1w "+n)}1y o=u.jm(r,l),o||(e.du(l)?l=e.qx(l):e.dr(l)&&(l=e.l4(l)),o=u.jm(r,l)),o||(l=e.bZ(l),o=u.jm(r,l),o||(l=e.eR(l),o=u.jm(r,l))),o?(o.5e=e.dD(e.8k(o.5e)),e.6w.ag(n+" CY to: "+o.5e),o.6c=o.6c,1a.jt[c]=!0):e.6w.ag("eN 2g 3u "+n);if(o&&o.6c){1c p=u.CZ(o.5e),d=1h t(o.5e,o.6c),v=e.xc(d,1a.jw.qz);1w(1c m=0;m/gD,r=n.db(t);if(r){1c i=e.iw(r[3]),s=e.iw(i),o=r.1n>=7&&r[6]=="d3";1d o&&e.6w.ag(i+" is D7"),{1u:0,1x:0,5e:e.dD(s),9A:o}}1d 1g}1b i(e){1c t=/^(\\/\\/\\/\\s*/gD,n=t.db(e);if(n){1c r=n[3];1d r}1d 1g}1b s(e,t){1c n=/^(\\/\\/\\/\\s*/gD,r=n.db(e);if(r){1c i=/^([a-zA-Z]+=[\'"]on[\'|"])/gD;r=i.db(r[2]);if(r)1w(1c s=0;s/gD,b=y.db(f.3b());b&&(d=b[3]=="d3")}}1d{4j:c,qH:h,qI:p,Di:d}}1c t=1b(){1b e(){1a.pY=!1,1a.jQ=!1,1a.lk=!1,1a.lq=!1,1a.m1=!0,1a.jO=!1,1a.jk=!1,1a.jR=!1,1a.lo=!1,1a.jL=!0,1a.k0=!0,1a.jj=!0,1a.qM=!0,1a.jX=!0,1a.c3=!1}1d e.1e.xk=1b(e,t){1c n=1a[e];1d n!==2i?(1a[e]=t,!0):!1},e.1e.xl=1b(e){1c t=e.cw(";");1w(1c n=0,r=t.1n;n=0){1c u=i.3e(o+1);i=i.3e(0,o),u=="Dm"&&(s=!1)}if(!1a.xk(i,s))1d!1}1d!0},e}();e.Dn=t;1c n=1b(){1b n(){1a.5r=1h t,1a.fx=!1,1a.bP=!1,1a.Do=!1,1a.dv=!0,1a.4A=!1,1a.fy=!1,1a.Dp=!1,1a.db=!1,1a.wq=!0,1a.xm=!1,1a.xn=!1,1a.xo=!1,1a.xp=!0,1a.Du=!0,1a.gG=!1,1a.9n=!1,1a.Dv=!0,1a.7K=e.8a.qo,1a.9l=e.9m.q7,1a.d8="",1a.Dx="",1a.dV=!1,1a.fz=!1,1a.x7=!1}1d n.1e.tt=1b(e){1a.5r.xl(e)},n.1e.DA=1b(e){1a.d8=e,1a.dv=!1},n}();e.xs=n,e.t4=i,e.DC=s,e.xc=o})(2c||(2c={}));1c 2c;(1b(e){1c t=1b(){1b t(t){1a.3n=t,1a.je=1h e.wM(1a.3n)}1d t.1e.xu=1b(t,n,r,i){1a.3n.4S(\'DF("\'+n+\'")\');if(i===1g)3K 1h 2k("fA lU be kU");if(i.xv())1d 1a.3n.4S(" 7I 7S 7N xx pF is n2"),1g;1c s=e.mX(1a.3n,t,r,i.1u,!1),o=e.mX(1a.3n,t,r,i.1x,!1);if(s==1g||o==1g)1d 1a.3n.4S(" 7I 7S 7N su c5 h4 be DM"),1g;if(s.5Y!==o.5Y)1d 1a.3n.4S(" 7I 7S 7N xx DN 2 DP c5"),1g;1c u=s.5Y.1x-s.5Y.1u+i.9L;1d u<=0?(1a.3n.4S(" 7I 7S 7N 2a wj DR DS DT a6 1h bX 1G"),1g):s},t.1e.xy=1b(t,n,r,i){1a.3n.4S(\'xy("\'+n+\'")\');if(i===1g)3K 1h 2k("fA lU be kU");1c s=1a.xu(t,n,r,i);if(s===1g)1d 1g;1c o=s.5Y.1x-s.5Y.1u+i.9L;if(o>=r.aY()/2)1d 1a.3n.4S(" 7I 7S 7N pF of 2a to DW ("+o+" DX) is a0 xz DZ 5K fR of 5K bX 1G"),1g;1c u=[],a=1b(t,n,r,i){u.4b(1h e.xA(i,t,t+n,r))},f=e.gZ(1a.3n,s.5Y,r,s.5Y.1u,s.5Y.1u+o,a);if(f.y0!=e.m6.8K)1d 1a.3n.4S(" 7I 7S 7N 2a iJ E1 E2"),1g;1c l=f.6Y;if(l.bG.1p.1n!==0)1d 1a.3n.4S(" 7I 7S 7N 1h bX 1G xB w8"),1g;if(l.3C.1p.1n!==1)1d 1a.3n.4S(" 7I 7S 7N 1h bX 1G xB jZ xz bA 2a (or E4)"),1g;1c c=s.5Y,h=l.3C.1p[0];1d c.1o!=h.1o?(1a.3n.4S(" 7I 7S 7N 1h bX 1G 6k 2g xS 5K wb 2a 1i as 5K wc 2a"),1g):!c.4U||!c.4R?(1a.3n.4S(" 7I 7S 7N E5 E6\'t 8h h9/jU qQ 3f"),1g):c.4U!==h.4U?(1a.3n.4S(" 7I 7S 7N 1h bX 1G iJ jZ (or pd) h9 qQ xD"),1g):c.4R!==h.4R?(1a.3n.4S(" 7I 7S 7N 1h bX 1G iJ jZ (or pd) jU qQ xD"),1g):h.1u!==0?(1a.3n.4S(" 7I 7S 7N 1h 1b 5V 6k 2g ob at xE 0"),1g):h.1x!==o?(1a.3n.4S(" 7I 7S 7N 1h 1b 5V 6k 2g xF at 5K 1h xF xE"),1g):e.xG.xH(t,l,c,h,i,u)},t.1e.qR=1b(t){1c n=1a;e.9y(1a.3n,"qR()",1b(){1c r=1h e.xJ(t.hQ.1u,t.hQ.1x,t.fA.9L);n.qS(t.jd,r.1x,r.9L),n.qS(t.hE,0,r.1u),n.xM(t.jd,t.hE,r),n.xN(t.jd,t.hQ,t.qU)})},t.1e.xN=1b(t,n,r){1c i=1a,s=1b(t,s,o){1d t===n?(r.5s=t.5s,r.5q=t.5q,i.3n.4S("Em En 5y kr 5F 1h bA in aR 5y"),o.2o.l9(),r):(e.gw(t)&&(t.1xn.1x)&&(o.2o.4s=!1),t)};e.6f().2d(t,s)},t.1e.xM=1b(e,t,n){1c r=e.2v.5x,i=t.2v.5x;1a.3n.fO()&&(1a.3n.4S("xQ (bQ):"),1a.je.hs(r),1a.3n.4S("Er (Es dm):"),1a.je.hs(i),1a.3n.4S("Et="+n));1c s=2,o=2,u=r.1n,a=i.1n;3q(s=n.1x?(r[s]+=n.9L,s++):o=n&&(e.1u+=r),e.1x!==-1&&e.1x>=n&&(e.1x+=r)},s=1b(e){if(e&&e.1n>0)1w(1c t=0;tt;if(i){1c s=t>>1;1w(1c o=0;ou.scrollOffset&&setTimeout(a,150))}),window.addEventListener("resize",a);var f={open:i,close:a,toggle:o,update:function(){var e=0