From cc18e2c5e4cdad037d1437b245531c457a786cbb Mon Sep 17 00:00:00 2001 From: fgnm Date: Fri, 26 Jun 2020 16:49:10 +0200 Subject: [PATCH] Push to BitBucket --- .gitignore | 10 + art/font/myriad-medium-big.fnt | 4827 +++++++++++++++++ art/font/myriad-medium-big.png | Bin 0 -> 31706 bytes art/font/myriad-medium-small.fnt | 3178 +++++++++++ art/font/myriad-medium-small.png | Bin 0 -> 21803 bytes art/font/myriad-medium.fnt | 3951 ++++++++++++++ art/font/myriad-medium.png | Bin 0 -> 27052 bytes art/splash_textures/bg_color.png | Bin 0 -> 1918 bytes art/splash_textures/splash_bg.png | Bin 0 -> 82501 bytes art/splash_textures/splash_logo.png | Bin 0 -> 9331 bytes art/splash_textures/splash_logo_text.png | Bin 0 -> 5772 bytes art/textures/align-center-horisontal.png | Bin 0 -> 1249 bytes art/textures/align-center-vertical.png | Bin 0 -> 1230 bytes art/textures/align-edge-down.png | Bin 0 -> 1295 bytes art/textures/align-edge-left.png | Bin 0 -> 1060 bytes art/textures/align-edge-right.png | Bin 0 -> 1269 bytes art/textures/align-edge-up.png | Bin 0 -> 1289 bytes art/textures/align-simple-down.png | Bin 0 -> 1050 bytes art/textures/align-simple-left.png | Bin 0 -> 1233 bytes art/textures/align-simple-right.png | Bin 0 -> 1236 bytes art/textures/align-simple-up.png | Bin 0 -> 1251 bytes art/textures/alpha-bar-10px.png | Bin 0 -> 985 bytes art/textures/alpha-bar-25px-shifted.png | Bin 0 -> 1030 bytes art/textures/alpha-bar-25px.png | Bin 0 -> 1027 bytes art/textures/border-circle-error.png | Bin 0 -> 435 bytes art/textures/border-circle.png | Bin 0 -> 346 bytes art/textures/border-error.9.png | Bin 0 -> 87 bytes art/textures/border.9.png | Bin 0 -> 87 bytes art/textures/box-colapse-off.png | Bin 0 -> 1084 bytes art/textures/box-colapse-on.png | Bin 0 -> 1048 bytes art/textures/box.9.png | Bin 0 -> 327 bytes art/textures/button-dark-down.9.png | Bin 0 -> 208 bytes art/textures/button-dark-over.9.png | Bin 0 -> 220 bytes art/textures/button-dark.9.png | Bin 0 -> 143 bytes art/textures/button-down.9.png | Bin 0 -> 142 bytes art/textures/button-orange-down.9.png | Bin 0 -> 144 bytes art/textures/button-orange-over.9.png | Bin 0 -> 235 bytes art/textures/button-orange.9.png | Bin 0 -> 238 bytes art/textures/button-over.9.png | Bin 0 -> 233 bytes art/textures/button-red.9.png | Bin 0 -> 179 bytes art/textures/button-resource-over.9.png | Bin 0 -> 1002 bytes art/textures/button-resource.9.png | Bin 0 -> 1000 bytes art/textures/button.9.png | Bin 0 -> 242 bytes art/textures/check-down-on.png | Bin 0 -> 1196 bytes art/textures/check-down.png | Bin 0 -> 1006 bytes art/textures/check-off.png | Bin 0 -> 1006 bytes art/textures/check-on-disabled.png | Bin 0 -> 1193 bytes art/textures/check-on.png | Bin 0 -> 1211 bytes art/textures/check-over-off.png | Bin 0 -> 1004 bytes art/textures/check-over-on.png | Bin 0 -> 1198 bytes art/textures/color-picker-bar-selector.png | Bin 0 -> 243 bytes art/textures/color-picker-cross.png | Bin 0 -> 160 bytes .../color-picker-selector-horizontal.png | Bin 0 -> 2765 bytes .../color-picker-selector-vertical.png | Bin 0 -> 2767 bytes art/textures/cursor.9.png | Bin 0 -> 86 bytes art/textures/default-pane-noborder.9.png | Bin 0 -> 78 bytes art/textures/default-pane.9.png | Bin 0 -> 93 bytes art/textures/default-select-selection.9.png | Bin 0 -> 153 bytes art/textures/default-select-white-over.9.png | Bin 0 -> 1475 bytes art/textures/default-select-white.9.png | Bin 0 -> 1492 bytes art/textures/default-select.9.png | Bin 0 -> 1458 bytes art/textures/dropHere.png | Bin 0 -> 16398 bytes .../expandable-properties-active-bg.9.png | Bin 0 -> 1182 bytes .../expandable-properties-collapse-off.png | Bin 0 -> 1229 bytes .../expandable-properties-collapse-on.png | Bin 0 -> 1219 bytes .../expandable-properties-inactive-bg.9.png | Bin 0 -> 1212 bytes art/textures/icon-animation.png | Bin 0 -> 1278 bytes art/textures/icon-arrow-left.png | Bin 0 -> 1073 bytes art/textures/icon-arrow-right.png | Bin 0 -> 1077 bytes art/textures/icon-close-orange-down.png | Bin 0 -> 1044 bytes art/textures/icon-close-orange-over.png | Bin 0 -> 1039 bytes art/textures/icon-close-orange.png | Bin 0 -> 1042 bytes art/textures/icon-close-small.png | Bin 0 -> 1223 bytes art/textures/icon-close.png | Bin 0 -> 1110 bytes art/textures/icon-composite.png | Bin 0 -> 1217 bytes art/textures/icon-composite2.png | Bin 0 -> 1028 bytes art/textures/icon-drive.png | Bin 0 -> 1060 bytes art/textures/icon-file-audio.png | Bin 0 -> 465 bytes art/textures/icon-file-image.png | Bin 0 -> 421 bytes art/textures/icon-file-pdf.png | Bin 0 -> 464 bytes art/textures/icon-file-text.png | Bin 0 -> 380 bytes art/textures/icon-folder-new.png | Bin 0 -> 423 bytes art/textures/icon-folder-parent.png | Bin 0 -> 421 bytes art/textures/icon-folder-star.png | Bin 0 -> 379 bytes art/textures/icon-folder.png | Bin 0 -> 996 bytes art/textures/icon-group.png | Bin 0 -> 1263 bytes art/textures/icon-image.png | Bin 0 -> 1248 bytes art/textures/icon-label.png | Bin 0 -> 1196 bytes art/textures/icon-library-over.png | Bin 0 -> 1217 bytes art/textures/icon-library.png | Bin 0 -> 1217 bytes art/textures/icon-link-active.png | Bin 0 -> 2929 bytes art/textures/icon-link-inactive.png | Bin 0 -> 2913 bytes art/textures/icon-list-settings.png | Bin 0 -> 513 bytes art/textures/icon-lock-active.png | Bin 0 -> 1065 bytes art/textures/icon-lock-inactive.png | Bin 0 -> 980 bytes art/textures/icon-new-layer.png | Bin 0 -> 1079 bytes art/textures/icon-particle-over.png | Bin 0 -> 1243 bytes art/textures/icon-particle-white.png | Bin 0 -> 1432 bytes art/textures/icon-particle.png | Bin 0 -> 1246 bytes art/textures/icon-refresh.png | Bin 0 -> 462 bytes art/textures/icon-root.png | Bin 0 -> 1160 bytes art/textures/icon-spine.png | Bin 0 -> 1335 bytes art/textures/icon-star-outline.png | Bin 0 -> 447 bytes art/textures/icon-star.png | Bin 0 -> 362 bytes art/textures/icon-trash-disabled.png | Bin 0 -> 1047 bytes art/textures/icon-trash-over.png | Bin 0 -> 975 bytes art/textures/icon-trash.png | Bin 0 -> 1047 bytes art/textures/icon-unlink-active.png | Bin 0 -> 2917 bytes art/textures/icon-unlink-inactive.png | Bin 0 -> 2903 bytes art/textures/icon-visible-off.png | Bin 0 -> 1182 bytes art/textures/icon-visible-on.png | Bin 0 -> 1204 bytes art/textures/icon-zoomin-disabled.png | Bin 0 -> 1288 bytes art/textures/icon-zoomin-over.png | Bin 0 -> 1288 bytes art/textures/icon-zoomin.png | Bin 0 -> 1290 bytes art/textures/icon-zoomout-disabled.png | Bin 0 -> 1289 bytes art/textures/icon-zoomout-over.png | Bin 0 -> 1288 bytes art/textures/icon-zoomout.png | Bin 0 -> 1290 bytes art/textures/layer-bg-over.9.png | Bin 0 -> 976 bytes art/textures/layer-bg.9.png | Bin 0 -> 976 bytes art/textures/list-selection-white.png | Bin 0 -> 926 bytes art/textures/list-selection.png | Bin 0 -> 926 bytes art/textures/logo.png | Bin 0 -> 2822 bytes art/textures/menu-bg-down.9.png | Bin 0 -> 1074 bytes art/textures/menu-bg-over.9.png | Bin 0 -> 1070 bytes art/textures/menu-bg-up.9.png | Bin 0 -> 985 bytes art/textures/menu-bg.9.png | Bin 0 -> 998 bytes art/textures/myriad-medium-big.png | Bin 0 -> 31706 bytes art/textures/myriad-medium-small.png | Bin 0 -> 21803 bytes art/textures/myriad-medium.png | Bin 0 -> 27052 bytes art/textures/origin-anchor.png | Bin 0 -> 18252 bytes art/textures/popup-menu-disabled.9.png | Bin 0 -> 956 bytes art/textures/popup-menu-down.9.png | Bin 0 -> 956 bytes art/textures/popup-menu-over.9.png | Bin 0 -> 956 bytes art/textures/popup-menu.9.png | Bin 0 -> 956 bytes art/textures/progressbar-filled-vertical.png | Bin 0 -> 938 bytes art/textures/progressbar-filled.png | Bin 0 -> 939 bytes art/textures/progressbar-vertical.png | Bin 0 -> 935 bytes art/textures/progressbar.png | Bin 0 -> 940 bytes art/textures/radio-down-on.png | Bin 0 -> 1575 bytes art/textures/radio-down.png | Bin 0 -> 1456 bytes art/textures/radio-off.png | Bin 0 -> 1352 bytes art/textures/radio-on-disabled.png | Bin 0 -> 1522 bytes art/textures/radio-on.png | Bin 0 -> 1451 bytes art/textures/radio-over-off.png | Bin 0 -> 1488 bytes art/textures/radio-over-on.png | Bin 0 -> 1575 bytes art/textures/scroll-horizontal.9.png | Bin 0 -> 1008 bytes art/textures/scroll-knob-horizontal.9.png | Bin 0 -> 1002 bytes art/textures/scroll-knob-vertical.9.png | Bin 0 -> 1004 bytes art/textures/scroll.9.png | Bin 0 -> 999 bytes art/textures/select-box-list-bg-white.png | Bin 0 -> 927 bytes art/textures/select-box-list-bg.png | Bin 0 -> 926 bytes art/textures/select-down.png | Bin 0 -> 211 bytes art/textures/select-up.png | Bin 0 -> 211 bytes art/textures/selection-anchor.png | Bin 0 -> 17754 bytes art/textures/selection.png | Bin 0 -> 926 bytes art/textures/separator-menu.png | Bin 0 -> 929 bytes art/textures/separator-vertical.png | Bin 0 -> 930 bytes art/textures/separator.png | Bin 0 -> 929 bytes art/textures/slider-knob-disabled.png | Bin 0 -> 144 bytes art/textures/slider-knob-down.png | Bin 0 -> 144 bytes art/textures/slider-knob-over.png | Bin 0 -> 144 bytes art/textures/slider-knob.png | Bin 0 -> 144 bytes art/textures/slider-vertical.png | Bin 0 -> 130 bytes art/textures/slider.png | Bin 0 -> 134 bytes art/textures/splash_logo.png | Bin 0 -> 9331 bytes art/textures/splitpane-over.png | Bin 0 -> 130 bytes art/textures/splitpane-vertical-over.png | Bin 0 -> 134 bytes art/textures/splitpane-vertical.png | Bin 0 -> 134 bytes art/textures/splitpane.png | Bin 0 -> 130 bytes art/textures/static-text.9.png | Bin 0 -> 1199 bytes art/textures/sub-menu-bg.9.png | Bin 0 -> 993 bytes art/textures/sub-menu.png | Bin 0 -> 1031 bytes art/textures/tab-active.9.png | Bin 0 -> 156 bytes art/textures/tab-inactive.9.png | Bin 0 -> 130 bytes art/textures/textfield-light-down.9.png | Bin 0 -> 1106 bytes art/textures/textfield-light-over.9.png | Bin 0 -> 1073 bytes art/textures/textfield-light.9.png | Bin 0 -> 156 bytes art/textures/textfield-over.9.png | Bin 0 -> 1061 bytes art/textures/textfield.9.png | Bin 0 -> 1069 bytes art/textures/thumbnail-over.9.png | Bin 0 -> 1171 bytes art/textures/thumbnail.9.png | Bin 0 -> 1171 bytes art/textures/tint-border.9.png | Bin 0 -> 1024 bytes art/textures/tool-align.png | Bin 0 -> 1257 bytes art/textures/tool-conuslight.png | Bin 0 -> 1811 bytes art/textures/tool-label.png | Bin 0 -> 1300 bytes art/textures/tool-mesh.png | Bin 0 -> 672 bytes art/textures/tool-move.png | Bin 0 -> 1394 bytes art/textures/tool-sphericlight.png | Bin 0 -> 1907 bytes art/textures/tool-transform.png | Bin 0 -> 1275 bytes art/textures/toolbar-bg.9.png | Bin 0 -> 968 bytes art/textures/toolbar-down.9.png | Bin 0 -> 1195 bytes art/textures/toolbar-normal.9.png | Bin 0 -> 1172 bytes art/textures/toolbar-over.9.png | Bin 0 -> 1263 bytes art/textures/tooltip-bg.9.png | Bin 0 -> 6353 bytes art/textures/touchpad-knob.png | Bin 0 -> 362 bytes art/textures/tree-minus.png | Bin 0 -> 1030 bytes art/textures/tree-over.png | Bin 0 -> 926 bytes art/textures/tree-plus.png | Bin 0 -> 1058 bytes art/textures/tree-selection.9.png | Bin 0 -> 956 bytes art/textures/vis-blue.png | Bin 0 -> 128 bytes art/textures/vis-check-down.png | Bin 0 -> 83 bytes art/textures/vis-check-over.png | Bin 0 -> 157 bytes art/textures/vis-check-tick-disabled.png | Bin 0 -> 392 bytes art/textures/vis-check-tick.png | Bin 0 -> 298 bytes art/textures/vis-check.png | Bin 0 -> 157 bytes art/textures/vis-radio-down.png | Bin 0 -> 2955 bytes art/textures/vis-radio-over.png | Bin 0 -> 385 bytes art/textures/vis-radio-tick-disabled.png | Bin 0 -> 299 bytes art/textures/vis-radio-tick.png | Bin 0 -> 287 bytes art/textures/vis-radio.png | Bin 0 -> 379 bytes art/textures/vis-red.png | Bin 0 -> 128 bytes art/textures/white.png | Bin 0 -> 2794 bytes art/textures/window-bg.png | Bin 0 -> 128 bytes art/textures/window-noborder.9.png | Bin 0 -> 115 bytes art/textures/window.9.png | Bin 0 -> 316 bytes assets/configs/app.properties | 1 + assets/configs/config.pit | 1 + assets/cursors/cross.png | Bin 0 -> 463 bytes assets/cursors/eyedropper.png | Bin 0 -> 590 bytes assets/cursors/fingerpoint.png | Bin 0 -> 745 bytes assets/cursors/label-tool.png | Bin 0 -> 425 bytes assets/cursors/label.png | Bin 0 -> 379 bytes assets/cursors/left-down-up.png | Bin 0 -> 394 bytes assets/cursors/left-right.png | Bin 0 -> 386 bytes assets/cursors/left-rotate-down.png | Bin 0 -> 435 bytes assets/cursors/left-rotate-up.png | Bin 0 -> 407 bytes assets/cursors/normal.png | Bin 0 -> 860 bytes assets/cursors/right-down-up.png | Bin 0 -> 407 bytes assets/cursors/right-rotate-down.png | Bin 0 -> 438 bytes assets/cursors/right-rotate-up.png | Bin 0 -> 439 bytes assets/cursors/rotate-left.png | Bin 0 -> 554 bytes assets/cursors/rotate-right.png | Bin 0 -> 572 bytes assets/cursors/selection.png | Bin 0 -> 405 bytes assets/cursors/up-down.png | Bin 0 -> 407 bytes assets/freetypefonts/Roboto-Medium.ttf | Bin 0 -> 127488 bytes assets/freetypefonts/arial.ttf | Bin 0 -> 773852 bytes assets/hyperlap_icon_16.png | Bin 0 -> 2358 bytes assets/hyperlap_icon_32.png | Bin 0 -> 3612 bytes assets/hyperlap_icon_48.png | Bin 0 -> 5301 bytes assets/hyperlap_icon_96.png | Bin 0 -> 12002 bytes assets/plugins/plugin-9patch-0.0.1.jar | Bin 0 -> 21998 bytes assets/plugins/plugin-performance-0.0.1.jar | Bin 0 -> 4902 bytes assets/plugins/plugin-tiled-0.0.1.jar | Bin 0 -> 50603 bytes assets/splash/myriad.fnt | 204 + assets/splash/myriad.png | Bin 0 -> 6090 bytes assets/splash/roboto.fnt | 99 + assets/splash/roboto.png | Bin 0 -> 10353 bytes assets/splash/splash.atlas | 34 + assets/splash/splash.png | Bin 0 -> 99168 bytes assets/style/bglogo.png | Bin 0 -> 118055 bytes assets/style/myriad-medium-big.fnt | 4827 +++++++++++++++++ assets/style/myriad-medium-small.fnt | 3178 +++++++++++ assets/style/myriad-medium.fnt | 3951 ++++++++++++++ assets/style/uiskin.atlas | 1506 +++++ assets/style/uiskin.json | 777 +++ assets/style/uiskin.png | Bin 0 -> 142266 bytes build.gradle | 98 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 + gradlew.bat | 100 + h2d-libgdx-spine-extension/build.gradle | 30 + .../spine/SpineComponentFactory.java | 110 + .../extention/spine/SpineDrawableLogic.java | 28 + .../extention/spine/SpineDrawableLogic2.java | 81 + .../h2d/extention/spine/SpineItemType.java | 75 + .../extention/spine/SpineObjectComponent.java | 78 + .../h2d/extention/spine/SpineSystem.java | 61 + hyperlap2d-common-api/build.gradle | 30 + .../java/com/puremvc/core/Controller.java | 80 + .../java/com/puremvc/core/CoreController.java | 200 + .../main/java/com/puremvc/core/CoreModel.java | 153 + .../main/java/com/puremvc/core/CoreView.java | 271 + .../src/main/java/com/puremvc/core/Model.java | 72 + .../src/main/java/com/puremvc/core/View.java | 122 + .../com/puremvc/patterns/command/Command.java | 37 + .../patterns/command/MacroCommand.java | 138 + .../patterns/command/SimpleCommand.java | 53 + .../com/puremvc/patterns/facade/Facade.java | 144 + .../puremvc/patterns/facade/SimpleFacade.java | 364 ++ .../puremvc/patterns/mediator/Mediator.java | 143 + .../patterns/mediator/SimpleMediator.java | 127 + .../patterns/observer/BaseNotification.java | 169 + .../patterns/observer/BaseNotifier.java | 103 + .../patterns/observer/BaseObserver.java | 127 + .../patterns/observer/Notification.java | 103 + .../puremvc/patterns/observer/Notifier.java | 86 + .../puremvc/patterns/observer/Observer.java | 108 + .../com/puremvc/patterns/proxy/BaseProxy.java | 120 + .../com/puremvc/patterns/proxy/Proxy.java | 76 + .../src/main/java/com/vo/CursorData.java | 50 + .../src/main/java/com/vo/EditorConfigVO.java | 39 + .../src/main/java/com/vo/ProjectVO.java | 50 + .../src/main/java/com/vo/SceneConfigVO.java | 32 + .../games/rednblack/h2d/common/H2DDialog.java | 73 + .../rednblack/h2d/common/IItemCommand.java | 29 + .../games/rednblack/h2d/common/MsgAPI.java | 138 + .../h2d/common/ResourcePayloadObject.java | 29 + .../h2d/common/UIDraggablePanel.java | 78 + .../h2d/common/color/ColorChannelWidget.java | 156 + .../h2d/common/color/ColorInputField.java | 129 + .../h2d/common/color/ColorPickerAdapter.java | 41 + .../h2d/common/color/ColorPickerListener.java | 34 + .../h2d/common/color/ColorPickerText.java | 53 + .../h2d/common/color/CustomColorPicker.java | 589 ++ .../h2d/common/plugins/H2DPlugin.java | 37 + .../h2d/common/plugins/H2DPluginAdapter.java | 59 + .../h2d/common/plugins/PluginAPI.java | 178 + .../rednblack/h2d/common/view/tools/Tool.java | 44 + hyperlap2d-runtime-libgdx/build.gradle | 31 + .../com/brashmonkey/spriter/Animation.java | 204 + .../java/com/brashmonkey/spriter/Box.java | 99 + .../com/brashmonkey/spriter/CCDResolver.java | 63 + .../com/brashmonkey/spriter/Calculator.java | 209 + .../java/com/brashmonkey/spriter/Curve.java | 207 + .../java/com/brashmonkey/spriter/Data.java | 153 + .../com/brashmonkey/spriter/Dimension.java | 52 + .../java/com/brashmonkey/spriter/Drawer.java | 265 + .../java/com/brashmonkey/spriter/Entity.java | 241 + .../java/com/brashmonkey/spriter/File.java | 36 + .../brashmonkey/spriter/FileReference.java | 50 + .../java/com/brashmonkey/spriter/Folder.java | 70 + .../com/brashmonkey/spriter/IKObject.java | 68 + .../com/brashmonkey/spriter/IKResolver.java | 113 + .../com/brashmonkey/spriter/Interpolator.java | 75 + .../java/com/brashmonkey/spriter/Loader.java | 117 + .../com/brashmonkey/spriter/Mainline.java | 216 + .../java/com/brashmonkey/spriter/Player.java | 1132 ++++ .../brashmonkey/spriter/PlayerTweener.java | 162 + .../java/com/brashmonkey/spriter/Point.java | 135 + .../com/brashmonkey/spriter/Rectangle.java | 118 + .../com/brashmonkey/spriter/SCMLReader.java | 298 + .../java/com/brashmonkey/spriter/Spriter.java | 264 + .../brashmonkey/spriter/SpriterException.java | 16 + .../com/brashmonkey/spriter/Timeline.java | 277 + .../brashmonkey/spriter/TweenedAnimation.java | 220 + .../com/brashmonkey/spriter/XmlReader.java | 688 +++ .../rednblack/editor/renderer/HyperLap2D.java | 8 + .../editor/renderer/SceneLoader.java | 423 ++ .../renderer/commons/IExternalItemType.java | 39 + .../renderer/components/ActionComponent.java | 12 + .../components/BoundingBoxComponent.java | 34 + .../components/CloneableComponent.java | 28 + .../CompositeTransformComponent.java | 17 + .../components/DimensionsComponent.java | 62 + .../components/LayerMapComponent.java | 76 + .../components/MainItemComponent.java | 40 + .../components/NinePatchComponent.java | 9 + .../renderer/components/NodeComponent.java | 17 + .../components/ParentNodeComponent.java | 8 + .../renderer/components/PolygonComponent.java | 52 + .../components/RemovableComponent.java | 7 + .../renderer/components/ScissorComponent.java | 10 + .../renderer/components/ScriptComponent.java | 40 + .../renderer/components/ShaderComponent.java | 23 + .../components/SpineDataComponent.java | 8 + .../components/TextureRegionComponent.java | 34 + .../renderer/components/TintComponent.java | 8 + .../components/TransformComponent.java | 50 + .../components/ViewPortComponent.java | 8 + .../renderer/components/ZIndexComponent.java | 23 + .../additional/ButtonComponent.java | 47 + .../components/label/LabelComponent.java | 152 + .../components/light/LightBodyComponent.java | 38 + .../light/LightObjectComponent.java | 50 + .../particle/ParticleComponent.java | 26 + .../physics/PhysicsBodyComponent.java | 56 + .../components/sprite/AnimationComponent.java | 10 + .../sprite/SpriteAnimationComponent.java | 18 + .../sprite/SpriteAnimationStateComponent.java | 69 + .../components/spriter/SpriterComponent.java | 21 + .../spriter/SpriterDrawerComponent.java | 8 + .../renderer/data/ColorPrimitiveVO.java | 33 + .../editor/renderer/data/CompositeItemVO.java | 78 + .../editor/renderer/data/CompositeVO.java | 405 ++ .../editor/renderer/data/CoreActorData.java | 16 + .../editor/renderer/data/Essentials.java | 16 + .../editor/renderer/data/FrameRange.java | 20 + .../editor/renderer/data/Image9patchVO.java | 36 + .../editor/renderer/data/LabelVO.java | 48 + .../editor/renderer/data/LayerItemVO.java | 31 + .../editor/renderer/data/LightBodyDataVO.java | 43 + .../editor/renderer/data/LightVO.java | 59 + .../renderer/data/LightsPropertiesVO.java | 32 + .../editor/renderer/data/MainItemVO.java | 124 + .../renderer/data/ParticleEffectVO.java | 29 + .../renderer/data/PhysicsBodyDataVO.java | 59 + .../renderer/data/PhysicsPropertiesVO.java | 25 + .../editor/renderer/data/ProjectInfoVO.java | 40 + .../renderer/data/ResolutionEntryVO.java | 40 + .../renderer/data/RuntimeProjectVO.java | 10 + .../editor/renderer/data/SceneVO.java | 41 + .../editor/renderer/data/SelectBoxVO.java | 21 + .../editor/renderer/data/ShapeVO.java | 37 + .../editor/renderer/data/SimpleImageVO.java | 30 + .../editor/renderer/data/SpineVO.java | 29 + .../renderer/data/SpriteAnimationVO.java | 48 + .../editor/renderer/data/SpriterVO.java | 36 + .../editor/renderer/data/TextBoxVO.java | 21 + .../renderer/factory/EntityFactory.java | 306 ++ .../ColorPrimitiveComponentFactory.java | 89 + .../factory/component/ComponentFactory.java | 243 + .../component/CompositeComponentFactory.java | 93 + .../component/LabelComponentFactory.java | 67 + .../component/LightComponentFactory.java | 93 + .../component/NinePatchComponentFactory.java | 73 + .../ParticleEffectComponentFactory.java | 76 + .../SimpleImageComponentFactory.java | 95 + .../component/SpriteComponentFactory.java | 138 + .../component/SpriterComponentFactory.java | 100 + .../renderer/physics/PhysicsBodyLoader.java | 111 + .../renderer/physics/PhysicsContact.java | 8 + .../renderer/resources/FontSizePair.java | 35 + .../renderer/resources/IAssetLoader.java | 16 + .../renderer/resources/IDataLoader.java | 14 + .../renderer/resources/IResourceLoader.java | 9 + .../resources/IResourceRetriever.java | 34 + .../renderer/resources/ResourceManager.java | 444 ++ .../resources/ResourceManagerLoader.java | 171 + .../renderer/scene2d/ButtonClickListener.java | 26 + .../renderer/scene2d/CompositeActor.java | 357 ++ .../editor/renderer/scripts/BasicScript.java | 20 + .../editor/renderer/scripts/IActorScript.java | 12 + .../editor/renderer/scripts/IScript.java | 12 + .../renderer/systems/BoundingBoxSystem.java | 149 + .../editor/renderer/systems/ButtonSystem.java | 81 + .../renderer/systems/CompositeSystem.java | 144 + .../renderer/systems/CullingSystem.java | 74 + .../editor/renderer/systems/LabelSystem.java | 181 + .../editor/renderer/systems/LayerSystem.java | 95 + .../editor/renderer/systems/LightSystem.java | 177 + .../renderer/systems/ParticleSystem.java | 39 + .../renderer/systems/PhysicsSystem.java | 173 + .../editor/renderer/systems/ScriptSystem.java | 27 + .../systems/SpriteAnimationSystem.java | 35 + .../renderer/systems/action/ActionSystem.java | 39 + .../renderer/systems/action/Actions.java | 280 + .../systems/action/PhysicsActions.java | 69 + .../systems/action/data/ActionData.java | 9 + .../systems/action/data/AlphaData.java | 15 + .../systems/action/data/ColorData.java | 17 + .../systems/action/data/ComponentData.java | 10 + .../systems/action/data/DelayData.java | 14 + .../systems/action/data/DelegateData.java | 10 + .../systems/action/data/ForceData.java | 21 + .../systems/action/data/MoveByData.java | 18 + .../systems/action/data/MoveToData.java | 19 + .../systems/action/data/ParallelData.java | 13 + .../action/data/RelativeTemporalData.java | 14 + .../systems/action/data/RotateByData.java | 15 + .../systems/action/data/RotateToData.java | 16 + .../systems/action/data/RunnableData.java | 14 + .../systems/action/data/ScaleByData.java | 16 + .../systems/action/data/ScaleToData.java | 17 + .../systems/action/data/SequenceData.java | 13 + .../systems/action/data/SizeByData.java | 16 + .../systems/action/data/SizeToData.java | 17 + .../systems/action/data/TemporalData.java | 20 + .../systems/action/logic/ActionLogic.java | 12 + .../systems/action/logic/AlphaAction.java | 23 + .../systems/action/logic/ColorAction.java | 30 + .../systems/action/logic/ComponentAction.java | 20 + .../systems/action/logic/DelayAction.java | 21 + .../systems/action/logic/DelegateAction.java | 16 + .../systems/action/logic/ForceAction.java | 33 + .../systems/action/logic/MoveByAction.java | 22 + .../systems/action/logic/MoveToAction.java | 34 + .../systems/action/logic/ParallelAction.java | 27 + .../action/logic/RelativeTemporalAction.java | 23 + .../systems/action/logic/RotateByAction.java | 18 + .../systems/action/logic/RotateToAction.java | 23 + .../systems/action/logic/RunnableAction.java | 22 + .../systems/action/logic/ScaleByAction.java | 18 + .../systems/action/logic/ScaleToAction.java | 25 + .../systems/action/logic/SequenceAction.java | 21 + .../systems/action/logic/SizeByAction.java | 18 + .../systems/action/logic/SizeToAction.java | 25 + .../systems/action/logic/TemporalAction.java | 42 + .../systems/render/HyperLap2dRenderer.java | 322 ++ .../systems/render/ShaderManager.java | 254 + .../systems/render/logic/Drawable.java | 8 + .../render/logic/DrawableLogicMapper.java | 32 + .../render/logic/LabelDrawableLogic.java | 53 + .../render/logic/LightDrawableLogic.java | 37 + .../render/logic/NinePatchDrawableLogic.java | 35 + .../render/logic/ParticleDrawableLogic.java | 29 + .../render/logic/SpriteDrawableLogic.java | 14 + .../render/logic/SpriterDrawableLogic.java | 39 + .../render/logic/TextureRegionDrawLogic.java | 93 + .../renderer/utils/ComponentRetriever.java | 167 + .../renderer/utils/CustomVariables.java | 80 + .../editor/renderer/utils/ForceUtils.java | 39 + .../editor/renderer/utils/ItemWrapper.java | 99 + .../editor/renderer/utils/LibGdxDrawer.java | 64 + .../editor/renderer/utils/LibGdxLoader.java | 138 + .../editor/renderer/utils/MySkin.java | 514 ++ .../editor/renderer/utils/PolygonUtils.java | 215 + .../renderer/utils/TransformMathUtils.java | 148 + plugin-9patch/build.gradle | 35 + .../editor/plugin/ninepatch/EditingZone.java | 265 + .../editor/plugin/ninepatch/ImageUtils.java | 232 + .../editor/plugin/ninepatch/MainPanel.java | 113 + .../plugin/ninepatch/MainPanelMediator.java | 155 + .../plugin/ninepatch/NinePatchPlugin.java | 57 + .../plugin/ninepatch/PreviewWidget.java | 79 + plugin-performance/build.gradle | 35 + .../plugin/performance/PerformancePanel.java | 67 + .../performance/PerformancePanelMediator.java | 48 + .../plugin/performance/PerformancePlugin.java | 24 + plugin-tiled/assets/pack/tiled.atlas | 88 + plugin-tiled/assets/pack/tiled.png | Bin 0 -> 4744 bytes .../assets/textures/image-Box-active.9.png | Bin 0 -> 96 bytes .../assets/textures/image-Box-inactive.9.png | Bin 0 -> 97 bytes .../assets/textures/plugin-tab-active.9.png | Bin 0 -> 187 bytes .../assets/textures/plugin-tab-inactive.9.png | Bin 0 -> 166 bytes .../assets/textures/tab-back-line.9.png | Bin 0 -> 81 bytes plugin-tiled/assets/textures/tile-eraser.png | Bin 0 -> 1141 bytes plugin-tiled/assets/textures/tile.png | Bin 0 -> 1091 bytes .../textures/tiles-drop-here-normal.png | Bin 0 -> 1682 bytes .../assets/textures/tiles-drop-here-over.png | Bin 0 -> 1685 bytes .../assets/textures/tool-tilebrush.png | Bin 0 -> 1368 bytes .../assets/textures/tool-tileeraser.png | Bin 0 -> 1129 bytes plugin-tiled/build.gradle | 48 + .../editor/plugin/tiled/TiledPanel.java | 233 + .../plugin/tiled/TiledPanelMediator.java | 210 + .../editor/plugin/tiled/TiledPlugin.java | 232 + .../editor/plugin/tiled/data/AttributeVO.java | 34 + .../editor/plugin/tiled/data/CategoryVO.java | 17 + .../editor/plugin/tiled/data/ParameterVO.java | 13 + .../editor/plugin/tiled/data/TileVO.java | 26 + .../tiled/manager/ResourcesManager.java | 70 + .../plugin/tiled/offset/OffsetPanel.java | 76 + .../tiled/offset/OffsetPanelMediator.java | 56 + .../editor/plugin/tiled/save/DataToSave.java | 81 + .../plugin/tiled/save/SaveDataManager.java | 38 + .../plugin/tiled/tools/DeleteTileTool.java | 127 + .../plugin/tiled/tools/DrawTileTool.java | 197 + .../editor/plugin/tiled/view/Attribute.java | 29 + .../editor/plugin/tiled/view/Category.java | 62 + .../plugin/tiled/view/tabs/DefaultTab.java | 42 + .../plugin/tiled/view/tabs/GridTilesTab.java | 202 + .../plugin/tiled/view/tabs/SettingsTab.java | 74 + settings.gradle | 8 + .../editor/CustomExceptionHandler.java | 126 + .../games/rednblack/editor/HyperLap2D.java | 188 + .../games/rednblack/editor/HyperLap2DApp.java | 117 + .../rednblack/editor/HyperLap2DFacade.java | 77 + .../java/games/rednblack/editor/Main.java | 42 + .../java/games/rednblack/editor/Sync.java | 147 + .../editor/controller/BootstrapCommand.java | 93 + .../editor/controller/BootstrapPlugins.java | 68 + .../controller/BootstrapProxyCommand.java | 53 + .../controller/BootstrapViewCommand.java | 89 + .../editor/controller/SandboxCommand.java | 36 + .../editor/controller/StartupCommand.java | 36 + .../commands/AddComponentToItemCommand.java | 49 + .../commands/AddSelectionCommand.java | 57 + .../commands/AddToLibraryCommand.java | 111 + .../commands/ChangeRulerPositionCommand.java | 56 + .../CompositeCameraChangeCommand.java | 89 + .../commands/ConvertToButtonCommand.java | 67 + .../commands/ConvertToCompositeCommand.java | 142 + .../controller/commands/CopyItemsCommand.java | 113 + .../commands/CreateItemCommand.java | 74 + .../commands/CreatePrimitiveCommand.java | 43 + .../commands/CustomVariableModifyCommand.java | 91 + .../controller/commands/CutItemsCommand.java | 64 + .../commands/DeleteItemsCommand.java | 93 + .../commands/DeleteLayerAtomCommand.java | 50 + .../commands/DeleteLayerCommand.java | 58 + .../EntityModifyRevertableCommand.java | 84 + .../commands/ExportProjectCommand.java | 35 + .../ItemChildrenTransformCommand.java | 126 + .../commands/ItemTransformCommand.java | 77 + .../controller/commands/ItemsMoveCommand.java | 84 + .../controller/commands/LayerSwapCommand.java | 68 + .../controller/commands/NewLayerCommand.java | 51 + .../commands/NonRevertibleCommand.java | 45 + .../commands/PasteItemsCommand.java | 159 + .../commands/PluginItemCommand.java | 53 + .../commands/ReleaseSelectionCommand.java | 57 + .../RemoveComponentFromItemCommand.java | 55 + .../commands/RenameLayerCommand.java | 81 + .../commands/RevertableCommand.java | 71 + .../commands/SaveExportPathCommand.java | 38 + .../commands/SetSelectionCommand.java | 78 + .../commands/TransactiveCommand.java | 53 + .../UpdateEntityComponentsCommand.java | 68 + .../component/UpdateLabelDataCommand.java | 98 + .../component/UpdateLightBodyDataCommand.java | 73 + .../component/UpdateLightDataCommand.java | 85 + .../UpdatePolygonComponentCommand.java | 139 + .../UpdateSpriteAnimationDataCommand.java | 61 + .../resource/DeleteImageResource.java | 79 + .../commands/resource/DeleteLibraryItem.java | 39 + .../resource/DeleteParticleEffect.java | 76 + .../resource/DeleteSpineAnimation.java | 78 + .../resource/DeleteSpriteAnimation.java | 80 + .../resource/DeleteSpriterAnimation.java | 77 + .../games/rednblack/editor/data/JarUtils.java | 118 + .../rednblack/editor/data/SpineAnimData.java | 31 + .../data/manager/PreferencesManager.java | 159 + .../data/migrations/IVersionMigrator.java | 29 + .../migrations/ProjectVersionMigrator.java | 110 + .../data/migrations/migrators/DummyMig.java | 36 + .../migrations/migrators/VersionMigTo005.java | 103 + .../migrations/migrators/VersionMigTo009.java | 174 + .../event/ButtonToNotificationListener.java | 22 + .../editor/event/CheckBoxChangeListener.java | 42 + .../rednblack/editor/event/ClickNotifier.java | 41 + .../EditableSelectBoxChangeListener.java | 48 + .../editor/event/KeyboardListener.java | 97 + .../editor/event/MenuItemListener.java | 48 + .../event/NumberSelectorOverlapListener.java | 42 + .../editor/event/SelectBoxChangeListener.java | 48 + .../rednblack/editor/factory/ItemFactory.java | 259 + .../editor/proxy/CommandManager.java | 112 + .../rednblack/editor/proxy/CursorManager.java | 108 + .../editor/proxy/EditorTextureManager.java | 70 + .../rednblack/editor/proxy/FontManager.java | 196 + .../rednblack/editor/proxy/PluginManager.java | 258 + .../editor/proxy/ProjectManager.java | 1323 +++++ .../editor/proxy/ResolutionManager.java | 509 ++ .../editor/proxy/ResourceManager.java | 426 ++ .../editor/proxy/SceneDataManager.java | 144 + .../editor/splash/SplashMediator.java | 47 + .../rednblack/editor/splash/SplashScreen.java | 33 + .../editor/splash/SplashScreenAdapter.java | 62 + .../rednblack/editor/splash/SplashStage.java | 79 + .../editor/system/PhysicsAdjustSystem.java | 38 + .../rednblack/editor/utils/AppConfig.java | 72 + .../rednblack/editor/utils/Constants.java | 12 + .../rednblack/editor/utils/EntityBounds.java | 193 + .../games/rednblack/editor/utils/Guide.java | 13 + .../editor/utils/HyperLap2DUtils.java | 70 + .../rednblack/editor/utils/ImportUtils.java | 288 + .../rednblack/editor/utils/InputFilters.java | 16 + .../editor/utils/MoveCommandBuilder.java | 65 + .../editor/utils/NinePatchUtils.java | 191 + .../rednblack/editor/utils/RoundUtils.java | 12 + .../editor/utils/StandardWidgetsFactory.java | 191 + .../editor/utils/TransformCommandBuilder.java | 79 + .../editor/utils/TransformUtils.java | 73 + .../rednblack/editor/utils/poly/Clipper.java | 105 + .../editor/utils/poly/PolygonUtils.java | 48 + .../editor/utils/poly/TextureUtils.java | 126 + .../bayazit/BayazitDecomposer.java | 700 +++ .../ewjordan/EwjordanDecomposer.java | 206 + .../poly/earclipping/ewjordan/Polygon.java | 150 + .../poly/earclipping/ewjordan/Triangle.java | 74 + .../utils/poly/tracer/TextureConverter.java | 964 ++++ .../editor/utils/poly/tracer/Tracer.java | 83 + .../editor/utils/runtime/ComponentCloner.java | 78 + .../editor/utils/runtime/EntityUtils.java | 306 ++ .../editor/view/HyperLap2DScreen.java | 235 + .../editor/view/HyperLap2DScreenMediator.java | 94 + .../editor/view/ItemControlMediator.java | 69 + .../editor/view/SceneControlMediator.java | 119 + .../editor/view/frame/FileDropListener.java | 76 + .../rednblack/editor/view/menu/EditMenu.java | 44 + .../rednblack/editor/view/menu/FileMenu.java | 153 + .../rednblack/editor/view/menu/H2DMenu.java | 16 + .../rednblack/editor/view/menu/HelpMenu.java | 32 + .../editor/view/menu/HyperLap2DMenuBar.java | 92 + .../view/menu/HyperLap2DMenuBarMediator.java | 271 + .../editor/view/menu/WindowMenu.java | 30 + .../editor/view/stage/ItemSelector.java | 554 ++ .../rednblack/editor/view/stage/Sandbox.java | 522 ++ .../editor/view/stage/SandboxMediator.java | 513 ++ .../rednblack/editor/view/stage/UIStage.java | 134 + .../editor/view/stage/UIStageMediator.java | 80 + .../view/stage/input/EntityClickListener.java | 223 + .../view/stage/input/InputListener.java | 23 + .../stage/input/InputListenerComponent.java | 29 + .../view/stage/input/SandboxInputAdapter.java | 253 + .../view/stage/tools/ConeLightTool.java | 65 + .../editor/view/stage/tools/ItemDropTool.java | 67 + .../editor/view/stage/tools/PanTool.java | 115 + .../view/stage/tools/PointLightTool.java | 63 + .../editor/view/stage/tools/PolygonTool.java | 335 ++ .../view/stage/tools/SelectionTool.java | 515 ++ .../editor/view/stage/tools/SimpleTool.java | 92 + .../editor/view/stage/tools/TextTool.java | 153 + .../view/stage/tools/TransformTool.java | 258 + .../AbstractTransformStrategy.java | 61 + .../transformStrategy/BasicStrategy.java | 124 + .../ColorPrimitiveStrategy.java | 69 + .../transformStrategy/CompositeStrategy.java | 243 + .../transformStrategy/ITransformStrategy.java | 12 + .../transformStrategy/LabelStrategy.java | 68 + .../transformStrategy/NinePatchStrategy.java | 125 + .../rednblack/editor/view/ui/FollowersUI.java | 33 + .../editor/view/ui/FollowersUIMediator.java | 210 + .../rednblack/editor/view/ui/RulersUI.java | 464 ++ .../editor/view/ui/RulersUIMediator.java | 91 + .../editor/view/ui/UIDropDownMenu.java | 91 + .../view/ui/UIDropDownMenuMediator.java | 201 + .../rednblack/editor/view/ui/UIMainTable.java | 134 + .../editor/view/ui/UISubmenuBar.java | 67 + .../editor/view/ui/box/PanelMediator.java | 57 + .../editor/view/ui/box/UIAlignBox.java | 147 + .../view/ui/box/UIAlignBoxMediator.java | 120 + .../editor/view/ui/box/UIBaseBox.java | 37 + .../editor/view/ui/box/UICollapsibleBox.java | 64 + .../view/ui/box/UICompositeHierarchy.java | 69 + .../ui/box/UICompositeHierarchyMediator.java | 134 + .../editor/view/ui/box/UIGridBox.java | 89 + .../editor/view/ui/box/UIGridBoxMediator.java | 86 + .../editor/view/ui/box/UIItemsTreeBox.java | 181 + .../view/ui/box/UIItemsTreeBoxMediator.java | 101 + .../editor/view/ui/box/UIItemsTreeNode.java | 11 + .../editor/view/ui/box/UIItemsTreeValue.java | 11 + .../editor/view/ui/box/UILayerBox.java | 448 ++ .../view/ui/box/UILayerBoxMediator.java | 344 ++ .../view/ui/box/UIMultiPropertyBox.java | 63 + .../ui/box/UIMultiPropertyBoxMediator.java | 215 + .../editor/view/ui/box/UIResolutionBox.java | 144 + .../view/ui/box/UIResolutionBoxMediator.java | 107 + .../editor/view/ui/box/UIResourcesBox.java | 81 + .../view/ui/box/UIResourcesBoxMediator.java | 119 + .../editor/view/ui/box/UIToolBox.java | 98 + .../editor/view/ui/box/UIToolBoxMediator.java | 118 + .../editor/view/ui/box/UIZoomBox.java | 118 + .../editor/view/ui/box/UIZoomBoxMediator.java | 80 + .../box/resourcespanel/UIAnimationsTab.java | 56 + .../UIAnimationsTabMediator.java | 109 + .../ui/box/resourcespanel/UIImagesTab.java | 61 + .../resourcespanel/UIImagesTabMediator.java | 92 + .../box/resourcespanel/UILibraryItemsTab.java | 53 + .../UILibraryItemsTabMediator.java | 89 + .../resourcespanel/UIParticleEffectsTab.java | 55 + .../UIParticleEffectsTabMediator.java | 81 + .../ui/box/resourcespanel/UIResourcesTab.java | 85 + .../UIResourcesTabMediator.java | 72 + .../draggable/DraggableResource.java | 113 + .../draggable/DraggableResourceView.java | 31 + .../draggable/box/BoxItemResource.java | 64 + .../draggable/box/ImageResource.java | 73 + .../draggable/box/SpineResource.java | 118 + .../draggable/box/SpriteResource.java | 110 + .../draggable/box/SpriterResource.java | 95 + .../draggable/list/LibraryItemResource.java | 61 + .../draggable/list/ListItemResource.java | 86 + .../list/ParticleEffectResource.java | 58 + .../editor/view/ui/dialog/AboutDialog.java | 52 + .../view/ui/dialog/AboutDialogMediator.java | 43 + .../ui/dialog/CreateNewResolutionDialog.java | 102 + .../CreateNewResolutionDialogMediator.java | 72 + .../view/ui/dialog/ExportSettingsDialog.java | 126 + .../dialog/ExportSettingsDialogMediator.java | 97 + .../editor/view/ui/dialog/ImportDialog.java | 252 + .../view/ui/dialog/ImportDialogMediator.java | 310 ++ .../view/ui/dialog/NewProjectDialog.java | 149 + .../ui/dialog/NewProjectDialogMediator.java | 80 + .../view/ui/dialog/PhysicsEditorDialog.java | 426 ++ .../dialog/PhysicsEditorDialogMediator.java | 208 + .../view/ui/dialog/SaveDocumentDialog.java | 63 + .../ui/dialog/SaveDocumentDialogMediator.java | 54 + .../view/ui/followers/AnchorListener.java | 78 + .../view/ui/followers/BasicFollower.java | 184 + .../EmptyTransformationListener.java | 50 + .../view/ui/followers/FollowerFactory.java | 42 + .../FollowerTransformationListener.java | 30 + .../view/ui/followers/ImageFollower.java | 26 + .../view/ui/followers/LightFollower.java | 70 + .../ui/followers/NormalSelectionFollower.java | 248 + .../view/ui/followers/ParticleFollower.java | 51 + .../view/ui/followers/PolygonFollower.java | 368 ++ .../PolygonTransformationListener.java | 33 + .../editor/view/ui/followers/SubFollower.java | 31 + .../view/ui/panel/CustomVariablesPanel.java | 178 + .../panel/CustomVariablesPanelMediator.java | 130 + .../ui/panel/EditSpriteAnimationPanel.java | 171 + .../EditSpriteAnimationPanelMediator.java | 145 + .../editor/view/ui/panel/TagItem.java | 41 + .../editor/view/ui/panel/TagsPanel.java | 107 + .../view/ui/panel/TagsPanelMediator.java | 88 + .../ui/properties/UIAbstractProperties.java | 42 + .../UIAbstractPropertiesMediator.java | 94 + .../UIItemCollapsibleProperties.java | 75 + .../view/ui/properties/UIItemProperties.java | 40 + .../properties/UIItemPropertiesMediator.java | 58 + .../ui/properties/UIRemovableProperties.java | 49 + .../panels/UIBasicItemProperties.java | 372 ++ .../panels/UIBasicItemPropertiesMediator.java | 243 + .../panels/UICompositeItemProperties.java | 73 + .../UICompositeItemPropertiesMediator.java | 66 + .../panels/UIImageItemProperties.java | 54 + .../panels/UIImageItemPropertiesMediator.java | 64 + .../panels/UILabelItemProperties.java | 200 + .../panels/UILabelItemPropertiesMediator.java | 87 + .../panels/UILightBodyProperties.java | 188 + .../panels/UILightBodyPropertiesMediator.java | 110 + .../panels/UILightItemProperties.java | 228 + .../panels/UILightItemPropertiesMediator.java | 82 + .../panels/UIPhysicsProperties.java | 211 + .../panels/UIPhysicsPropertiesMediator.java | 89 + .../panels/UIPolygonComponentProperties.java | 96 + .../UIPolygonComponentPropertiesMediator.java | 130 + .../properties/panels/UISceneProperties.java | 274 + .../panels/UIScenePropertiesMediator.java | 159 + .../properties/panels/UIShaderProperties.java | 75 + .../panels/UIShaderPropertiesMediator.java | 102 + .../UISpineAnimationItemProperties.java | 67 + ...ISpineAnimationItemPropertiesMediator.java | 62 + .../UISpriteAnimationItemProperties.java | 153 + ...SpriteAnimationItemPropertiesMediator.java | 89 + .../panels/UITextToolProperties.java | 17 + .../panels/UITextToolPropertiesMediator.java | 47 + .../ui/validator/EmptyOrDefaultValidator.java | 15 + .../validator/NewProjectDialogValidator.java | 16 + .../editor/view/ui/widget/CursorListener.java | 49 + .../editor/view/ui/widget/CustomMenu.java | 80 + .../editor/view/ui/widget/CustomMenuBar.java | 104 + .../view/ui/widget/EditableSelectBox.java | 123 + .../editor/view/ui/widget/EmptyTarget.java | 32 + .../editor/view/ui/widget/H2DLogo.java | 36 + .../view/ui/widget/InputFileWidget.java | 143 + .../view/ui/widget/ProgressHandler.java | 31 + .../editor/view/ui/widget/SandboxUI.java | 34 + .../view/ui/widget/ScrollFocusListener.java | 22 + .../view/ui/widget/actors/GridView.java | 153 + .../ui/widget/actors/ResolutionBounds.java | 81 + .../view/ui/widget/actors/SpineActor.java | 128 + .../widget/actors/SpriteAnimationActor.java | 66 + .../view/ui/widget/actors/SpriterActor.java | 127 + .../ui/widget/actors/basic/PixelLine.java | 78 + .../ui/widget/actors/basic/PixelRect.java | 129 + .../ui/widget/actors/basic/SandboxBackUI.java | 60 + .../view/ui/widget/components/TintButton.java | 67 + src/test/java/Box2DLauncher.java | 14 + src/test/java/Box2dLightTest.java | 539 ++ src/test/resources/data/bg-deferred-n.png | Bin 0 -> 21165 bytes src/test/resources/data/bg-deferred.png | Bin 0 -> 13328 bytes src/test/resources/data/bg.png | Bin 0 -> 394660 bytes src/test/resources/data/marble-n.png | Bin 0 -> 6383 bytes src/test/resources/data/marble.png | Bin 0 -> 9522 bytes src/test/resources/data/object-deferred-n.png | Bin 0 -> 6637 bytes src/test/resources/data/object-deferred.png | Bin 0 -> 5282 bytes 839 files changed, 86083 insertions(+) create mode 100644 .gitignore create mode 100644 art/font/myriad-medium-big.fnt create mode 100644 art/font/myriad-medium-big.png create mode 100644 art/font/myriad-medium-small.fnt create mode 100644 art/font/myriad-medium-small.png create mode 100644 art/font/myriad-medium.fnt create mode 100644 art/font/myriad-medium.png create mode 100644 art/splash_textures/bg_color.png create mode 100644 art/splash_textures/splash_bg.png create mode 100644 art/splash_textures/splash_logo.png create mode 100644 art/splash_textures/splash_logo_text.png create mode 100644 art/textures/align-center-horisontal.png create mode 100644 art/textures/align-center-vertical.png create mode 100644 art/textures/align-edge-down.png create mode 100644 art/textures/align-edge-left.png create mode 100644 art/textures/align-edge-right.png create mode 100644 art/textures/align-edge-up.png create mode 100644 art/textures/align-simple-down.png create mode 100644 art/textures/align-simple-left.png create mode 100644 art/textures/align-simple-right.png create mode 100644 art/textures/align-simple-up.png create mode 100644 art/textures/alpha-bar-10px.png create mode 100644 art/textures/alpha-bar-25px-shifted.png create mode 100644 art/textures/alpha-bar-25px.png create mode 100644 art/textures/border-circle-error.png create mode 100644 art/textures/border-circle.png create mode 100644 art/textures/border-error.9.png create mode 100644 art/textures/border.9.png create mode 100644 art/textures/box-colapse-off.png create mode 100644 art/textures/box-colapse-on.png create mode 100644 art/textures/box.9.png create mode 100644 art/textures/button-dark-down.9.png create mode 100644 art/textures/button-dark-over.9.png create mode 100644 art/textures/button-dark.9.png create mode 100644 art/textures/button-down.9.png create mode 100644 art/textures/button-orange-down.9.png create mode 100644 art/textures/button-orange-over.9.png create mode 100644 art/textures/button-orange.9.png create mode 100644 art/textures/button-over.9.png create mode 100644 art/textures/button-red.9.png create mode 100644 art/textures/button-resource-over.9.png create mode 100644 art/textures/button-resource.9.png create mode 100644 art/textures/button.9.png create mode 100644 art/textures/check-down-on.png create mode 100644 art/textures/check-down.png create mode 100644 art/textures/check-off.png create mode 100644 art/textures/check-on-disabled.png create mode 100644 art/textures/check-on.png create mode 100644 art/textures/check-over-off.png create mode 100644 art/textures/check-over-on.png create mode 100644 art/textures/color-picker-bar-selector.png create mode 100644 art/textures/color-picker-cross.png create mode 100644 art/textures/color-picker-selector-horizontal.png create mode 100644 art/textures/color-picker-selector-vertical.png create mode 100644 art/textures/cursor.9.png create mode 100644 art/textures/default-pane-noborder.9.png create mode 100644 art/textures/default-pane.9.png create mode 100644 art/textures/default-select-selection.9.png create mode 100644 art/textures/default-select-white-over.9.png create mode 100644 art/textures/default-select-white.9.png create mode 100644 art/textures/default-select.9.png create mode 100644 art/textures/dropHere.png create mode 100644 art/textures/expandable-properties-active-bg.9.png create mode 100644 art/textures/expandable-properties-collapse-off.png create mode 100644 art/textures/expandable-properties-collapse-on.png create mode 100644 art/textures/expandable-properties-inactive-bg.9.png create mode 100644 art/textures/icon-animation.png create mode 100644 art/textures/icon-arrow-left.png create mode 100644 art/textures/icon-arrow-right.png create mode 100644 art/textures/icon-close-orange-down.png create mode 100644 art/textures/icon-close-orange-over.png create mode 100644 art/textures/icon-close-orange.png create mode 100644 art/textures/icon-close-small.png create mode 100644 art/textures/icon-close.png create mode 100644 art/textures/icon-composite.png create mode 100644 art/textures/icon-composite2.png create mode 100644 art/textures/icon-drive.png create mode 100644 art/textures/icon-file-audio.png create mode 100644 art/textures/icon-file-image.png create mode 100644 art/textures/icon-file-pdf.png create mode 100644 art/textures/icon-file-text.png create mode 100644 art/textures/icon-folder-new.png create mode 100644 art/textures/icon-folder-parent.png create mode 100644 art/textures/icon-folder-star.png create mode 100644 art/textures/icon-folder.png create mode 100644 art/textures/icon-group.png create mode 100644 art/textures/icon-image.png create mode 100644 art/textures/icon-label.png create mode 100644 art/textures/icon-library-over.png create mode 100644 art/textures/icon-library.png create mode 100644 art/textures/icon-link-active.png create mode 100644 art/textures/icon-link-inactive.png create mode 100644 art/textures/icon-list-settings.png create mode 100644 art/textures/icon-lock-active.png create mode 100644 art/textures/icon-lock-inactive.png create mode 100644 art/textures/icon-new-layer.png create mode 100644 art/textures/icon-particle-over.png create mode 100644 art/textures/icon-particle-white.png create mode 100644 art/textures/icon-particle.png create mode 100644 art/textures/icon-refresh.png create mode 100644 art/textures/icon-root.png create mode 100644 art/textures/icon-spine.png create mode 100644 art/textures/icon-star-outline.png create mode 100644 art/textures/icon-star.png create mode 100644 art/textures/icon-trash-disabled.png create mode 100644 art/textures/icon-trash-over.png create mode 100644 art/textures/icon-trash.png create mode 100644 art/textures/icon-unlink-active.png create mode 100644 art/textures/icon-unlink-inactive.png create mode 100644 art/textures/icon-visible-off.png create mode 100644 art/textures/icon-visible-on.png create mode 100644 art/textures/icon-zoomin-disabled.png create mode 100644 art/textures/icon-zoomin-over.png create mode 100644 art/textures/icon-zoomin.png create mode 100644 art/textures/icon-zoomout-disabled.png create mode 100644 art/textures/icon-zoomout-over.png create mode 100644 art/textures/icon-zoomout.png create mode 100644 art/textures/layer-bg-over.9.png create mode 100644 art/textures/layer-bg.9.png create mode 100644 art/textures/list-selection-white.png create mode 100644 art/textures/list-selection.png create mode 100644 art/textures/logo.png create mode 100644 art/textures/menu-bg-down.9.png create mode 100644 art/textures/menu-bg-over.9.png create mode 100644 art/textures/menu-bg-up.9.png create mode 100644 art/textures/menu-bg.9.png create mode 100644 art/textures/myriad-medium-big.png create mode 100644 art/textures/myriad-medium-small.png create mode 100644 art/textures/myriad-medium.png create mode 100644 art/textures/origin-anchor.png create mode 100644 art/textures/popup-menu-disabled.9.png create mode 100644 art/textures/popup-menu-down.9.png create mode 100644 art/textures/popup-menu-over.9.png create mode 100644 art/textures/popup-menu.9.png create mode 100644 art/textures/progressbar-filled-vertical.png create mode 100644 art/textures/progressbar-filled.png create mode 100644 art/textures/progressbar-vertical.png create mode 100644 art/textures/progressbar.png create mode 100644 art/textures/radio-down-on.png create mode 100644 art/textures/radio-down.png create mode 100644 art/textures/radio-off.png create mode 100644 art/textures/radio-on-disabled.png create mode 100644 art/textures/radio-on.png create mode 100644 art/textures/radio-over-off.png create mode 100644 art/textures/radio-over-on.png create mode 100644 art/textures/scroll-horizontal.9.png create mode 100644 art/textures/scroll-knob-horizontal.9.png create mode 100644 art/textures/scroll-knob-vertical.9.png create mode 100644 art/textures/scroll.9.png create mode 100644 art/textures/select-box-list-bg-white.png create mode 100644 art/textures/select-box-list-bg.png create mode 100644 art/textures/select-down.png create mode 100644 art/textures/select-up.png create mode 100644 art/textures/selection-anchor.png create mode 100644 art/textures/selection.png create mode 100644 art/textures/separator-menu.png create mode 100644 art/textures/separator-vertical.png create mode 100644 art/textures/separator.png create mode 100644 art/textures/slider-knob-disabled.png create mode 100644 art/textures/slider-knob-down.png create mode 100644 art/textures/slider-knob-over.png create mode 100644 art/textures/slider-knob.png create mode 100644 art/textures/slider-vertical.png create mode 100644 art/textures/slider.png create mode 100644 art/textures/splash_logo.png create mode 100644 art/textures/splitpane-over.png create mode 100644 art/textures/splitpane-vertical-over.png create mode 100644 art/textures/splitpane-vertical.png create mode 100644 art/textures/splitpane.png create mode 100644 art/textures/static-text.9.png create mode 100644 art/textures/sub-menu-bg.9.png create mode 100644 art/textures/sub-menu.png create mode 100644 art/textures/tab-active.9.png create mode 100644 art/textures/tab-inactive.9.png create mode 100644 art/textures/textfield-light-down.9.png create mode 100644 art/textures/textfield-light-over.9.png create mode 100644 art/textures/textfield-light.9.png create mode 100644 art/textures/textfield-over.9.png create mode 100644 art/textures/textfield.9.png create mode 100644 art/textures/thumbnail-over.9.png create mode 100644 art/textures/thumbnail.9.png create mode 100644 art/textures/tint-border.9.png create mode 100644 art/textures/tool-align.png create mode 100644 art/textures/tool-conuslight.png create mode 100644 art/textures/tool-label.png create mode 100644 art/textures/tool-mesh.png create mode 100644 art/textures/tool-move.png create mode 100644 art/textures/tool-sphericlight.png create mode 100644 art/textures/tool-transform.png create mode 100644 art/textures/toolbar-bg.9.png create mode 100644 art/textures/toolbar-down.9.png create mode 100644 art/textures/toolbar-normal.9.png create mode 100644 art/textures/toolbar-over.9.png create mode 100644 art/textures/tooltip-bg.9.png create mode 100644 art/textures/touchpad-knob.png create mode 100644 art/textures/tree-minus.png create mode 100644 art/textures/tree-over.png create mode 100644 art/textures/tree-plus.png create mode 100644 art/textures/tree-selection.9.png create mode 100644 art/textures/vis-blue.png create mode 100644 art/textures/vis-check-down.png create mode 100644 art/textures/vis-check-over.png create mode 100644 art/textures/vis-check-tick-disabled.png create mode 100644 art/textures/vis-check-tick.png create mode 100644 art/textures/vis-check.png create mode 100644 art/textures/vis-radio-down.png create mode 100644 art/textures/vis-radio-over.png create mode 100644 art/textures/vis-radio-tick-disabled.png create mode 100644 art/textures/vis-radio-tick.png create mode 100644 art/textures/vis-radio.png create mode 100644 art/textures/vis-red.png create mode 100644 art/textures/white.png create mode 100644 art/textures/window-bg.png create mode 100644 art/textures/window-noborder.9.png create mode 100644 art/textures/window.9.png create mode 100644 assets/configs/app.properties create mode 100644 assets/configs/config.pit create mode 100644 assets/cursors/cross.png create mode 100644 assets/cursors/eyedropper.png create mode 100644 assets/cursors/fingerpoint.png create mode 100644 assets/cursors/label-tool.png create mode 100644 assets/cursors/label.png create mode 100644 assets/cursors/left-down-up.png create mode 100644 assets/cursors/left-right.png create mode 100644 assets/cursors/left-rotate-down.png create mode 100644 assets/cursors/left-rotate-up.png create mode 100644 assets/cursors/normal.png create mode 100644 assets/cursors/right-down-up.png create mode 100644 assets/cursors/right-rotate-down.png create mode 100644 assets/cursors/right-rotate-up.png create mode 100644 assets/cursors/rotate-left.png create mode 100644 assets/cursors/rotate-right.png create mode 100644 assets/cursors/selection.png create mode 100644 assets/cursors/up-down.png create mode 100644 assets/freetypefonts/Roboto-Medium.ttf create mode 100644 assets/freetypefonts/arial.ttf create mode 100644 assets/hyperlap_icon_16.png create mode 100644 assets/hyperlap_icon_32.png create mode 100644 assets/hyperlap_icon_48.png create mode 100644 assets/hyperlap_icon_96.png create mode 100644 assets/plugins/plugin-9patch-0.0.1.jar create mode 100644 assets/plugins/plugin-performance-0.0.1.jar create mode 100644 assets/plugins/plugin-tiled-0.0.1.jar create mode 100644 assets/splash/myriad.fnt create mode 100644 assets/splash/myriad.png create mode 100644 assets/splash/roboto.fnt create mode 100644 assets/splash/roboto.png create mode 100644 assets/splash/splash.atlas create mode 100644 assets/splash/splash.png create mode 100644 assets/style/bglogo.png create mode 100644 assets/style/myriad-medium-big.fnt create mode 100644 assets/style/myriad-medium-small.fnt create mode 100644 assets/style/myriad-medium.fnt create mode 100644 assets/style/uiskin.atlas create mode 100644 assets/style/uiskin.json create mode 100644 assets/style/uiskin.png create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 h2d-libgdx-spine-extension/build.gradle create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineComponentFactory.java create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic.java create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic2.java create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineItemType.java create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineObjectComponent.java create mode 100644 h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineSystem.java create mode 100644 hyperlap2d-common-api/build.gradle create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/Controller.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreController.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreModel.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreView.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/Model.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/core/View.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/Command.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/MacroCommand.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/SimpleCommand.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/Facade.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/SimpleFacade.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/Mediator.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/SimpleMediator.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotification.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotifier.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseObserver.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notification.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notifier.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Observer.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/BaseProxy.java create mode 100644 hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/Proxy.java create mode 100644 hyperlap2d-common-api/src/main/java/com/vo/CursorData.java create mode 100644 hyperlap2d-common-api/src/main/java/com/vo/EditorConfigVO.java create mode 100644 hyperlap2d-common-api/src/main/java/com/vo/ProjectVO.java create mode 100644 hyperlap2d-common-api/src/main/java/com/vo/SceneConfigVO.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/H2DDialog.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/IItemCommand.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/ResourcePayloadObject.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorChannelWidget.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorInputField.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerAdapter.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerListener.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerText.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/CustomColorPicker.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPlugin.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java create mode 100644 hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/view/tools/Tool.java create mode 100644 hyperlap2d-runtime-libgdx/build.gradle create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Animation.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Box.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/CCDResolver.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Calculator.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Curve.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Data.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Dimension.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Drawer.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Entity.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/File.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/FileReference.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Folder.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKObject.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKResolver.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Interpolator.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Loader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Mainline.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Player.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/PlayerTweener.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Point.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Rectangle.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SCMLReader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Spriter.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SpriterException.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Timeline.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/TweenedAnimation.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/XmlReader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/HyperLap2D.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/SceneLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/commons/IExternalItemType.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ActionComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/BoundingBoxComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CloneableComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CompositeTransformComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/DimensionsComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/LayerMapComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/MainItemComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NinePatchComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NodeComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ParentNodeComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/PolygonComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/RemovableComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScissorComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScriptComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ShaderComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/SpineDataComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TextureRegionComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TintComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TransformComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ViewPortComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ZIndexComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/additional/ButtonComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/label/LabelComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightBodyComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightObjectComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/particle/ParticleComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/physics/PhysicsBodyComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/AnimationComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationStateComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterDrawerComponent.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ColorPrimitiveVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeItemVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CoreActorData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Essentials.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/FrameRange.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Image9patchVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LayerItemVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightBodyDataVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightsPropertiesVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/MainItemVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ParticleEffectVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsBodyDataVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsPropertiesVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ProjectInfoVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ResolutionEntryVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/RuntimeProjectVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SceneVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SelectBoxVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ShapeVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SimpleImageVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpineVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpriteAnimationVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpriterVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/TextBoxVO.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/EntityFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ColorPrimitiveComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/CompositeComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LightComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/NinePatchComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ParticleEffectComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SimpleImageComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriteComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriterComponentFactory.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/physics/PhysicsBodyLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/physics/PhysicsContact.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/FontSizePair.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/IAssetLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/IDataLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/IResourceLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/IResourceRetriever.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/ResourceManager.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/ResourceManagerLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/ButtonClickListener.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/CompositeActor.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/BasicScript.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IActorScript.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IScript.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/BoundingBoxSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ButtonSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CompositeSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CullingSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LabelSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LayerSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LightSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ParticleSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/PhysicsSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ScriptSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/SpriteAnimationSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/ActionSystem.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/Actions.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/PhysicsActions.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ActionData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/AlphaData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ColorData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ComponentData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelayData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelegateData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ForceData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveByData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveToData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ParallelData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RelativeTemporalData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateByData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateToData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RunnableData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleByData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleToData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SequenceData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeByData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeToData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/TemporalData.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ActionLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/AlphaAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ColorAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ComponentAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelayAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelegateAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ForceAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveByAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveToAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ParallelAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RelativeTemporalAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateByAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateToAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RunnableAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleByAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleToAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SequenceAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeByAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeToAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/TemporalAction.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/HyperLap2dRenderer.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/ShaderManager.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/Drawable.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/DrawableLogicMapper.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LightDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/NinePatchDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/ParticleDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriteDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriterDrawableLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/TextureRegionDrawLogic.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ComponentRetriever.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/CustomVariables.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ForceUtils.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ItemWrapper.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxDrawer.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxLoader.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/MySkin.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/PolygonUtils.java create mode 100644 hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/TransformMathUtils.java create mode 100644 plugin-9patch/build.gradle create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/EditingZone.java create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/ImageUtils.java create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanel.java create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanelMediator.java create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java create mode 100644 plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/PreviewWidget.java create mode 100644 plugin-performance/build.gradle create mode 100644 plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanel.java create mode 100644 plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanelMediator.java create mode 100644 plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java create mode 100644 plugin-tiled/assets/pack/tiled.atlas create mode 100644 plugin-tiled/assets/pack/tiled.png create mode 100644 plugin-tiled/assets/textures/image-Box-active.9.png create mode 100644 plugin-tiled/assets/textures/image-Box-inactive.9.png create mode 100644 plugin-tiled/assets/textures/plugin-tab-active.9.png create mode 100644 plugin-tiled/assets/textures/plugin-tab-inactive.9.png create mode 100644 plugin-tiled/assets/textures/tab-back-line.9.png create mode 100644 plugin-tiled/assets/textures/tile-eraser.png create mode 100644 plugin-tiled/assets/textures/tile.png create mode 100644 plugin-tiled/assets/textures/tiles-drop-here-normal.png create mode 100644 plugin-tiled/assets/textures/tiles-drop-here-over.png create mode 100644 plugin-tiled/assets/textures/tool-tilebrush.png create mode 100644 plugin-tiled/assets/textures/tool-tileeraser.png create mode 100644 plugin-tiled/build.gradle create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanel.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/AttributeVO.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/CategoryVO.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/ParameterVO.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/TileVO.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanel.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanelMediator.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/DataToSave.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DeleteTileTool.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Attribute.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Category.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/DefaultTab.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/GridTilesTab.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/SettingsTab.java create mode 100644 settings.gradle create mode 100644 src/main/java/games/rednblack/editor/CustomExceptionHandler.java create mode 100644 src/main/java/games/rednblack/editor/HyperLap2D.java create mode 100644 src/main/java/games/rednblack/editor/HyperLap2DApp.java create mode 100644 src/main/java/games/rednblack/editor/HyperLap2DFacade.java create mode 100644 src/main/java/games/rednblack/editor/Main.java create mode 100644 src/main/java/games/rednblack/editor/Sync.java create mode 100644 src/main/java/games/rednblack/editor/controller/BootstrapCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/BootstrapPlugins.java create mode 100644 src/main/java/games/rednblack/editor/controller/BootstrapProxyCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/SandboxCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/StartupCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/AddComponentToItemCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/AddSelectionCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ChangeRulerPositionCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CompositeCameraChangeCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ConvertToButtonCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CopyItemsCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CreateItemCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CreatePrimitiveCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CustomVariableModifyCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/DeleteLayerCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertableCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ExportProjectCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ItemChildrenTransformCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ItemTransformCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/LayerSwapCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/NewLayerCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/NonRevertibleCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/PluginItemCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/ReleaseSelectionCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/RemoveComponentFromItemCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/RenameLayerCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/RevertableCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/SaveExportPathCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/SetSelectionCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/TransactiveCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/UpdateEntityComponentsCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/component/UpdateLabelDataCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightBodyDataCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/component/UpdatePolygonComponentCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpriteAnimationDataCommand.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteImageResource.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteLibraryItem.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteParticleEffect.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpineAnimation.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriteAnimation.java create mode 100644 src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriterAnimation.java create mode 100644 src/main/java/games/rednblack/editor/data/JarUtils.java create mode 100644 src/main/java/games/rednblack/editor/data/SpineAnimData.java create mode 100644 src/main/java/games/rednblack/editor/data/manager/PreferencesManager.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/IVersionMigrator.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/migrators/DummyMig.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo005.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo009.java create mode 100644 src/main/java/games/rednblack/editor/event/ButtonToNotificationListener.java create mode 100644 src/main/java/games/rednblack/editor/event/CheckBoxChangeListener.java create mode 100644 src/main/java/games/rednblack/editor/event/ClickNotifier.java create mode 100644 src/main/java/games/rednblack/editor/event/EditableSelectBoxChangeListener.java create mode 100644 src/main/java/games/rednblack/editor/event/KeyboardListener.java create mode 100644 src/main/java/games/rednblack/editor/event/MenuItemListener.java create mode 100644 src/main/java/games/rednblack/editor/event/NumberSelectorOverlapListener.java create mode 100644 src/main/java/games/rednblack/editor/event/SelectBoxChangeListener.java create mode 100644 src/main/java/games/rednblack/editor/factory/ItemFactory.java create mode 100644 src/main/java/games/rednblack/editor/proxy/CommandManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/CursorManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/EditorTextureManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/FontManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/PluginManager.java create mode 100755 src/main/java/games/rednblack/editor/proxy/ProjectManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/ResolutionManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/ResourceManager.java create mode 100644 src/main/java/games/rednblack/editor/proxy/SceneDataManager.java create mode 100644 src/main/java/games/rednblack/editor/splash/SplashMediator.java create mode 100644 src/main/java/games/rednblack/editor/splash/SplashScreen.java create mode 100644 src/main/java/games/rednblack/editor/splash/SplashScreenAdapter.java create mode 100644 src/main/java/games/rednblack/editor/splash/SplashStage.java create mode 100644 src/main/java/games/rednblack/editor/system/PhysicsAdjustSystem.java create mode 100644 src/main/java/games/rednblack/editor/utils/AppConfig.java create mode 100644 src/main/java/games/rednblack/editor/utils/Constants.java create mode 100644 src/main/java/games/rednblack/editor/utils/EntityBounds.java create mode 100644 src/main/java/games/rednblack/editor/utils/Guide.java create mode 100644 src/main/java/games/rednblack/editor/utils/HyperLap2DUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/ImportUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/InputFilters.java create mode 100644 src/main/java/games/rednblack/editor/utils/MoveCommandBuilder.java create mode 100644 src/main/java/games/rednblack/editor/utils/NinePatchUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/RoundUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/StandardWidgetsFactory.java create mode 100644 src/main/java/games/rednblack/editor/utils/TransformCommandBuilder.java create mode 100644 src/main/java/games/rednblack/editor/utils/TransformUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/Clipper.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/PolygonUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/TextureUtils.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/earclipping/bayazit/BayazitDecomposer.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/EwjordanDecomposer.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Polygon.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Triangle.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/tracer/TextureConverter.java create mode 100644 src/main/java/games/rednblack/editor/utils/poly/tracer/Tracer.java create mode 100644 src/main/java/games/rednblack/editor/utils/runtime/ComponentCloner.java create mode 100644 src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java create mode 100644 src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java create mode 100644 src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ItemControlMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/SceneControlMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/frame/FileDropListener.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/EditMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/FileMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/H2DMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/HelpMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBar.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBarMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/menu/WindowMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/ItemSelector.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/Sandbox.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/SandboxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/UIStage.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/UIStageMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/input/EntityClickListener.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/input/InputListener.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/input/InputListenerComponent.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/input/SandboxInputAdapter.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/ConeLightTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/ItemDropTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/PanTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/PointLightTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/PolygonTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/SelectionTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/SimpleTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/TextTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/TransformTool.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/AbstractTransformStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/BasicStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/ColorPrimitiveStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/CompositeStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/ITransformStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/LabelStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/stage/tools/transformStrategy/NinePatchStrategy.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/FollowersUI.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/FollowersUIMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/RulersUI.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/RulersUIMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/UIDropDownMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/UIDropDownMenuMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/UIMainTable.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/UISubmenuBar.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/PanelMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIAlignBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIAlignBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIBaseBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UICollapsibleBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UICompositeHierarchy.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UICompositeHierarchyMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIGridBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIGridBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeNode.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIItemsTreeValue.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UILayerBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UILayerBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIResolutionBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIResolutionBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIToolBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIToolBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIZoomBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/UIZoomBoxMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTab.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTabMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTab.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UILibraryItemsTab.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UILibraryItemsTabMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTab.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTabMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIResourcesTab.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIResourcesTabMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/DraggableResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/DraggableResourceView.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/BoxItemResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/ImageResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriteResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriterResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/list/LibraryItemResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/list/ListItemResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/list/ParticleEffectResource.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/AboutDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/AboutDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/CreateNewResolutionDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/CreateNewResolutionDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/ExportSettingsDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/ExportSettingsDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/ImportDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/ImportDialogMediator.java create mode 100755 src/main/java/games/rednblack/editor/view/ui/dialog/NewProjectDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/NewProjectDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/PhysicsEditorDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/PhysicsEditorDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/SaveDocumentDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/SaveDocumentDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/AnchorListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/BasicFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/EmptyTransformationListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/FollowerFactory.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/FollowerTransformationListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/ImageFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/LightFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/NormalSelectionFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/ParticleFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/PolygonFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/PolygonTransformationListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/followers/SubFollower.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/CustomVariablesPanel.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/CustomVariablesPanelMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/EditSpriteAnimationPanel.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/EditSpriteAnimationPanelMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/TagItem.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/TagsPanel.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/panel/TagsPanelMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIAbstractProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIAbstractPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIItemCollapsibleProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/UIRemovableProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIBasicItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIBasicItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIImageItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIImageItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILabelItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILabelItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightBodyProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightBodyPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UISceneProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIScenePropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpriteAnimationItemProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpriteAnimationItemPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UITextToolProperties.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/properties/panels/UITextToolPropertiesMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/validator/EmptyOrDefaultValidator.java create mode 100755 src/main/java/games/rednblack/editor/view/ui/validator/NewProjectDialogValidator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/CursorListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/CustomMenu.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/CustomMenuBar.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/EditableSelectBox.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/EmptyTarget.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/H2DLogo.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/InputFileWidget.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/ProgressHandler.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/SandboxUI.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/ScrollFocusListener.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/GridView.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/ResolutionBounds.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/SpineActor.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/SpriteAnimationActor.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/SpriterActor.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/basic/PixelLine.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/basic/PixelRect.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/actors/basic/SandboxBackUI.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/widget/components/TintButton.java create mode 100644 src/test/java/Box2DLauncher.java create mode 100644 src/test/java/Box2dLightTest.java create mode 100644 src/test/resources/data/bg-deferred-n.png create mode 100644 src/test/resources/data/bg-deferred.png create mode 100644 src/test/resources/data/bg.png create mode 100644 src/test/resources/data/marble-n.png create mode 100644 src/test/resources/data/marble.png create mode 100644 src/test/resources/data/object-deferred-n.png create mode 100644 src/test/resources/data/object-deferred.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..215bc768 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +.idea/ +/build/ +.gradle/ +h2d-libgdx-spine-extension/build/ +hyperlap2d-common-api/build/ +hyperlap2d-runtime-libgdx/build/ +plugin-9patch/build/ +plugin-performance/build/ +plugin-tiled/build/ diff --git a/art/font/myriad-medium-big.fnt b/art/font/myriad-medium-big.fnt new file mode 100644 index 00000000..52bdba57 --- /dev/null +++ b/art/font/myriad-medium-big.fnt @@ -0,0 +1,4827 @@ +info face="MyriadPro-Regular" size=16 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=20 base=12 scaleW=256 scaleH=512 pages=1 packed=0 +page id=0 file="myriad-medium-big.png" +chars count=506 +char id=0 x=210 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=33 x=250 y=113 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=34 x=205 y=253 width=7 height=6 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=35 x=220 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=36 x=102 y=19 width=9 height=16 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=37 x=110 y=84 width=15 height=14 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0 +char id=38 x=230 y=127 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=39 x=212 y=253 width=5 height=6 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=40 x=111 y=19 width=6 height=16 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=41 x=117 y=19 width=6 height=16 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=42 x=88 y=253 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=43 x=185 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=44 x=148 y=253 width=5 height=7 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=45 x=68 y=263 width=7 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=46 x=6 y=263 width=5 height=5 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=47 x=125 y=84 width=9 height=14 xoffset=-2 yoffset=0 xadvance=5 page=0 chnl=0 +char id=48 x=242 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=49 x=0 y=141 width=7 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=50 x=7 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=51 x=17 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=52 x=27 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=53 x=37 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=54 x=47 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=55 x=57 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=56 x=67 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=57 x=134 y=84 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=58 x=248 y=219 width=5 height=10 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=59 x=98 y=219 width=5 height=12 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=60 x=196 y=219 width=10 height=11 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=61 x=217 y=253 width=11 height=6 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=62 x=206 y=219 width=10 height=11 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=63 x=77 y=141 width=8 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=64 x=144 y=84 width=14 height=14 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=65 x=85 y=141 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=66 x=97 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=67 x=107 y=141 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=68 x=118 y=141 width=12 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=69 x=130 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=70 x=139 y=141 width=8 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=71 x=147 y=141 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=72 x=159 y=141 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=73 x=251 y=84 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=74 x=170 y=141 width=7 height=13 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=75 x=177 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=76 x=187 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=77 x=196 y=141 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=78 x=210 y=141 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=79 x=221 y=141 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=80 x=234 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=81 x=179 y=68 width=13 height=15 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=82 x=243 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=83 x=0 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=84 x=10 y=154 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=85 x=21 y=154 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=86 x=32 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=87 x=43 y=154 width=16 height=13 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=88 x=59 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=89 x=70 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=90 x=81 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=91 x=192 y=68 width=6 height=15 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=92 x=158 y=84 width=8 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=93 x=198 y=68 width=6 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=94 x=14 y=232 width=11 height=10 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=95 x=94 y=263 width=10 height=3 xoffset=-1 yoffset=12 xadvance=8 page=0 chnl=0 +char id=96 x=11 y=263 width=6 height=5 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=97 x=25 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=98 x=166 y=84 width=10 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=99 x=34 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=100 x=176 y=84 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=101 x=43 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=102 x=186 y=84 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=103 x=194 y=84 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=104 x=204 y=84 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=105 x=250 y=68 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=106 x=100 y=0 width=6 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=107 x=213 y=84 width=9 height=14 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=108 x=251 y=52 width=4 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=109 x=53 y=232 width=14 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=110 x=67 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=111 x=76 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=112 x=222 y=84 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=113 x=232 y=84 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=114 x=87 y=232 width=6 height=10 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=0 +char id=115 x=93 y=232 width=8 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=116 x=103 y=219 width=7 height=12 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=117 x=101 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=118 x=110 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=119 x=120 y=232 width=14 height=10 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=120 x=134 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=121 x=204 y=68 width=10 height=15 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=122 x=144 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=123 x=214 y=68 width=7 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=124 x=20 y=0 width=4 height=18 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=125 x=221 y=68 width=7 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=126 x=17 y=263 width=11 height=5 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=161 x=92 y=154 width=5 height=13 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=162 x=242 y=84 width=9 height=14 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=163 x=97 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=164 x=216 y=219 width=10 height=11 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=165 x=107 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=166 x=123 y=19 width=4 height=16 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=167 x=0 y=99 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=168 x=75 y=263 width=7 height=4 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=169 x=117 y=154 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=170 x=153 y=253 width=7 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=171 x=97 y=253 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=172 x=160 y=253 width=11 height=7 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=173 x=82 y=263 width=7 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=174 x=106 y=253 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=175 x=104 y=263 width=7 height=3 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=176 x=228 y=253 width=7 height=6 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=177 x=110 y=219 width=11 height=12 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=178 x=115 y=253 width=7 height=8 xoffset=-1 yoffset=-2 xadvance=5 page=0 chnl=0 +char id=179 x=81 y=253 width=7 height=9 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=180 x=28 y=263 width=6 height=5 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=181 x=10 y=99 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=182 x=228 y=68 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=183 x=89 y=263 width=5 height=4 xoffset=-1 yoffset=6 xadvance=3 page=0 chnl=0 +char id=184 x=235 y=253 width=6 height=6 xoffset=-1 yoffset=11 xadvance=5 page=0 chnl=0 +char id=185 x=122 y=253 width=5 height=8 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=186 x=171 y=253 width=8 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=187 x=127 y=253 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=188 x=130 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=189 x=144 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=190 x=158 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=191 x=20 y=99 width=8 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=192 x=127 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=193 x=139 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=194 x=151 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=195 x=163 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=196 x=175 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=197 x=187 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=198 x=172 y=154 width=16 height=13 xoffset=-2 yoffset=0 xadvance=13 page=0 chnl=0 +char id=199 x=106 y=0 width=11 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=200 x=199 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=201 x=208 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=202 x=217 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=203 x=226 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=204 x=235 y=19 width=6 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=205 x=241 y=19 width=6 height=16 xoffset=0 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=206 x=247 y=19 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=207 x=0 y=36 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=208 x=188 y=154 width=14 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=209 x=8 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=210 x=19 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=211 x=32 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=212 x=45 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=213 x=58 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=214 x=71 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=215 x=226 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=216 x=237 y=68 width=13 height=15 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=217 x=84 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=218 x=95 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=219 x=106 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=220 x=117 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=221 x=128 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=222 x=202 y=154 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=223 x=28 y=99 width=10 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=224 x=38 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=225 x=47 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=226 x=56 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=227 x=211 y=154 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=228 x=220 y=154 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=229 x=65 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=230 x=153 y=232 width=14 height=10 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=231 x=74 y=99 width=9 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=232 x=83 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=233 x=93 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=234 x=103 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=235 x=229 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=236 x=113 y=99 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=237 x=119 y=99 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=238 x=125 y=99 width=7 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=239 x=239 y=154 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=240 x=132 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=241 x=0 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=242 x=143 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=243 x=154 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=244 x=165 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=245 x=9 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=246 x=20 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=247 x=167 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=248 x=121 y=219 width=11 height=12 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=249 x=176 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=250 x=185 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=251 x=194 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=252 x=31 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=253 x=0 y=0 width=10 height=19 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=254 x=117 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=255 x=24 y=0 width=10 height=18 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=256 x=0 y=84 width=12 height=15 xoffset=-1 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=257 x=132 y=219 width=9 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=258 x=139 y=36 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=259 x=40 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=260 x=127 y=0 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=261 x=203 y=99 width=10 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=262 x=151 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=263 x=213 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=264 x=162 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=265 x=222 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=266 x=173 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=267 x=49 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=268 x=184 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=269 x=231 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=270 x=195 y=36 width=12 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=271 x=240 y=99 width=14 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=272 x=58 y=167 width=14 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=273 x=0 y=113 width=12 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=274 x=12 y=84 width=9 height=15 xoffset=0 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=275 x=141 y=219 width=10 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=276 x=207 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=277 x=72 y=167 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=278 x=216 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=279 x=82 y=167 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=280 x=139 y=0 width=9 height=17 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=281 x=12 y=113 width=10 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=282 x=225 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=283 x=22 y=113 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=284 x=234 y=36 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=285 x=34 y=0 width=10 height=18 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=286 x=0 y=52 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=287 x=148 y=0 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=288 x=12 y=52 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=289 x=158 y=0 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=290 x=168 y=0 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=291 x=44 y=0 width=10 height=18 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=292 x=24 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=293 x=180 y=0 width=11 height=17 xoffset=-2 yoffset=-4 xadvance=9 page=0 chnl=0 +char id=294 x=92 y=167 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=295 x=32 y=113 width=11 height=14 xoffset=-2 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=296 x=246 y=36 width=7 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=297 x=247 y=154 width=7 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=298 x=21 y=84 width=6 height=15 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=299 x=105 y=167 width=6 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=300 x=35 y=52 width=7 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=301 x=111 y=167 width=7 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=302 x=191 y=0 width=6 height=17 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=303 x=197 y=0 width=6 height=17 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=304 x=42 y=52 width=4 height=16 xoffset=0 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=305 x=178 y=232 width=4 height=10 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=306 x=118 y=167 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=307 x=203 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=308 x=46 y=52 width=9 height=16 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=309 x=212 y=0 width=7 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=310 x=219 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=311 x=54 y=0 width=9 height=18 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=312 x=182 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=313 x=55 y=52 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=314 x=229 y=0 width=7 height=17 xoffset=-1 yoffset=-4 xadvance=4 page=0 chnl=0 +char id=315 x=236 y=0 width=9 height=17 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=316 x=63 y=0 width=5 height=18 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=317 x=128 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=318 x=43 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=319 x=137 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=320 x=49 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=321 x=146 y=167 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=322 x=55 y=113 width=6 height=14 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=323 x=64 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=324 x=61 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=325 x=0 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=326 x=70 y=113 width=9 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=327 x=75 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=328 x=79 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=329 x=88 y=113 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=330 x=11 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=331 x=157 y=167 width=9 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=332 x=27 y=84 width=13 height=15 xoffset=-1 yoffset=-2 xadvance=11 page=0 chnl=0 +char id=333 x=151 y=219 width=11 height=12 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=334 x=86 y=52 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=335 x=166 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=336 x=99 y=52 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=337 x=98 y=113 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=338 x=40 y=84 width=16 height=15 xoffset=-1 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=339 x=191 y=232 width=16 height=10 xoffset=-1 yoffset=3 xadvance=14 page=0 chnl=0 +char id=340 x=112 y=52 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=341 x=109 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=342 x=245 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=343 x=115 y=113 width=7 height=14 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=344 x=122 y=52 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=345 x=122 y=113 width=7 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=346 x=132 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=347 x=129 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=348 x=142 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=349 x=137 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=350 x=22 y=19 width=10 height=17 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=351 x=145 y=113 width=8 height=14 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=352 x=152 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=353 x=153 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=354 x=32 y=19 width=11 height=17 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=355 x=162 y=52 width=7 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=356 x=169 y=52 width=11 height=16 xoffset=-2 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=357 x=161 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=358 x=177 y=167 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=359 x=162 y=219 width=7 height=12 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=360 x=180 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=361 x=188 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=362 x=56 y=84 width=11 height=15 xoffset=0 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=363 x=197 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=364 x=191 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=365 x=206 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=366 x=202 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=367 x=169 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=368 x=213 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=369 x=178 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=370 x=43 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=371 x=187 y=113 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=372 x=224 y=52 width=16 height=16 xoffset=-1 yoffset=-3 xadvance=14 page=0 chnl=0 +char id=373 x=197 y=113 width=14 height=14 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=374 x=240 y=52 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=375 x=10 y=0 width=10 height=19 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=376 x=0 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=377 x=11 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=378 x=211 y=113 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=379 x=22 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=380 x=215 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=381 x=33 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=382 x=220 y=113 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=894 x=224 y=167 width=5 height=13 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=900 x=34 y=263 width=5 height=5 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=901 x=39 y=263 width=8 height=5 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=902 x=229 y=167 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=903 x=47 y=263 width=5 height=5 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=904 x=241 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=905 x=0 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=906 x=13 y=180 width=6 height=13 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=908 x=19 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=910 x=33 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=911 x=47 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=912 x=229 y=113 width=8 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=913 x=61 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=914 x=73 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=915 x=83 y=180 width=8 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=916 x=91 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=917 x=103 y=180 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=918 x=112 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=919 x=123 y=180 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=920 x=134 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=921 x=147 y=180 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=922 x=151 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=923 x=161 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=924 x=173 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=925 x=187 y=180 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=926 x=198 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=927 x=209 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=928 x=222 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=929 x=232 y=180 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=931 x=241 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=932 x=0 y=193 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=933 x=11 y=193 width=12 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=934 x=237 y=113 width=13 height=14 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=935 x=23 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=936 x=34 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=937 x=47 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=938 x=44 y=68 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=939 x=67 y=84 width=12 height=15 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=940 x=60 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=941 x=71 y=193 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=942 x=54 y=19 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=943 x=80 y=193 width=5 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=944 x=0 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=945 x=207 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=946 x=68 y=0 width=10 height=18 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=947 x=10 y=127 width=11 height=14 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=948 x=21 y=127 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=949 x=218 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=950 x=52 y=68 width=9 height=16 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=951 x=32 y=127 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=952 x=42 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=953 x=227 y=232 width=5 height=10 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=954 x=232 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=955 x=52 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=956 x=62 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=957 x=241 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=958 x=64 y=19 width=9 height=17 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=959 x=0 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=960 x=11 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=961 x=72 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=962 x=85 y=193 width=9 height=13 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=963 x=237 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=964 x=22 y=243 width=10 height=10 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=965 x=32 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=966 x=79 y=84 width=12 height=15 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=967 x=82 y=127 width=10 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=968 x=73 y=19 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=969 x=42 y=243 width=13 height=10 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=970 x=94 y=193 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=971 x=102 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=972 x=112 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=973 x=123 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=974 x=133 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1025 x=61 y=68 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1026 x=70 y=68 width=13 height=16 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1027 x=83 y=68 width=8 height=16 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=1028 x=146 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1029 x=157 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1030 x=167 y=193 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1031 x=91 y=68 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=1032 x=171 y=193 width=7 height=13 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1033 x=92 y=127 width=17 height=14 xoffset=-2 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1034 x=178 y=193 width=15 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1035 x=193 y=193 width=13 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1036 x=99 y=68 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=1038 x=109 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1039 x=120 y=68 width=10 height=16 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1040 x=206 y=193 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1041 x=218 y=193 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1042 x=228 y=193 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1043 x=238 y=193 width=8 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1044 x=130 y=68 width=12 height=16 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1045 x=246 y=193 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1046 x=0 y=206 width=15 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1047 x=15 y=206 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1048 x=25 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1049 x=142 y=68 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=1050 x=36 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1051 x=46 y=206 width=12 height=13 xoffset=-2 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1052 x=58 y=206 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1053 x=72 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1054 x=83 y=206 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1055 x=96 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1056 x=107 y=206 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1057 x=116 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1058 x=127 y=206 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1059 x=138 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1060 x=109 y=127 width=13 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1061 x=149 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1062 x=153 y=68 width=11 height=16 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1063 x=160 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1064 x=170 y=206 width=14 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1065 x=164 y=68 width=15 height=16 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1066 x=184 y=206 width=13 height=13 xoffset=-2 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1067 x=197 y=206 width=12 height=13 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1068 x=209 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1069 x=219 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1070 x=230 y=206 width=15 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1071 x=245 y=206 width=10 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1072 x=55 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1073 x=122 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1074 x=64 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1075 x=73 y=243 width=7 height=10 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1076 x=0 y=219 width=10 height=13 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1077 x=80 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1078 x=90 y=243 width=13 height=10 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1079 x=103 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1080 x=112 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1081 x=10 y=219 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1082 x=121 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1083 x=130 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1084 x=139 y=243 width=12 height=10 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=1085 x=151 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1086 x=160 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1087 x=171 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1088 x=132 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1089 x=180 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1090 x=189 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1091 x=91 y=84 width=10 height=15 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1092 x=78 y=0 width=12 height=18 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1093 x=198 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1094 x=19 y=219 width=10 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1095 x=208 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1096 x=217 y=243 width=12 height=10 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1097 x=29 y=219 width=13 height=13 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1098 x=229 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1099 x=240 y=243 width=11 height=10 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1100 x=0 y=253 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1101 x=9 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1102 x=18 y=253 width=12 height=10 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1103 x=30 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1105 x=42 y=219 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1106 x=85 y=19 width=11 height=17 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1107 x=142 y=127 width=7 height=14 xoffset=0 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1108 x=39 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1109 x=48 y=253 width=8 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1110 x=52 y=219 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1111 x=57 y=219 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1112 x=96 y=19 width=6 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1113 x=0 y=232 width=14 height=11 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1114 x=56 y=253 width=13 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=1115 x=149 y=127 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1116 x=160 y=127 width=9 height=14 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1118 x=90 y=0 width=10 height=18 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1119 x=65 y=219 width=9 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1168 x=101 y=84 width=9 height=15 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=1169 x=169 y=219 width=7 height=12 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=0 +char id=1241 x=69 y=253 width=12 height=10 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8211 x=111 y=263 width=10 height=3 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=8212 x=121 y=263 width=18 height=3 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=8216 x=179 y=253 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8217 x=184 y=253 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8218 x=241 y=253 width=5 height=6 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=8220 x=189 y=253 width=8 height=7 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8221 x=197 y=253 width=8 height=7 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8222 x=246 y=253 width=8 height=6 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=8224 x=169 y=127 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8225 x=179 y=127 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8226 x=0 y=263 width=6 height=6 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=8230 x=52 y=263 width=16 height=5 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8240 x=189 y=127 width=21 height=14 xoffset=-1 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=8249 x=136 y=253 width=6 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8250 x=142 y=253 width=6 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8260 x=74 y=219 width=14 height=13 xoffset=-4 yoffset=0 xadvance=2 page=0 chnl=0 +char id=8363 x=176 y=219 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8364 x=88 y=219 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +kernings count=4316 +kerning first=362 second=913 amount=-1 +kerning first=8216 second=281 amount=-1 +kerning first=221 second=285 amount=-1 +kerning first=39 second=961 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=1090 second=8212 amount=-1 +kerning first=34 second=74 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=8218 second=376 amount=-2 +kerning first=86 second=248 amount=-1 +kerning first=8221 second=301 amount=-1 +kerning first=362 second=258 amount=-1 +kerning first=358 second=335 amount=-1 +kerning first=957 second=46 amount=-1 +kerning first=257 second=84 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=1058 second=1035 amount=1 +kerning first=910 second=965 amount=-1 +kerning first=8220 second=229 amount=-1 +kerning first=8216 second=937 amount=-1 +kerning first=1168 second=1040 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=208 second=8230 amount=-1 +kerning first=932 second=940 amount=-1 +kerning first=354 second=93 amount=1 +kerning first=229 second=932 amount=-1 +kerning first=939 second=959 amount=-1 +kerning first=321 second=173 amount=-1 +kerning first=932 second=244 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=915 second=71 amount=-1 +kerning first=929 second=923 amount=-1 +kerning first=221 second=308 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=358 second=227 amount=-1 +kerning first=192 second=39 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=87 second=358 amount=1 +kerning first=196 second=221 amount=-1 +kerning first=279 second=932 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=947 second=44 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=315 second=262 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=1027 second=187 amount=-1 +kerning first=931 second=264 amount=-1 +kerning first=91 second=1058 amount=1 +kerning first=8218 second=358 amount=-1 +kerning first=1098 second=1091 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=915 second=941 amount=-1 +kerning first=939 second=181 amount=-1 +kerning first=1043 second=44 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=1043 second=1032 amount=-1 +kerning first=219 second=195 amount=-1 +kerning first=932 second=260 amount=-1 +kerning first=89 second=173 amount=-1 +kerning first=8216 second=940 amount=-1 +kerning first=1168 second=1074 amount=-1 +kerning first=354 second=285 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=65 second=34 amount=-1 +kerning first=227 second=8221 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=1059 second=1066 amount=1 +kerning first=84 second=973 amount=-1 +kerning first=931 second=8211 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=109 second=356 amount=-1 +kerning first=230 second=354 amount=-1 +kerning first=933 second=45 amount=-1 +kerning first=160 second=86 amount=-1 +kerning first=1066 second=1059 amount=-1 +kerning first=902 second=39 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=319 second=8220 amount=-2 +kerning first=932 second=8249 amount=-1 +kerning first=358 second=287 amount=-1 +kerning first=8220 second=937 amount=-1 +kerning first=372 second=263 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=8221 second=111 amount=-1 +kerning first=915 second=916 amount=-2 +kerning first=317 second=89 amount=-1 +kerning first=46 second=8220 amount=-2 +kerning first=315 second=376 amount=-1 +kerning first=39 second=74 amount=-1 +kerning first=923 second=356 amount=-1 +kerning first=91 second=372 amount=1 +kerning first=910 second=210 amount=-1 +kerning first=45 second=376 amount=-1 +kerning first=927 second=44 amount=-1 +kerning first=227 second=354 amount=-1 +kerning first=354 second=308 amount=-1 +kerning first=315 second=332 amount=-1 +kerning first=8204 second=354 amount=-1 +kerning first=171 second=933 amount=-1 +kerning first=932 second=948 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=319 second=219 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=8216 second=260 amount=-1 +kerning first=1100 second=8217 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=376 second=913 amount=-1 +kerning first=1033 second=1026 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=8212 second=1035 amount=-1 +kerning first=1059 second=173 amount=-1 +kerning first=372 second=192 amount=-1 +kerning first=275 second=354 amount=-1 +kerning first=40 second=221 amount=1 +kerning first=109 second=8217 amount=-1 +kerning first=912 second=958 amount=1 +kerning first=225 second=356 amount=-1 +kerning first=1168 second=1109 amount=-1 +kerning first=319 second=81 amount=-1 +kerning first=354 second=369 amount=-1 +kerning first=376 second=258 amount=-1 +kerning first=317 second=34 amount=-2 +kerning first=356 second=973 amount=-1 +kerning first=102 second=39 amount=1 +kerning first=915 second=8250 amount=-1 +kerning first=40 second=84 amount=1 +kerning first=44 second=34 amount=-2 +kerning first=923 second=8217 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=86 second=913 amount=-1 +kerning first=1038 second=1066 amount=1 +kerning first=933 second=79 amount=-1 +kerning first=1027 second=1169 amount=-1 +kerning first=80 second=916 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=354 second=942 amount=-1 +kerning first=358 second=365 amount=-1 +kerning first=8220 second=940 amount=-1 +kerning first=258 second=8216 amount=-1 +kerning first=916 second=39 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=915 second=949 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=315 second=358 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=910 second=971 amount=-1 +kerning first=101 second=84 amount=-1 +kerning first=246 second=358 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=8216 second=948 amount=-1 +kerning first=160 second=932 amount=-1 +kerning first=45 second=358 amount=-1 +kerning first=933 second=8212 amount=-1 +kerning first=910 second=173 amount=-1 +kerning first=225 second=8217 amount=-1 +kerning first=8217 second=331 amount=-1 +kerning first=915 second=336 amount=-1 +kerning first=173 second=1058 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=84 second=954 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=939 second=943 amount=-1 +kerning first=971 second=39 amount=-1 +kerning first=358 second=941 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=358 second=246 amount=-1 +kerning first=372 second=234 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=932 second=269 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=933 second=912 amount=-1 +kerning first=1066 second=1038 amount=-1 +kerning first=1038 second=173 amount=-1 +kerning first=932 second=117 amount=-1 +kerning first=372 second=354 amount=1 +kerning first=89 second=339 amount=-1 +kerning first=315 second=199 amount=-1 +kerning first=358 second=105 amount=-1 +kerning first=87 second=301 amount=1 +kerning first=111 second=932 amount=-1 +kerning first=360 second=256 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=915 second=338 amount=-1 +kerning first=944 second=34 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=315 second=288 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=364 second=913 amount=-1 +kerning first=8220 second=260 amount=-1 +kerning first=343 second=8230 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=932 second=197 amount=-1 +kerning first=358 second=916 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=8221 second=339 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=364 second=258 amount=-1 +kerning first=1168 second=1087 amount=-1 +kerning first=939 second=268 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=933 second=193 amount=-2 +kerning first=221 second=358 amount=1 +kerning first=1113 second=1090 amount=-1 +kerning first=356 second=954 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=195 second=376 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=8221 second=312 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=228 second=932 amount=-1 +kerning first=8217 second=349 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=933 second=58 amount=-1 +kerning first=955 second=39 amount=-1 +kerning first=932 second=341 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=8221 second=275 amount=-1 +kerning first=324 second=8221 amount=-1 +kerning first=194 second=39 amount=-1 +kerning first=932 second=187 amount=-1 +kerning first=8220 second=948 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=112 second=8221 amount=-1 +kerning first=358 second=8250 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=277 second=932 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=915 second=195 amount=-2 +kerning first=315 second=362 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=8216 second=197 amount=-1 +kerning first=1046 second=1033 amount=1 +kerning first=345 second=46 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=8217 second=236 amount=-1 +kerning first=932 second=963 amount=-1 +kerning first=915 second=290 amount=-1 +kerning first=313 second=262 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=939 second=951 amount=-1 +kerning first=932 second=235 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=197 second=34 amount=-1 +kerning first=102 second=59 amount=1 +kerning first=358 second=949 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=321 second=372 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=319 second=356 amount=-1 +kerning first=324 second=354 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=376 second=196 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=242 second=356 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=187 second=932 amount=-1 +kerning first=112 second=354 amount=-1 +kerning first=76 second=8212 amount=-1 +kerning first=929 second=260 amount=-1 +kerning first=936 second=46 amount=-1 +kerning first=1034 second=1035 amount=-1 +kerning first=358 second=84 amount=1 +kerning first=915 second=8230 amount=-2 +kerning first=195 second=358 amount=-1 +kerning first=224 second=8221 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=1057 second=1066 amount=1 +kerning first=218 second=194 amount=-1 +kerning first=308 second=93 amount=1 +kerning first=86 second=196 amount=-1 +kerning first=123 second=1026 amount=1 +kerning first=356 second=279 amount=-1 +kerning first=931 second=45 amount=-1 +kerning first=358 second=378 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=317 second=8220 amount=-2 +kerning first=354 second=358 amount=1 +kerning first=89 second=243 amount=-1 +kerning first=934 second=88 amount=-1 +kerning first=8217 second=46 amount=-2 +kerning first=8216 second=963 amount=-1 +kerning first=1168 second=1066 amount=1 +kerning first=44 second=8220 amount=-2 +kerning first=313 second=376 amount=-1 +kerning first=319 second=8217 amount=-2 +kerning first=354 second=267 amount=-1 +kerning first=932 second=41 amount=1 +kerning first=8216 second=235 amount=-1 +kerning first=242 second=8217 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=46 second=8217 amount=-2 +kerning first=354 second=119 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=224 second=354 amount=-1 +kerning first=8212 second=356 amount=-1 +kerning first=84 second=969 amount=-1 +kerning first=313 second=332 amount=-1 +kerning first=1059 second=1058 amount=1 +kerning first=1091 second=46 amount=-1 +kerning first=102 second=93 amount=2 +kerning first=216 second=44 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=8217 second=297 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=8221 second=243 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=8216 second=8216 amount=-1 +kerning first=1043 second=1115 amount=1 +kerning first=1098 second=8217 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=217 second=913 amount=-1 +kerning first=321 second=171 amount=-1 +kerning first=8230 second=8221 amount=-2 +kerning first=366 second=65 amount=-1 +kerning first=360 second=192 amount=-1 +kerning first=358 second=265 amount=-1 +kerning first=283 second=354 amount=-1 +kerning first=80 second=8230 amount=-2 +kerning first=376 second=356 amount=1 +kerning first=8221 second=103 amount=-1 +kerning first=317 second=81 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=315 second=210 amount=-1 +kerning first=358 second=118 amount=-1 +kerning first=8220 second=197 amount=-1 +kerning first=91 second=354 amount=1 +kerning first=45 second=910 amount=-1 +kerning first=217 second=258 amount=-1 +kerning first=923 second=86 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=84 second=913 amount=-1 +kerning first=1168 second=173 amount=-1 +kerning first=931 second=79 amount=-1 +kerning first=8204 second=87 amount=-1 +kerning first=1035 second=1066 amount=-1 +kerning first=936 second=198 amount=-1 +kerning first=86 second=356 amount=1 +kerning first=1058 second=1096 amount=-1 +kerning first=358 second=195 amount=-1 +kerning first=1043 second=1059 amount=1 +kerning first=45 second=1066 amount=-1 +kerning first=271 second=311 amount=1 +kerning first=912 second=950 amount=1 +kerning first=1168 second=1100 amount=-1 +kerning first=84 second=258 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=313 second=358 amount=-1 +kerning first=8221 second=256 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=354 second=343 amount=-1 +kerning first=243 second=358 amount=-1 +kerning first=913 second=221 amount=-1 +kerning first=939 second=65 amount=-2 +kerning first=89 second=171 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=931 second=8212 amount=-1 +kerning first=356 second=969 amount=-1 +kerning first=84 second=307 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=1038 second=1058 amount=1 +kerning first=933 second=71 amount=-1 +kerning first=913 second=84 amount=-1 +kerning first=932 second=367 amount=-1 +kerning first=8217 second=198 amount=-1 +kerning first=260 second=39 amount=-1 +kerning first=354 second=965 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=358 second=345 amount=-1 +kerning first=8220 second=963 amount=-1 +kerning first=931 second=912 amount=1 +kerning first=104 second=358 amount=-1 +kerning first=256 second=221 amount=-1 +kerning first=376 second=291 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=358 second=8230 amount=-1 +kerning first=910 second=962 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=315 second=173 amount=-1 +kerning first=915 second=214 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=313 second=199 amount=-1 +kerning first=109 second=932 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=974 second=34 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=123 second=106 amount=1 +kerning first=932 second=972 amount=-1 +kerning first=256 second=84 amount=-1 +kerning first=123 second=1095 amount=-1 +kerning first=8220 second=8216 amount=-1 +kerning first=313 second=288 amount=-1 +kerning first=356 second=913 amount=-1 +kerning first=932 second=250 amount=-1 +kerning first=84 second=946 amount=-1 +kerning first=939 second=966 amount=-1 +kerning first=936 second=194 amount=-1 +kerning first=341 second=8230 amount=-1 +kerning first=8222 second=86 amount=-1 +kerning first=358 second=232 amount=-1 +kerning first=923 second=932 amount=-1 +kerning first=929 second=197 amount=-1 +kerning first=372 second=225 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=329 second=356 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=933 second=941 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=356 second=258 amount=-1 +kerning first=932 second=109 amount=-1 +kerning first=926 second=970 amount=1 +kerning first=358 second=97 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=356 second=307 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=321 second=927 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=192 second=376 amount=-1 +kerning first=8217 second=194 amount=-1 +kerning first=8211 second=1026 amount=-1 +kerning first=225 second=932 amount=-1 +kerning first=910 second=256 amount=-2 +kerning first=376 second=363 amount=-1 +kerning first=261 second=358 amount=-1 +kerning first=915 second=973 amount=-1 +kerning first=321 second=286 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=319 second=268 amount=-1 +kerning first=1043 second=1038 amount=1 +kerning first=173 second=354 amount=-1 +kerning first=933 second=916 amount=-2 +kerning first=8216 second=972 amount=-1 +kerning first=1168 second=1079 amount=-1 +kerning first=110 second=8221 amount=-1 +kerning first=354 second=301 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=329 second=8217 amount=-1 +kerning first=34 second=193 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=221 second=173 amount=-1 +kerning first=939 second=44 amount=-2 +kerning first=313 second=362 amount=-1 +kerning first=356 second=946 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=1043 second=8249 amount=-1 +kerning first=1090 second=8230 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=196 second=34 amount=-1 +kerning first=372 second=273 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=932 second=324 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=321 second=8221 amount=-2 +kerning first=8221 second=263 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=89 second=927 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=372 second=277 amount=-1 +kerning first=123 second=376 amount=1 +kerning first=244 second=356 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=8222 second=932 amount=-1 +kerning first=110 second=354 amount=-1 +kerning first=934 second=46 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=933 second=8250 amount=-1 +kerning first=192 second=358 amount=-1 +kerning first=902 second=376 amount=-1 +kerning first=226 second=8221 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=932 second=953 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=932 second=226 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=8221 second=192 amount=-1 +kerning first=939 second=213 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=1027 second=46 amount=-1 +kerning first=333 second=84 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=933 second=949 amount=-1 +kerning first=1168 second=1114 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=319 second=86 amount=-1 +kerning first=271 second=8221 amount=1 +kerning first=331 second=358 amount=-1 +kerning first=70 second=371 amount=-1 +kerning first=1034 second=8217 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=317 second=8217 amount=-2 +kerning first=1059 second=1106 amount=1 +kerning first=210 second=8230 amount=-1 +kerning first=244 second=8217 amount=-1 +kerning first=933 second=336 amount=-1 +kerning first=40 second=89 amount=1 +kerning first=44 second=8217 amount=-2 +kerning first=226 second=354 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=1057 second=1058 amount=1 +kerning first=84 second=333 amount=-1 +kerning first=339 second=84 amount=-1 +kerning first=354 second=971 amount=-1 +kerning first=358 second=361 amount=-1 +kerning first=8220 second=972 amount=-1 +kerning first=219 second=913 amount=-1 +kerning first=123 second=358 amount=1 +kerning first=356 second=115 amount=-1 +kerning first=8221 second=8221 amount=-1 +kerning first=8218 second=372 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=915 second=954 amount=-1 +kerning first=1058 second=1054 amount=-1 +kerning first=354 second=173 amount=-1 +kerning first=1168 second=1058 amount=1 +kerning first=313 second=210 amount=-1 +kerning first=89 second=354 amount=1 +kerning first=366 second=923 amount=-1 +kerning first=8216 second=226 amount=-1 +kerning first=219 second=258 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=902 second=358 amount=-1 +kerning first=933 second=338 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=235 second=84 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=84 second=959 amount=-1 +kerning first=932 second=331 amount=-1 +kerning first=358 second=973 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=8217 second=285 amount=-1 +kerning first=8221 second=234 amount=-1 +kerning first=356 second=196 amount=-1 +kerning first=1033 second=1066 amount=-1 +kerning first=39 second=193 amount=-1 +kerning first=358 second=251 amount=-1 +kerning first=923 second=939 amount=-2 +kerning first=1043 second=1107 amount=-1 +kerning first=372 second=239 amount=1 +kerning first=932 second=283 amount=-1 +kerning first=84 second=356 amount=1 +kerning first=8221 second=354 amount=1 +kerning first=932 second=122 amount=-1 +kerning first=291 second=84 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=358 second=110 amount=-1 +kerning first=910 second=927 amount=-1 +kerning first=97 second=84 amount=-1 +kerning first=372 second=100 amount=-1 +kerning first=952 second=8230 amount=-1 +kerning first=910 second=192 amount=-2 +kerning first=91 second=87 amount=1 +kerning first=1038 second=1106 amount=1 +kerning first=319 second=932 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=932 second=934 amount=-1 +kerning first=242 second=932 amount=-1 +kerning first=321 second=211 amount=-1 +kerning first=910 second=286 amount=-1 +kerning first=1035 second=1058 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=931 second=71 amount=-1 +kerning first=939 second=923 amount=-2 +kerning first=258 second=39 amount=-1 +kerning first=84 second=181 amount=-1 +kerning first=8217 second=308 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=45 second=1058 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=1168 second=1092 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=933 second=195 amount=-2 +kerning first=313 second=173 amount=-1 +kerning first=1113 second=1095 amount=-1 +kerning first=84 second=8217 amount=1 +kerning first=197 second=356 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=356 second=959 amount=-1 +kerning first=973 second=34 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=916 second=358 amount=-1 +kerning first=933 second=290 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=1043 second=187 amount=-1 +kerning first=932 second=349 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=356 second=356 amount=1 +kerning first=8221 second=289 amount=-1 +kerning first=118 second=8230 amount=-1 +kerning first=358 second=328 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=8211 second=376 amount=-1 +kerning first=295 second=356 amount=-1 +kerning first=1058 second=44 amount=-1 +kerning first=376 second=271 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=8212 second=932 amount=-1 +kerning first=1058 second=1032 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=910 second=961 amount=-1 +kerning first=8220 second=226 amount=-1 +kerning first=76 second=336 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=315 second=372 amount=-1 +kerning first=933 second=8230 amount=-2 +kerning first=245 second=8221 amount=-1 +kerning first=932 second=968 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=932 second=236 amount=-1 +kerning first=194 second=376 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=358 second=954 amount=-1 +kerning first=1169 second=44 amount=-1 +kerning first=376 second=932 amount=1 +kerning first=356 second=181 amount=-1 +kerning first=86 second=271 amount=-1 +kerning first=1027 second=59 amount=-1 +kerning first=358 second=228 amount=-1 +kerning first=319 second=370 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=1168 second=171 amount=-1 +kerning first=34 second=941 amount=-1 +kerning first=259 second=358 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=171 second=84 amount=-1 +kerning first=317 second=268 amount=-1 +kerning first=932 second=101 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=76 second=338 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=356 second=8217 amount=1 +kerning first=354 second=339 amount=-1 +kerning first=8221 second=74 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=295 second=8217 amount=-1 +kerning first=376 second=65 amount=-1 +kerning first=8216 second=349 amount=-1 +kerning first=908 second=44 amount=-1 +kerning first=245 second=354 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=86 second=932 amount=1 +kerning first=8230 second=933 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=193 second=34 amount=-1 +kerning first=8211 second=358 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=354 second=312 amount=-1 +kerning first=321 second=264 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=358 second=248 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=241 second=356 amount=-1 +kerning first=34 second=916 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=271 second=108 amount=1 +kerning first=354 second=275 amount=-1 +kerning first=932 second=46 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=195 second=936 amount=-1 +kerning first=315 second=171 amount=-1 +kerning first=84 second=943 amount=-1 +kerning first=194 second=358 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=8221 second=353 amount=-1 +kerning first=40 second=1035 amount=1 +kerning first=8216 second=101 amount=-1 +kerning first=1043 second=1169 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=932 second=297 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=321 second=8211 amount=-1 +kerning first=103 second=356 amount=-1 +kerning first=335 second=84 amount=-1 +kerning first=358 second=279 amount=-1 +kerning first=372 second=257 amount=-1 +kerning first=915 second=913 amount=-2 +kerning first=317 second=86 amount=-1 +kerning first=40 second=309 amount=1 +kerning first=315 second=220 amount=-1 +kerning first=372 second=113 amount=-1 +kerning first=376 second=99 amount=-1 +kerning first=76 second=290 amount=-1 +kerning first=910 second=211 amount=-1 +kerning first=212 second=8230 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=241 second=8217 amount=-1 +kerning first=931 second=336 amount=-1 +kerning first=932 second=945 amount=-1 +kerning first=329 second=932 amount=-1 +kerning first=915 second=258 amount=-2 +kerning first=1168 second=1241 amount=-1 +kerning first=123 second=1066 amount=1 +kerning first=319 second=213 amount=-1 +kerning first=65 second=932 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=46 second=939 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=8216 second=46 amount=-2 +kerning first=372 second=193 amount=-1 +kerning first=1027 second=1026 amount=1 +kerning first=34 second=949 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=912 second=955 amount=1 +kerning first=364 second=65 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=368 second=192 amount=-1 +kerning first=1168 second=1106 amount=1 +kerning first=933 second=214 amount=-1 +kerning first=8220 second=349 amount=-1 +kerning first=89 second=8211 amount=-1 +kerning first=87 second=354 amount=1 +kerning first=931 second=338 amount=-1 +kerning first=356 second=943 amount=-1 +kerning first=362 second=923 amount=-1 +kerning first=376 second=44 amount=-2 +kerning first=39 second=941 amount=-1 +kerning first=233 second=84 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=913 second=89 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=195 second=372 amount=-1 +kerning first=173 second=933 amount=-1 +kerning first=80 second=913 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=257 second=356 amount=-1 +kerning first=932 second=198 amount=-1 +kerning first=354 second=962 amount=-1 +kerning first=372 second=335 amount=-1 +kerning first=915 second=946 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=8212 second=939 amount=-1 +kerning first=910 second=970 amount=-1 +kerning first=287 second=84 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=8216 second=945 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=354 second=372 amount=1 +kerning first=932 second=944 amount=-1 +kerning first=256 second=89 amount=-1 +kerning first=8217 second=358 amount=1 +kerning first=260 second=376 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=84 second=951 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=939 second=940 amount=-1 +kerning first=317 second=932 amount=-1 +kerning first=932 second=255 amount=-1 +kerning first=39 second=916 amount=-1 +kerning first=915 second=81 amount=-1 +kerning first=358 second=969 amount=-1 +kerning first=244 second=932 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1033 second=1058 amount=-1 +kerning first=358 second=241 amount=-1 +kerning first=913 second=34 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=932 second=261 amount=-1 +kerning first=372 second=227 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=933 second=973 amount=-1 +kerning first=293 second=358 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=922 second=74 amount=1 +kerning first=357 second=8221 amount=1 +kerning first=932 second=114 amount=-1 +kerning first=315 second=927 amount=-1 +kerning first=926 second=912 amount=1 +kerning first=8204 second=902 amount=-1 +kerning first=257 second=8217 amount=-1 +kerning first=84 second=86 amount=1 +kerning first=1059 second=8211 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=354 second=256 amount=-1 +kerning first=373 second=46 amount=-1 +kerning first=315 second=286 amount=-1 +kerning first=8216 second=198 amount=-1 +kerning first=931 second=290 amount=-1 +kerning first=256 second=34 amount=-1 +kerning first=910 second=264 amount=-1 +kerning first=8220 second=46 amount=-2 +kerning first=932 second=194 amount=-1 +kerning first=358 second=913 amount=-1 +kerning first=1068 second=1026 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=8221 second=305 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=1056 second=44 amount=-2 +kerning first=1168 second=1084 amount=-1 +kerning first=1056 second=1032 amount=-1 +kerning first=939 second=260 amount=-2 +kerning first=922 second=970 amount=1 +kerning first=89 second=277 amount=-1 +kerning first=358 second=258 amount=-1 +kerning first=34 second=195 amount=-1 +kerning first=260 second=358 amount=-1 +kerning first=8221 second=8204 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=315 second=8221 amount=-2 +kerning first=1059 second=1076 amount=-1 +kerning first=313 second=372 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=356 second=951 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=246 second=8221 amount=-1 +kerning first=39 second=949 amount=-1 +kerning first=8216 second=261 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=910 second=8211 amount=-1 +kerning first=8217 second=343 amount=-1 +kerning first=8221 second=273 amount=-1 +kerning first=358 second=307 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=160 second=8216 amount=-1 +kerning first=932 second=337 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=8216 second=1103 amount=-1 +kerning first=8211 second=910 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=8221 second=277 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=8220 second=945 amount=-1 +kerning first=84 second=120 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=356 second=86 amount=1 +kerning first=915 second=196 amount=-2 +kerning first=1038 second=8211 amount=-1 +kerning first=221 second=927 amount=-1 +kerning first=1168 second=1028 amount=-1 +kerning first=8218 second=1063 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=34 second=8230 amount=-2 +kerning first=8216 second=194 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=8217 second=237 amount=-1 +kerning first=246 second=354 amount=-1 +kerning first=1107 second=46 amount=-1 +kerning first=8211 second=1066 amount=-1 +kerning first=84 second=932 amount=1 +kerning first=45 second=354 amount=-1 +kerning first=65 second=939 amount=-2 +kerning first=939 second=948 amount=-1 +kerning first=932 second=231 amount=-1 +kerning first=1040 second=1033 amount=1 +kerning first=358 second=946 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=376 second=923 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=1058 second=1115 amount=1 +kerning first=1114 second=8217 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=933 second=954 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=939 second=334 amount=-1 +kerning first=932 second=93 amount=1 +kerning first=89 second=351 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=40 second=356 amount=1 +kerning first=929 second=46 amount=-2 +kerning first=8220 second=198 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=1028 second=1035 amount=1 +kerning first=192 second=936 amount=-1 +kerning first=313 second=171 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=86 second=923 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=8221 second=351 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=101 second=356 amount=-1 +kerning first=197 second=932 amount=-1 +kerning first=356 second=120 amount=-1 +kerning first=915 second=959 amount=-1 +kerning first=89 second=239 amount=1 +kerning first=939 second=216 amount=-1 +kerning first=1058 second=1059 amount=1 +kerning first=321 second=45 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=8220 second=261 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=84 second=966 amount=-1 +kerning first=356 second=932 amount=1 +kerning first=366 second=197 amount=-1 +kerning first=8220 second=1103 amount=-1 +kerning first=295 second=932 amount=-1 +kerning first=221 second=354 amount=1 +kerning first=84 second=238 amount=-1 +kerning first=8217 second=301 amount=-1 +kerning first=8221 second=239 amount=-1 +kerning first=317 second=213 amount=-1 +kerning first=39 second=195 amount=-1 +kerning first=358 second=382 amount=-1 +kerning first=44 second=939 amount=-1 +kerning first=372 second=246 amount=-1 +kerning first=932 second=285 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=376 second=229 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=230 second=84 amount=-1 +kerning first=360 second=193 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=8221 second=100 amount=-1 +kerning first=356 second=65 amount=-1 +kerning first=354 second=192 amount=-1 +kerning first=315 second=211 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=358 second=115 amount=-1 +kerning first=8220 second=194 amount=-1 +kerning first=931 second=214 amount=-1 +kerning first=8204 second=221 amount=-1 +kerning first=915 second=181 amount=-1 +kerning first=902 second=936 amount=-1 +kerning first=364 second=923 amount=-1 +kerning first=913 second=8220 amount=-1 +kerning first=227 second=84 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=123 second=1058 amount=1 +kerning first=1035 second=1063 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=8204 second=84 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=192 second=372 amount=-1 +kerning first=939 second=197 amount=-2 +kerning first=1058 second=1093 amount=-1 +kerning first=39 second=8230 amount=-2 +kerning first=929 second=198 amount=-1 +kerning first=358 second=196 amount=-1 +kerning first=1075 second=44 amount=-1 +kerning first=932 second=308 amount=-1 +kerning first=8216 second=1026 amount=1 +kerning first=321 second=79 amount=-1 +kerning first=1168 second=1097 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=939 second=284 amount=-1 +kerning first=275 second=84 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=354 second=8221 amount=1 +kerning first=1059 second=1089 amount=-1 +kerning first=232 second=358 amount=-1 +kerning first=356 second=966 amount=-1 +kerning first=8216 second=285 amount=-1 +kerning first=258 second=376 amount=-1 +kerning first=221 second=289 amount=-1 +kerning first=356 second=238 amount=-1 +kerning first=932 second=369 amount=-1 +kerning first=241 second=932 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=321 second=8212 amount=-1 +kerning first=1027 second=1109 amount=-1 +kerning first=84 second=299 amount=-1 +kerning first=8221 second=303 amount=-1 +kerning first=1041 second=1098 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=358 second=333 amount=-1 +kerning first=354 second=961 amount=-1 +kerning first=289 second=358 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=939 second=187 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=1058 second=1038 amount=1 +kerning first=70 second=227 amount=-1 +kerning first=313 second=927 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=336 second=8230 amount=-1 +kerning first=98 second=358 amount=-1 +kerning first=376 second=125 amount=1 +kerning first=8218 second=87 amount=-1 +kerning first=123 second=372 amount=1 +kerning first=253 second=8230 amount=-1 +kerning first=354 second=354 amount=1 +kerning first=76 second=89 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=932 second=942 amount=-1 +kerning first=1059 second=45 amount=-1 +kerning first=916 second=936 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=103 second=932 amount=-1 +kerning first=313 second=286 amount=-1 +kerning first=939 second=963 amount=-1 +kerning first=932 second=242 amount=-1 +kerning first=358 second=959 amount=-1 +kerning first=8216 second=308 amount=-1 +kerning first=1058 second=8249 amount=-1 +kerning first=902 second=372 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=8212 second=1059 amount=-1 +kerning first=358 second=233 amount=-1 +kerning first=929 second=194 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=1168 second=8211 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=1066 second=1026 amount=-1 +kerning first=86 second=125 amount=1 +kerning first=87 second=273 amount=-1 +kerning first=114 second=8230 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=8249 second=376 amount=-1 +kerning first=358 second=356 amount=1 +kerning first=356 second=44 amount=-1 +kerning first=89 second=8212 amount=-1 +kerning first=947 second=46 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=372 second=84 amount=1 +kerning first=1033 second=8221 amount=-1 +kerning first=258 second=358 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=313 second=8221 amount=-2 +kerning first=1038 second=1089 amount=-1 +kerning first=315 second=264 amount=-1 +kerning first=76 second=34 amount=-2 +kerning first=196 second=86 amount=-1 +kerning first=243 second=8221 amount=-1 +kerning first=84 second=373 amount=-1 +kerning first=356 second=299 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=8220 second=1026 amount=1 +kerning first=197 second=939 amount=-2 +kerning first=915 second=943 amount=-1 +kerning first=910 second=45 amount=-1 +kerning first=1043 second=46 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=358 second=181 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=933 second=913 amount=-2 +kerning first=1168 second=1076 amount=-2 +kerning first=354 second=289 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=8220 second=285 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=315 second=8211 amount=-1 +kerning first=358 second=8217 amount=1 +kerning first=257 second=932 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=84 second=974 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=933 second=258 amount=-2 +kerning first=243 second=354 amount=-1 +kerning first=1038 second=45 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=1062 second=1112 amount=1 +kerning first=208 second=44 amount=-1 +kerning first=75 second=308 amount=1 +kerning first=376 second=244 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=217 second=923 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=319 second=8249 amount=-1 +kerning first=8249 second=358 amount=-1 +kerning first=358 second=291 amount=-1 +kerning first=372 second=265 amount=-1 +kerning first=1059 second=8212 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=8221 second=113 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=923 second=8216 amount=-1 +kerning first=104 second=354 amount=-1 +kerning first=927 second=46 amount=-1 +kerning first=1061 second=1060 amount=-1 +kerning first=8220 second=308 amount=-1 +kerning first=1026 second=1035 amount=-1 +kerning first=194 second=936 amount=-1 +kerning first=915 second=268 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=84 second=923 amount=-1 +kerning first=319 second=217 amount=-1 +kerning first=356 second=373 amount=-1 +kerning first=89 second=58 amount=-1 +kerning first=8211 second=1058 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=8221 second=193 amount=-1 +kerning first=910 second=79 amount=-1 +kerning first=939 second=212 amount=-1 +kerning first=8212 second=1038 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=319 second=334 amount=-1 +kerning first=372 second=195 amount=-1 +kerning first=196 second=932 amount=-1 +kerning first=933 second=946 amount=-1 +kerning first=8216 second=1040 amount=-1 +kerning first=1168 second=1111 amount=-1 +kerning first=87 second=239 amount=1 +kerning first=324 second=84 amount=-1 +kerning first=354 second=371 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=376 second=260 amount=-1 +kerning first=261 second=8221 amount=-1 +kerning first=112 second=84 amount=-1 +kerning first=356 second=974 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=913 second=356 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=910 second=8212 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=933 second=81 amount=-1 +kerning first=221 second=8211 amount=-1 +kerning first=932 second=380 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=319 second=216 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=8221 second=335 amount=-1 +kerning first=354 second=970 amount=-1 +kerning first=358 second=363 amount=-1 +kerning first=337 second=358 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=915 second=951 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=910 second=912 amount=-1 +kerning first=370 second=193 amount=-1 +kerning first=372 second=8230 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=376 second=8249 amount=-1 +kerning first=1038 second=8212 amount=-1 +kerning first=256 second=356 amount=-1 +kerning first=313 second=211 amount=-1 +kerning first=261 second=354 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=1059 second=58 amount=-1 +kerning first=8217 second=312 amount=-1 +kerning first=356 second=923 amount=-1 +kerning first=939 second=972 amount=-1 +kerning first=932 second=358 amount=1 +kerning first=358 second=943 amount=-1 +kerning first=1058 second=187 amount=-1 +kerning first=224 second=84 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=1033 second=1063 amount=-1 +kerning first=358 second=245 amount=-1 +kerning first=248 second=358 amount=-1 +kerning first=913 second=8217 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=932 second=267 amount=-1 +kerning first=194 second=372 amount=-1 +kerning first=372 second=232 amount=-1 +kerning first=1027 second=1066 amount=1 +kerning first=1043 second=1103 amount=-1 +kerning first=91 second=221 amount=1 +kerning first=932 second=119 amount=-1 +kerning first=929 second=308 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=1034 second=1059 amount=-1 +kerning first=283 second=84 amount=-1 +kerning first=372 second=97 amount=-1 +kerning first=45 second=933 amount=-1 +kerning first=910 second=193 amount=-2 +kerning first=234 second=358 amount=-1 +kerning first=91 second=84 amount=1 +kerning first=331 second=8221 amount=-1 +kerning first=256 second=8217 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=939 second=920 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=8220 second=1040 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=910 second=58 amount=-1 +kerning first=1043 second=59 amount=-1 +kerning first=968 second=39 amount=-1 +kerning first=40 second=932 amount=1 +kerning first=1058 second=1085 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=319 second=284 amount=-1 +kerning first=285 second=358 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=321 second=71 amount=-1 +kerning first=1168 second=1089 amount=-1 +kerning first=1036 second=1051 amount=1 +kerning first=939 second=266 amount=-1 +kerning first=922 second=912 amount=1 +kerning first=89 second=287 amount=-1 +kerning first=76 second=8220 amount=-2 +kerning first=8216 second=358 amount=1 +kerning first=933 second=196 amount=-2 +kerning first=221 second=273 amount=-1 +kerning first=1027 second=173 amount=-1 +kerning first=354 second=8211 amount=-1 +kerning first=331 second=354 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=1038 second=58 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=101 second=932 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=1057 second=1033 amount=1 +kerning first=1100 second=1098 amount=-1 +kerning first=902 second=8221 amount=-1 +kerning first=932 second=343 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=8221 second=287 amount=-1 +kerning first=1041 second=1090 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=84 second=125 amount=1 +kerning first=376 second=269 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=1168 second=45 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=123 second=354 amount=1 +kerning first=955 second=947 amount=-1 +kerning first=260 second=936 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=76 second=81 amount=-1 +kerning first=932 second=965 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=354 second=87 amount=1 +kerning first=89 second=71 amount=-1 +kerning first=313 second=264 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=939 second=953 amount=-1 +kerning first=932 second=237 amount=-1 +kerning first=915 second=65 amount=-2 +kerning first=358 second=951 amount=-1 +kerning first=1068 second=1066 amount=-1 +kerning first=333 second=356 amount=-1 +kerning first=902 second=354 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=1058 second=1169 amount=-1 +kerning first=319 second=364 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=343 second=44 amount=-1 +kerning first=376 second=197 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=196 second=939 amount=-2 +kerning first=936 second=256 amount=-1 +kerning first=933 second=959 amount=-1 +kerning first=8249 second=910 amount=-1 +kerning first=34 second=969 amount=-1 +kerning first=319 second=8216 amount=-2 +kerning first=89 second=365 amount=-1 +kerning first=958 second=125 amount=1 +kerning first=376 second=284 amount=-1 +kerning first=46 second=8216 amount=-2 +kerning first=354 second=305 amount=-1 +kerning first=1034 second=1038 amount=-1 +kerning first=358 second=86 amount=1 +kerning first=87 second=257 amount=-1 +kerning first=102 second=8221 amount=1 +kerning first=221 second=351 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=313 second=8211 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=339 second=356 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=173 second=221 amount=-1 +kerning first=916 second=8221 amount=-1 +kerning first=219 second=923 amount=-1 +kerning first=8217 second=256 amount=-1 +kerning first=356 second=125 amount=1 +kerning first=915 second=966 amount=-1 +kerning first=317 second=8249 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=963 second=912 amount=1 +kerning first=358 second=230 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=8220 second=358 amount=1 +kerning first=1043 second=1026 amount=1 +kerning first=333 second=8217 amount=-1 +kerning first=34 second=913 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=235 second=356 amount=-1 +kerning first=173 second=84 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=239 amount=1 +kerning first=933 second=181 amount=-1 +kerning first=195 second=933 amount=-2 +kerning first=354 second=121 amount=-1 +kerning first=84 second=940 amount=-1 +kerning first=34 second=258 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=260 second=372 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=8221 second=246 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=932 second=301 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=1168 second=8212 amount=-1 +kerning first=291 second=356 amount=-1 +kerning first=916 second=354 amount=-1 +kerning first=317 second=334 amount=-1 +kerning first=360 second=195 amount=-1 +kerning first=358 second=271 amount=-1 +kerning first=97 second=356 amount=-1 +kerning first=193 second=932 amount=-1 +kerning first=8221 second=105 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=358 second=120 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=259 second=8221 amount=-1 +kerning first=110 second=84 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=315 second=79 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=319 second=212 amount=-1 +kerning first=931 second=81 amount=-1 +kerning first=8204 second=89 amount=-1 +kerning first=939 second=934 amount=-1 +kerning first=358 second=932 amount=1 +kerning first=915 second=44 amount=-2 +kerning first=910 second=71 amount=-1 +kerning first=317 second=216 amount=-1 +kerning first=321 second=336 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=271 second=318 amount=1 +kerning first=326 second=358 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=912 second=952 amount=1 +kerning first=1168 second=1102 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=939 second=67 amount=-1 +kerning first=259 second=354 amount=-1 +kerning first=315 second=8212 amount=-1 +kerning first=70 second=8230 amount=-2 +kerning first=358 second=65 amount=-1 +kerning first=356 second=940 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=376 second=41 amount=1 +kerning first=39 second=969 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=913 second=86 amount=-1 +kerning first=955 second=8221 amount=-1 +kerning first=226 second=84 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=321 second=338 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=358 second=347 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=354 second=239 amount=-1 +kerning first=910 second=941 amount=-1 +kerning first=1168 second=58 amount=-1 +kerning first=915 second=213 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=8211 second=354 amount=-1 +kerning first=86 second=41 amount=1 +kerning first=89 second=336 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=932 second=971 amount=-1 +kerning first=256 second=86 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=89 second=84 amount=1 +kerning first=70 second=97 amount=-1 +kerning first=84 second=948 amount=-1 +kerning first=942 second=8217 amount=-1 +kerning first=939 second=968 amount=-1 +kerning first=932 second=252 amount=-1 +kerning first=39 second=913 amount=-1 +kerning first=358 second=966 amount=-1 +kerning first=936 second=192 amount=-1 +kerning first=932 second=173 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=358 second=238 amount=-1 +kerning first=372 second=228 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=376 second=212 amount=-1 +kerning first=171 second=356 amount=-1 +kerning first=933 second=943 amount=-1 +kerning first=1027 second=1058 amount=1 +kerning first=1043 second=1095 amount=-1 +kerning first=8216 second=1066 amount=1 +kerning first=356 second=260 amount=-1 +kerning first=1113 second=8221 amount=-1 +kerning first=317 second=284 amount=-1 +kerning first=932 second=111 amount=-1 +kerning first=39 second=258 amount=-1 +kerning first=281 second=358 amount=-1 +kerning first=8221 second=84 amount=1 +kerning first=65 second=8216 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=358 second=99 amount=-1 +kerning first=910 second=916 amount=-2 +kerning first=76 second=8217 amount=-2 +kerning first=319 second=920 amount=-1 +kerning first=160 second=8218 amount=-2 +kerning first=221 second=8212 amount=-1 +kerning first=8217 second=192 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=969 second=34 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=321 second=290 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=319 second=266 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=372 second=248 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=913 second=932 amount=-1 +kerning first=1168 second=1081 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=89 second=265 amount=-1 +kerning first=34 second=196 amount=-1 +kerning first=936 second=961 amount=-1 +kerning first=939 second=46 amount=-2 +kerning first=258 second=936 amount=-1 +kerning first=358 second=44 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=356 second=948 amount=-1 +kerning first=88 second=934 amount=-1 +kerning first=933 second=268 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=910 second=8250 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=1066 second=1066 amount=-1 +kerning first=335 second=356 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=8217 second=8221 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=256 second=932 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=8221 second=265 amount=-1 +kerning first=358 second=299 amount=-1 +kerning first=341 second=44 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=372 second=279 amount=-1 +kerning first=193 second=939 amount=-2 +kerning first=84 second=117 amount=-1 +kerning first=915 second=923 amount=-2 +kerning first=317 second=8216 amount=-2 +kerning first=89 second=195 amount=-1 +kerning first=910 second=949 amount=-1 +kerning first=293 second=8221 amount=-1 +kerning first=44 second=8216 amount=-2 +kerning first=89 second=290 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=123 second=87 amount=1 +kerning first=8217 second=234 amount=-1 +kerning first=910 second=336 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=939 second=945 amount=-1 +kerning first=932 second=224 amount=-1 +kerning first=1068 second=1058 amount=-1 +kerning first=8220 second=1066 amount=1 +kerning first=84 second=197 amount=-1 +kerning first=376 second=920 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=8217 second=354 amount=1 +kerning first=8221 second=195 amount=-1 +kerning first=946 second=34 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=221 second=58 amount=-1 +kerning first=902 second=87 amount=-1 +kerning first=933 second=951 amount=-1 +kerning first=1168 second=1116 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=1041 second=1026 amount=-1 +kerning first=335 second=8217 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=293 second=354 amount=-1 +kerning first=354 second=8212 amount=-1 +kerning first=89 second=8230 amount=-2 +kerning first=1059 second=1108 amount=-1 +kerning first=233 second=356 amount=-1 +kerning first=8250 second=932 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=192 second=933 amount=-2 +kerning first=910 second=338 amount=-1 +kerning first=1027 second=171 amount=-1 +kerning first=245 second=84 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=80 second=923 amount=-1 +kerning first=258 second=372 amount=-1 +kerning first=84 second=341 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=8221 second=345 amount=-1 +kerning first=931 second=8217 amount=-1 +kerning first=354 second=912 amount=-1 +kerning first=932 second=339 amount=-1 +kerning first=358 second=373 amount=-1 +kerning first=287 second=356 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=8221 second=8230 amount=-2 +kerning first=356 second=117 amount=-1 +kerning first=939 second=198 amount=-2 +kerning first=354 second=253 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=1090 second=44 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=370 second=195 amount=-1 +kerning first=1168 second=1060 amount=-1 +kerning first=923 second=39 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=8216 second=224 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=84 second=963 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=8204 second=8220 amount=-1 +kerning first=939 second=944 amount=-1 +kerning first=932 second=312 amount=-1 +kerning first=358 second=974 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=313 second=79 amount=-1 +kerning first=356 second=197 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=260 second=354 amount=-1 +kerning first=317 second=212 amount=-1 +kerning first=8221 second=232 amount=-1 +kerning first=39 second=196 amount=-1 +kerning first=358 second=249 amount=-1 +kerning first=1043 second=1109 amount=-1 +kerning first=932 second=275 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=328 second=358 amount=-1 +kerning first=358 second=259 amount=-1 +kerning first=1059 second=8230 amount=-2 +kerning first=354 second=193 amount=-1 +kerning first=358 second=112 amount=-1 +kerning first=1111 second=1106 amount=1 +kerning first=76 second=268 amount=-1 +kerning first=333 second=932 amount=-1 +kerning first=902 second=933 amount=-2 +kerning first=910 second=195 amount=-2 +kerning first=313 second=8212 amount=-1 +kerning first=68 second=8230 amount=-1 +kerning first=91 second=89 amount=1 +kerning first=1038 second=1108 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=321 second=214 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=315 second=71 amount=-1 +kerning first=910 second=290 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=356 second=341 amount=-1 +kerning first=358 second=923 amount=-1 +kerning first=372 second=913 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=939 second=194 amount=-2 +kerning first=1058 second=1090 amount=-1 +kerning first=271 second=293 amount=1 +kerning first=1107 second=173 amount=-1 +kerning first=8217 second=74 amount=-1 +kerning first=913 second=939 amount=-2 +kerning first=1168 second=1094 amount=-1 +kerning first=319 second=67 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=339 second=932 amount=-1 +kerning first=372 second=258 amount=-1 +kerning first=84 second=41 amount=1 +kerning first=1027 second=1241 amount=-1 +kerning first=939 second=59 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=356 second=963 amount=-1 +kerning first=197 second=8216 amount=-1 +kerning first=221 second=287 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=229 second=358 amount=-1 +kerning first=87 second=84 amount=1 +kerning first=356 second=235 amount=-1 +kerning first=910 second=8230 amount=-2 +kerning first=933 second=65 amount=-2 +kerning first=1027 second=1106 amount=1 +kerning first=8218 second=221 amount=-2 +kerning first=256 second=939 amount=-2 +kerning first=187 second=1026 amount=-1 +kerning first=235 second=932 amount=-1 +kerning first=358 second=326 amount=-1 +kerning first=1058 second=46 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=8220 second=224 amount=-1 +kerning first=279 second=358 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=1038 second=8230 amount=-2 +kerning first=8230 second=34 amount=-2 +kerning first=76 second=86 amount=-1 +kerning first=958 second=41 amount=1 +kerning first=932 second=962 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=291 second=932 amount=-1 +kerning first=916 second=933 amount=-1 +kerning first=952 second=44 amount=-1 +kerning first=317 second=920 amount=-1 +kerning first=932 second=243 amount=-1 +kerning first=1169 second=46 amount=-1 +kerning first=97 second=932 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=358 second=229 amount=-1 +kerning first=319 second=360 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=932 second=372 amount=1 +kerning first=1043 second=1087 amount=-1 +kerning first=1168 second=8250 amount=-1 +kerning first=933 second=966 amount=-1 +kerning first=8216 second=1058 amount=1 +kerning first=317 second=266 amount=-1 +kerning first=932 second=103 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=356 second=41 amount=1 +kerning first=87 second=265 amount=-1 +kerning first=8220 second=339 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=908 second=46 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=931 second=268 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=376 second=349 amount=-1 +kerning first=915 second=940 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=932 second=256 amount=-1 +kerning first=8216 second=962 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=173 second=89 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=160 second=376 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=84 second=972 amount=-1 +kerning first=8204 second=8222 amount=-2 +kerning first=98 second=8221 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=230 second=356 amount=-1 +kerning first=232 second=354 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=933 second=44 amount=-2 +kerning first=1066 second=1058 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=76 second=932 amount=-1 +kerning first=8211 second=933 amount=-1 +kerning first=319 second=39 amount=-2 +kerning first=1060 second=1061 amount=-1 +kerning first=932 second=171 amount=-1 +kerning first=358 second=281 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=8221 second=110 amount=-1 +kerning first=46 second=39 amount=-2 +kerning first=315 second=221 amount=-1 +kerning first=358 second=125 amount=1 +kerning first=376 second=101 amount=-1 +kerning first=289 second=354 amount=-1 +kerning first=87 second=8230 amount=-1 +kerning first=910 second=214 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=227 second=356 amount=-1 +kerning first=315 second=336 amount=-1 +kerning first=171 second=932 amount=-1 +kerning first=8204 second=356 amount=-1 +kerning first=98 second=354 amount=-1 +kerning first=194 second=933 amount=-2 +kerning first=915 second=260 amount=-2 +kerning first=315 second=84 amount=-1 +kerning first=319 second=218 amount=-1 +kerning first=356 second=367 amount=-1 +kerning first=246 second=84 amount=-1 +kerning first=8216 second=256 amount=-1 +kerning first=8220 second=1058 amount=1 +kerning first=258 second=8221 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=372 second=196 amount=-1 +kerning first=1043 second=1066 amount=1 +kerning first=275 second=356 amount=-1 +kerning first=1027 second=1028 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=1168 second=1108 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=368 second=195 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=933 second=213 amount=-1 +kerning first=160 second=358 amount=-1 +kerning first=315 second=338 amount=-1 +kerning first=1068 second=8221 amount=-1 +kerning first=356 second=972 amount=-1 +kerning first=376 second=46 amount=-2 +kerning first=87 second=97 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=362 second=194 amount=-1 +kerning first=91 second=1035 amount=1 +kerning first=8217 second=305 amount=-1 +kerning first=227 second=8217 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=8221 second=328 amount=-1 +kerning first=354 second=941 amount=-1 +kerning first=8220 second=962 amount=-1 +kerning first=372 second=333 amount=-1 +kerning first=1058 second=59 amount=-1 +kerning first=915 second=948 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=8220 second=243 amount=-1 +kerning first=91 second=309 amount=1 +kerning first=910 second=973 amount=-1 +kerning first=8217 second=8204 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=321 second=34 amount=-2 +kerning first=80 second=260 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=955 second=967 amount=-1 +kerning first=111 second=358 amount=-1 +kerning first=1043 second=173 amount=-1 +kerning first=335 second=932 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=915 second=334 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=84 second=953 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=939 second=942 amount=-1 +kerning first=358 second=940 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=313 second=71 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=358 second=244 amount=-1 +kerning first=951 second=8221 amount=-1 +kerning first=372 second=233 amount=-1 +kerning first=221 second=84 amount=1 +kerning first=932 second=263 amount=-1 +kerning first=360 second=913 amount=-1 +kerning first=260 second=87 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=1168 second=8230 amount=-1 +kerning first=8230 second=8220 amount=-2 +kerning first=354 second=916 amount=-1 +kerning first=70 second=913 amount=-1 +kerning first=372 second=356 amount=1 +kerning first=317 second=67 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=187 second=376 amount=-1 +kerning first=360 second=258 amount=-1 +kerning first=8249 second=354 amount=-1 +kerning first=915 second=216 amount=-1 +kerning first=315 second=290 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=196 second=8216 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=8220 second=256 amount=-1 +kerning first=228 second=358 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=271 second=295 amount=1 +kerning first=932 second=192 amount=-1 +kerning first=8221 second=248 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=233 second=932 amount=-1 +kerning first=1056 second=46 amount=-2 +kerning first=376 second=198 amount=-1 +kerning first=933 second=923 amount=-2 +kerning first=1168 second=1086 amount=-1 +kerning first=939 second=262 amount=-1 +kerning first=277 second=358 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=358 second=260 amount=-1 +kerning first=337 second=8221 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=356 second=953 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=287 second=932 amount=-1 +kerning first=221 second=265 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=1100 second=1095 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=34 second=65 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=965 second=34 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=8221 second=279 amount=-1 +kerning first=317 second=360 amount=-1 +kerning first=354 second=949 amount=-1 +kerning first=932 second=8221 amount=1 +kerning first=76 second=213 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=65 second=39 amount=-1 +kerning first=187 second=358 amount=-1 +kerning first=1058 second=1026 amount=1 +kerning first=358 second=8249 amount=-1 +kerning first=248 second=8221 amount=-1 +kerning first=910 second=954 amount=-1 +kerning first=337 second=354 amount=-1 +kerning first=915 second=197 amount=-2 +kerning first=260 second=933 amount=-2 +kerning first=315 second=368 amount=-1 +kerning first=8216 second=192 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=932 second=961 amount=-1 +kerning first=8217 second=239 amount=-1 +kerning first=915 second=284 amount=-1 +kerning first=171 second=939 amount=-1 +kerning first=173 second=1035 amount=-1 +kerning first=354 second=84 amount=1 +kerning first=84 second=934 amount=-1 +kerning first=1040 second=1035 amount=-1 +kerning first=932 second=234 amount=-1 +kerning first=358 second=948 amount=-1 +kerning first=102 second=58 amount=1 +kerning first=1068 second=1063 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=920 second=8230 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=324 second=356 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=932 second=354 amount=1 +kerning first=376 second=194 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=939 second=332 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=112 second=356 amount=-1 +kerning first=248 second=354 amount=-1 +kerning first=929 second=256 amount=-1 +kerning first=85 second=195 amount=-1 +kerning first=1059 second=1113 amount=-1 +kerning first=376 second=59 amount=-1 +kerning first=915 second=187 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=270 second=8230 amount=-1 +kerning first=1027 second=8211 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=221 second=8230 amount=-2 +kerning first=86 second=194 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=84 second=349 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=234 second=354 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=915 second=963 amount=-1 +kerning first=317 second=39 amount=-2 +kerning first=8216 second=961 amount=-2 +kerning first=44 second=39 amount=-2 +kerning first=313 second=221 amount=-1 +kerning first=324 second=8217 amount=-1 +kerning first=354 second=265 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=285 second=354 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=112 second=8217 amount=-1 +kerning first=224 second=356 amount=-1 +kerning first=84 second=968 amount=-1 +kerning first=313 second=336 amount=-1 +kerning first=356 second=934 amount=-1 +kerning first=8216 second=354 amount=1 +kerning first=84 second=236 amount=-1 +kerning first=8217 second=303 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=8221 second=241 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=243 second=84 amount=-1 +kerning first=34 second=44 amount=-2 +kerning first=372 second=245 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=932 second=289 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=1027 second=1076 amount=-2 +kerning first=321 second=8220 amount=-2 +kerning first=923 second=376 amount=-1 +kerning first=360 second=196 amount=-1 +kerning first=89 second=913 amount=-1 +kerning first=358 second=269 amount=-1 +kerning first=283 second=356 amount=-1 +kerning first=1041 second=1066 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=354 second=195 amount=-1 +kerning first=39 second=65 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=315 second=214 amount=-1 +kerning first=358 second=117 amount=-1 +kerning first=8220 second=192 amount=-1 +kerning first=91 second=356 amount=1 +kerning first=931 second=213 amount=-1 +kerning first=376 second=93 amount=1 +kerning first=313 second=338 amount=-1 +kerning first=1066 second=8221 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=104 second=84 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=1098 second=1118 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=356 second=349 amount=-1 +kerning first=8221 second=913 amount=-1 +kerning first=8204 second=86 amount=-1 +kerning first=224 second=8217 amount=-1 +kerning first=939 second=199 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=8212 second=1026 amount=-1 +kerning first=358 second=197 amount=-1 +kerning first=1043 second=1058 amount=1 +kerning first=1075 second=46 amount=-1 +kerning first=944 second=39 amount=-1 +kerning first=321 second=81 amount=-1 +kerning first=86 second=93 amount=1 +kerning first=1168 second=1099 amount=-1 +kerning first=87 second=228 amount=-1 +kerning first=8221 second=258 amount=-1 +kerning first=939 second=288 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=932 second=74 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=1050 second=1051 amount=1 +kerning first=354 second=8230 amount=-1 +kerning first=109 second=358 amount=-1 +kerning first=356 second=968 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=934 second=933 amount=-1 +kerning first=8221 second=307 amount=-1 +kerning first=356 second=236 amount=-1 +kerning first=932 second=371 amount=-1 +kerning first=1027 second=1111 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=923 second=358 amount=-1 +kerning first=84 second=297 amount=-1 +kerning first=1118 second=8230 amount=-1 +kerning first=358 second=341 amount=-1 +kerning first=370 second=913 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=8220 second=961 amount=-2 +kerning first=376 second=285 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=358 second=187 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=915 second=212 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=955 second=957 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=8230 second=8217 amount=-2 +kerning first=8222 second=376 amount=-2 +kerning first=1168 second=1044 amount=-1 +kerning first=230 second=932 amount=-1 +kerning first=370 second=258 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=8220 second=354 amount=1 +kerning first=932 second=970 amount=-1 +kerning first=261 second=84 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=1059 second=1035 amount=1 +kerning first=84 second=945 amount=-1 +kerning first=313 second=290 amount=-1 +kerning first=193 second=8216 amount=-1 +kerning first=932 second=353 amount=-1 +kerning first=939 second=965 amount=-1 +kerning first=358 second=963 amount=-1 +kerning first=936 second=193 amount=-1 +kerning first=225 second=358 amount=-1 +kerning first=358 second=235 amount=-1 +kerning first=929 second=192 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=933 second=940 amount=-1 +kerning first=34 second=974 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=227 second=932 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=8204 second=932 amount=-1 +kerning first=376 second=308 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=39 second=44 amount=-2 +kerning first=87 second=279 amount=-1 +kerning first=910 second=913 amount=-2 +kerning first=326 second=8221 amount=-1 +kerning first=197 second=39 amount=-1 +kerning first=1028 second=1051 amount=1 +kerning first=221 second=361 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=275 second=932 amount=-1 +kerning first=8217 second=193 amount=-1 +kerning first=1098 second=1095 amount=-1 +kerning first=356 second=297 amount=-1 +kerning first=910 second=258 amount=-2 +kerning first=84 second=198 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=915 second=972 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=319 second=262 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=372 second=230 amount=-1 +kerning first=173 second=356 amount=-1 +kerning first=34 second=923 amount=-1 +kerning first=8222 second=358 amount=-1 +kerning first=1168 second=1078 amount=-1 +kerning first=8216 second=353 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=326 second=354 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=258 second=933 amount=-2 +kerning first=358 second=41 amount=1 +kerning first=84 second=944 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=356 second=945 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=220 second=195 amount=-1 +kerning first=933 second=260 amount=-2 +kerning first=253 second=44 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=1043 second=171 amount=-1 +kerning first=1038 second=1035 amount=1 +kerning first=331 second=84 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=1066 second=1063 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=75 second=74 amount=1 +kerning first=932 second=8211 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=372 second=271 amount=-1 +kerning first=123 second=221 amount=1 +kerning first=84 second=114 amount=-1 +kerning first=8221 second=115 amount=-1 +kerning first=915 second=920 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=110 second=356 amount=-1 +kerning first=910 second=946 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=950 second=125 amount=1 +kerning first=123 second=84 amount=1 +kerning first=902 second=221 amount=-1 +kerning first=915 second=266 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=319 second=376 amount=-1 +kerning first=932 second=225 amount=-1 +kerning first=372 second=932 amount=1 +kerning first=84 second=194 amount=-1 +kerning first=910 second=81 amount=-1 +kerning first=356 second=198 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=8221 second=196 amount=-1 +kerning first=939 second=210 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=1058 second=1109 amount=-1 +kerning first=1027 second=45 amount=-1 +kerning first=319 second=332 amount=-1 +kerning first=902 second=84 amount=-1 +kerning first=8249 second=933 amount=-1 +kerning first=933 second=948 amount=-1 +kerning first=1168 second=1113 amount=-1 +kerning first=319 second=85 amount=-1 +kerning first=932 second=87 amount=1 +kerning first=354 second=361 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=1034 second=1026 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=372 second=65 amount=-1 +kerning first=356 second=944 amount=-1 +kerning first=39 second=974 amount=-1 +kerning first=933 second=334 amount=-1 +kerning first=281 second=354 amount=-1 +kerning first=110 second=8217 amount=-1 +kerning first=226 second=356 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=913 second=8216 amount=-1 +kerning first=315 second=34 amount=-2 +kerning first=84 second=337 amount=-1 +kerning first=8221 second=333 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=932 second=305 amount=-1 +kerning first=358 second=367 amount=-1 +kerning first=354 second=973 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=87 second=913 amount=-1 +kerning first=8220 second=353 amount=-1 +kerning first=915 second=953 amount=-1 +kerning first=321 second=8217 amount=-2 +kerning first=8212 second=376 amount=-1 +kerning first=1168 second=1057 amount=-1 +kerning first=313 second=214 amount=-1 +kerning first=89 second=356 amount=1 +kerning first=8216 second=225 amount=-1 +kerning first=933 second=216 amount=-1 +kerning first=1043 second=1241 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=256 second=8216 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=319 second=358 amount=-1 +kerning first=939 second=971 amount=-1 +kerning first=932 second=273 amount=-1 +kerning first=39 second=923 amount=-1 +kerning first=358 second=972 amount=-1 +kerning first=242 second=358 amount=-1 +kerning first=957 second=8230 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=356 second=194 amount=-1 +kerning first=8221 second=233 amount=-1 +kerning first=358 second=250 amount=-1 +kerning first=939 second=173 amount=-1 +kerning first=1043 second=1106 amount=1 +kerning first=932 second=277 amount=-1 +kerning first=226 second=8217 amount=-1 +kerning first=8216 second=1076 amount=-1 +kerning first=8221 second=356 amount=1 +kerning first=932 second=121 amount=-1 +kerning first=1041 second=1058 amount=-1 +kerning first=974 second=39 amount=-1 +kerning first=916 second=84 amount=-1 +kerning first=84 second=93 amount=1 +kerning first=376 second=332 amount=-1 +kerning first=358 second=109 amount=-1 +kerning first=929 second=74 amount=-1 +kerning first=372 second=99 amount=-1 +kerning first=910 second=196 amount=-2 +kerning first=271 second=8217 amount=1 +kerning first=91 second=86 amount=1 +kerning first=1038 second=1105 amount=-1 +kerning first=1027 second=8212 amount=-1 +kerning first=324 second=932 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=319 second=199 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=112 second=932 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=319 second=288 amount=-1 +kerning first=368 second=913 amount=-1 +kerning first=8212 second=358 amount=-1 +kerning first=1168 second=1091 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=76 second=8249 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=933 second=197 amount=-2 +kerning first=958 second=93 amount=1 +kerning first=8221 second=8217 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=368 second=258 amount=-1 +kerning first=372 second=44 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=160 second=372 amount=-1 +kerning first=259 second=84 amount=-1 +kerning first=933 second=284 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=1057 second=1035 amount=1 +kerning first=932 second=351 amount=-1 +kerning first=376 second=358 amount=1 +kerning first=1027 second=1102 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=84 second=285 amount=-1 +kerning first=8221 second=291 amount=-1 +kerning first=354 second=954 amount=-1 +kerning first=358 second=324 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=8211 second=221 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=356 second=93 amount=1 +kerning first=915 second=934 amount=-1 +kerning first=354 second=228 amount=-1 +kerning first=224 second=932 amount=-1 +kerning first=910 second=959 amount=-1 +kerning first=8220 second=225 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=1028 second=1098 amount=-1 +kerning first=1168 second=1035 amount=1 +kerning first=328 second=8221 amount=-1 +kerning first=196 second=39 amount=-1 +kerning first=8211 second=84 amount=-1 +kerning first=933 second=187 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=936 second=916 amount=-1 +kerning first=86 second=358 amount=1 +kerning first=932 second=239 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=283 second=932 amount=-1 +kerning first=915 second=67 amount=-1 +kerning first=358 second=953 amount=-1 +kerning first=8220 second=1076 amount=-1 +kerning first=65 second=376 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=1027 second=58 amount=-1 +kerning first=358 second=226 amount=-1 +kerning first=319 second=362 amount=-1 +kerning first=91 second=932 amount=1 +kerning first=343 second=46 amount=-1 +kerning first=8217 second=105 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=933 second=963 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=84 second=308 amount=-1 +kerning first=317 second=262 amount=-1 +kerning first=932 second=100 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=195 second=34 amount=-1 +kerning first=376 second=288 amount=-1 +kerning first=1107 second=8211 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=74 second=125 amount=1 +kerning first=328 second=354 amount=-1 +kerning first=102 second=8230 amount=-1 +kerning first=8216 second=351 amount=-1 +kerning first=245 second=356 amount=-1 +kerning first=910 second=181 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=218 second=195 amount=-1 +kerning first=1035 second=1035 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=356 second=285 amount=-1 +kerning first=229 second=8221 amount=-1 +kerning first=915 second=968 amount=-1 +kerning first=321 second=268 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=1058 second=1066 amount=1 +kerning first=8220 second=273 amount=-1 +kerning first=1043 second=1028 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=45 second=1035 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=271 second=107 amount=1 +kerning first=354 second=279 amount=-1 +kerning first=932 second=45 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=315 second=8220 amount=-2 +kerning first=84 second=942 amount=-1 +kerning first=1107 second=1076 amount=-1 +kerning first=329 second=358 amount=-1 +kerning first=34 second=260 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=65 second=358 amount=-1 +kerning first=8221 second=245 amount=-1 +kerning first=317 second=376 amount=-1 +kerning first=358 second=331 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=245 second=8217 amount=-1 +kerning first=932 second=303 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=229 second=354 amount=-1 +kerning first=356 second=308 amount=-1 +kerning first=317 second=332 amount=-1 +kerning first=358 second=283 amount=-1 +kerning first=372 second=259 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=358 second=122 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=221 second=913 amount=-1 +kerning first=360 second=65 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=1058 second=173 amount=-1 +kerning first=279 second=354 amount=-1 +kerning first=931 second=334 amount=-1 +kerning first=81 second=8230 amount=-1 +kerning first=315 second=81 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=319 second=210 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=915 second=46 amount=-2 +kerning first=372 second=923 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=358 second=934 amount=-1 +kerning first=313 second=34 amount=-2 +kerning first=1058 second=1100 amount=-1 +kerning first=271 second=320 amount=1 +kerning first=8217 second=84 amount=1 +kerning first=321 second=86 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=1168 second=1105 amount=-1 +kerning first=85 second=913 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=1169 second=173 amount=-1 +kerning first=933 second=212 amount=-1 +kerning first=8220 second=351 amount=-1 +kerning first=87 second=356 amount=1 +kerning first=931 second=216 amount=-1 +kerning first=356 second=942 amount=-1 +kerning first=293 second=84 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=85 second=258 amount=-1 +kerning first=317 second=358 amount=-1 +kerning first=244 second=358 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=173 second=932 amount=-1 +kerning first=932 second=8212 amount=-1 +kerning first=354 second=969 amount=-1 +kerning first=358 second=349 amount=-1 +kerning first=935 second=934 amount=-1 +kerning first=915 second=945 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=8212 second=910 amount=-1 +kerning first=310 second=308 amount=1 +kerning first=910 second=943 amount=-1 +kerning first=973 second=39 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=76 second=8216 amount=-2 +kerning first=80 second=46 amount=-2 +kerning first=1046 second=1051 amount=1 +kerning first=932 second=912 amount=-1 +kerning first=260 second=221 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=939 second=962 amount=-1 +kerning first=932 second=253 amount=-1 +kerning first=936 second=195 amount=-1 +kerning first=319 second=173 amount=-1 +kerning first=358 second=968 amount=-1 +kerning first=8217 second=265 amount=-1 +kerning first=317 second=199 amount=-1 +kerning first=86 second=301 amount=1 +kerning first=8212 second=1066 amount=-1 +kerning first=358 second=236 amount=-1 +kerning first=110 second=932 amount=-1 +kerning first=923 second=936 amount=-1 +kerning first=932 second=257 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=372 second=229 amount=-1 +kerning first=260 second=84 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=933 second=972 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=317 second=288 amount=-1 +kerning first=354 second=913 amount=-1 +kerning first=932 second=113 amount=-1 +kerning first=39 second=260 amount=-1 +kerning first=345 second=8230 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=358 second=101 amount=-1 +kerning first=121 second=8230 amount=-1 +kerning first=915 second=198 amount=-2 +kerning first=321 second=932 amount=-1 +kerning first=354 second=258 amount=-1 +kerning first=8230 second=939 amount=-1 +kerning first=931 second=284 amount=-1 +kerning first=8217 second=195 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=84 second=380 amount=-1 +kerning first=910 second=268 amount=-1 +kerning first=932 second=193 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=936 second=8230 amount=-1 +kerning first=915 second=944 amount=-1 +kerning first=354 second=307 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=197 second=376 amount=-1 +kerning first=933 second=920 amount=-1 +kerning first=1168 second=1083 amount=-1 +kerning first=226 second=932 amount=-1 +kerning first=939 second=256 amount=-2 +kerning first=89 second=271 amount=-1 +kerning first=34 second=197 amount=-1 +kerning first=358 second=46 amount=-1 +kerning first=193 second=39 amount=-1 +kerning first=933 second=266 amount=-1 +kerning first=8216 second=257 amount=-1 +kerning first=160 second=354 amount=-1 +kerning first=84 second=358 amount=1 +kerning first=8217 second=345 amount=-1 +kerning first=1043 second=8211 amount=-1 +kerning first=111 second=8221 amount=-1 +kerning first=950 second=41 amount=1 +kerning first=8216 second=113 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=932 second=335 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=8217 second=8230 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=376 second=173 amount=-1 +kerning first=8221 second=271 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=89 second=932 amount=1 +kerning first=354 second=946 amount=-1 +kerning first=76 second=212 amount=-1 +kerning first=358 second=297 amount=-1 +kerning first=341 second=46 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=372 second=281 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=923 second=372 amount=-1 +kerning first=910 second=951 amount=-1 +kerning first=1091 second=8230 amount=-1 +kerning first=372 second=125 amount=1 +kerning first=192 second=34 amount=-1 +kerning first=941 second=912 amount=1 +kerning first=376 second=111 amount=-1 +kerning first=915 second=194 amount=-2 +kerning first=1028 second=1090 amount=-1 +kerning first=357 second=8217 amount=1 +kerning first=315 second=356 amount=-1 +kerning first=8216 second=193 amount=-1 +kerning first=123 second=89 amount=1 +kerning first=221 second=196 amount=-1 +kerning first=246 second=356 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=8221 second=932 amount=1 +kerning first=111 second=354 amount=-1 +kerning first=932 second=227 amount=-1 +kerning first=1107 second=45 amount=-1 +kerning first=915 second=59 amount=-1 +kerning first=358 second=945 amount=-1 +kerning first=1033 second=1035 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=1043 second=1076 amount=-2 +kerning first=902 second=89 amount=-1 +kerning first=197 second=358 amount=-1 +kerning first=228 second=8221 amount=-1 +kerning first=933 second=953 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=1168 second=1119 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=8221 second=65 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=313 second=8220 amount=-2 +kerning first=356 second=358 amount=1 +kerning first=1027 second=8250 amount=-1 +kerning first=295 second=358 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=173 second=939 amount=-1 +kerning first=315 second=8217 amount=-2 +kerning first=84 second=343 amount=-1 +kerning first=8221 second=347 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=213 second=8230 amount=-1 +kerning first=246 second=8217 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=228 second=354 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=1058 second=1058 amount=1 +kerning first=358 second=198 amount=-1 +kerning first=70 second=249 amount=-1 +kerning first=1090 second=46 amount=-1 +kerning first=902 second=34 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=8216 second=227 amount=-1 +kerning first=8220 second=257 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=220 second=913 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=8222 second=372 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=84 second=965 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=277 second=354 amount=-1 +kerning first=358 second=944 amount=-1 +kerning first=79 second=8230 amount=-1 +kerning first=221 second=356 amount=1 +kerning first=84 second=237 amount=-1 +kerning first=8221 second=238 amount=-1 +kerning first=313 second=81 amount=-1 +kerning first=317 second=210 amount=-1 +kerning first=40 second=1026 amount=1 +kerning first=39 second=197 amount=-1 +kerning first=358 second=255 amount=-1 +kerning first=372 second=244 amount=-1 +kerning first=932 second=287 amount=-1 +kerning first=360 second=923 amount=-1 +kerning first=220 second=258 amount=-1 +kerning first=76 second=920 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=1043 second=1111 amount=-1 +kerning first=232 second=84 amount=-1 +kerning first=1041 second=1063 amount=-1 +kerning first=70 second=923 amount=-1 +kerning first=358 second=261 amount=-1 +kerning first=8221 second=99 amount=-1 +kerning first=1107 second=8212 amount=-1 +kerning first=1034 second=1066 amount=-1 +kerning first=354 second=196 amount=-1 +kerning first=358 second=114 amount=-1 +kerning first=8220 second=193 amount=-1 +kerning first=931 second=212 amount=-1 +kerning first=76 second=266 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=913 second=39 amount=-1 +kerning first=289 second=84 amount=-1 +kerning first=321 second=213 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=89 second=44 amount=-2 +kerning first=210 second=46 amount=-1 +kerning first=356 second=343 amount=-1 +kerning first=939 second=927 amount=-1 +kerning first=98 second=84 amount=-1 +kerning first=241 second=358 amount=-1 +kerning first=102 second=34 amount=1 +kerning first=910 second=65 amount=-2 +kerning first=939 second=192 amount=-2 +kerning first=1058 second=1092 amount=-1 +kerning first=358 second=194 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=933 second=934 amount=-1 +kerning first=912 second=946 amount=1 +kerning first=245 second=932 amount=-1 +kerning first=1168 second=1096 amount=-1 +kerning first=939 second=286 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=916 second=34 amount=-1 +kerning first=372 second=260 amount=-1 +kerning first=256 second=39 amount=-1 +kerning first=8221 second=44 amount=-2 +kerning first=356 second=965 amount=-1 +kerning first=929 second=912 amount=1 +kerning first=8216 second=287 amount=-1 +kerning first=103 second=358 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=221 second=291 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=933 second=67 amount=-1 +kerning first=317 second=173 amount=-1 +kerning first=932 second=365 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=1114 second=1095 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=86 second=339 amount=-1 +kerning first=84 second=301 amount=-1 +kerning first=8221 second=299 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=354 second=959 amount=-1 +kerning first=358 second=337 amount=-1 +kerning first=971 second=34 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=8220 second=227 amount=-1 +kerning first=910 second=966 amount=-1 +kerning first=8218 second=86 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=354 second=356 amount=1 +kerning first=119 second=8230 amount=-1 +kerning first=8211 second=89 amount=-1 +kerning first=932 second=941 amount=-1 +kerning first=1059 second=44 amount=-2 +kerning first=1059 second=1032 amount=-1 +kerning first=74 second=41 amount=1 +kerning first=939 second=961 amount=-1 +kerning first=952 second=46 amount=-1 +kerning first=932 second=246 amount=-1 +kerning first=1058 second=171 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=8212 second=1058 amount=-1 +kerning first=358 second=231 amount=-1 +kerning first=929 second=193 amount=-1 +kerning first=319 second=372 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=934 second=8230 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=933 second=968 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=932 second=105 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=196 second=376 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=931 second=920 amount=-1 +kerning first=354 second=181 amount=-1 +kerning first=358 second=93 amount=1 +kerning first=87 second=271 amount=-1 +kerning first=1100 second=8221 amount=-1 +kerning first=40 second=106 amount=1 +kerning first=221 second=363 amount=-1 +kerning first=257 second=358 amount=-1 +kerning first=40 second=1095 amount=-1 +kerning first=315 second=268 amount=-1 +kerning first=8249 second=84 amount=-1 +kerning first=1027 second=8230 amount=-1 +kerning first=931 second=266 amount=-1 +kerning first=932 second=916 amount=-1 +kerning first=354 second=8217 amount=1 +kerning first=109 second=8221 amount=-1 +kerning first=123 second=1035 amount=1 +kerning first=356 second=301 amount=-1 +kerning first=915 second=942 amount=-1 +kerning first=910 second=44 amount=-2 +kerning first=1043 second=45 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=87 second=932 amount=1 +kerning first=955 second=34 amount=-1 +kerning first=8216 second=941 amount=-1 +kerning first=80 second=308 amount=-1 +kerning first=123 second=309 amount=1 +kerning first=1168 second=1075 amount=-1 +kerning first=923 second=8221 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=194 second=34 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=1075 second=173 amount=-1 +kerning first=84 second=971 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=243 second=356 amount=-1 +kerning first=1038 second=44 amount=-2 +kerning first=84 second=252 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=8218 second=932 amount=-1 +kerning first=1038 second=1032 amount=-1 +kerning first=109 second=354 amount=-1 +kerning first=84 second=173 amount=-1 +kerning first=933 second=46 amount=-2 +kerning first=8221 second=160 amount=-1 +kerning first=160 second=87 amount=-1 +kerning first=902 second=8220 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=319 second=171 amount=-1 +kerning first=932 second=8250 amount=-1 +kerning first=89 second=923 amount=-1 +kerning first=358 second=285 amount=-1 +kerning first=196 second=358 amount=-1 +kerning first=372 second=269 amount=-1 +kerning first=225 second=8221 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=8221 second=112 amount=-1 +kerning first=923 second=354 amount=-1 +kerning first=376 second=103 amount=-1 +kerning first=8216 second=916 amount=-1 +kerning first=104 second=356 amount=-1 +kerning first=910 second=213 amount=-1 +kerning first=1058 second=1241 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=337 second=84 amount=-1 +kerning first=932 second=949 amount=-1 +kerning first=915 second=262 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=319 second=220 amount=-1 +kerning first=8221 second=923 amount=-1 +kerning first=8204 second=8216 amount=-1 +kerning first=65 second=936 amount=-1 +kerning first=1033 second=8217 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=313 second=8217 amount=-2 +kerning first=939 second=211 amount=-1 +kerning first=1058 second=1106 amount=1 +kerning first=214 second=8230 amount=-1 +kerning first=243 second=8217 amount=-1 +kerning first=372 second=197 amount=-1 +kerning first=933 second=945 amount=-1 +kerning first=40 second=376 amount=1 +kerning first=225 second=354 amount=-1 +kerning first=932 second=84 amount=1 +kerning first=354 second=363 amount=-1 +kerning first=358 second=308 amount=-1 +kerning first=376 second=256 amount=-1 +kerning first=248 second=84 amount=-1 +kerning first=356 second=971 amount=-1 +kerning first=218 second=913 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=1028 second=1026 amount=1 +kerning first=87 second=99 amount=-1 +kerning first=1043 second=8212 amount=-1 +kerning first=356 second=252 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=356 second=173 amount=-1 +kerning first=932 second=378 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=8221 second=326 amount=-1 +kerning first=358 second=369 amount=-1 +kerning first=370 second=923 amount=-1 +kerning first=218 second=258 amount=-1 +kerning first=354 second=943 amount=-1 +kerning first=8220 second=941 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=234 second=84 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=376 second=171 amount=-1 +kerning first=76 second=360 amount=-1 +kerning first=8216 second=949 amount=-1 +kerning first=1168 second=1054 amount=-1 +kerning first=261 second=356 amount=-1 +kerning first=933 second=198 amount=-2 +kerning first=915 second=332 amount=-1 +kerning first=173 second=1059 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=939 second=970 amount=-1 +kerning first=285 second=84 amount=-1 +kerning first=358 second=942 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=358 second=242 amount=-1 +kerning first=8216 second=84 amount=1 +kerning first=372 second=235 amount=-1 +kerning first=932 second=265 amount=-1 +kerning first=933 second=944 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=260 second=89 amount=-1 +kerning first=40 second=358 amount=1 +kerning first=65 second=372 amount=-1 +kerning first=932 second=118 amount=-1 +kerning first=315 second=932 amount=-1 +kerning first=8220 second=916 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=246 second=932 amount=-1 +kerning first=1034 second=1058 amount=-1 +kerning first=910 second=923 amount=-2 +kerning first=45 second=932 amount=-1 +kerning first=360 second=260 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=319 second=927 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=101 second=358 amount=-1 +kerning first=261 second=8217 amount=-1 +kerning first=8211 second=1035 amount=-1 +kerning first=958 second=955 amount=1 +kerning first=272 second=8230 amount=-1 +kerning first=931 second=67 amount=-1 +kerning first=932 second=195 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=1043 second=58 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=319 second=286 amount=-1 +kerning first=260 second=34 amount=-1 +kerning first=1168 second=1088 amount=-1 +kerning first=939 second=264 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=76 second=39 amount=-2 +kerning first=933 second=194 amount=-2 +kerning first=1113 second=1091 amount=-1 +kerning first=89 second=125 amount=1 +kerning first=372 second=41 amount=1 +kerning first=331 second=356 amount=-1 +kerning first=8216 second=265 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=84 second=312 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=933 second=59 amount=-1 +kerning first=932 second=345 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=319 second=8221 amount=-2 +kerning first=8221 second=281 amount=-1 +kerning first=317 second=372 amount=-1 +kerning first=932 second=8230 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=354 second=951 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=242 second=8221 amount=-1 +kerning first=8220 second=949 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=939 second=8211 amount=-1 +kerning first=46 second=8221 amount=-2 +kerning first=1058 second=1028 amount=-1 +kerning first=193 second=376 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=915 second=199 amount=-1 +kerning first=1168 second=44 amount=-1 +kerning first=1028 second=1095 amount=-1 +kerning first=8250 second=1026 amount=-1 +kerning first=221 second=932 amount=1 +kerning first=123 second=356 amount=1 +kerning first=1168 second=1032 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=8216 second=195 amount=-1 +kerning first=1098 second=8221 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=915 second=288 amount=-1 +kerning first=936 second=913 amount=-1 +kerning first=354 second=86 amount=1 +kerning first=173 second=1038 amount=-1 +kerning first=8220 second=84 amount=1 +kerning first=313 second=268 amount=-1 +kerning first=932 second=232 amount=-1 +kerning first=929 second=916 amount=-1 +kerning first=902 second=356 amount=-1 +kerning first=376 second=927 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=331 second=8217 amount=-1 +kerning first=8222 second=1063 amount=-1 +kerning first=319 second=354 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=376 second=192 amount=-1 +kerning first=936 second=258 amount=-1 +kerning first=242 second=354 amount=-1 +kerning first=1027 second=1044 amount=-1 +kerning first=932 second=97 amount=-1 +kerning first=1065 second=1112 amount=1 +kerning first=376 second=286 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=1059 second=1115 amount=1 +kerning first=306 second=125 amount=1 +kerning first=221 second=347 amount=-1 +kerning first=8217 second=913 amount=-1 +kerning first=356 second=312 amount=-1 +kerning first=8216 second=8230 amount=-2 +kerning first=218 second=196 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=358 second=380 amount=-1 +kerning first=8217 second=258 amount=-1 +kerning first=197 second=936 amount=-1 +kerning first=317 second=171 amount=-1 +kerning first=915 second=965 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=87 second=923 amount=-1 +kerning first=193 second=358 amount=-1 +kerning first=902 second=8217 amount=-1 +kerning first=271 second=104 amount=1 +kerning first=354 second=271 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=8220 second=265 amount=-1 +kerning first=8217 second=307 amount=-1 +kerning first=195 second=932 amount=-1 +kerning first=354 second=120 amount=-1 +kerning first=8212 second=354 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=84 second=962 amount=-1 +kerning first=326 second=84 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=8221 second=244 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=358 second=358 amount=1 +kerning first=8216 second=97 amount=-1 +kerning first=34 second=46 amount=-2 +kerning first=1043 second=1116 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=321 second=8249 amount=-1 +kerning first=916 second=356 amount=-1 +kerning first=84 second=372 amount=1 +kerning first=211 second=8230 amount=-1 +kerning first=354 second=932 amount=1 +kerning first=360 second=197 amount=-1 +kerning first=358 second=267 amount=-1 +kerning first=920 second=44 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=376 second=354 amount=1 +kerning first=315 second=213 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=358 second=119 amount=-1 +kerning first=8220 second=195 amount=-1 +kerning first=45 second=939 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=1044 second=1112 amount=1 +kerning first=923 second=87 amount=-1 +kerning first=1038 second=1115 amount=1 +kerning first=89 second=260 amount=-1 +kerning first=1026 second=1026 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=354 second=65 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=319 second=211 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=270 second=44 amount=-1 +kerning first=321 second=334 amount=-1 +kerning first=86 second=354 amount=1 +kerning first=1058 second=1097 amount=-1 +kerning first=271 second=314 amount=1 +kerning first=368 second=923 amount=-1 +kerning first=221 second=44 amount=-2 +kerning first=1043 second=1060 amount=-1 +kerning first=8230 second=8216 amount=-2 +kerning first=1168 second=1101 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=8221 second=260 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=373 second=8230 amount=-1 +kerning first=913 second=376 amount=-1 +kerning first=916 second=8217 amount=-1 +kerning first=197 second=372 amount=-1 +kerning first=259 second=356 amount=-1 +kerning first=89 second=8249 amount=-1 +kerning first=8220 second=8230 amount=-2 +kerning first=356 second=962 amount=-1 +kerning first=934 second=935 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=40 second=1066 amount=1 +kerning first=281 second=84 amount=-1 +kerning first=932 second=361 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=321 second=216 amount=-1 +kerning first=356 second=372 amount=1 +kerning first=354 second=966 amount=-1 +kerning first=329 second=8221 amount=-1 +kerning first=358 second=343 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=256 second=376 amount=-1 +kerning first=376 second=289 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=354 second=238 amount=-1 +kerning first=910 second=940 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=313 second=932 amount=-1 +kerning first=915 second=210 amount=-1 +kerning first=8211 second=356 amount=-1 +kerning first=243 second=932 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=34 second=198 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=932 second=973 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=8220 second=97 amount=-1 +kerning first=1040 second=1051 amount=1 +kerning first=317 second=927 amount=-1 +kerning first=932 second=251 amount=-1 +kerning first=332 second=8230 amount=-1 +kerning first=936 second=196 amount=-1 +kerning first=358 second=965 amount=-1 +kerning first=259 second=8217 amount=-1 +kerning first=8222 second=87 amount=-1 +kerning first=1058 second=8211 amount=-1 +kerning first=255 second=8230 amount=-1 +kerning first=929 second=195 amount=-1 +kerning first=358 second=237 amount=-1 +kerning first=372 second=226 amount=-1 +kerning first=923 second=933 amount=-2 +kerning first=194 second=356 amount=-1 +kerning first=329 second=354 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=933 second=942 amount=-1 +kerning first=1027 second=1057 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=104 second=932 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=356 second=256 amount=-1 +kerning first=317 second=286 amount=-1 +kerning first=932 second=110 amount=-1 +kerning first=913 second=358 amount=-1 +kerning first=258 second=34 amount=-1 +kerning first=1107 second=8230 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=39 second=46 amount=-2 +kerning first=87 second=281 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=1169 second=8211 amount=-1 +kerning first=87 second=125 amount=1 +kerning first=950 second=93 amount=1 +kerning first=8249 second=89 amount=-1 +kerning first=8250 second=376 amount=-1 +kerning first=8217 second=196 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=910 second=260 amount=-2 +kerning first=1034 second=8221 amount=-1 +kerning first=256 second=358 amount=-1 +kerning first=915 second=971 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=317 second=8221 amount=-2 +kerning first=321 second=284 amount=-1 +kerning first=376 second=371 amount=-1 +kerning first=1058 second=1076 amount=-2 +kerning first=929 second=8230 amount=-2 +kerning first=319 second=264 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=244 second=8221 amount=-1 +kerning first=955 second=8217 amount=-1 +kerning first=44 second=8221 amount=-2 +kerning first=1168 second=1080 amount=-1 +kerning first=915 second=173 amount=-1 +kerning first=354 second=299 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=1118 second=44 amount=-1 +kerning first=34 second=194 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=195 second=939 amount=-2 +kerning first=939 second=45 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=933 second=262 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=1043 second=8250 amount=-1 +kerning first=1169 second=1076 amount=-1 +kerning first=932 second=328 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=319 second=8211 amount=-1 +kerning first=261 second=932 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=8221 second=269 amount=-1 +kerning first=358 second=301 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=372 second=283 amount=-1 +kerning first=244 second=354 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=910 second=948 amount=-1 +kerning first=221 second=923 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1113 second=8217 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=8250 second=358 amount=-1 +kerning first=123 second=86 amount=1 +kerning first=932 second=954 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=910 second=334 amount=-1 +kerning first=932 second=228 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=8217 second=356 amount=1 +kerning first=8221 second=197 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=1058 second=1111 amount=-1 +kerning first=39 second=198 amount=-1 +kerning first=902 second=86 amount=-1 +kerning first=196 second=936 amount=-1 +kerning first=1027 second=1035 amount=1 +kerning first=321 second=8216 amount=-2 +kerning first=1168 second=1115 amount=1 +kerning first=87 second=244 amount=-1 +kerning first=319 second=87 amount=-1 +kerning first=85 second=923 amount=-1 +kerning first=354 second=373 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=293 second=356 amount=-1 +kerning first=939 second=79 amount=-1 +kerning first=933 second=332 amount=-1 +kerning first=192 second=932 amount=-1 +kerning first=910 second=216 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=328 second=84 amount=-1 +kerning first=8221 second=341 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=932 second=248 amount=-1 +kerning first=354 second=974 amount=-1 +kerning first=84 second=8221 amount=1 +kerning first=354 second=249 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=939 second=8212 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=376 second=8211 amount=-1 +kerning first=8217 second=8217 amount=-1 +kerning first=331 second=932 amount=-1 +kerning first=160 second=902 amount=-1 +kerning first=1168 second=1059 amount=1 +kerning first=313 second=213 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=8216 second=228 amount=-1 +kerning first=333 second=358 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=84 second=961 amount=-1 +kerning first=366 second=193 amount=-1 +kerning first=939 second=912 amount=-1 +kerning first=358 second=971 amount=-1 +kerning first=293 second=8217 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=356 second=192 amount=-1 +kerning first=8221 second=235 amount=-1 +kerning first=260 second=356 amount=-1 +kerning first=317 second=211 amount=-1 +kerning first=39 second=194 amount=-1 +kerning first=358 second=252 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=932 second=279 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=358 second=173 amount=-1 +kerning first=123 second=932 amount=1 +kerning first=84 second=354 amount=1 +kerning first=354 second=923 amount=-1 +kerning first=229 second=84 amount=-1 +kerning first=1034 second=1063 amount=-1 +kerning first=358 second=111 amount=-1 +kerning first=339 second=358 amount=-1 +kerning first=372 second=101 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=76 second=262 amount=-1 +kerning first=196 second=372 amount=-1 +kerning first=1028 second=1066 amount=1 +kerning first=902 second=932 amount=-1 +kerning first=910 second=197 amount=-2 +kerning first=8216 second=248 amount=-1 +kerning first=321 second=212 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=910 second=284 amount=-1 +kerning first=279 second=84 amount=-1 +kerning first=46 second=933 amount=-1 +kerning first=1068 second=1035 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=356 second=8221 amount=1 +kerning first=939 second=193 amount=-2 +kerning first=947 second=8230 amount=-1 +kerning first=235 second=358 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=295 second=8221 amount=-1 +kerning first=45 second=1059 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=1168 second=1093 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=933 second=199 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=939 second=58 amount=-1 +kerning first=969 second=39 amount=-1 +kerning first=74 second=93 amount=1 +kerning first=368 second=260 amount=-1 +kerning first=372 second=46 amount=-1 +kerning first=356 second=961 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=291 second=358 amount=-1 +kerning first=34 second=308 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=933 second=288 amount=-1 +kerning first=910 second=187 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=1043 second=8230 amount=-1 +kerning first=40 second=1058 amount=1 +kerning first=334 second=8230 amount=-1 +kerning first=97 second=358 amount=-1 +kerning first=221 second=125 amount=1 +kerning first=376 second=273 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=8216 second=1113 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=356 second=354 amount=1 +kerning first=76 second=376 amount=-1 +kerning first=295 second=354 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=957 second=44 amount=-1 +kerning first=1058 second=45 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=8212 second=933 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=8220 second=228 amount=-1 +kerning first=910 second=963 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=1168 second=1038 amount=1 +kerning first=76 second=85 amount=-1 +kerning first=932 second=969 amount=-1 +kerning first=1090 second=173 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=86 second=273 amount=-1 +kerning first=916 second=932 amount=-1 +kerning first=171 second=376 amount=-1 +kerning first=932 second=241 amount=-1 +kerning first=1169 second=45 amount=-1 +kerning first=306 second=41 amount=1 +kerning first=86 second=277 amount=-1 +kerning first=358 second=224 amount=-1 +kerning first=319 second=366 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=1168 second=8249 amount=-1 +kerning first=933 second=965 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=927 second=8230 amount=-1 +kerning first=317 second=264 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=241 second=8221 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=40 second=372 amount=1 +kerning first=87 second=269 amount=-1 +kerning first=8220 second=248 amount=-1 +kerning first=192 second=939 amount=-2 +kerning first=946 second=39 amount=-1 +kerning first=321 second=920 amount=-1 +kerning first=931 second=262 amount=-1 +kerning first=932 second=913 amount=-1 +kerning first=84 second=371 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=76 second=358 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=915 second=962 amount=-1 +kerning first=321 second=266 amount=-1 +kerning first=259 second=932 amount=-1 +kerning first=317 second=8211 amount=-1 +kerning first=358 second=339 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=372 second=198 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=45 second=1038 amount=-1 +kerning first=932 second=258 amount=-1 +kerning first=241 second=354 amount=-1 +kerning first=8216 second=969 amount=-1 +kerning first=1168 second=1072 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=319 second=45 amount=-1 +kerning first=1036 second=1033 amount=1 +kerning first=354 second=281 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=160 second=221 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=220 second=923 amount=-1 +kerning first=354 second=125 amount=1 +kerning first=315 second=8249 amount=-1 +kerning first=84 second=970 amount=-1 +kerning first=171 second=358 amount=-1 +kerning first=8204 second=8218 amount=-2 +kerning first=932 second=307 amount=-1 +kerning first=8220 second=1113 amount=-1 +kerning first=1058 second=8212 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=358 second=312 amount=-1 +kerning first=232 second=356 amount=-1 +kerning first=160 second=84 amount=-1 +kerning first=376 second=239 amount=1 +kerning first=1027 second=1083 amount=-1 +kerning first=8211 second=932 amount=-1 +kerning first=103 second=354 amount=-1 +kerning first=89 second=920 amount=-1 +kerning first=39 second=308 amount=-1 +kerning first=76 second=199 amount=-1 +kerning first=358 second=275 amount=-1 +kerning first=372 second=261 amount=-1 +kerning first=193 second=936 amount=-1 +kerning first=8221 second=109 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=76 second=288 amount=-1 +kerning first=8216 second=913 amount=-1 +kerning first=1169 second=8212 amount=-1 +kerning first=289 second=356 amount=-1 +kerning first=902 second=939 amount=-2 +kerning first=910 second=212 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=315 second=334 amount=-1 +kerning first=931 second=332 amount=-1 +kerning first=932 second=946 amount=-1 +kerning first=98 second=356 amount=-1 +kerning first=194 second=932 amount=-1 +kerning first=915 second=256 amount=-2 +kerning first=86 second=239 amount=1 +kerning first=356 second=371 amount=-1 +kerning first=65 second=933 amount=-2 +kerning first=102 second=44 amount=-1 +kerning first=8216 second=258 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=257 second=8221 amount=-1 +kerning first=111 second=84 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=372 second=194 amount=-1 +kerning first=8216 second=1035 amount=1 +kerning first=86 second=100 amount=-1 +kerning first=1168 second=1107 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=319 second=79 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=933 second=210 amount=-1 +kerning first=939 second=71 amount=-1 +kerning first=315 second=216 amount=-1 +kerning first=356 second=970 amount=-1 +kerning first=335 second=358 amount=-1 +kerning first=376 second=45 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=1057 second=1051 amount=1 +kerning first=362 second=193 amount=-1 +kerning first=8216 second=8220 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=1075 second=8211 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=257 second=354 amount=-1 +kerning first=319 second=8212 amount=-1 +kerning first=8221 second=324 amount=-1 +kerning first=98 second=8217 amount=-1 +kerning first=354 second=940 amount=-1 +kerning first=8220 second=969 amount=-1 +kerning first=372 second=337 amount=-1 +kerning first=1058 second=58 amount=-1 +kerning first=84 second=8211 amount=-1 +kerning first=915 second=947 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=910 second=972 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=228 second=84 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=310 second=74 amount=1 +kerning first=196 second=8221 amount=-1 +kerning first=193 second=372 amount=-1 +kerning first=1026 second=1066 amount=-1 +kerning first=916 second=939 amount=-1 +kerning first=939 second=941 amount=-1 +kerning first=932 second=382 amount=-1 +kerning first=358 second=962 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=87 second=41 amount=1 +kerning first=8217 second=271 amount=-1 +kerning first=1033 second=1059 amount=-1 +kerning first=277 second=84 amount=-1 +kerning first=358 second=243 amount=-1 +kerning first=44 second=933 amount=-1 +kerning first=372 second=231 amount=-1 +kerning first=1043 second=1099 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=1168 second=187 amount=-1 +kerning first=1066 second=1035 amount=-1 +kerning first=933 second=971 amount=-1 +kerning first=260 second=86 amount=-1 +kerning first=1075 second=1076 amount=-1 +kerning first=8230 second=39 amount=-2 +kerning first=233 second=358 amount=-1 +kerning first=271 second=322 amount=1 +kerning first=932 second=115 amount=-1 +kerning first=358 second=372 amount=1 +kerning first=936 second=65 amount=-1 +kerning first=8220 second=913 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=84 second=87 amount=1 +kerning first=933 second=173 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=358 second=103 amount=-1 +kerning first=372 second=93 amount=1 +kerning first=931 second=199 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=8249 second=356 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=910 second=920 amount=-1 +kerning first=1028 second=1058 amount=1 +kerning first=8217 second=932 amount=1 +kerning first=354 second=260 amount=-1 +kerning first=1114 second=8221 amount=-1 +kerning first=315 second=284 amount=-1 +kerning first=8220 second=258 amount=-1 +kerning first=931 second=288 amount=-1 +kerning first=287 second=358 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=70 second=46 amount=-2 +kerning first=939 second=916 amount=-2 +kerning first=910 second=266 amount=-1 +kerning first=1068 second=8217 amount=-1 +kerning first=932 second=196 amount=-1 +kerning first=8220 second=1035 amount=1 +kerning first=84 second=305 amount=-1 +kerning first=356 second=8211 amount=-1 +kerning first=293 second=932 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=1043 second=1044 amount=-1 +kerning first=376 second=8212 amount=-1 +kerning first=8217 second=65 amount=-1 +kerning first=321 second=67 amount=-1 +kerning first=913 second=936 amount=-1 +kerning first=1168 second=1085 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=358 second=256 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=8220 second=8220 amount=-1 +kerning first=1040 second=1090 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=8221 second=331 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=8216 second=115 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=932 second=333 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=8211 second=939 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=8221 second=283 amount=-1 +kerning first=256 second=936 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=354 second=948 amount=-1 +kerning first=76 second=210 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=356 second=87 amount=1 +kerning first=915 second=927 amount=-1 +kerning first=939 second=8250 amount=-1 +kerning first=358 second=171 amount=-1 +kerning first=910 second=953 amount=-1 +kerning first=951 second=8217 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=337 second=356 amount=-1 +kerning first=915 second=192 amount=-2 +kerning first=216 second=8230 amount=-1 +kerning first=260 second=932 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=8216 second=196 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=194 second=939 amount=-2 +kerning first=932 second=959 amount=-1 +kerning first=8217 second=238 amount=-1 +kerning first=915 second=286 amount=-1 +kerning first=171 second=910 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=315 second=8216 amount=-2 +kerning first=939 second=949 amount=-1 +kerning first=932 second=233 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=929 second=913 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1033 second=1038 amount=-1 +kerning first=321 second=360 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=932 second=356 amount=1 +kerning first=376 second=193 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=1168 second=1169 amount=-1 +kerning first=939 second=336 amount=-1 +kerning first=360 second=198 amount=-1 +kerning first=89 second=349 amount=-1 +kerning first=248 second=356 amount=-1 +kerning first=929 second=258 amount=-1 +kerning first=936 second=44 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=40 second=354 amount=1 +kerning first=70 second=198 amount=-1 +kerning first=376 second=58 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=218 second=923 amount=-1 +kerning first=913 second=372 amount=-1 +kerning first=313 second=8249 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=337 second=8217 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=8221 second=349 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=234 second=356 amount=-1 +kerning first=932 second=181 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=101 second=354 amount=-1 +kerning first=356 second=121 amount=-1 +kerning first=76 second=173 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=197 second=933 amount=-2 +kerning first=915 second=961 amount=-2 +kerning first=939 second=338 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=8217 second=44 amount=-2 +kerning first=8216 second=959 amount=-1 +kerning first=256 second=372 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=932 second=8217 amount=1 +kerning first=70 second=261 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=285 second=356 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=248 second=8217 amount=-1 +kerning first=313 second=334 amount=-1 +kerning first=366 second=195 amount=-1 +kerning first=8220 second=115 amount=-1 +kerning first=1091 second=44 amount=-1 +kerning first=8216 second=356 amount=1 +kerning first=84 second=239 amount=-1 +kerning first=8217 second=299 amount=-1 +kerning first=8221 second=236 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=372 second=242 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=932 second=291 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=8216 second=1083 amount=-1 +kerning first=321 second=39 amount=-2 +kerning first=109 second=84 amount=-1 +kerning first=923 second=221 amount=-1 +kerning first=360 second=194 amount=-1 +kerning first=358 second=263 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=8221 second=101 amount=-1 +kerning first=317 second=79 amount=-1 +kerning first=354 second=197 amount=-1 +kerning first=315 second=212 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=910 second=934 amount=-1 +kerning first=8220 second=196 amount=-1 +kerning first=931 second=210 amount=-1 +kerning first=8204 second=376 amount=-1 +kerning first=923 second=84 amount=-1 +kerning first=313 second=216 amount=-1 +kerning first=1057 second=1098 amount=-1 +kerning first=308 second=125 amount=1 +kerning first=321 second=218 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=89 second=46 amount=-2 +kerning first=364 second=193 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=910 second=67 amount=-1 +kerning first=939 second=195 amount=-2 +kerning first=317 second=8212 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=358 second=192 amount=-1 +kerning first=1043 second=1057 amount=-1 +kerning first=1075 second=45 amount=-1 +kerning first=221 second=41 amount=1 +kerning first=1168 second=1098 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=319 second=71 amount=-1 +kerning first=939 second=290 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=354 second=341 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=225 second=84 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=8221 second=46 amount=-2 +kerning first=354 second=187 amount=-1 +kerning first=230 second=358 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=102 second=125 amount=2 +kerning first=8216 second=291 amount=-1 +kerning first=356 second=239 amount=-1 +kerning first=91 second=1026 amount=1 +kerning first=932 second=363 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=8221 second=297 amount=-1 +kerning first=354 second=963 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=195 second=8216 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=8220 second=959 amount=-1 +kerning first=376 second=287 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=227 second=358 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=939 second=8230 amount=-2 +kerning first=358 second=8221 amount=1 +kerning first=910 second=968 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=8204 second=358 amount=-1 +kerning first=915 second=211 amount=-1 +kerning first=931 second=173 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=260 second=939 amount=-2 +kerning first=232 second=932 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=8220 second=356 amount=1 +kerning first=932 second=943 amount=-1 +kerning first=936 second=923 amount=-1 +kerning first=965 second=39 amount=-1 +kerning first=1026 second=1058 amount=-1 +kerning first=1059 second=46 amount=-2 +kerning first=313 second=284 amount=-1 +kerning first=8217 second=160 amount=-1 +kerning first=932 second=245 amount=-1 +kerning first=275 second=358 amount=-1 +kerning first=358 second=961 amount=-1 +kerning first=1058 second=8250 amount=-1 +kerning first=8220 second=1083 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=1066 second=8217 amount=-1 +kerning first=358 second=234 amount=-1 +kerning first=929 second=196 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=950 second=955 amount=1 +kerning first=8217 second=112 amount=-1 +kerning first=1027 second=1054 amount=-1 +kerning first=933 second=962 amount=-1 +kerning first=289 second=932 amount=-1 +kerning first=315 second=920 amount=-1 +kerning first=358 second=354 amount=1 +kerning first=98 second=932 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=968 second=34 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=376 second=71 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=8217 second=923 amount=-1 +kerning first=315 second=266 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=1075 second=8212 amount=-1 +kerning first=354 second=41 amount=1 +kerning first=356 second=303 amount=-1 +kerning first=84 second=8212 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=915 second=970 amount=-1 +kerning first=8221 second=198 amount=-1 +kerning first=910 second=46 amount=-2 +kerning first=1043 second=1035 amount=1 +kerning first=1168 second=1077 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=326 second=356 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=258 second=932 amount=-1 +kerning first=84 second=912 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=933 second=256 amount=-2 +kerning first=1038 second=46 amount=-2 +kerning first=84 second=253 amount=-1 +kerning first=313 second=8216 amount=-2 +kerning first=8217 second=326 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=160 second=89 amount=-1 +kerning first=372 second=358 amount=1 +kerning first=376 second=246 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=358 second=289 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=372 second=267 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=8221 second=114 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=910 second=945 amount=-1 +kerning first=934 second=44 amount=-1 +kerning first=221 second=920 amount=-1 +kerning first=91 second=106 amount=1 +kerning first=70 second=308 amount=-1 +kerning first=913 second=8221 amount=-1 +kerning first=91 second=1095 amount=-1 +kerning first=932 second=951 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=89 second=59 amount=-1 +kerning first=915 second=264 amount=-1 +kerning first=173 second=1026 amount=-1 +kerning first=8211 second=1059 amount=-1 +kerning first=319 second=221 amount=-1 +kerning first=1040 second=1026 amount=-1 +kerning first=326 second=8217 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=356 second=8212 amount=-1 +kerning first=8221 second=194 amount=-1 +kerning first=939 second=214 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=1027 second=44 amount=-1 +kerning first=319 second=336 amount=-1 +kerning first=8249 second=932 amount=-1 +kerning first=196 second=933 amount=-2 +kerning first=1027 second=1032 amount=-1 +kerning first=319 second=84 amount=-1 +kerning first=932 second=86 amount=1 +kerning first=354 second=367 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=242 second=84 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=358 second=74 amount=-1 +kerning first=1059 second=1103 amount=-1 +kerning first=356 second=912 amount=-1 +kerning first=915 second=8211 amount=-1 +kerning first=281 second=356 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=913 second=354 amount=-1 +kerning first=934 second=939 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=910 second=198 amount=-2 +kerning first=356 second=253 amount=-1 +kerning first=362 second=195 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=319 second=338 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=8221 second=337 amount=-1 +kerning first=932 second=230 amount=-1 +kerning first=358 second=371 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=354 second=972 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=910 second=944 amount=-1 +kerning first=76 second=372 amount=-1 +kerning first=8212 second=221 amount=-1 +kerning first=256 second=354 amount=-1 +kerning first=313 second=212 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=1059 second=59 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=89 second=93 amount=1 +kerning first=324 second=358 amount=-1 +kerning first=939 second=973 amount=-1 +kerning first=358 second=970 amount=-1 +kerning first=8212 second=84 amount=-1 +kerning first=1058 second=8230 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=356 second=193 amount=-1 +kerning first=904 second=912 amount=1 +kerning first=8217 second=281 amount=-1 +kerning first=8221 second=231 amount=-1 +kerning first=112 second=358 amount=-1 +kerning first=358 second=353 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=932 second=271 amount=-1 +kerning first=337 second=932 amount=-1 +kerning first=91 second=376 amount=1 +kerning first=932 second=120 amount=-1 +kerning first=376 second=336 amount=-1 +kerning first=317 second=71 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=376 second=84 amount=1 +kerning first=1169 second=8230 amount=-1 +kerning first=910 second=194 amount=-2 +kerning first=1057 second=1090 amount=-1 +kerning first=1038 second=1103 amount=-1 +kerning first=8216 second=230 amount=-1 +kerning first=932 second=932 amount=1 +kerning first=187 second=89 amount=-1 +kerning first=8211 second=1038 amount=-1 +kerning first=315 second=67 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=248 second=932 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=935 second=970 amount=1 +kerning first=910 second=59 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=319 second=290 amount=-1 +kerning first=192 second=8216 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=933 second=927 amount=-1 +kerning first=908 second=8230 amount=-1 +kerning first=224 second=358 amount=-1 +kerning first=86 second=84 amount=1 +kerning first=1168 second=1090 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=932 second=65 amount=-1 +kerning first=89 second=285 amount=-1 +kerning first=76 second=171 amount=-1 +kerning first=933 second=192 amount=-2 +kerning first=258 second=939 amount=-2 +kerning first=1040 second=1095 amount=-1 +kerning first=234 second=932 amount=-1 +kerning first=306 second=93 amount=1 +kerning first=8216 second=271 amount=-1 +kerning first=933 second=286 amount=-1 +kerning first=1038 second=59 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=283 second=358 amount=-1 +kerning first=333 second=8221 amount=-1 +kerning first=932 second=347 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=917 second=912 amount=1 +kerning first=84 second=287 amount=-1 +kerning first=8221 second=285 amount=-1 +kerning first=91 second=358 amount=1 +kerning first=354 second=953 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=372 second=301 amount=1 +kerning first=285 second=932 amount=-1 +kerning first=376 second=265 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=358 second=8211 amount=-1 +kerning first=313 second=920 amount=-1 +kerning first=1168 second=46 amount=-1 +kerning first=8216 second=932 amount=1 +kerning first=87 second=198 amount=-1 +kerning first=89 second=308 amount=-1 +kerning first=315 second=360 amount=-1 +kerning first=932 second=966 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=1059 second=1026 amount=1 +kerning first=313 second=266 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=939 second=954 amount=-1 +kerning first=932 second=238 amount=-1 +kerning first=333 second=354 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=86 second=265 amount=-1 +kerning first=358 second=225 amount=-1 +kerning first=8216 second=65 amount=-1 +kerning first=319 second=368 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=902 second=8216 amount=-1 +kerning first=376 second=195 amount=-1 +kerning first=8249 second=939 amount=-1 +kerning first=936 second=260 amount=-1 +kerning first=933 second=961 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=8221 second=308 amount=-1 +kerning first=932 second=99 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=1041 second=1035 amount=-1 +kerning first=329 second=84 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=358 second=87 amount=1 +kerning first=87 second=261 amount=-1 +kerning first=8220 second=230 amount=-1 +kerning first=328 second=356 amount=-1 +kerning first=8216 second=347 amount=-1 +kerning first=221 second=349 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=160 second=8220 amount=-1 +kerning first=339 second=354 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=173 second=376 amount=-1 +kerning first=8217 second=260 amount=-1 +kerning first=321 second=262 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=358 second=305 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=376 second=8230 amount=-2 +kerning first=8216 second=966 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=932 second=44 amount=-1 +kerning first=235 second=354 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=315 second=39 amount=-2 +kerning first=84 second=941 amount=-1 +kerning first=102 second=8216 amount=1 +kerning first=34 second=256 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=8221 second=242 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1038 second=1026 amount=1 +kerning first=1090 second=8211 amount=-1 +kerning first=328 second=8217 amount=-1 +kerning first=358 second=273 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=932 second=299 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=76 second=927 amount=-1 +kerning first=291 second=354 amount=-1 +kerning first=308 second=41 amount=1 +kerning first=86 second=8230 amount=-1 +kerning first=229 second=356 amount=-1 +kerning first=317 second=336 amount=-1 +kerning first=354 second=934 amount=-1 +kerning first=358 second=277 amount=-1 +kerning first=8220 second=932 amount=1 +kerning first=97 second=354 amount=-1 +kerning first=920 second=46 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=193 second=933 amount=-2 +kerning first=317 second=84 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=358 second=121 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=942 second=8221 amount=-1 +kerning first=372 second=111 amount=-1 +kerning first=244 second=84 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=1111 second=1115 amount=1 +kerning first=923 second=89 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=279 second=356 amount=-1 +kerning first=321 second=376 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=364 second=195 amount=-1 +kerning first=8220 second=65 amount=-1 +kerning first=319 second=214 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=84 second=916 amount=-1 +kerning first=173 second=358 amount=-1 +kerning first=102 second=41 amount=2 +kerning first=915 second=45 amount=-1 +kerning first=317 second=338 amount=-1 +kerning first=321 second=332 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=8216 second=44 amount=-2 +kerning first=271 second=316 amount=1 +kerning first=221 second=46 amount=-2 +kerning first=1090 second=1076 amount=-1 +kerning first=8216 second=1032 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=1168 second=1103 amount=-1 +kerning first=354 second=349 amount=-1 +kerning first=76 second=8221 amount=-2 +kerning first=933 second=211 amount=-1 +kerning first=8220 second=347 amount=-1 +kerning first=229 second=8217 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=356 second=941 amount=-1 +kerning first=923 second=34 amount=-1 +kerning first=87 second=93 amount=1 +kerning first=356 second=246 amount=-1 +kerning first=913 second=87 amount=-1 +kerning first=1056 second=8230 amount=-2 +kerning first=932 second=373 amount=-1 +kerning first=1027 second=1115 amount=1 +kerning first=110 second=358 amount=-1 +kerning first=354 second=968 amount=-1 +kerning first=358 second=351 amount=-1 +kerning first=8220 second=966 amount=-1 +kerning first=326 second=932 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=354 second=236 amount=-1 +kerning first=1058 second=1044 amount=-1 +kerning first=910 second=942 amount=-1 +kerning first=1168 second=59 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=366 second=913 amount=-1 +kerning first=932 second=974 amount=-1 +kerning first=256 second=87 amount=-1 +kerning first=1026 second=1063 amount=-1 +kerning first=321 second=358 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=356 second=916 amount=-1 +kerning first=84 second=949 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=932 second=249 amount=-1 +kerning first=915 second=79 amount=-1 +kerning first=936 second=197 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=313 second=67 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=922 second=308 amount=1 +kerning first=358 second=239 amount=-1 +kerning first=366 second=258 amount=-1 +kerning first=372 second=224 amount=-1 +kerning first=932 second=259 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=171 second=354 amount=-1 +kerning first=933 second=970 amount=-1 +kerning first=1027 second=1059 amount=1 +kerning first=1043 second=1096 amount=-1 +kerning first=317 second=290 amount=-1 +kerning first=194 second=8216 amount=-1 +kerning first=932 second=112 amount=-1 +kerning first=39 second=256 amount=-1 +kerning first=931 second=927 amount=-1 +kerning first=84 second=84 amount=1 +kerning first=226 second=358 amount=-1 +kerning first=358 second=100 amount=-1 +kerning first=929 second=65 amount=-1 +kerning first=915 second=8212 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=373 second=44 amount=-1 +kerning first=160 second=8222 amount=-2 +kerning first=931 second=286 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=91 second=1066 amount=1 +kerning first=932 second=923 amount=-1 +kerning first=8217 second=197 amount=-1 +kerning first=321 second=199 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=910 second=262 amount=-1 +kerning first=8220 second=44 amount=-2 +kerning first=939 second=913 amount=-2 +kerning first=335 second=8221 amount=-1 +kerning first=195 second=39 amount=-1 +kerning first=8220 second=1032 amount=-1 +kerning first=915 second=912 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=321 second=288 amount=-1 +kerning first=89 second=358 amount=1 +kerning first=1058 second=1078 amount=-1 +kerning first=372 second=339 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=281 second=932 amount=-1 +kerning first=8216 second=974 amount=-1 +kerning first=913 second=933 amount=-2 +kerning first=1168 second=1082 amount=-1 +kerning first=939 second=258 amount=-2 +kerning first=354 second=297 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=1118 second=46 amount=-1 +kerning first=34 second=192 amount=-1 +kerning first=1050 second=1033 amount=1 +kerning first=85 second=198 amount=-1 +kerning first=358 second=45 amount=-1 +kerning first=313 second=360 amount=-1 +kerning first=931 second=8221 amount=-1 +kerning first=356 second=949 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=8216 second=259 amount=-1 +kerning first=933 second=264 amount=-1 +kerning first=160 second=356 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=8217 second=341 amount=-1 +kerning first=8221 second=358 amount=1 +kerning first=1057 second=1026 amount=1 +kerning first=1100 second=1091 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=932 second=326 amount=-1 +kerning first=335 second=354 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=84 second=265 amount=-1 +kerning first=256 second=933 amount=-2 +kerning first=8221 second=267 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=354 second=945 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=358 second=303 amount=-1 +kerning first=217 second=195 amount=-1 +kerning first=372 second=275 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=356 second=84 amount=1 +kerning first=89 second=199 amount=-1 +kerning first=295 second=84 amount=-1 +kerning first=8216 second=923 amount=-1 +kerning first=915 second=193 amount=-2 +kerning first=1168 second=1026 amount=1 +kerning first=89 second=288 amount=-1 +kerning first=933 second=8211 amount=-1 +kerning first=221 second=194 amount=-1 +kerning first=8204 second=372 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=910 second=332 amount=-1 +kerning first=1107 second=44 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=939 second=946 amount=-1 +kerning first=111 second=356 amount=-1 +kerning first=932 second=229 amount=-1 +kerning first=915 second=58 amount=-1 +kerning first=1068 second=1059 amount=-1 +kerning first=84 second=195 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=221 second=59 amount=-1 +kerning first=1027 second=1038 amount=1 +kerning first=34 second=961 amount=-1 +kerning first=1168 second=1118 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=319 second=89 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=354 second=198 amount=-1 +kerning first=939 second=81 amount=-1 +kerning first=929 second=44 amount=-2 +kerning first=233 second=354 amount=-1 +kerning first=1059 second=1109 amount=-1 +kerning first=1028 second=1033 amount=1 +kerning first=221 second=337 amount=-1 +kerning first=313 second=39 amount=-2 +kerning first=1027 second=8249 amount=-1 +kerning first=1075 second=8230 amount=-1 +kerning first=173 second=910 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=356 second=265 amount=-1 +kerning first=8221 second=343 amount=-1 +kerning first=1035 second=1026 amount=-1 +kerning first=354 second=944 amount=-1 +kerning first=8220 second=974 amount=-1 +kerning first=287 second=354 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=84 second=8230 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=111 second=8217 amount=-1 +kerning first=228 second=356 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=915 second=957 amount=-1 +kerning first=1058 second=1057 amount=-1 +kerning first=358 second=8212 amount=-1 +kerning first=70 second=252 amount=-1 +kerning first=1090 second=45 amount=-1 +kerning first=45 second=1026 amount=-1 +kerning first=923 second=8220 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=319 second=34 amount=-2 +kerning first=271 second=98 amount=1 +kerning first=354 second=261 amount=-1 +kerning first=241 second=84 amount=-1 +kerning first=8216 second=229 amount=-1 +kerning first=8220 second=259 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=173 second=1066 amount=-1 +kerning first=46 second=34 amount=-2 +kerning first=354 second=114 amount=-1 +kerning first=1040 second=1066 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=277 second=356 amount=-1 +kerning first=358 second=912 amount=-1 +kerning first=8212 second=89 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=8221 second=237 amount=-1 +kerning first=356 second=195 amount=-1 +kerning first=317 second=214 amount=-1 +kerning first=39 second=192 amount=-1 +kerning first=358 second=253 amount=-1 +kerning first=372 second=243 amount=-1 +kerning first=932 second=281 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=221 second=93 amount=1 +kerning first=260 second=8216 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=932 second=125 amount=1 +kerning first=358 second=257 amount=-1 +kerning first=8220 second=923 amount=-1 +kerning first=103 second=84 amount=-1 +kerning first=245 second=358 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=354 second=194 amount=-1 +kerning first=358 second=113 amount=-1 +kerning first=931 second=211 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=228 second=8217 amount=-1 +kerning first=910 second=199 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=1038 second=1109 amount=-1 +kerning first=321 second=210 amount=-1 +kerning first=86 second=228 amount=-1 +kerning first=910 second=288 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=1068 second=1038 amount=-1 +kerning first=935 second=912 amount=1 +kerning first=356 second=8230 amount=-1 +kerning first=939 second=196 amount=-2 +kerning first=1058 second=1091 amount=-1 +kerning first=358 second=193 amount=-1 +kerning first=1043 second=1054 amount=-1 +kerning first=328 second=932 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=1168 second=1095 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=76 second=8211 amount=-1 +kerning first=372 second=256 amount=-1 +kerning first=1113 second=1098 amount=-1 diff --git a/art/font/myriad-medium-big.png b/art/font/myriad-medium-big.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7df5c315066a7a54655b86f4ea05daa1a71efa GIT binary patch literal 31706 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 literal 0 HcmV?d00001 diff --git a/art/font/myriad-medium-small.fnt b/art/font/myriad-medium-small.fnt new file mode 100644 index 00000000..7c582e6b --- /dev/null +++ b/art/font/myriad-medium-small.fnt @@ -0,0 +1,3178 @@ +info face="MyriadPro-Regular" size=12 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=15 base=9 scaleW=128 scaleH=512 pages=1 packed=0 +page id=0 file="myriad-medium-small.png" +chars count=506 +char id=0 x=72 y=121 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=33 x=80 y=121 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=34 x=93 y=349 width=6 height=5 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=35 x=117 y=276 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=36 x=8 y=42 width=8 height=13 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=37 x=0 y=287 width=12 height=10 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=38 x=85 y=121 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=39 x=123 y=254 width=4 height=5 xoffset=-1 yoffset=0 xadvance=2 page=0 chnl=0 +char id=40 x=91 y=108 width=6 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=41 x=97 y=108 width=5 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=42 x=0 y=349 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=43 x=78 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=44 x=38 y=349 width=5 height=6 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=45 x=64 y=356 width=6 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=46 x=11 y=356 width=5 height=4 xoffset=-1 yoffset=6 xadvance=2 page=0 chnl=0 +char id=47 x=95 y=121 width=8 height=11 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=48 x=12 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=49 x=20 y=287 width=5 height=10 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=50 x=25 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=51 x=33 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=52 x=41 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=53 x=49 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=54 x=57 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=55 x=65 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=56 x=73 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=57 x=103 y=121 width=8 height=11 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=58 x=122 y=297 width=5 height=8 xoffset=-1 yoffset=2 xadvance=2 page=0 chnl=0 +char id=59 x=111 y=121 width=5 height=11 xoffset=-1 yoffset=2 xadvance=2 page=0 chnl=0 +char id=60 x=87 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=61 x=99 y=349 width=9 height=5 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=62 x=96 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=63 x=116 y=121 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=64 x=81 y=287 width=11 height=10 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=65 x=0 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=66 x=10 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=67 x=18 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=68 x=27 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=69 x=37 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=70 x=45 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=71 x=53 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=72 x=63 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=73 x=123 y=121 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=74 x=72 y=133 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=75 x=78 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=76 x=87 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=77 x=95 y=133 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=78 x=106 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=79 x=115 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=80 x=0 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=81 x=16 y=42 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=82 x=8 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=83 x=17 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=84 x=25 y=144 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=85 x=34 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=86 x=43 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=87 x=52 y=144 width=13 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=88 x=65 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=89 x=74 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=90 x=83 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=91 x=26 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=92 x=92 y=144 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=93 x=122 y=28 width=5 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=94 x=0 y=317 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=95 x=70 y=356 width=8 height=3 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=96 x=16 y=356 width=5 height=4 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=97 x=9 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=98 x=99 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=99 x=17 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=100 x=108 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=101 x=25 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=102 x=116 y=144 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=103 x=0 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=104 x=8 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=105 x=122 y=144 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=106 x=0 y=0 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=107 x=16 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=108 x=123 y=82 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=109 x=33 y=317 width=12 height=8 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=110 x=45 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=111 x=53 y=317 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=112 x=24 y=155 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=113 x=33 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=114 x=62 y=317 width=6 height=8 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=115 x=68 y=317 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=116 x=92 y=287 width=6 height=10 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=117 x=75 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=118 x=83 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=119 x=91 y=317 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=120 x=102 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=121 x=41 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=122 x=110 y=317 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=123 x=32 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=124 x=6 y=0 width=3 height=14 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=125 x=38 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=126 x=108 y=349 width=9 height=5 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=161 x=49 y=155 width=5 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=162 x=102 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=163 x=98 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=164 x=106 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=165 x=114 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=166 x=44 y=42 width=3 height=13 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=167 x=110 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=168 x=21 y=356 width=6 height=4 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=169 x=0 y=297 width=10 height=10 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=170 x=43 y=349 width=6 height=6 xoffset=-1 yoffset=1 xadvance=4 page=0 chnl=0 +char id=171 x=7 y=349 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=172 x=49 y=349 width=9 height=6 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=173 x=78 y=356 width=6 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=174 x=14 y=349 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=175 x=84 y=356 width=6 height=3 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=176 x=58 y=349 width=6 height=6 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=177 x=10 y=297 width=9 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=178 x=121 y=325 width=6 height=7 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=179 x=117 y=317 width=6 height=8 xoffset=-1 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=180 x=27 y=356 width=5 height=4 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=181 x=54 y=155 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=182 x=118 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=183 x=32 y=356 width=4 height=4 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=184 x=117 y=349 width=5 height=5 xoffset=-1 yoffset=8 xadvance=4 page=0 chnl=0 +char id=185 x=121 y=341 width=5 height=7 xoffset=-1 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=186 x=64 y=349 width=7 height=6 xoffset=-1 yoffset=1 xadvance=4 page=0 chnl=0 +char id=187 x=21 y=349 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=188 x=19 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=189 x=30 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=190 x=41 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=191 x=63 y=155 width=7 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=192 x=47 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=193 x=57 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=194 x=67 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=195 x=9 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=196 x=77 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=197 x=19 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=198 x=70 y=155 width=13 height=11 xoffset=-2 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=199 x=29 y=0 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=200 x=87 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=201 x=95 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=202 x=103 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=203 x=111 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=204 x=119 y=42 width=6 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=205 x=0 y=56 width=6 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=206 x=6 y=56 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=207 x=13 y=56 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=208 x=83 y=155 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=209 x=38 y=0 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=210 x=20 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=211 x=30 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=212 x=40 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=213 x=47 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=214 x=50 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=215 x=105 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=216 x=0 y=121 width=10 height=12 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=217 x=60 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=218 x=69 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=219 x=78 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=220 x=87 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=221 x=96 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=222 x=94 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=223 x=102 y=155 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=224 x=111 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=225 x=119 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=226 x=0 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=227 x=8 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=228 x=16 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=229 x=24 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=230 x=0 y=325 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=231 x=32 y=166 width=8 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=232 x=40 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=233 x=48 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=234 x=56 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=235 x=64 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=236 x=72 y=166 width=5 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=237 x=77 y=166 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=238 x=83 y=166 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=239 x=89 y=166 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=240 x=96 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=241 x=104 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=242 x=112 y=166 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=243 x=0 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=244 x=9 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=245 x=18 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=246 x=27 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=247 x=11 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=248 x=52 y=297 width=9 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=249 x=36 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=250 x=44 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=251 x=52 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=252 x=60 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=253 x=57 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=254 x=65 y=0 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=255 x=74 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=256 x=105 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=257 x=61 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=258 x=82 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=259 x=68 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=260 x=92 y=0 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=261 x=76 y=177 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=262 x=115 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=263 x=84 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=264 x=0 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=265 x=92 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=266 x=9 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=267 x=100 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=268 x=18 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=269 x=108 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=270 x=27 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=271 x=116 y=177 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=272 x=0 y=188 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=273 x=11 y=188 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=274 x=37 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=275 x=69 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=276 x=102 y=0 width=8 height=14 xoffset=-1 yoffset=-4 xadvance=6 page=0 chnl=0 +char id=277 x=20 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=278 x=45 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=279 x=28 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=280 x=110 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=281 x=36 y=188 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=282 x=53 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=283 x=44 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=284 x=61 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=285 x=118 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=286 x=0 y=14 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=287 x=10 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=288 x=71 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=289 x=18 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=290 x=26 y=14 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=291 x=36 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=292 x=81 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=293 x=90 y=69 width=9 height=13 xoffset=-2 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=294 x=52 y=188 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=295 x=62 y=188 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=296 x=44 y=14 width=6 height=14 xoffset=-2 yoffset=-4 xadvance=3 page=0 chnl=0 +char id=297 x=121 y=166 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=298 x=99 y=69 width=5 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=299 x=122 y=287 width=5 height=10 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=300 x=50 y=14 width=6 height=14 xoffset=-2 yoffset=-4 xadvance=3 page=0 chnl=0 +char id=301 x=71 y=188 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=302 x=56 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=303 x=61 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=304 x=104 y=69 width=5 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=305 x=123 y=317 width=4 height=8 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=306 x=77 y=188 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=307 x=66 y=14 width=7 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=308 x=109 y=69 width=7 height=13 xoffset=-1 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=309 x=73 y=14 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=310 x=79 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=311 x=88 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=312 x=20 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=313 x=116 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=314 x=0 y=82 width=6 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=315 x=96 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=316 x=104 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=317 x=86 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=318 x=94 y=188 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=319 x=100 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=320 x=108 y=188 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=321 x=114 y=188 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=322 x=0 y=199 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=323 x=6 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=324 x=5 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=325 x=109 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=326 x=13 y=199 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=327 x=15 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=328 x=21 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=329 x=29 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=330 x=118 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=331 x=37 y=199 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=332 x=24 y=82 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=333 x=77 y=297 width=9 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=334 x=0 y=28 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=335 x=45 y=199 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=336 x=34 y=82 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=337 x=54 y=199 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=338 x=44 y=82 width=13 height=13 xoffset=-1 yoffset=-2 xadvance=11 page=0 chnl=0 +char id=339 x=28 y=325 width=12 height=8 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=340 x=57 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=341 x=63 y=199 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=342 x=10 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=343 x=69 y=199 width=6 height=11 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=344 x=66 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=345 x=75 y=199 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=346 x=75 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=347 x=81 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=348 x=83 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=349 x=88 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=350 x=19 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=351 x=95 y=199 width=7 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=352 x=91 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=353 x=102 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=354 x=27 y=28 width=9 height=14 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=355 x=99 y=82 width=6 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=356 x=105 y=82 width=9 height=13 xoffset=-2 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=357 x=109 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=358 x=116 y=199 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=359 x=86 y=297 width=6 height=10 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=360 x=36 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=361 x=0 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=362 x=114 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=363 x=92 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=364 x=45 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=365 x=8 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=366 x=54 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=367 x=16 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=368 x=0 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=369 x=24 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=370 x=63 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=371 x=32 y=210 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=372 x=9 y=95 width=13 height=13 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=373 x=41 y=210 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=374 x=22 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=375 x=72 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=376 x=31 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=377 x=40 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=378 x=52 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=379 x=49 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=380 x=59 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=381 x=58 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=382 x=66 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=894 x=73 y=210 width=5 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=900 x=36 y=356 width=4 height=4 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=901 x=40 y=356 width=7 height=4 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=902 x=78 y=210 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=903 x=47 y=356 width=5 height=4 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=904 x=88 y=210 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=905 x=97 y=210 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=906 x=107 y=210 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=908 x=112 y=210 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=910 x=0 y=221 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=911 x=11 y=221 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=912 x=22 y=221 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=913 x=29 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=914 x=39 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=915 x=47 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=916 x=55 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=917 x=65 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=918 x=73 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=919 x=82 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=920 x=91 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=921 x=123 y=188 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=922 x=101 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=923 x=110 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=924 x=0 y=232 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=925 x=11 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=926 x=20 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=927 x=29 y=232 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=928 x=39 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=929 x=48 y=232 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=931 x=56 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=932 x=65 y=232 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=933 x=74 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=934 x=10 y=121 width=11 height=12 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=935 x=83 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=936 x=92 y=232 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=937 x=102 y=232 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=938 x=67 y=95 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=939 x=74 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=940 x=113 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=941 x=0 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=942 x=80 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=943 x=120 y=221 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=944 x=8 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=945 x=40 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=946 x=88 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=947 x=16 y=243 width=9 height=11 xoffset=-2 yoffset=2 xadvance=6 page=0 chnl=0 +char id=948 x=25 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=949 x=49 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=950 x=83 y=95 width=7 height=13 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=951 x=34 y=243 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=952 x=42 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=953 x=57 y=325 width=5 height=8 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=954 x=62 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=955 x=50 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=956 x=58 y=243 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=957 x=70 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=958 x=90 y=95 width=8 height=13 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=959 x=78 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=960 x=87 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=961 x=67 y=243 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=962 x=100 y=297 width=7 height=10 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=963 x=96 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=964 x=105 y=325 width=8 height=8 xoffset=-2 yoffset=2 xadvance=5 page=0 chnl=0 +char id=965 x=113 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=966 x=21 y=121 width=10 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=967 x=76 y=243 width=8 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=968 x=98 y=95 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=969 x=0 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=970 x=107 y=297 width=7 height=10 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=971 x=114 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=972 x=84 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=973 x=93 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=974 x=101 y=243 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1025 x=108 y=95 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=1026 x=116 y=95 width=11 height=13 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1027 x=0 y=108 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=1028 x=111 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1029 x=0 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1030 x=123 y=210 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1031 x=8 y=108 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=1032 x=120 y=243 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=1033 x=31 y=121 width=14 height=12 xoffset=-2 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=1034 x=8 y=254 width=13 height=11 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=1035 x=21 y=254 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1036 x=15 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=1038 x=24 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=1039 x=97 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1040 x=32 y=254 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1041 x=42 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1042 x=51 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1043 x=59 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=1044 x=33 y=108 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1045 x=67 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1046 x=75 y=254 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1047 x=87 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1048 x=95 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1049 x=43 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1050 x=104 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1051 x=113 y=254 width=10 height=11 xoffset=-2 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1052 x=0 y=265 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1053 x=11 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1054 x=20 y=265 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1055 x=30 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1056 x=39 y=265 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1057 x=47 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1058 x=56 y=265 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1059 x=65 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1060 x=45 y=121 width=11 height=12 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1061 x=74 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1062 x=52 y=108 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1063 x=83 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1064 x=92 y=265 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1065 x=62 y=108 width=12 height=13 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1066 x=104 y=265 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1067 x=115 y=265 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1068 x=0 y=276 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1069 x=9 y=276 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1070 x=18 y=276 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1071 x=30 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1072 x=10 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1073 x=38 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1074 x=18 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1075 x=26 y=333 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1076 x=0 y=307 width=8 height=10 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1077 x=33 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1078 x=41 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1079 x=51 y=333 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1080 x=58 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1081 x=46 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1082 x=66 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1083 x=74 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1084 x=82 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1085 x=92 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1086 x=100 y=333 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1087 x=109 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1088 x=54 y=276 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1089 x=117 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1090 x=0 y=341 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1091 x=63 y=276 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1092 x=106 y=28 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1093 x=7 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1094 x=8 y=307 width=9 height=10 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1095 x=15 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1096 x=23 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1097 x=17 y=307 width=11 height=10 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1098 x=33 y=341 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1099 x=42 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1100 x=52 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1101 x=60 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1102 x=68 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1103 x=78 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1105 x=71 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1106 x=74 y=108 width=9 height=13 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1107 x=79 y=276 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=1108 x=86 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1109 x=94 y=341 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1110 x=122 y=232 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1111 x=86 y=276 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1112 x=116 y=28 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1113 x=114 y=307 width=11 height=9 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1114 x=101 y=341 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1115 x=93 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1116 x=101 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1118 x=0 y=42 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1119 x=28 y=307 width=8 height=10 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1168 x=83 y=108 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=1169 x=36 y=307 width=7 height=10 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1241 x=112 y=341 width=9 height=8 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8211 x=90 y=356 width=8 height=3 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=8212 x=98 y=356 width=14 height=3 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8216 x=71 y=349 width=5 height=6 xoffset=-1 yoffset=-2 xadvance=2 page=0 chnl=0 +char id=8217 x=76 y=349 width=5 height=6 xoffset=-1 yoffset=-2 xadvance=2 page=0 chnl=0 +char id=8218 x=122 y=349 width=5 height=5 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=8220 x=81 y=349 width=6 height=6 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=8221 x=87 y=349 width=6 height=6 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=8222 x=0 y=356 width=6 height=5 xoffset=-1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=8224 x=56 y=121 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8225 x=64 y=121 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8226 x=6 y=356 width=5 height=5 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=8230 x=52 y=356 width=12 height=4 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0 +char id=8240 x=43 y=307 width=16 height=10 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8249 x=28 y=349 width=5 height=7 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=8250 x=33 y=349 width=5 height=7 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=8260 x=59 y=307 width=11 height=10 xoffset=-3 yoffset=0 xadvance=1 page=0 chnl=0 +char id=8363 x=109 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8364 x=70 y=307 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +kernings count=2667 +kerning first=8216 second=281 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=39 second=961 amount=-1 +kerning first=34 second=74 amount=-1 +kerning first=8218 second=376 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=358 second=335 amount=-1 +kerning first=957 second=46 amount=-1 +kerning first=257 second=84 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=8216 second=937 amount=-1 +kerning first=1168 second=1040 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=932 second=940 amount=-1 +kerning first=354 second=93 amount=1 +kerning first=229 second=932 amount=-1 +kerning first=939 second=959 amount=-1 +kerning first=321 second=173 amount=-1 +kerning first=929 second=923 amount=-1 +kerning first=932 second=244 amount=-1 +kerning first=221 second=308 amount=-1 +kerning first=358 second=227 amount=-1 +kerning first=192 second=39 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=947 second=44 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=1027 second=187 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=8218 second=358 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=915 second=941 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=1043 second=1032 amount=-1 +kerning first=1043 second=44 amount=-1 +kerning first=932 second=260 amount=-1 +kerning first=89 second=173 amount=-1 +kerning first=8216 second=940 amount=-1 +kerning first=1168 second=1074 amount=-1 +kerning first=354 second=285 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=65 second=34 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=1059 second=1066 amount=1 +kerning first=84 second=251 amount=-1 +kerning first=109 second=356 amount=-1 +kerning first=933 second=45 amount=-1 +kerning first=1066 second=1059 amount=-1 +kerning first=902 second=39 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=319 second=8220 amount=-1 +kerning first=932 second=8249 amount=-1 +kerning first=358 second=287 amount=-1 +kerning first=8220 second=937 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=315 second=376 amount=-1 +kerning first=923 second=356 amount=-1 +kerning first=39 second=74 amount=-1 +kerning first=91 second=372 amount=1 +kerning first=8221 second=111 amount=-1 +kerning first=915 second=916 amount=-1 +kerning first=45 second=376 amount=-1 +kerning first=227 second=354 amount=-1 +kerning first=354 second=308 amount=-1 +kerning first=171 second=933 amount=-1 +kerning first=932 second=948 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=8216 second=260 amount=-1 +kerning first=1100 second=8217 amount=-1 +kerning first=376 second=913 amount=-1 +kerning first=1033 second=1026 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=372 second=192 amount=-1 +kerning first=225 second=356 amount=-1 +kerning first=354 second=369 amount=-1 +kerning first=376 second=258 amount=-1 +kerning first=317 second=34 amount=-1 +kerning first=915 second=8250 amount=-1 +kerning first=102 second=39 amount=1 +kerning first=40 second=84 amount=1 +kerning first=923 second=8217 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=44 second=34 amount=-1 +kerning first=86 second=913 amount=-1 +kerning first=1038 second=1066 amount=1 +kerning first=1027 second=1169 amount=-1 +kerning first=80 second=916 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=358 second=365 amount=-1 +kerning first=8220 second=940 amount=-1 +kerning first=916 second=39 amount=-1 +kerning first=258 second=8216 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=915 second=949 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=315 second=358 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=8216 second=948 amount=-1 +kerning first=45 second=358 amount=-1 +kerning first=933 second=8212 amount=-1 +kerning first=910 second=173 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=971 second=39 amount=-1 +kerning first=358 second=941 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=358 second=246 amount=-1 +kerning first=932 second=269 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=933 second=912 amount=1 +kerning first=1066 second=1038 amount=-1 +kerning first=932 second=117 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=358 second=105 amount=-1 +kerning first=87 second=301 amount=1 +kerning first=944 second=34 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=343 second=8230 amount=-1 +kerning first=8220 second=260 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=932 second=197 amount=-1 +kerning first=358 second=916 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=8221 second=339 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=1168 second=1087 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=933 second=193 amount=-1 +kerning first=1113 second=1090 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=195 second=376 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=8217 second=349 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=228 second=932 amount=-1 +kerning first=955 second=39 amount=-1 +kerning first=932 second=341 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=194 second=39 amount=-1 +kerning first=8221 second=275 amount=-1 +kerning first=8220 second=948 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=915 second=195 amount=-1 +kerning first=8216 second=197 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=932 second=963 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=197 second=34 amount=-1 +kerning first=932 second=235 amount=-1 +kerning first=358 second=949 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=321 second=372 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=319 second=356 amount=-1 +kerning first=324 second=354 amount=-1 +kerning first=376 second=196 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=187 second=932 amount=-1 +kerning first=76 second=8212 amount=-1 +kerning first=929 second=260 amount=-1 +kerning first=936 second=46 amount=-1 +kerning first=1034 second=1035 amount=-1 +kerning first=915 second=8230 amount=-1 +kerning first=195 second=358 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=308 second=93 amount=1 +kerning first=356 second=279 amount=-1 +kerning first=358 second=378 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=8217 second=46 amount=-2 +kerning first=8216 second=963 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=313 second=376 amount=-1 +kerning first=319 second=8217 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=932 second=41 amount=1 +kerning first=8216 second=235 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=8212 second=356 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=224 second=354 amount=-1 +kerning first=84 second=969 amount=-1 +kerning first=1059 second=1058 amount=1 +kerning first=1091 second=46 amount=-1 +kerning first=102 second=93 amount=1 +kerning first=84 second=241 amount=-1 +kerning first=8221 second=243 amount=-1 +kerning first=8216 second=8216 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=1098 second=8217 amount=-1 +kerning first=8230 second=8221 amount=-1 +kerning first=358 second=265 amount=-1 +kerning first=80 second=8230 amount=-2 +kerning first=8221 second=103 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=8220 second=197 amount=-1 +kerning first=91 second=354 amount=1 +kerning first=45 second=910 amount=-1 +kerning first=923 second=86 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=84 second=913 amount=-1 +kerning first=1168 second=173 amount=-1 +kerning first=1035 second=1066 amount=-1 +kerning first=936 second=198 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=358 second=195 amount=-1 +kerning first=271 second=311 amount=1 +kerning first=912 second=950 amount=1 +kerning first=84 second=258 amount=-1 +kerning first=313 second=358 amount=-1 +kerning first=354 second=343 amount=-1 +kerning first=8221 second=256 amount=-1 +kerning first=1168 second=1100 amount=-1 +kerning first=913 second=221 amount=-1 +kerning first=939 second=65 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=356 second=969 amount=-1 +kerning first=84 second=307 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=1038 second=1058 amount=1 +kerning first=913 second=84 amount=-1 +kerning first=932 second=367 amount=-1 +kerning first=260 second=39 amount=-1 +kerning first=8217 second=198 amount=-1 +kerning first=358 second=345 amount=-1 +kerning first=8220 second=963 amount=-1 +kerning first=104 second=358 amount=-1 +kerning first=256 second=221 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=358 second=8230 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=910 second=962 amount=-1 +kerning first=315 second=173 amount=-1 +kerning first=109 second=932 amount=-1 +kerning first=974 second=34 amount=-1 +kerning first=123 second=106 amount=1 +kerning first=932 second=972 amount=-1 +kerning first=256 second=84 amount=-1 +kerning first=356 second=913 amount=-1 +kerning first=932 second=250 amount=-1 +kerning first=341 second=8230 amount=-1 +kerning first=8220 second=8216 amount=-1 +kerning first=8222 second=86 amount=-1 +kerning first=936 second=194 amount=-1 +kerning first=939 second=966 amount=-1 +kerning first=358 second=232 amount=-1 +kerning first=923 second=932 amount=-1 +kerning first=929 second=197 amount=-1 +kerning first=329 second=356 amount=-1 +kerning first=933 second=941 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=356 second=258 amount=-1 +kerning first=932 second=109 amount=-1 +kerning first=123 second=1095 amount=-1 +kerning first=358 second=97 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=356 second=307 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=192 second=376 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=8217 second=194 amount=-1 +kerning first=225 second=932 amount=-1 +kerning first=910 second=256 amount=-1 +kerning first=261 second=358 amount=-1 +kerning first=376 second=363 amount=-1 +kerning first=915 second=973 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=173 second=354 amount=-1 +kerning first=933 second=916 amount=-1 +kerning first=8216 second=972 amount=-1 +kerning first=1168 second=1079 amount=-1 +kerning first=354 second=301 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=34 second=193 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=221 second=173 amount=-1 +kerning first=939 second=44 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=1090 second=8230 amount=-1 +kerning first=196 second=34 amount=-1 +kerning first=932 second=324 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=8221 second=263 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=8222 second=932 amount=-1 +kerning first=110 second=354 amount=-1 +kerning first=934 second=46 amount=-1 +kerning first=192 second=358 amount=-1 +kerning first=902 second=376 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=932 second=226 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=8221 second=192 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=1027 second=46 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=933 second=949 amount=-1 +kerning first=1168 second=1114 amount=-1 +kerning first=319 second=86 amount=-1 +kerning first=271 second=8221 amount=1 +kerning first=331 second=358 amount=-1 +kerning first=1034 second=8217 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=226 second=354 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=358 second=361 amount=-1 +kerning first=8220 second=972 amount=-1 +kerning first=123 second=358 amount=1 +kerning first=356 second=115 amount=-1 +kerning first=8221 second=8221 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=8218 second=372 amount=-1 +kerning first=915 second=954 amount=-1 +kerning first=354 second=173 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=902 second=358 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=84 second=959 amount=-1 +kerning first=932 second=331 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=356 second=196 amount=-1 +kerning first=8217 second=285 amount=-1 +kerning first=358 second=251 amount=-1 +kerning first=39 second=193 amount=-1 +kerning first=372 second=239 amount=1 +kerning first=932 second=283 amount=-1 +kerning first=8221 second=234 amount=-1 +kerning first=923 second=939 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=1033 second=1066 amount=-1 +kerning first=932 second=122 amount=-1 +kerning first=358 second=110 amount=-1 +kerning first=97 second=84 amount=-1 +kerning first=910 second=192 amount=-1 +kerning first=91 second=87 amount=1 +kerning first=319 second=932 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=1035 second=1058 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=939 second=923 amount=-1 +kerning first=258 second=39 amount=-1 +kerning first=8217 second=308 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=1168 second=1092 amount=-1 +kerning first=933 second=195 amount=-1 +kerning first=313 second=173 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=356 second=959 amount=-1 +kerning first=973 second=34 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=916 second=358 amount=-1 +kerning first=932 second=349 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=1043 second=187 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=8221 second=289 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=358 second=328 amount=-1 +kerning first=295 second=356 amount=-1 +kerning first=376 second=271 amount=-1 +kerning first=8211 second=376 amount=-1 +kerning first=1058 second=44 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=8212 second=932 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=910 second=961 amount=-1 +kerning first=1058 second=1032 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=315 second=372 amount=-1 +kerning first=933 second=8230 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=932 second=236 amount=-1 +kerning first=194 second=376 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=1169 second=44 amount=-1 +kerning first=1027 second=59 amount=-1 +kerning first=358 second=228 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=34 second=941 amount=-1 +kerning first=259 second=358 amount=-1 +kerning first=932 second=101 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=8221 second=74 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=376 second=65 amount=-1 +kerning first=8230 second=933 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=193 second=34 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=8211 second=358 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=354 second=312 amount=-1 +kerning first=358 second=248 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=241 second=356 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=34 second=916 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=271 second=108 amount=1 +kerning first=354 second=275 amount=-1 +kerning first=932 second=46 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=195 second=936 amount=-1 +kerning first=194 second=358 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=8221 second=353 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=1043 second=1169 amount=-1 +kerning first=932 second=297 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=321 second=8211 amount=-1 +kerning first=358 second=279 amount=-1 +kerning first=915 second=913 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=40 second=309 amount=1 +kerning first=376 second=99 amount=-1 +kerning first=932 second=945 amount=-1 +kerning first=329 second=932 amount=-1 +kerning first=915 second=258 amount=-1 +kerning first=1168 second=1241 amount=-1 +kerning first=65 second=932 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=46 second=939 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=372 second=193 amount=-1 +kerning first=8216 second=46 amount=-1 +kerning first=34 second=949 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=912 second=955 amount=1 +kerning first=1027 second=1026 amount=1 +kerning first=89 second=8211 amount=-1 +kerning first=376 second=44 amount=-1 +kerning first=39 second=941 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=913 second=89 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=195 second=372 amount=-1 +kerning first=80 second=913 amount=-1 +kerning first=257 second=356 amount=-1 +kerning first=932 second=198 amount=-1 +kerning first=354 second=962 amount=-1 +kerning first=173 second=933 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=915 second=946 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=910 second=970 amount=1 +kerning first=8212 second=939 amount=-1 +kerning first=8216 second=945 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=256 second=89 amount=-1 +kerning first=260 second=376 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=317 second=932 amount=-1 +kerning first=939 second=940 amount=-1 +kerning first=358 second=969 amount=-1 +kerning first=39 second=916 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1033 second=1058 amount=-1 +kerning first=358 second=241 amount=-1 +kerning first=913 second=34 amount=-1 +kerning first=932 second=261 amount=-1 +kerning first=293 second=358 amount=-1 +kerning first=357 second=8221 amount=1 +kerning first=1043 second=1098 amount=-1 +kerning first=932 second=114 amount=-1 +kerning first=926 second=912 amount=1 +kerning first=8204 second=902 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=354 second=256 amount=-1 +kerning first=8216 second=198 amount=-1 +kerning first=256 second=34 amount=-1 +kerning first=8220 second=46 amount=-1 +kerning first=932 second=194 amount=-1 +kerning first=358 second=913 amount=-1 +kerning first=1068 second=1026 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=1056 second=44 amount=-2 +kerning first=1168 second=1084 amount=-1 +kerning first=1056 second=1032 amount=-1 +kerning first=939 second=260 amount=-1 +kerning first=922 second=970 amount=1 +kerning first=89 second=277 amount=-1 +kerning first=358 second=258 amount=-1 +kerning first=34 second=195 amount=-1 +kerning first=8221 second=8204 amount=-1 +kerning first=260 second=358 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=313 second=372 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=39 second=949 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=910 second=8211 amount=-1 +kerning first=8221 second=273 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=358 second=307 amount=-1 +kerning first=932 second=337 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=160 second=8216 amount=-1 +kerning first=8211 second=910 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=8221 second=277 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=8220 second=945 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=915 second=196 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=34 second=8230 amount=-1 +kerning first=8216 second=194 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=1107 second=46 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=932 second=231 amount=-1 +kerning first=65 second=939 amount=-1 +kerning first=939 second=948 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=376 second=923 amount=-1 +kerning first=1114 second=8217 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=932 second=93 amount=1 +kerning first=89 second=351 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=40 second=356 amount=1 +kerning first=929 second=46 amount=-2 +kerning first=8220 second=198 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=192 second=936 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=86 second=923 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=8221 second=351 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=197 second=932 amount=-1 +kerning first=915 second=959 amount=-1 +kerning first=89 second=239 amount=1 +kerning first=321 second=45 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=84 second=966 amount=-1 +kerning first=295 second=932 amount=-1 +kerning first=84 second=238 amount=-1 +kerning first=39 second=195 amount=-1 +kerning first=358 second=382 amount=-1 +kerning first=44 second=939 amount=-1 +kerning first=932 second=285 amount=-1 +kerning first=376 second=229 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=8221 second=100 amount=-1 +kerning first=356 second=65 amount=-1 +kerning first=354 second=192 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=358 second=115 amount=-1 +kerning first=8220 second=194 amount=-1 +kerning first=8204 second=221 amount=-1 +kerning first=915 second=181 amount=-1 +kerning first=902 second=936 amount=-1 +kerning first=913 second=8220 amount=-1 +kerning first=227 second=84 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=1035 second=1063 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=192 second=372 amount=-1 +kerning first=939 second=197 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=39 second=8230 amount=-1 +kerning first=929 second=198 amount=-1 +kerning first=358 second=196 amount=-1 +kerning first=1075 second=44 amount=-1 +kerning first=932 second=308 amount=-1 +kerning first=8216 second=1026 amount=1 +kerning first=1168 second=1097 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=356 second=966 amount=-1 +kerning first=258 second=376 amount=-1 +kerning first=8216 second=285 amount=-1 +kerning first=356 second=238 amount=-1 +kerning first=241 second=932 amount=-1 +kerning first=932 second=369 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=321 second=8212 amount=-1 +kerning first=84 second=299 amount=-1 +kerning first=358 second=333 amount=-1 +kerning first=354 second=961 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=376 second=125 amount=1 +kerning first=123 second=372 amount=1 +kerning first=8218 second=87 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=916 second=936 amount=-1 +kerning first=939 second=963 amount=-1 +kerning first=932 second=242 amount=-1 +kerning first=8216 second=308 amount=-1 +kerning first=358 second=959 amount=-1 +kerning first=902 second=372 amount=-1 +kerning first=358 second=233 amount=-1 +kerning first=929 second=194 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=86 second=125 amount=1 +kerning first=1043 second=1090 amount=-1 +kerning first=114 second=8230 amount=-1 +kerning first=1168 second=8211 amount=-1 +kerning first=1066 second=1026 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=89 second=8212 amount=-1 +kerning first=947 second=46 amount=-1 +kerning first=1033 second=8221 amount=-1 +kerning first=258 second=358 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=76 second=34 amount=-1 +kerning first=356 second=299 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=8220 second=1026 amount=1 +kerning first=197 second=939 amount=-1 +kerning first=915 second=943 amount=-1 +kerning first=910 second=45 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=1043 second=46 amount=-1 +kerning first=933 second=913 amount=-1 +kerning first=1168 second=1076 amount=-1 +kerning first=354 second=289 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=8220 second=285 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=315 second=8211 amount=-1 +kerning first=257 second=932 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=84 second=974 amount=-1 +kerning first=933 second=258 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=376 second=244 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=358 second=291 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=8221 second=113 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=104 second=354 amount=-1 +kerning first=923 second=8216 amount=-1 +kerning first=8220 second=308 amount=-1 +kerning first=1026 second=1035 amount=-1 +kerning first=194 second=936 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=84 second=923 amount=-1 +kerning first=8221 second=193 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=372 second=195 amount=-1 +kerning first=196 second=932 amount=-1 +kerning first=1168 second=1111 amount=-1 +kerning first=87 second=239 amount=1 +kerning first=8216 second=1040 amount=-1 +kerning first=324 second=84 amount=-1 +kerning first=354 second=371 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=376 second=260 amount=-1 +kerning first=356 second=974 amount=-1 +kerning first=913 second=356 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=910 second=8212 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=221 second=8211 amount=-1 +kerning first=932 second=380 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=8221 second=335 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=358 second=363 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=915 second=951 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=910 second=912 amount=1 +kerning first=372 second=8230 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=376 second=8249 amount=-1 +kerning first=256 second=356 amount=-1 +kerning first=261 second=354 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=356 second=923 amount=-1 +kerning first=939 second=972 amount=-1 +kerning first=1058 second=187 amount=-1 +kerning first=224 second=84 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=358 second=245 amount=-1 +kerning first=1033 second=1063 amount=-1 +kerning first=913 second=8217 amount=-1 +kerning first=194 second=372 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=932 second=267 amount=-1 +kerning first=1043 second=1103 amount=-1 +kerning first=929 second=308 amount=-1 +kerning first=1034 second=1059 amount=-1 +kerning first=45 second=933 amount=-1 +kerning first=910 second=193 amount=-1 +kerning first=91 second=84 amount=1 +kerning first=256 second=8217 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=1043 second=59 amount=-1 +kerning first=40 second=932 amount=1 +kerning first=968 second=39 amount=-1 +kerning first=1168 second=1089 amount=-1 +kerning first=1058 second=1085 amount=-1 +kerning first=8220 second=1040 amount=-1 +kerning first=922 second=912 amount=1 +kerning first=76 second=8220 amount=-1 +kerning first=933 second=196 amount=-1 +kerning first=221 second=273 amount=-1 +kerning first=1027 second=173 amount=-1 +kerning first=354 second=8211 amount=-1 +kerning first=331 second=354 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=1100 second=1098 amount=-1 +kerning first=902 second=8221 amount=-1 +kerning first=932 second=343 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=8221 second=287 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=84 second=125 amount=1 +kerning first=376 second=269 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=1168 second=45 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=123 second=354 amount=1 +kerning first=260 second=936 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=932 second=237 amount=-1 +kerning first=915 second=65 amount=-1 +kerning first=1068 second=1066 amount=-1 +kerning first=902 second=354 amount=-1 +kerning first=343 second=44 amount=-1 +kerning first=376 second=197 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=196 second=939 amount=-1 +kerning first=936 second=256 amount=-1 +kerning first=933 second=959 amount=-1 +kerning first=319 second=8216 amount=-1 +kerning first=8249 second=910 amount=-1 +kerning first=34 second=969 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=1058 second=1169 amount=-1 +kerning first=46 second=8216 amount=-1 +kerning first=354 second=305 amount=-1 +kerning first=1034 second=1038 amount=-1 +kerning first=102 second=8221 amount=1 +kerning first=221 second=351 amount=-1 +kerning first=313 second=8211 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=173 second=221 amount=-1 +kerning first=916 second=8221 amount=-1 +kerning first=8217 second=256 amount=-1 +kerning first=356 second=125 amount=1 +kerning first=915 second=966 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=358 second=230 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=1043 second=1026 amount=1 +kerning first=34 second=913 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=173 second=84 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=239 amount=1 +kerning first=8220 second=267 amount=-1 +kerning first=195 second=933 amount=-1 +kerning first=84 second=940 amount=-1 +kerning first=34 second=258 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=260 second=372 amount=-1 +kerning first=8221 second=246 amount=-1 +kerning first=932 second=301 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=916 second=354 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=1168 second=8212 amount=-1 +kerning first=358 second=271 amount=-1 +kerning first=97 second=356 amount=-1 +kerning first=193 second=932 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=110 second=84 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=8204 second=89 amount=-1 +kerning first=915 second=44 amount=-1 +kerning first=271 second=318 amount=1 +kerning first=326 second=358 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=1168 second=1102 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=259 second=354 amount=-1 +kerning first=315 second=8212 amount=-1 +kerning first=70 second=8230 amount=-1 +kerning first=358 second=65 amount=-1 +kerning first=356 second=940 amount=-1 +kerning first=376 second=41 amount=1 +kerning first=39 second=969 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=913 second=86 amount=-1 +kerning first=955 second=8221 amount=-1 +kerning first=226 second=84 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=358 second=347 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=354 second=239 amount=-1 +kerning first=910 second=941 amount=-1 +kerning first=1168 second=58 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=86 second=41 amount=1 +kerning first=8211 second=354 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=256 second=86 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=84 second=948 amount=-1 +kerning first=932 second=252 amount=-1 +kerning first=39 second=913 amount=-1 +kerning first=936 second=192 amount=-1 +kerning first=358 second=966 amount=-1 +kerning first=932 second=173 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=358 second=238 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=8216 second=1066 amount=1 +kerning first=356 second=260 amount=-1 +kerning first=1113 second=8221 amount=-1 +kerning first=932 second=111 amount=-1 +kerning first=39 second=258 amount=-1 +kerning first=65 second=8216 amount=-1 +kerning first=358 second=99 amount=-1 +kerning first=910 second=916 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=160 second=8218 amount=-1 +kerning first=221 second=8212 amount=-1 +kerning first=8217 second=192 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=969 second=34 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=913 second=932 amount=-1 +kerning first=1168 second=1081 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=89 second=265 amount=-1 +kerning first=34 second=196 amount=-1 +kerning first=936 second=961 amount=-1 +kerning first=358 second=44 amount=-1 +kerning first=258 second=936 amount=-1 +kerning first=356 second=948 amount=-1 +kerning first=939 second=46 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=8217 second=8221 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=1066 second=1066 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=256 second=932 amount=-1 +kerning first=8221 second=265 amount=-1 +kerning first=358 second=299 amount=-1 +kerning first=341 second=44 amount=-1 +kerning first=193 second=939 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=915 second=923 amount=-1 +kerning first=317 second=8216 amount=-1 +kerning first=89 second=195 amount=-1 +kerning first=910 second=949 amount=-1 +kerning first=44 second=8216 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=123 second=87 amount=1 +kerning first=8217 second=234 amount=-1 +kerning first=939 second=945 amount=-1 +kerning first=932 second=224 amount=-1 +kerning first=1068 second=1058 amount=-1 +kerning first=8220 second=1066 amount=1 +kerning first=84 second=197 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=8221 second=195 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=902 second=87 amount=-1 +kerning first=1168 second=1116 amount=-1 +kerning first=1041 second=1026 amount=-1 +kerning first=293 second=354 amount=-1 +kerning first=354 second=8212 amount=-1 +kerning first=89 second=8230 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=8250 second=932 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=192 second=933 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=80 second=923 amount=-1 +kerning first=258 second=372 amount=-1 +kerning first=84 second=341 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=932 second=339 amount=-1 +kerning first=356 second=117 amount=-1 +kerning first=8221 second=8230 amount=-2 +kerning first=89 second=232 amount=-1 +kerning first=939 second=198 amount=-1 +kerning first=1090 second=44 amount=-1 +kerning first=1168 second=1060 amount=-1 +kerning first=923 second=39 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=84 second=963 amount=-1 +kerning first=8204 second=8220 amount=-1 +kerning first=932 second=312 amount=-1 +kerning first=358 second=974 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=356 second=197 amount=-1 +kerning first=260 second=354 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=358 second=249 amount=-1 +kerning first=39 second=196 amount=-1 +kerning first=8221 second=232 amount=-1 +kerning first=932 second=275 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=328 second=358 amount=-1 +kerning first=358 second=259 amount=-1 +kerning first=1059 second=8230 amount=-1 +kerning first=354 second=193 amount=-1 +kerning first=358 second=112 amount=-1 +kerning first=1111 second=1106 amount=1 +kerning first=902 second=933 amount=-1 +kerning first=313 second=8212 amount=-1 +kerning first=910 second=195 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=356 second=341 amount=-1 +kerning first=358 second=923 amount=-1 +kerning first=372 second=913 amount=-1 +kerning first=939 second=194 amount=-1 +kerning first=1058 second=1090 amount=-1 +kerning first=271 second=293 amount=1 +kerning first=8217 second=74 amount=-1 +kerning first=913 second=939 amount=-1 +kerning first=1168 second=1094 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=372 second=258 amount=-1 +kerning first=84 second=41 amount=1 +kerning first=1027 second=1241 amount=-1 +kerning first=356 second=963 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=197 second=8216 amount=-1 +kerning first=229 second=358 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=933 second=65 amount=-1 +kerning first=910 second=8230 amount=-1 +kerning first=8218 second=221 amount=-1 +kerning first=256 second=939 amount=-1 +kerning first=358 second=326 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=1058 second=46 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=8230 second=34 amount=-1 +kerning first=1038 second=8230 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=932 second=962 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=916 second=933 amount=-1 +kerning first=932 second=243 amount=-1 +kerning first=1169 second=46 amount=-1 +kerning first=97 second=932 amount=-1 +kerning first=358 second=229 amount=-1 +kerning first=933 second=966 amount=-1 +kerning first=1043 second=1087 amount=-1 +kerning first=1168 second=8250 amount=-1 +kerning first=8216 second=1058 amount=1 +kerning first=194 second=87 amount=-1 +kerning first=932 second=103 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=356 second=41 amount=1 +kerning first=8220 second=339 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=376 second=349 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=915 second=940 amount=-1 +kerning first=932 second=256 amount=-1 +kerning first=8216 second=962 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=173 second=89 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=160 second=376 amount=-1 +kerning first=84 second=972 amount=-1 +kerning first=8204 second=8222 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=933 second=44 amount=-1 +kerning first=1066 second=1058 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=76 second=932 amount=-1 +kerning first=8211 second=933 amount=-1 +kerning first=319 second=39 amount=-1 +kerning first=932 second=171 amount=-1 +kerning first=358 second=281 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=46 second=39 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=358 second=125 amount=1 +kerning first=376 second=101 amount=-1 +kerning first=87 second=8230 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=227 second=356 amount=-1 +kerning first=194 second=933 amount=-1 +kerning first=915 second=260 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=356 second=367 amount=-1 +kerning first=8216 second=256 amount=-1 +kerning first=258 second=8221 amount=-1 +kerning first=8220 second=1058 amount=1 +kerning first=45 second=84 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=372 second=196 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=1168 second=1108 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=1068 second=8221 amount=-1 +kerning first=356 second=972 amount=-1 +kerning first=376 second=46 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=354 second=941 amount=-1 +kerning first=8220 second=962 amount=-1 +kerning first=1058 second=59 amount=-1 +kerning first=915 second=948 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=91 second=309 amount=1 +kerning first=8220 second=243 amount=-1 +kerning first=321 second=34 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=8217 second=8204 amount=-1 +kerning first=1043 second=173 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=358 second=940 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=358 second=244 amount=-1 +kerning first=932 second=263 amount=-1 +kerning first=260 second=87 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=8230 second=8220 amount=-1 +kerning first=1168 second=8230 amount=-1 +kerning first=354 second=916 amount=-1 +kerning first=70 second=913 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=187 second=376 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=196 second=8216 amount=-1 +kerning first=8220 second=256 amount=-1 +kerning first=228 second=358 amount=-1 +kerning first=271 second=295 amount=1 +kerning first=356 second=324 amount=-1 +kerning first=932 second=192 amount=-1 +kerning first=8221 second=248 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=1056 second=46 amount=-2 +kerning first=376 second=198 amount=-1 +kerning first=933 second=923 amount=-1 +kerning first=1168 second=1086 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=358 second=260 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=221 second=265 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=34 second=65 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=965 second=34 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=8221 second=279 amount=-1 +kerning first=354 second=949 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=65 second=39 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=187 second=358 amount=-1 +kerning first=1058 second=1026 amount=1 +kerning first=358 second=8249 amount=-1 +kerning first=915 second=197 amount=-1 +kerning first=260 second=933 amount=-1 +kerning first=8216 second=192 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=932 second=961 amount=-1 +kerning first=171 second=939 amount=-1 +kerning first=1040 second=1035 amount=-1 +kerning first=932 second=234 amount=-1 +kerning first=358 second=948 amount=-1 +kerning first=1068 second=1063 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=324 second=356 amount=-1 +kerning first=376 second=194 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=929 second=256 amount=-1 +kerning first=915 second=187 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=1027 second=8211 amount=-1 +kerning first=221 second=8230 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=84 second=349 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=317 second=39 amount=-1 +kerning first=915 second=963 amount=-1 +kerning first=8216 second=961 amount=-1 +kerning first=44 second=39 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=354 second=265 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=224 second=356 amount=-1 +kerning first=84 second=236 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=34 second=44 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=932 second=289 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=923 second=376 amount=-1 +kerning first=89 second=913 amount=-1 +kerning first=358 second=269 amount=-1 +kerning first=1041 second=1066 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=354 second=195 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=358 second=117 amount=-1 +kerning first=39 second=65 amount=-1 +kerning first=91 second=356 amount=1 +kerning first=8220 second=192 amount=-1 +kerning first=376 second=93 amount=1 +kerning first=1066 second=8221 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=104 second=84 amount=-1 +kerning first=356 second=349 amount=-1 +kerning first=8221 second=913 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=358 second=197 amount=-1 +kerning first=1075 second=46 amount=-1 +kerning first=944 second=39 amount=-1 +kerning first=86 second=93 amount=1 +kerning first=1168 second=1099 amount=-1 +kerning first=8221 second=258 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=932 second=74 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=354 second=8230 amount=-1 +kerning first=109 second=358 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=934 second=933 amount=-1 +kerning first=356 second=236 amount=-1 +kerning first=932 second=371 amount=-1 +kerning first=1027 second=1111 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=923 second=358 amount=-1 +kerning first=84 second=297 amount=-1 +kerning first=358 second=341 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=8220 second=961 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=1118 second=8230 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=8230 second=8217 amount=-1 +kerning first=8218 second=89 amount=-1 +kerning first=8222 second=376 amount=-1 +kerning first=1168 second=1044 amount=-1 +kerning first=932 second=970 amount=1 +kerning first=261 second=84 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=84 second=945 amount=-1 +kerning first=193 second=8216 amount=-1 +kerning first=932 second=353 amount=-1 +kerning first=936 second=193 amount=-1 +kerning first=358 second=963 amount=-1 +kerning first=225 second=358 amount=-1 +kerning first=1059 second=1035 amount=1 +kerning first=358 second=235 amount=-1 +kerning first=929 second=192 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=933 second=940 amount=-1 +kerning first=34 second=974 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=227 second=932 amount=-1 +kerning first=376 second=308 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=39 second=44 amount=-1 +kerning first=910 second=913 amount=-1 +kerning first=197 second=39 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=8217 second=193 amount=-1 +kerning first=910 second=258 amount=-1 +kerning first=356 second=297 amount=-1 +kerning first=84 second=198 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=915 second=972 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=173 second=356 amount=-1 +kerning first=34 second=923 amount=-1 +kerning first=8222 second=358 amount=-1 +kerning first=1168 second=1078 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=326 second=354 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=358 second=41 amount=1 +kerning first=258 second=933 amount=-1 +kerning first=356 second=945 amount=-1 +kerning first=933 second=260 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=1038 second=1035 amount=1 +kerning first=331 second=84 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=1066 second=1063 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=932 second=8211 amount=-1 +kerning first=84 second=114 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=8221 second=115 amount=-1 +kerning first=110 second=356 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=950 second=125 amount=1 +kerning first=123 second=84 amount=1 +kerning first=902 second=221 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=319 second=376 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=932 second=225 amount=-1 +kerning first=84 second=194 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=356 second=198 amount=-1 +kerning first=8221 second=196 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=1027 second=45 amount=-1 +kerning first=902 second=84 amount=-1 +kerning first=8249 second=933 amount=-1 +kerning first=933 second=948 amount=-1 +kerning first=1168 second=1113 amount=-1 +kerning first=354 second=361 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=1034 second=1026 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=372 second=65 amount=-1 +kerning first=39 second=974 amount=-1 +kerning first=226 second=356 amount=-1 +kerning first=913 second=8216 amount=-1 +kerning first=315 second=34 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=8221 second=333 amount=-1 +kerning first=932 second=305 amount=-1 +kerning first=358 second=367 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=87 second=913 amount=-1 +kerning first=915 second=953 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=8212 second=376 amount=-1 +kerning first=1043 second=1241 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=256 second=8216 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=319 second=358 amount=-1 +kerning first=932 second=273 amount=-1 +kerning first=39 second=923 amount=-1 +kerning first=358 second=972 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=356 second=194 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=358 second=250 amount=-1 +kerning first=8221 second=233 amount=-1 +kerning first=939 second=173 amount=-1 +kerning first=932 second=277 amount=-1 +kerning first=957 second=8230 amount=-1 +kerning first=8216 second=1076 amount=-1 +kerning first=1041 second=1058 amount=-1 +kerning first=974 second=39 amount=-1 +kerning first=916 second=84 amount=-1 +kerning first=84 second=93 amount=1 +kerning first=929 second=74 amount=-1 +kerning first=358 second=109 amount=-1 +kerning first=910 second=196 amount=-1 +kerning first=271 second=8217 amount=1 +kerning first=91 second=86 amount=1 +kerning first=1027 second=8212 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=324 second=932 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=8212 second=358 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=933 second=197 amount=-1 +kerning first=1168 second=1091 amount=-1 +kerning first=8221 second=8217 amount=-1 +kerning first=372 second=44 amount=-1 +kerning first=259 second=84 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=932 second=351 amount=-1 +kerning first=1027 second=1102 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=84 second=285 amount=-1 +kerning first=8221 second=291 amount=-1 +kerning first=358 second=324 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=8211 second=221 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=356 second=93 amount=1 +kerning first=354 second=228 amount=-1 +kerning first=224 second=932 amount=-1 +kerning first=910 second=959 amount=-1 +kerning first=196 second=39 amount=-1 +kerning first=8211 second=84 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=936 second=916 amount=-1 +kerning first=932 second=239 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=8220 second=1076 amount=-1 +kerning first=65 second=376 amount=-1 +kerning first=1027 second=58 amount=-1 +kerning first=358 second=226 amount=-1 +kerning first=343 second=46 amount=-1 +kerning first=91 second=932 amount=1 +kerning first=933 second=963 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=84 second=308 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=932 second=100 amount=-1 +kerning first=195 second=34 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=74 second=125 amount=1 +kerning first=328 second=354 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=1035 second=1035 amount=-1 +kerning first=356 second=285 amount=-1 +kerning first=915 second=968 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=8220 second=273 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=271 second=107 amount=1 +kerning first=354 second=279 amount=-1 +kerning first=932 second=45 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=329 second=358 amount=-1 +kerning first=34 second=260 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=65 second=358 amount=-1 +kerning first=317 second=376 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=358 second=331 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=8221 second=245 amount=-1 +kerning first=932 second=303 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=229 second=354 amount=-1 +kerning first=356 second=308 amount=-1 +kerning first=358 second=283 amount=-1 +kerning first=358 second=122 amount=-1 +kerning first=221 second=913 amount=-1 +kerning first=1058 second=173 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=915 second=46 amount=-1 +kerning first=372 second=923 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=313 second=34 amount=-1 +kerning first=1058 second=1100 amount=-1 +kerning first=271 second=320 amount=1 +kerning first=321 second=86 amount=-1 +kerning first=1168 second=1105 amount=-1 +kerning first=293 second=84 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=317 second=358 amount=-1 +kerning first=173 second=932 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=932 second=8212 amount=-1 +kerning first=354 second=969 amount=-1 +kerning first=358 second=349 amount=-1 +kerning first=915 second=945 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=8212 second=910 amount=-1 +kerning first=973 second=39 amount=-1 +kerning first=76 second=8216 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=932 second=912 amount=1 +kerning first=260 second=221 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=939 second=962 amount=-1 +kerning first=319 second=173 amount=-1 +kerning first=936 second=195 amount=-1 +kerning first=8217 second=265 amount=-1 +kerning first=86 second=301 amount=1 +kerning first=358 second=236 amount=-1 +kerning first=110 second=932 amount=-1 +kerning first=932 second=257 amount=-1 +kerning first=260 second=84 amount=-1 +kerning first=923 second=936 amount=-1 +kerning first=933 second=972 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=354 second=913 amount=-1 +kerning first=932 second=113 amount=-1 +kerning first=345 second=8230 amount=-1 +kerning first=39 second=260 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=358 second=101 amount=-1 +kerning first=915 second=198 amount=-1 +kerning first=321 second=932 amount=-1 +kerning first=354 second=258 amount=-1 +kerning first=8230 second=939 amount=-1 +kerning first=8217 second=195 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=932 second=193 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=936 second=8230 amount=-1 +kerning first=915 second=944 amount=-1 +kerning first=354 second=307 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=197 second=376 amount=-1 +kerning first=1168 second=1083 amount=-1 +kerning first=226 second=932 amount=-1 +kerning first=89 second=271 amount=-1 +kerning first=939 second=256 amount=-1 +kerning first=34 second=197 amount=-1 +kerning first=358 second=46 amount=-1 +kerning first=193 second=39 amount=-1 +kerning first=1043 second=8211 amount=-1 +kerning first=950 second=41 amount=1 +kerning first=8216 second=113 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=932 second=335 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=8217 second=8230 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=376 second=173 amount=-1 +kerning first=358 second=297 amount=-1 +kerning first=341 second=46 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=8221 second=271 amount=-1 +kerning first=923 second=372 amount=-1 +kerning first=1091 second=8230 amount=-1 +kerning first=372 second=125 amount=1 +kerning first=192 second=34 amount=-1 +kerning first=376 second=111 amount=-1 +kerning first=357 second=8217 amount=1 +kerning first=915 second=194 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=8216 second=193 amount=-1 +kerning first=221 second=196 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=932 second=227 amount=-1 +kerning first=915 second=59 amount=-1 +kerning first=358 second=945 amount=-1 +kerning first=1033 second=1035 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=197 second=358 amount=-1 +kerning first=902 second=89 amount=-1 +kerning first=1168 second=1119 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=8221 second=65 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=1027 second=8250 amount=-1 +kerning first=295 second=358 amount=-1 +kerning first=173 second=939 amount=-1 +kerning first=315 second=8217 amount=-1 +kerning first=84 second=343 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=8221 second=347 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=228 second=354 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=358 second=198 amount=-1 +kerning first=1090 second=46 amount=-1 +kerning first=902 second=34 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=8222 second=372 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=84 second=237 amount=-1 +kerning first=39 second=197 amount=-1 +kerning first=1043 second=1111 amount=-1 +kerning first=932 second=287 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=70 second=923 amount=-1 +kerning first=358 second=261 amount=-1 +kerning first=8221 second=99 amount=-1 +kerning first=1034 second=1066 amount=-1 +kerning first=354 second=196 amount=-1 +kerning first=358 second=114 amount=-1 +kerning first=8220 second=193 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=913 second=39 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=356 second=343 amount=-1 +kerning first=241 second=358 amount=-1 +kerning first=102 second=34 amount=1 +kerning first=910 second=65 amount=-1 +kerning first=939 second=192 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=358 second=194 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=1168 second=1096 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=372 second=260 amount=-1 +kerning first=916 second=34 amount=-1 +kerning first=256 second=39 amount=-1 +kerning first=8221 second=44 amount=-2 +kerning first=8216 second=287 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=317 second=173 amount=-1 +kerning first=932 second=365 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=84 second=301 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=354 second=959 amount=-1 +kerning first=358 second=337 amount=-1 +kerning first=971 second=34 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=8218 second=86 amount=-1 +kerning first=910 second=966 amount=-1 +kerning first=8211 second=89 amount=-1 +kerning first=932 second=941 amount=-1 +kerning first=1059 second=44 amount=-1 +kerning first=74 second=41 amount=1 +kerning first=939 second=961 amount=-1 +kerning first=932 second=246 amount=-1 +kerning first=1059 second=1032 amount=-1 +kerning first=358 second=231 amount=-1 +kerning first=929 second=193 amount=-1 +kerning first=319 second=372 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=934 second=8230 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=932 second=105 amount=-1 +kerning first=196 second=376 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=358 second=93 amount=1 +kerning first=40 second=106 amount=1 +kerning first=1100 second=8221 amount=-1 +kerning first=257 second=358 amount=-1 +kerning first=221 second=363 amount=-1 +kerning first=40 second=1095 amount=-1 +kerning first=1027 second=8230 amount=-1 +kerning first=932 second=916 amount=-1 +kerning first=356 second=301 amount=-1 +kerning first=915 second=942 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=910 second=44 amount=-1 +kerning first=955 second=34 amount=-1 +kerning first=8216 second=941 amount=-1 +kerning first=80 second=308 amount=-1 +kerning first=923 second=8221 amount=-1 +kerning first=123 second=309 amount=1 +kerning first=1168 second=1075 amount=-1 +kerning first=1043 second=45 amount=-1 +kerning first=194 second=34 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=1038 second=44 amount=-1 +kerning first=84 second=252 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=8218 second=932 amount=-1 +kerning first=109 second=354 amount=-1 +kerning first=1038 second=1032 amount=-1 +kerning first=84 second=173 amount=-1 +kerning first=8221 second=160 amount=-1 +kerning first=902 second=8220 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=933 second=46 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=89 second=923 amount=-1 +kerning first=358 second=285 amount=-1 +kerning first=196 second=358 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=923 second=354 amount=-1 +kerning first=8216 second=916 amount=-1 +kerning first=104 second=356 amount=-1 +kerning first=1058 second=1241 amount=-1 +kerning first=932 second=949 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=8221 second=923 amount=-1 +kerning first=8204 second=8216 amount=-1 +kerning first=65 second=936 amount=-1 +kerning first=1033 second=8217 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=372 second=197 amount=-1 +kerning first=933 second=945 amount=-1 +kerning first=225 second=354 amount=-1 +kerning first=354 second=363 amount=-1 +kerning first=358 second=308 amount=-1 +kerning first=376 second=256 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=356 second=252 amount=-1 +kerning first=1043 second=8212 amount=-1 +kerning first=356 second=173 amount=-1 +kerning first=932 second=378 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=358 second=369 amount=-1 +kerning first=8220 second=941 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=376 second=171 amount=-1 +kerning first=261 second=356 amount=-1 +kerning first=8216 second=949 amount=-1 +kerning first=933 second=198 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=358 second=242 amount=-1 +kerning first=932 second=265 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=260 second=89 amount=-1 +kerning first=40 second=358 amount=1 +kerning first=65 second=372 amount=-1 +kerning first=315 second=932 amount=-1 +kerning first=8220 second=916 amount=-1 +kerning first=1034 second=1058 amount=-1 +kerning first=45 second=932 amount=-1 +kerning first=910 second=923 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=932 second=195 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=1043 second=58 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=260 second=34 amount=-1 +kerning first=1168 second=1088 amount=-1 +kerning first=76 second=39 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=933 second=194 amount=-1 +kerning first=89 second=125 amount=1 +kerning first=372 second=41 amount=1 +kerning first=331 second=356 amount=-1 +kerning first=8216 second=265 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=84 second=312 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=932 second=345 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=319 second=8221 amount=-1 +kerning first=317 second=372 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=932 second=8230 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=8221 second=281 amount=-1 +kerning first=939 second=8211 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=8220 second=949 amount=-1 +kerning first=193 second=376 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=123 second=356 amount=1 +kerning first=1028 second=1095 amount=-1 +kerning first=1168 second=1032 amount=-1 +kerning first=1168 second=44 amount=-1 +kerning first=8216 second=195 amount=-1 +kerning first=1098 second=8221 amount=-1 +kerning first=936 second=913 amount=-1 +kerning first=932 second=232 amount=-1 +kerning first=929 second=916 amount=-1 +kerning first=902 second=356 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=319 second=354 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=376 second=192 amount=-1 +kerning first=936 second=258 amount=-1 +kerning first=1027 second=1044 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=932 second=97 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=306 second=125 amount=1 +kerning first=221 second=347 amount=-1 +kerning first=356 second=312 amount=-1 +kerning first=8217 second=913 amount=-1 +kerning first=8216 second=8230 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=358 second=380 amount=-1 +kerning first=8217 second=258 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=197 second=936 amount=-1 +kerning first=87 second=923 amount=-1 +kerning first=915 second=965 amount=-1 +kerning first=193 second=358 amount=-1 +kerning first=902 second=8217 amount=-1 +kerning first=271 second=104 amount=1 +kerning first=354 second=271 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=8220 second=265 amount=-1 +kerning first=195 second=932 amount=-1 +kerning first=8212 second=354 amount=-1 +kerning first=84 second=962 amount=-1 +kerning first=326 second=84 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=8221 second=244 amount=-1 +kerning first=34 second=46 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=916 second=356 amount=-1 +kerning first=1043 second=1116 amount=-1 +kerning first=358 second=267 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=8220 second=195 amount=-1 +kerning first=45 second=939 amount=-1 +kerning first=923 second=87 amount=-1 +kerning first=89 second=260 amount=-1 +kerning first=1026 second=1026 amount=-1 +kerning first=354 second=65 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=1058 second=1097 amount=-1 +kerning first=271 second=314 amount=1 +kerning first=221 second=44 amount=-1 +kerning first=1043 second=1060 amount=-1 +kerning first=8230 second=8216 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=8221 second=260 amount=-1 +kerning first=1168 second=1101 amount=-1 +kerning first=913 second=376 amount=-1 +kerning first=197 second=372 amount=-1 +kerning first=916 second=8217 amount=-1 +kerning first=259 second=356 amount=-1 +kerning first=89 second=8249 amount=-1 +kerning first=8220 second=8230 amount=-1 +kerning first=356 second=962 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=932 second=361 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=354 second=966 amount=-1 +kerning first=358 second=343 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=256 second=376 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=354 second=238 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=313 second=932 amount=-1 +kerning first=910 second=940 amount=-1 +kerning first=8211 second=356 amount=-1 +kerning first=34 second=198 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=932 second=251 amount=-1 +kerning first=936 second=196 amount=-1 +kerning first=8222 second=87 amount=-1 +kerning first=1058 second=8211 amount=-1 +kerning first=929 second=195 amount=-1 +kerning first=358 second=237 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=329 second=354 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=923 second=933 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=104 second=932 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=356 second=256 amount=-1 +kerning first=932 second=110 amount=-1 +kerning first=913 second=358 amount=-1 +kerning first=258 second=34 amount=-1 +kerning first=1107 second=8230 amount=-1 +kerning first=39 second=46 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=87 second=125 amount=1 +kerning first=950 second=93 amount=1 +kerning first=8250 second=376 amount=-1 +kerning first=8217 second=196 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=910 second=260 amount=-1 +kerning first=1034 second=8221 amount=-1 +kerning first=256 second=358 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=376 second=371 amount=-1 +kerning first=929 second=8230 amount=-2 +kerning first=915 second=971 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=955 second=8217 amount=-1 +kerning first=915 second=173 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=354 second=299 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=34 second=194 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=195 second=939 amount=-1 +kerning first=939 second=45 amount=-1 +kerning first=1168 second=1080 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=1118 second=44 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=1043 second=8250 amount=-1 +kerning first=932 second=328 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=319 second=8211 amount=-1 +kerning first=261 second=932 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=358 second=301 amount=-1 +kerning first=8221 second=269 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=910 second=948 amount=-1 +kerning first=221 second=923 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1113 second=8217 amount=-1 +kerning first=8250 second=358 amount=-1 +kerning first=123 second=86 amount=1 +kerning first=8217 second=233 amount=-1 +kerning first=932 second=228 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=8221 second=197 amount=-1 +kerning first=1058 second=1111 amount=-1 +kerning first=39 second=198 amount=-1 +kerning first=902 second=86 amount=-1 +kerning first=196 second=936 amount=-1 +kerning first=321 second=8216 amount=-1 +kerning first=319 second=87 amount=-1 +kerning first=293 second=356 amount=-1 +kerning first=192 second=932 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=328 second=84 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=932 second=248 amount=-1 +kerning first=354 second=974 amount=-1 +kerning first=939 second=8212 amount=-1 +kerning first=354 second=249 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=331 second=932 amount=-1 +kerning first=376 second=8211 amount=-1 +kerning first=160 second=902 amount=-1 +kerning first=8217 second=8217 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=84 second=961 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=356 second=192 amount=-1 +kerning first=260 second=356 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=358 second=252 amount=-1 +kerning first=39 second=194 amount=-1 +kerning first=8221 second=235 amount=-1 +kerning first=932 second=279 amount=-1 +kerning first=358 second=173 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=123 second=932 amount=1 +kerning first=1043 second=1108 amount=-1 +kerning first=354 second=923 amount=-1 +kerning first=229 second=84 amount=-1 +kerning first=358 second=111 amount=-1 +kerning first=1034 second=1063 amount=-1 +kerning first=196 second=372 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=902 second=932 amount=-1 +kerning first=910 second=197 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=46 second=933 amount=-1 +kerning first=1068 second=1035 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=939 second=193 amount=-1 +kerning first=947 second=8230 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=1168 second=1093 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=969 second=39 amount=-1 +kerning first=74 second=93 amount=1 +kerning first=372 second=46 amount=-1 +kerning first=34 second=308 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=356 second=961 amount=-1 +kerning first=1043 second=8230 amount=-1 +kerning first=97 second=358 amount=-1 +kerning first=376 second=273 amount=-1 +kerning first=221 second=125 amount=1 +kerning first=1027 second=1105 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=76 second=376 amount=-1 +kerning first=295 second=354 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=957 second=44 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=910 second=963 amount=-1 +kerning first=8212 second=933 amount=-1 +kerning first=1058 second=45 amount=-1 +kerning first=932 second=969 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=916 second=932 amount=-1 +kerning first=932 second=241 amount=-1 +kerning first=306 second=41 amount=1 +kerning first=358 second=224 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=40 second=372 amount=1 +kerning first=8220 second=248 amount=-1 +kerning first=192 second=939 amount=-1 +kerning first=932 second=913 amount=-1 +kerning first=84 second=371 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=76 second=358 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=317 second=8211 amount=-1 +kerning first=259 second=932 amount=-1 +kerning first=358 second=339 amount=-1 +kerning first=372 second=198 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=241 second=354 amount=-1 +kerning first=932 second=258 amount=-1 +kerning first=915 second=962 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=319 second=45 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=8216 second=969 amount=-1 +kerning first=1168 second=1072 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=160 second=221 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=354 second=125 amount=1 +kerning first=8204 second=8218 amount=-1 +kerning first=932 second=307 amount=-1 +kerning first=1058 second=8212 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=358 second=312 amount=-1 +kerning first=376 second=239 amount=1 +kerning first=1027 second=1083 amount=-1 +kerning first=8211 second=932 amount=-1 +kerning first=358 second=275 amount=-1 +kerning first=39 second=308 amount=-1 +kerning first=193 second=936 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=8216 second=913 amount=-1 +kerning first=902 second=939 amount=-1 +kerning first=194 second=932 amount=-1 +kerning first=915 second=256 amount=-1 +kerning first=86 second=239 amount=1 +kerning first=356 second=371 amount=-1 +kerning first=65 second=933 amount=-1 +kerning first=8216 second=258 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=372 second=194 amount=-1 +kerning first=8216 second=1035 amount=1 +kerning first=1168 second=1107 amount=-1 +kerning first=376 second=45 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=8216 second=8220 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=257 second=354 amount=-1 +kerning first=319 second=8212 amount=-1 +kerning first=354 second=940 amount=-1 +kerning first=8220 second=969 amount=-1 +kerning first=1058 second=58 amount=-1 +kerning first=84 second=8211 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=910 second=972 amount=-1 +kerning first=228 second=84 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=193 second=372 amount=-1 +kerning first=1026 second=1066 amount=-1 +kerning first=916 second=939 amount=-1 +kerning first=932 second=382 amount=-1 +kerning first=939 second=941 amount=-1 +kerning first=358 second=962 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=87 second=41 amount=1 +kerning first=8217 second=271 amount=-1 +kerning first=1033 second=1059 amount=-1 +kerning first=358 second=243 amount=-1 +kerning first=44 second=933 amount=-1 +kerning first=1043 second=1099 amount=-1 +kerning first=1168 second=187 amount=-1 +kerning first=1066 second=1035 amount=-1 +kerning first=260 second=86 amount=-1 +kerning first=8230 second=39 amount=-1 +kerning first=271 second=322 amount=1 +kerning first=932 second=115 amount=-1 +kerning first=936 second=65 amount=-1 +kerning first=8220 second=913 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=933 second=173 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=358 second=103 amount=-1 +kerning first=372 second=93 amount=1 +kerning first=196 second=354 amount=-1 +kerning first=354 second=260 amount=-1 +kerning first=1114 second=8221 amount=-1 +kerning first=8220 second=258 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=932 second=196 amount=-1 +kerning first=939 second=916 amount=-1 +kerning first=1068 second=8217 amount=-1 +kerning first=8220 second=1035 amount=1 +kerning first=84 second=305 amount=-1 +kerning first=293 second=932 amount=-1 +kerning first=356 second=8211 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=1043 second=1044 amount=-1 +kerning first=376 second=8212 amount=-1 +kerning first=8217 second=65 amount=-1 +kerning first=913 second=936 amount=-1 +kerning first=1168 second=1085 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=358 second=256 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=8220 second=8220 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=932 second=333 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=8211 second=939 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=8221 second=283 amount=-1 +kerning first=256 second=936 amount=-1 +kerning first=354 second=948 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=358 second=171 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=915 second=192 amount=-1 +kerning first=260 second=932 amount=-1 +kerning first=8216 second=196 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=194 second=939 amount=-1 +kerning first=932 second=959 amount=-1 +kerning first=315 second=8216 amount=-1 +kerning first=171 second=910 amount=-1 +kerning first=939 second=949 amount=-1 +kerning first=932 second=233 amount=-1 +kerning first=929 second=913 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1033 second=1038 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=376 second=193 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=1168 second=1169 amount=-1 +kerning first=89 second=349 amount=-1 +kerning first=929 second=258 amount=-1 +kerning first=936 second=44 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=40 second=354 amount=1 +kerning first=70 second=198 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=913 second=372 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=8221 second=349 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=76 second=173 amount=-1 +kerning first=197 second=933 amount=-1 +kerning first=915 second=961 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=8217 second=44 amount=-2 +kerning first=8216 second=959 amount=-1 +kerning first=256 second=372 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=1091 second=44 amount=-1 +kerning first=84 second=239 amount=-1 +kerning first=932 second=291 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=321 second=39 amount=-1 +kerning first=109 second=84 amount=-1 +kerning first=923 second=221 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=358 second=263 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=8221 second=101 amount=-1 +kerning first=354 second=197 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=8220 second=196 amount=-1 +kerning first=8204 second=376 amount=-1 +kerning first=923 second=84 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=308 second=125 amount=1 +kerning first=356 second=351 amount=-1 +kerning first=939 second=195 amount=-1 +kerning first=317 second=8212 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=358 second=192 amount=-1 +kerning first=221 second=41 amount=1 +kerning first=1168 second=1098 amount=-1 +kerning first=354 second=341 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=225 second=84 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=8221 second=46 amount=-2 +kerning first=193 second=8221 amount=-1 +kerning first=102 second=125 amount=1 +kerning first=8216 second=291 amount=-1 +kerning first=356 second=239 amount=-1 +kerning first=932 second=363 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=354 second=963 amount=-1 +kerning first=195 second=8216 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=8220 second=959 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=227 second=358 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=939 second=8230 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=8222 second=221 amount=-1 +kerning first=260 second=939 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=936 second=923 amount=-1 +kerning first=965 second=39 amount=-1 +kerning first=1026 second=1058 amount=-1 +kerning first=8217 second=160 amount=-1 +kerning first=932 second=245 amount=-1 +kerning first=1059 second=46 amount=-1 +kerning first=358 second=961 amount=-1 +kerning first=1058 second=8250 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=1066 second=8217 amount=-1 +kerning first=358 second=234 amount=-1 +kerning first=929 second=196 amount=-1 +kerning first=933 second=962 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=968 second=34 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=8217 second=923 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=354 second=41 amount=1 +kerning first=356 second=303 amount=-1 +kerning first=84 second=8212 amount=-1 +kerning first=915 second=970 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=8221 second=198 amount=-1 +kerning first=910 second=46 amount=-1 +kerning first=1168 second=1077 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=326 second=356 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=258 second=932 amount=-1 +kerning first=933 second=256 amount=-1 +kerning first=1038 second=46 amount=-1 +kerning first=313 second=8216 amount=-1 +kerning first=160 second=89 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=358 second=289 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=910 second=945 amount=-1 +kerning first=934 second=44 amount=-1 +kerning first=91 second=106 amount=1 +kerning first=70 second=308 amount=-1 +kerning first=913 second=8221 amount=-1 +kerning first=91 second=1095 amount=-1 +kerning first=319 second=221 amount=-1 +kerning first=1040 second=1026 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=8221 second=194 amount=-1 +kerning first=356 second=8212 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=1027 second=44 amount=-1 +kerning first=1027 second=1032 amount=-1 +kerning first=196 second=933 amount=-1 +kerning first=319 second=84 amount=-1 +kerning first=354 second=367 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=358 second=74 amount=-1 +kerning first=915 second=8211 amount=-1 +kerning first=913 second=354 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=934 second=939 amount=-1 +kerning first=910 second=198 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=8221 second=337 amount=-1 +kerning first=932 second=230 amount=-1 +kerning first=358 second=371 amount=-1 +kerning first=354 second=972 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=76 second=372 amount=-1 +kerning first=8212 second=221 amount=-1 +kerning first=256 second=354 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=324 second=358 amount=-1 +kerning first=89 second=93 amount=1 +kerning first=8212 second=84 amount=-1 +kerning first=1058 second=8230 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=904 second=912 amount=1 +kerning first=356 second=193 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=358 second=353 amount=-1 +kerning first=8217 second=281 amount=-1 +kerning first=8221 second=231 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=932 second=271 amount=-1 +kerning first=1169 second=8230 amount=-1 +kerning first=910 second=194 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=192 second=8216 amount=-1 +kerning first=224 second=358 amount=-1 +kerning first=1168 second=1090 amount=-1 +kerning first=932 second=65 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=933 second=192 amount=-1 +kerning first=258 second=939 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=306 second=93 amount=1 +kerning first=8216 second=271 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=932 second=347 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=917 second=912 amount=1 +kerning first=84 second=287 amount=-1 +kerning first=8221 second=285 amount=-1 +kerning first=91 second=358 amount=1 +kerning first=372 second=301 amount=1 +kerning first=376 second=265 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=358 second=8211 amount=-1 +kerning first=1168 second=46 amount=-1 +kerning first=87 second=198 amount=-1 +kerning first=89 second=308 amount=-1 +kerning first=932 second=966 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=1059 second=1026 amount=1 +kerning first=193 second=87 amount=-1 +kerning first=932 second=238 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=358 second=225 amount=-1 +kerning first=902 second=8216 amount=-1 +kerning first=376 second=195 amount=-1 +kerning first=8216 second=65 amount=-1 +kerning first=936 second=260 amount=-1 +kerning first=933 second=961 amount=-1 +kerning first=8221 second=308 amount=-1 +kerning first=8249 second=939 amount=-1 +kerning first=932 second=99 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=329 second=84 amount=-1 +kerning first=1041 second=1035 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=328 second=356 amount=-1 +kerning first=221 second=349 amount=-1 +kerning first=160 second=8220 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=173 second=376 amount=-1 +kerning first=8217 second=260 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=358 second=305 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=376 second=8230 amount=-1 +kerning first=8216 second=966 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=932 second=44 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=315 second=39 amount=-1 +kerning first=84 second=941 amount=-1 +kerning first=102 second=8216 amount=1 +kerning first=34 second=256 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=8221 second=242 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1038 second=1026 amount=1 +kerning first=358 second=273 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=932 second=299 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=308 second=41 amount=1 +kerning first=86 second=8230 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=229 second=356 amount=-1 +kerning first=358 second=277 amount=-1 +kerning first=97 second=354 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=193 second=933 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=1111 second=1115 amount=1 +kerning first=923 second=89 amount=-1 +kerning first=321 second=376 amount=-1 +kerning first=8220 second=65 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=84 second=916 amount=-1 +kerning first=173 second=358 amount=-1 +kerning first=102 second=41 amount=1 +kerning first=915 second=45 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=271 second=316 amount=1 +kerning first=221 second=46 amount=-1 +kerning first=8216 second=44 amount=-1 +kerning first=8216 second=1032 amount=-1 +kerning first=1168 second=1103 amount=-1 +kerning first=354 second=349 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=356 second=941 amount=-1 +kerning first=923 second=34 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=87 second=93 amount=1 +kerning first=913 second=87 amount=-1 +kerning first=1056 second=8230 amount=-2 +kerning first=110 second=358 amount=-1 +kerning first=358 second=351 amount=-1 +kerning first=326 second=932 amount=-1 +kerning first=8220 second=966 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=354 second=236 amount=-1 +kerning first=1058 second=1044 amount=-1 +kerning first=1168 second=59 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=256 second=87 amount=-1 +kerning first=932 second=974 amount=-1 +kerning first=321 second=358 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=356 second=916 amount=-1 +kerning first=932 second=249 amount=-1 +kerning first=84 second=949 amount=-1 +kerning first=936 second=197 amount=-1 +kerning first=1026 second=1063 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=8222 second=89 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=358 second=239 amount=-1 +kerning first=932 second=259 amount=-1 +kerning first=933 second=970 amount=1 +kerning first=1043 second=1096 amount=-1 +kerning first=194 second=8216 amount=-1 +kerning first=932 second=112 amount=-1 +kerning first=39 second=256 amount=-1 +kerning first=226 second=358 amount=-1 +kerning first=358 second=100 amount=-1 +kerning first=929 second=65 amount=-1 +kerning first=915 second=8212 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=160 second=8222 amount=-1 +kerning first=932 second=923 amount=-1 +kerning first=8217 second=197 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=8220 second=44 amount=-1 +kerning first=939 second=913 amount=-1 +kerning first=195 second=39 amount=-1 +kerning first=8220 second=1032 amount=-1 +kerning first=915 second=912 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=1058 second=1078 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=913 second=933 amount=-1 +kerning first=8216 second=974 amount=-1 +kerning first=1168 second=1082 amount=-1 +kerning first=939 second=258 amount=-1 +kerning first=354 second=297 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=1118 second=46 amount=-1 +kerning first=34 second=192 amount=-1 +kerning first=358 second=45 amount=-1 +kerning first=356 second=949 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=932 second=326 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=84 second=265 amount=-1 +kerning first=8221 second=267 amount=-1 +kerning first=358 second=303 amount=-1 +kerning first=256 second=933 amount=-1 +kerning first=354 second=945 amount=-1 +kerning first=295 second=84 amount=-1 +kerning first=8216 second=923 amount=-1 +kerning first=915 second=193 amount=-1 +kerning first=1168 second=1026 amount=1 +kerning first=933 second=8211 amount=-1 +kerning first=221 second=194 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=1107 second=44 amount=-1 +kerning first=932 second=229 amount=-1 +kerning first=915 second=58 amount=-1 +kerning first=1068 second=1059 amount=-1 +kerning first=84 second=195 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=34 second=961 amount=-1 +kerning first=1168 second=1118 amount=-1 +kerning first=319 second=89 amount=-1 +kerning first=354 second=198 amount=-1 +kerning first=929 second=44 amount=-2 +kerning first=221 second=337 amount=-1 +kerning first=313 second=39 amount=-1 +kerning first=1075 second=8230 amount=-1 +kerning first=173 second=910 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=356 second=265 amount=-1 +kerning first=1035 second=1026 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=84 second=8230 amount=-1 +kerning first=8220 second=974 amount=-1 +kerning first=228 second=356 amount=-1 +kerning first=358 second=8212 amount=-1 +kerning first=923 second=8220 amount=-1 +kerning first=319 second=34 amount=-1 +kerning first=271 second=98 amount=1 +kerning first=354 second=261 amount=-1 +kerning first=241 second=84 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=46 second=34 amount=-1 +kerning first=354 second=114 amount=-1 +kerning first=1040 second=1066 amount=-1 +kerning first=8212 second=89 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=356 second=195 amount=-1 +kerning first=39 second=192 amount=-1 +kerning first=221 second=93 amount=1 +kerning first=932 second=281 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=260 second=8216 amount=-1 +kerning first=932 second=125 amount=1 +kerning first=358 second=257 amount=-1 +kerning first=8220 second=923 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=354 second=194 amount=-1 +kerning first=358 second=113 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=1068 second=1038 amount=-1 +kerning first=935 second=912 amount=1 +kerning first=356 second=8230 amount=-1 +kerning first=939 second=196 amount=-1 +kerning first=1058 second=1091 amount=-1 +kerning first=358 second=193 amount=-1 +kerning first=328 second=932 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=1168 second=1095 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=76 second=8211 amount=-1 +kerning first=372 second=256 amount=-1 +kerning first=1113 second=1098 amount=-1 diff --git a/art/font/myriad-medium-small.png b/art/font/myriad-medium-small.png new file mode 100644 index 0000000000000000000000000000000000000000..628dd2b8f441b68faa0a513e41b918b993f9e71c GIT binary patch literal 21803 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 X^VQjgADuryPytmXO~q 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 Gu>S!~QhpBr literal 0 HcmV?d00001 diff --git a/art/splash_textures/bg_color.png b/art/splash_textures/bg_color.png new file mode 100644 index 0000000000000000000000000000000000000000..469e01f7418cf7b392d05087db90ac08f47c3bd0 GIT binary patch literal 1918 zcmcIlO>f&a7}`Kwz;3(jy5kPpVZgATFS)Za&KTk5{tM&z zB2)mmXsEHsXGI+@dgc;0RAc?xHjQOSbJjEaI-zkI9~+UZgyC5}V93QrmsrS$1iPOb z7^1EXyEbwFL?QG;hZyb8RM{$?h9`qB+Fa_XXHJ`@3~hTppIdXslGVgUgb*8I8)Kj% zKz&&>bODNbZ;dbzHLJ3+$z)+@M4HI+re`Xqs}k~Z16$OsOiD0&K}#E1P?xk0jN|)5 z^L!IsH^U2+rR94oa6P^(g?%Dwd0sIwybwjRw@y}0Wh3jUyo1~3^Lq?A+axT{tJzW> z&TKIgxx%hhEL!p_!>AIpk=0nr*}753>x@Pe>Ba=cCvUQX%X$4wlWOOP0c}Lj#1KOO zJ%Gs=JE5Z*=YIxq2;nL;R#xD&q1y#Zo~4)DgvN0=D(Z$7OpFFSQ<1W=jE6qtu5eHS zAaxO-uImGenGXWbg%GkqgE|5Fn5cWli666F|E{0HvIR1aSzVj%i%y zjpR&LvE)kK_uh}9=(v(;Hd7z!la~j^Xc+m3_&&fEG7ZkcR8~1vUdwVi5q4QjwDT1W zRqkO{t2SS@Yw5N4wjIqfV`vb8p4g;bq2upp$7^gR8FLhXzW8Yu* zGV;c@z7|oP6?(Wiq}0Ram=lE(yi$i)^$Y(-9e__pgZ_B;2lj-_-|c+-_K#1)>C?`u XzjuE9^T)mK^$9r|9u0mzc>C^OB@Ixp literal 0 HcmV?d00001 diff --git a/art/splash_textures/splash_bg.png b/art/splash_textures/splash_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..dcba81c24cb5559d1ea60fd10a65eb8b5c15d103 GIT binary patch literal 82501 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 literal 0 HcmV?d00001 diff --git a/art/splash_textures/splash_logo.png b/art/splash_textures/splash_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..889009dbfe33608003c72477ce0c8f7a64215af7 GIT binary patch literal 9331 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 SbYkKEVkdi7N|EiZ{r>~+Y?{;n literal 0 HcmV?d00001 diff --git a/art/textures/align-center-horisontal.png b/art/textures/align-center-horisontal.png new file mode 100644 index 0000000000000000000000000000000000000000..928c01a37e7c958b72e41698d188dbd766e7eae3 GIT binary patch literal 1249 zcmah}O=#0#7>CB;K7qSdGauZ3KKyY9u!f;vj@Ehin95oTkC`s1IhQp^Spo0`{wHK(5d#e z?ly{|+S3DahO8alyTwPoXI@<&B}*4hj^PoM!)4WhR9r_BkWQOw9%i7bPhEHc`zfmB zi;*3}W6EiuAv2(Qm_Ws}37ew&V-;J~CLyLLVBWBz%-1LL3~lI9W;CR5ik*N3V_@2W zBhy1!ZF*9ZbS8G3?ymr1z=T+(D`wGhK_$x6>;kg)u33hzLGWahSq*AT8Kx7+fpjR) z=hrwsNQb2WALVXHlI%B^+f)q^l{IcEhaY zu9b-tjIF3P%Lh0wr5aGz8aTV;6l>0PjfF*MLJPYD%Qvv3N{Z5eZ)nyu8)z42;NRRf zM7!B38?qVbqLQN#k#qaKuxyZUpo)=`MW|S>_;3MXURM)RgP>w5Ju2p<`Txddfj2UDE>?&0`Uo+FRr5&0`Upa#<1#>vib5 zj;&vjG4QsH`6GwM1Vf9AtwZMX?84kjGTXChIi9V&pZLA95^D)jyIUSp?~=2#SH1=5 zed6*9lz$wuY0z~^PQbLpZ{3-6x%bWv=}FzzM1*nwXNfr$oFnaI?L78 zJ0}ibdvr-Tce&@o{0))+d@FH#^WF#dA1=-e_8yn?p9`I-#iiK3?vIP(K=Q#|cXNe% gZ++*h4}8=Xj=C8;Ik+?@4tPJEbaF_3baK4<2Z+mx3jhEB literal 0 HcmV?d00001 diff --git a/art/textures/align-center-vertical.png b/art/textures/align-center-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..90c7a3e4c446f64cb36b4461700878cfb3386836 GIT binary patch literal 1230 zcmah}O=#0l9FGjd4>m**R2+-hMbYNvqgmT$>)4vsRm_~VZWTn9=Dl`dOI}RgY&sE9 zK~RQQuRG0y;zd+Y{5W_}1i`BZk0N+bLBxYlU%ItUSTT^i4}QP@*YE$&jfwH2y<7Hd z;W)0hFs2vTx;=U~ZDilcceke4vYY10^c1Pmy6IzX1d$5n3yxXCMQozR`8PPtaXnw` zQkj;GWCk2eO+Iwy+yI6dp=B4ceRK^3z6GJP8DS-;vN6GDiH~_r9Ew?z z9On}$QPzeMsl*{(VP_yEfg;7E6x38GDg5dqFmFDp!lIsE^~FvZVTMu<0#L8l#kwjI zzXs$~Dg`73C`ybWVnM^DW*BpW!L|h*2bOPp)Fv(;Su`tTo@N9V=}HQY*D>n`t7T#Z z1EJ{wS(KubT0mrVaNfK>*K&?5fakD-T^cZ~+`+Oc8Ab=bu35+FpaWXOe{)+G9h4d# z21Oi@dEa6pR|li8Jec*dNr_(~WUgKDi5WskFhe{(n{8E?-#=x$h}44vYdBapDb5H? z0WBuQW2#h=6{x6CNgkBqP?A=l20?bUu^v>Fq4qD7$&XBG{uhiaSS7w=G7apgV}a+^ zTHXu;7TkcEu7wMFMqufQwvC{sXJt7bPvr8lD$BX}Xj0Qgm27@UO=xN|rM9^`vF0Ns z+FbOPo9xPsdOFey>e#n0V3hZX!?*N+cK2AcuJ%^BsCz6!UAce-1ELOH)3NOh2h!oUf!lk}g1&3Z z8@^vohkKrkEWSQxp~}_6ae3c{JKz&2bCZ3OzrGHX7jIlSHvMh4{_y4UnIAj+&DY<0 zxn}d(#h=^y54{t`rO&m!pWdH%K=ljvPR9D>;@#<mzweD4^zmE>-R^e Gul@n%gn{V* literal 0 HcmV?d00001 diff --git a/art/textures/align-edge-down.png b/art/textures/align-edge-down.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec85f2f2b89f6cc3aefdbfbd0a7505f2887daff GIT binary patch literal 1295 zcmah}TWAzl7#>Wq+dwe2zO=OAFltfSo!j0r$BY_xW}8(f*=`n-1`CFmo<^ z-+%l5f6f+0-|6dpt(Re#zWj(c{S(A%^LBVwWb#q<$Eh*x`%_!-bAV*$gwZFZ2v^4iPYeDz>YzD|fzRfo&=5 zL`oNQFN1z&F=xsayKgTT3L!P%AYy>fnRf#iDs0Oxr2FWaXF&@><`i}< zs7bv5ve-u;#iiq>ASOXZ=EPJwBWKfR1}!L?GYQhAhKx8;3`pA z8tGaJj@L2k2J2;_1>-}*<3&!0QfdJ$vxD=h{(Q^1W%6hqImjge#flv)t&*;H;2WBC zoDMo5Mf5DU4befV?jgR20$lY?Dsp*y6qX0GJ~9aQOBm0$D_)qz1P8O&1KDh=!eG~g z?OM1N?0$}eRD&Rer3$3tLNcBZN}>d%1e6Bf5|U65)}T7J>~eiWXbL8!|3InymO+gF z1zRR8W8X2T26oi3yysS0-gF)2-GCUbiSnw#()2jnwqQopl7k1dl$H}EQPh&dxwJT( zkc3=XkR?r!+guf!)kujp*LucHcjZPs9ccws_Zj%{DjF^IOE`J;!<1S6M@txxB(XuNTh&i3uRI$R2WSi11A?+obwaAn~{ zp>pZW_n!{-H{W~l+V$AS;V&aQ4(`~0^N*cl-`acYe=!R&=G{HZr*CbM#h#`XYmB|J zR9%4s{gU?0rcK=CsdK-+q&^x*UIb5nUw!{^YVqs7yFXoN4!m$thK(^CT=?hQC%<{8 z=6zj1Bp;rR07FRrJre0LC>lpiVgR+mo~w%z}E_4Nn) p&wn;G68l_yb62piv*+)ZrE7#=?;5xuF13WCE}V$tr*nVoT+$;sTEH5Xdbb;%_voSiwkqt2XZ=Gd-c zP}wI$deMLAuCBT%C?OF{sG9`orl^b3n}P_si0sU^t6i7_XWnxT&-1>|`*H5}_MB?0 zKTyvwOk=WJOH;cmSamz-|Lp7g1Jvv%i7e^IL!_X4i0L$O4uPbt52G~F&528ksGVVI znypNhWK*XV1KVLez=VsoOW6$5-cfXQV-yjPL&KJ%vR|LQV1Z?-?0}TwQ*IpPt?o$= z^-uO>jLA_$Hrb97puMP22R0%)DB5F=uM}0bNz}4RF*3Jn}Y48QX7sP zzg#F9NqG4m) zMh;18Doby|re!KpYga7MDMb=pLL9<`*p?8)xGcyLj0sU8CRDgd$0xdDpbFR86fEzF~~<_G8Cyvuw|~fMeb!T&HX=Ij*8)e=Kj;{$`zfUV7oE8^sq7f z$e|PO(a~OO`Eh|hiw8-qGgEw*`?bE_QS)R@1ixo)JyfTD&Q{%7|I|M{R@c<+zJGqD zrTMrlUu&pZT3lM1UY(!U_DJ79zq!4-v!;1uV)Wa7ZFz2?{^X8MiLb7iy85zi?ZB&s zShRL6G^XF!b@5*9`RX&XU+(Tzt0H|L4>mmR8>w3XBl}{@Uxp8TV6%hMxzO&Jr>png c9$jIo8<;uc+|B&*;f3JcCKEl{quAi}KLo;60ssI2 literal 0 HcmV?d00001 diff --git a/art/textures/align-edge-right.png b/art/textures/align-edge-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4d99740ab3e063c1cda176c13027825ed6a5f3 GIT binary patch literal 1269 zcmah}ZHN?Q9G}!gq@xImP7ogF%o5$1XJ+*!VW6_ltn&5QkYPbszwFkg*pxMj9O_ASf{|h`;A}w{-WvzDGfNnlCJomEeQI4IGOfQ*z)IZ#Q1oGvMuY);SZ1}Z*&+ItmM?+l;CW)NT4VX)PkXW>*=^Qge z9_dO7UeGh^N2_Jx1(RbtkQE6gDRqF@>EVL8u-S2r9ho$VM|>7>tkT2sDp^(!zNT5v z>!Bl7B@c636CKss0g7o(u0SRQ(2emP^O{;7Q8YyDcZSAA@Aun?HW&O)&BK*oJ&QkKBFoBA@L~D`ue<|FTs3c3=TKb@uxLdw$UT zL^}T3RZyJD<1v#gWt8q4+|p?3L6&RxwU`%%yzZ#=ho4iWA81s z*?}+OpZ_Y}+w&&)Vd%o{UvGariVvL{ZT|D34N4DAeDvG3^{4;7k$qyLF#Z1IeCgiT QTaq79r95U{D86;O>7iZ93M3y1*tR*AzBZ-41qxG?tJZRcV9Y`-JM;!#%ap3*phf)I`ejSY-ir^ z=GFb6NMdOK4}Klc6KUc>62Oaap$Qs7qlg-#7h_N_LX451#3rOBgg4vn0!i0NX5L4B zzu*6RPK}Q2?cUJ0f#bOD{IFhNYj5~=tz+L;zk6qlEicgQINgs+v}zK>rEENbK;AXW zsDMnne)u{X_*KH6Ro*EV{_c#P|Y{3NkqW}Dm$LW-(C2e2ac`r zW2zwe)1IdAYAhWX|CInfGh)Jj_P?W*y!!v8dF2RDHTeZbb z8egH*hk{V8R-;uVib+|JlF6hX%7QFM7$OqXJ!;k>Ua+mDprgPdj!zxzfl$$$z|&OY znWrluxPDvK3s%#_5+>A4Uy!0=7*Z2xTWy>_O{SX0ZA(B?$VDCv7*=XyS(Xf=4PR5% zb=&BG7SN;E)>1Q>w2CjX!~7wYN=b{y);T zU1sA7$&!?fr3VsnB9Y9< zYFg2AVxq;>u{9mmpvAQxapN7iVK;|Wf;uA38_3QP?1E+`pwrnGrK8>|*Y4~~tRq)o z&In;|KGv(PD>eY(wmo_5(4Jl7v4JIQGQY@?V{ED~=k-*v_VYJ|)N`|-=jQeYv&*NK zdybsnboJxi`fvQqwL3plX1lh;40zrD>6eW+#69}_r3XDd@1FhW_k9PuFP@Ory>|2K zUVi@Y^YOVO2cG&?dHef|XLfuwcTy#b*Y+uU`~P@<)0fKPOykaJ?e!0iUrD{ZesTFl zzx)2LU30_tc5Qj~&AzSuo7eY6mj2yyFSjs%!TfA;;lrUn8_JJMM+e_4|9vc-y*+c| r%wJE}b7v3UU-;zK?VZEt{^>o$jY9I@-6e1|{5j>bBl@T5LvK9<8i}Tz literal 0 HcmV?d00001 diff --git a/art/textures/align-simple-down.png b/art/textures/align-simple-down.png new file mode 100644 index 0000000000000000000000000000000000000000..b69caba910a03ebc5548142b5d018b026e56b46a GIT binary patch literal 1050 zcmaJ=PiWIn7?0Me42JlJ!8*jZ3`D^;d0DeIVcpg?i7nVUy5f3KOp~`ZY{`qso6QD- zs0a$`Nj#_r!HXUg@#x>f4vOMc@if69o>V-k;C$)Y>0vJL^4|OS{l4$_{dpJ0#}0ON zMmrgX=_=%v65V%%YwKqEKl0}CB;9(5S|Jm7iZpZ&F&PtA5h&Pt4V92?&YgIPh8QNY z*D6;?rFcj-upQS!Ogyk%%4V3Mk-*iBX+%I3)hs8?etGna1(um+C&eOPbaSX~<>x&# zF+Wx|=BEwGWJiX>01Y7)%BoR&=psZ6rXEjT{W9Rszw)?co&E?3TZ zNGI4UV?5LD-gq4o?ANgia=EZu39xU{a!lOt_lMGFcSf!F?X57B__B8YH@p3(g?%(`i^z-Y51!dQTAKyRKHr_cbkCv)vZe!S6#-e)$O2Qmb|uMOI}P~Z8t@o z9@L8<>>wzD2e0DYgH9(n@B{Irc-X<4p!4KKtS{Z#O;|CIybpfA|JU#T&#mF1qg&c` zw=oQ}B{QI8>AF35TSN4F`rYjjy6ht9QF0RJNm=(0lQQub0vTH`pe)kO$@BB5hhf%# zvvQ+kR2zf_wmCh(a24C7Y=-ISt+=`|jtCe-1&DQDX39x7|7T|AjWk? z3_*^jcrlSk@PfokQiLKR{-i_nO2qNQbqfme4bO6kg&h!B)W>j%Bv~5iQVO=)Fzfis zWugV+E4s^zoDif`1DZwy=a#&Qnsd|O(FC%QLwt%A8(3N;O>4l{G;7-pv`?~VCAT%v zes0o5d=~k*OsE`vSC`F;veMsnpg0KYDuxaHdn?Pg#LaF?wPW1nRO#|k!XX{i0E9h9> zbqY0ang%nDPjtsX870Zm^f=2hVN^}1{bF2BtD+=|>CRMCR?MUlJfTm>7Y zK#4lnT;VEBxj|0{T0sSQ)&*p$9=1VE4`?-yCDqj4GS_S#OMg=?PlMru4qer;^(#6C z!L~7f^w5}K8_k2%dE^B5Ezw17((S5mPXa7i>4ne|@>h1KY~-vq?iTyd19ClPf-+S(z%E zD~qOT@#B|4CWOp@gDC=`Q+ERxX8D#~$oA2-$b%MyE@t`Npen{R$Ppidq%amUB{>07 zsvsxFQflfVP}o_N(xM{8Bo!v(P*T9&!!vKbRfQ$Ju;+`NvV4tF4~k-=(GVJOf%pre ztg5OgDWamp7$O!lU5dh(8w|HC=r}Na+oLvdL1YollO>wvS){uuI9|uB8|;;d6-*3~ zC(42prPKmiW(Vgj`Sq4_%M@`PJJ_WG!^#~jtCC@K;D?%ZoDMpmCA^>8q3EF8^srdM z0a@}*CUSK+3d@5zA0tZqG9mSL#iwh8lAuOBkju3y49?Hmu0S$Mp$4(+YV%NN0?NsMpiF)XQS@K1Wx^`)9mF)SqmC6lccJCY zFksOQC~{3))U!NGPq1wZCe)m!6(-btK~`irpP0yN@d8^CiTp%bOQ~(HPRyl9i8j~T z=W1QKQBOx&K^^<{GPVjnaX?ECXm^h#)z#h}*XkZix+_;?!H7|Z9_ZNi6&r(S+nGOh z=u9wn+1UDQK5JhHGOrU+_Sa~o*Wy~xPjV>OZN(M*Lu~* zlNm$1e)=`|EdAPSY!5xFH!KVTPcqJo~L9u&L?3iG8~>x2~p$@}2<`+xoZ|6I)vAM5Sj z)6FnUZ|=BSpzF5q-PA?Drxxc%>9U(-$H)jSlbY@!CS~Fh0y$f+paRm(`uUe=fMGhn zTE#Ikrk#KWws}3o@PX}8Hp2`I2Ci;QAOcFLVmV3n+p~EVSZ0zPRWwm^Gicm8KINg2 zso|nAHDM%7cJK%o2p~0JBcg-At~x#pl5E2+r2Ft%U_k>yCX(z*P-9viWUz;T!uNBA zC`Cam!AnYiED`GiGCd1oT#!XhOh6?9MH#FFr9?cPRpn^5$yKp2 z87k4_nt!?dZMk7jhgv}udDaDF4tdxH4LzXMK9)#Zd#hZteJs(oT!987gdMu3W1ClW z48m<|{^+4K!N{Rw>(TlA(DS5|&h}hRO%;Q;rQgfTgPjVqz4JEHb0zrseP4F*=AAng zb3^_5jm^)V?|nDFrE>Vdp-<7J<@xEO9Xp0*XWv}>Ik>0mss!}vxrHwabC;ejO_$Og z*SH_M`k0fmFLr)=|9InbWs&E>E~&shI@Wu?_Nr^<^TN`idh71+T_ zLWd5;uA-x;n<5mP97GCk>gM3!P(cR=ML`jlg1%hut`44om-l{;@B4m#-%hzSJ2W^l z$S};1F{f4NzD3vIz%ly&wKaT(Zl{P|BlCEL#8!xyf`gY4Fg&Y{D#&uyuf0T*4AVE} zR%@hYUQ%rAaaM}q5-*@^hMAm70?Te90+vzT^;P!Uvpp8Lj><0NOx_HNsNv3SglK-F zRJAvnw(PJ|7r|trPyr7S3nbpEA1R5-wsaMGPOl*gS`gAy*~6e}W*HQ5h(L}T&)B>m zfeD!ta^n;7#04Ny8}fN5@)=%Ma#@8JLHlE=x6oNpD%woj7qwKjK}euL7{@UeXE_|! zp&-jLproPj31456f_jsp&Jkv`yf@cmhl=K-6?7EuKZT>}dVpXBMR+Z=Y2#K#Q&)jf43R}}SjBj?Q^j%v z6C5>g0E)#{)xfz0*LQFnoo{hWQ!)IASiX%6O=YPH=emxP3Nr&qkakD+S={R@+^{k=Ly^frj5PP7Nw&M1Vh3~1?<~qG& z5qfeV4F;yo{j1rXD>^~xu{*ld=ng;f>BNV0wBP@Hv`L?ZVQ7VF^6tyqCqoPv&@M~6 zFJ3)8{kr^^jBS6|d$Sl1pS-pD>Fbr9o8Rvq+}Io$x!-@4$(8#`pZ7m5=70Y<=-)p6 c@WGuEOU%JNarW%~?dR!ZGxU^Fh98@nVIy^iw5C=B@+B8jA-P)ve#dVafV+9YIC9iAPk{6TLHSKK! zCtd{)1JQx7iy(OMqGN(5cX1aF>R~8&8@P+?BIrxkPKCKZ-k*=(@B4n=pLf4Bc|AHX zI6zTUv@ouf$-YefOZ_LwN=Nrr$#xOvs(1?3a8vgnl`+vQ1O;24gJr0jtvm1F2u1Z> zwklOzElwx~vKc+ZFoEq7Hbsq$2Ci<*Lkwo&oaLnH@2@s#V3}!pMl5ngSA}(JyzRlM z_GHCq&l|Eyk6r^KfkGVE5bGeY7aU&+(sakKLe8O?r9lUR=hO6osA{nUROCS*GRc_1 z@d+Tw3@;`nS-J`Ya%Z^|D{wJRR>Zi%384GYB${W|l(LrZ#v->gUB}o}Shm@0GR-)H zyg8PaWtrs!RuEzY5%XIP)`OVi5A{4~&^J8G#TIfv=uw|V4V~2?y@|?v9=xN)j|8X4FAYD675%7E@aElM-9&){iqG~$fS112MU2ijiMo=VM7NO zv@}gDjA@yQn&5;auX4GRpz(Yzk>$0drb%ixm5}9xmg#W|j*oT6fIY5t$j#=Ds-13uD>Ig3qNYC_mba@Gde$N|^B%H6r#^~xgoeDxX_64n z5)EoczsQLxKAuSm5?OM2y2~|>$i2%||I1~G7&dI~U(N2B$OMJQ!_g&|!{LVxnRt(k z_QSKKDe^293tFZUeA@lU54_>}^ZL#9x%azYyw!=jCE@(ny$$~7XZ2|?J^k9O?Orez zcE0`E+F6QhkM-5pPTYF@Ly}%R+Iki#o=R*}gLNvpvA@!IDQ-Ub*B04dIo literal 0 HcmV?d00001 diff --git a/art/textures/alpha-bar-25px.png b/art/textures/alpha-bar-25px.png new file mode 100644 index 0000000000000000000000000000000000000000..b852d001af50c57bcee90c8f60fa6fb331773c2d GIT binary patch literal 1027 zcmaJ=O=#0l9M2SGjMa;mZ47*7_yxB4=+Z8s-RzRqb(k@_!iu|?CU0%rl9wfKHtQ~B zdJ(({gB@guCwEXhc~DWj$Uu>a9u!182p)ubawnNDUE6uE2J+tfKYqX8|MT6Pp1K(7 z8R(%XDwLg2a%5j4|6unaveKcS8)WOp=>ncX^SGk9kV+Y-2tn4;N-zgCV`XU@CMfFg zX)|BI1@)4oBP*f>n22vVgiTS2G2hYj1&BcrmP|WI*PlG6foUY^SwUr0M}}o{qUyq# z>Qr8@F6g2`kBx$aFA)I?Vh#A#qU}k3l5Xfq5FgzP(MM;QCEDxF=O}x3ryp&TiO<%-H(q)VtiD4?0N~98v zAh*PDq9`&f&+vShAi~~?jWs`PdqXV+1$w$`I@m-u2o$vtZM27T@F3oQ3VZn#2QoS6p=DPmjhi0|Tse~LLJcD~kI-VP ziqmC;kyl0zkmW|zz}Z>THc-Vo*WjqCl(jvq**eTBNt&ocOw*7u0;|ON=y-aBmpLvy zJT9=p2p3Jo_&8b8nHE<;`mzOW+~OJsT)87R7zfKCo)zet*PxMckp&uQOJ?U-#EyDR zuF*M`R7WmDf?i+PCi~isV^%StXVCKmGW~9jk%f z3p-bzPCk77t=eBYa_0EEufKQjYS+m@{g%JJ@n~yn{mYxZ%`rLjvX<&&zke3?Ufpqi zy`2liPH8VdZ{Ll(yU(=I4^q9p`FLP)vVrQB>#NsykJg)~}U&3=E70o-U3d z8WVdj8TwBS6gl?se&y*3>m-wdD;v1Kb{|-D&{y_G=@Egj{f_Bki7I-J&a|)4+mo*@ z%>H;$nT{=At+$u6#`%)s^PkUKez#NCSrI7ruy%uYo@1AG&C!I*Kd#@A{_MPV50~Eu zBV6{q{?1=Zvm{#{cWi b@BPpCTr~O2WX?CBC}Hq)^>bP0l+XkK^o6!Q literal 0 HcmV?d00001 diff --git a/art/textures/border-circle.png b/art/textures/border-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..86ed43d800b82a6d6961df12a0f3ede8f3c93674 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xawj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwQOJ2m9E#t~bGoa9OPZ!4!jq`IS+2$Q`5NNgMpQ`V` zyzU`SUWR~>E_*@a0-pB9OB0tqVc0TFCrgWuL3hU|)|klI&vKu52&n&ClACrv<6qo^ zIfsq^)$la1ZeV-HHNSyJ* mo$MEy?pgACTa5hVddB=uelt%9Rb>Oc%;4$j=d#Wzp$P!R;DuEH literal 0 HcmV?d00001 diff --git a/art/textures/border-error.9.png b/art/textures/border-error.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0df41a662415bd270e279b5f7cfcf247837fca38 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=IZqeIkcwN$2@Vbac}_go&vv+8 jqOJR&#fhef&?E*1c~)Wl7yd#WK$Q%hu6{1-oD!MWp|Z8c9#Wr59S~!-aQD06;vdGBB+;G9cK~`(T3`(`uV>9|Nci^ zElr*1?K#v#QB-f?q*f;T{&;mK$p7c1))3hSuwKQdQ60C;08)yLY7i7$vjNM{v=`3Y zgX0v{HRM#PxLQ0VTgYY17{f%aPuLVSJ`wq*H48DQ!G`1I=vV*zO9RKw(bHm)EBY#I zIwuzcczSWFVlB>El1)$K!FVJS2QI`Wh}=0Zl%pKI=~pJ_*v!&k6M|=R^e0i(VhN}y zfIwu#l*I`=7?l`a%t$;x0tAjvvpmNNQi|v0%&5#~LHnagw7{;*WzA^EBDWmf#MqZv zw$*Aetu%vz2Fpv5#Bu^F2q}U{g$o`wqm&m8c06b>v;xP+4)Q?k(X63)oTG`-Pbs*5 zvAE^f3)_VvC1WGgXL*KWT{q5a6CL6*+?KH;I;<@CkS)Uy%?B3gM}4qECbj!|pcqKh z$QrWdUFhM0mZOPmxfm zXvivKimvf#T^H3@za&i>k|2yKX?2VjIhAg6?HzJ&b2DG$vP29UH}|t~>wb@Ku~I8iueFub+NN!zsvt+h>BSFm-|!up_Snw)K6CMPCmHr<1) zqT&^Gf*`0*f(WAcChTFuhoS605JA)j@kww41%-LiwbO^Wz{xr1M$xHRj;3YixLde z(QA||q*6F4Y1j;@J|^UuHf1wRBIVhtHi`(SqG7{IvfrkrSzzc%b}(At3$~0#jQ(*4 z9Um{2wee9+)Y;S_knkkxz(hm^o_WS{B`?V~{Yv!gn>iLVA!IbkE{UoX27rtm1frp6 zP~!y%VqyqJBO-(cfxyEs2YF5qgAhuQm<0Pk>tks&M<0?(O0E@)-jeJHA-2SEwOTDy z3x}{X%t28UIbPrdAxIHHw{8*D3tDbZ+k=8!%`t3ZU<>#j)hZq%NtP;IO2M=Xg=NQ< z+bR?-8Rw}s2SYq(ntonQv`b3puZ$JZZn~aLDOejb zkwx-KlBJfAZs<}*%!yFWWU@Iv4PiDCkHj(xnG?->nGPJ7`!suDSdC^0w3>$2f=doP$l!tdC@@prJ1v zPiGYv&Ss;suU`~1IZ+T|>98D!QC?O*=-Y@Apf{Ly7aO< z{K%pc@6genv1aG!v$&F1(q->m_4ndps^jIv)yCSxlhu2bb+biqGI#Oa=Gl{vI&VC` z);ZsJ;3WcIzP*~e-RaCO-aXbm*;we^6^K3bUf&LsHn{U24!qdGHWt=IF8!MLv<=kB zmh)3T?(JdvPhI}by|2%0UHf?YbKvH!7t?&a#v;X6h SJL&uWTg_*S%Jahj~pzJq)k8BFGN}M1G^!F6fS(l z&dhrZ2(pSIc1V#qhGA?>(>$?|L{8u)B34{`o=08RQQ!B%!8|zd{8op$t|^Kl3W7j5 zm^L^NcU&9YfG%l=h{U$Jf5^xPDYQiG)Rws&MlO0 ZpDP@vQg1MSA+Z1e002ovPDHLkV1itPhOhtt literal 0 HcmV?d00001 diff --git a/art/textures/button-dark-down.9.png b/art/textures/button-dark-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d393c0a3bdc0a05c11f10382b40cc7a94e607c34 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM5!3HEhoL#F9q^5hiIEGZ*T6!g#>#%}=L*Vp> z-1k>Rdw$>Fk~G~gbQaIjgx6OZofXdfJ z317_Jwp3)nf&BB9%tu8J-B0xDWH}sv`~&CVIy;r$3%}1}aegkt*>){Th^N;OC~$2S z%m2`&A^~q&)=v!D#uvt+C?`>LF8}dSrwaMqIS&`jii_|UpPP1b@8;?)KqoSIy85}S Ib4q9e09>9@0RR91 literal 0 HcmV?d00001 diff --git a/art/textures/button-dark-over.9.png b/art/textures/button-dark-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..71dd8feb67e465483b90344aea15d42ca5b11147 GIT binary patch literal 220 zcmV<203-j2P)C+>Ww7d?EDj=2+=?E(?2PtSI)UqbfL5@ z!Wd)O_nkrrf3;29BHXr()^)w5Z4us$P6(G}A&&FXXr5=5=ixL>EC{{#EC`)*EYCx0 zEepbN99a+=V^|Pstyvz2LMcTY2&I(7fxlxIhQbIBg!MCe*Z8RD!l!M;jfblHV0{5G Wm@RCFw)+GC0000j}I%DDr`L=#hK-Fjpw?@8a0V!E|2TGO#aDVwOBQApVZ4)Cr+L^asHvy t+c$6aI54?n)G!5|c5rcQ-F$$FVa1|-HhQK{VdE=}FGlY8oYhLbP0l+XkKCkiku literal 0 HcmV?d00001 diff --git a/art/textures/button-orange-down.9.png b/art/textures/button-orange-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..75e15d05aec3ea345f1c8ee74eae5f61d4bac52b GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM5!3HEhoL#F9q{2O2978H@B_|x<{pV~bCpwd7 zp2MFv^zopr07VQi+W-In literal 0 HcmV?d00001 diff --git a/art/textures/button-orange-over.9.png b/art/textures/button-orange-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3760bb4abd28faea5284a7cf89e25fdec494d1aa GIT binary patch literal 235 zcmVA ld7f*;#qUbOMOAxYy#V<)dMZ&A>mvXF002ovPDHLkV1n!xVNw79 literal 0 HcmV?d00001 diff --git a/art/textures/button-orange.9.png b/art/textures/button-orange.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef40d64865e6579fc22f4b0aa101ad0f9c1fd65 GIT binary patch literal 238 zcmV~MkI&q(rIhItc6V2Ro< z{_5B$sK-|-Eel`yx1W2C(C_A+f$N&HU literal 0 HcmV?d00001 diff --git a/art/textures/button-over.9.png b/art/textures/button-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b297372978caae3bd91b2a271f51b1d94587236 GIT binary patch literal 233 zcmViR-5>e7Kl{F`;1$S& zxKRkLwWs%9Qp7F7)aZiHIVTL|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfeMTNpd0}qmJ)J-y2TvEr5R22v2?u!pIU9x@IC0>> zfe#@p+nI74e(^FZ3o}q$>#R>|H8*t0(%cTD?k45O<7raUK7{i949u0DN-Ej Um4ye4fo3syy85}Sb4q9e02Ti=Qvd(} literal 0 HcmV?d00001 diff --git a/art/textures/button-resource-over.9.png b/art/textures/button-resource-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b8fc77191cc5705ace2017e3cf5f581ca1a7e431 GIT binary patch literal 1002 zcmaJ=O=#0#7>+o`7;NfAtq6Xk{z9Aov`tvt+N9kI>lj^O^$(UN-`21tUrfH)Y+lAd z!GqvU#M2JmrYK$%4|?#h2|IWaynFGo37)*@m#(cI=03>x^YT3J`@BDSFg-OsG|v=qxVJCE7L$n0R%E5r!7w4 zK~`aSSyFgD1q6;4S)OABCC&4ylvVi*=q#E<3+#EdYLq&$$V;P}82c*AwpuNwB{C>j zV0lGRSWaLCAx#kJaK*!Bl=i}8*Mk8=D{y@5AP>YI%?4V=8cme$r{MaPO3$$ub_zvG z#zv;k@(jniZk$&e9pWndE8{?PSX=QSTZJK74lL4-`DB+&YIk^`7)aEp2C|l2=;5-V z(Zs^oj;#uME}PMLt|aOOo-ay@oaKvRPAtk#a-ANRD;>&J^#Ga} z1vP}0y4{;@B8t!Qfi@r9n@6UbcA3mGgJ7*mImUy-OdTrp;#^c|gFWg+0Hd2#swcU@2 zC#Sb4@a5676Mg+-$<)vLYcu2W@Ue$)gzwysNyWRiU)G}cYBu?yW&wu{|^V6(}z8@9>BWY$gh zB)wF@gGY}ALGaLm2wptci(n64JbG5}q&*5gC)?fDLv3I(Ge6(=|KI0TauLOWD&2Bju{}PXyXO~W!GFqRb<-hclXdV!wg+= zYIRbt%*hsZ(`JlGN3KuV3^P3w`KHxE1T@g9<0vTHlj+n;5 zDhDM=;&_1*gcL=j!gY_BQOXOa1|D=2T7lye2YVp)Xf|-0C@fWakb>)1Du<4}uwN)z zGA=TG4yJj|b>qBx=#W&=k&I)}VQt+)2|$$RlN4 zVW}l;JGLxJYMvK)-4Hbu!cwLH^M;`cg@Ovjf>_iB+_D!E)3eZk>l|^l6S=Y$Ad}#r zhVj~>Q&Zqh&NBClyNt z!RYDF77RUG%!;}Sb2+2L_PO>kx%av1f4LkL!^O@0r`ZD&ouK%5IJ)$5IQ+&061u|a%)d3Sj9LSg@+KJ+>HV(;bsM5*-l&zEyI;KX_D>+fGb9?hM# zna8bn9}=gAw#LT0+V1nGlbf5y?PUAO_pwjPcs;qXy`|oIu#*J4OybqVe&&w(Gk$yJ L(!9Q-E^qt=TN*kX literal 0 HcmV?d00001 diff --git a/art/textures/button.9.png b/art/textures/button.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3799617fe4bc49ef90b5941e442ff00e745fa4 GIT binary patch literal 242 zcmVI?t76Mmbp5kF7Hedp#LFvc}7h6hB(g41RrLQ}G;ldW;{Lst!S=UuL z4~K5}jY7CA%RbLDP1AJAZ~PWvNc0^ewAK;_?mmtqalAwNIUI(81!3R!EC{=Hq)$ literal 0 HcmV?d00001 diff --git a/art/textures/check-down-on.png b/art/textures/check-down-on.png new file mode 100644 index 0000000000000000000000000000000000000000..5478800f4cfb0e030dd64b03a9f9a9bced0b3cee GIT binary patch literal 1196 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHnUOIK58Q%7T03uhBULst_^M*{$o&6x?nx!l_pu=oo!a_7M7d+d~fBlS$hp_SEdN%RK^n`C4&u=OyY?3-#A!qo3QMUA* zHvi%8^*T39wF>vJCrbz<|2?+g;LrYtm*d&mr0=@~@VH$3A%9})^WO&&4t-`hv;9de z=d$zlq6t5aALv*#k#%PAe|Gz3o8Q)KvFq;h#Q1!dY-!jO|G)7FtKpu8hsP%$VEFNQ zexu_|=0p4c&E&Q15_NwL%bnM` zu%&&H-~WH| zilX`odA&&X{&;m=Aph%m<^$QT;cOYtpaonv14w0TRDq!2nv1XqO?&139vq{n^FvOl zjLXIy#X>G?#uzqoeZr=wvGK?^ttE&-1uijsPJT6jGpkc2 zYjw$zZF>AB7>g7l;6iMI$X)hAB~s~zu0qc7HAjO61TU%dX;5Wj8fYkhKw?K3ix-k0 zC9{GwnvzpDfJkhPPje#A@UkK$6kY_)k0#y%dqFAcxu!2-sdN=%U*WiVz0TGXED9Dm zL6&8X7dcU62!aV$JZwgc7Y?=*bQoHJ<6{STAXYRhsD@RVM0%Qn>$hdSuvsQjFfKBE zPGI>sr54aI{ttECHaf&bcoy$Jg~QT{54j=?Q7y1Y;}!;ESH7YJ(8MSxA++48;&c^Z z6jqTBG_6rJFg)vcHmZjs4USlrC0YB@QjYb~yhteOiw+~V42+)PJqJPxi;JnJxU9zZ)6AQv>!R-DeUq&n&~xpwDR z(jB=R35JWC`&YADS7d_XV|#Ro(H?&2k%%SrX*_$v}8*3MA}zpuV}J<#TyZe&Y|V=Rw;5 literal 0 HcmV?d00001 diff --git a/art/textures/check-off.png b/art/textures/check-off.png new file mode 100644 index 0000000000000000000000000000000000000000..572b98dbca85859ba445f6bf69c0f42367e97f70 GIT binary patch literal 1006 zcmaJ=O=#0l91n;hbCba?ZU{ay85`JqbnV)N#n~mP3oK)Fh4tWO)8uu{y5z;=)nvW+ zbrL*n3_J)Tc=F&uJP3jV*+tkz5Dy+a4MaTb;$^4#(zTrjYvAR*|Ks=j{XgI1#f6&# zeItDoMGa_kN`dSb<8}TV`Cpk!d?wp4R!evZRdHzekjh!80)gfjYp?(fYxB-0I89M! z#_VDVm-KnjL=I!b7$$N&!ltO{naDHDI>ev?*KAj!58v<7z_uiMIjwWLC&QXO*Yx31 zbD?N9>!x7QGuOd%BoYA!Vgp3Zh8u{HM7MNBa*nTA8nhs|F3~4JmGng*BOih^GnFto zJ_RxY!>6Y*LgpGs5}W0+Y?4cGf|#BZxg=<75Q$*Z#YU8HgVBzH0t3^xJ!~Tv#EM1*HLygJNKaC5ysoSpw97;a z#zuz6@(dTJ)B)=H|Dlf4MF+S5PviZka8TUzAX|U|YWOB;Ty->d<%zNn4UGIELK~eb zF4ho6K@E98mRnT=dp)iwB> zdSP#?fA7JM8_)K~Cnk>OHBH;v+1VLi*}ZpMeHR{n5AyZ;uj9S-*{}P`tFb}qr%?ez xPu4Hvk>}el4$ls8M=$SRx>{@YecA3GEK|214S!tyaO+L{0yT9(c|BWx_y=TWK=l9s literal 0 HcmV?d00001 diff --git a/art/textures/check-on-disabled.png b/art/textures/check-on-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..20964dc727ca83207830bb44fa3ced1c5695a1fc GIT binary patch literal 1193 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHmlGh<6vCksbc3ujY9Lst_^S65>vH!~ws zXG$o&6x?pH#Hm*w=oo!aP6Ewe@UcE<5kKc4!c*Zj3`#Z%`q*FTxo@O<uE^ug4 zxKO$x-S&Bho$qxvRk@5KX5k3e1AOmybpqR+78{VVK4Mreem5ekyx{{ zU*{gIsEGK*@?FApWnV+9@}zopr E0K*)masU7T literal 0 HcmV?d00001 diff --git a/art/textures/check-on.png b/art/textures/check-on.png new file mode 100644 index 0000000000000000000000000000000000000000..42b425b8b756e39b447a39cb4d9b0d004d741fc9 GIT binary patch literal 1211 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHnAM`I^LQ%g5j3uhBULst_gAj87R+|bm( z+04Mn#RR6;B|o_|H#M&WrZ)wy*Uko=x=FMKQ zu5vj;*`wC{7#{h5N&V?!8MmB0m)rk0Hav2_^nkdx{)~o`>a0f;6pz}nzVc+_Fks-( WigRc>^!U>TEGn}gjC)^H3$sPT7+e2Ijb*@;W$NI8F4FB zTs5C4Hu6|2!LYFx5H>}PPsD*`FF_1yaMATu`uo8L8n}*1&q*e41{$op#kCO5uFX{J zwIy42=!r*QJXVN+2eAcWZ`qHOSf!h~3fU*e91WTfyrj|>MODob&`=10#AXo-FM`%XlWd{0pp^CLRxT2$bRFYB;kZVl!8TGX3Kuy+ zmSv6?IZEryQM77k1*^a!gY({0LjV4GmqTi3;nwjw0p7OjgQjg`6e{LLr??@o8Nb zc|9j;TBb17=IY2^@t}{}T<4OjcjYE_@B)%qhoSotI@2NYK=ay)+r5^2SG^Y3>0ZlJ zS1w12;gaG0HSG2gaZs}DSeFDH^FyCFJ|xyYySbJ87S9YlUx`20hK7dDoca0P>xVo2 zhZ|of-<-VN-~V-TdRp4q+uIv`KCyo8a pKK;4bxBH_!*?%joUj1hD^zzixyLY}E938z+5*dXV{oU03<{z!gJN^Iw literal 0 HcmV?d00001 diff --git a/art/textures/check-over-on.png b/art/textures/check-over-on.png new file mode 100644 index 0000000000000000000000000000000000000000..a833bc834375a378b6e9915be9d84d7f7c2e09af GIT binary patch literal 1198 zcmaJ>TWB0r7#@{u+g#d$fo`Rj!$i|cvpbi)54&#GnO%3W8`kY&_o3=eW=^t0GIORg zC*4gDHfteLsy@V*R17WnlANM3vhXt0$oxJ9t&ix!1oL2B{RDk1UAHkji3w_;BbyF18mq|-`vhH@?oi6e{oc7!#%YK|J;uB~LS7ZxP2^Eb( zkkRFFn1`}DefmonrKl$cwL%dWv&RJm>0a5vc&oZe*c26wS4~-&fEbLzam|R)cRyXB zfu_djlYuOoHAPs~(lZu3F*8z7W+s$~O2?lA(W*cMbckh8)h7*GsK)4)u0ZzAF++nE z1W&~1heZ{$IUphnf`B*ZQCQ9oLJ=<)2!fv(zym zFQv9}ktjx&F*XH;sZ=W7iqDIzafXXTA`HtjJntb0k3DT*x#}_OfwqDKZN<_|tRVw9 zit;F$!ZDgu`tS<6xh-qhTWul@W2&;ra9-BAQX81f{y$XLx6wAv!$8)EXIq?XR>&AOmJJ1F zq!>+9yqcy8A&%#hJ~5aKivf;H`ooD}D8&VMDI8?|5+}B~5>lpgXy7(ieZ&oQ-WFHwTuY!Mmm$S4&T#)V?Di3Hkh9&kE(x~H4-MjY zi&*=I=&m|NJ$5J~B?{H=M*I8we^*PTg`U;<-qrfr@cWIW%a{LZG@H5k#l^*=uf%H` zYPhzsZV%@Dbt>&i?|G7YPj$!H#_ff#a*gF(S1+8q)Yn^ccYk}!$MQVe*!<=3eMgqK zcmCLW7UaJE`};3??{3)gt@4f6cf2JJpZ_^>_L&>v+@8(-?lbE*6Wre9k2P0nPFnuF z_oa`n)rVYj#cvLl?)9zc_1&qd13moO_1B>5-Ib90RMDUo?_Wq9So-r=bNPee(|Gpw zwdBgddeFzZeetf}?yqy|gP!G!v#A_4xp}2$?eK#S>w)ISb9V+WdBBlZH;-Na^_E)N!3HEB$FfNSDVAa<&kznEsNqQI0P;BtJR*x3 z7#KxBnDMvega1H5$r9IylHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS3OrpL zLnNlIJ#&z^i9vw%;zEWk9K0c_Ta;D8lx1`}T7({$$ixW8SX!MtFBi9of%(C~c?{wS zo*S4%1E+sDw@zpVQ`!TURh)ZL88jN)@6<09%Ub_$Uug7wQ%SE(f>&`2*$H8)A3Pgu7oPeMRI7cJc|ni(-{NfUZ9t6-p00i_>zopr0ARN&R{#J2 literal 0 HcmV?d00001 diff --git a/art/textures/color-picker-selector-horizontal.png b/art/textures/color-picker-selector-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..ad355cf3dfd97a8e5dc673b3b4ec110a66535306 GIT binary patch literal 2765 zcmV;;3NrPHP)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;wH)0002_L%V+f000SaNLh0L01FZT01FZU z(%pXi00007bV*G`2j2n>6(J{-Zcg+7000$9L_t&t*9E}=0RR91fRO&57C{9DIMfLE TLTuPl00000NkvXXu0mjf8f-GE literal 0 HcmV?d00001 diff --git a/art/textures/color-picker-selector-vertical.png b/art/textures/color-picker-selector-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..1617b251a9e00adac1ff16cf91a41cefcf5ff48c GIT binary patch literal 2767 zcmV;=3NZDFP)|D^_ww@lRz|vCuzLs)$;-`! zo*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!& zC1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2hoGcOF60t^# zFqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTXa!E_i;d2ub z1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqKG_|(0G&D0Z z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl z*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY_n(^h55xYX z#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^bXThc7C4-yr zInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qjZ=)yBuQ3=5 z4Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK%>{;v(b^`kb zN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<)0>40zCTJ7v z2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01)S~6}jY?%U? zgEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j*2tcg9i<^O zEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfK zTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761jmyXF)a;mc z^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQqHZJR2&bcD4 z9Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^TY0bZ?)4%0 z1p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK8LKk71XR(_ zRKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS<&CX#T35dw zS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@qL5!WvekBL z-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW%ue3U;av{9 z4wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#o zSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%oZ=0JGnu?n~ z9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8No_-(u{qS+0 z<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-UsyQuty7Ua; zOu?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimkUAw*F_TX^n z@STz9kDQ$NC=!KfXWC z8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgUAAWQEt$#LR zcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6?<+s(e(3(_ z^YOu_)K8!O1p}D#{JO;G(*OVf24YJ`L;(K){{a7>y{D4^000SaNLh0L01FZT01FZU z(%pXi00007bV*G`2j2n>6f7c8Xs!VO000+BL_t&t*9E}=4FCWD!l2Looe_d6LkB?E V2m5vUz6byS002ovPDHLkV1gS-H-G>D literal 0 HcmV?d00001 diff --git a/art/textures/cursor.9.png b/art/textures/cursor.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aeed93c009400d3b42ab1dc075b312153c328178 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=Sx*of anVlj05A)5P{1ZSr89ZJ6T-G@yGywp5i4%_i literal 0 HcmV?d00001 diff --git a/art/textures/default-pane.9.png b/art/textures/default-pane.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3f9042d5cc7bfeef2f63a2d50a9dedf68aab56 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!3HEdXMMW?q*Odz978H@B_}vE{P&PxR8dix qp!(1GCx`63dGiW-7D><>&kwQOJ2lM@&60C`#>QzPZ!4!j_b(@4h{be*p!)>nVZ9E rRAV08I#lMSmLh6!fF;;hfPrDV1siMh`pd6@Iv6}%{an^LB{Ts5Yq}?` literal 0 HcmV?d00001 diff --git a/art/textures/default-select-white-over.9.png b/art/textures/default-select-white-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..971638ef8f60b3383d45c9673d669b305e5a6ce1 GIT binary patch literal 1475 zcmah}ZA=qq96!JT)5;c&D2}NJ-C+-w zIn->?3?_?7)h{AOac z#JDI30ZwRX`WloWNZw5`9MK}dml$4-nYlE^tjFSzjUZ(edYt2T0}ZVMQBiVXw=RB; zp`zfzYHdLx825q(aeJ!*YFewpeCuxBDPR@lXqnDH12Ld+s2*#SR7Q7U8M_SJr>}7g z%|Nu>E^I!iNU$39$_hYjX1j?eNGnP^&7{pvJL%_93Z8Mofm4Kua56RvLs00#gF$bK zP|t)||AH@ga$yac7H4ogkw};m7PG8Gank8@;sk|LlnEkCYKx?Cx=B)vSqm&sc}0wC zqAa0li(H-Dthq24>3j;YcrdtVSW*`X1xtqOTpTCO1Rjf}^U9!AEd(Bfu_Rgzx5NP+ z0;=4s@KBF>W0nkS_h?61pujKU;>}89CQpIKK_iF(NmF4^WF{gQIm60)bNV*Gx-jU# zEQkW*a5^cU%}x5Vq?$a2L8T;h>j#;X8M zla;V6H)fTtZjd!uZII)r*PBrm-CQe5f}BvdWcg+b+QCc=rCzvtTaP9 zwh~r`Am*V#SrF@69){XXq%BNZ8IooQ`@f*D?F3Ha{ueCpOuekcIH(K#&|Mz`Dcw)wzlN0VggwcBgP z=v5Pjir}dR{@nTQP2RlW^@iJTJ#)gaqlqn8eJ*)wa#MTCP&+%)UHtYNr~9vuU#=Mn zJ$YjG#|@hwulcf{nEuRC^-1{SKerLdA5zwW53bxDJ9h1<&cmaj_rdWG=WHd0*$HlZ zYRA!>Ycb}=ShA~pnW@xNnqPb6-u-)t{Gy_wKGT7hXV3rqy05+G*U_#c-@n?nQ=j~* zzVJ; Oztw=Riv7s5YyUs1djZP; literal 0 HcmV?d00001 diff --git a/art/textures/default-select-white.9.png b/art/textures/default-select-white.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aef4befa7a886d53e51cc8bf6e2c7b70e73e4a0e GIT binary patch literal 1492 zcmah}eM}o=9KH?4kZsAFVOk8^c@QEQ*ZXM8wI`*cy>@F@36?ID7$e8sTY5r!-Sx1A zgfK=#Mj~PU10hR@F`^^HZ7Nv=%`gZuqnXA;5;si=!q7#*gv~iYe6M_LCO9v-dq46# zzpv-_yR+qG$M$7pWgrN$&wZTp!ZjPdPo}5A?;q)$1Q(s^^s5zeK#lPVKuScp2B7W` zUkki|7aLDq14Rgua$EBGRlny1E65=|uVM7@Pz16Oq{tSJ@IoC>(Hc-Ig{|1)=v54r zL@QQl@{pd00|cexO$w-JD)R|Vb%I62Y{h6%oP`ELK;_YRs6HHJ<5nzbmxX)nn!wN` zM6I)8>p}TF<)}ke0BX_~;sQw-QO2UDOofbvDL`p>CP*_ulQ?N%O$L^v(TxX#-V`yw zdO6pIFL<(IK~;^g1QCnH^f7~8R%!{#VzCe;P0%zB5qPvQtnzU@9L?FZz=5csND)<% z!>DGFuaO&6D+VK7PazcXc(x3OqZ@^SB_rZ|grM{!5ejK}CDBpU3m$~AEjsFJi~zz5 zqH=>GKs^FEn`BtKM?2aCiozBy(xB8Q^ArUF)PoQRt5Fyfm5c~R&T_KQpxwGTD+V3t zMM-2WM!U;IQ$|;b(@s%NqnS2SX3FAn+Bve2F_mb3G_E@wRr#<0Ho4LRuHlhf)}a7i zl@*^X*KaCa9+Xu%8k8fb!;w@LeYR2xi*hWQpY*rR0UWOaD+ZM};iM6#86Ra}jSNef zkB~-|B-f!HS(E~e4?|5jW%5x*mSR}i_%A4IJCRrU{{@Qz8<3R{54D%HNg*QPTCGRc zOThs}dIg9sMGm1!ky&Y*;uIQ77{<;~PKSfm3TtN=+F@|I%r1kWkSQ@^8(eW4Q8u{r ze{u;J454-CLmj($1;;?!Zp|M&Y)vo-!?9K1e115QsY8$*EpD#F7yrIyWo^yYHZqWx zl74gK)T}M#P$H2S3kHKzW0RAUNA(K}3)R)F?>C>0clEWWJ!4(dP3Y8OkM?(bm5Oy--k&-(y#Gbpp8UR}XS=da=a#Om{>9h}vbz%#feSZh zSNERpryPmrh$qH#s*ZhuPo(wEd2|DV=f&!34!3(3dw0&Jj2_DKHg|R{uFeI_cMlHx zi|({OR?y|Ko-Eik^WF5pu@mVhmwQ^@oO?C1Y}og~@{N|f_MflMjlDcy+{52n>ECtn zZC~jpM{N1D|Kpa=F5P>J{pUcx1U)nn~G$g)| zHdt}4`F^Lrl+U_$dFj_1R}LqNSMT4cqc36od&JI}Z+m-tr^tq1eC@HtAI}NIl;B3w fa)uA=&PUKOBp1Ic7;befY5!Tbvy6MsUVY{tj93iE literal 0 HcmV?d00001 diff --git a/art/textures/default-select.9.png b/art/textures/default-select.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4399ea2b3af7d012af2f85a298e51ef69c1951c9 GIT binary patch literal 1458 zcmah}eM}o=9KKm;u<2ql76U5oau~8r+WY9WM-OVDy>^sQMoQgkre??8OF5u-_3ogB zDP*u1O$`5tX6Pa;4zrEKk;O!bBPH`=k!f7wjAmOVIFn^D3(mz2Cm+67D4Pk+OYYu} zJkRgz`Tg#VhWZ^FEst9e1lbs>;UaJ?hHqiM8Gg+#-98PMB0Uh(8#z5F$(L=e+&QZ%N=!gZ{mB<#F_v8NMB$VQM#Z#u~fZ9qqxKwOeN*xY9s z43$I=w#OMJ!bv}9k!reC(AZrc6}sC5w}^S4MJv-RG>`x~kERptvc{%8Sk^8J_r^7j zp;?ID=D}8iiiI0czoG)vX?NKKf}~N#Z6}>B#?6$W6g=ZZIZhEa!p%AzEJ2~G4+g!d zVlx}zf~&sZ$%D1%dXmNQR4QdpIqZrW$4R%_jT013Q8tLMXb`N%x1B${LF4>{BXY&*V9JGT3kaZ0PMP?&{k+Ym4bQrfG&VxY* zc2N>pA4$RJ^MbQmErKm6WzE>u-evI9>-H3@Y!m5wwkBqNIbR8I~-6 zhM-x3Sb>HWQEKkGAL_J`&L~Mk97|IFg2J{Fd7b}Xuqd$2ikje|_L4Cvcv6lVJ+e{? z4yaNm5QD0cK(ivV(mKU)(bWv&QU>kkC-O!<0e z=TaO+rq7)#D%y$^7Z+R0(61){zVn25bhPb&dD91T-l5xzre8`?`Qg3Wx1tUE=dO4@ z^!6?h=Pl#o<3y;Y=0blNc<7PS>6?Am@67#d9T_P-xa*W@spY?JU7I~d!Lr>ld5bpzqW$xNm7?3GhT3SU{U6~vx= zujfR}a^}X#x&sqic3TMI#C_VxV(fG_py literal 0 HcmV?d00001 diff --git a/art/textures/dropHere.png b/art/textures/dropHere.png new file mode 100644 index 0000000000000000000000000000000000000000..370ed445f66e5d39f094a1f4426297ada19183fe GIT binary patch literal 16398 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 literal 0 HcmV?d00001 diff --git a/art/textures/expandable-properties-collapse-on.png b/art/textures/expandable-properties-collapse-on.png new file mode 100644 index 0000000000000000000000000000000000000000..247bbdacf985ffc0d2f768810c669f3c62fcfcf0 GIT binary patch literal 1219 zcmah}O=#0l9FH4*Y;GPz5$C~>c~D&Q)plK;>$ckLqp*z8Rn}dGY4X~IHF;U`YTJ1b zJ%|JG1BQ2D2SxBa^`NL12c8rKr$_NHWX^#ojMbN}?Ix@klDxdf@AvzEXKr+4u(i3Z znWCuH*pM72>wfP!u#dc7$H(81i?A^e{6XRCvXX!YN~D)`4TQ zBMEJGT9b69w}7fqyaa-Nz>9R{Vu&?IPlLETP_adJVP*vZN?A_^z_1Swp)x4!2|5740U9 zHss>aML9l_(Ny;0O0v8sDgAOUECEK1b*QkC@H_LV)egZT?1+4m@27(;dLx$ zTbZ&oMFBC(#j2&jm>gzEc&uUQKf794U9Q*DUaf!(9pe(z2OMP5<$3_4zAs{3y$V;a?~A`Kmm|(_UWe}J*y<4( z1Mjmoe`HgeU}%xCb;x{f96ceC*|uVGBvJU3+9;KJ8`&3!7nT$mTpoH%%6wfRVYbolYL(&`~I}F(EG3c zc&p$0{cWP76bTI9Y)ZeszI^4_o`+4NZ7ozo3-#nn=iK)PAC|n|O00iGetiDowZHtr BgcSe) literal 0 HcmV?d00001 diff --git a/art/textures/expandable-properties-inactive-bg.9.png b/art/textures/expandable-properties-inactive-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf04925df16d2d4c4fb4a21906596eebf33db29 GIT binary patch literal 1212 zcmah}&ui0A9FMDvIX3Vx#OdXcfjG3uOP2n~V|A>}>I%!4U12*eOp&>H#%1L408!nP{d{1P4Ro%FL_{FDSj@dL*2{ZMSF71$FpnG z1#@l5R4sn&3K*>;Cg5OdfV#8n2B@Cm8@h;nhsPoh8W6ga;t!mf*JnV6_!z{5c+`ZF z0urhq#o`GyaT&;LFT$iK!zffyYy?3WG%uc6^Q{ufYuTnPwoCDglzK=MYqgqC8xe?K z79~|xMJS819A$`TuSvP2=i6u;| z8=fc$Fbt^yw9GcntN6o{$6K=b%8wqwyjVb#N8 z9tWi2o26Ze@ICkx&vW5)WiDjSPc}bGB=dS}=TsgEfQV6wfLU zi$ZoQ1qmVrBB)-13WD$esuRmDtsV=NkRts9W#zXFYWx>$nW#j3$6z(E!;Td_x7@I% z>nP_2)NoCl(^5POPq1wZsaaLYsxXL`Sa3oDstgJ<_qQBQ^%%XM6tG zrai&fWn=5J`FwEy;|81Ua!wmB)V~&g@9&RAdY~+KZR`&YZgOu-uUdWBZI#nIkN3W9 zC+?nlyQ{?GCC*syIV)@m^VT(O^2hU=*Q@V$ojQno*XHT-To2?P4JYrc3_QCR{!elf)7n;g;l^JFH<`(9vYYYNb(`7swwPtvTj&Ztm`!Hy;%zc% zGUx8yi+UnbXi@L6f+AX|6#Rfn3xZNON(&ZBpGtiZUlbJl08vypCwsfw7Oog3nfVXD z-~aoc2xC8ajV5ba&mo8UvYlY$o*#0yAj}qeq3tXYCbr0e7v!a1zWiDeJvT2M z)hu9zCRz06RwFXMT5UM1OOD}6g{Q^Y9^wjo!fdhUcY+x8@={+f;^*XAk;FcPE#;*x zrM)r`Xa#;a6MFlBfAT5o6Dh?irTZ`N_s^jv&7MJqU zB4Z&^ly0{xchfSB78Gb0h5}SYRZ|?1idO<=_fkPTJ=B0n>_lG3JQ|3JM!Q9qSzh9v zZiV27Beg+1NE1(((z8Pa${-1;4|JUoE?kZ}edDg9kPh)lz+#StBP`F7WsTt5s`dR5 zI%aipE4FRXabqPUN}a@XIdXWB+tZ0#Au=OkGa5B0?F=(sTcnJ}i!>BXv!7w{z)>%7 zX*WK28;4+VL7 z)=Gv^)>Syl^Al}TU_(5+@zCnH#ZAoDdEAflfu>e+Qmn1oTu;4ynSl-#ybA-mHRiYRIAl*j~|1V zul@PVHxnB-Yo9OW{*r5d;2k?IpFaD+&$R<5-%=_^9{qIfx{ZI|^(K7ih5hdoF08*h zz4!5t-nh8))f=xhcF*maTt6hvoY*v>XYASY+0O6B&z#+N#s-z~_13TVytM!P4^N!> wZLRtGe0cEEz3;6Z$#xz%@u4C? z6Ll0tHN^X*B-v}osz2cVuOzqT$aWler|}TV;Jj=>DypJU2;#b&g-Ix@g=;Tin4+p$ zv{V|W6aAusbVhbDjH8=`O;O=a$CQ;Zh`}h#YDR?q_TVuMG&MpG2NPVvjKQ4NH)+A4 z$$^wIIi?6I-FXg#9gzs=5X->P#|>L_B6Lw#Bxm=Ur9lyb$0GDjQ0c@Vh#?DtAk*$u zI9~vC2#hb--XV0H1w64?F2wSjmlMRGU*veO`_aUkrDnvW)U)f0SP?phu_>}_KA&gu zeg;`t)+Y!8%keDFdkMm87Yr;rUc+uKDM-*(EX~9kGJvZnkD>`2p-H4WDd^^&tYPn# zi4=@=WRvwVoSRY!m`MB|s_T1b8z z=j#rHgqU9-X0WHrACQ945?4aXgboc{;;Q>xsVvtW2i+u|C1`2aq1t019Td|Rweqn< z%j)fN)$*})mF2P|7}jm>U(GIEkqL5-d!tK?z2S!jnRttg_R~A)1$h?t;!-r_ydT}# z-tMg8XJ%*R>ZG?nH~sqj)w!i5v#I_zsGYgg!Z4>-S5{V@R5ooYs=5K%+CHtWtu30tW$JU4 z=P3C2ZdsXsbYuJLL3OcrmYO=&IGUvj5YmUlqI^MX?N;ggI1_OhAMcm<6P$NqLY0lCp65B?u5i zTfdslpiFX?rF@XkaLXvwcldWX%Q52B|$!ndAf+g(e_9 zPOn3DF>Z3u?_@mQLI2=slEpUd^3klz;qvnyj(4$S{iAR+Q_1luAzqJ#tsqrE$lz(Z zR4O@3oD-UPn(_Pnw2P%#)`2}7)`E_tvO~A}8VmxkWK%Ve3U$(El(Mjhf)rM|mx5+A zX?3e!CR{MOEEzQ8blE929FxiayJ}j~+d?U@ulJwCR(inzbP8CoXv(;8xjs9T!ADIX zA!w!{oNH8Zq5u)J3eX^<(OT8WlT)g$z>+mk!z7cus9Q+VWgrSc3bQy>RpB|#&H6k7 z7xP7Z3=?yQBYr0CjxzC>+sj7Wu?ALva!~_1YG9Rpth*)F9tX|9kp*C?^FWE4P$O$; z^J;4?OiR8xR%xw;ZHc9^7}{>`U(Ie@;R&*j&C$h1bNGRdC*H)P-8a8<0Y8g7q7Y7( zKV)xJDtbqDvs$fkq}(q_A5V35UOUgS?5m!{vY1F*4^K}AI<_wMu6|lRx7-y9g*pcY z?heP}o7%7#deq)!SQba@U`4qQv3evQ@vg0`96qjYZEQRsVh7vbZ*SAY&Zw~F`~LIG z`0mPy@u$O;O!fC}>5cs2=2GP0mDlg?&qT-9eLvc^A8WTmOCx8BU*FCs+<}8V#Pd<^ Tb7EvYWItpvHYVJQT)O%Pt_54o literal 0 HcmV?d00001 diff --git a/art/textures/icon-close-orange-down.png b/art/textures/icon-close-orange-down.png new file mode 100644 index 0000000000000000000000000000000000000000..b41ea58ab6af47cba0056de562805a75dbd72a38 GIT binary patch literal 1044 zcmaJ=PiWIn9FA+5V>osY4-Ua+rs%{rO_z2}Snal?wS~2muCg9Ylh-wN$;*=0wHqRv zigXjP=)sfVJbBXXu#-b4OmLUogdv^=-iET97r~dV-8@(WFYgcE_x--#@BQ9VI(4I` zyRVy~sGdYz%8~{q$$Fp7N57^ z#C$5N%$F2ir6bqDa8)1zI>a)l>eGfTRKs*bS0HQWn4v)ff=glg&{Qs&1|qT`2zUb? z#ph?i5btFJ9M7`XfZxXsGOUmB^B$HJxFLZJg62n)XqH+KGE%G=i|oR55o1$em`bJM ztqgjRHN~(z&oe$hW^GMdP zn`I&eW2&;ruwI{&QVW<&{vWFAM`#;o;IZF-3ftK^6EYcSqq3!ti!1ayp-e%vpp21~ zMQFNJ#dHy2WEYVML=jw>)C?6>?12V6nG_O+jb%fD2`Nky0k5X1LMRxGjl}}NScs3Y zY?R}pQdE>gDHII`#L*zv;z~#<>(Ib0u6oQJYRh#xK{rWc30m4LRAUy>K_g>9Ywv|? ztJmbJ?Y#urav5TVaqji6du|<(=5dxsT}w7ceGd)N>=x6*Zj91 zJ1@64H+`pT{foZ_T<)6dzydq6`)bIo?sgpLVAj1C8QJKqtuOqd;)`5;?R@R#%JNd51=l-Z)5x%ZxrrxzpX7rxDoPp8JyCqM3QbgswF+BQzP_Hm&8hD0+zJ& zv;_yJ2lC4FsKTps^c?7M1R|hAECWX$Gi-V3+c7Do)Ob*&;!cxe^4Y#|YOd(-G z86zu?&{(yK*%HFYE+G>n65!O3W~iuacWl8WNyr#BmJJ1F#0X6U0-B}@d@!C2hhuyy z%%?am*%?cQL-A08WyNqjkqpJEToEY~Iy7*VtL}1Rb-8XQ=q8CQLQ9*3YRW=7*veSY z>U-&~tGB~d>w5{;T}w8#zJ~^Bc8heicj;+Ac@Z}=SmS;luv^Y~%ay%f8j6`!65(URGFj^gY5Py&?gE_(Gr(N46uFfr4ZD1*-E3A0YEcw=kE%{>d&1Snf zVe=m^GH`==(2EBVcARVuckwXXWe7t=Z;FVZS3$pYZRf!n`11YmJkR^Q@ArPUvYCsa zw&QICL4@SAl*4nYKU$mdfAi4V9XuUFLj^Pf$5B~z05PD$F+j?uS_CeE->fIfl< zbQt*pDk#H(22EP^F|=pem`xCU{hqCA69AE8plDc0>ig0Sz^U6-}o zYMF4s7*Dksj%NLoYCuK#Kh!kqXcy(czTbZeyZLDwFgf7DDM!N>H{R)ovIWrrDuPZP z!pT|{vn7b2TY@$zie&ewVd=2!o~ghUMUX8Qsg?$0DM?`g+Awq>!Sfu;#d=e{e2U|S zdIm(1Pf77!mW_*&6iwB*64a(lV4)gU-{Ht{vg#@t5_k#hZHH0}D61gS)!;YnH?>VqTU8^4{+7{f*Ft zY`e7Z>(t35`SZr7uY-YurF2vN`gWkD*b;ldp7?oW@uj{JU0MAwB2!ej`&Gx~rpJMM zEwAr(1yjYWBM?&jP1_gfE(loj0B`MtR$ phc=&mnY*<9)cbMz+tKXWfgllFpt=qh`nUa8Di39(=Yv;f{{U)QO^yHn literal 0 HcmV?d00001 diff --git a/art/textures/icon-close-small.png b/art/textures/icon-close-small.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0904c74ce66d4a695a8ea7601eccf5009ecb74 GIT binary patch literal 1223 zcmah}O-K|`93L|zL_rBkJ>)b(D7EvkAFlIo+jM6(7aEgwNe>;Go%hxq+?hAdylqD> zX{YSuQ3#=9M0C(&hdvI0(J7)sbh1N-4k09T5Vkk#?rPxDz|8yL_xpeS{{LB@nZDWG zInc>4Om}8V$O7gn1ya#n#7sb(M{LH@7f=@IaCvDLjWbO9 zPct`9=CxbEz!t9u7~Z!W%4V4Hr0?j)A|h-aEtqzK`}OKI$C@y~&BZiPb5f{iPOZ3T zc4azetSlNb0k5aIlrdivo zmx&fk@O4L!cri$+282cv=ak)2%{ep#R6-WAiAS+g6HBY4X-)X4W-Y6U_DB{T=XNUE z%Pl)d$RZDyU4x2T7z)C2K*~ir!EO%YQlsKCMNF_)#15NE)hf&m&zUyF6>sDO2Pry1 z363fd3yINCM9fKH5E%opv8!Sfh~g1c!_X`&p9YPJAUygHl*$ivqW>2R4N$ZID> zD%dCoN;J6en5(wr20a~U1r+3(_Yq9H*kWsX0JC*0lP&Glxv+ICsg_)U1|tL=dZJ?+ zS9A=5ZFBzUp*g|Greo{U`SiZ*exS4MW|WDX|22PDttQ(?R@c{*8`~Wh;B?23!Ebyz zyH|QPGuV^d+^<%Z7XwcpN7gobA3bPWy3}*~joJPgZtQgp4??&1a`JF8zw`Z|z2|po zOX_{z2hR_G+i^^vDMvo`S6BaB**^3B?ZqXgt%KRv>f3sEu>U0ZwPe(3<>lnPhkpSo C3xQ(* literal 0 HcmV?d00001 diff --git a/art/textures/icon-close.png b/art/textures/icon-close.png new file mode 100644 index 0000000000000000000000000000000000000000..81364d47c0b8fa2acc30917527775b5dac6d1e98 GIT binary patch literal 1110 zcmaJ=TWHfz7!C|XrlKHT=QLzqhi%d|KD3c!u}w2!nq_!f&qRvrGo6}}f&?7Z)-9w%lk^moZkR(63P<`o1;d(= zHJ#});eyewV$lIVVV@)OfBeL9~H_ zpq+v+TdHDnFGSGkg%&A_#j26(TXj=|d1phBlSl}0(?N=*THG!Aw#8`~4 zlfz;-5RkbrD{*o#6y*XeFNR`ri7P=hX8;qGxY{2sSC;FIgJEIM60r5XK-+3VgDj>k z=;dPxl+~N&YUN{L%W`QP4DB`duV$C7@C13snbF0@%f<=eN@BUQoimFKvxT6_9M=Y!fOL+PW#?YGx!UCfE86@#Y-ma1b^ z)2?&jq4&eDpWSnoPB9lITD~9mP4;IVf9yC}V4~{=YWAJYece6MxaT0;R!wn7&Qx6% z_Hr+k1KV|F=ZDW{_TO#1F@JRR=;0N$t<1i~U;5^ERMelpwkS8})Rp16)$+wPW2wVy zxJ+Tu^V)mgI&W59T6o}3Xc|&@YMFbQk~t literal 0 HcmV?d00001 diff --git a/art/textures/icon-composite.png b/art/textures/icon-composite.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e02818c14a7888386d59789c923bf1d6eb4ced GIT binary patch literal 1217 zcmah}PiWIn9F9zEkdP!K!_?w}qNJP019Ac$8Ff_U&C=u6jDg^D4`%X@s^@Av)w<@)s0nVsAB zZD$x}XK_+5(RFw7Z0o1*=a1?q=(3kgRLD78B@HV?Ou@mkh%I_n4V94PG%vnHV+_;x z*)3N{#XJjb?4_*)la9TBvKeMVX{7w2u&;l@w0V=<%#JVY!u_Ue8F<2={03+Z=q%yVoDLgw?_hNy};&1yJAtejR- zHV`B>tEL56$*S4otVs7f$nhdb0Ts#_2t>AhanxJrRAEUs+P>&6&&?4MK%Q?j8tFzR zjl&u*sH(~Xkr%}jMWmvpPpmlQN247JI*RPj4Ty_oe?x^#Sx}%LK`Hkal$PJIi1lBvW5X&AJ&V@B zO*)nj{94PKX~Lo(5zDtxQO|QUytL~&u%KinG(*W5s-gCitqwsSbu3f-cc>=S$~WVF5lSl=|cT$Woc<;WoW2y?F!q!{A4LNynJ^T_%=AO zHuCDlDR5x9x%7QtaP{`#LpPg7_1>@?zx_B;eX!|a|K*W4AGfY=-g{<#;LiRX12fEr WXM^|ODUXw%6jPj-(pOKS+s0eVjW literal 0 HcmV?d00001 diff --git a/art/textures/icon-composite2.png b/art/textures/icon-composite2.png new file mode 100644 index 0000000000000000000000000000000000000000..c27fbdab2637d6fcb2c1e40ddaad719995c14666 GIT binary patch literal 1028 zcmaJ=Pe>F|7@yEg3?-FoXt^baUbSYcNU> zP5oA(h>F?Mq54IvLn=jxPpDsuowo=g>@3WX%Q5CaEn_#q0zrLl2OA zl#dt;$C7a&%JMORWrs+PVTWm!p*bPKvSKVQvLj^uqi{CQEQ@(XtLMVEBvnDk6=}L! ztwyWEQRvOktRM(9!_gcU!5$HR!9jWuas1v!1O@npXSv9N4jD$&OK=_~Da>@M1l!GK zw*xzVT_`LW9q2C2Mj6_+!@6qTKFWg~8oPS?g#{PTdEmo&&%pgC_cp*-yS)>Ij+l+8 zKx5tp4oWLY3R|M4Wr~WLk|my(wUmmrQ)5z`ryH5>chBEUfGfW{A8rbTT-UV+n?JrRUCg~YR{YlUm3Z8IDAV-wTYwmkrq!JCNSeO<7gTsemH+?% literal 0 HcmV?d00001 diff --git a/art/textures/icon-drive.png b/art/textures/icon-drive.png new file mode 100644 index 0000000000000000000000000000000000000000..8d42c8699972ef69f96d71f88126e7cb0204b932 GIT binary patch literal 1060 zcmaJ=PfXKL94=1K5Fq|Z6u9_Oj7q}RuG`pJseo%IGi+JL0*eQ-(mqB5?W^s>6;24z zsKLm=1E@#ii5L#vJSYhVIVgDWVmuH}-nZl^Qsp(e_ZsMN1tMTTtN_=TG9AGc>9Vds&fYacgE9n9iu6HH`BVnPkqtp4(Ct^* zU>HRCKrqrB<)dAIBR0dv7>@O`ybuWqEC(tdO}yFKxR8|+6<@>>=?RQ2fniFeQlJzH zAiKx}d7fujj^Q{zLHL~+6DzLYbULaE5_D8sx3G>(;3+C&Xc~(&iS!@^!#b2Tol2QV z!5CMum|%eQQmO(|ssBR_;}GrOEIf+$pTbUV#)3>1I%wKfN#n*lJXe+wx1oZOokM7< zTE)x+!pNCG7Kq2oRRdQ>bW=kmr?bpSrG%vEV8v8nQW9yR63}%`kitPOE`?Y*7LNsk za+sH+az7uHyFJmd38~WtG;x)y9dUy-x!yP!7V#`WTfYOfgpCYPPFv7x#=^-p z^(tJgW-MHyCYK?>FkW;2YIgOCOptdx99?1@4nH)>#M@-FPo4h!gFK6;NvS{QejVG} z-|zMLsk6Sv@3%wC^(#Z8qb+Ls#P=rp<8s}`3P==-mq*VpZ0rqKFD`UDYi(1F8`+Dk zUG-n$+dF;Se0ZsK!S{iU%`L6B_pPSyuLJSfZd1!kaIbzR6q_4vc%Ch+b$)6(c6>22 z*s}X%tFZd$0k!BG8s2g0B2BMuZf?bHEo^@)%uzln96s|~`gQlT_imGNT6%rGF#iXM CnNR)z literal 0 HcmV?d00001 diff --git a/art/textures/icon-file-audio.png b/art/textures/icon-file-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb3199c8ba88b6e4995055499bdf0ff0be20acb GIT binary patch literal 465 zcmV;?0WSWDP)IDEI?PlH;SL6V=UCo#G_qQOqQcF=q}F1#dHZt^Llk_nx)(z;{z*6Y3%` zR`5<8*ocTm5x6raHw&x+cR6zv;0G|SF0_NclDeZ_wV1n9YieCRQM+1kI^MnFi_S<+ zH3b~0-Jb;}B2IxhU=pb2!OMVG)c?Q{&;`r@f3l{$;uYyH(BBmQ0+vZSr93zywwhyg z6nG^0=I5osDeNb(1groPBzIvq>-#VmH~^-B8n8~%+dWxRsjdLlB4Q*WHi7#*Ls{@c zJ40D;Ta^Z@V``P8h;P)Yc*CkqaRXRO$9?H@4;V_v)%So8f!j>(2G|CAn-;oG!T*5$ z78@*4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}?N}eu` zAr`%FC-3!QaTI9TFUHF=^)!p4f#5}9zJq^iSUw8!v~aT;pY5&Xau#kD78d30abbCA z#NWg7hnZQkS+-#2?6)^f_cb*x-1Y1BvYD+Ln{>=nN*m7l++R8~*7Vn;CG)uUs+}ue zQS14tY7Xb}GL}27o0HNuAK?7JQ^T-a?hdnl@R}6H3eBI+3uZT0Cp5SxoIX=`YT3-Y z?jL%06kck4H|u8fq4>!r9N#q)q$1e!UNzkpzQ_7OveKIGvH#L=!%rf@k=!@qVotxc zVB4xP*E@?nd#l##wMi^oUmDFWOfTWl345CDtCPuQ!5z>bR`B3!h46XLS?u$?CSRMz zZpX4s^WT=GY8PZG81A(F-k|jPgZziMG>ry7;SZ)8;+dts_e{N}zh+aHg5V)hW?+yq Nc)I$ztaD0e0sv^#pu+$F literal 0 HcmV?d00001 diff --git a/art/textures/icon-file-pdf.png b/art/textures/icon-file-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..9985f113fd2a92868989efd1ac31ae7f7778637e GIT binary patch literal 464 zcmV;>0WbcEP)!dI#Kr2Qcv~#X?!LSvO)g9^_n!IAo%7}m zM=feJkz}c5%|=yy?YvXk<8P9M{eqX1oEjNd2DKkadPy!#;~bli?^o6K@W9TXb{Ai; zKCSaf;AzpvO?<}dN$}ZyfFGlW<2ZpQxNs2gZ@e0sZ{s^=#)J5F*L ze{fRM^;4|je3ILv`f;yYG#>sMq(0ywUg8|yYEJqO!CAbosybw`d648ql8;GFcUs&6K9l4|lDT&EQIB1cOs=~|_#uw~00004nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0vNJzX3_ zEPCHg-ssn4DAKxr_KpL|6IOKgxT&dMaO^#Qa8cnD_XFV%L?t++Zrqt7q0a6paVKI% z49oSy4(vZP-~KOurgGNz{mH*om$qz}J~>r-l3!!@i954r?iIK4ytFs$*Vi@n&;NR7 zwOFt-uIHMQUR9jH;nN`QxjpS$l*z}f+e)9l>RhtV``zAc0gv(*>^yAEG_S$=L1fU~ zGj^Yvv=1aND}SD)f7zb7sJXVYzTx!Nzf2N8+ngUr8F2hyFyGxH@MH4X61&=^4gHN} zEPp02&11aFQ8A54Z*!HT;?&>+OJyDeaaC}YC_TvJs*q`9d&=D35a!tTeexUD144&B WH5>^{5tP7by?1a21^5?va?waLjX@xL%= z$Vpc>aS$2=X=oKB-I|=-93*gZvbfhMjf;vuhi>?$U446RE#YrD56^kd_xzsc9Pah6 zRa7lZGKraM>2u5#MX_J&_9TNzj`Dj=*LIv_0K;9jKNUrBeB0rvE{>||QJL3Q#c@Ub z(tR)B3w%fL^*Z=LP3R`x;W5Urf@Zm(j^lM~;SCP)9&fSK3-|=j(2tLpzz|wk=mors z*PZwkp5g^w;z^SE8z(A$x9ub!I`Nkz-;$grX?Ak$pS<$p9bxAV$9q`DXN>qU+XF0O z1C2kNz>V%2Nm@yklFTMKOY*#2Q}-W_cGgv_p^fn#yk05EP$_=+SD^o=E&-2%?RW|z R+sOa`002ovPDHLkV1iOsvQ7X1 literal 0 HcmV?d00001 diff --git a/art/textures/icon-folder-parent.png b/art/textures/icon-folder-parent.png new file mode 100644 index 0000000000000000000000000000000000000000..083850d3a33b051c8a640045b3043e3936f2561d GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkEIQuu%0ZdLO%>XY?RI$Kk9-0s|NCULG- zQJo|WX1xTz##yRQDhm?b&Imd6le`Z*HH1&P#fA(KYUvGKxF}4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0vNJY5_^ zEPCHg+NkFeDB^m3qGFe(now(*RG`FGza~H3e+~-+v{Uvu{%JhN-jn&0Bg)CVBgo0f zTk-JcqWO2y-ON|-PQSnT{K<2Tn*V*D)P!G~yfh$fQaDBGGNLuh?fR2dyJmy=byz-5%3EOneT)FplHe*4EYF}~<-x=ohlg;+A z^EJeIo!QIPU{`SRx$b_(>;qf{Y+J6F6^IKSmXCdvb#!f?#47bynNHP#-zU9Jk?4Q1 z^6sJEp0U4lyP^}Uji<>zkln#(b)|cY)YkRuRxgxW^?R~G?uxTPYfZO(oN}v%;mgvC VDb?pcOa+DkgQu&X%Q~loCIB+6m`wlx literal 0 HcmV?d00001 diff --git a/art/textures/icon-folder.png b/art/textures/icon-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d87df3ebfa98ec4b2caacbb0bc0ee1077646db GIT binary patch literal 996 zcmaJ=&ui2`6dqU=SYiotN?+cLz)OyU26%|kmaneenJHR66bNf zK^x``)g~@)#TY(veZ~f$FctZhy^JVqq9yEU+>hN49K?>s&1X%~^mWw6m5l(+ZOqi| zjb&SLxT&kK5UEVSMbv_kyW)jvq;XwcmF?qWfrDKLUDmk6q8jEb)JcF~md_<^QOdx) z!b{m)UddmEDHaQ&ETqJwsHoYrDyCrX;aIl7X{j}1x|fSZ8rP=OR|TQd>F}L2Pl6>u zQWQlHQ$i}0WQb(A?olgBdf|9q!9bxMV4q^*!C291k~OMvtkT0Pxc)%a3wv#14HF{E z7bIScuha*c=KrCtJ3xoDhK}m}r*K$b_mNOTAz2G-Hn`S!oXS`A09lj-bwXD9U7T$b zO2Rhrp{{qk1~1HG&mo=gVwYo@YSjy=<=LoeXdF}FF?Q6lEGv0Q&X#3emZWl~R5FT2 zDPPRw^;|lWmHJ$R*lRBGXrJpGadShtu^n8WWj0WN?;>Y9ATI1)TgAg`Ne|WQah>6{ zWQKADR*Vo2_pf31kC=nv?ZCP$7?>Y<%<%!Ub|wB{0H{}uVmjPI%(0a9bvBIk_F6H zeR~ntuoBVVFnE@YDn@{{s5W}P(^zB0SogPa9--pnp zg0Lm3Y0dK{i7>B;dd2~=%I6GG*7Tf_o8lF=mq1=pKn564%R->=+n2z+MQ#h$P-WW} z+ZBX1r6H80ZnrCTvm%KWCD||x2`G}HWEdh7uLRUiGC@2suz+yvL|#Ze67Z=-dx0#| zg20q+h2V!nvq8L_CYCTMu|r7~K^jsY=sH7OxEyu*&Rs{s9qi+P#tbVDu`ElLHH7bI z*7t|#nAY&)*mgw6jg=5fH5`-W$YDipO{B6yXhztkBx(@S8DxCEO(==mB;-xApJ9IT zq!+lP8y|UsgON>fL0}coGJxHBLzbbMgBmyrR0zNp)FQ6eT6r2OXB)B(Wd&ySr=YC- zu1)Rdf?Wr;NaWkB2432+QWz}uy;&Bl1~Ih*2Uk%+VBv|L=Rz%~BSS`d#n25|o>5B` zSvAd)p=+91t{^nvBH}Ekl^Af{$K2dAxoJMg8zi>0tfn5AWV<|9`yv-k~u(dTQduFW>*{;^f-epC3*=+{~~4 ibmMk=yd0n3wR<1u{3e{fJzMLgzo6>O9Qv_*=Ho}CvyTS= literal 0 HcmV?d00001 diff --git a/art/textures/icon-image.png b/art/textures/icon-image.png new file mode 100644 index 0000000000000000000000000000000000000000..59d84b6b426e1827d5f3a063157076ba3bb79b7d GIT binary patch literal 1248 zcmah}Pi)gx95z&nplc)$ViRcE-rOEqjl|DR?9^`!C9#t=2zON)LB*-B_Df?m_Vesl zlJvk~TtL8K(j*Q@9GK8<amNbvXiz2;YZImSv0Y@XIx3x`A~ICP1Ciiej; zm0+jy?IxKLgrPs(+5%g!&LEq5X&htHZ7<+#L719u2iRUA3@njl*UyW8Kl()ku9Fwf zsTQ;XgEZWkwUErO&DQL-662ipjkp1iFbvvW(~nR)FLv!B{v97nBIrWcN?zOz zYQdTV1`P>N(^|@gau($Dw5)15J$C{qd@sRCNr5S-BQ=Ad0(zIoy@gI4Rn2nG7vJT@ z24ew|q*kkyZe`LmT$W^A*CnV(ijv}pRMhbqZm0Zcv~R&AksZ1LbEywvi+G8yvb@M6 z-A%y@24?-JS0-LCsf`0kPQy5*F3_90%U{)GaA+?ZT2fZ*Px6>4H^K$=vEkvpL2bO zwxWr5IK;$^`@);sS*mV&>D4MR7%DSe@aw%IV7c(W8 zQ}vvtm-M3A=bF@Bjg{zgowwZb2f1-i$66tigzg36ltb!)t{%wUBbKZQ4Wq2Xa>mHU zu}ng(}cu&lkrR#~%N_vvpwj z8*nkPacgU2`{Ah*2R9=3Xy@7%eDK-npM-xt0vCtZH-9)jqTJi}^p8X`acul%^V0Xp zJLeN$yqqg0a>dchhbL~o`SBI5oqc}y(CxALLpI#FGriqN7Nbl1_KyhnS3aHib?nLh P_@7fL&6+=S$ai8*CVoyu8Qf^ZoVtezQI^J=x!T zxtC#>{@j$Fr|ZS&InzVmA6{2()8!JGD3V!RA~iEW%(#sg5u0<(C6q^|-B{U1BMj61 z(R`*S784-37EjeDA`}Ou6$2xYJn^O#6_!=rZQ>y`* zU7apitIL*Zb7Q0INF7oGE+QsdcPm~9>uIiO7t-(OSm4+uge<4I{h*4*46ES)u?nAv zSwM`lNtG9sL{d!-vl874ASFm322`lX5J+t6;;6U4F2TH>ZTX_RG*>3Xhk{V6)%cps z<6ub;RaF&$BuG+>B4S~~BW6A3g@bJiIts18@ri>yHnM0g;wnjVG}8SPT)$)13tMHP z1rzF~FNi#dQfdNitAq2aL8a;3wggl`F7il7v0?{Ht7I4*__1bPw}TEz9v$R%EIKSS zd?e&ih^v7`MJ^3SVfj!CkV$Y*z_`+`_)HlS9G0=qYFe|x?2S3cvvDoFd5D8_lb|$5 z6;NV;-id-J!gvxYU8D!*+K^S@x*f+ZZdCe^@+ zI#%$#rKUH-fH^NDre~p?p5|zJyyMs~sY$Y&Nr_oCp^D-}Tvf!3CTBE7N@<#sOt!f? zwyKd5ZLWR5l}_YFJsoKUbrd)ckev;%%Qp3Z&M~pXb)ack6=Y>C9>tOZ`gls0Bqgh* z60)LmEv|h`EG@2hB3Gcn2vLU~>e%)X9fRnzGkD)I9t-GRUdp~=>d{#TjmOXT8o}MFR+Aw^~Wi3*|AnzCzT)>9ay!aZAb6npS zyEsqh^|Qz%PQr*ViO}&Fo8!hOLeDT4Fa;%CvE2;+b@c@gY%9Z`S9GX*Ib5~REc*D| z;%w1eTrgFOpEw1^L&O9eObrk^H8((EhHvR2_8lDyJZM4aLWbXPYF?iMIpSlWB*x+< z6lIW76QVMfQd1{@#P$MA3lfY&6)8ysCD6WjX3e+CsGv=^ZLwX3uTttEL1;7@iAFL( z{E8r|swzN9kfb<6#Dk_wjWF&8hdK%x4ou(ns7+iDDHB1iTr0!i=y}_jCr;|BZ6sP30Iw?;=F{LW$v2042>Toq;)}u;v zxYi%8(vutYbW|&(Vc))lt!bY)pj8iK_x45Vsn_OOy?sgcHtIME&Wpyb%vT|<+{5BkWG5Y4!X}Eu-x%4A8{OI!6p*SEdjx@Tq~c4yyU>;m`r;pOnx=oZULsYcQOWXA0xw_S4-3n&RTG)Z3gcU=Qm-qPne*f>>pPiZN>mKfA z7^W{bE$8Wa(tnNz==;s<+7-GCk;!>-6PHL`br6%$aS^dOQ!S%BQuW5IcW8`Zy1pBQ zc`~nDhZ;7+s*eeKrcK!lGdAwos#ZmWEuykvrMaIQn;dKCX>LwbfMQFiVoWbP=;rcF zL0hhBDV-a?%8q%E3YdtftY_9N7kX)~sSD}1f6Q}i6GEzKZr7=KWtNq&gIF;f4{1P% zv58bz5aWqd;xZeddmbeD2nc}`6r&JC*u9IR)*QVA^Ky327Tu+}3L!S+`Fgz`u1CYz zDf2=qmEu8!k3>Qg5po+AQN57mjTGP0$@u-GOWD%EQg*KLENm1JHLuE~~jdn>M?ZC0$94DO0S=N?g3=tV zfEWVwju!+0#u88jmp}{xunSeNZj>5_LX$8m{sX1u*Hxna7p!ZrgdJ0*H8A{+K%PaW;=3u>J0C9=z)%H9nmrH zKil(1H|+^V79CrM&L{fh4$;}J<>XAk`&#_7voqcmVg|Y%F&}zMnN#-CQsBn=#J2~^ z*`DCmMx7tX+`GdDRyS6XgR9R@fM5N=&5`$SC%~E2#>($t|JsxD=N>k)r5A&u_hoye t^yA>^3(Vt>{V$&n_x$jGD!IuSdF|T5-M`7KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001-Nkl3p5JVe%i5^YeBZzt3M(_kGeoiCk2{x+GFKRX>voK7isW!Zz zsOqkyBc&AI62G`?(YKgeJS|e@YSBbQSd1-hg_kVu7EM?zE!Gyj9PVX($ogQhs{Dn; zF)Usd)5v4dRxKTEk(pRLy35<@@}_9sTkI^T{B2l_EG|{c#bT7hLyL3aoh)V+gZO{g bXS@dhS8qMD8XtG200000NkvXXu0mjfDU@-< literal 0 HcmV?d00001 diff --git a/art/textures/icon-link-inactive.png b/art/textures/icon-link-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..088dfa553361c1c3db567d642542a6deb88f2638 GIT binary patch literal 2913 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 D22Iz^ literal 0 HcmV?d00001 diff --git a/art/textures/icon-lock-active.png b/art/textures/icon-lock-active.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7e219e806fc6f5a0d233a289d23bf9cef16837 GIT binary patch literal 1065 zcmaJ=TWHfz7>-s{ro+o*UQjt^AQNnp)23Y$SLaL`E!tVS!V12aCTCmNl9MH8wjKJg zA$a#?F!f2FWFQEF=!1xx3{end3WB}}W8jmF2@XMVo^0*r!!&Sm&iVPi|Ns8WxtwV` zR$H^HhGCf6)Nv(C_j-S=UrYZJk9rT$Z6`_QNjvT&Ma@M_tAPs$q%5rqWszo-`(C4F zh6(I9b9s_apOkcLg)|=%Dp?L?GfZ+u$f(;q zKH#GEfwr7J(4&h6+j1B*mn7=ILPP^4tJn6VQi5IZE77xW=2)-*Aw3CpQB*#i0Wx+G zh=!s;oex9MB!*yA5FtDW!aR&{kmtf;5JE|4l3)x}K9)vvjZP`6sFhgsmSDRHaU_l_ z7K@=`B!t~A4vM14@nJ3;4pKzWE89dX1#PdP>On!C?wSrUu?>8WS^@Wy1WT1JreHbg z^pa!Ss}zcsj4Npl2SYq(S$1WPR;!!#rTCZnPl6V;PHzyCs0e4%0Sp(L3Omx1tug=2>K@F1ElzeI#=w z4GJ&Is>rJmS@8A8d8IY3gu_u)j>jTVg{^Rnm2zL?!hdo(Du(l$`&YB8COSd>acOkv zWoh`4O())^qka1b(@vko?Ud4*D}5^bnxAh81ev$bYVTY*c%gZbJk!*>hkr+2*x zOx!ziZtbNn`!2s-H}yUv?sYfT5540azIt}FT|PIxYFuvoT01d6JF4w2@4T?(=97!% ok(aA~Z>rfIx$yxAO*_CCb9(D;?t9<0`~KriCEJt-N6!rX0b%@DmjD0& literal 0 HcmV?d00001 diff --git a/art/textures/icon-lock-inactive.png b/art/textures/icon-lock-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..db30c1df0ef95a96cc215485bdf147c3262bf525 GIT binary patch literal 980 zcmaJ=O;6N77%q|!Lqei4G11dl5`&R#JKc8K)~&F1TG+%zvTVX0G_l(bY=w4eJGcce zL{1(Qe}IVxFL?2!i3tZK;h=wk3kQAx-t=IC(`9$@fHaxT%$w(V-{<|9mvghzBg5B+ zIgT5t%%B?EuV(Aw5c}_aTDilvYt(Acd9p~`PK>#-N17N^0%r-=u;Z;g{eepyH+a*p zH)x}JUw26$I2lGrgNU&?t~8lOj=PL0XyPS5H29;PuRQQQgI`dqQZ+Jh%b!_~@%;L1 z-CbXHHIJXX3reZZ90Zs;APrW+L{AOA<5y?r%q;St1EI?XeUI}Vd>p;*bp z)QLnWNMaCVd3DeUt>IG{XQGq(T7<NLJ=NrFo pUwXjX@UV45dGd36_shW4#sK&I!{z<)t;0h0&MMX{`grg0i@#1LHA(;g literal 0 HcmV?d00001 diff --git a/art/textures/icon-new-layer.png b/art/textures/icon-new-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..793067eee213b32e8e19dc037ec8780e5c8efe52 GIT binary patch literal 1079 zcmaJ=PiWIn9L}b0b7Q)zPFT!PCM-=}maKVUwX{v@D(f6wWd&g_OOl|>>P7MBY2v|)BA(o7`m(jt!(1SFfAW35|KIx5(~iyM#+nLKZB~y_)37LS0;5-u z7G30#oSxw5pP22~TE(nbW<^!`vMs7SjLV2uVLZ;OvMr6Osx)Gom6o0T_#iE&bYs-W zs?Y$ykkb$?u#09)Lg7ZTI6P|LSNeK)!Kfm|&UAd}#rh;gko1yfZ_a9G7Y zo5@67m)W5i$Fp%gJQuZTH)|aQ&Jwb-0e0D)I&028F(`UgktApsFimI3kWP1rp literal 0 HcmV?d00001 diff --git a/art/textures/icon-particle-over.png b/art/textures/icon-particle-over.png new file mode 100644 index 0000000000000000000000000000000000000000..55f277690d4f01321c6272a18983c2bdb2fca9c2 GIT binary patch literal 1243 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 BwaEYg literal 0 HcmV?d00001 diff --git a/art/textures/icon-root.png b/art/textures/icon-root.png new file mode 100644 index 0000000000000000000000000000000000000000..72ea033eaef67c585bb5a034a8016ca735a46d15 GIT binary patch literal 1160 zcmah}O^ee&7>){y?$=RpFNUlKMf2Ha+YB3*wrSjgS=Mf0izlaW9cyn7LEo>tJS2SGiG;1BSyf53y2Zrfd<#XvG2JkR^}yl)R`E%0Q_*p)A7Z(RW73UWCUSE% z4J!nt2t!Ju8X=u=#kbpplDJJmzEm1kn7_K~1&H+GYo|Eaf)twqQ$QD$te8=1ss^$e z(DT=oEKrnVs6&v~>`#R)LbNB{r; literal 0 HcmV?d00001 diff --git a/art/textures/icon-spine.png b/art/textures/icon-spine.png new file mode 100644 index 0000000000000000000000000000000000000000..169ed9f41d97e8de54ff0f59127d9ec5cc78411e GIT binary patch literal 1335 zcmah}Pi)&%9CpZ5LPtjh0(I?m&R@E=h^P! zc4f33pfC*yX+2asj3G@zJ8aUVoj_v)asYAR21SBHId0O3RIwc-pZs3Iex_?U=iSeQ)^qhp?>sPoVTWjL#wN%GFOH%Ops zNphN#Y1zuasy?w~!=p=+MRjRj6*O|}O)%<-*nk0D1$aiybVM&nw(W}e+drmA(1y74 zNpd%+k~{@6$cBK6@L`o^VjwO=7>{*Ht1c9Piie$lG z^9U5nuPLtbzhF%jE66q!tby)#EM=LqZEvzH=1s>{Ocmy(B#G0D=(;9Ksf-|{*+edt z%`i+hmP#{mA(mki37$_U;zE}zA$7r5qRZ7DaD~Tm{hs!<5+!Ks$Dx+9kpbFzi25F} z2#ge^=~Ox=@IpHlKAO$(jKpOHA;+@}+2Lw?#M0qr9?PY0FqGe+4|Qz!2#n8k@N7dE894oCscF75bmr`e7aiOQY~2`N4mH$~ z11j(ankT3D;fd1fz5U$#FNKDq5B7BzFFNqa`@uLv1@Z{ffXW1yemgGx2J!+?ElL0*-7b2 I`h&Iq00dUAp8x;= literal 0 HcmV?d00001 diff --git a/art/textures/icon-star-outline.png b/art/textures/icon-star-outline.png new file mode 100644 index 0000000000000000000000000000000000000000..106e43a01fa05fb76cb6bea7eab5f08f2d8c0817 GIT binary patch literal 447 zcmV;w0YLtVP)}ro^45ag1z}Z8s@CjJN9sXeslNib6f2P=c;@n}eQ)}Le>-dd( zG}`1BaEnt6l@iSrcVj(0b2=9vOR-IK7u6STMV4hRIE{$Mh&W5b6|F&DMQczmmE7js z?cfMg>4RKi25Y!M*>(LO+Jz=A@Pq?wr>!_i?U? literal 0 HcmV?d00001 diff --git a/art/textures/icon-star.png b/art/textures/icon-star.png new file mode 100644 index 0000000000000000000000000000000000000000..fa86bc22d6b1f90634b73a965b47c9a4dc3c90bd GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0w|JzX3_ zEPCHw+^FZ0C~)*+v8apUEME;1ljsYJKZ)GFks=z^>Ght`M9x(??x3)Ti;_@hj$@4LD3 za`1QUU804m`>!4HnzUJE_0nB$RlJ*jn4T=v{6FQ%5{<69r`{P4ood$w$Sslj^1?VAE23LHW*SlkL=PIoMdYQq~)z4*}Q$iB} D70QyV literal 0 HcmV?d00001 diff --git a/art/textures/icon-trash-disabled.png b/art/textures/icon-trash-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..969f912f53c1f871b4ed063b6b6ea00a9e72a65f GIT binary patch literal 1047 zcmaJ=zi-n(6t<{@P}Qhw%XD(9ic0ur;@D@^gd}!oB$8HXq-N;Qi+yQKYM*OgiQB1^ zr5*Vv7@3h60Eq!67R11UgxDF_DkM0kNnr@JWZ%8>_r3Ss`*FV6e2|;HJ#V~GbN2pw4brKnD06I4lzfhHCOS5^u@hoYhtb*SG3 zDzhcokW^Wap{eCfSq0;VXVGG>XSVFxI2N-kzE5dnO44vR6o+|{#CwtgA(UiQQdNN= zgyblsC>6qFY2v}gi5vS7^+^aakElxysl_v;msbd)M&rtHn2Zy}QYNJ+k`z&vf*`xs z2%XRt{wrfDI%yw8SZd*f9L6rIM{j9DX1TjQPzGdb%#GM*MM3*EaSsC=(z%7qEH9wropE}q2pS?n>_xt42IV~i+?+l1^-x?rfp|{A9`e% ztY&4pytR#E|1tJzF$usZ&!#^`gIq^wE)X`0Cq>%?q(H3H1I8X_FB$%)yB9DI8Ih>cgNZkOBXm+o9HhwtC`y%^2Z z7M`9znR|2k(cTev-+o)(Y5v-H_VfMccW2+{yZzdQNnQ>vHcnQ)uAFc)T>EU6U&yV7 O*{If?rv0L_d-?|t^F)vU literal 0 HcmV?d00001 diff --git a/art/textures/icon-trash-over.png b/art/textures/icon-trash-over.png new file mode 100644 index 0000000000000000000000000000000000000000..baa3349f2f5faac4035f8393e0074eda448fe04a GIT binary patch literal 975 zcmaJ=O>5LZ7*1^wX)TI}QuW}Fma5<;lWcak360BcvS}BZQnm}-OTlb1?S?j)IGLJk z5h`BP{szH+AfEK#LC}*YK@Wm>v424Dq&Fwq-E9x9fyun@@I24^G4DKEUt6A@yf(>k z+;n}#Y-BrImoA)V|MFZdVcS(&Ytaq7O%sP8uHxY~0`1smFtfja)m0YMuFYfblH z*Ht~fd>1UG8WRW*bwC>Ig|U|Ed{0+nc6KcCpa-G5I)9Q>%U%ZtCI}RSV$Ow<0!peN z6^bRbbO*@H7vZ8P!yHt#LSBP1=zlzmM!apUVOsrI%+vV}rI99zNs6IQ3*)(gf{9|6_!0GS2r@;djrXa}vrJD)2%@2E828)68YZSrBuWCz zN*Vxd`~T1&7@}j^K&ScsQ#fvRBP2FZjQ5GlE^d1+3l(VwK@P>FiSgc`i|ZXsaooWX zFpOT;z^zR`^l%d2?s05etA{alLKoFdoo6b7?|WLYSSi6pMXDK9MUrYt1zH9(71gRL zRjUXGTob$d0Sf7W>z#7tk=$$?f`~;n5%C`&&muSgy|OibWG;DYq+Xxvjm`y*ejUB4W>2hM LTQgr)?>+ttv>Gfy literal 0 HcmV?d00001 diff --git a/art/textures/icon-trash.png b/art/textures/icon-trash.png new file mode 100644 index 0000000000000000000000000000000000000000..82fad16fd85e9e973b7ae56aa4547d81a0712f18 GIT binary patch literal 1047 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 P00000NkvXXu0mjfsmyJl literal 0 HcmV?d00001 diff --git a/art/textures/icon-unlink-inactive.png b/art/textures/icon-unlink-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d0124032c9af7c42a28a673e3cfa734fd0495c GIT binary patch literal 2903 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 literal 0 HcmV?d00001 diff --git a/art/textures/icon-zoomin-disabled.png b/art/textures/icon-zoomin-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9df40c89c4b17468475d78d69aa7e2300c759fcf GIT binary patch literal 1288 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHmpS4$HY0}EGIXD2g5Lst_^Lkkm2XD16s zH*+_017kCoUYGpj(%jU%5}4i;gkCqCdO^t{w*Y9fOKMSOS!#+~QGTuh*xOc_xZUE6 z(>$o&6x?oc!Kqgt=oo!a%$qWpP6`n4R zAr-fJF7MW72^2a0QSxS6+p*mWN<#e=ExIaNofUbmY8Nv^ggE~b$o8ByBl!!<;9RtJBJ!-Ld_Cuh8~=wif)p z+qyGz7Duf$RTBLp?EiQFLhBHP+)vrQA9|wJ-Y&O3cvMDj&Y8mI$fwQQJT`yIeO|wD zrD0aLh}M2n-6g)-4_{mN?u@#;UWtE~q)2h^{B_-?`);-RzDPT7fBWU785`c}Xvklz zJSpNT5xg&@`$u(Mlgyh1clJD)wI^i%^Op|CawnF5c^v5eOJs6}Gi#J#qp``$y*X>L zla8CpCy1IIa<>xk6y-?bH~h^Qm$58S_OtqC?%xuwopC&iWLHnT;PY?VS?>?IOP$Ui x*|3x;e!0b`<9SQ!c6?vu^lw&7(x2c4MuvWeAXAyblbN8h$-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHmp15-B_V@DTPXD2g5Lst_gLrZ5%M?+xP zTbMW+m>R+Ky5uL9=BDPA!1Sgd^t$5I3rY^T1wfl!Qj0RnQd8WD@^cly-nPob?G`7T z=0WwQ;C72MPQCg-$LND17b&t~LckORV#1RykONQrsd>N@Uj$6rj`F?t85kHVJY5_^ zDsJ^$KCSJNC~^E_@v@s65+CnV@Z9-CXmdcAm&6*6n>Qjfj{Z+b)js8RQ{h;ubMn%g z35klWyiYeJHMVke7yg|0viwVlRPwxEU+kWrshnSaZ}w~t6&Ybgo+K7Qkw=W~5r?(* z&2eb)iCfyA{34W5pX)+<>YN4N)+;@=aM8YJ*sf=?NZ7c-m6;DEmYrq zBTRauYuA+fGc{{wuVk73{_3+#-(Xj{ub1?nNxhuseP!RxR@-Z*Gp1dB8CIRMeDjhT zpXaKZAsBH3d^>bP0l+XkKsqfAY literal 0 HcmV?d00001 diff --git a/art/textures/icon-zoomin.png b/art/textures/icon-zoomin.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc0c65d57140e5481d58950ec512bbc5976a36a GIT binary patch literal 1290 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHn2M-wAwXCq5jXD2g5Lst_g6EkNQXH!>8 z6C)#2XD0)gUYGpj(%jU%5}4i;gkDFSdO^t{w*Y9fOKMSOS!#+~QGTuh*xOc_xZPro z(>$o&6x?pHz^PXs=oo!a3 zkcwM9m#uYJ0!5B}jJ(;_c5Ju8qK_T!0Rp0e@4Gxqq*`5^c3xby#c9#R41xD;0iA5E zPAVBWd$hPjoXSK`|Kh)Y;$+KK^`B4Y&75mler|6$^TL1=h7+6Ocoy(QRvZwVwy}l( zxVWa8{_a{Vq(|W?%KqW;A-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHnAXLBbDLq`KwXD4$*Lst_=H*-@kiPUYGpj(%jU%5}4i;gkD3OdO^t{w*Y9fOKMSOS!#+~QGTuh*xOc_INf6D ziqkx(-V~f}v2??!S0CsYeNf~gMK(+bn1Vn|c+v%O;E6vq518VMfJwV^KgT`>2F6NH z7srr_TRoR|>$3!k9RGOpteJ_)8h1w*6}gWb(H7{JwsN1rT|8s@Aw%>&$F;2yX z+_N>^8tZB&%O){$nq+0ZE!bneaqB;Ro;1w|N9U?lIB)*;HsA7If9jGoe+v6mpC+eG z^n1#=dc%#&5{BPZ*8FjNTt1KK-9K9`{fnRbeyg3|C1I9#=4h{1Z)S1wK%-kEZ{>HCr>zVCpXV@gZ^^5AW3(Zy~$ztIz zE)=`oxOgP&zz+uL4X^Vv<5NNobSob@!*8&3rrMQf>yK&5By)vUUFeR>X{|Bd>Ap=V zPTq1~b<&OS#`}7Fe~YF3re$Y}7JYxhW^B*I!*FMouhlQsHeFER|1? B$87)r literal 0 HcmV?d00001 diff --git a/art/textures/icon-zoomout-over.png b/art/textures/icon-zoomout-over.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd91e09191b97a2852e40d34585132ce39439dc GIT binary patch literal 1288 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHmVOCw_^S2s6TXD4$*Lst_EQ*%Q%b0Z5E zHv?xkOJ{SKUYGpj(%jU%5}4i;m|iyn1Dtw6$sxA@XtPUdQD#|cid#{Bt^(NGR++fn z;)2sWsNNJ@ZgF*U#i>^x=oo!a4+8^Z zg{O;SNX4z5%e(cP10{}s-0mwbCicomK(Nz0#)-YtQ%PfP$B`sM50yXsYO5zisED=f z(pjSRvgzOjj|~}*j0_V5E=j%mWc#W5=@Z}R+DZQBE^mKs^W1j&b@Be=vf6(nja^8pN%DqhAY#D zM0ex+Nm!v()??C;r2%dg%_i zhwe=_eHy$=|K}nm<5T8ul%Ac@59o2e@=POO?SJo5#l>Y4{d*p`hW`@!{K8Romtnhh zNk)udnd!#Io9zy;y{TNkMg5Z2gEmQ-jrIqYq|LfwTEErrp~U4CmmJKiHp+fDlhT(H zdZ&8I$1j}^99Zk}3m?qCd?KZCT9D#qb@Lg21rr$dN&Bz*+;+|tR5p3K`njxgN@xNA D_oT{X literal 0 HcmV?d00001 diff --git a/art/textures/icon-zoomout.png b/art/textures/icon-zoomout.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3f9e26ebba845ee7e0e6ccbbc8dad2f91973c5 GIT binary patch literal 1290 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xak-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8l;|;8yV;tSX!AHTNxNBK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xG?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjT zCALaHmqNUdTL3pUuNWFkzyQ;)NG#Ad)H48i38v837r)ZnT)67ulAu(Cd$Af^98y`3 zsvneEoL^d$42-xmWsp?`R?bDKi6!|(A^G_^uuu%h$S=t+&d4uNaCQcVnu11nW?o8u zd9fx~kFT$lXI^nhVqS8pr;Du;&=kGQ%oHnQ0~a$lR|88|XD4$*Lst_^OCuu}HwzaN za~CI5Hy2BoUYGpj(%jU%5}4i;gkDFSdO^t{w*Y9fOKMSOS!#+~QGTuh*xOc_xZPro z(>$o&6x?pHz^PXs=oo!ad)Wr`d)wT=ltM$6`_xj6I&U1lv|i=9FQR+Qa zUOV&Xwqq0SPG0bdz4v}5*NlI*TIa8R?~6RSS&nV3c(7sM62m<6Zz24$lCKhSz(u<3Li&G($Y46L8X(YtDnm{r-UW| DGUd;` literal 0 HcmV?d00001 diff --git a/art/textures/layer-bg-over.9.png b/art/textures/layer-bg-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ff999bc89b27ea5755708356449dd5931b926c86 GIT binary patch literal 976 zcmaJ=y>HV%9JQ!gP(>vMI+Ot&u0S9W`_6Hk*orBMKUzyoRHYHk7{|UgR%@TJuf(kw zpb`U2%uMVchAs#gC>#6*NNj9uENmc^bDFdarIzgb(0lLqejk3i(p;RGzB0{m+>Eni zw%B@}y|Wjl*!S7;FM};})auYxvQ7tXg1MScdKfsNyMbHS^>^-n!Bvi%xE8cKw9{DD zJQ50SjuEmjW^9hDE@ZLmZDI;~cq52({^y5}JP3T9Un@0WBQ|h9SlUhS>Ta{`?QVLi z&oA5o)l6doA*L?K!mTLPGMyjlYHXihi#!-Y=%&send&rFfI$)rNYI#3h7Qn-K-F$^J4`Qr(P1oG$0Yk72O`$raI4@9;Fb*jmEKXl#U9;N+xD*EFuAl zVVLJNM5nZcPi&luPTM;%7F#$a+lj~eu|7X0v)Y{R literal 0 HcmV?d00001 diff --git a/art/textures/layer-bg.9.png b/art/textures/layer-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..80897dba8cc443334c9c299f8dfd0dbeda9fac1c GIT binary patch literal 976 zcmaJ=J#W)M7`CV=sG?gL%EIAF6-dPAb3PhdF;#0jtwkMGX{1JCppJcQtkgdDd}*AD zsRM#e`~<`g0I3^dXg6SGWMgAvVMHqDG)WmqEuHT}&-1*```&x6H*0INGxuf$L727I z%{rfN@p1R|H2Os(GvZk}4 zc_ftF3?rps%-MoaSx#fu>tF_2crS=_@za71)y09X#@E>~6u|((I=Xmis_AS3gHQ~LQZeVr3Ia>2go*_f zp~paxQ63^0DrycPt+1q_5*U6Wk4F7nt!`F_vG`6G+l<8;guPx*>g6Ru_aIVL70L=! zlpIIol77V8G#4ccBLx#D9t~m^kO*XoZi{r8E^?=rDTMJ@HcEzN;st}L8$%??SxO_I z<6I97!!bHxb$sRbzrsnQA7fa@3F%UgU)=6O7An>Zid{x%gOL4E6*t?2k)%yxU>M-x zb`bfbmpmH49Y?dHgt?K2ZBrMyfD{D2Rz-@XTBSm@teOZ}g>to=xAKLRRT-63S(Zm! zlX%?_M{LCPueimD+^iGAm`64-4Gytir6dG{jJ0607iFT}kn2zOlAp+h+zia_^`Cnl z9r5PLmgBDFn{nUch&MasU48%E=SBV^EZbaZq~BYAE-sd*?#POA;Tnks8HM2KnTQ&3j H>dx_B^Ybry literal 0 HcmV?d00001 diff --git a/art/textures/list-selection-white.png b/art/textures/list-selection-white.png new file mode 100644 index 0000000000000000000000000000000000000000..32ff3c6622160113903f1c9795e117b7bbdc77ca GIT binary patch literal 926 zcmaJ=O^ee&7|yB(S*Uo`(=ZF7U^7X&X`0ZuG#_;Xrqs5uy}4;JZ9_Mim`qLDlXwuk zh`+&$c<~R2coX~!9`q-8_2{Hu>!EI7GV>14^S;mfF>kt^$CbmohaAUMoKvgE_JeZW zyvF|T^8Qb@-J$l7_Q{y$UW&O^Kt>oikvG9T>;;SG-*J=UuHOp>LppSyXg-N}uf*_0 zlrT2OHBXAf^JkcX5uSvx4u60C3PBj?@Jx0EH!<-vJYA-^zw8YB<;+(Dc=8A|3ynF5 zF!ewYUBsDI=y2s%W9RZ3L9l|*nGV;YhHe*_B*j4H>s4P6kAb4{qFh&0FF_(NpeQQyTA?%A!5$#asYqh9ReEjPU6idS+qGsPYy>41=nZTGrULP<6y2{6r7x4`|g zFb+tbJt)h&QH#^?1rFLNiNLBpTDV7pq_iZXF0|~%TE8lZ^@gn2HOr7yQx@Td8|=w_ z!!`cPMNAAToBL0*w^wX}%HwWynXwyw9J7f}*=T=w`sE{g7PlO$H7I_J{`~sJ-9G1T WR1RLhfA;ci`C=TqV|_BtU;PEb4;pj; literal 0 HcmV?d00001 diff --git a/art/textures/list-selection.png b/art/textures/list-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..b203a5a20b03c9469d57fa547e6cefb4beef6d29 GIT binary patch literal 926 zcmaJ=zi!h&9Cph|}%q zCPp5Ci5FmCVc`K-7JWo7-ju{x^X&4*gug_mZ5C(>Lr8%;bn0OXmt|=a@dqaOc_w_(LKLf2Cae)Xk z59HAzPEl@%8(qZD#WfVc2EyiscoWpf=>wBc3^b`;^=0K0G;~SP>J7c|45-|Oaucd@ zRo0PKL$V6CpUAz@V1iuhV(W`rhB#v^K@etHCS^5=&?!`OU5By?Rkg|y)pQjzFR#Yw zNvUAr)Td#>LK1^Q(HoN`GejQgO$t%6la14DnRvlq?j=x>{fd-b;5V1F$7UM}Rpz@oW-HM_jx6I2{`qsxum z@Z*?IJmsVP?z?@)pT#}fY7g@t;|~u$R_(_q(PAV8` literal 0 HcmV?d00001 diff --git a/art/textures/logo.png b/art/textures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b09a5ed41705b838fe4ae30c54df3ded1d94655d GIT binary patch literal 2822 zcmbVO2~^W~9!?PjML=)>(Lrl)1&_8#Xeq4%B9&v1vsDmLNz)W6ZPRH36dfEyQSo3z z#0$X_5oDNEIpk0gRAf~S5k(!95dmGEfa^6oFgPh7tNWZ;-}b#U|0Li4`@Y|i-%E0U zpQrJ-$>RV3F!uHm1W{)z-C;O}`fr_m`!IDHtMXc=0RX10?x1P2U1I=XbfZiZLWcM* z=3|6{iAo4D&eSSY6dC~LyJ}S^7KM{^F&-gPI)gps7eTsA;tU3Jd?8BzufHbUp}n6M+nL)dfa2n2Ik5SIlzFd&!@Ir1HN^x+>!si`GWevrUpSc|%H z1|vyQ#b>c%V`G`I4opHF!Gd`_9t%QP2*RKc3{9MpM70d1#`Xh)0M}q@nTnJVO1h2_ z6%)~ zRuxH*geH>s6Y7!2p9oN?_4OUm_^cO&VnjkiE{dVT7*5D%(Hc>l3TFl38X{Va;frD@ zo3^@WRD5?ej*^60L=f^1g$np!neOhcD~uD}K3Jxd5V4wBAML>fD2Y3R2!uckh{Hgf zL{NMzEu&q3L2KFt0EN_C9{CDH#0mSB7-p;n+&%rXTUfwNS~ z2#`LKNxnNFC)AWM<<4Qyg|9E)Td5&YC5C$ooIxsVrc5TG%wh=agrW>C3QHImn=NHH z;V{C0oE#l-HV4AkQsl#a0f9y9imTf{)aMccqd5MfDuxjlLvWbtUk8W*qiik%#VB45 z8*+eQu@hIy9?A*j#$PR?UNuzyF{{p%gkprG2#?3%iW$^CoFPTnY=#rUff!;05sMum zn1`d7uAv8egzqKOP}PeYeno`%x5F#Bj6T>Fd=%5QyEBOC>WoXk;oGv$x+r!258KAysi}=at)JYSo z3OIl2x1&-(M+nR(tnX^|k-r+wp$w zK>aJ1`aT4#Iu^Pee%s)_qSXwk|6v+92}IiDGBA5iM(LeXc{YHb?C^WjyOn43Z>$Yv zW(8vGAB+vhWF)nv9{GA*@RIgIM7zcxykP57_|lEmy&)>#(dhh@E_pG_jy*)}%WVv9 zStro$$t}kNHAXj_6LPn{oI<-j|Ft*)_TSfjY&FSVG46_C<T%P_r@UuB;ct?+!K{x;%Lr67>+^JWLRPGUm~$+ZG{8E4B2$UVV< z+qhoa6e$mVKe=f<_&mx}JZ z5MDGg`P-ZtuAYi!IBF*?eCsl0nfcbnkhD@>&t+o5-5Ikz12StXtl`?i{bEjGZJQn7 za=vSkV@=jIkBu+=`EjV!qG{XQ&5ur(=M2jaff$LtnN-*B#Q z=V?i3QN0y73QKDYKi%E(Ph)eyl$_XQHhzvnY9RaG+-Xf@>N}gPf9lJ*l$EM3Lp zl*T``+_;x)E+nP|d1&(AQr~o&={G`q-lk?+U9~7{R{{_0l+$LVrs{{gxz)886`eS0 z;peu`pz`FXc}q(xlAD=?NkTTXv3dp;oMg}G{H5&qcLUnL?^2?Otu-8iF->W&arhncE3ybTXV}5IJX}H+6=|HJHGIMG2 zt#ggLp3gF6wPp;=>kFOu@*c3eg7^E{mDw*YK3gH9jrUurRa_`~+MeL{bsg>6gy~t= zrT(*OU-V6U84c8}ho3$6cRpy)s^1V#+z$oLrnY5S6LSx=nr%G1aCgPQrFCK7%rf}b irtZFusqH=QO;?rQtlZpw>{s2Fs`ny4LBYcC#6JK_l{-`b literal 0 HcmV?d00001 diff --git a/art/textures/menu-bg-down.9.png b/art/textures/menu-bg-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..838f16a9816b9305f673f4d949ca7baeb4c9149e GIT binary patch literal 1074 zcmaJ=PiWIn7!Mmbk&RUlWfS3%iGPMo(rjs)u)3v9=ZbcgT38X;mL{)jn8}ODn@y{S zRRkIAD8eo>WCu?QdQeeRw1NXq9>+jIJP5+TgY%&1OKqozY2f9(@A3P6-|zeL7Bb@} zx_0&MqA02>HKt_A9w4iC=MM6JT3YWQTMtg=@flRaWz~U{tfK-1DN~(+S*Yrj3#)L5 zqS_A`xjfFNPe~dw8P&%yo@o;{MGXymwyMoS3<_|@uwwMa<7YH5^cX!Mq`9=6fF)zB z>cBJA@tjtj)kK{hJ`RRFi8wGJR)J@pw_M4K(G9;6Is4Zv4H^(U8>4@V%BM3RfgA_~ zCLGkb&>)D2Oh^bv#KebAcAhi!m1av+`g6v1-hDJ*w{c8@I9&pG>2m}QTjUt(@v+i z99wR)P^4t6r`l|Y;aJo3^J<`7oP~d6Y>Ret6&tcy=%P7CBmF4$waBD){}1E?i5f{k z+MEe3oKj*mxnXoem-vv#$CF|>DT+!clpGWza$M#jQ6bC?D8gX4#Z6f*RxJ&-xW*r@ z@L#T!aG;8jlSAlyt9zLe!pJQl8zd5qZh<2chNYvjd(;~k&JCL zj0#aDnp6~`LGbm<$$_}6aB(3lD~g}zuS*KGRsB^+2Lz%EPY1XbySRHNCy0UfDuCg9PO_R4ZY{`qs+nP<7 zn6A?jBya--|{R3fMCJsC}1l?7Td2lyzzI5&8VH$XO?|b}y-}n3eyxZxX z^9O4hYAA|2nCuiYWIs$+!-4(eKU?@*O|}y_p2NMU9~UJPQV|8^AxLV{0L(y18NK!n zwo{brjGE2iT&i1;k>-^gjMvr-!ltP94%?9AL5M*f4ybyVUVk%3162vreSs94GGefx zc8-~_cdREXj}6MaLU)`4?Y2N1Xb?-l)`oOTu)}o8uRzYuHA90E1P_MkEm65t8pMzZ zLBQMQky)P~1bMG7&=%x_Er267!-g1+^{~7UXcbrvls}q8GnIZJBPPnRh!v&_7#jk^ z6pKY~vDJ&r0mjGkJi~Gf$9V|CV~y%qvOT)hRPi7}OEy<4IfqM=6hnahN7bw^GoI zRBGF?Zj}o~O2*id!T7u^qiIfFCA5Vza7V_jXe&EvKqdn%G;GSGAN@@gGO6AF135sV zMi7xatU(y)>w7Mkh^R1zlAK&d{0 zx{HQHAS99$M4}PybGFRCp_cAyBPcB2mFivy-YIfy{OptTj z9$jK=4?on&#G7Qa>1QL;~Phx97l(2DqYufscvb)Rei{=`eaS! z?oNh&G~T**su-&X_guFQ=ec{)8cmCAH=xs}KDM?1fM`}q8B$Bo~6 z`KjjGjC;kk;%=MBP2btmUFY_vk1y@(uC2d$;aGZM-;>M7Hx^lI!Qy_-PMn-yUY@DK pZ{2zKMKE5|^5EXuM%8Hw%u{QL`wtgiy#L_5;AFfOrZ^AEQMShfHF literal 0 HcmV?d00001 diff --git a/art/textures/menu-bg-up.9.png b/art/textures/menu-bg-up.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e596c84c90215e158a225d22e502297b75493147 GIT binary patch literal 985 zcmaJ=O>5LZ7!H1x+FEbYA~K{PEp#(UcDLCKjWwGO8*t0AUF;q_m`$eL&?Xa;SvT#e z)RPyXSC2jDrT7N~r8hl_H}T+E1i`C9oosho54C~G%sV{K`#$f-Jg+a`A0M3>$D5J>?{O1ffHtF~fGrJ|(kR(Z&EqLjLkhlkwYlxv;KMMi>MN|Giao5Swa zJA{(7LtVLVAiGg`@|7rH{icL^{JQ-bPoD4sX*u*Dnv|pl!zu2>I z98+&*U)q0;jutPDiL%UBGOj)`{b=ID&cVUlerf+%@cES_OZAbN`JKz(U+?|c{dDhE o_wZYM*a6qC-4q-9lb5&)W84cU-=1CF`<*{F$67YuR3GpD1&c#4xc~qF literal 0 HcmV?d00001 diff --git a/art/textures/menu-bg.9.png b/art/textures/menu-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d2dc6fe9b5cf3e586efcb0c812868042b7a096ba GIT binary patch literal 998 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 literal 0 HcmV?d00001 diff --git a/art/textures/myriad-medium-small.png b/art/textures/myriad-medium-small.png new file mode 100644 index 0000000000000000000000000000000000000000..628dd2b8f441b68faa0a513e41b918b993f9e71c GIT binary patch literal 21803 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 X^VQjgADuryPytmXO~q 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 Gu>S!~QhpBr literal 0 HcmV?d00001 diff --git a/art/textures/origin-anchor.png b/art/textures/origin-anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..12edc1ffbf36ac1cf3cd2b3ecebfaea0ff7559f5 GIT binary patch literal 18252 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 Gzx_X-)bl0) literal 0 HcmV?d00001 diff --git a/art/textures/popup-menu-disabled.9.png b/art/textures/popup-menu-disabled.9.png new file mode 100644 index 0000000000000000000000000000000000000000..74cf1dcf8dd1ead8b409caa4e78e120c51cbe4cf GIT binary patch literal 956 zcmaJ=O>fgM7!HCBD4K*oAi>GXqzS|tJ5IATQNxxd9jmmCsjIYVr=^LvMqA?GxHQ{k zXg3aA_zC;~{s0HgNL;vbMB>by%doq4<4`Sa9y6{_UPk5utx9L6~28<|fM0*4@li+}~Ne~^s`9^Ara&sZ>ba}V6VTUx) z0*TRzBok~!sjU=Q5FQc^dgLHZ9re$buPTTmN8K@7sFiu7AFrP$zTy=P}dMl5}DTs zo%1%ik}(yXcaAdx+a#w07K(oC&risrcGm}zK%vI=X*fto%A3BUiW@D8Bir)~!_}=y z!*YFHZ&d14Wcikk*Dx|G$nYlIW}5RL4atNXUvZ6Vxwgkhz$xocdNk?YR-ba3_h|+^ zZ`3XDY$r}5I?SKT@{ZLK7QZFY8lwpq)yIyfXuwORQPoYUp)U2i6@)w&o37N~0Q3X=tJ3Da_TQMcE6B^W1Q5vZk4s2&g80eC|>l@!==>WZ>>iLvlDhXgSlNqhWFPDJaG| zci<6bgV;OvBRw|6nO~islWQn~8H5cD@j_I)-T)>I2~ee6+Cg#_<_s3>WUNJkT& z*>T#BwiX^N5;>t8Fqiru@o0DHh#4YRdXa(`)ay&fel#x>FBy#O0Ll`Ao|oh`Lr1Jh z{>oU1j#`s|z$S_4D0Fx~dRq%JuifQ=5+GNjThtkO#Ah|j5c!RSU96)D(k!)tDq6{u zC& zowM_k^?SFS7az|~9$l|)zfWP|4z}*&Yaia+60Y17zO3EYI347FB=4zKIj}yLJ8%C0 DA>bmG literal 0 HcmV?d00001 diff --git a/art/textures/popup-menu-over.9.png b/art/textures/popup-menu-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..45b2f67ae86381cd39167354a86b8e5e0c9f981d GIT binary patch literal 956 zcmaJ=O=}ZD7+%pM7qIvRa4j(LNhHF%haB?GexjoB?SO$2)rYm6QeH=BnTBuugN^ zaA_bp8AeKjh_eNuTuCFx9T5h4WZ;LU`1A9L2z<{J_mw7UMiv?RTa%dVO?KMuWaR3e zSa}A@slgotggGD$4#LDpO>yei;OFcbieL(1BU3yV)oJbmi^c>fQYr5uxd>EUl9iIG ztLp%B8zK#2lt;Ru6byvH>=Svk*y|fDyFQD>EmIsa78wwZ$75++kZ3%Bvaah8VTf^_ zBl5{n$ec7ECb_u>nm{$6+!n6fYS}oe0VjfT4?Q|g*0S=>)RNeLMZ9`U12CYpK*)-d|_ZVNXSg_Gg(lecS+|77o}QQNUU IZFZ0U0-$*!=Kufz literal 0 HcmV?d00001 diff --git a/art/textures/popup-menu.9.png b/art/textures/popup-menu.9.png new file mode 100644 index 0000000000000000000000000000000000000000..77a2d18c43a0be3507e088b0c2fc37bbb3b9d936 GIT binary patch literal 956 zcmaJ=&ui0A9FMqFtqcS~n5RbyLt)KJ(xz=fv#v`zS6E8v3hS|H^4f+jc`MU%$Kh1JXixS?|mPi&*%H|J!>`|ZKUs~8HU-YALuQ* zuP5tfivC~VtzUH8B()AX!hI5%0b;5)?jcZj%>im5)1Ey3jLHmieamTgNXIx-EbMY- zg5hGnO8aSTH{(kqK1&*z<$CAMtzJ`X*!8AZe(?;8xjx5<`D?6YZ zD^$Qm#00T>;)P1AvNK(Uo|9|Hf*FL2RQ58cj?n}f4iJ#ILe}DiJSfVXAQg&oaT|!# zhI|Q%e3q9LDW~uvn13ww7TA5IrSH#uQA=fqg!l@CQ511ej>EwK3bHIiUWB5UrHE`e z@rW5`y)d&-&{1dwj!zuyfke^l;W1HJ8tG*UuD_J^!g-l!!C-9qP~i9^r3KJ1{ttEC zB|0Q6bQSMEg~Rs5N3exLJPs_{xPB&au@$i(bbrd*Hki8#Z7tGRDoYk=iEA{4Fdvz@0N-m_qz@)iQF*zRxqG-S lGPlInx5cwByEm9?DdyEq`s3U0&p#yZsa|X7Z}z%pe*n(cB)k9s literal 0 HcmV?d00001 diff --git a/art/textures/progressbar-filled-vertical.png b/art/textures/progressbar-filled-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..33f6e17b7e2db93e60cedc0f485230d07ad4f711 GIT binary patch literal 938 zcmaJ=J#W)M78Qu|!{LYxQ* ziH)Ct#E8Vk#>7Ath7KTR{s1Eb0}BJ^G)@^pE!%hZ>UrMxc|Yz|r~PDax3J4`++OPt zb=i7@eLJ_VvH$BgzuvOtF17mfhz#k>i7{96$N+;@;EZq=JKp^499KB*`hCCGr+xdW z;gUdbGK`Q05o2>)rJ6>LJHZqT@W>BM{^!R}Jn%h}KUQqfjv9FEA1-2iv}pI-#l+P; zzWNwcQiC}NFm*s0oQ8>!n*7SI!SVv@ASq>4 zS04eHouQ~fSuBdWp_B|!2J44s(PD3CbWw91i=9kX?E)**nOq~cyf(U~k z%WH*BXcu3~*osbi^9aK(PRKNNSwDvRIhob&>OdKgsWA|7rvVOW3zA56`RbvfIHJbxW9R%D@?Z&}6P>>Zs_(Rcfe8YNP$_w$bO5TVASsoqT73j$W<#+C zWw9ixno`z88LU2@c_aQ%>zK`zFJ|fdn9^8-File-Een{8prooQ6lEyOC59*^vxvG` zDN6PW1rsG631S-H2;_?H08gpTvq&#e2;;SEl&s3c3I;PbhLRxWDHTA+`9Cxa*XV?H z&}F>;6i#}x7{Lxo@RWG0al`%GRje5VxfGKg#%Dzp+ha^|GR845jAhlpgOecgahg0_ zavVpqqlCJVhip^lnTikuzSfY+R-;)lt(wu0BIhLc1dMmEKITm9h7qVbr-rT>MU0ksV%8%>O zWyX5=QN$*mu+cuRKO3=Uv1gl&UiNM9yZiaW&tLbqzAo^S-8YLeckK@MBD~rC*xmb* OKOfs_neUEHU;hDbVIU>| literal 0 HcmV?d00001 diff --git a/art/textures/progressbar-vertical.png b/art/textures/progressbar-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc74b3845ba597fa9c366b7cfb711ee42f7e7a0 GIT binary patch literal 935 zcmaJ=zi-n(6n2S_N~JQeAec_BKp+vH?Ie!v##D(fp^-=wrIDHu$G#+1YM-$$#EBRX z8#C&F#K_D)z`)GT#9FZ-G4K!YoF*wlsHOAWJ$>JM-}`azI_+osd-wMQLD+8|lP>Hx zVeRbRfd7Y&e?Gx>kJtPBgbn%3iK$Ta*npyD;EZUOI^O){H(C*d+(WOWRkZp~rsM`&lXrxX^scP5s`kLDe6YhjAU32{_u68Zgv}5XU7WWuCTX(NBW}GEs79rbS zb_+c^^+S)%lE+zjS88eOzoK3vW&v8($Mm;oFl4<^)r|sZsAl?WMo|Mxt*jEQU^H}b z#r3x2zTy`D%f%oDXU+Ym*=rL_Pd@cS=#7I&MZ+Dm^7iiN`a i^Yfn<7p{-XOw|@ciupNv5 literal 0 HcmV?d00001 diff --git a/art/textures/progressbar.png b/art/textures/progressbar.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6d2298b3201943ae0e279d5bdaf1a46bbdcccc GIT binary patch literal 940 zcmaJ=J#W)M7P@ySUTUmr}uf@ujk%%J1=*49`6W(uxlNfJ-%=8 zb@$#K{=fh8!B@ULVyyu?rX!Z%hzJdr4hgV)JSIJY-TCWpq%H{CPrd$t4eTT2P+!8C zkCgf$M+-vzAPuoIB@7J7*b8*=*Qd`S@LXLyDciCg8f4-fE+TTg==7b%)X`k=;036s zh!gmPVUYS~L5xyeT=F7*&aR;dmM(0ni#JIP>@F~9L_k@p6dYM8fvP4c?v%QMNEnS>279t3fB$1M$M58fOG);rD3RShhJqqzW zU^p!V@m|hglGus7ka;u!86zIj8Pi3c=}ifKxTX!_RhxLjV2VSiNOD$E?r7WpclG_X zcg%X^Hs5~|$NhOoV2{Lf7CC%yqrEIth>VC}Mx#EZXL%R96Ut~jp&>AgW!J#76EARS z5<%tH5s0s3iw>u79PIZ+Ap2| Qew)1?tJN_-G*2)70IvTa)&Kwi literal 0 HcmV?d00001 diff --git a/art/textures/radio-down-on.png b/art/textures/radio-down-on.png new file mode 100644 index 0000000000000000000000000000000000000000..e7333c7a0ddb1051605457571e58384c1cf39fe0 GIT binary patch literal 1575 zcmah}3vASM9IgTb1~}!RfFPw{MBuKE+dW!$BVBuAH@Gpz2^&$N*Z%LW+4@-9<8CY@ zYyufDHDM}GLx>0r5Kx#*T>`QwBH#f5f`B3k112I-K}-~8d)p3-BQ|OOk9^lsP6H4vC?Np*B`yL=04G#c z9sxNJ)a!;AEHz34(aNXqG;Faqv+5Yw6_gsBoXzsr_+ z@*+{gP$?9R$K&?6!>(u%6emd%#R!xjY$n2{SIGvKu*v$kZUq+Tye6uKsK~IT$c2=c z;YCbOJ42Avw5+UmrO8Yfn&4Cvw_{dFDWJfoacWGfNEsJ+6jT5S$cAoW@if-VQXr6q z_b4k#X|!&XfCsVlh}MHuDnLtsuEaFnEOL09<(5h@8sH2?3o1%QcgBmOilOLHMTHqA zm0@_o98ngOxc=fp9Kdo0@FHdfoHi`mMtFj_i*gbaflb1)DGcj`1{6UISN#|2rU(ax zd;SGA%P(*S_rG9)r^1RRab^uft7B1Bj-;#w0+e6Y4Nm5PpY_~sJuK9&(Fh1 zA4`)s?#m`|AL$`6!s+%9PTcA4=CTSOvntWe6&`TuM{=#6wrWMOKob`LAzxD@I8_fy z?72sXmuJ@j4ux#VQl~pDeDfcNER$uU*{I__b@aM_*Ij zaiBVR@6yp>D}8^)pFCE1@$SITuFwym+-GBFhPz|+?`I`{-&Zu^YQ=kJ29LaThdy{? z$;6LFJ=gS%r!K;QyBVjJ?(cJ&#pfBXcGOljeQ8}y;F|%FwS}J?ynTM`D-oSu5T z-cQHxXk&aIzMILnWX87bc5pd*p}l3qx53rR-uQLuY3_nJ>Al`*YS(}|j0tCnB+a%N%8orZzq+YZ%E zKKk=gaor!iGL|&<##`4IqpwU{%S1NM-v3m1?vVRR%K!}8DxQ4)r-nq*`gQw#MeMG; H`L+K5JMS~A literal 0 HcmV?d00001 diff --git a/art/textures/radio-down.png b/art/textures/radio-down.png new file mode 100644 index 0000000000000000000000000000000000000000..a54f9194f26104c0a38b233d6db5ad14d722d67b GIT binary patch literal 1456 zcmah}3ryT(9IwvDoHD{BQx`N%(Pf0)wby&La$vb0a*QKzTrzaVthC=j$6Z_6vbzHn z!(1}hGQ&+Yk%vs9F*Cu91m$7Gutb;%k&C!&WD3jTBeIBz4rlhzuLs;_WU)#6J@Whg zU%&sq?UfbJW^CHF2|^eCqSgc0Ogfchd_ z9S8tUh&P@A1qiZXQ4H4THU4s%mm_A*z?fqZ1+o#OpeUwrd;`$YT2LoSZft36979FH zjqSGk3BTe2^V=22d+#A<8hNd8T zgBx23s>WZ5dSn%#cC*986BZllq|6q(!$~=Jq9i=ygbODL6G72-D@~B->VrXVst}?B zY{{xGcyeR)x~|YT9*suLQL9;2>u?K2Q8+>3Bx!;OlNOhBE@qOn+%*d<(0El;bWxU2 z!y;EJH|cH+M!J$hL`j>KwAC`fg5fbv!7XOONGSyr_%u#wQo||d0*`|*hyY2~Al8z` z!YcXwY52NkBat*((*xjEZtJ48U|a!s0BCZP%0rPuxkgwD?NI@z%W6=T!)q0AAYvJ7Rhcx_Y(+!Cyfu-YAVm(#k&Wo5p}P-2ZM+~QjA$TfP}(28b(D((kDi7H3X zlpeIWPArZRkIPeRWuZO05eq{xL@_j(zuZ zw;tFyn|zf1xyni`&Cwrr`KHSqnHl~3jn0EzftI1aY6m_(b@a;E*5v~EOtiy)|MtOG zk`v)`)o*M)aIx_3<(Y}g7k)Thn%<YrT~J;AG>4&ttQpoMU${&M-1}bdgC6ecf_? zJfm`w)@Qo&E+&Qt4$G5&-Z*w5|Ltq}iG{-Q*B)_g*)N=Y*xNb6`4ZP(ZRbAwrN>lp pWW&HjPEYdk)XC)YvAL_+dlA>oZf&`*^#S7_>ho5x1I2sW{sFbs1P%ZI literal 0 HcmV?d00001 diff --git a/art/textures/radio-off.png b/art/textures/radio-off.png new file mode 100644 index 0000000000000000000000000000000000000000..7064c709ba7adf651b82bd9fdb48b64d1c963131 GIT binary patch literal 1352 zcmah}ZD<>196wjtOYJ&grK_#t?TXOql6y%m$vrl1$z5V2UM*RmL51#e_awQs_u}1? z=2FJ26CBFe2j_IiY!zRI6YDDzooEFq>L)))#}qd=WDX~YI4NV$`CQt>i5(u?Jum!z z|Nrm*c25rv-M_K5yOkh_jhR6yi`Py5yM8VH-n(%40leIXQhBt~Dx#|5Kq8@81xRKL zr3AB3(Q1!<4F?FK<&vJuqrCheP%R^<_?Vz)*qBWa1KT}YQO6)63$Ub{aq9PzpHrl+ z#i5Zy*{_)Ie~nqvZt0QeAKICABous265f~=HY z@r6%us*I2gXu4Xh2CJc<<&@u2peVT;yV}FUtm^0~KUBIm;SvWPG@6A2ezET4`wxRRw-{7N*qT9Yd=H{|*~?bixO(9tKLmUb+Itk(nRt7wU& z#h923N!T9mYe@(RCY=!3L?|k7ViIR)6H>9s_^doIiYM zPB1j_*gAMVJE|QA@ofK@krFxY`_~S!?faOHr*w5|TieZ>H}wLq^CkNa=G}|!A2F=A zSuLEO-?44OUytXzI}h(ZG;`veYo`_;p6Y-7=uFQS2i|+7(6>MMt+@E{!Jg3<5b@B< z&$+XE&W(AV>bs=%wKLybc=p_Ach?r~gD1|-ba$0LJ3ZHT)!cRa zQu&H;wC&MTmEA3iduM;SD?IUJ?y7wH^3p_Cadhs$o}ce5zOk@l!-rF?7h5wwZUNKf ivzN{Fe_JLsB+Vvw?fV;cX~EL~ literal 0 HcmV?d00001 diff --git a/art/textures/radio-on-disabled.png b/art/textures/radio-on-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3a42b8f5869f112b91d1c74439ff81b6a2350839 GIT binary patch literal 1522 zcmah}eNYr-96rR-5JV`m9KmgwkgU7?IPSPzJ@nW;^l@@Vlh9E*maSYtBM#rR329oB|9EK`H@=%gdF5 ze834+m1n_HgCTNAEGX0p-8nQbc}<*-F$KLcWE%`imjz{xF9#Y@0!l@n9ldqpI}{NG zJG$E9#@#Xl%EYXV3Rt-@w}9VR&Qk)qEFD=Iq@e*X&^RRMt?;RI(2j=e(r~X|V<-}W zXytZvJg7o<9>PcpKrAM!k;jQtB#kl=7Hb-n_5wn}GlttR5;x)$Z86h0iA+2w^ri?N zI-kv)@C8qHv`o`v8p8sCfGJ=$NlGb3P!xsXBu0`(h%l;EK8*_+eQMIA1s15hBFdU5 z`4HVAS0ec}I|?HmPr)mP&HB`dGQomjK~Ba96RxKe0t$Q>C;OF(kaK~@Kn3supQb`A z5yrwQx!qy-lxDr&Fk02}!TsE(M5_f=GQjeID)|*2itI_!!;)!60h}f&1(H-TS@FCw zNt4tvNk$kZRAD4#wdfP1fco469KdoKu%l1`ixE#XlC}cEN?S;p#Gl7gX&fJix+OvM zRQ(s4Mw4dRZ2cD$$}eyl_rG9)r#+J5<)8+l-m#eMD-C&byJ?qC)i@syT&x|1>6t`P zpcyMmFt&_TC+naH!kOx@ni)ri*=b|pmdvCkxva$dbtNXb!hNpgp!}A9Z;RyylIJOF$&leYzO*a@K_Pba|L9lP%yC-u`EuXXf;DPt1ZIM%g zpCuRDMyAEbwr#1YMQS2)s-Jl4l;d0VWGPOJPTSZ0xFznj<&Wjfiny_`FUr-5pVf|@ zxOa5PU$+(?>e;nncKfb|3eSg!f20P+hWn1BCEnb2dQp5$aYEfl=Bl3cErkbil9{Uq zJ4zg%bnm=#H~o&gx2W>`2j{LY>^k(d^37Fhxzy6Q`KejaJ5JB=EZ%$j<;8Wszn}eV z#D$+DKNo(`_}l&fTh@KKVsQ9a*WGznwgwunk5omxbn(fxd!pCZBjRxF zBSdV%(9pp2w>wG}ofYzbIMLa*eg2!-bAD?1+qQXdcr>xg@zJH`+h;!JTjSb`&d(@v z4(#TBt!2)D{)ny}oA%@+lT{af+vYrH%9@q1cWgoX;VWNo{YQ@d+1YfhZCQC74HeP?rApn9$4V(Put(sN(Q?wD(>>HBjpH#ZH{*OJwZ;+h^jy0T{z zmoj(B@uq&Ea9#bN?NyxE{b|=LgWvnxSJl5^Zn$JRT^{**@bc)~V#7?LJE`J$bHDx< Nb~$s|ri|jP{{TWQAJqT= literal 0 HcmV?d00001 diff --git a/art/textures/radio-on.png b/art/textures/radio-on.png new file mode 100644 index 0000000000000000000000000000000000000000..f7121d677560008dcf3c5b20511dcb4db037a587 GIT binary patch literal 1451 zcmah}4Qvx-815orIx}F?MFkgbw`_u}y`T2h_SSB8cP$iYon7ZP!j#+HxAo}m$GaQt z#)3a2kb#L3(ZB);A(2E)wxG)#Yzi(K6c?9;05XgqnngDaC<{LsW`5Ug1>=mD+*4Z*;jc5Ql_n#>X~5zWltzFA zC9WAn04KD){59}cEDubI(K@3pw1MUo$;O!&TT)UX+hXxlBvp=&0|RLU&7$l@uMM0; z5mE4>wNwZXsSJpT>)JI?-5!qe?Qz~MpcUnaCrLvC5->O(Mq9U=g4ztr`!D+*D}FQfWp5oS|q@MQNGOcvVa> z6g{S>2*ac@jI62^WkE^ktMB6gmNS4Cg%zNzxWh`iqC_c8ku-^~!5uV?&q70rAU3uA z8|tJOqSOXekXaE~e7XLVJ{{#pm|n0Uty7>`phyR6;GYTwwt%b6hiyg}E3MgP9$A zU&qd0!7(tm>G^|)^aKMLj;#jgGniMt$70ENA;|io$+3fxW9z?oX4#>V;)2c`E$6r1 zb3c50cIdgBo-@?eBY*vvxj!DB95}g*E!!sLU)b`%xElNe|LrR7y0sca&I3WFCWRM?#$l4 z`P9`;vFr3_*JdWjVD8i3{F&9|tEt&I*j#`9Q0|hxapOe8XxFn-2XY!b4|RENO=a#r z@(a^}^}kkASmYTycsBOfP|c(JwehZsuRix&-!)|~{z#gxsxQ0zK5hN@k-RG_W5g1H z$^LFjZSVAzo;Y#yZujEB)7`OK+%&W2*qs&B7vYfE1T9cgq*lzehfw z&-Z=(O`(STyj6JygCRe-hHQcB3jJN01HZN3?`nigiRy1xTg9lFpk-k2uwn!tL7wga zEr4c|Pk#>T42C7wxNy7LPOT*vkvGvg#-#BQWE%{1^_oO8T|h-5po0_K=r1FuQG{dN z=sFvPQ<4vKa%;L}(ApgeGu>T`i$&{KBXt@91$dy+h{neRh0xq+N|%6p{Tf4&6h!TE zqw`L+Q%#6ZlmTKh*^LZtu0b3wli6l>xEzll7I?;RCuYHoxQnn^3EYA#JSem#vr(dj z3@q4!CpX%usuF==iA2Jbu$n}<12el^E)2I|7K;%gj7m~aY0W4orHcwAP#Bq$R8ABS zU6GE6an+4NPv=A6rL?S|ETjo04AW={Gn;Tdq!f^4(l{wD$5O^w1_Lp`13^_F)||$| zEKyV%ep^|dPoovJ1>B77wrC}slmONO6frI{u*lI;-7Sgm$$(ZxIV_5?#f&#~imIq| ziW1`Ur80~>yp9uCF`-o6!T}_$0yhdPU^C)1MvF6Swi7lBVZp2M8Un}Xp_IsS(PRdw z)$$)GEI&)D^#6ichKPzXPs18;ddFgt(2=r6QAAKsR9av_kaVLkJQK&UggxMM`n*=s zPkL--v%kjU^56lF&+M@}To#{q-c!gWMJBFSVv)<<COx z&5_2XrQCF2@dU%2eg-UlN+eFfVSjVniICbhAG>vL4!(E9wD z8FmO8=)F`#MdEwd`dXeja5m>eX!Wm&4=*Rgi>F4Nn~J^DwimDFzF`09v)Ut%eQUP< t_03dG@%6p$?0@&`r{Zs484qu|3pbR^X<0klesk*o*q}c|9`SDM`xlVK{$T(B literal 0 HcmV?d00001 diff --git a/art/textures/radio-over-on.png b/art/textures/radio-over-on.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f850c6f0c033988ced65e63c6430ddefc2a53a GIT binary patch literal 1575 zcmah}3s4kg9KUpi5L8e=!bj{Z|1^gbS|eF)X{^!3MXx?k?Ry zlcR#3m<=jv83to&h-M&TDr1gC!y~bQ(T32nw3!Smb;dHJrm=5NIBmw8c4qf`%POR$3qHm_C$MYZ{Ey0(%wGic7UNOpjL0zM#9NWfRcNkqVchI9$ISFSM>2|?sa z3wqxvkE;N&^CCbD8l#%VwR*&4)@ThzliBnPqJw7)&%|`N8aES$WdyE6CLa`96B#d2 zNajx3f+q`FAuMoV%bco5qo(UQAH09YZA_-c`cMfRpCZV7~41eDB+Zl152%6LHq zFY{6bFCcb%D8oob3Cl6OUwZl>4j?HRSWs92gBsVXb(wChkuYcpt!XK)Cvf~e)WtKb zw%G7Jkxq3TpHB50yo~~9ZF~wyba2*l3N>3}bB1j;zuK^}k z@`_DBJM-!9#e00SCucg!8%Mi6eC? z)nn(Kq}3g`RA1!6?AAof?_2sR4f^u!xvZAUFL%6&f)4s*X8-|eMlXW-c{xfzz)Hbj@u3 zDyr|@&SP!T?Vvwp>v8hhXKSY&U9UbdkT=#*yQ#3P2b=y4_UXmg`remWew^F=a~IJC0^LKdo1JirxMcE z$iw#-vypp0I<;Hqz4iCNa?hpa4j2C8zH8e^Z~mgQ=MOBnN9|v{u{~FPHpqOpa7VXL zw~4wr@c8Ybg}vpCZH90A8w-j%UfP_Km^PvLyy)PYPX-S?uYYIlknxR~yM8X&erNdb h{4>{wI{unlsv@?x+Foowa9R0vJ01Dt$F|Z9{{j&?Fqr@V literal 0 HcmV?d00001 diff --git a/art/textures/scroll-horizontal.9.png b/art/textures/scroll-horizontal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f0009a6846a3c693b45ecbd802f05a6d1cb9cc92 GIT binary patch literal 1008 zcmaJ=U2D@&7|uF3%jj-;Avy#PnUe`?zS^`+Sl4w)=L*XxZDI9BnkHv$*pd^Ivo+h* zbO`Qlc%>lX*u8&1L4<+$7t{;?fQWYr$~@`X&I@bc`}5VN5{!uyc@emwrjXp$5pg}JGuv{f{B_Clx)2PD^NFg?|*>v6g7Iws?~8_ zTa^uDGkWO51hz}i6g8g@T;14&7&Kwaa&q*y*KcWHnK^o0)HuymVB1>R^I&yvt!C_P z8j?xp7r=ZV69OAz9R&84~p3S=aP z7tvs{)HxCAH3Vp8S=(EDf-%`-RTin`p3MXVg%#@Llvw$te_og{<27RyVL z#Bu^F2nphm@OK@o2MNcY?lY*+H$2P57IHwys5j9z&e0^(^Ac=#K$?HOcn8`EJZS5`czW8~Ek+Uj?)+(sDr zZR7$)>2?jwu3L_YI{xi0M$_by<73@1U`frr3ERe za-u?RGD}h)t0H6Dh7Rsy%?s?(P;4j%+a-}z=vh0^T=tL+x@F7O@LaM(`FdD$crMaV zEK8DM!{Pol?EV!|PCK!@z~SFxH+@>t~xjI s;^1?ndNh8@9?cv(jmD*)ksDN$qvCI_`u6Xs_u(5X71z{POO1zr0JH`;0RR91 literal 0 HcmV?d00001 diff --git a/art/textures/scroll-knob-horizontal.9.png b/art/textures/scroll-knob-horizontal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb56575c86b735c31390d6a5d938a982087ef00 GIT binary patch literal 1002 zcmaJ=&ui0A91o0jKiFW03C`0q8~%VbFG-iI$rfjqv^HYOsD)JpS(?19VM|_2-fXs$ zdh=F{YMB(A2-yTjHH>$9Ra|Rgg5xF* zfv$I|2Cl4ofs0%5)egt9R5OT)9XQA|G?uDxp69BDA?Nv0ZlRdhbwMaD6mqht=Vg6W z5%WetHhNqGJG(v#NRR8DaixLWbR7JUdNxqxJw$FP!anGvt$KrF5eMpZx$fXtas#=L z1_RUP{?+W>6`i2;*dJYL^oJh>bmAjA+U!C39(@*fO`}jtJ~lodwcyZ1erf6V$jNn~ zba;NY_W1JD@o>X@`7;KU%$M){@Ns)?raf&61?B6r4WWH7Uw(CR?hW&t8_QiBo_jR+ kYx-Lzb2#=XtiNZbHW>Nc%*_`;TS{M_S*#eZS2v#g0YKL@zyJUM literal 0 HcmV?d00001 diff --git a/art/textures/scroll-knob-vertical.9.png b/art/textures/scroll-knob-vertical.9.png new file mode 100644 index 0000000000000000000000000000000000000000..942399c435a66a386a906257148dfeb658e98060 GIT binary patch literal 1004 zcmaJ=%WKp?7*F3X3sMy8107Nk6*sTlbT?twn$5!o+@)+6x`Kyhlj&|~lZnaHO?&Zm z@+9b`7x6#vBzW*3iWIzxi1y&2D0ow^Ug~7sZ9UWmCNtmg`+eWdQE6{S*ZoY$git0P(R%^Ic zx+dGmW2^+j#9lzy6qTQe1Iu297}R0I^$YZmm#=8xIt6+`EODhkg-v&MJ%sb?<*L2D zY)cM3a~b4gnKmkJ=(b;(oRe#o25kslF3^8P)kEry@o3f2DlX7O>E9H*pj6s*>_?qKk&>~o z6|g+Rv7VRY)ka6S0{3L>i;k*m0c0yMLaU)o`mr?CC6n4694G-2HL`~6RS){u)Cx4Y zVI0?yi~KYv@`j=3436jZjFicxbwe}K0+-{IOtH%~{RmsW4ZB=-kEh;)bay)p)D^=>|$CeYj_PXJ_Z>-GPhWM~-Za!I`0L2YlJ=KT4Ui#m^I0 z@?&oo!!Z2)@N7@t`$cmwe`ln5Z0f^l=V$NrhVZC&)4mZYVAAh3vnwX z8WzOX{{RFlVnjj=RH6)>m|{-aZr=eXFcQ>)Xuv94Iy z70d`Dgf3xhj>|8F#I$x11r4<0cm@8~$4@+P>;k`)F+_u?sO793_-ONBqh=lKTC&YA z-3R$lVFE6qCJ5aHff2{0$7vce&?Hb2#3-c! z&@lcFb=@I4pjC7c?>~iu+CD+BiUQpBE!Mc^Oyr6vs*g;H{Tjx5gDO^9nBt&?2~gEu z)xg}A*kl|(bFsI8``_l_Orh^8Z^5A literal 0 HcmV?d00001 diff --git a/art/textures/select-box-list-bg-white.png b/art/textures/select-box-list-bg-white.png new file mode 100644 index 0000000000000000000000000000000000000000..35d451f96c53e5850fac5f96d93fa5d92b1e74db GIT binary patch literal 927 zcmaJ=J&)5c7|tCG=%f=fELb^&4vEG|+O%m<{QaWo|-*mQN=HIH5Zu1LFFt7vD)!5U$+|Mq@VaJ~ccVN^XIX z@-XIXL1>=jvFj}e0~0a}B2)bR^_vI+-xSZZuH20+G7nDI2^p??BX7O%kT0G*0?pju z4no3Qkca0{YUHN4@oVsNaScVVfv|-sUWgiZ`@o_J0h&~=c(PIh4J0XAy@47JfXZzs z>rj;|GBUKPA**2fi9A~3PmKZYY-4fD6z7b^283CbNm*5*$qXt8At&1Cr8Z;_-e=k4iGH-PM5#AXj5x>McVOF$bF>zmfdFH*`y}+MSwgTNY9j zyM`3pwpvKWa;t4sRjuSYQOexNBPBQ3ajTsxxrUVxm(gTI>3P|`{+u$J&S?xRYtt=o zd=^AL&C>ftdADjw61*gSC!rzO)W--e(SUWNX*JZab=)rW>uR-OtEgsUY`5#3y13=~ zm*l?X>i^|JE(R9O{ioUG6`!EuxEoz=?1rC2eBu*6+Hc-HJLb>grh{9f{O9Dy7kcOM Zt3Ba*zW?yk-47p&C*#;X{JH)7^&e|}8esqc literal 0 HcmV?d00001 diff --git a/art/textures/select-box-list-bg.png b/art/textures/select-box-list-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..949295ba52dece51f3336fa325d8c1c8ffde7b97 GIT binary patch literal 926 zcmaJ=&u-H&9M0e}P1^44WMvX!5{;9zX_Kg7TI-ZWB30E^T92fOyGC7NC^1TrP{Ed@ z_C-O1aDh3P;+r^iy$`P%SRpLX#)zFIRpTKC7{dJ$TYeDMOb3tI>zm zZPaa52is2;-dHrVhp4ypB`imtb53mt^E_AbxLU*!hwk?w=7%Tz`HAO8`s(`-#e`u2I&>0`%hj{-f zoQ+o$!y(Sdl7*siv$N6_wYv-loUkz=w^bDfbHYhBClqwMo2r3l*Krz=JUicTeBbuc zj0b6mJ>90?wcorufx*Qijrj%0YP?ZkeOW)q!jZVrJ`~Uy| literal 0 HcmV?d00001 diff --git a/art/textures/select-down.png b/art/textures/select-down.png new file mode 100644 index 0000000000000000000000000000000000000000..08ab9664aef0f2f5da40493c8ff13fb9555dfbe2 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3HFqj;YoHDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVpIKZ~Oj`304-Zf%!PCVtgyVYb$%VWuiUJN7?W_B= zR0K++uuj3|64r&5uW|D_}ova_E)I!3HFqj;YoHDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVpIKZ~OlAHOMMI!af~SjP2*-8blM8uW6a^d(e%Ftm zpu;(fiG%gRfhe6ODUP;DFZ!7_R6jb?J9qgMCI^m2!?w43=NI!a$TK{bDfT;Ux%ryW z`@j0GE%$aWox;#zcqz(Q@Zs96vsQib58e6wmiWY5l3bIYgmwe%V(@hJb6Mw<&;$T6 C0YyFl literal 0 HcmV?d00001 diff --git a/art/textures/selection-anchor.png b/art/textures/selection-anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..17d2fc2c29591d576c45e203c9d5eb1c15aa44d8 GIT binary patch literal 17754 zcmeI3c~BGCx5t}7**6#55GO1uB3Vhm#1NLS$|evbh+9aS5LptEXjn!DL==|+5tU6C z)KL@!5fnvG*#s2=hK zdiQDRLG^Vz?=2<7oB3enG2WTi1v2+B(dNROJ zB$>Qiw_N@zAQO65Spg__PA|tS+%>BH$|`l8OwJzIMcXhj}1V_ z0JHrZtBJrvB!F@7^0NmDE&}BZ8p?%$f(n3fi;G4F`$$CU4|gxIu%Ia%p<_~#dx z?K3&reJ9sny(NJ{t;LkToF{Kw9f(2IR9T%{VWgPEtUITBMkTjqLBX0cvZcG7FpWUo#-wP?N1>V>f>j$D4HtD?r^JIs+)Am@%)m@Gybif=ZnMc zqT3tk-Jh8-3#}0mN3Ay1pShcgTUxUJCx>%?(3)p9+cpQg>-89&PRH9X&`Y}6!U`yq zCmu9HEWZ)knbBF*Y22yRsnhSHl;LX;^2d6(&)l>$$=?2OV8tJ?vGC$ zrOhBDthLHJTI_z-ZP%$;_$_I~`j|NmjwkYt9lE=~f3E)^=j==2% zMKkf1(xFv{mK@SDMAJ^^oXmNWqwG20Sw~Aay}@H!zOARRN5^T!KM&`6=47mX?V;tt zKE3kPt{nC$F3tRpNblj@a^6)=Rj$-O+_KJX>?o^2C^P35g&OGusOIk65>2RHa<2Z- zFIx>uQ--xm_nPILK1!q-uQK*3avwP8XD;875;Al|=%Uzdkexgbx#!93H_M(c(>jTF zD#3#50&)%~AExKp=ep(Ey}n|S-0Lf5C*XwE(Nb&CwczZ&l+3FeqB5Ph*-yf*biZG?4LwX74tk&c&Q66cSEQmZ z*Q(Mmk9?gF!X;~?Yg_+zqpq*Apq^kHVkAG?kyz41K7P;kH(T|6oSJnV`W-s{O`*$y^RHTs%}u9x^*>~EB}576VQGp z(v|8O&A!mBhi0M^z49IuTs$Gl8DzYfOZkVw|Gk6KK{kDYd*Z$EwrTmr8yD+btGJmP zW80~}>W#8S!$+Hd?5M>uY}wt>meD>xeHaS=Mdw<)IjI%=r|?m)<-V*EOHIp!?Rnd~ zD)MyvZ~V1CPiL?@r6I9_qZYe5^5y+I@{AXZy;YGaOJjG%dhIli=f%+%G+~noqNX;g zpxyet^1?bk@hox`!H|-J+DvXSy^OzXUW4-UzI~6LL3aprTu4M2=9>fuUTy!_ zJFx3{#&hM4h`A}~8|!&tM;j{N#%9ksjhbmhI&9$-=d$A9|5$1mo|?07asMpQ;&`R7 zO6^LvF1pF2DefV4o#7&vetSdb@B@D(mJ!1AuN$8*>MGf>^z{BRCsn7%>7>j#X{sj;ep~C#fU$)m*Ms+7L@zode>0$H|C#CDNTp({lP_s& z4IUWE7qUSwziaioZxIjYW-hPqy_G8}osM2eZTgEVXEqZH z$su8_N*$Whm+xF7cZPgvPqAUpJ=fe`ujKs5D@($i1EM!n+}d7oK_=j}vZqp4?6%i! z4|>%6igw^QR?AP<+ z2{O}1?Ql-=i)6K6)kiJoRomB`?|t`=O)EON-k`NKrkGlC{2KXE8JK;up?;+~?GM^p z+IyNwU-RP&j0Z!(O?_GsW&hy+y4UJcHaJYVd9~G3#?$$p-#zey!-t|l^Zea8Jwt~- z1g+0=2@2`0m2H+Cme*4&eo*q~J?&;QntQ_i<*)73YJa{ulJQ1_R5elc{Ow51b3LAQ zSZB|mV*B7CRZ`2=eGzA#$>05Xt2SF3z1b?QKg~AXBkhBaug_)I+mxpJubzZ|v}^rY z{Rp1y9kyzKc9YZ6v;A%oyT5T?#-WUDk*I&$Hnkorj_77Kv~O1DzPYR+eAa9;y0?2} z*~*4>{g;IOg{@t)ye@gAoh5AydL?{C9!a|ET3dRgG%demT|h}+_>~J0euF()nWhbo z-(Cs(d(Pujnw7Oor8`Xy7&4)LsLrA(d7Q*q-#OHoEUyp{(An|)|$$iMOSZz8e=!SUGt&0 zLewVGesjEC-L>-<#IFXU{{NnP=W!?dL(=@Dq|s@zDFYvw#>iFxAfY%kx{&VdL}GG- zPz)B=7es{y@t_+~03e%(@)*njP>Apa*_>cA-8ZGzbP*hunXVVX8RN{Og8m%)a6ae} z?m}aR2QY~&U2}>OIg|ti2m*x+L}*Z8uz(b5raKmw1f7eU(YlDSF2VpaT}$zR2)grX z1eMDN5d;(g$;9BW2vZ^oOCXq<;*1bD3>J^ZV9{7(B$i0R<4G6{;?to^QG(9Me3l={ z-P-okaFAuD>n{}YNNBW3BtnUdQCvP7jU^I^XbcXG!y%y_NI_VzkP(Uu7U+!!`5ea@ z6fpT5o{+;0Mu_7we7ReMX1coKfhLYm^9tfk3=}N*#15i}4rTDrSQG~R9g(xMWLZ$q zH;3b`5SWGk+2nInC z0d(=$Z(aiL^DmGI`4^Wl;r{OIg&e=h#rZ-j_Iy_chH}0m6MM#GW2rE{LS!iaNK`(^ z5OVo6E;o=eo@JB2pP-*l;;cd#cyWSRT#;ZI84Z_AuJ>d#(3&9xDUgzY#1N1;91V*l z8RJPf)8!a(R!#{r-V+wX8OnVYL&*4%C|~r2$KkR#eqlcpWwPg&F`S)A4#5H;BbW&~ zSW}?6qc|KEiN!R<;8z&qkxXBPFLH$`-WcgiBoL8!QzDVD0_%&z5t(C?{8Ii^XlpKW zi#U;>(Bm7Q#brX_C(?uDhcz)~;E4<*21CFju~?9RB;t)(NDu^>EFy-9C4k1C2bvP> ztASkk9H=fa0;lv5&xHjIhGP*4SR4k2G{rJak;Z;_3^XASL}FGL<4mx=L@a1LF~m2* zd^MCkM*wA0*pw`Ta&4^gcz_{awtjX5a>gnMkHHs!;*Dvh`*~+hl$?o*BG!y;a1w(l zu00f{IDJ7D8U01;>FXxXT7>_?i{{1mT{$Q}A^dAp3*6aI01YAF%h`|Rf z*-(c3$j%&(`lSpWo{SdP>Oju_!9oZaTmN^<@MF8`|HU#)W--&B5zGcz6!hl={@n0m zD>uHLU+%2W1>x(RNM5 zq(D=HH^Fj1Q;JJ6ADCB)3kF28Da9q356mmY1p^}4l;V=i z2j-RHf&r0iN^wc%1M^C8!GK6MrMM*XfqA94U_d0BQe2Yxz`RmiFd&jmDK5!;U|uOM z7!b*(6qjT^Fs~FB42Wb?ic2ydm{*Dm21K$c#U+^!%qztO10va!;*!h<=9S`t0g-G< zaY^O_^Gb2SfJio_xFqv|d8N2uKqQ+|T$1^~yi!~+Ad*cfF3EggUMVgZ5Xq(#mt;OL zuM`&yh-6cWOEMprSBeV;M6xNxC7BP*E5!u^BH5JUlFSF@mEwW{k!(uDr8M~vC>RVq z`6+@P@tjvNn+ZK0ieTEiI|D%YVgQJW0f2u;q0b%w*n$CoSDT$Xr| zM+a+5T4+o4oeI?$3?OTf9dKQ_d_*tn4l-UwY38-e&g5Z!0i)z%!SvibeRGa-K>0j9 w*Zr;=hN@l$M)))klRCBjTJduvsbHfl0N&Z~^sg#E1QZrhNZHJsX{EG+y51|~KJ;2+@hnjQlsl4HNt^E~gTU-x@YkB=T434(BJpIZaIALOfa z$p3HC;WxhBXPq${k}H#t>TZ2;%MfRb#R$SQO{KIV5jus6uIo@%p{kZSqMWQE=4Rz6 zIVlt@oOm>dSwJF?E4mZ1WQNEiy-p#Fcd}8kEfX&o%-k3%lANbh03GN5&@kMg6E?s% z@%~dd8LeUr2RI>1>hZ>1o#d`!WK!%hLPvxwiYoSJgpp)MVqlt^s)2_WLFAJ(d9>j; z4ziq1R!Dq*WVvYWiJ=`P*$_L=hqI}t41 zSosP303>FR7!iMgl^?*y0t4qXP8kT6&Uf$Wd7k(4-t@Z94)*Ww3xaT9pPGHX@9v{&i48mrPL~v)ExQA6IrB7MJb4P58R7yV zW-iFW%P2vaF0OPDKj+s_1S<%e>Ed-zL#GD}LNTaHwX!EG6;RhCrCO_N^(R2(Hk2Ds zmCLe*sz*px!TJ-qH|md3-|Vb?aZ4AcjKv7TG)<-SNFsCs6;0EitU^^Sb3{2=M9j^~ zQF2%)m^krh5VL?pAXjupWX^PvM|zz?7;j{wWL+j+FqpY9R3tf1sQ^08|Dj>HK_{$_ zZ{q!@a57lL81`{O=G5bj8z1JbVq{S4GC~K0TozUAO$j5(l*GU=R#gL!&V$G&Y4Ui* zaU5hv33DS4+ompZ6)6aOWVIXZcC}Hn8m6HrRz<5TEvwTq3{6$lR>ds1Ch_JWj#$C< zZ@BfX+r zjz8cl_yHE(0$+fT*t6po7^g|fBGl4&=8n#}_uR*P>~@}?96vhdIPRo%Zui)J$kxIA z;{Uqw`xo0DQfELf$e1p?6mw=kMi{grZ-RT+3zjdx;Tp#sJr4T=I%vPpeG&;?ff4d3 zVQh}8)$_#jXPAN!o`kW%|M_ywgD^1oOQkKg6AMqn^Hqv3R-L}Tn)xW;>t~>r>&!uf zsR#1tD$exW;Mab2b}p_V57rPmGx!@(gLW5KB*j1xswH2PDnLboq*PU;J_9ndp{PMw zEQv^0%DO0n&BwE7X)xA%w!4YNEQ6m?n&=QN77Jlf7DzgQ5<&=yGL+>KLzJ>*Ouf7m zXQx{aHqQJsOlU}AP~`` z4#*;VT9kLA7N_AW9Jncoz`8zqxJQH2)S692t2&x(75b4XnT~5(7LsMztl0d98|=w_ z!&U#wg-i@An)^?)w^wX}isNo{nXwyw9J7f}*=RT1H=o$Ec+j%Ve*SYb91ee6zpXdk Y9dP&FAD*G_Uyq7c({eiY=jQOkUy(o?)&Kwi literal 0 HcmV?d00001 diff --git a/art/textures/separator.png b/art/textures/separator.png new file mode 100644 index 0000000000000000000000000000000000000000..b99a132bef742e867cbf9c0f62a0e4267da127b9 GIT binary patch literal 929 zcmaJ=J#W)M7`P*$_L=hqI}t41 zSosP303>FR7!iMgl^?*y0t4qXP8kT6&Uf$Wd7k(4-t@Z94)*Ww3xaT9pPGHX@9v{&i48mrPL~v)ExQA6IrB7MJb4P58R7yV zW-iFW%P2vaF0OPDKj+s_1S<%e>Ed-zL#GD}LNTaHwX!EG6;RhCrCO_N^(R2(Hk2Ds zmCLe*sz*px!TJ-qH|md3-|Vb?aZ4AcjKv7TG)<-SNFsCs6;0EitU^^Sb3{2=M9j^~ zQF2%)m^krh5VL?pAXjupWX^PvM|zz?7;j{wWL+j+FqpY9R3tf1sQ^08|Dj>HK_{$_ zZ{q!@a57lL81`{O=G5bj8z1JbVq{S4GC~K0TozUAO$j5(l*GU=R#gL!&V$G&Y4Ui* zaU5hv33DS4+ompZ6)6aOWVIXZcC}Hn8m6HrRz<5TEvwTq3{6$lR>ds1Ch_JWj#$C< zZ@BfX+wj^(N7l!{JxM1({$v_d#0*}aI z1_r*vAk26?e?wj^(N7l!{JxM1({$v_d#0*}aI z1_r*vAk26?e?wj^(N7l!{JxM1({$v_d#0*}aI z1_r*vAk26?e?KNtWNGI+ZBxvXwj^(N7l!{JxM1({$v_d#0*}aI zph{s7W@MN(M*=9wUgGKN%6^YaUQ~|#+au=!ppdMmi(`n!`D7g(oj>OtR1%UD7<;tj gLTy%6B#1IIczFVdQ&MBb@0MH2|DgXcg literal 0 HcmV?d00001 diff --git a/art/textures/slider-vertical.png b/art/textures/slider-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..15215af85cb12ab15f44dee53258fd712832d90b GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c2!3HFM+VGzRQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#K9hu~l+_y9tQ|lheoq(25RU7~CT3>;&Nr|yi19Ga UT9x%c04T-a>FVdQ&MBb@0Q93CtpET3 literal 0 HcmV?d00001 diff --git a/art/textures/slider.png b/art/textures/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..b34acc3fec92697589419a496cc4b88cc243a686 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr7!3HG#Z-iO_DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVk4s)uP9>z(hzTep?CIhd!f`#>z|8F5`6CAo9B5Er YkY-|>udlKF7EqeO)78&qol`;+09JhhT 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 U9OUNe07@}h5!Hn literal 0 HcmV?d00001 diff --git a/art/textures/splitpane-vertical-over.png b/art/textures/splitpane-vertical-over.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ce363bea5c072c54521918a62e316e944ebfb GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr7!3HG#Z-iO_DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVpGk~cRod_DN{~8XPZ!4!j_b)CU0wgrA31Q~K!XB< X@FdgVpGk~cRpR=QADTcRVNVyw5RU7~8#WjJI)CKAfddT+ Z46-vAk0>edP6A3Zc)I$ztaD0e0sz9JBJcnJ literal 0 HcmV?d00001 diff --git a/art/textures/splitpane.png b/art/textures/splitpane.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf9ca67f2fe01ac57596b07a8bc40cc30def5f0 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c2!3HFM+VGzRQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#K9d-?s+8ranXEt|eoq(25RU7~TQ(Q}I^V#;AYsh7 UKewYx1}Meg>FVdQ&MBb@00ZzJT>t<8 literal 0 HcmV?d00001 diff --git a/art/textures/static-text.9.png b/art/textures/static-text.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d7be296c8b66351ac47ceb9dadc1074d3ac35093 GIT binary patch literal 1199 zcmah}&1=(O91aubHZ~pT)QN|XU6k48qfNWKEUs7_cGM>A$PLB#Q=x)xOE8=mE23psRXQ7@wgmKhT1ehRkRGwb-BGLeF@ zf$p+=lnYa815Klca~od0?c6k2Scf)ruurgj4@;_~X+8LnW^KEN_Hh9o*9)4zO(163VEnIQ^@ z5l)QoVv&ynUYzFQfaCUY8Zxa)>u4N^CH{dD?M)r){{@={s36bQi2zpEuB_`++uk${ z1YS-=+nSpTI8$NRA zjW2Y_%z9)v&wPPeuM@A4UAV^-X>- z@%DH*KUk!PC$^?D%XgoR?+mf$Z^oZ)tJ!yJd%LMyj|NVs25xN3Ouk;(7^%N{cyE## Z7^R-4$3IQ{c=0&=h2*mf>P}{5^DnlCaW((| literal 0 HcmV?d00001 diff --git a/art/textures/sub-menu-bg.9.png b/art/textures/sub-menu-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..467ef145f8c3b2967687cd7839e209f4a307f0f1 GIT binary patch literal 993 zcmaJ=O=#3W6pnvIij{g1?P*LwD|R!JWVgGC-PX-d+XZ)Nw+mem!E7?y4Q(dlLaf*=T96e@@ZFY08w+j^)CBs1^vzW2WOzL(px<>`U` zp?;3z28uIAg`I=!J#(~=eP6%1;IiX1HEVR9G-%5TF;{R%9fP80E#eBcoc8riJkD{4 z&brkat(7jTHt_^2i4kHiU}%mTpNs>`UcwaA@uKVJ`K=c(dEh#Eej!srr9j6`cV;!j z^Q+~my}D#84nH{o#$%Nw@G!MN>@E9|8t3^=UX|SwH{?Mlgf8XzZBn(;EYL}aK}Hx$ z*+@)-tRje+v8<9E1roC%%0UUGkfLT}6-l7`@T^+sG}MYQ)vd*>Jl~`=P$6u!T0%<} zNVo_^MNuGLQGu^)8@ z#YP5WD}bVapywrhb)q9$!Mil}jE<`90K*E7$VzB4JsQJ3Fq_@}g_1zVMm31N;$fc_ zjXcjhg5x@BT9|u+3L@nROJ*>NnMf+k^J;W9z zVU>{Oo_e!QLP^vl0nqi1T3}?s^&QfR&L`vTvc;i$13Ob8@jz!js=EgVF+GJ)PRyE0 zA(!yinD|--8A?Gz>9nr!U97W5?_F%}zgWn~z(m}C#O}G+1|`>>)n&%c@?)QEe8^UN z&C!actqnf=aq&+3alu$W$9;bK(Esia zJ$Q8Gl_Klqdndr9o7{nehkyV4I?7MKd;f85>(8fkeuKMz^^`21988jPMYC)?(XQS4 E3wql(3jhEB literal 0 HcmV?d00001 diff --git a/art/textures/sub-menu.png b/art/textures/sub-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..30c08ed247741c1a36c888e7cbb15734e6e42113 GIT binary patch literal 1031 zcmaJ=&ui0A9M5pnIXfH(x+%gVgR!Yi(%(&JomvD%OFiAE zx+#k4$z`QH*?nXk?(+WU?k0E0){oOgJcH(NRk0y8s-Y4DIYTMKJXEyhYp-CEq7Dt} zg(5D>6M~8iM)5F=YgmL$QOOb4Qq*~fK?#<1Gev*henJCXOVP7YnUgIMR`l$O4QEy+ z3+l?e%4_t<1(0+FB49wQ0M}SB9l=e}bzOm+y=#^RbqJnM(fdIa%T}vZrW$6D zU1ozk&$C>J4TS;(5pb4GthfQw8E7g<&{1vO!a6d6r>K*eNVqkj+B}E!rw++}wcY$`V8yDj3-Xgch1r zoUR~@oC>mlDAub6hGunBLse(E&XHvyXF6ChRhW}fG*Mx6T@%Klp>QM?OQ#c(6bz;# ziMSZ$#Yj9JmJ*qaBsIAbQWp(q;wD!+;AYx#y>T!s;#q>Wz67<5jSNsvThQCbBDU3Q zaJBZaNNu?+35NBW`&YA@S7d^`V{3GY(Heeel8Lv;XrET6Hp#Q7=A_Yr`?hrRUinSe z^Ru;Dt$gu?e?#os+qfFs?HpgCg2yJ-zOSBmwz|IR_iuj*bB`Xs{Xx1R1j zGW2Wj{te}~>{~x{r+@H4mU`-dt#?1KD;-A*?@#tlQJ*RwH-FS_AJ29^R6o@G6SEzi YebkviwrhCj^N{y6bLmNGYwXI}AIMWl82|tP literal 0 HcmV?d00001 diff --git a/art/textures/tab-active.9.png b/art/textures/tab-active.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b56a2644553336ee0cf08916b7d61b626a7cdc GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eY!3HGlQ`YSVQpuh!jv*Ddk`oT_{c|?V+mL_X zZoO^wH=EnL%iq_h@Q8jsa)CjlW?#m|MgJosBmWBv3m=p?61S(qFhbajSEFm9Y2%X% zce$@MtdnS)X!1w?s==zn5av~EY!UyCE@!m8E*P7|z!0Zehl&3PK)E2syE#{QbTEKMdB@ dw3&)CF>oIi(byaO?J>|$22WQ%mvv4FO#oBKE>Hjf literal 0 HcmV?d00001 diff --git a/art/textures/textfield-light-down.9.png b/art/textures/textfield-light-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29a9bcf094f270e1345585515000bb9ff5377c7f GIT binary patch literal 1106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU&_u!9QqR!T z%-qskN5Kfl*Eg`xH!{#Qu(UEYwlXkMfC43;ZAB?*RzWUqP`iLUTcwPWk^(Dz{qpj1 zy>er{{GxPyLrY6beFGzXBO_g)3fZE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy z7U!21B?IFlO&O*c7yo>ximL5uf)^ERtYGgmy(%cWol{S>f~f*;p*&c zYG~+c;%IK>>|*Q&3Q9+F6C-n&UeCPZlEl2^RG8jOgkE#Jdaay`QWHz^i$e1Ab6~L- zkda@KU!0L&py2Ebjx7a^@XWlF{PJQ=Q1C)sn_84vmYU*Ll%J~r4j-#bEN*Z#FgA5H zHZ^m#aB&5>-^swp#L~dj$ko);$;I5jPzkCx1&iOIdd+d_)dxC89~8Mrkqr|9rXUa# zo^*j6c;ZjZ1E%;QVA8G%xe*G?7Kc1t978H@CH{dR9Tb@x$hA zm)88(kKgy_|Lg1ednA^yEfHJ7zC`?4(|`TfaRwZmoQ49-_x4sFSGdRWO;cG|=R(KT zo^{hY8=VZY7)*H@mc4y`W`4ZD`j@A*1-=U1WW797?6{#peU;mkv}dk{JQw~nOq#iB q;Y`n24U+l`XGve=Rp4e|kzm*-liH>C_3tfEF86fxb6Mw<&;$Tc_i$AJ literal 0 HcmV?d00001 diff --git a/art/textures/textfield-light-over.9.png b/art/textures/textfield-light-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1217231382bd0492ecd04c76bbadf2ba99e35d1f GIT binary patch literal 1073 zcmaJ=OK1~87~a~4wNflru=Ubm3qHVPAIT=!rEA+{w;E_dNCS;0yV;#KOS?Pk?$o43 zO5209piuDQsam{?qToT$gNj;&fGCJ~(RvqY(SxGS#-#O7U6`HuhwuCU?|;m4CVjfS z?MNF%QSHeyN|x*${%UO@|DMfX8rizBn#Ut(9G5f~QiBF6K#;Vw37CbNF?0R}?4zj0 zqh>CT^QmD;M^;etF~PFs5H>~i^_Lw@pM)3`;Dl+*^ydeUXkZ#LJu0Nwl#_r(^USOZ zM`qJGeRfh84Z8mn=qpRafd#P!%GQ+aNoAR?`jyDpzh-Dqh2Tk<{v#@%%76rNArOL* zfX;GZ5EX-*5Q&P>lYl2S!^Rk%4X~mlgd~;+wT~vzTw`3yDnqqc#FFVE#*V}=rBW$a z3I&ln!EmA|GAz&Ve1ISV-i(d4a=`X_>mC&7>8|Nu6WPG`s1?vOmT98&PYRZkN^Lu~ zy;`A2$(XX{FkFyjEX&WUiuQ08?#S2`?d4`1$Yi01rd^%%W4yOcCbj#2ARkE7ND9)Y zEokGUBGcq1Xqbi+6}fO+WqCD`5I9Z^#|FcZn8=64=nxkg3McB^r0rqN)?uA%?r^#P za;1a|HH_RGLR0nbWr_$RuZSFwNL0H8j*ptQflA&9zq~cI&^0eWW5`7osMbd^chNA& zh6FVvMAVp~`ugK6(as9IDhP2U%5rp#YwVJHjT`+Zmmy*pzqx-kyM9F`$Ukn6E-|); zAKGN%T{7D8==HDUS*#_M!Cd)W;n3m369X;GxraY0^Lwc`A$s%djeEyBD$Ru?ZoEUS zG*=d4-AngFi{a<%>!mdKI;Vst E05hF6jQ{`u literal 0 HcmV?d00001 diff --git a/art/textures/textfield-over.9.png b/art/textures/textfield-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0659cc31bf7fb6fb3ad0c768ba7ce40e4fac9ced GIT binary patch literal 1061 zcmaJ=&ui0A91rW9vNrO9g>w&bPBo6QEo zCU}quiXh%RdDWXB2ns{cffvPt2r~2^*kOp^@W)Hnb{?#Om-oJp&*$^~`EKQNmk0Y# z_fr%#n4XmiWcRx3SReV1?ERL>b_yp;cn(!?L$)9_qoOhdXXrjVsnkuG9eG`GeOfn)R{r+Si zk_blPp-__JLR^>+hud5UDJwcOaGR?ha^qdO?l|Zs@hm}0y9U*ig>=wNThzM866vbf z;;P+a5xR0&5)A7$_pfHRugCyqci-_AQNwq(Y{+B*(T58ep;F-I-klXhKH-` z8xPp4zp9{z`o?X2yq)(%Hyp;B;k`#6dg{Cv9X$gkCidTMZN=|xZf=f$-g$9diPXQo z+IxLxB;()coqcz_2RsEa5E^>3^Qe{z^)6GMn~NXTzsOWTiJnXB4m=xJ*Df3xyL8t1 w@pJ#X>KMJ1vA#?u)0fNT3jC0VoAOh=C#m=510lN5?{RW2l7!%T>t<8 literal 0 HcmV?d00001 diff --git a/art/textures/textfield.9.png b/art/textures/textfield.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d2740d3fdaa2ef7521d70d764140c179bff5a8 GIT binary patch literal 1069 zcmaJ=Pe>F|9G+A(BvB~BEvV-hX3);e&N{9$xVgHs=B8`Qy5JH8&dxmDL1*4L^K?f$ zWCcMtkq$wB=pfOlLs1<(80aCbFz6E>_1;q zeXN?IsG4|>oFaRjw+>d4|H<#$3fX)(mcavP80QrmQk@#gLJ&8U5txFCHZ{Hi+bOEN zNl#~RCebIU$Y2!Dhj9&yped@o!?hH36k?EtBf1%;Hy0LZple}zP)KkID++UZ&$JB( zru)S1q5;=Ru(kqJCTC5t9-m?oL-lweqUw5GG$ zCekq0RV+5Za9&A8$3)`)u7oRT!7UG+|+MU6VSwpb!fRt+6&a z76`;zx;VZ?(;v!bt$A(H`JvkT_i7Z1~pM+YsjSNsIThdGC z(o&Ld7ps-dMJS17NiwWA+`oohydnznj(gH2#-8}0Nfd7rX)oP+5hc&!L0s-kyX)Cs z+uI%Ghd7?6+gvJH+jzP54aG3bMR1j=>*edJ9+r=PdxbV$-mICOo11<-KYwavb@jrX zuN#Zkf}a-hn?Ih9tj%X4W%Iep1GATAPds|-yBqo46bn9U0I!!L4fVp1TTi{OUt9U` zvuuoN7Rx?PR`<>HY#n)W+IRmrk+iR(q9UT-yT1HxdF%61Rpks-PObO0emQ#h%8K`Z M6*5AEZf>jldhqDM9lQvFHxW<5@F0RaEBNQ7Yr6?6h9ocV@qOR#f9`IqUz-@aG$shb zL~+e1@%4QCjK=TJ?~c~^GR;;hY?Ibl+X{$~!?a4oqHEPjiCDOE<1JYbgmd4Va)njQ z>&T|AY{eKka(&JggoUNZx9lCl#44#fo-Q4|dM$|#)}<}ggr;904QFjPAe+1EWqWtW z*08j+C@w^Z3%GPI%trvU+ikf$FVmn76iw3r zOoC)G!4ZkD<1s5rc;QT6!62a>I6iZzC&r3amA05JaZis!aQ%U-7xvP`69yv72Z{{i zkh(x@4{&}fXm*Wb8;~Y(iN`{YRR&m|CDR3lk!h1uL{DsL#tN-CSns97zOG71J%pqA=$4QjXIO7yw-gqt7Aje9z- z6*5TR+$4B4psv`h2Xcn{k{znoG&=nkLl#iEfbN1v*AdGF8i!RX=M^!t~U-!pUD4<7$~^6;oJOAPS qcx8M4>5E^pll#k;Kc=8CG9}c$TpYVM{{2V%n<%cV8_)CGxBdc*#cDVJ literal 0 HcmV?d00001 diff --git a/art/textures/thumbnail.9.png b/art/textures/thumbnail.9.png new file mode 100644 index 0000000000000000000000000000000000000000..32f799fbd6b99c999b8de4402325925cc8af1706 GIT binary patch literal 1171 zcmah}yKmD#9JY!CrJ@o72Fhf)OA*9pJ9bi^>b~NJM8Z{-Mry`7zDr^?_8I%qIAy8W zI-!bxfT4m7304NmW2wXh6HG`93`mrX3Bft97O4@I?em?!@B6*Ix3+p`a^l7W$8nRz zf>~ng`Q#Z--e2Ay7uYgIS1NR!)M(odF}H+B74t>UuHzE6QRm(fp5wT4-`#SBR;;_w zA)aU_7%}z&#^$)Wg*dRCEll|;uDiY=9KU=e@Gdfh4b76QAcq@nVJF1vJF8`9XUox% zurSZh#gGYjnA&{oHT?+2hS1f8>^nII0^fzuEko!zRk7Ci90@V6iJ6om$ts`KMOn*a z_3Uk4VS6CW0!2zmI@HooQuzKQFl!;I!IGKp+hRLIXiyqJ0NU-g*iMTitOHrsbs#A~ zQBn+%iaI{Eor#XhodAOpjz}wXSdnYf ziCY28h1jMfEECckWPGhbD2W;*;B&cdhWVKd*GHrs-8{v?rcJRSunK4?iQU<e(p3q}sCk4vyFuB%j0iW1HawW1o#}$ma9O zo1ZG1?fIg)RE|Ga(cWgDdYoJ$Ei#f6HBcv5gML moH&jj7o@S)=Ep_u8fbK z8Ko#{JeyGqWR8R*GEDwE$KO6A(`lS4;YGBJtGWlNq>0K9WNm!~7NBm{ZtlWaiW;1- ziX~jqu1W^789l@>f$b7DMa|9yu5PSB49alDa%B4Zn{66crc7TGG){9BxN2qU9$c*F zibj3S5KVgSGMEh{B49(TgTP*Qd?}FWwys3h;W0~tHUzK9^r5MemIn&*AP^WKYH%?g zBt(W6rbM2<2x1%`XL*i|iBX=HrV6@6ppU51GT#}^v;D_stldtAaH4dJSJbircNAk(;(v3TKe~=m&rfLVw$i_^u O{V21koceNMsqqIp&_?J0 literal 0 HcmV?d00001 diff --git a/art/textures/tool-align.png b/art/textures/tool-align.png new file mode 100644 index 0000000000000000000000000000000000000000..ef272f90e5407c8d97b4b16c6292ed59000bf2c7 GIT binary patch literal 1257 zcmah}O=#0l91jdcC&TZF3L~T!ho*VSnyq=P&aPRvf*D)av4I|zC9hprlb0oLHtj)V zOi~Cp4 z-pnveOJ+dL(zTVoM|ba{-+ddacj$7A^o^4doF^sSLrl`dlZegOdI4pTZkA_WqHcz1 z`fBCI$+&h78rY8NAtoBwE@d-JcTeEz#xx@ABq~@=g8TMlm18Y4!Hvlp(A*T7vIZ(1 z8mSECjLNj3m|V{pwmX1Sz(z!81H0(>Fi3D!T}b!gwZO4e2$@cBTTYE@Lu?9rh?S$A zyaB`*+oeQBxwA{@I?YP-EP%Km0Ujt&?tnmIw;zsL^UOTVs_AW8^pxPH2yvkxluD&& zsUwQLf*>l2A^=H{B%UI8zw8h_;2l3wQ&5p_c$P~n?69GtK8a^Zf}@^pgYuk0SPqOGwY&)X; zT-ilJ7WsJAGiZ_XkZN zT&GaArfD$a_(XRMlu;8L4KHe0ChSdtwAz^z`_dpSihVJqvnv$`k|?F)=_HVq8dt@} zY*>jJ*Zjkk8gj#)4r>KfFR_g(+hQ282hI-pvv#~FrAy=Tz2w{i*)v>iJ zItJmkK7aI3pJ3$BvGwSDo?melI@>ohYBCqBPyX86>}leeLrsg!-i06EKc_AX7Uo}X zzWRCcY;yR(^2Vp0^~b^63H909jT4bWZ!Q&^+diy*yV_P>x%zb1#Pt_*&za@3R%Xw~ zTh^W(Bb;cpRyB136jRLhT&_J~Vlr9?e=p9gKd*$x1EfX2O z0u{;TYr0Luv7jIror|ETgi$ApOxbkNO;aAh;nYRyBO-#`6#-o$*(G=XN51d(`hLG$ znRZzsFJN{6002C7k}{QDXR>dIzaRUZa;K$|T|ya^j!7f47%N5*fE*_?2~cgqvWZjz z!|nM$6EOh5xo1e%F*;2OswYhl=EXoZlZ9miKuny?g6Z=J2FxU~4Q3htL30ZqG~hCR zhFF7WED9pWkW@$!X@$$u^@VwQDbA0J1!HU|YrsS>7-%yY%`|G0@ki~V?B06~^TAOF zlPBZ93`(cbf(nu%Krs|0&?CY~P$Gqd;wXt!5)O*kGmJ#TB1C{lQE>!{h`_Oj&w8Wq zEHqV_Fy@Or$@n=8V?klqYPCYv2#BPzVWCtig%J@f5(!v@fVP_%%qB3?3&t%d30hAX zER2CPgIG5HdcifLMS;3L=nnp$J7HQIU8F z`$dqKPz{M2vg~h!iqXi3|3F#!ag4$K7mVxCERr%|tOf>e$HEqK_NX_F234DB1~cmk zwNl1s(}N5K992{1rEP zQm(hBy;`A4f-_Sg;-Jm>Kmu6#jHzM-KYIVEW^=izd|U08q2M>X$M z)!@)SH+QX)kd&XFFA>vJTrA$%D32|>c`onzLZR?P;_&eBnH!sYGWy&Uov&WoWOK)S ze+UHnJlx)`{g)3kx3;xat5fTAC#VlXO84&Bb8dTb^_DHpYR~63(ADj5IIdhd80V>} zZZJ8Lt1BuhdJcSKjopPKokzP?*6Z@8-U(BHjX-j4ZOF`-E7zPWd?MT#(Z0JjZPh7L z*NeIB_qn~*@vFH`Ugx!6kLUhgcaiSDY`VB#C$H^o-OO#*1(l}FniU#a(iDv@`s?ob zqUV*a)1N-&cHZl<-oN#1VRZE1G%dubiw!KjP_n^qmf!xe%3E7JBhMQ{_N{z!NRCY1 zw|j000|XtF(=HykCh%QIi}d-pzl$sOxU#UUQ{1|u3PFDv5PY8#)>-84z3}v*!!bWF zBplfKbYs=6jmGo7HSQ}TBO_~r`);o&3B4PnZQyhc9B#+L10o*-?OJVasiVSWALy3% z&Al*%@}JSx`s`7^#OZVz&lY=Lgsg*Bl+1=Wl0mjiOG>uo#uW`co`a+`b~Rh!;3M6^ z9iI`GzNCASWb-Ry>^phaPR={R#hZR(70zhm`JEYXZ4C@@u^mAAh9z-xZ3?5?Uo`y3 z$!uwS+w}u6_Jb%7 literal 0 HcmV?d00001 diff --git a/art/textures/tool-label.png b/art/textures/tool-label.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e1b56e6dad925448fb8ed8969f0dc2ebc35986 GIT binary patch literal 1300 zcmah}ZD`bH9FH7!A|7^%a~%^xI?Bep%adHwHV@5?>*Y=lOeyC<>xWWv$#ZRNlP67{ zdTGaIQCTQ;LBi$Sy{Q-3{Oym!%&`0{TJ> zro#0~8qnM{8nSjzcxdlLcfpt#He{1azQuM1kP6s{=xkt*I6e#%uA&R+KD_2RwgMr; z3b*1^pVq^sv4>bG-WD@}(8{*UaY1Tpm)m!;B0cktvK4IYgk8#%kL+`X&THqKG7WmgmSh^R3#~!$%3pPWLo7e z0J2?e9UX~OLY6wzDp$qESXhZF*Q{~dKwWOw(_yWkiahHeGP54G*-Aa2Ro@r2uHGuw ztm})EsmtZ5Gkn;gPjzhdijG0Jt<4`j)Fv1?bZk93pLgD!`Hs%^Y)(xTf?tdOE-xn| zF=lJzqq(0FAFuD9|LyXWx&GS=7djW_X8!qm;roH|{a+p)xb}&3_H6(8C()Lr`K5PW zX#8sWi-2kQ{M4x{+qP`s?%n&HYaqgz)b#E5K5TlqX)!YTYU7WL5ZROr9?T~004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY3labT3lag+-G2N400IO_L_t(I%k7lUYZE~f z$G_AUrs9D_qQHO zhdbH?05%K)unypb5Tf;~WM)1F;0Az)Vs_RB07$ve5B8MFWcEU#P!K>Bz*7KGAw+Qi zI1S(~fcpSu06+-Q#~QMt(P*@9FE6L#@woY|US9#Q&CD;E`5H4{VCJZlvSeA-15MNR z7MGUZjpa=;ncRs)BG*B*0;2Wv;c)8F+S=<6xm@mZp-_s&VsEa_&!<2X2hkl6316N0c(c9{=tLq`}+;W=bP&uNck1OGcU&0kjJ)d z*A+!Mdlbl6V8?MxRaIvu4z`-jT~$?2O&r{6waUk*rl$WCJk&hfw#≷KZoQ-cJhy zxa7qZ02jvs*J`z5AP@*L^GN`gz371ET-V(-O|xPcMl+Mm9=zY$%4c=G&>29dAGc{F zc-t`8bzP|_%0{(Xt>p80E1gasyiKJ(>AGHV9H$DP=tb#pRT{mVzW?2=`sBx}o}?mx z9RObdlp$q%q^aHz>kJ|P$V*Z#9=Tf{aI}avyOsZIQu+xVx#IbkznK&O0000196!l6x=0zi*Op0-tH`QL?k#D}(JamD8tK)L1{Rs%F84f1&g5Radt#Dq zP@NyPYMl=JAh;>$5UNl%t4t8gilub;VH5EM5u9VfL}d^`9ZjjvrA;gMv)5eQ-{1F zBN}0tS4JmII59b%k|ztY4^V*v{y>v);iW-_U-N!)Ka#oaPu8;}g8Rz;NWoLt$$s$O_3wY{M2l z`KdfYhCtKha@k$x-MX2hS)b2GGaSuvE{t$lRSiiMmuB_16e7@)O~pWpu93E)l+jDb zPhn5jLr{&jtY&Sb2`7xMNCwTi89SsV5XfzuQ8J57<3Ofi5vou_7RIt|EY6ZBw&C}b zRn<1yLP>ZhwtJ$jRMmiV5?Xr6lyQ->{kB_%5H_KNbTg&v#a6}>c^&CiUN^{axS3&c z-yuZE}luToWOVl&ifetGR!(u)Pa(%c7S>Y{{zM42NIJ0 z7Yt+}tDCBXYoOR2OB-6QX-yP`xMm?qlVLpKr*L>~MFE13_3)8U)EkX4F_w*bLZM(R z#16%na5T)vg25IyqRS<_5-l#c!yW9%wR_sGl@NiZ@;n4FQ&-7mJp`q*FMLP64KC>H zi>D)(#?H`ohu+n(tt&hR_O?BL_|TqUsNu0S@qA`;KR- zcf3lxys)kBz?cLwnM)@wbN~EQoBF!%$C@55?dDnbLgV&I*>Tkv_}~P4KR^HdJAtWh z9o@P2CU0CgfBwzY)s=FunB2_s7I*cVSx;QMw0tI}f$QEqhrxqy?b!OrSRQC2r^d*Y zK-a{XKVLYlJn<~}=*ad){g*Fq)$8@b;fw0g*B(B0_T0#pogt=iZQ-T0qksK=``r6; zpTF|r>901O>@lvbCT6Hp#a+(a(oD~lPpg%zW9M{#fq1Ixi{)d;2j&yUseXRGZ&ciL z{h2qiO6*2`&y&A?(l`Cb$;E?NzOnZAl?OgtNUKYkp8c}}`yS=qUHq;#h1@r1w=O%K kA2Un6J7&Uj+~zKZSWI4gy?bQuUi&W?kB&#?LPw7O3&g0^2mk;8 literal 0 HcmV?d00001 diff --git a/art/textures/tool-sphericlight.png b/art/textures/tool-sphericlight.png new file mode 100644 index 0000000000000000000000000000000000000000..1cab8928ba3cde2e9c60b2e6805caaf1cdd45e3b GIT binary patch literal 1907 zcmah~3rrJt94;`?q0H!(0cyrka6_Q&wNPkJihUeNl>#fTB38Zj4!A+@Zr1|}V=6uX zl}y1YA&66l8egb`2*?6aQHQwb9t!y2HADj{Lwq2PxGMs>M6yfn{*Qd$_j~8IM20VQ zbeQMB;cy()p|F-+KV@I18TRaV_JfAK?Bc=%>zF7qk;y=4jH5tF0|ux~ND`*S5H$1a zCM=M{vFpd9b&O6E1{p~cAF*Qi78Av?Ih?>H778(@U<_cul5j%C9jI&I0yrw;#)&nc zhEie4cxV=lMP-FY8?#c3Qk1(S2ne)5tbhq)5Wr$eCCrdT#vRjz*uC{yzy-!2Op1*A z#wnd95>Sye28j9oJR>Od0|KOcq1Zn_8sGzn*s}nX2t*(cltN-(2owS150|w@qlu6f z4jH$_o@Cr)hM^#VAR{A#pW(|V=_G+rDwPUAkw7Hku?U_ylVA`Fk1)GWD8QK6NaGZP zlLTN@L=0paBjd83z6rrZP0AAH@iegs6Ic*RAmoGAkj8+haS}(R(Wzs`QKJA$#Y`B% zm|3iF63b>uqnU)iSJq^jM4K5c_BOWnqRr8n6eiGOW-^U7vPDjGx4K0^DjGu=l8z?H z)QOBoCX){2FH{VPr2m1kGgs?ThtsN_%h@>%V8V#f-%nU*pF*PjX zvf=S@9EB7Lg?|97go8uC5TP*GPvRRaR{Ba*3K#|hB>n*tT$nVbSt~KYMc;CRr{r3D z+FC0J#%MepLqllN1dP=K!l(8{Ii=n>7oFM{)s$QT>x{tKq3?9;#1%UR*6rl{v4_bC z#t3$7X?8x(FRZ=5j{Rq9SP^ZxRTZNTjY6E;+rkqnONIs$3s zB?pAI>qbsvf5x=9@Thq--VwEe{^&yy|Q>ZrMQio3msW;(!S2a8^NC=KrWZu7PjBYx|V#oZhG z`};_xI=N`Ej#)rWJ;k+kGXK*YC{lb+&OaLz#Z_9s%V!^3Kbfb8`c>zZ%i*k`ErU zo%5)#f628Pkb-@#|iH z-!VYuNuPYN6zEkczdSk`AFs*JwjY8sA|m8vWuqUBtg;n-4jDFH^XW}|aAQ6C@utQP zbd*f(aM)XJKXBOvF827Lw6rqSZJOt4`w#Ojtd8;8Re$vC$n%~?xLPOP<0)u(xi#)bJWf5-IIxa#Hf6;XfI}TL0r9LbyDr)v*=1HdO za;g^`-}7D2s@U`kU6jvGv7`~tt}Jp?4t?a)P*WqB?KHDCa@F*W=kB)}791*GaOP(q zpE`AY#k26qN@ji#G zcZr^7`CE28e%gzxBW!HeE*~m&|9gAHodd1F-wvH1%S_yw#T_Vz3%UoXn2EX|NZEQfOherq=z9d4DQfI{E0e`p zZKYx$o6$oI6WA_cQ&e+H;Oa&X#GngyTTYbzd~1jXmKmkjNE)ZP37EH540^C*uq|T@ z_878Bw=4zCfkFgqh;zJyCkZsjSux63Bx-}g#uHkXOP#; z^0F+moWKe~gdigRfP?iQ;`sAR3M%vs&vLPa91tq%U8o;NY2xWf2)0|6b^OsZk%X~< z?y@|?g&`GzrcuVZ{a$a;xM{Gk7uwLlKEd*3EXk6lmEr%Cwe2$6$7%RGwtu4i%zz8o zH1tuwXOJT2=7(;%O2UIWMqUP?-crWf^9Un9k6e&Q6f+DKuCW{w75qhiaGbVRrD4eJW(qi)ExDlv^Oe;4~0V>IVK}q>d9qa!En}(7@o~@G_SYgMquG3w# zrfEvb@v-h0Fr`Lm5*}k&rXn{rHA%cs-hWDqRe!r3r&ec9R zc;VsUs$-pZXAdW@O}hVT<=l>Y+|9KIhU%UqCVhPMgk$yWi{NntGrDrF0znNb9 z_`r)TH}6mQGH&MO{cp1K`qq8j`1(lgCu8%wr9Z1{k5Xf)gI{+JuWng?HT)f=THDl1 I@l88^0Y+b&$^ZZW literal 0 HcmV?d00001 diff --git a/art/textures/toolbar-bg.9.png b/art/textures/toolbar-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c8aa1dd0f1907d894b0952b1c19b1b1d8c6a8ca7 GIT binary patch literal 968 zcmaJ=zi-n(6t+}Up{fy5i-hRH)v3e}5ueXZQf$?f#CB+;x~kGh&4Luiz9d#^pE+N# z+o@s$@gMLXFd#8^U_%12v9Z7i6U;2(oF*v)sR!S?)AxPvd+*-8*xP-aTUc2T1R+=7 zHXD4+;`yud{Qu|owGVu`$*dOJCta2}6bluPbTFs~P7gP*;~hW!h&KgcZq;wLSj*ng zToOo5hLO@B;%q_K+)5+I9bg7JxaWtu`0MPw2z*Z$4@$OdM+WZu+b0z7pX@f>lYy&x z;?_g3nQB}hz{~+@a2Uo~s*59CjmOzB6u}6>2D*4|s%7s1gHQ}gQmNp|3IZFdgi1vf zq5D9Q(Kn4 z?aQG-Fh$3#fiL|2S2%7SM;JD6Opd6_FRq)6=T9R ziF*{_kWIMW1=pC#%_bp;cxDq*{~7jblmuW@vF6YAqR!MCbG_MKDl@r|n}ONA{&UZh zBR)J?IGtL)na({9`LI(y)wkc>_{m>{UNs*gZlh-z^$&1OWO^1ge zDhM7uc=9lhqGv%tR6OWqUIY=m=+VP2f(LQ)rE9whE9Q{*!SDC~`u+d!-u&G3$k53l zhG9l>Gisi$(SG>g0R3z3spE7xL9#`%fXk#|_=rhcxP;i8V^mNc8CLW9do;l?eLw6% zkree=Xkv#qA`Blo9%VDk#AN6h<_aQg2~})Y;Wl5q;#k{KxTT~HbT5Od_ROk}7FOp9 z=IV+mTioO&b|Qq-fP;v^hEB~5V5o2{yO8dqYk^~15VE3hJ3$roc{YQ6#3uQ%mnwm*(~^Q|(>t6JL^Jt zL6l`#0Fod{F^Y%hkyKH39DB(I$I2!3r3Xaz`>jv#I(Siw~ z;RzxSqLf-d%k1L3x?gKKw@d-mkb_(jP^{R+(kkhC7rw7q$LXR2l1IC_?TZcyO%Dlq z6yUmVQjyD}QCJ?#_{bpGFJN5jRD8aQ2@a~*V>6jnh1qjUwrk-=aDER5sRls`M-@oM zKq3|g1yO>c2!VJ3Bp?7gP#s%#xw$WtiWUC{O69iXpo)C^2C_6CJ8Vl2X!ni<^t9LJTD@ZtdvXODj1YC`o{sHY(J_d&-T9-3 z?gS&3j;&AU^NF^#NN4+6PE8lWFD2`8|Mu0?_ICWu=jFTW>)!_1cN=S`Z@z47K4OL+ zyggjFzxe6T?_aM6fOzE4!;fF@TshNMKgtarSe(7xzcF0|%fr*&THn*NAJjFbkNN)d U*z@Y+t?2b(a@jfc+0^o_zaso|Gynhq literal 0 HcmV?d00001 diff --git a/art/textures/toolbar-normal.9.png b/art/textures/toolbar-normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..75ea070430456c3181a4d6b045fd46f99b80b42e GIT binary patch literal 1172 zcmah}J#W)M78HJQ^i%4Mry=V$9GAr#y(?Th|>wW zpz;fl7~mJMBZkh5EDT79k%0jrCRoZjP0}JY!h`Qa&-1+Bcf7OxFtu=Nf#bMTWz(#& zHQ6s-n`i&Be|w27H)*LscS(!(?GSSth%_-@@$5FPVH*t|f5598H}~DGH)zAELWg*w zonXY+3mBW@R@dUdb`CJ*o4D=zhVbM4iNL$a5cV`nvVtP+xSNL|-aXu|JBJ63j)b)b z{AvuDfQPBg$6nWuU~C9OUC8#yH4ykAgdP~enNtmGhcA*4^O~4VJCdB?bGj&N*_@uc z&nxTMy)Q;1Bv^-WYapZ(nrxC--6D-S;Wli9h%6i@e9nl&-kL^-)R38Kw)Nn+4p~H&YT29;w zU@^otC1IVA?l|K+9YRUeApu`34l~T(-E)0J`q8}$9BkSY8v?67-WB z#G(5HqjE?*epnCaPWMHfsyE`I>Aqy9ashJ&BprI8W5-u)43h0+{@7tM!PsYG8?yO4 zdA;9av%OX^H|p`{X0=*HPoMq%_3gC1KD(}$mtI}nI(@z+y_tDgF5j6KW_~Vw{8D;% mY_6C$X8$}&Ee1!Q=B_MpFIKMagOu_$c_%8RZS!qm|L8AhJ7eqs literal 0 HcmV?d00001 diff --git a/art/textures/toolbar-over.9.png b/art/textures/toolbar-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a6faee05dd29bba3343aa3aadc690cc736a1753c GIT binary patch literal 1263 zcmah}O=#0l9FNXTnRxQx2Sc8j6GfYkHf@*Z>bf*=zAWQ$}Nmq=Cj5YuPk5d`wKUPc9^o0Eqhp&o{5 z`DAHDQdIXs1KXS)Vz|I|DVt$>dIMKC#t;D`sBAeYcK-Gq7FcGA-4|B{)y<$$YhcPl z!&8HrF*Rn$CfmCk^aPL!*of#Luq%!agA`lSg>)ZY^DL-A$XJS9aH^;dfeiK#h;xaE zA&3%4%A6QaB<18z5T$2c=;otBM37-T28AeC{8(zuGfS|boB97l#S5S~|c$P~n?0`^FAHm}!#ZpffLa^P2tm7}H zi6)E>be9)7Aq=SoG>rz%9rr3V=XV4;-IzzWynDLNKu%}^Msb_p>6cg-^Vi#mGwG4x8`z*)ARe$>u4pMZ2 zQY@`NJR(Sun4pPKD2h-JcL)*`gaxRIO{+B71R72J1*PRTb)x?lY#OkHJzJ+Wu)>bz zU8h{Lrm8US_(XRMlvh$L4Ue-d6DD&~Qb{J_*_s$pJ z<6$N0T=Ne%(UcqZbXY5>AkUgWX3oPlsMP~n&3%bA)m!A6&3%!Ya(U_uA9m=Hj;&wO zF$lMf`J;!%1S5xztw-nctoQmTo$X6`rB4f9j%b=@P9OdGeg0QDy*w@F)?aQ_9?!%c zt{r%S?yi`d?v}f{(5~X!Zy)9^zM4Ip`S@Y(%C_szU%cpwOVR~q=H6bgta2vJY-u~+ za%(32`QEiv`^DnsmUGj=iL2np*Y_(2TLt;%>2>_UBPZ3b-{;?K;10}w*>t~jylr-! s)Y0|y+3wbN5_tXKR7dOwlb&A21QWei&TQR!CwzkP*+Jz-|Dj{Q0TW)5RR910 literal 0 HcmV?d00001 diff --git a/art/textures/tooltip-bg.9.png b/art/textures/tooltip-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fb2595ff823bca5c57f7a07ce1261010090312 GIT binary patch literal 6353 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 literal 0 HcmV?d00001 diff --git a/art/textures/touchpad-knob.png b/art/textures/touchpad-knob.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0c9806042de05dd652b33812c4e1fe2ccc30d9 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqH;b60xw^}u9H7v5PZ!4!i_?3jTIVqtinyNNqa=EY zZNeVrWlI+;v+`cbIUw6T>zuU1qJ5TUYzhu>1;=T!ly}>qwF@l`Mr)? z&cLUgNu$xyfY~kT7ISt2tBGaX>AioCGQSjwU}BzE%(P18@UxW_Gx+2kcwO!(Gj_`y z{^_RkQcU7wcp%0+jok(^5cGkv-`}egBMn8HrqPIT$@>{Rq8lnrcZ5@W!Gw%!$%peEI;Wu zYu(*DeYc&iUY|Z!rsT-0i=O8vFE11SfB*WEpELh4u(SrqM62po0E2+R)78&qol`;+ E0OMqgeEqy20< zK@c6vsFcHdYp`0w`2Y6!%XPeUBDsJj;54deE+9k$76GYPS_$NUW-QKagF%8g)@|ks zsGyDsI<#mlz|g+sU^YPvrhP}#X82DX@1o9B6S4`c)Dvk$b>c-C~8GGk5Uwl^e_d>X~^1MtxULJ zjITLNjAnzB>OfWfKh&}sXbp+oG6jq^4(-63%D2t*j$pf++i^&O| z6*-yb6KtG~XA)w(&Xu4(Zvh+CxyBJ!ZpsbD!E&%?3ApA0Fh*Qxk=3*Xvw1ATP4#MA zqj@Zurd$RG!vxL!tJ(D{JVC*+F}m1j3_q~(#JhO3_xMvDeijRgBs`b7vE&e+F18fl+Q}@1yh)|fg W`dLYz|1t!Em#N6((v#t->wf@cR7wE= literal 0 HcmV?d00001 diff --git a/art/textures/tree-over.png b/art/textures/tree-over.png new file mode 100644 index 0000000000000000000000000000000000000000..499ce540c624ad95271423a6b7a894c6782fb48d GIT binary patch literal 926 zcmaJ=J#W)M7xv%I2^Na=Y{UmNb*XIR7449 z3qtdBpFWEq3=DCkb>vQBlUaDRO37f=9r~-ej|1`Y8E6(dcMuWg zfg-wzGrcgxwO^f|OEVO~8p7s=cq?k$=>eOj1Za|0^<@Qt29}Uk!w5YEii}iQAX3Lm)MK#VU zTMrJ&{4`8hNMlfX^d@w{43R6nO(9A;ot@)2+Z2kI3>IDjktD+?D)U;SGu9_}GWMdg z;W8nxPcphlecq30WlQF@yFX9~`iqFftnC;gw@5)4=oYqWW=l2QmZBl#)-0!? zU{$VT(`jg`X>YmhIAdPylPx#ABdal;Mv1m~XV-2*gwhvc`CZLIt zU}7*H@IvC*#NbI26Cuh0ghV|U|J+DS3@1lC$U!q-2LlhzCa>@PUcT@9{e9EP{__p> z&Gi&THN^X(DYDl&tFD&(mm6QskgW-e89ab;xFDI33M*&`g19CP!xWU1@vEz_i=qyk zQPUZmNn8+Qq_6Xb?-l)<$(putRiNS0HESnxR1%f=5F1PEeUd5=4**L8sU6 zky)+-1b8pk=@0OMHsB*R!v+~2>tT7Jvt3|)VE3bmH&e+8sc3B17qLQg9%Dmbm_ni8 zEwp=)Im~c8&oiu#@%cOi;jzYbEZH92YN;qhp(UHDfmNgfM^PF=V>m>UNOw}uj6GT1 z+AR|)7-LHY!+BXJr3x^S_&-$B_Rtni!TosuDQu<34alURg~m*oG%nZTxH5!@2_=lo zG(w}5Dkk#?BP)*#5Q&tl2Hb~nopxz0Ff2Jsw)rg{x3F%xN^oVK7= zjm00Us<+Eks>i}s$l^&kRQY+>_E<5*i1#G(47A9w>9yOj`e>GVf{Mw0PR-8%oRblf%P{={8Ada^W}{ds74)~0$UYba*xO7nw_OpEhs<6?jGNpJS% EA8t`z4*&oF literal 0 HcmV?d00001 diff --git a/art/textures/tree-selection.9.png b/art/textures/tree-selection.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d242e1078a86e1573115ac085e2120920450932f GIT binary patch literal 956 zcmaJ=J#W)M7`A{`rBH+zieNgqC<3YR*-jkCR!vD_hX&y&N+UI69N#6eQu~a3#cq}s zwhrvD@e5cP7?>GY85k=u^ApNBO;QGerSsi;dYkv;|u-x=aIcF^&wZ+M5}uIIc?mv-%!x=Vb)$uL6d zhm6f}JG*J{DESNc38tBZ*LOe{YkUqPR6c=_}!;qC)JsN zkEsJv|1gO4)ZnMOIy-0AkOxx;9UJ^*P+hwPY9zuy5lVSil!`#r1W75Wnz{{SW<#+I zWic;mx>C?Z8O%POd5h3MZ=3a*FJ>A1h|*ApFi8?2DF`GQLP^s!D9TWl^9+%Xj|1wY z`5@k!E0{QTBQK;L2|%Xk^vMx5coykp3Vyhd4dPjuSixZGgisR1ETuWnw*L?H{RKLv zZG08)KZWDYafo3X$K)t-S>pyJV}`uVQOND2YcT1hv|LsgeS(0QGt7TI$3z8+tTBTx^%RDSe)8yMJ@r5Hurhu*4o)f{gJ(=hSfAbReNv$0LF$RsQ>@~ literal 0 HcmV?d00001 diff --git a/art/textures/vis-blue.png b/art/textures/vis-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ef51bde21bd1105d9de5ff0d2d0268eea3671a19 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwgheuRbTEJpSHBgAx)5S4_<9hOhxF0X<8Cb=c<|VLY R7y>02JYD@<);T3K0RU)*9Gn0E literal 0 HcmV?d00001 diff --git a/art/textures/vis-check-down.png b/art/textures/vis-check-down.png new file mode 100644 index 0000000000000000000000000000000000000000..12f5756ddd9bb300060521846a365bc89acb8cd2 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaDNh&25RHk+HL{O?&Tr&7;L^7& guy?Uk`y@98r6#7;mR`-jfvOlhUHx3vIVCg!0OIBq+yDRo literal 0 HcmV?d00001 diff --git a/art/textures/vis-check-over.png b/art/textures/vis-check-over.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b9d0a15635bff290e7aec79f3f0ed0fd48edc5 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt)oXE{-7@ u6O*@WF8+1ifh|GF{ql-qfxXV2$_!JsGv4g!^IZ*8#o+1c=d#Wzp$P!Jf-6P< literal 0 HcmV?d00001 diff --git a/art/textures/vis-check-tick-disabled.png b/art/textures/vis-check-tick-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..597dcf44597b8fcb97ac7d04b4cc16108e28ffeb GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E8{o-U3d z8WZTZ=Cysdzmp%Fv8dJO@KX5eN zwc9Q?>%70+#tE$+p)1&Z8d(0!oid-*z>PS>N5(D+9dc9Bo^eAgA+8Fn=@ zG<0v(;a@BK4@_TmuljvC&fPg2&(p2|-|xU@&_GHZy@jg2IrH@Cv2*+R7TT7pMSI z#M*-z+1iOYIPTu$cawYI-^P1?TolFLV&2*i9h%ug(==Bb!?G*~W;Oxlk|sTvB*}J` zW&2%N*YyoB1a6&kz6XOKI0N3i_a}>8mSsap*T4)IEg$@aZQH&8A7(aA({xvo0aIWA zTt-p!wG6FO!iAYl&FopyBXBS2DURc#?h7kWlI3~+3LF66z&r?oFbu<47p}BwW@_8^ w9QXuwB#qXg9t3dCy-PX;?y9O9uS0*6A2)DeO7qv5;s5{u07*qoM6N<$g35<|H~;_u literal 0 HcmV?d00001 diff --git a/art/textures/vis-check.png b/art/textures/vis-check.png new file mode 100644 index 0000000000000000000000000000000000000000..9950de74c3878b568a8db4989bfcb0bbbfbf3375 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt)oXE{-7@ u6O&EM%>JEsU`tSPzr5mDV6U^MGK1oJ#x46#?>qxk#o+1c=d#Wzp$Pzyf+}qQ literal 0 HcmV?d00001 diff --git a/art/textures/vis-radio-down.png b/art/textures/vis-radio-down.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1ddd18c0b386883c6ad45072d0817ddf0e6bde GIT binary patch literal 2955 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 Bd4m7| literal 0 HcmV?d00001 diff --git a/art/textures/vis-radio-over.png b/art/textures/vis-radio-over.png new file mode 100644 index 0000000000000000000000000000000000000000..832126d8e88c8de43c96bc71506451fae306a71a GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt=yNT^vI+ zCeEF-(Th1y!1er|?HQup+MWwPs$XK!aWPnH7L~i+esk&xc8-H?xl9Lr#kOq@<~HQe zZ0=nq7`sDkx3*(XO7ZH%8OGoFdJLDR71tYcY%1R1d?D{*9aG*WosLUe>~+)E>O`&G ztK6v<@Hqdh3isrc3%?n;UnJFCWb)kfSVi*7nvU;(`Y-42^^WJAet(Mz%Z7({Zp}1a z9LuQndE4A0exU*x77p4CMG22Z4{T(P4c|6-UCcCAL4(x?_ExSxu{5(@EAm9qb}o@) zg@0Z#s!g7LysGy1!5-#>+KIw1QcQO3W%-b5-oAa;Iac{6{DI7Njn$sA?@O&@j+H~}U&Kt(G&T^vI+ zCSJX0$ahFVg7rar>I>61FDzf(Son}7@0-)PxQ3RNja5A1UnNvn=QW!(wjJA p@#|fG_XwZ7DDgQiI+6J&1Jfy|6%T*ZCIj8f;OXk;vd$@?2>{FQbMF8E literal 0 HcmV?d00001 diff --git a/art/textures/vis-radio-tick.png b/art/textures/vis-radio-tick.png new file mode 100644 index 0000000000000000000000000000000000000000..5851c2b1477e69982f4004beac5eaf251acad160 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt*#rT^vI+ zCSILr$alzq$92E)S1E&{c9pIWzC&*MS7ug=EOD`9)-LGrF=Jji#jSJ3Z}b1})sGu) zkPbZEV<~}U&Kt(@1T^vI+ zCeEF-(Tmwppl$!nH;JOB3ksHQy!$N9$zZKnRBV3SGq01(90%QMyZ7qy`6@2Et8^nn zs_@~pLvvU>kL+GA)%JgOVnT~C~uOTjejgNhQOIC0wPAQFDe{0Pa*Lly=5AaBA zn!U9{UOt9B z-@A2A&ub8VkZ^yQ#N*cDcVY<_%JzQmHt|hY`gHKSGf$)c1Hm0^dUK0IXa8pkDfg8S TIh&RQ3<>&kwgheuRbSnjcoCs2sj)5S4_<9c$1)}asb3@ld|f7Uu3 RX9h|zc)I$ztaD0e0swdT9jO2S literal 0 HcmV?d00001 diff --git a/art/textures/white.png b/art/textures/white.png new file mode 100644 index 0000000000000000000000000000000000000000..5c94704012a119894b2630d2d376f2134d12dde9 GIT binary patch literal 2794 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 w0000LNklU Q-+>Ygp00i_>zopr00BE6EC2ui literal 0 HcmV?d00001 diff --git a/art/textures/window-noborder.9.png b/art/textures/window-noborder.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3521ebda25886a5cc3cd4871844e150b795d6e GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^vOuiD!3HEtpBZKWDJxGG$B>F!Z!d4;Wl-Q@KBy!7 z?Y@ByLu`k}JJsvqmXG30-^M&!wbF56fQATHtJA^@$1@xk>V3Aiy359V(b`_*u*pN9 ODGZ*jelF{r5}E)H9we6l literal 0 HcmV?d00001 diff --git a/art/textures/window.9.png b/art/textures/window.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f01cb404ebf25ac511f3cf103aa3199564bb2762 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^ia_kk!3HEXF7f&?FfcNEx;TbZ+nua=;LgwTWqSWhqU@6lUaNZw zW!?_kwQjT6nZtKD6QvE>eL8Fzk~{P4Q1 z@8$i?a$gpH7f<@gp#P*&&oxkj``3lly$yF%5_qb%3jSz`R=D8JBIqLEh(;XYN-8Xz zmU>f-<4czEt6kGJ>GU$KS|wH0Upup^NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K*oGe7srr@!*8bs@--;%IEO#{r>=HT-m^jB z_KdcSZ+7Afw}z+`$s9MFpueqCxYb9*M{R=^-;um&91T_WUz;ZGINI{+q1~$_mFHLT zRv8qo+4Iw5!I=h+S$-WnUpDr$yqbB8Mf&QSGe5W1s2_3vAhu}J70oNHkJBa@bqO&v zggx2UB2`$(R4TM~#b4t;*IZ4EH&%)2f4*}5L{8G|9gi*cKVNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K;z{+T^vIq4!^y+(d)2-#DS0YY*sAl?K^I} zd&n=;tL)+NHR8G{({irYLX+?0E%pzFIwp@YI8?e9rU+*#9DaU5#LGc*o9Fc3hYJrM z{M(mr8L%>B)njvpX9vs+uCrHg-!b{XP{Ft)a?Ro>!#CE1E)O|p8c_&@j1KCcmJ408bX2-bxt2Cjh*SYoXLjiu-=9E z!sCTyA6M&re5hI25GlZ-ewfj2l8U9Ion-&NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K;w6Mx;TbJ9DX}>f3{Si#IgC-Mb0N@=zQW? zKDldwu9M>hdxsMl2OT$g@NG&vA%8*MnR}sv$V=Y0zB6N*c36~@c6aYs^+247FKa@F zbFKB0S!#_>T=?6+*uDO}@BHtFv2h9t3J>btqtiQ*@WST$ES>FCjJv? zn={O2=XV`l z?X~j0H1~u*bG(-N-QE13;lt;;y9Pb`YgdG5T`=KoKFHAP_L$+o(PiRnCtu&pQBzXd z8s+PAd5Y6Qh4X=H!&Jq(IZu|?anx+g{jGPWP{yB8aAMeMRh9amiUOSNhcD%Ae}AZY z@4V#)N~}aDJ?>?V={)SCrabxNk>ZcF9$orO>yD_O-juR4X5E$=yZPKFrSG%EbmsRx zUZY|l!`GT}KEE+SMQEbm^2eG1>#w&y*}0x+or~r4(WY45m`tj%(^n~ut9-rh zG5?O*8U}fi7AzZCsRR5j=|H_&t;ucLK6TrTOfY` literal 0 HcmV?d00001 diff --git a/assets/cursors/label-tool.png b/assets/cursors/label-tool.png new file mode 100644 index 0000000000000000000000000000000000000000..aecb1bcad3639ae06f28380d88b12df023ea54bf GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{-rdAc};L>zuQ%~7a9fx~s>OQk#i1O97l zD^i--m2da5_KCh|$w4z?{MQBU5WYy+c-XlO! z`5kF?r_Qh}*tYfj@;5FYN{<)%AKAq1*|9m{Sy0wHk4X{5%todkL;ZID?*zJ3wZt`| zBqgyV)hf9t6-Y4{85o-B8W`#t8HE^{SQ(mHnHuUE7+Dz@q$o5_MA49&pOTqYiCcqc St)(td1B0ilpUXO@geCwsNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K!&%ci(^Q{;kQ>ExfldQTrW?)FK#IZ0z|c(Bz);u7D8$gj%Fxux)KJ&J$jZPV zMWJybiiX_$l+3hB+!{n{Ep>q!BtbR==ckpFCl;kLIHu$$r7C#lCZ?wbr6#6S7M@H6 P1pNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{-vJzX3_A`ZWu8pzk6z~emkqu7^!>W}5V zdOJ^PVO5`W<2$ST8eN^_$QFS|?;}DKC+!h6&%SnF=`w@Gb<6bYGflnjoH?T{mGq$M zsS4+Txqk#zW(GYNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{-PJzX3_A`ZX3WXN|wfrB-m{&Mt*SAX@7 zO2)i&aVpUW+x>UDrrHnAr2>M2x<NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{*_c)B=-L>zuQc_UYY0gsEYV?mMlpa1@E z9u)COtqjePHdT7k=zZ~C>>dHjzQ-X<4DsEMg@u*$`d4-e9P+z!#bwr?Gb{~`)%M~N z8J!uo>=Kq)SQw|jugDV0UDv{JY`bsFzxvC5OOkGh=4u_?{{6b149n9!U;IKF85G{l zd$BZKl{M5nA}B6%%8VU*oj&d`6<+b`KxUKclGVQdEYzYWER5e;efde><3IBxXNE1h zRrY|#3+QIm64!{5l*E!$tK_0oAjM#0U}&amV5nNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{+UJY5_^A`ZWu8pz$Cz|$i8<$wLU_1B$s zj~qF6=hIU=jzb%E-)@`c#G%;8a3HVnO4Rom0nFc5-)v#wjJFrgyxzTq`yyLN#j-@h zheiwxwNd%3drr=e%U0cET%aQ%spjLI=Q*>EZ$+brVla1FX87s9J9p0iaq#<|dF7e$ z=hvs#=O>*$I@z!#PPj!t=oqK|>FKQn$@&67cd3@RMwFx^mZVxG7o`Fz1|tJQGhG8i zT_d9qLlY}QQ!7(LT>~R41A`QW#)&8za`RI%(<*Um5UsV;1!`dMboFyt=akR{05Pe5 Am;e9( literal 0 HcmV?d00001 diff --git a/assets/cursors/normal.png b/assets/cursors/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..cd20c54916883687220f2c70eaf0fc6c6ea5871e GIT binary patch literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L90|U1(2s1Lwnj^u$z!d1|;usQf`0cdw-XVb^$L-(WE1dOe znq~R1C>N0}8(i%jI(j-*EJ%I5z}H^vYxtM#E^qI$u5(e*_B|}*SiJD$1O7uMXGfd}WQ(~RaR3Yv8_e+988N(687-IuYbe|I6lqbR1oZcJj0?-^QGRhaB8bXF|g&0x_woDKmB+ceO>sXx$MqE5w*X6i*0zh|GtAQ>z00jtc78# zciy~dslFsiJjm90#mb{cUCph2T~xdx{(!H5c?ZuN)>9_;9OtQ}@>Mb0eJ*{lvv>97 z1Fw!85jpyZvq7}wmG9Jr^NJ2JlGsFNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{+UJY5_^A`ZWu>d19efyZU?rRW*I=jXgL ztiLRlId#3#u9@4rCKwbdUG(8lG<&?ZQ{|^-S^m29h2K=%j|el*cyz!ph$Z3F+jc32 z1i_Dzo|!Je50A<&pR($?>XSvMk9zy&h~Cetf4k>N;JJb&*@92^d~euo?fLBVs@8?B zA;n9=@2q*OpON`szPA&HqSqe=v&;R3222yhfbLQ)ag8WRNi0dVN-jzTQVd20hGx13 zhPp;ZA%-SahNf1ghPnnuRt5$s3XKy{H00)|WTsW()*xDIsSDJ=;OXk;vd$@?2>>=_ BgGc}X literal 0 HcmV?d00001 diff --git a/assets/cursors/right-rotate-down.png b/assets/cursors/right-rotate-down.png new file mode 100644 index 0000000000000000000000000000000000000000..73f56a9ebc5e8a1465e745603f90d44c908b9b5c GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{*_d%8G=L>zuQ^&rpv2D^0>To?82z^^EP-{CN-dx$r&6JeOnnJIe0X$|C)c z=K&K_iVv?om3sGZ$kxQ|GX)ytbWa}N(Y;)%Qn2c>r`#^@sZ%cPkUzIe*m)Iy(}Vn- zjGP-b?bN^h5a@me)e_f;l9a@fRIB8oR3OD*WMF8fYhb8rWE5g(Vr6J*WooEvU}R-r ikfP8y5k*68eoAIqC2kF(wU)X-4Gf;HelF{r5}E*)OO$^A literal 0 HcmV?d00001 diff --git a/assets/cursors/right-rotate-up.png b/assets/cursors/right-rotate-up.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfeb25bd88173625b26e74ce1a325268747b844 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{-bc)B=-L>zuQc_Ux50gp@V)C_gI1hmVdD|1i9$s?-f`ZIU9-kHJCr10Vq zd;Fq}2TOwPn*rUeTH+c}l9E`GYL#4+3Zxi}3=GY54GeXSj6w`etPD-9ObvAnjI0a{ iQWP2|qG-s?PsvQH#H~TJ)>0R!fx*+&&t;ucLK6UT2a%}& literal 0 HcmV?d00001 diff --git a/assets/cursors/rotate-left.png b/assets/cursors/rotate-left.png new file mode 100644 index 0000000000000000000000000000000000000000..098ae7d28e2aea0864e603cfc402177457f4b77f GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K*ldm7srr@!*8b=X0d;(MR1r$c0V2_kdkH`gF@$rbph&_MW>m)+oMdPTl?R?D02!9Y>Qk zzF}DL^PKdDtRRM^SH2!8JY&(vz<-RjNg+Xk?VDObbx2yI*u|*sjv9%V|FW4rAUZs$LlTRqv+m!Q;SCP%UwdC`m~yNwrEY zN(E93Mh1pvx(0^2Mn)lqCRT=~R;Gr!21Zr}1}O@S6Hzqe=BH$)RpQnlT5G8b)F276 tAviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3Dk#nvJYD@<);T3K0RY||!nptd literal 0 HcmV?d00001 diff --git a/assets/cursors/rotate-right.png b/assets/cursors/rotate-right.png new file mode 100644 index 0000000000000000000000000000000000000000..14fc0166bbc325879d5eac462366c5351c7d9b1a GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+K;wBlT^vIq4!@mhnAPGS(iYz|;oP-DsT;X= z2^_S3!}^UOllf(FgF{!t+D*|MVPe&-YjyTICTQQ*6<#)>;nz}5#oK*}Jf~|6&WafS z|9$_=e-|CGZdc(4q7~2QtX+Bfecy5A)mORhf3Fv72xOnNOp&9>lWCoL#*Yv$&->qx zb^VLoyLyU}r_i<6rjgS!tsi7$Ror<0-H4|-Bvf_Y^S8U!Rf|lVtI0m=Y?^cAGzR?x zMKbOUOEnqg14S-w(>?I^`@N~>B7@}~&R?MYK$pjP~ta!X@okd^X6ra`q>UkF5Jht&@(oT(i46$Ec zf4J1@FAWSJ)e_f;l9a@fRIB8oR3OD*WMF8fYhb8rWE5g(Vr6J*WooEvU}R-rkfP8y z5k*68eoAIqC2kF(wU)X-4U!-mg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4hf?|=u M)78&qol`;+0AmTuC;$Ke literal 0 HcmV?d00001 diff --git a/assets/cursors/selection.png b/assets/cursors/selection.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff988f2bf8a6002e02b8eee3b1996c6a3ed51f1 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_Cwy$!fk$L9koEv$x0Bg+Kt`&ki(^Q{;kT0w`3@-XFdM%5zduK;W!D0! zOInLQt!*fF2 zc+IrgfFWq1|BLf}PrK8Wm@i~KC+;zuA^A*xhTK|3Q42x6LZF4JC9V-ADTyViR>?)F zK#IZ0z|c(Bz);u7D8$gj%Fxux)KJ&J$jZPVMWJybiiX_$l+3hB+!{n{Ep>q!BtbR= r=ckpFCl;kLIHu$$r7C#lCZ?wbr6#6S7M@H61rLL#tDnm{r-UW|LA-c2 literal 0 HcmV?d00001 diff --git a/assets/cursors/up-down.png b/assets/cursors/up-down.png new file mode 100644 index 0000000000000000000000000000000000000000..549b0ba8e1518ece90c4d533f786cba80db307d6 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2BFf=qXF#P-vq=Dk41`G_Z5*Qe)W-u^_=TC}1>IPKHmgMd3 z0;GZ9r}OT5AjMhW5n0T@z%2~Ij105pNB{+UJY5_^A`ZWu;>dNtfP-c07x7>Jr~hn= zdArb8Q}IF?@05n(Qzv7u^}2XYQepg~WR%?BvHI2Dv^2M8Ie~>rN})@GxTYN0@H*^I z=gf;4LIF9Y@2_^uoO`&z)Is|N=R#QyRfEGUf4FbST`|>}&d{@acgK#7mOjB6_I=Af z9otpDApDT3wSd{j*%gyiPU`R-xSh&%X!$WFpu1E{Tq8H;+|c)I$ztaD0e0ssRl Bf~Eif literal 0 HcmV?d00001 diff --git a/assets/freetypefonts/Roboto-Medium.ttf b/assets/freetypefonts/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a3c1a1f1702ebf8f5771ae96197539ddc507f04a GIT binary patch literal 127488 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

9AxHZ~IbT3h=$85=u+hltSGXC~N5kVn{GK7RUy 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 }9naMW3e6&}Zp3`W)R(pQk(M3v{RU3Vo5jL|>-6 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 H=d=F@iuu`M literal 0 HcmV?d00001 diff --git a/assets/freetypefonts/arial.ttf b/assets/freetypefonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4ba94d112d2550359d90b24a3c478125d6320eb5 GIT binary patch literal 773852 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

AEJ?@zQPO$eKLFNuh5cj>u{qj*; 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 z zgb{{O>&k0d$pR~$)$Pxz?|-$e{ZyY#5*id-GwMqTg0Oqh7Z(t4S#y~y&OA;q3p=91 zXOF0UTUZMiA!K{v{Gr&c*uI!}G4^JR8__vY{&4i^C?64?9Oid~+1$Xg0KeVOHhb9| z&r;9Bo~J!8dbAfkZ+dtr5cc~bQLiT!cLtT~+_$;;eD?|v$hm!P2(!BrdJwuON6i^n zq(MS)@xC@TTPy(@ON9CCQP4V$8 z)msF7Wj+y(0VWgiAxIvN1ib-JqIB#hC#wLmg2glKT^YEvRu}-`{uT?lHf>rn0g?)y zGd{tx`<6dgrV@Q62z`~{-Jb`8V((ACfA6+cJJ($G(1njJUe)sj)Q`_#ojJjO)_IHv z~8AayST63?ZB#m zp@FC@-lKh}`@jL#^-sLf-uYR(SY*8yzh(V%``AZc4!1tyyqU?~;ZNYHLFM8-iXZb5 z0-c{-#03Y&oLEZAb*BP?#G~yM{j+ZMSy8NbMI1kfVgsPSlBWG~t~1kC;i;#Py4yw9}Y>wX4;|-WPudidV}|4xa)#sub*15(elR? zE6RJ#YHEyDfdtf8q4m1yt1qr=9p;|vXpN5Kf6tFI`$XN1l{oJy&4(HUR5e1Yv>qb% z!~S-I=^tCxO{TBxvB*gEwQ z*+ORw4MVxdQ8P*9643lY3waEmLlqn~BK_#eD*FXiEcE5@!)~-Iibg71_3b#S#R455 zQ=i_X3#ke|ZQ;RbWITMMg%$^On-y{a0m3?J+TeUM**lkhuS&L(Et4%&p5~=!VUe=o zDIc{^1`TP<8VS=N$E{L}{R|Up0(F}(eMSu4hOx@C!NXU9+u8mM8XOdH(?J+|hzNxZ ztm~wiKyhpv{)M+Xw>zJ8iUm|-E!oKoi=FHs?osSLYn1m-TPQbQ*SbYOJ7d|b(gEq} zjYUJjOB;JHs4i}raaz7#%QKm1`Cj+fwiUN_b+6NNQL~-y6FNPPppRkf$hY?>c3{o` z2mspWb2EYpg&1R#H8$MFTJ7v#0ro`{I+1X(ibe_6CYUZFq7ub)(sUV2#9i*9Utly` z=yn)$1j*-2s5Qi^Lw%7T4O7>P=CGxVXILwHfxW>#U|L_WB<@D82Rj}AU91?4P^!lb zL2%U_#t}muXE1`DxjaSqj;GSDCK=e4M-y!NMaK?7q+$`cSO|%lxBpS3NI7{}A%xwd zmHF*ucID;amS%qBx`6|~)7Jm2VGD9QmyZ}-8Ecsz{Eu}{{8)YDx$|7Ew*FJ+xAo?) z=8hHz$J~>%U46`2z3+&(F>WqiYL4FJWOdH3oP4lzfpeu(xShpLUT6Et#s}LL*jD1o zv=!U9DnbGnefp3U!trZ4g2ZYCu{!`agwD9C?G{B(DK3ZI(060>oVXZcS?)83W>sw0 zos=q}k9dtTnd7D%U$Fc7^p_aHoyBSTcw}e(wRv*jQ1GMB&oCT9ZU11Xg=8Dq1B_Q9 zHj<|ZQ$J(KfP?yFK3lgFBha*@TTc9_RBo zkQp>0#1`#`1B`qLtQRsK$n}t}1-^_$g}?L~UnKbj)cMnw3ty+qvh{|G5t#2T5Mwq0ydl9lKZq*bnt@mdUs87WT`8z z>ABsakHohG#9=*B((K}F$I zSDRutFMHCV;-mt)EK{A$S4JADvf2QrBUw4ekea3N4%P$Kf+VA{QnY08;J8Kvx|Irz zD)Ax0w$B+`KX6dp==oazvo0Moq*t9eO4^d$t((0^vEk-IlVH{yMH&EggsX{RnA!%P z_yFtzp}SY3&Xkv#5tO5tXjq|4MiHwWj(o$Y!1CWVjFrj4r?BL#Z(-ZV&Y3^DZqUGb zb>*dJjha8otm`#|X1y7A>YdsvxB{Pf$`wO8LW)^cSN6(Qa&X3v?G=iXPdkbhr z+OiVb(S;>#mc*bI6#~E09JP8yNySSCt}R0+(p=X$*wv3T1up5&yg1THU1>k>7_@TpoXFl?UIs zr0m)QFIAMRSUt+za@MrJs~-h!$^A9=7klm&&;~D_b<-D<>Tt4LuKZCQp#BOcO-i0L z-LFgKNi$11rVfWSu7g7*O#-(a{55_Ajxo5sR6bBMHL8t9>C$#^eEp11#Wkg{@lWye zHdy7>YZYgPTYp@896!$tj*vGtQXFSe(XnHlMX_VkisC-`QEBXG%mW@I3-6+gRdk~c z-ycxEpU8<{(^~Cr*=1&mIDrpnhqX^N%?q3nAV$E8N3ud2$hYIh>~5Hr z-UhUW^;%HF*y9`x(@<@t{TB^8hKBjz<6`A4l7&Ewsl#&@K9ZZglMQ5p)!ipr#jnva zj+U`f^)hxn{92)unU1`etwF_4WlzCsWtu7v5>)+4SSqoZT|Z|Ie&$T{>OJ)_K2Ccc zKYIbt6QWx5g^?;iizQ50w>Y3?Jc%Ku9pXk1Ls?77{WOfw-F$-SrTIZ2s5I}zI*tco ze@r8m#?2KrC)z)xoBap-}2Fa;!*TWR+^i~ zu0Qz{`aAF`yfo00lO0b1RKq*~py3z>&l(pq6+CnXs^K`dMh|g3C`sZFmVhIiz4=kZ zZ=+Ex&K=@EI5{7`H4Y~bbzy8fdlsYA%9TbM5Z^xh2tYIZ2b~-E<+(!}srUHV*H3;Q zKQsS--+Q;!d%HmYP3l6s?1F;!$xV!P0|C1Uj5#pVC&`49G-e`*Q_ zE#DOGIkhR@wj#8`idZQZ1V>CjVb=lm285e3&P32%==wlYbEvq40?Dj`&xODPb|y-& zGHFQ$qFLz|7(&=>w90WOS;>&GSP6w&Q&vwK`=`d$%KiJldS^ea z!(C!Z{<%X;FCSVIMx{7@Kmdy>EBxg{}Y4Y+uD@*HwMAXQ|y6+<=Q;7_9^_yf{68A7CY$0@eb0d9hCfBvhTuhIbmdl*1EF7R|VjotCV2Xkn(6k6a^ zE;ffN4m82&*#?I((**br$p>nOO}4|*>}<3&JJTeHgGeg9gD#myEXX{L5rwSnJccCvuF|8RLtD`2kc(#OY3yoz_;-oT<}&5@i$L5=EmuE z@{jDhC=rP(9;M2RY*(L!HD*Ab0ll%3;8d635a2lrFr5rG32&iW#`jaiDA5=Cm6s+??GfSM9_%T0~FyW*s=qtFN;kTjP24E0vXm?xG;M-?>`Q?nSzLM|7?80YwtssI# z-s(nptE8PV-<5kLAu-9xnmt22=Xj7paEBDBo#AwNU4dXoaRnfoAdA)!I8?@dIYRvVZfSP{4(@Jhhwe?#D|z%%&loq#qaFfXt?uqW_x;O&5Zci{2B z&jMcsR7l5wT#IBTGNDl8+=IlP~n@EM-{|^M`EeDU2nOL!eA}(w@mZxhi?oUTe`cj#=x*eaSEzN{hIm)(idII5qx9rv%2byw^rBXK3ns`3lBscj%ZmLj`EK# zI=^M>)|T@x;uq!muvbnz>1&I{+93RiCL#`~yeF-#)RVwEQs7dNE(e>=cp6qIvH|cD zkO2UDe#?6+R;dxfusW!nqpYCHz(1|rhO%_ace4aWWjGmV8=hKb+VSWUQJ zn8#x^G471BuYkp=57!eT3IZG&L=RuviQ>WZ%iLZA5MRoR=w%1X&7ngGKx5wN&?%`z_o_Nv!swILWsjh!NeU#hw&PmPsvLn z+`>Rqwiq$^qV^hJg**K-1T0b%PcB%5F>K5o3ZqcbHXIJ{uMjaZaC_5t>PiK^GipZZ zqIT9dX9q{eL8wkd3w*T@M5C=#$Z4NSTqVzJd81n2gJX-9LKkF5=Cx7r2#j4k6U&PE6YB>Re;C{pOAV-r`Qk};X={Dg{Yfj?(&MKLB@Lz-%|P`V6Dk-Tz@O6y zHNE@~zYAZ<`f2d`$e$m%MI3_6OV20&AASeFc?-Y!|L5;u)RdmTLymyJ2!N~*vx*C_ zv1l*&X#<(6K6pJwZkfV@1n6u+SwUctTa3UpwGr6?!%`p5882JNDeNfu+qh`W4r@ih1dJNyTQXOcS&$|p?b_OOb zPBLj^D|g2K8O!@=omgWfynTJ4fe0qs!uCQ?as$wo$of$| z=t3(rN!&+;5GbXr|B+8wcSkA-kCP8t^0Nv-%iJr4&$`2x5B7*-Vh@Suu!ro*XtUu; zeYMW}=)-kHU%^#kcamwv)vPhhIM=w+SZ!>?6L6B)uv=gi%E|Y=wjU>{Ty4My0PqFF z3;Tvf1_%N19CluA51Ykmv1G9VbB9=Me&yz$JJsx0K`uJms6U|dMLHX*BL-QaXAuGE z*$ScCHW=FszS>}yBPG?N2_)`-X7p?WUGrV-2zIyQ-oIk^VGHIA_Jws8iEq2kk4$aS}O_^l2JWU%_MVeuAnD zqI>m};t4pl=n;42R$Gt2^1%ak;{fjNrJ)QlE9neZ#V$I<^_Mhuo5rrx*eqmDwMj^b zX-vb@Xf)}lqF&(*&n)!I>QS4uRy#{3$n%;1W_st%d|{6#+3}?E{KC*wJnU}49@edn z@m+FAu{dlB9)qXQ?t9uAYzl$scGd;(_x!FHrkheU$g8q4Y6J~B zXbtFUZKK8~QMwSrh(lj?uP}hqIp^GS z6;8NN3%a@)xtnE1U7-1Pjg8c%#1Qj6GG*(+7^ymFV!S(9B56a6)&P?vb`2&NHP2`a ze;?z|a=r-Vyl_2>jpgiGDtsl5233KkTCTCVB-)6cJF10Jjz|E_+LC}+0ifp3_=xTa zZZ%kH1k^lo0g`~t1v$ny@}U@dG?CGTV@Kv(R-c5y^031A5{2EausVf}z&3y}p{mA> z8;?H_1ba;4OfbI~B!RpWOPrwN4(DF|}rjuC`dmEFAJv?LKR zxLgkUHdt~n?b0cwOZBBwa$YQ*PHCZW9q4>oXX}Yn(X(d0!j@Am0$T=0wA@RcgZvZ9 zLy4FRLb;1${2oZ|OrrJbG6C_#^2N}JZ;-Hxk0^JrN}D@C>JZiqvJq||Qs3aK_O_(8 z&gd+pG(~0*)CaXEHNI0}n-mbv7I1b;4A+8FXK72nU0hqx6+;tsjj~R@2+xA529||w zHV+b2OX1U^6C<+IPMESebF~#3$3eeQ-YN5Y!Bi39u_V@(mX>EA<<5xFNM4~qED6DA z8@_>r&`_=9-^b41Aq_Vw!5KJZpHV4i2q*4FncXKNGQ>7>+yh6o!}*-o@P2d@I$R1; zVZiL9&dW+`YN9(4ovyVJ5FStvl~GWz|D;91#ZNy~iGpSs>THCzscgN?Rp_t)i`vqpAnD~P!I?|6wJ_-kDdE(F$|#Sn0gMnVgLQsD zQAIx@yKiqt*STx}WL)uHJg45@?&3Mc8%wKGT49X1PtXc;3mXAKN0Ef%B(Z44*g~e4 zYV27kG^($+5$Q>arEzm1*)gmFKO^i;Ax{>?!j!q3Qw7cRauup0lGJqp8_v2yk}kC- zvX99xEon*jLZd%4x~|zolazxJlJOlndzj8*4w9b(ouHaS4MP>hQ0f4sk^__uBjE>s zVR^@0m0F>yNnwLrYqcXQ9N~B@aXo7T`3g4>t!w$MT#n%fr*wl+y+PZq@kdl^Wg-1o z)}`7*+BQvY5LB+Z3UxMJSEnkvd{gyRl%AyA+hrxsOx1jM$v>^M$FTgsy{ZU#+k&XfPxjHmzSbAi+GY;i(qQg5Tx zd^BW)TkmODPs+n^S3tB^@r|6L%qChP<6=Kp2B)Jq3B@?EGG?!`eHxOSb(zfu(@+;b zQSylcde~B?OKpq*TGWoB{e!qT6%|_DHn@QFO3Q`Tj?4h7l*5Wx4(X^v=7Aw7E5g() z^Wb#0Aoi(FMBmyztg}A)NS)LnjA!&en=i8$`BAYt1Pv4w5Kl*VREd~SB$k(Rxh;@l zdx~&L%9h7H{n;kV@T@T3#^@0w5}B7%>TeXktiPr6xjLJI#5X|%_NB$hSk36*w*7Y1 z@mr4mjM>;%jE)n3nt2MNhkwayTh4zN%5`fjO=E72y{ogA1qINOSc$6%cWUvsa@&||=@;#^$Cc}L!tF5aKj*h$c(vF!@m z#n~qCl8TDB4wpD5a9l*r3IT1J&+X`eVPC4qV`_9y?l!-$$Wh+809r2oMWIX*?1#30*(U$xR&C#l_w2D9t^=h#f6r3t#Ci z0VeFT+5A0BikP`MrJhFqdhHpQ{_Ci)>{6ZGu1AlG=y*}?xqLivI*b>5bA=OuU?}_| za`%|=9MC+)>(r-JK38QOSziqGw1#7Vj63)!Y-~#2(H;lDo z6E_nCWSeg@8~FsxIYNUIJ$+GP$h?1u@8HUZnRHN6XXtZD?%b7uBAYX-cIij=# z9o{2lw9{oVjAbjXE6m7AL)f)KbHPov`9@Sa>0|j&n(3)FGM*CSV>zN{t!~Xfy4AjN zth~VEHY1B!$3VWv%zLbnz*(DbGM})#(2-GeX^7Ebmimy2_%IuxvYsldRFT06fHhm; zy%lz^{8Jkt;aH%G*$90`*qU&zJ$OV;X|^Op5%iTg4BQ14`_rUw0}jrZ^>$Dl^`5$|IDy3h#qMAa=$Ql=QbuI`))}oim-Wb$!_|G4eQb7hg`} zM!XCTX|B=V^1mI!=)iz)$nb_l4Mc&VPO2AG{fWe<>S!b80Kb4VcqsnflC~R-YFMgs zDV4vE%q_LFOk;v9obIuhk6>t&A|Wx~Ns%BaLQllN06o*;pCPnI^z>%k`IML)bxNg1 z0K@)p`NRM*(g}ymIJOcF864i%b`Gal2(Ou68jRj>4ny+-=S>n&?@0tHREA`Jh-#I} zPAcq}!Zs+|DWQ|C;|%9e3n{uxdaf!v5glc5GRaXC{eiqE$wPz5U;4|1%h2C2qwGHl z`$+jx3=Vzypvso0>@9`u04-3`&7PGXCPxwLChAZb$A*f*dw@xAk6Cwzbd%8qJSzMs zfLMY>0kMP|MHX@-FgQ+-`>`NV=@CY)18{*LN@=X6VX-D1TGr8p_XsZtYXIGMrm;>S zM_@m1>r4FrS&TgL5;^o?vM zJ=4Z@c&G+j86HpD(Md4|gu86_I~{pZL7B#S;h{yB@{|drFAJl%uA7m+THB;Or^%zW zdW}D$uoYW)#P3ptI$|$jr|J8oX#fete3!ND^)gGIMlWf z!R$_X*OjzJ3H=VR3QBDW5PTM;^PstJ8hZ(n3hAm0zlEg~;fPo|A2n|NUyU6lTaS7CLKdoQs>;UDsnuIW6C?^h!n%Qh z56c>?gNW8LWu3ye@ZF-32wVyf=pT6t7 z$jKVRAx54If?;sunHrn0Xzc3NY{HHLs-okk%+Ia`Ai0z60Am+%ZN3;N+$u6N5UzM5tuS!=<& zYs}AwG1x$~J)q_{mzFEjY-(&Q)6vK}uP{VUSIRpqtY-79HRxq0% z5h7~zMj&Hkr@qaww0Df`|45$4q+v*Sp0!z-ed)Js^Gx$M^7>dwa7rVMa^RDPG}aTW zzf6|oO>1~;|QP&NH0*Q{_^1~mu&FIB@UPgkBbGz9m`dO3{1%axj|d=c7c5cNsxl&UQKtW4h?1;@77YKC`OXyFAto?M zGk@&Tbqd`&$JjQO?1i|mfVw^V+Jf>Fr*{80=W*+;UM4q_-V&=^G1meU-Y zF+DsX9d&5N=QOwoi8bL0fie=@`K_K1%*L`auk?g?!_}Luh+kw3r&Nr4QdUS6jg!C2 z^+D`SP7h)AL#qooN^-qft`U`lnxEO-$b(LWcO_LPe=CwB(*)s!Iew6XMR59+9v0e< z&1|yJo{`an=Y#T#06Q&6K1rLS@ex1B^I@HtF}|E;9}ALV07jcJuR|JWw4JKWhu%;T z!Fp5X7W+}gGG)ox`=Tn}hXaY-qNhZ}^C3JAKDJn(KelPIc}e+s?C5k#=0ye;L)x20 z<5@=P_lEK;t`O)W62Y_GEri@?&@Yr5=C&NQuTjv4rc164q&hze$+DQ`M~oZc#}>E; zBUiAoV0<`OF!HbY5hSoTueKBN-TIKoj)8u`#KoKuT8$1Lu^PX3+O*!*ksJd8F+ANT zBG^U4AA-%;B3nc!KR1HP*jS{Av_M?s(Ks%$It5m?qHfU6u)cDDGjm8ihnvi$@Hjw) zu&2kFn*h43x!G1;ccTav<|L7YGM_)nQIU@oizGSAb8|)T`CR7Oph*aRZO#O?iM-T%z z{g_E)45u{1=+z7aw#zWx7?6N~S-sJQTBK?Vqy^LRC-UPmUle0o3ELm;hX@fA$^2Gy zMIuAn7=y01O(78hr^}9n<7yGGX3z*IAiPa9-Ry0zx5t z!p8}O(u@FqV#AXwNxUjFiBK4Wsy;L~S`@L zYCFR-vaSwkiE%w()O{%b$So`-14ktjlw!w3P6%#q;B4-ru>daaAPBqxcRDBy6Llsj zLEa1@XS8 z6`5R1yOG2kiMGK@DO+L?6YaJnS{PiGU3mvPvRTQ$_z9j*JeD7|EBhI(pP_4x8#E3> zWV*aaeojV>Y|4fJia35}x*hI;+EdTnB04srdhnE%luS0dz*__ddqAs1Mk+8HZVOp= z1T43qaE!nu`(KeHaI*zmV*Mc>nUBtbZs~?2g0CUME`)o@{bN?hA>sBK4yFo}zkoM* zdjv^yBqRY!3sf^(S*Gv}WE|QSDPnXIyay3ZkEU)!(}IZ)1fyFN#qjvs<}14@S@C*q?Wje@dP@ET`JWQZ$LHNk#BFBW*2!q0D3p1C-7kUBl)>68=O z5mDBawwrw}B^Ds7KxA=H3daIjhW9nP&yjmyKalmJ@+AZy>X@LoUASQoe~vv1=Unq# zg=YeH6rRxFw4|E~P-D=@@XtgEKyjzovF&5j-c3uUY0%3(6Hg zHXoOF$L_d8nrav#g`$Y#y3I0;L!(0mW%3k|p8z)(Sw2ou%B9%J*&{!e-NEmIoaaad%K$W2x^sE8L+qW=$MdLe8PubEwcgWLyV zZ{%UZ|2Z(K=YeWq@`F9arC5|mzE^C73La}8)$e~WhxTRbS&z-|v?iE`7O^rV zj^-B`&nfjW3T=o%xB4goW*ct6P(OzABclqV|9{QNec2jeGld&y*mm;m0=-4X)ln%o z*qd%*Z&%nO3Y%`PCalFP^hc~sN_-XdP4wlz7mK)vzXPz=Vpe5F+D@z@1^9oc7~#<| z67-q*U|+UTXl9~+s)$TRsCVH0P04JHA@E(L0ihFLP@>HaMXvwRjCln^_GLR*djT32 zu{+G;%6V&MHa~U{9vvF1*?o1DMT=3oku?*3fWB<4{pb}I7HLMfRYoS(O!(O&S{G|a zjEAaVBI0=BIA!X^UIT!sL>o^anpAEi8$y2Z(zR5c1(Zjg@08ja0b!X53=4=(x9gl} zrYWH+gpG7!9!*r!V=WMAnzsumMaR-+j*=|2 z6VW^tCmxC8W_cnLh`5<*WL6-j0$v99+Ls2!7Tc+e6f zTF5S1LzFs6(2T06JdE-dYQwPb^I8@ku5H0@QHux0+b6JW^!}28tARplQ5%$%+P}w# zUmU6I)Uxiz@0lMe2as)a5Y<}78@bh5A8n*2|4RG4_Jt;Qbo6zMa>#EwK6IRM$Uk)) zM4#$|e9L~6(~__VIfde96rdF4t}%X>(9R%%f1!yFP1NL?83VwX*2rFaH)&S*G& zT6y*}iJM=d(0#i4I(|}@GOo~7`YW%Pt6zCV zIe#1_FL~2-%3aca)WUX4DN;WaYF*|T;2e;+Oe+ni{p(*S_46~0Uo&i!;YnELG~96& zPG?{lRl=@4TV7fc&M=(LWeEd31MF{x)6SnyJv$miqSUojM6xVdr%q#N?ui*!?Vs9z zz|`seuAADoYuh&6y0&fGRjs;iI+c~2-oLF;+oo*~1GCx+KAZ?Xq*=Xgq&oCey;zqW zGL^iQ6Rc)XDY8bDWrI{?7zJmk#xJ1#3dKm!QSnBng19;g;u=YYsI;SFcdl9~H;F3c zqTV#(uc(*HK4a(Xnze4O*hOnKt5`0$l{OMpgQ%FcRY;Udo263yAXN4g#dF2CqyLZp zrOT*DK=9|`ADj5@BX`aF?b-!aSzS>{m6=B{+pZC*(})!z z`%$I0B@gs_N$ij`3x(HG!HPUvpjm{eHTs4>LC@B?uFt|AgE_diGRpm8#~|})Lli!X zy+C<142Lqq6W9Lsub)5i?iW;Q*s5r2X#j0G<{c-^F^Y88NY@nCJeTr?>)&XHY49R&Uh|(_?xJF$RTXZ8ApoX1ZL(SMUau;%yz=#3yF=(c9c4Jf`i_6I~0eTG=dh@ z2q&P1P<0Ag!H2r>wq_vFPKj!V@vpq{W()mr{CGq|#AvI@M%GAWiZV};zfk_IaBB8E zpUY?X1J3b>lozV@8YT^RUp+JOYAi}k^YHj5|Iu9 z(eEHa8q0$a>v@SeAy%{~p)xTI&hmxeFv^`WwQa+^r-x$RIgI60X(;5uYtJOUIWh3mVE~N%_Y0)udLHW z6mP_nr$wGDJ$IYk9FqDB;K|K>2CksExxc`)E87dOrhnnNZ$zH^-%;@7+h z(ap8sF?0_A!5iw9R)#iy}%J+Tr`qB6KHEi*#0fufi+xl%w=>O4ab z6_H%E&OkOEql(-6P=J@-jSeW`xra5f6HE@V_RL^1`ht>)!0Dxl?1V<-7AI(IymlKp z=D}})I&rhoFDuFmb&o=IVXAjI3w=HyxDegS@+YU9KR?B+M=4&=I36^ ze!NPeCaXV;OzK-0D1YVrlqu)UPi|+|flhO!au_$c??uhREF&IeAjmKLD$37P3e7Fm zzE4H@P8}iTNd@`Xg7x92`2XOSYSv?xf0Msv8uUI;$N|NHCQ?}D3r4&f<{yz-iVl!6 zCz*1hJh($b9epwnUv#=FWJebrEi**pU#lSZzp$LgF%DJm&8aM-HD#LlmzU5WBw&7g z?Vk5A-ga|{G^XiQ=;)hU*1`6QI@s7aFSW#wtUCDF;4ewqiql<|;^Bh2ygx?i+2+m| z7~C$%PKBq*WGX4~x2S|YCej(h91>dzyJ-k^`USDmbB$yjwy}h2ii72tO4u!V5CyTn zmj}^>NMYlZ+t6D@R;x% zDot`oZjUKIpe&_9!qtRQ1@cv8CJNfD}R?mp2L^RwaR`iS`L- z3W7WLOPi=_wBbQ6Tf8$%Nk}Nr;!BTEJCaiTMneitro7xp0o=;+{pCG2^y`^hl|3NY zwZGHr1MAS1bzt7K_ppPKWDa4Eiszx=Y%942x=o4;@&w6QfMZE?bf!l#dZ6feWA*rD zkM``hp-1_CSMq@DDznaCH}Lh}y*Dj?K)ghl0h&C$sY+PaIfgF=Ge{K7Kr;YXX5We% z%z7I)&`cqRgd4^{wJoa^NriWz=iwIlG+5SF#Dp8rcdgM#cP3P9LBBiCvL(`5l)$xh zphQ^X?EA1e(6j*^-h}~8O4_N~$+Oth+8isL#7g<4YYs_%3>=@7 zR$+%f(SQyp^1uP-=0WH+caV=U;=C@sllF`>*FC_u*;{({UuXaIXQ?*aAaEQSzr}D+ zB^6MvF4vP!P8xj6&~9!c>&dF@z7;ESp8MkF@?y^%rGJsn#eOzDiKrN14n_5DNlGG3 zpX7TU)iIMCPVIRYYJAt0qxmf&qHmuq>(IVjv+-JW0G!p1S5{P2*VWXvt4L{|)UUSu zy7IKXJ@Tehw(b0Z2m8!$BW|Dy7+5I{=^ z%ah8>D#Z)y-LAvPF_o2LM|Nm8VA@pty>oQOEJ4wOvA8Etim4FI+<8rNMd?HQfR)%|atrhmVG`+LSM}f1{Hbd^A%X^Bu|= z#{~x`XN~2hIRP~)yfo=F8~6w=^VJ{=4UU2>d#`Gcif&Rs{T5WSVVW9+Xe}H#>zdJ7 z3n~>0pD6;LIc$WcTm_-Qp|Ry9n@IRrwip4UC5Uv&4yIDwW-^;eQPZlW3L1q$+Jee& zL2PEdjo8e6pmIplVCbZ~;rwg*a37=scFKoFR#skx+l#L}UVO%tL?xH%r+HO}f39s; zdE@;R61Cr!oO2yoZJhrgKX|}bYdD1&3$GCLDD`s^hY8xPc#otH2%8_kXr_kemh(hZ z>LR^L5+r0NFE=Hxuv(OXC-2x0?H9FEuE`$Am$S-_orparrwIM8JDfT+K=}+uS_^D-SmvK!B0xv7sBb0TY!uS`A zk#CSnjiTKOcIOPzSn#B|Tu#D;G;CXf{I$S^^ldH~UAkMnL@HC#E3ze)fM9QvBv)rk zwbB}CxAd;`wWKxC_nB^>Q39VJEdh!^VfVH8ZC;Arwdidj{$cHK5TMyeDWL{@wo>(q z`uvyxegc0*fbYvoE5{&|d*h`QW95a!xqoT;f@Q;BB1^SKCRvv7&g{m+S(Io%G47Ji z$OqZZ1MCb!3cPgO*)Yt=#@a>XK%fBGq86n=mqz}UyIiaORYPEVk|9!ZE%TH4%5LZ`$fd@bA$4h5@D9(x`9 zbqbA2B=1pM5Kmz?7{w0}lq>TBubB6;`D2d24w-L$egs*t=3#Ri>jNtyAl-CG3cz}E z>hL&w@q#1qjL|wR7i)_bX3WF@8cc}zC5hnkgZ+Vt2oY7}PIlm{Q|DXkbbd1qJ?kuE#3vlLlWjJ)=S7cFb-raGlWs#4nc z{y5PrruUA3!^=T(QeXa0PB<6{vAIB>F}-y3=cvC{XCd*44rt<`|4$+`?A>6O$A6OBf1nmYL?{-Q{HW#aOx2jj*l z)hR1Fti$CP9)4c^8y~K>7CT&L^uqSRhj~>kENSO7ehxX{@QRSxGDsaSTA#kF>RZ&^ z>Z?`W=YzMcxdR@W zsz1x-+avxEZ(EB9h7%zV(RHu6*#$*?VW~f^rVA>My z>cTWc2Ep--0MO~)<8Yj%pZege_jlm659mk(Ml8a5%jDUbwrkh(Z_c^r$gW+=JB`E5 zuUNqRs!{0fdU&|*#(253`e=7b${8h3}3c_dDcQu9MyCNvOoPlwu1h2siXWR z{j;qgM3;apw+LjZOEu`UfaTCdH^`T;HY^@FfOLwv2w-Y;x?Bg0`2iM5*vD2INNUj8 zGT4MAyG{g~u*eaAvMR0Ek8rlt93_?fwXomac%1zK_UM4VgBmh6MJtjl|>V z<7FRI5(q}aA+p?YUf{5b81Lwp8M@lm0H--%)pE&#^8PdClB$a07uK?ir&}fbMBzW;va%$U770-EJ_Pzy2 zza!C+>i{&7GP3S%qB1xS;F3sTwYhm zg~s(R!f+lcSAP6=Z#mqW#YTVxm(|nLl zdxqfeEQ$u8dD*GxBGsU>SmS^&cn&`y5RQoLT?OTkDnO*~YfHrq;Y*vb&aJP!qE#LL zgRSSfWsNsGB4Tf8XLyJFQV~nF^|RkXZt<7{kek0EkyZ)))x`qRyHSn*%BKG+6btBi z+4GhM_xl94doJ{H=&g{oYRQ%YvZ)&jR&U5c&aI|E`CoY43<9M!bgE$2s|lroo+ahunUvL zp)QeiG;=)uK_g7tad0Pv$=aZVkQ5zOXHj*ayfVD>{L-c8&%Cf`(F?m5EyA;hnm0(h zVJ&M?wUOhH*aaAE4EhPautugVL9}BD?&)vU8nqLeDneCoQ{mtt(~>%8;^D%b~{4@2Ji1;`WM+r!oQi0S~s+77)y>MG^h%{Q7DAh|1(gNvjX_fS# zv{8CodQ#fKMj5;Gt=bb?@n=BqZI3yaoN%p(`G!hVZ?n8RCVf9Hgv=c z{Fz&JD>hw@Zxg(JePC9)Akkm6gqEJw$SO2FQb%r?B;`xvou~$2Z|m-@(sp zom#i{{+`CY%a+Z4blrp-*4>Xkcgzmu-!gON{9&WKNuyGO9lMOepNjdj+Z4~9y`(+s ztM^x&y0|zv3(Jr;X5R$nru3 zU#oC1KDE9oJ${0`dPpXX`GyzY#P3+&ZuG(#bn4SnpW>;FUObx~74sZ?N*yx2??;{^ zzF`kwz2R5!d)`l)pD64C9KhrSK#Z-tASo}mvZB1K$bR?R?v)}d0zNR*%aDs|h zP~>MK@0b7VwMT79~XU85{Ee}1~|l8^qAFQ?b_9m>l)gm<;CC@agQ zuh~(0HE*C-Jg!6eI`Q>Gb#-zUjY#9xomLi~uB)rNw3uD90Y6fTf9CJ;oYVMO_6R;1 zf$xMD;YH@4^*^0b|4~Kzigx&9A-m?%;yTcJ zn$Xns%Iml;-vm87{6(h+kdl#u4oOf6{%n7#U)KFzN~u6LGy$u>B%tovuhqY*|523$ z)#-l)|0N;1wMB9w`RgoL4Rsu9KcGm5umpkIHRz*!q(%Yc0pTe~kE&Le=lD8q_+*+A)v`gc_v8WVCpY$NRcZ6 z%?0tQ($KI*F{rRU$#F?J9O{Zihs_K#czDq{-kP^U>KivrMt7u}t~aO2??IbsQlXJ# z>oKy3gce(Zto~9`V$fhvU_!yDdL{UyQhsmgB}Kjj-8BXE#JG8Y{hIYh2hCPemGtHT zJrw7y$T`^bnNjTVRqV-Or9sv+ZCF}enw;RucJXAj)Zq(M9P_Y`+I`uMKU%>`4$4Sq z(|pOkLL4MMH5)w`)Av>)7XfW9RXP2|)9GKQ^Ymo;GFwjDD<`(5u8ioDUFa=rUnox~ zoLRWFa8Kch!p{n|LT5U)xy+C{;78(Wom-szF6U|I*G^z#AforrdXc4fH2g+6VsuBw z)t)UYt0ln}*)KR#D9a1YD+M;Uz5Er`2>IYowFT3y5D=hxa!PW5x>w4T8sb90xiEyP zSbw+!?zq3cNB@z#kOzu^^G z7Pbux`@QyT?OALCt$yRUu+X*WAPRMf@8GmY3O%|M=3vRO$kyQwX97eCdw{4|A&C~d zHhe~_=rn0n<(;*co*6sh`Z3#{7&Ul_qp;Js(YI=HZhen_4=0?Na??+DOrAMo(o;Rh zwCg>44EVR{b##vHYUi`%{7jcX?p}?l)InAQyTOQrU!xWgGa$VVlmJpr4H~;H#E07M z{!1bL4oSfakb*(j7s~f|_JF?_dm^kdyl0SA)&ZYn(sxH?vD@SCiGM0y*5bFv^98O| zuAMH~i5KqDp2Za)3650mQIonmvDh9gdJyku_bPdtmpcv1JxF39tnpwhIhMOUjDIY5 zDyTnjm*cd9JHXUPd5AW06>Ds*C@m+9SYbU`0WI>)h~?C6E+@_w3_a+n!Q-A8ef@3Y zmOn9ef4W1%B;_L7n$H20mhaClzFqHEdD z%~|7fCr@pE1A`~a{1xcxD5U3gvZs;0l2=%fklMNwFZsn4J_;3DJ9owi;=i0qn!*cl zx7X9h!wWo27HNOUYBCwiA?kCV>`mq!Inpv?ov{j<%y+`Hd>b5k0BZ@~k%+_e3h5hZ_2e9-*6`L})G z**DoS6qY+A5|y4Zie28M6nKsC(m#7__Q`B{a>m>Y-p@bU|B+vIyI7pcpi?BoQ_ma# z;r{r*&oM7U@F;`5AD5kqZv$JTRAlo^yGik0pjT1=iCaiJOps>6yM6-utVwD3_P(zX ztN^1zDTm>JC4Gz*-l?^lRFfZR7|?LycPR+%=G;uZvE=U(wkXb_|Dt=kH4YM%v<{3Fp_Qtf?q#o1<(P0 zX~H4N2c4P(mUYT$GEb2S`tUq-@r}d8_vd%2h*Mt0yb}c5k}_nNp3~x8m&a*wFPe)Y zrBbkO%rs~dVfR(Q-Kzyen^#MRv4VwBx`X( zk7P=zf)CRG0un)Qyy0h(-|HXjmmPkm=z8p~r7*}KNMMFNiL+(c7o3>TA|#5nP=Mv- z@OWWQDBeLE;uAYSb7`Jb0Fy#f;_|Wp`)WaTsMVeYcg-vIFTAz?nn9BT!&iNZnH*V| zm-Id^K>X&Z>1B21{rsItb9!`H{11p^4`}0KLXVC)pn8#I2B*LobgJ$k95lRG^-wkk z{f9^RJZq4-B*(iBV|GqC{UwUyNKUtdb^+$t5ie9AD1ZMrqBv!?0KqLyvSM!mQG2X) zn|7mvNegH68d0k}*pNQP7>Jvi@7yZvq#^8tv|D`&x@@SCVKs64NKxXHOr@ma6x0})tae8#c*XyNXq)5PHd9y}gyJTB6Bu!`OzHYp8$q0lOQI8`cv3t`q< zYHfE#@q(O$(W4hETI7mv>(65+-Ph&LV2_XA+wbCd^M(q4P$j;732WI8de$YqV$|q{ z170zmeXjqHE_$i#)#Vbsv)*5qr|XOK)#!DtXX*SOIy<7jum1_b3S`T692{ zj_8Q}<13ep*b2pn7#h}NBItHTz37Yj;cn7ST-;T9=GRLeOAEw@ zwxH>I8Gpwd+Pi=I(dEARh5{kz%V@9*D@qvBKaSso|Wvh`9&ZzA$`AKmP1EWkZ61lodUm^I?RdN7q?#d>G4$}Bc1lj^>sd}ns+0`xGiXkU<@vOicJm&D~HSy`^|viwTRUZRX5GyE&b=WN6(1dZoA>zn1T4Zj|KnBOW7Fo&$TbKzpRxZb;xn>?itb9z_ren0gP%{#Pz$vDg4^7$y1C?Lx;r7; z(9o323uiYectz7%6$=MJLwUJKUG;{`U=_i#dn5ctt#~19LgK1pA%R87IIRXe0azt4 zRpi5>sy^W%NJ&;o>!!cC|Jd}pNqB3VQGckS^KG*_m6C4c9DW>etnKS8u2PVydM2>7aqn=R;u~KcNCl4g2 z=C-Q9N}n-?;**6XY;G}I5Q6y4$y}Z(Z}7864thBfR55D!){kUXYNDm=YY@XT3=27g@YG z;K6*bcEgReSRcA9;iEq10Bw;E7>l+V6A8=})glf_OOylOi3K*RVql$m=K9HRe?IZ1 z&)=FnY{Url!4V@~8g=O>quO;@a7|5R{=OS)YUg)t%hgZT{_N|o_pUwp`r8jZ^!7V1 z{OzxMR!?73S+;Tst2U4Qb!gdIs=$EU5oNW~O)6zBxQ%kWIXqpWq~#2?*q>CCRFE7f z3>3na-iIqAct2-MNKCFs3gN3HFFs2yWNAsPkbW{ym=p*UCKvdNmBK(qFr*h1YDocC z+hDxg8C10Rf>QiIby1(9kwtQmzu?v4cZ+#K@omL-70VvExVS_6KvqFPvO(~1Ut#MC z@t&P4-i>q&h2TiH#^e*ppC!viG7BZQ$Dxwkp}oa{FkvZcM6CD`aytuu$=T!7CH(^! z=%sL?P|6U*9)<|X{K`9zFbn5p4L||9Mbyb= zXCdzqiO0%$tE=dwhRA#2jSA^n#54@8DMRfBx~r zb3faP^+NPoDFP=aO1aWA2ST_ZNg(jVKD?(MY@H$D9C9n%*tnf~0fw=TKo zRvZoRDM)I6a8ZU-XBcynS0wXA{?&e7<7XWcS-y+ut`rxqcc5Q*z0T(&d6374yk3a3 zl<6!?iuYvse87$9xtb~`IB;;DMKdcpPRTrjZD!ruM9C!k11D!>0&wM5L+$5FKAQv7 z{ySPtnz!Mdd)6@djUKJ`o0rVD-`LA?Pi|eMOs}f%KXUfslW&}Nmhy?i$8`j9L-}gpFvojh4atF*f(&q!Bhn!Zi4gI-aEW_!a*HaV zQ^a+Jd|HTap4QK0fHU3ao97k4_;kQcKC3pk`W z?g)jPTb+BHjZOu=et>KQl*I*P;aWaR328aL93XA{^W`YZFa4SCdCg3GO+KZ@nVrl< zABHDm3?|)+yy35Ks=C2Vd8!`d+{xg#cgAZ4?~2g~=E^AGiXjW^D=(?VB}kBFJx@5< zXHF(Lz0UT|b56zK6uH3U^&zcIG+_ywi3&Fph3Zwl9R3w@5%1i8Y(KwQeh}Ap_8z*l zO#L}%lA6vbP2lhX=~u=YmkU}gGvsz9xif=qeB~?&WhaF~*}=@r5>H%`#}hZg&15%o z^vhy#!OW~|m&ff4x$=Ek0XaWQb{2-JLcK%s(GaT%^$V>EeG^g^WUtER!?NnKW@pK* z;%egh#mUFwSXEr_xD|2d!_Dr z%uGa`1t1nlabb5+^}y(?I~*ZZOHxs1hVu}NbL6Gsx?+|=0JT;gByL4&akyrIWGYI{ z)pQ5az>)JU^kSkrse-~AbkoqS8lI#IwN#*gY%Qe-ryxa`j$!M3rt3pd``cOtFd`1x zoJyRnIf~2t+iPdS$t>x$GyJbq+MBQFAj@Ggpd}Yh$40U1XN>i&0?ZR&37%Y*Df?3) z&MOKw6!5uuY(*{`ge;b?1M-#tI}%{m2H48DN8)%rG{vekIjwib(Too=5Jl>eaev0< z3?(BuH8t6n6qMZU-80>?!|nFDl7k_p2bBb8Qd$!KCW)mdwN9Frv@l6Yayxwm3En~8 z@m|>_d%Zy^xgZU3AT{W;&x-?eOcVuyK$_12(wMe=g0K#GdIV3@3P4W(;XN{LT+~1$ zrYW&T3svY8f1=v>?r!sj;cI8HgX12ksd$l%HBIyD zy&E4M-f-X3dq4lEasDh;V~*Uqa*v07^DeT^dv;r67O_v*l1lcpEBrcl4tsOmn$h)d z?lu2t!s{sYfQ49(mG(=gjdiJR_Glb)dYNOP|2{ug{7L?Ne^0;if%7j;Ug+%Y+~Aa_ z*r!Tds;k(=A9XR+6>t@}5FhZg@^GWxv&zF;dA{**J$_z1-x2>(JWq~i8vZ6ECvYG9 zZaAvr9daV{Zxxrl0-OY$;_kF^;zR)!J$Lq$i@{U>3SlRvszS8C|(MxC8fURx7W8ZH}__X z+x9V+^94IZ&n#HK zYr>$TPaQt|iyg|X7e6vDjvKOC{^!Lb=g@EEXS8C=uwr>QRa)VEzhiqY+mXupC4QO6 zOAALkdIENhkY6>a4UJ~!8o5=D^cUM`q`hQUjThH6iO6*{N@v(Z(uhqZ}bfF%q2rU zw!d%9ZNL31mdQN0Z%Dgt%X@a-|H|&pnfuq6|GabarkP`p?mB#!P2wMgZ$40-iKXK8 z;eqEKAMhaZ$1sbVp{+^pWuTLFl}j6=P19tDYm{rMYracyq@`rR?VQehSspnZ+!h}X zODMEkdKH&BWGT~Mm~F+Bs1gV%VHk9Th`&liH7-eI2Q@91B?o;B=^8G-KRt&PP{^+!y+Dfd#$dGGCJuXymF*ik6W5LhYf}5A@{OLI9)7K7jEC=ZvR2L-XT5WQQ~9g&KTb3a>B*OI!V+piTvk$YvM-VQ z9741U?YO@#W%#`iUtfFQ9$%yHgim$&Fh>e~KsE)ms*UalW(Y=W5USr2M)*B*$(>T} zgY}q#%By>SYMwN6*>8TcV6pkw=HI{e+J^^NVC5{<%Uu8J-d*=TfJT?+#)hla!{MJz z{1wbaF1eb{z@B~pUZD2UapV4U3X_d0W+MvOT)_FvR+;@WM`wPS`Aw#FLpr*#F|$t9vE;<$1b{t_jNM2lZ^;4vOIX75F6Qwjc!}tc0pTN%S_H(ktyrLizgNHLU(WXT=xq1 z2Dj?Y%GdIf^SPE^mA^gz#r&iB>V5f-<@5geEMG}TVYMkNB`GUImddE;fWhGgPGv8h0EzB;Bp!;N4Mt9+A7ndqi3R8;;L!wjwV$4|d7=SPGw4m|` z(lk&iPy+>|#x;1Ub`Va=X3v%Fwi1550{HR>*jTAt67eQE=dJu7%ZG*ku1;3|b$F-w zkM-OB(}{V%s;HSga>b5klMcIBn}4ugOKMMy-glzs^LJ1E$y2wlEZ$Ycp8epChFj;p z|IgbqdUPr+A2h$FWc{|!7(X)cw)bX~wr-!^<0p4rQ{7|00~1D8p{jyd|Br0xr+gm*{K3slkvp#PUN& zLOda~CbT6a14nVcH;7Pou$9ru>r1IAu(Rz7~;{6%=jcP-wA zx%aY+ceAS5OJ7>6cB{2&e~($T2YXc;qzMoxRZc=fX8~J3ZQRn)!H_<;!Lgmv=&Bu4 z9J20krse3N?D!l#E<*J<@IH;4VkEnt%G>Lp60)Zh2WZb3?dz*Dn4co7Sz&*K^h@+kXH1ZU6a*g-s+H zLElTt^YA)gZCLL^QVx8dJzK%oj`<aeOzV!UE+)no1{i0KK7X#kD#X|?kOJ|jIDI0A5 z+MK*<6?=?T4KDMIz}{`#xb4!omtMlojc@t_^@9&153oS`ol(9zpDoK_%MfZyV?59! z@K9h|KzUr>r6X8OcjAC_d+>+&HjWyV?B&+hQTM=bNDU%t8Qu3x{k`0l$Gzx8V-^KRysPjBYuS%>4N zcXjGIYxd*Y%`cD6n>B0huYNUm_E%(e_C!3mHDn>9@}QoP_*rRQemF zj7Pml9RA|uKSCC%K*d-AERb#L;e4l6poQ>4UwR9w$^$fYEr2hrqX(BMtE&)7YHhkq zFWwj}vqxl~&sOGAxvW5Tfa?KQTvld! zx+jBs9En-kDetE66pxzKh=&E;p$y66_3ZI9dK8Dp1G+IcVeKJOX5~SVwRa*+>B*Em zWCdZlFDDXnZ5w2qr#m zUGk5 z5D@SGA=zv;J3BM)`<1sm@ADe;0ev8oslv~*@&qJ}bSzV)Q!-Tn;@6P?-Wk`UNJ<|t z_z~3sA5X}o4F*J=-Vnvu*FX~P_!#Y%H9Cv-^NscaZ0!SE8(8mH$);OlihE_RY|g6iI<2Av;D@0A zF?pv0;1M;4YS)=64gexexoWXE773657KCFL6Hj2ffgg^bS>4f$O@(2E!Gu+j8B+-9 zusy0Hm#T!^SxN=}a}vx0;FyV}#!;`3Xz6>)>OXzDR)`g^9Q2z_fjLDn<8EWY$T=We z`Ab&u##t|JpV~CE-}8M&?AkeMaNm&+>}cpmU4Pwj-y7>E-x&As#)|ywqXLhSd*At+ zUtKb$N6o5bhaXF5=mbl1R%S?pK_>Vdcu=3Ok?eD+{AYP=I;_GRo{K_~D2~ z`I_{X-z-Io%o}bw3o5$*xoucKD_NFa7a;;M?^yfI|E%9}@2H`-ZB4(zuDb!(-9x$V z8FJtE-Cw$Ci<^wI%(5)E@JKY>s3R>r`73KmznX5Nyw(^p7&P{fLli?AgTY`oA$p1s zGK0$r0Bwu*l;Rj?{Qrwrtz0y_ZUVNs95}}k;>J;yeqxR?iVte|xl6xEe+eoMA(CE4 zmRb7^yDj}cL_B-T4b=I~+8y_j?ptpgI_lmX>mmIIVeNgPEu>X!jRc~i54jD9ifq|U zSSUg=FEBTo;nJH4?L~;W6I#(&iDMr?h+JaF(%zY4XX4nsANi>!2O1iF?tSce|i^!n- zb@{X^M!H2v|3FKCws^<@4}t3DTFA8)Vz2}(bhd#^Fc7`LZ=f?M8I8CvD3#0va-6 z^#%1-;~&nH0r$mHjE^xzgB}BWFzxMulP^3jdI~qF}m)>*_?3__(Ja97on`0;T>^X6a zj0ECk&xV!L_T88MA^r7z59KHO0%+f-Z!-U(`!E!>_wAduaznZas>2}XgnweD_{fuT z1KUlgcIyv6R2l*tA{m?=xt>0Ry+e)&nNbw;Y&Ur~b zvYZyLpz$HxL^TEsywh?egEK7GfFeTpQJ!fYy4OpxKpo>HM#1AH zyd!RB8~<5(5w3&hx9|_~2YKOZbOFONx|cu7f5!9u`59IIGL5D345@m2GCxC9m2IF*gJ`w(zZhc|R;urps=Xef40?*dPiOiF8 zLgL&9WP18uI(9ahF=y24wdtkg_Up+t>QgkC!PW=sQ}Y!pG#Bj8+vKZv0I=!sI%uwE ztcT9=+~}dR!z;o_k%WakW@0w$Ea5gk$>L6M(Mgbp!4j0T4SW+19?oVI ziEjcQA?1110L7lU5CO+FBuhSKvH=eK3^PNS%fTX%ip7n!6^1tQ!j&kdbYm-UXK)-W z%7d3Nmo#6sf7JdCZe#rsvK~Js9-8}0x#aEN)W48EPo_THFq1r%9wU@K@zF<5d>Jjh zeafsC@*HWQv}fi{g?-AM2DwA>I%ae22=Y6Ej|5*0z8CyFsM+b+=XuTZN6!}?O|G-r zN%Lt9YzYfzGx_6s3H(xfG`y^7&>TP_@C2x)L}cESkRn*%t%y6W)bc*9EoAjYe6%*@ zoA2B2`^5K^PxF0Is`d1q~c?8tc}ht9}Z znnQC#)gijePX^h^Kr0!%~dn|2-^z zC0-Eq23|DjBsHynFc_|2jFwN^+!YcCEdhM#NaVAKz`|FMJNX#3I;tzjM5;VxgG;f7 zl?>Fx##a=NM=?LxR=$w61;|Z+3!MeH%VCLR>@_V_yj%zv)2&=`YU@{`baU@xcbi^2 za^#q`dgO!mzkX`h?rtw$oqp-Po0poXzx@-#^|!o7CXOe^(t*>zBcApt2!Y?VV|nYe z$#dtwT}H}R-}>Pbf7<*ISlJJF8~L$q=q01MM??K$zDT=iiQm4?PPe)r zcDK6uZvI(*IwmwDv^4Z|NLZ3hy2X~q*2Z{iIH`+9O-9ZZm*Nfarg(F_EiT66PQe@T zrF<)Wn|y-LCj>%Htx3#5JltroN)ZVm1xbpBqcNRq)#+r5qavcK(;Y^Y+E+TwCs@*S zoWU3K#$yp&WUj>!KWikMQ8J!3^2b44kz!e@HrvOI8BsH^y}eusII>X+O|Z~8zS!7R zWUfA{a~vX9zfgwD9BCv`E=pdposs`xE;i)uh?Y4u>qATCzw+7gxrV1(Tc2|;z4e_( z7Ay(uFMNAteP0{12(tL}AoTv!F)drudlB#l z^#oSAk(m2N&cfX+_t#p?1|5QfdV@=EK%87}=Hr_&z1u+Ptf3~e5gVt(8C{$a>AapC zK|uy*Hk&M12(=ocf_7nvgu0hs{=>_42(yCK?d25lr%qu=t?@CapY7$BNx2XHgx_}R z;!C9^(Hv#0;Sog^Jg*t~&WXocpM38q9q`(m<0q-y-p0N$a3bs{u3Uumbsl>*yYf5a zp_wa>D_4F%Pqcckp6bn;!6J45Ac=VA<;RuFKg=%EhmSeH7H^Y9y?#-n2de=Vo|o}Y zz5Y|m^*7=MF1h|QjqLg_zV?$F;LjggJGr%S^^0WRzUp7BBh%9Nv2P*K{vx?PeK%Wo z4+D#w2iZH}S!|St8|)6fL+f!nbZ#iX;nF+wZYF(jEK---N!*aU)5SThsDPc1G$Jy~ zZlBR6ncXhC2azynz-e(%kmV%aRXLps`cp>ht5H+8+oxN?u3s&aQ# zm3qH%<$j?ma0#)IrrfWRk(A85a@*=%TOFc$*BQ-q-t{Tvu2G_?-gXy#u`zhL4u5j% z>J*GRl>vEYMxPtMXl*6I&$}wML$S1XM!A$*4lI2>bnD}Sq+0%XOn~eSJRP9V`d{}Sb+#@`OT3bLqq+q~>RDj3rk%E3#Fz5$DDClvb+kih1cDqpZguJuIjkgAaqNLSY zh~#p|-1Hka;oam0_Z@EfyqmZswhq{^Ss^uTmMUHST%%p9T|$dzcXdhYA{-rRY{T!QlpghzNj7pR( zbN_nEWZ;DM1u~eBOVI6LcxIB z<&K8}u23kT(S?qNNWTzChDgW_mtPwQCS6XnCNdlFHXIWQiNLP{+~@^Do5HrlWNrYy zzZpV5fwe4bia!FN1aoj@GcO_KF2mE^V?JR%3+6ifO3ex&Lg^i{u)I zc#$;13}=xq$Q6|&kSj8;5G#wtK%&^r-6ZPNkb})nJ@Zua!O;^=r;qb*rH`E+KRUfL zU4OFw(G4hS+Ogqi|Nh_3yTL}zr8Tx2=6%Z#Pp|J-&A!Em&*CIW(2V9{`iiCrKpd^KXG7MuLNI`pev#-rZeLlZ790|Jv zNH!7|Z^0A^;2=rrm=S?kfc6cH3VajbZwTBGpwA=XWy6%n#$53C^N;qg_6u45B0m-V zMD!>8+xW?QtD&wYfA} z7p4ldlbIpvWKmqC%chE#Rj_6Zv@=(jEdaDC76Y3vm@Swr>YTaKr0H0|Gc!l~ZO6>H zEB*M9BlKvx?mx{Q?XLDM*maxeo=avB)^%|yW)RECjZ+yOzQp9wp`I+y#t*cOv(2*c zdYj)yZH(Z72E_pBz9h6dL_e2Ezv$>F6{4pEn+rTu~_!@CV}2h$|Y6U_N~o zCDWs1NR&hawxrkV(?+DE-{k{^f|EBJ@Ln7kjb^f* z>^}^?#1c+tQG$HjN#;8@IjIvf5o%o2-Uh-(5GFB0kGZXj6l)LYSw$yhAdJ6s{p+IC zGe0v;J7+2TxSvkc%!YJvwu(zLvvtt<)>hj4XD95Z^MJ`uq&1gJTEfjhWchY&F*k$= z^6nW!$bcbZhtU25#|)$`{mGJkWJLw(n;Mm(a|+4$Fc}Nis|S(AgUIATL>|;Ihz=SMkCzoB1`Oa(PKSgW;)#?S zR+cCi6Mlbr&#SJItE#%o-O9@b<%Hv9_@7lA?o-)~cZ7{bstdcVR<|_^?h*3_%Tp*x z#GZnH088qF7zx`;IZErwQmoDneDT1-EBKUh&>$)0iilvr_C#bKc8~8EkSxq_^POt^ z_!zvO%R*OhvSDL0l9U*;xdC0t$-aoe0x$sXc1|U{?F_yG@6C0@`EsY?8z~mLmMx<$ zt;ZwW-u~c(0aN$a5p!)*ZRO5huJjiT_fA}J-@+%!-3umeZfq_ezhv~VMW6QxKUYio z?!Ig54c(`XD;Q<5`@)lFj=by0ijCx{zEM5^{_3zN^;)ZfZoGhh7V8@` z7#aX{;X{K4^_OEgwcb!52mhm%kZdeYrAl*i3rnM+ibTG)e+V|Y2=kPwiK(bVFAOZy zp)BTeGI}~yQ>>=6tD-v9)I~`wyhxZT#EWn^hHz2q8(5x^ZD%ZaSbarRsFkUzUKu{Y z!{4#9m+|j|?;1O`WzIuW`(NF+Ja4gHn(ex~Y52~bzwY_F2QKQupEadd#r3!DS-WWe z=pGGsSO291x=hc8Hu~SWeNb(FX=BwCi;?_-@SZz{U41b0X%%VeP{wPn{Bc`uA2#Nx zUyU9Rhz-7R;lMu3zpa7o@i**~UT&*AvC`SkN%xvbKQkGRj>?4Gfrp1!+aF?wQ>D=e z9;<cxA zhYO1J311A?rkD=Q`-eY@xEhE7FGiUfIRu(C%rbxj3SoL!j*|)4Uat9D``RPh=3bNk z^^vc;tv~YR%;_%)q4tA@ba(Q~_@Ot^ciZdl=j+cuX}Mv+-^mTQ&w)VeX%!pm4tavh zhjO2>)@4=}xz0Bb5OwH$c9RG|j|d_Ji|B~!B6h+8lk@GH?1J5H^2N_$j}0zkfaEI6 z7|RT>@|fexj6^h68OIoBpvGsjQsT$rjMzgNDh+p|gwt?qxGUTq>`G>vs<|k*&+OLt z%Wg~?%v-tiSnGwpFC9FTSlpVf4IHG>3uBr`4%Mb_Ll-U|pE&>T`}s%CkGJd_at}4Z zNX}%4kiC_-6tJ>W)}~0HcyRHAV%}ZQuV8cmzs65IKB56J>c)ig@ z2HD6g6B&r8eF4b{M?zt1B9)kw*p%3xIGhj-d?F!u!WO;|(1v(8FY4%kjky@Sp)`<} zSin-6M4_qzP!B3azBdy=MX-T^ojRC`&b-Ue#0pSMG0)jrsKn(}oF>C903Vh?gNOhx zFyb#pUIZpEww5v2p5}vRkECBX{>X3Y2S52DsVDv0o_^E0ys3cVM~qes}gi zv0=~M>)^gCXa-g(W`!M5#CUERQ zMX$5StjzWnrq|D?K+U}mV+lUIiCJtcOUgiJEYilbp)72y3JI%IS6x8-Oc!i*%jg1S zXiM(=X4Q?X3T@5G!}i|eTh@&4ZEqM@{z~Pf{_^z7SIUQu&<(nJ>z1nrDrITCc5nS& zDM-6}XY-Kh(}y&dO`B3Wt^D4m>*qINmV(q;Yy|Gi!TnNY&7R;4RA?D}$s5z*FZX-Yd^;S$&C_F`d5pfMEdjlv6p3ylzk#lklNuSL%& zhk)FnOP_%3SUN**3snrzja8VRGU8%Y;gAcY0mBK4 zHpX)vJsU<$6h=>|f@5(-e8DZ~NP*bYLN+X0Sg%!Surb2~!r<_Y8JVa+CB^2r$V;LG zX@&En7WeH_n0|L(`nnfCjYoXRU*(qcoN+z>)|x(x&;Jb(s8zGBzj_%tdR@s?$eAi5 zKwE$c_D`@qd3D3+R5FXpdy0|+2v`61LK`^LDlhz5)_c7=Bu^>zc4kkJ24z`SMYb#t zsynTI0y)BQTuL@lQUcJszZr%(`yBMOzVKIB@As>p6X?vQCL0&2mGM*4BXljwXv{`6 z)P8w(r9^7Oq}E3&kpU%SHbMT3^e1GR9lZ2TyUk&?#jO^X)oRJL5DOsQ92a+(T@LeH zq&^*tw!kSl>2xb`B4ccI@)gNMFgJ__HDRyb0fSUD>kJ_+AmR`%koRSEEN+R#6PZq6 zB2y_WuC_PJ%2SPNSY?>ag5V{BXDU4m5?UCY*fH5$X8#C_-C`=EGKgh2Nx7b~(hVj1 zsjjm;E4+n?$ugkqJ-U|kb-i;Me^nv7x);tZu~((%9U%pz==|%qu226X{g3sx-nxMx zEU@9$*ZPcTYa7u=eMI`|wFA8#_dIGF8rm-8oqvdLOh27|;K)1g96`f@rkCD*_oeh6 z61?-V$L>u3HT~I!efwAe0EY^5Z2)tC)#a9P@5pQCl#uZyWOVWLVmd94jLsty5_1xC zjYMvcSZU`iVY1doZt;;d9s3+4ijo(g%5C?xuS3jd={(XY{5B6(HlmpooU18P0L0*qExR|Oc&j6qcc+Q83f z;GM}c4<4K`dGd^d2WL(`lq{b%t-PRsJtnUp{q{58?YRH`?f?Gw_WSSO@!j5ecib^= zukr|2N4l^^Tq~Bt-b-;ODu&C}^jzQiXSDZy%2 z8cS>f!}MX(1(Pt55l+{c>alnuE)ohmT&OCh1%-KeurG8v5zBMkF=nxsrEJHT=?R-uSbzZW0Eesm7=9~b1;_BRewyxQTbP1{im^mLLr+800t{^kJD1G}1`TAjx9oMS zQR3RipG+SwS+=Akef-JCAAgdRmMmFTLQ0=}{I!a1SJ&ZnA|r?@;rB~c94i22=CKt^ z*s~iJv1f-i-&S_bwPm+$#?Nc7!B6TuvE`od+_~X9aBtJo>M+hi4)(T`rE}4PK2RchwF3^$`s3d}VUC_>Pc7Na698#O(?`KPuq#9Cu zq+eaXN&Wbgzh6Ipim$pVku|g`Va+G`y~6{FY#gUIb6}-ojO9VU+vO??7xA^-!toyA z==hx3Idlk0PvQ#P1b7n#ZUSHMBk&?0d$TMB&SK^zDwXY-g&3Y=O=GzYzP{}gymv+9 zYVx;p1!_uUsFVGJkIixqoZ>-B&f_lv_N*9^o(Se>VO2-~Q{#zoj34cK=f^lCk?X zPj6h3{&Cd`^2OhO`~2U@7t2?te_YZyee*st_Qj{fo4b`)bbIga#@TOA9z8zV$8B*J z-+At>^uAY5Oq+J%RWgoT`}>olH}-sFXZoA=){PtKP-5EoNY9ObOO@?Cv;lBGS!v>s%14^mr0@@hy$isYuqib68CkW46KtVha{-d7qW(f$##T1%#B z7Xz{;kmUlI4G@Z|-4JSKD{{K|{UwoFQrj(-C2uMw#U-&weqBDzuMKtYP$%NGP-Stb zNV~jZZ3V3;3&pEK(e*jxCZxz$dOc#|KWL7=wq)g3kKMWcv9DGxS-kRJ>32!qzKu{)Uiz(Xo0n>O zTtQFg2Yh??p8oy!-2Lspw>`8qJtsY@sfp|)+qXWj4UBKq!WQznW(=~CqtWRCrXGXL zfvbl%YL%Aga+WWv0`{@mLiM=tiSU&m3R*!Y8=I+UP`KvN*Y8x|6d1jaW$-XcCm^I5 zkHHAm=HvpRt9+B!CuFBSPAT6LG-FU_=sUYZ`%;2y;zxFA#PZ=~x31MUOZ}g9~tRx_v zAbdE)o5K#h-C~s-4j)O><1-}G{40T3q=(teSCbq{+8nh{r6mhhQwx3E6bJ&)=E@!p zpB`&1R$GQcFB3G4ho_`JxPQ@#(&E!Mv{Y9ed1T415&g-C2adc?iiNx)QZ~5$u61{% z=eP7TwVxoXtV5^0{P>&XgG1v!!ZkFcXDbXBUhYU(z3_uu18|iaP>&SsOALj22Uz;kj4p6&lu+`osF;;C2?ZdemyiI6sIiY;}l= zt7{vk0{kA78Zx7k-J`-;sf>QMC@Di)y}wM=oF_w5LGr5dTVI;pw6yu3kIh@CvQwmI zncGj37T0~7{`AAP2S$x!dU0L&oc|hnagv^L(q@Mf;?z2(ky9<3Q`;pP)6~g}t5A;Uz zBcUfXq*4Qn@o3F-%_|z=Q4JYvm|$3M;6E_@4S_6!i#-tSa>KJAJF$>m77|b)je{){ zEFV}jkeUT;LQ%K~PJbx>P)6s-CoQ zUW4x(XS`aYe3$e5*YWi3kz`steeZ2|ZAkBplWRw$ABdC5D>tv>?_57IeQMJBrgS;^ zSL6DLBxmA=N#vEZ7i+~{VI{d%^C#FRJ)d?r^Rl&>b?K3<4i>b7@Ud!uc?^DOTPt1= zO{rswr>v|7YRM1Q3AQGn!C4g1W>{FTZvhon9?LxB+TO+KU8Hw$aqr&6KqIjynuW!^ zwMOdExh{5&0dWFJ*@~E7G4ntE-|LKM*t$oL<8MD=7=FvjAtRE>EXW7;%hs z&caj#tEys2iwKB=DINu11A9q1-Ln5Ve9@xXw`)!czpu$HSif}&#^8mWg3K+|96{gP zsBGgHGy@MJ)r*|=Hna^s>R`S;0>rEu0i>sx$w0Z~z+PNhI47R-c2meHY#mitQ#pI( z{%%3XPd|~d92hi$k?Ktv(``mHhGU=ja>pmK+Q*KLxJx@b;%fSIX^E>lpG+U%-_<+` zZ`g?pW-eFCbw~G!dhD_zdiU}V=%3fEy1XoJ=#b)~{Jem_M^AT7Of(p+HZdIGh=$oY z)Xalr%iptCU0=B`V_EJyAd)j=z@XvLgmrjoI5qIYt3zJd9Y9G$o1B9;1WJ-RK3POG z`G<>+7g4ULp@?dWYAYS)%4(ynyqZh3odDwc#4*@A@ch{?AG2Qox@V0>K00Rm7(-e4 zGy9v0#YZm)lKS`*gMPtE!XHoK2kRff-p8I_@)8CSi>xEl0iMRrXBS_)(lh=F?~8Z7 z#y4KGeEBu+yt7>WasC_iC*7+4{P7=`{F#2Q{@UKG{^Z}-w(aY7CmzT-JpAxA9{BQ( z*Up_`f511#>CO*LPvcuf0i(*xMY&?=t3P^$Oe7}x?q0q7_82*K+|?7WdR^MAQM@#PLM0(U$b)`q}!?etmneye`$cY!*k4(PJl!8`*gEwG)R79o{gpD4EX} z6vpBOg%eXfCiR%#gYN-;&yP=@I*FW8M)%rpgkTA1|<&QX|R*as&lLP zaGlqmUtBfox+!G?hrBc1FlWn#!QJc5@7i^Bzac~E-GMs0^2h$?md~3~Zn4JM?`7;Q zcJ^MnIj^AqkfFQMhN%_(hW5;SmhhB%)KnbM9><^a3h1N_gKlDn{CKE5*?G$T{OWmK z4s2hqeA@XBJ3fA4=P75wD|`SJ${)3M%y2LFf!y!^?AGfu=b5R-g#uc)OR`zvHCy$p zK8~i8GP&a@lhZzjrWTY&Wefi7c2I8^-L6a)ESI}mPhj&^`utYdG{9q_5vx^c0SFwO z*Y37TUV|xaH27!Ph|Pt97@J+P%L)m>X}ea-Xb9S0K}zG)8QUq9BZTFf6-vjt6QIC= z+gZo>$lKN^{CSx$6zkqYFnj@phI$w`E?6@edW)3X1(aTVpZ<5`rqG5RL0bR(~zu67Fk;lB3g$qu3A+>HpGE)&-M_%)=qCjE}ENAoO`8flRyRf_}A<(Pj} zd{6vbVbiy=+D0pjnJT|AS&QC~#RejCh?+4j17*R4 z{a=|@X}!@ZO~X1wLH4HsNJf1rP;`*H&1H>Sy%FzWFRxXSXg1z!kXbJZn$Vbxs3r#) zok2DmltQvZAgh9vkexN~2EQxLfg<9xo#*U?>8r$k)-LFdGol*>4WQQTEBQ9;*9sy4 zcmTF(Pi!2<;sh-7$yB$#W;RZrz$TA893DAJIIkYWT;G(siVWkDvcgNSr^(7o5Ky8W!LMe207_!?`b& zhy5(h{iiT@cLKJGj*D9K^@ySDMt~_O!ARP}lX|sIf`=X7hS15&jpgM^J?SOj_EVRF z+p)G_q+;X$DY#wuj)B`Bc;LvMJwFF*Uqv+ObE__ewksHZ{vXP{1-X~xO|aYb)K7O& zUgLB-w>f!zo~N589?u%2$m$1!4_ih^i4pg9|t~Nw5l+5 ztFIof9rvO0xDVwAK89D90rZy>#T6FW5vs75Y=FjN^hp?z^nwPNDWYMJ_y|V?Yk1>EyQsbgFFp|F6F#_rsTo~r*A{Kj7x`5&>umBciFzyf)EF_4kE5@Dwhk|im zu%LC`yvyf1wZi0kHtDR=(?X*ZVGwSx3mQ zS!5rf&j3S+e#K}v)a^SwHF-@`r;U*D|Beup*o$FLn40ZUghMlhFbRW9S$V0TCOjxS zKD;X|ycZ#Odr|_yn-Fji%GsfXp^u_cg(@{m0NdEfP^+EzL~0iu39F2W-X_<mOW79OHWR^O)Pe$)7jz`fdzaw+7gqDB|{RE|1(Pf2k+=Xlc!( zn0Pz^y*(L23FA|uW8q%=>--c67C$vHm>nt@C1iABq~H6oFHsO0Bm99lDT#yF#}=34 zo8y9|EkPO*O^MS9{`ZLw6BIrCf<{96Zlb&Cek50sPfelSB;fHWi8r2&k?slP`XY(? z1aGnC*5%TEXl=tKXe>_RoEt^`)GWZbN(kAU(FSll5B8J*dK_u>qG$u3qfrcsXjd*~ zBh{+2)FWGQ9MJ&Exv3jla~!1R%F$s@47(v42Qkp5w_)9-_JVM^v0NKR#*EWRI?Cy6 zx)L2gSxBFyl*!Wm>8BS)0{H*pkJ1OQ`8QX zFI+Tfk)nC_M`ba_Z*ivmY=%%RM}r2*sq(C_5x|l>nG^#X1VXfN$&$5C%xQgiaT^KG zudMZE_vz0OIJqB;Ty3h2+NmV(Gi$}J!pVPds{=xLO%{w2yt-Oe|?3uTA^OD^U z&RJbLqjAzy=FdNz9)VHLYT|dwy|rQTbQUSF-DsnOZ4+$w*dDV9th$rdm`NZ04pbSj z7OkSw9u9;;ZhzQ={G?lF3JX@B&t>gE6@;cUA$~_{%_|I`@n0O zkA9+%CGlI^i#z#}?tbmXUoS6=6(L?^$#5n;k)Fs%lNj^m2*C$jNfZnSwOYw5EtA$r zpwzIVSOH&tGfki(lR87;us4|Wi8`IvU<7NRH4q6ppR3phG&8i_vzfQd1XNigAdSw=6zet;pN-Y=E~!FOBBM~^ML z$=+IcY-9a^Ysc*xbu+j#(<2rwd+*N8lmEQ+p864YY+5*N$DVPcg6Ug@#5R;~+}^^p zJsdS#wH{;R*WKSdVuD^ zhRU=Qf=$G#2N_)f0?hbL8FwgI!W&XZjQd%IDq@DO)Sbz6EMet?O57&{{857>3gs)) zP>iq6z$p}UDUiNS)v;VvE^2H#aeQ~r-y2>wZN`#ohV`m*Rn)O*Nn3VhGm zyKcnweR`HxO=bwbcV;elRsron<7MeF{1mM9wd9&ZNSA+cP-m<_J2Z6CL9Yr1QLn_t z2nf+R7m2v)T(rh@NZGLk(Yx16_om2*)Z`Q;DSHaKuK^2ZsV!N_ntXjP8w*M*c(2n- zZM-rfx@Sg2O(L{8drvma&URW$$o`VUCA6eCRIasw;+t}wCeHy6uZPw#5R6?1g0EvB zFyE!Y-elLPL!pKl>b1DcmKsu1jSVLrFX580mDQW7cUSY(S&VN)%k?OEoh!AK(gVOU! zl6gIbjyj0yfd&OI$YwsX${*DH7O1FCzdZ8r!<+lZ2UiEGh7TOSKr~mFXVysN)!8-E zH?Aiew-;aAK2j)Eor51nCVz8#!MMUax{nUXUAdw3>ik>=c|p#D<2PeZEg+nnAMm-d zD#kPPo^N0d+K}eNA>ue!01+1yP*Laegq=C@NS^aqM4E=zp=4gvMFxgNhu&%hK8QD= zhYUn)u-hZr9G^E_@o3JW9IDSDU*wR{po@o56_3PIar^)WX-+)P<3lsa0t$aL!j{); zkG~=!;i?L)PHo(DRyB7{>v&dz$e}?r1>%nt8@2(iVtcm{Dw8v~m1LC|>54p_8V4K)QJ(R=PQ&hl|z;8aOt5Ys_E{E;s(-gCLX$mQD-L?3@Y{$-qBlS3W_!olH)OW7#v$X14XE_9Kb zi{b9DdCgLG7HT`q>M%Fzve+;m;WdQODgy(3T`nQH80hhA63?#8rg~|Gv`#uC34WWaCjbu(67qDN{zhvXiqMZlL2bj=r;fu8P7oBywIt}#E+e(TSTad2q}<6$+$z}8dX zVq;tnjuHrVU{=JHl@(D2c?^P$f#*=?u=&hc5r4Ls4e|kK>m1-Q%>4s>hNNutiAF?C zb%rcubY~sPqWUcIMHU&IH9ZTXI}(YcBKU#PofXNpIW&F}W24*8Mt1_E+s~P_@y)se zy0gG6!-|)5Cv>NEny)avb#W%{1jPLc%MwGxDzfz_Bb>1UwAIy}fH7cWejeK?{^QVw z>3?x-Un=xVMzt_LGpf_?lMnyni01Fwmae?waE6r*ROM-`C}wV~Tw@3;4ys0@(~_`B z2U+Nhykw&iZJ^Ec0M($D{s3;WdwMJrB&k}-2V>U)(`Bi1la=n>ZupT{f!%I@r*Gq6zD1`W)O z347x8pnUY!f%%NL@Lq4Q)7J^Wkdz^OQ2Mq7PXy6FQ3{?8^2dWDh}# z6FeZMW0>2p$d%QN?Gac3@%{5|PevlJpT)?=KN6ZDzGs9 z6~0daSApuJgG)-tn35SK^rm7mrx=W_WO+8(9wqsaT@kw4Pp10G4Bt{89qS{rO)E@v zoQV|Z?$ObFE!kR5M35Ut2=-Z>#s?ri*#MXmwiTOIvX)pItZ)wJg~;&G#1Qp`$dm-> zl^BtrURXfoLP&^}#=>DwG8QYq>R9E8tu&D94J2ZyGt?U<83Y4>$CAwvwwn3!P#`Q8 zB=W)tVGAOIHUXr>wrPeeWlxmK7lv&(3M`#k%7ndJ^;7^d1+-3S;K4!<7h$F9pFwfW ztW_~bfh}>ciImh%2M7YVJH=(OX_e5w5`qBAv`X{Wxh)T`Y<@U>^uaAe`mAMaL+#a@ zCX8;JcdB>oK{ESS*N%LqyL|P~^yl&9u-`oRXrivR_M_K8oHLj_(Cx0A|JwVHbo>3k zwY)@bp(9%#I+tGcvZaKEA6vRE-IRWC>kby3$^mGp2K9<`OC0Uhf?XR~dtB31Wik|)}jTy>9IXQM`$Y#-Y%L<0XqWok?5ikQv(|+r~hMR6`7g=g> z=MVR;ShHruy+7=vx#YSr4O6BJA9s4j3}zF}NRQDh#SADSlVrnSKuo~pY89C`C{Jf` z07f+O3L&lZWehh2dfrzMDg1N%-}oPSzQ9$Bijx~%>s^|isCdjG6zG*qG{iJ(_7+p$Mvyu{a-(}t#Z9H~Vwg1fi} zIQkh!syNc0YvI1*_}9blhra|yA;L&VP_P?$jQrt2+t_4VpEA|L*5c2j{ zw@mgd7}6OC5Xquv-&Vjz$Gakt$P(zg0lq(Y=@5ghm!subePB&Jopm(pyDYwckcSbp zY06!Ydmy(hSI9+6jYwUjKEg*(w;Kv+BTL3KjCUzcKb}rn$bk8m z`}C`Me)4Wt^|I>31f^#wL=`27*gppghjr%}K*JhvIqSjDA@W3G!Rrz@7y{f2lwL>*3%~-f z02}}hfDZkeIsImI2Rfk_YJrlG^$mK;exu;^VKiDclpI3{NDqGu5=PXxy`>sotlc|I zk;TsqkD_q*@S}J7HfZ#kSA*Tu7jEA!b))TWyLz7ydf|3SNxr8%sv6u|IK4nq@ z+%T;DQwZPoDFd`cVWMWPjbEL9Z1L7D>Bsm<{9Wz5l8n3y=t-_LJzJX%d0Dv$a#F7e zn~-iozvM7)&`TWP?InUN>=97oh@3l+7$j^pN)|O!^b{`BYS(mhb~(iy0(Ld3Pr$Cv z_7*D!#Fa2p4HAM&%dV+hoBjB?U!^_5wzQX?f2oCW8$eP|oZG_;Xtw@BVw%B_n3WsK zt}1B~MRrw5Tvc3Vbv??pB&|l2pnzy&x0Oh!gkslnva#_Li(O@|g!K~m`RmXO-g^Eh zlS%s5A$xKv z%q(Ai-24e+nqXbC)nay~xqHWNr&Oc=%v+Ez8+On!n|u&#rdI`K6eP=VxJa#X6Yiu_5*ucOCI`f%R8g7iUeN;62GOqaEpj01!D~45V9B%_BAkPc@7<)w<2#{9$%9;J8xIsqj|zj zd89s{$VoD$aA{#nAzxKEqi}oS-a=t<;WvepQ<(Gjz;V=SiN@p2Dt3_Yq+((%Cc2Vh z89jlEO$Fg7kLjh?CU)!ggWL+O!Y_ugtp?=Tj>?<{hH_HDd`gN$S&iA2iz?hC$*_i@^+QI!xr}dL0UUX% z9cq=7oynbL(6r*(a~n)cZv24sy!yp%dv<;F+U|!&R$0?WK)GBS>Swy^F>(zVbzt}F zhDEoYK7H#V16^?HmQ|#@?Ctq;r%XGzx;7)Mu%IKLvkE>4eT5mOeaWf0XL!4ajm_$~RsM2 z30jkpWPNf{a(+@{Olp z$9_OXEHbXBsI1yc83%1HYuBNwhmpWB?3lJgJHiEW{tNxkG27o5{#;{v{TD5_>(i&8 zn)1L^zPal^`rGZxUNm(Zv+nj$^?K^IN%u9)`@oxi^v<##m?&lh(cxYkQ(a(?XuVa2azM~bw3mI%CIV{{1HTQ{ zDPx#O9lKH?L)RhC>dzBMKmC8leEFSgkFMIiD*gAkI_9(bs$+iievJ8rD^H(Zxv+E0 zzc_!MHT@S7wv2d;+?*NsgMAqIzQd- z6fQ1C5p_0j@DLpH%dRB2kFaS#b||c5fLO!*#l@ zWAN{{FIC3is*zpC;L#ui6>)7`{oj|2#BIM|Bk}4M#sLj(HgcQ7309ljd2xze#;RYHB(4{XJ{CvG;fHtf8pH z9{&Kc+G)hU%YZnpanTt1IaxZE-ow% zg$srJl;1Bqyy&Y;8|4ZYwyXSb4hSN&9+vC(=vY<#p+epaiea8BwiP!N^ER13mEeNM8mS7&GUs^ixNU zTp=VrxSHf{UUDJ*)YDI>5CX%QgDbYSgX8e>;P`VD&obMy1(Nr`?kFZ+d6t$gqiZPt zsQHljbu&N6Jl;Ip%>Ua=KC=JAe%{W1ht@TAf*hP!s(-+XEx)2|QP#k6T%f7`M+AKj9{4!H$hSbM!cR zEV2wLZ1GNQb)-|FF181FYdT?O(3cuf#_J%PLKdl`2_*EzJZN>>{zFW%2Ym zm3OR%h8(be$HM;gb63li)Z$0ksv~UHi(xMnB&(lX@RLoT3V~E;d=nvr3u-0V(}2u1 z&jv5`SW~Qd9MH6^UK1#40P7T^1%?ZHd@3;6s2w;C#U@dp&0su1Gla1~$==ugPrZ9& z|Jm|{Xi0Ws(8O-5q)6Ww};F|D#RHB74PF@D~(W~Pg!aU_5yN{Jj!oitOIX;g6W77Jz5lI|15zu#vOU9pQZ|@rL&} zPB_rH#pOrYvd*P5Go+ENv+G^R>y%u2NjKj`_9%R4JToZ)v%ygP7z2>$1Vd6WPnbE5 zeKk|8ndn$7?6_n#=TWZ7{>`t_e|vS;FMUVsW2ZL1_PLt>ID&R-TibE$8uM13}x;V%%tZ|N6 zT==rtN?>>iIvYy_sv&Y*I(ydT;+1PxCk?xB*7>gUs`Y8)4&29A{I46(mLhy zP50ivdK0;kEbo#fVcqUNfTXRs(w;ir2j*yFc#n8Oq)5e?_0$?h2!UEmm;xC0MB?zp z7zGyqJ770zB}umjIkq-9OKP_P81D>Bjtf;F$IJ#~7m84RW&&j7YS()|DB0mVU9|QWG#eFcA3`OWi8HoBy1HX}ZbSk78_ov<-0z#MHp|C{- zN3;A?t1{Rx=BF^s6^~nJh3vhkA9n?f8;sQB*zWku@ts4M=2+~YI_7PcSe-=cbXs92 zBA{laBrLc!5_bCt&-rZdqX)wPIgY)?C&` zktsr<9qZ~&3$6D(-g2oojTX>-$%B_U)3|zg()>fvPmpVoYwi_)E&diI*lv%TTAp@& z=K9XXn~hmUYBppU7%j;_)(iv-kJn2AR#8Y|PLm|!EzE)O!JQWT8a5$tUjQ!K;t^{- zyA_xLj7zG$E#pb!PGIb@se4IB5VqlS9rtuakD7mI>(<4WJJg7Q{Eqm3;!oo$cA`V+ ztI&*#Op$XL4?oq75*c^a`&t6p^%I0v)^lD9^={ zLz>q$pe1awF0eLR1@_~#l|O4GQERESmz4+4mcwc-5m7X5HHjJ%o@;d|?$jAH0nHm4 zUOzzxGYX@U+B7Iw^Jgp28jnaH_hQLgIFU|Vf+Bc33C-lt6L%_c6Yl11Lk zX-OZY?bU4U3hg>zMzo^UfzOg`u4dO}7caXSKpfc&*2p%O=+IX8o7v~H%MZ5w~ zPR!Cp!41TEstki%DdOt&el{z<9eS#X zZz%nM_9(wU2&~K(%-7@cGWR*F!`HK!a2cqHzIYY52DN_-yU&4{`~0ZmKC{D0;~1&y zeR5Ng**>7feWGbL|bQpPIOOOqctN#SO|av5RL> zj!}J9oQKNlF^bO$*`U6+S8wLDQrd+PfE|$%JWoN=Xv-Xv4PY4B?J#yI zprLV|oml(9B>a?zVT}>wJu9zCUT04ohgb1)F0*8~Rz>9iox28p*j zhc%nnh(s2UX0n-x0i%b6q`-nebAaapCjzGfd?bkMW=SCE3IzROnJ9qqVoe~BrRSu= z6qw-1;Q0!%>|s#Le!`e8QT^uTLlE6)Ydjr1? z@GAqG0yJRcTnUX7GD)mV84(b0pRq=5s8>G2*uB)$R(l)PVI+H!93rVc=C!?oHD^t7 zjpi0qqM$xO3D`|i+7RL?`-im~3p7ho10irZyqU1P(9U#2>-=Sp-2HL7>6Sx*rs=EJ zUNd{aHCslLC(gem1T^M!Ltx&L)<4}impoI_a!ph3q3gHwuh~x?c>*JRsEWC#9_=(` zhCG0kKoVbv_IfMY`y<)dF+&VyrRkC3qP}tb8XzpsY9`_RQ`Gl!pF!J7^yK3EJ9Lfr zE1$27DE0FACVWUbt&qn1u>gerqP{)~+W7upw z#mMgqJJMKiLg!p8u4xb|-QD zEKBu_CtR^0*c=49{~xkGm~8^V3Z)k%(8yLl+y%5Lv?@{|U(v2KZaU<;v;q zCGOR3o^>%@W#fICJPl}|O(v9Xdf{m4jM8!J1%7A3%BRqfYZ5;nHK)8{uAR&T5i-6X zmc=N#EV2IMQS_d-XINtxu1C1H{hjuY-n#xzp50H?~lFe6UAN_fcwGqUid;=gX;|doA#!Bx5CXf&N$0R*BW;+5(>YG z=DNsue0gVkS9tlU(hU-w8owbTGnkxL>53(B+2}?1|Tk*NHca z8l9Mx8`kLxfGu}egTR(ajs^$MIZ7O|qs<|hd50s%7w2S7M&uBZ<_dEXRznJav`L2f z294qtDA6G`hl{W*b`ZE~D5}9WV`ux!Le^sn=mEv)gq+k^pHf~bv4(9OLbEF%C_CyV zE4xS!u_JBG?D_Aeznix${m%|L7S!DJ?}O*}bVzf=L))j#CeOaVeC0E{Gjcum?~MbR zNFTB;ebdJs@*Ua$i9*8SEs!X92}$W8uK2=h@@!<{)|T!p{i2j_DcW8{*W~ZWr!>!z zN7u!7Dd6xQ;u=F%AgdsYcLvC-fUy`qH&Tt!ZAAJlW+EtkvumPqIJ+VeCDv$Nv_8tS zAM>O8qsOD4L@z|OIzH;=T&${QHr&FvEBAk?dlUF5t8;(+J?DMjSu->5B(r5EnI$vX zfff~pJnuQ@Scvv>a#Y)sSWn<6{IFvj3o`uL6nlM>8ksioku z8(i+}fm(JO;)#-FWmV;MNlV?jhVF)K4RS+6^(az{rA$?wUd^f(jXph^$3|}%%{`-g zM)S3!pBa5(v^=^hUENW=wt8drj%w9Y-6cNuRIAqNY9)4U?d`REHN`5GMRh0YMRq&6 z(;1_bzyah71>KnO#1w9Z%RbV}Kve%uUN7rKqB^9X#v)SDdAw25dGm%9rL^*qk#zfE zM5H0L6RpU5MxOb#))r8nHBOW^V_oMLM~*hTcFQ0CXSbj;_SB{s?cZ^X7+ltSBZ{BR zV4G={&I7ecxc6>mjR&M^?Ec%~8*H;60NcJV$c_csCBgMU?hPh_{8*UHiY|$+ipsx8 zz>79e!{4o8YOTMvwpK1{sA?G1AbaFW3NdREl-9&NO&v`On`C-h+q9$UaMOvVfhMc1 zDdDP$mn|ye5^6B>^0G2mhGVD%hsu4SKvl$Ak7K$sL8Lev*HCJL-IMrL;!g?r>clMx zo`{JmO`&8(YGZ6mtOxF9w%XH4wk>%&$v0B)VyKDM-ztp`{kXT1;ZDF-iRCejRJ0ys zB`FCagQt?=LxylMkdm;!AvT6qRFoAIh7dZy;~%<06Bn#exQJreMve?K;(fhstriKy zb?VB6>nCp+9uC$t^$WCIps8C{+oKu-;~ORm0`3^0noBM+~|CK_p2ck}42MN0LcNBpgU49FDM7myqN2ELz{7 zJp`D&V7M-+Zy zb~~gJgKtr^T9Ctw6n7z_FH6WlP=e`6eu!MLOlly0HHaQCwZhBh?^A)lRkc0(^=mHq z(wVlua4KTo*fbM$5k}nm2S4{N?Rr>6k73s*q{k0PmDp&LvFpE8!9G@TNd*NMRB+7_ z4urXngM-L^+SAo2lnxgeUkuC$8`W1{6|}N=vo1T3Qv9@@#!g*@#*wWwJHEIlWlW$P zQEI#5EY77wJh37nCz8G&KY?o-VKnVL^v0mAXl}$83p=rI0*-hEOWb-02(k#%Je^_N z`CH{biclSZq1sS>uT<-QRwBX zHS&hoZ83gZ>?<*T%=4D#U5`A@!kR1-E!!lpIPiHO{Vy-x}w&@wWKP_)p_FeTjrUvP%tCRX8Y_L0Pk2WoZyRuz`6R zIvN&&GvaM+!;Xf-4JR4~8mzVkM{OE8GNP{fTB+GpyHL=Z9N8FPfpjOthX&VIk|2`7 zhw>asC}|)dWJkx1Y<@E6ZlE|Fh5Nh`nQ!?4*w77^UYV{Na=q8C-zem~;6mdjeQL>< z*)Ip*_4WVD&8C2-S@|ZUdN1}!M0!vkAJD2}*~>#Wg!s}BBUPP~Y8c38o>E4EfVQPGQAnFoBfL9FwwCbe;+0!Lhqd;aJH)u!8niDM&)*XM z_1(K>k&^l#p8R&~hnuh;Vz^1Ucs64j_-$~^uvQAQy)wskp>4J8RomM(_0k|)6J|@p zEb47W=~vWM$3?Hx?eNz+x0JJ3c}Mw)@^{LWF3L*os;+$puoGTa?O`{Q+;R6ww@i8= zJ*c5XtiP(4EceC(_QU2wccDZKC999X!TgP#56+2(o@cqqT=RPKZt+VWAGFj836t=;}&T`=Y#g3H@d4q@5X{)qvX>yx( zjrQ-FT<2Rw72&eJt9^WfpM4|vSdf1$^lu?PKExt8-*C#SWTXb#QD#ArNV|+|G4@EL zJX|Z4rJN+OWhq)-XA#K`bw_nP8%GfboO_^R<+WtGDno_pF8EFYn}WW=dDgY$IXz)@;vPm z8Xu?4(s+Bt?21<^6sk<1v=lUyLM>NtPK3Oh(}4*vrUF?~QN{@D zfzG|AZ@b_MI0z)#N7h{D(e0cUJBY_w^rzFFP`a8m{b*t^WM{ zxtEiS$PAoPKMnd1N_Xn3d<{_Pzv5+UkeAcS8Z6^2Pg>+#z4v(k)k_}RPQEB`I>2Lr zEdlNc^aS|Yz%zjp0Xa|sdhp{(W2jyU2M6eCl|mmx9oslUu((IV)t2s9CTG*_0tBClLLG%GKj|I<&Qn~w+9V& zPt;upE8ZbccNP4qSN@9)VX9fahs(Z-gB7T9P#)xNB|;oM9bukGEJFNRp|_2ZXCfye z??fySt*qH)@#D$DwYs^RJ$i*d>+vv`48L$q*XY-UNb+_<)T%jXZtH$hJ4H!syu-Fj zJG&o6pbhmC-{C1siM{k84N6xI6}UUOj&C1{so!%?E?!{dY+y!ix%9n(S8)q>yB?Rd z>O@wh7s;b};1sAic!NdJ;hwDMZl{y@HAUe#oj6L9r%@SuQcmGeyG~-{WYCRO>~@-8 zx!DTTgX{(y>$V<{Q<5#+7k+*HRpEZ|3V{ZRX50-^;>tsLO%Q1ckcSZICq)%PgqsKa z-&@{w>9Q@$x8#;*wr$IN;=Wq=i`^&5xgRUL*(CMH$o5zXT}7Yfh9Tx<$s(f~DBdfi zI9|i}4RuEO%X>7f+MawGUxAol-J;VpF%6b}7tSW{67wh|O@+f!ed#aO;x7R5NRu0?ccGm3^)K~PFHt0o^c#T{yFDL z1=o6%>t9yn9q>;)EXkjem?HUb8;9^}hKyP@to~N1vZFWj1~$<8-Zzka?G5AY5UdVx z$wQb;Yisxr_E$?w5PD{XHHj>a_3f=l5qZZ`OP`{D^s3sIQ1#B+!QIU{2p9(zO381&UL4j z<$l7#Bd{O1Nvm^ZI}X5?sQMIp7rwU0+9^RY=nBpI4J%thqcW)({_C z38~YUU8bHoZ*0xzh%=M>D{TQ_zm(0R6DEDVCuwRDw z8szEXe}Ow%xAHV-LY17Lp9(#V0)?FJk4#$;vMa;ct2~}nB=}B*G)jTfxgIenK~b`YW@?Q@b77NyTV6n?!k4A+?n!gh%(G&(B43+3pcu!i)=l%<%_%!z-3 z-i@#V9Mi4FzBHmb;D6d4V2w-l+2exgmh=TvgR7S4v)igCrW=-LRIA#}1fqKyt#~G#f}Gmx zp(Mrh$WjNgC}VB=#M%NsP)E{88`Ty!mX$45er7J~GK?ZgSm!YV2eE@T9{@T2StQ3( zRE9jwWw_L2dN7jpuoz1-98wua!a+`7ZRC{2O~#!WF3@#Fmi5X+R@N2aUAP~g!83G~ z_5?nwJfCG6z7EqFXlsE?)bN%k!*YD0P-?InT zIDFvT0#yX0?FL<7kkfiOW@V*%HS(YW)eaQQQ_G2wl<9PHy1P0_4k5id5)Ea`>^kpu z(A?QU(J${pb|Ctb)1S!p`q>Vgq-ByjASJ$*^TYfE=alD6=5~s@AX2gqAteY_(=AC5 zRakq`@Q|UJTofjV>(iiyssWVl2OfI`84wJB*4EEB8|$)*IQ-a}^JeEBUN&*c+Sc+A zxc=ChnifWMJg@{iVS9cjILw{E#ZJI2c(oIP&v`Kku)xeu*Af6 zV^p?S{kbuk#yZ7b0R1gK^EiUjAgpktaSA(*m5jp{k2Dacoo$X2l)4T`0X&f%dm9;) z{aFWvFM04={`r==nT8eFtNY8q?C@!qy$l)TQ~QJBVJnQM?Zw82AQoHy$m?O6dV@Yo z@li*_Ex!nZro&tYni!@3tIBS^%JMvX5@V?P($2E_6*g<5MT@7hl7%@`)zT>IvL23R zPss1c12W8(G29*PkQMO8r0xpGv^KA3?M3TyZ<|l|QR|p5jWk>GLSL7!2RD9-FYO7Z z!yVy;;kDr%;ejyj5W;au7mm8&NHlvyI*C%VP;fOkV{VfG9qCNycymf`wR^Hw8xXRo z7OUc@ZXw4zbU6`xCpZw4DJ^YRa7Pebf}^T+ZwSpbnrS<_#E?c$sZIx5jeUEF)JNm$ z;E?uwux0qS5}k_=9i#|nc!C{jr2@4?#jS$2jqXGKVroV8;P?iAq;${)!A-6OwNz)5 z>et}7S^Al;x^DTx%;xmw=FeTU?1uiC>CKsi7hQkjg`GDv^S_-te(J(SQzkF?+byyybuf9gH={!RQ*c3IuQN078QO6 zTv#lZ_TGyXFc-@`c(F#D`7_QjW)jnF$eiMAq5@E1_PDon#^&YcXwb}DWKIUS%NlT( zdo2qkuQZD!z$xA52xeWVtVcPi?F;Q)cExJ9Jq76k%HJ;(dYi`v3f$?irhEHH;z%7( z3P}qlx!7!|XZ4gp){oW14bi=I&9fSVOO`kiOO~j=n=@{T;|})qAC_%gOx*1T@bp^- zo`3{O?BqhKDJZ9$+NW=1jCDhCAz4g9?RjVn3Cd1;OYYCRpdT&Cq4#R^zW4uw@~c9~ zuX{_x*9bbDkX=HjQ!i5sI$c3N$sbG*4btgKMNUD^6y=KqE)2=PSZJ6*>E04qY6ll~ zk;VxJh|_u;zg^(HjFQAOx;WIS3rbOScl(JW2N3T~EZWh{Jwkl?b@x#D=^rdWwce1S zjP{0MaAR2HaG&;5LySNv6?$oNvsxlJOFy&4d9IDeFokIG;k1GnrTw)LJLIN;qmcJk z=y461E=YHQP)GVodRZZo65*B~hbCRP)q0ypXFb-ml_QV00)8NL8r@Ts$Yv1EP9ZXi zB&+G(L(oz*?D`2%W&{T$W+)PDuRjDo%?hiv4ac8$zxAeRKe+3zX+PMS+tZ#{5PZ5l zaZVU`4U+1^^*hPX>qpe@ic-BqzuP{7g2(&c5n80d;U3Xf;)saq8&V|`;)p>UaaIY3 zY$1*m%04eIRJxQNR1i{>3ghB`Auj%RI0hWxaE<`xNXQlIJJtcK?6JnIUDh2|$Q7&R z(izDWh$};`Ksl5Y*N5S5-XXG~zJ$A#@c%@f=_|h|wx4!Toe=wSRat< z9Un+n=Mf^U2)N!hE?JdWTBwlyIOGP2)N@{4gK7Wi=n)J z4!xU{S3eZ;b#k}76=wE@_&PAZ#bO2K@lw9NTUWXX4XGpi!U$|#*$uXCo=Xhw^mop`ro{Nb=idUW zfqqkR{w2;b`~b}QA168zXVZs1inD3c`#YOTPF=&nbZ10L<49UOk%H;G*NIe^AKv3c z`XSDveBcY1fveT8;XGP_I%G~I}ygnB6af}u9D^c(m{ZbU+Bz)`xQ#5`st(;Z0T>gg>l)9GjI4E$5;jbEm>;1`@u zIZhIfs22jKAl&X?q_Ij4yehQ4NM#_kvuGb;kK_$QswHm^;<=pq3&yRj(5tP|yZRFr zotRo0HnS5}wH(GTuDiooPFi3vo+ZsbjjVB?G@a=oe8E_Q4A));bDFMp-#LKV5LeuR zmob;)1#z=T98a0fJ5Zp5sz*Pg4yd**YLB`@J*=KkRY`@Xk1Ff8-+|-v!cXI6>P)<} zPsGcZR=lJd@q)vGtfP#utXo~#(=tmNvHlw&%~1V?A_2^QhA1LaFa8M~99J7C`bP3e zOm*Qy!9a}J2mQ8^AMfR#|Mf3eb^qUxVC<${xgFO)ODLHg7z4_!x`c8>aZ4{^#V|V- zPKT3ym>>xgWN@6gFbl=SByl6%%Pp8FOc5rE|NnfVVAF&Sn&|)a=QsVD=E>T+OH34I z>IC*tjo3$i_Vv9eAmYzLzdO0xT4{t@y4{!r9NnN+Ak~ z9M5vy7s89fljXb&+Eze!>ZYwWC@W9Ff>S2Gb22?ro5l1(6$|Xv{Tj}9y}Rd~N9VlW z-P2}@cRkdY$s*YB;&ocLktGcpQB>BtD+ussbY!8SEo`AJY@sb|5nGt<&FH#lp=G0G zi{%;1fW=0BY&$H6Ehj7}P=zgQ`3JV}lPq-Wdu?N~>(B2Kre$)M!NxYe!GQz2I1L3d z{5tk^n4CuN*TMU|u;J+g9Z#CcFs+iYR@9~v_F9NwT2f|xqWOW;%uB|#EUf!lbBDF{ zjyoROv0%aZ>E=0ea8FQNVO%h=^?S=TM+MnsPvSD8(oiRm8p1dO?$JV7q$S0yI&>ou zsca)wt~+S)u;7XcvqnHK*FBP==#{lu)H5HA97GnESiedid{fZs@Tn8*!;R!Wu%w zC%rh&jNW4vX=$*g##$aFW);@x&}SqApx?#9p|Dh|NG62*6{$v0NqAjpRC?iM#5~`TB_2j2klm#yeYN0pWyyc<_rsFl3L%+y+4$XKmVaBd7th*8{seABbbt{!`4F12Vv?qPD2rfzuKSAz5`B z7tx##;un-NrV9ZvJvcXg$eEEslGKx6SeK3?uYJPxDa!-ZRgI9e;iz*L}EfOfe*JhXE0rI_Bv>HVScQt z18Na%96M2}ohTJr5|jlyqa0jhcG+m(f<$TqcH0(vk9~)z^Qj_fn^(3YIhdZT#Z4+r zxjq8jo|$CR7DmK6h}jBedPp$ULDN8c$j}^)gx@%VD;&_ENr0p)6iDtyp)YK^`|i7; zF;Ju(qWCX_N4puxXZtw+mLy58{W3D>dL((8h`561`&`8RR3S3XjNr3e?&WS0z-W@R)v^>s@*ai*`6Hu>Hg+1%rZ@8%_RW?fPNe9-(v!cnMN<^ ze*ry2XQq*Hp&br?l5a1U z;#wT~^@%<41asy`UzNK^-C#xRh*XDG?b7S)%i7^FoPMOQ@SmT1E29<<0}_OJLQ4gltCkXg6}c#ks6x>+9uXh z2EqOWuQpl*8kLUcXFJzsm2}SVms3_i5OSQZ_xH^Kx~(eQ)C@>+zjbg ztU+45PfqH=$}Ay8vEB5(%Vx)jztL04WHd32OHsHZPm^Ow7E5*|wyqGJ2j8ds57mZ4LjiSS=t@E)ms>H9ZHdqJm#ymQZfZtlWh$e?L{n_h~b{pR$mWd9A5~}q7`@qd*oI@`;DUgYa#~DjNGLC z!HPkc)V=~o{BF@6PmcZZnzR!5#CEa}wuD~h@n&P8hysqs5C&FY7DS)I2a#e45miM! zk28voq>(D?8XX94V|9fdG}3fL5&lL*5h8w!+6&%?*hAjYe7Kprn#Xv8cpS(aGrVm* z_4+1wS&hK2*?gWt>cSxe*y^?tx9w4jrhH? z3a(Q8UJ1Tp4+@M$9|L1V#G_BuPI!F`{93pBtC$_r!i&={VkGZ|yeeWHkY2|&5AI|x zB4q1XAmkVKxLhPpOrHD6+(jk$qdk%XpnagEeIVfT71~oan0Y(6s?Kv3Wj&^dnUPH^*85k;7e$g5v|Bs2d&_8BT3+# z6f_FXDS45Dw}4+9`!;3G=3%NXR)f}+x{HcoqZ%Tgh7T?&-PT6@$>2H`^l2A;eu}o^ zq`Q7h`*8EXQFfJdDS67^ik<_6FkurBl<5xGu{k5XeAmo2p`OR^y@XV^ zD-<~nbN?b`tFle$RZimQgAZJh#)xx5TN@700tsV}K&Gna3Qc2-*rA&Rg*NSEVlcn8 zZABSdSk_gxwM^bsRt7m;y2VY2bvt(Xp9PEs1`O#a_6(@jKp5ui4a2&cqhq%tw;JY6 zjE>zt6>||bcFrDaTdxb-?xj60x6_8XMl366@OJF|KZ`zMH0*t77*eCrM-OAPZLTL= ze35H~>$FQ2p0g{>%_o!+;uc?lG%pz!l9^;|43WpWo5kH3_f~hW`-q#YJA2$7WAOEY zK5mChFBu&@tI#vPlZkZa4rIc~Aa-ws8>X^96uJt$N&9RPc&BNWfcKx#llC3zO@bDU z8Tnl9X?Biiwa{qAZa^yyd~Bi0Bo)U~v=qEZz!Mw~@T7JFp5SDE!t6Kg62grS)W@;aN>Y(v z)6tFrU$oQ-oq3VbpZkD|;N*YYpGrj{=v0zH13koug7+IEzQ*D9Y{*vc&_QTl8zbBa zS};a<4JB2~EC;FjNN70x+|w41cy0k7v~$Xwo$?B|EC1Y(6qY)nQwXSNb=quITNkd( zxB5D`Kuq9Dj%joPyCaXQ!^N+pI zP7>K4tO2y6b4k1O3Y}YNM@oNSi=|ci0$FNfC)-Z9aerG|xDL8+xDMK%+@`lr$hPUY zt#2b+ahqJj4kgB!}u;>JWBeQK3S1FS~j+DsbxYDUqx=wZEc>G zSW8DsS4&Te+VbA`QKACOH;ztXmWEMH>9#yTv<}Mz3vKWfpXFnizn+0~_ zWPw<6UY$skq7r4XXjgP=bX)X^sEXjpvTSq&RE(1aWS`P6_*$#6iJ# z2kT;{1;J;i9@{Y+d{Y7+Ty82sjVr9 z?w{^S)rQDKU~>OkAs?R?oQcLE*=v??DRx+kk}

)B!Rj-q>s)fb|$VX!SZ^;n^ux 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

3jK_oXqNPZ?%J?s5pumM^Wb}8XQFz$1e!Et$(cp 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

;{q{H&Bp6 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 JACzpK|1Z+u?REeF literal 0 HcmV?d00001 diff --git a/assets/style/myriad-medium-big.fnt b/assets/style/myriad-medium-big.fnt new file mode 100644 index 00000000..52bdba57 --- /dev/null +++ b/assets/style/myriad-medium-big.fnt @@ -0,0 +1,4827 @@ +info face="MyriadPro-Regular" size=16 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=20 base=12 scaleW=256 scaleH=512 pages=1 packed=0 +page id=0 file="myriad-medium-big.png" +chars count=506 +char id=0 x=210 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=33 x=250 y=113 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=34 x=205 y=253 width=7 height=6 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=35 x=220 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=36 x=102 y=19 width=9 height=16 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=37 x=110 y=84 width=15 height=14 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0 +char id=38 x=230 y=127 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=39 x=212 y=253 width=5 height=6 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=40 x=111 y=19 width=6 height=16 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=41 x=117 y=19 width=6 height=16 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=42 x=88 y=253 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=43 x=185 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=44 x=148 y=253 width=5 height=7 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=45 x=68 y=263 width=7 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=46 x=6 y=263 width=5 height=5 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=47 x=125 y=84 width=9 height=14 xoffset=-2 yoffset=0 xadvance=5 page=0 chnl=0 +char id=48 x=242 y=127 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=49 x=0 y=141 width=7 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=50 x=7 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=51 x=17 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=52 x=27 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=53 x=37 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=54 x=47 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=55 x=57 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=56 x=67 y=141 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=57 x=134 y=84 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=58 x=248 y=219 width=5 height=10 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=59 x=98 y=219 width=5 height=12 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=60 x=196 y=219 width=10 height=11 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=61 x=217 y=253 width=11 height=6 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=62 x=206 y=219 width=10 height=11 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=63 x=77 y=141 width=8 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=64 x=144 y=84 width=14 height=14 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 +char id=65 x=85 y=141 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=66 x=97 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=67 x=107 y=141 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=68 x=118 y=141 width=12 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=69 x=130 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=70 x=139 y=141 width=8 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=71 x=147 y=141 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=72 x=159 y=141 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=73 x=251 y=84 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=74 x=170 y=141 width=7 height=13 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=75 x=177 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=76 x=187 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=77 x=196 y=141 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=78 x=210 y=141 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=79 x=221 y=141 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=80 x=234 y=141 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=81 x=179 y=68 width=13 height=15 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=82 x=243 y=141 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=83 x=0 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=84 x=10 y=154 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=85 x=21 y=154 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=86 x=32 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=87 x=43 y=154 width=16 height=13 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=88 x=59 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=89 x=70 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=90 x=81 y=154 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=91 x=192 y=68 width=6 height=15 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=92 x=158 y=84 width=8 height=14 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=93 x=198 y=68 width=6 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=94 x=14 y=232 width=11 height=10 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=95 x=94 y=263 width=10 height=3 xoffset=-1 yoffset=12 xadvance=8 page=0 chnl=0 +char id=96 x=11 y=263 width=6 height=5 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=97 x=25 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=98 x=166 y=84 width=10 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=99 x=34 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=100 x=176 y=84 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=101 x=43 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=102 x=186 y=84 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=103 x=194 y=84 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=104 x=204 y=84 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=105 x=250 y=68 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=106 x=100 y=0 width=6 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=107 x=213 y=84 width=9 height=14 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=108 x=251 y=52 width=4 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=109 x=53 y=232 width=14 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=110 x=67 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=111 x=76 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=112 x=222 y=84 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=113 x=232 y=84 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=114 x=87 y=232 width=6 height=10 xoffset=0 yoffset=3 xadvance=5 page=0 chnl=0 +char id=115 x=93 y=232 width=8 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=116 x=103 y=219 width=7 height=12 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=117 x=101 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=118 x=110 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=119 x=120 y=232 width=14 height=10 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=120 x=134 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=121 x=204 y=68 width=10 height=15 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=122 x=144 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=123 x=214 y=68 width=7 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=124 x=20 y=0 width=4 height=18 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=125 x=221 y=68 width=7 height=15 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=126 x=17 y=263 width=11 height=5 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=161 x=92 y=154 width=5 height=13 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=162 x=242 y=84 width=9 height=14 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=163 x=97 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=164 x=216 y=219 width=10 height=11 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=165 x=107 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=166 x=123 y=19 width=4 height=16 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=167 x=0 y=99 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=168 x=75 y=263 width=7 height=4 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=169 x=117 y=154 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=170 x=153 y=253 width=7 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=171 x=97 y=253 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=172 x=160 y=253 width=11 height=7 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=173 x=82 y=263 width=7 height=4 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=174 x=106 y=253 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=175 x=104 y=263 width=7 height=3 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=176 x=228 y=253 width=7 height=6 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=177 x=110 y=219 width=11 height=12 xoffset=-1 yoffset=1 xadvance=10 page=0 chnl=0 +char id=178 x=115 y=253 width=7 height=8 xoffset=-1 yoffset=-2 xadvance=5 page=0 chnl=0 +char id=179 x=81 y=253 width=7 height=9 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=180 x=28 y=263 width=6 height=5 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=181 x=10 y=99 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=182 x=228 y=68 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=183 x=89 y=263 width=5 height=4 xoffset=-1 yoffset=6 xadvance=3 page=0 chnl=0 +char id=184 x=235 y=253 width=6 height=6 xoffset=-1 yoffset=11 xadvance=5 page=0 chnl=0 +char id=185 x=122 y=253 width=5 height=8 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=186 x=171 y=253 width=8 height=7 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=187 x=127 y=253 width=9 height=8 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=188 x=130 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=189 x=144 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=190 x=158 y=154 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=191 x=20 y=99 width=8 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=192 x=127 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=193 x=139 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=194 x=151 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=195 x=163 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=196 x=175 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=197 x=187 y=19 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=198 x=172 y=154 width=16 height=13 xoffset=-2 yoffset=0 xadvance=13 page=0 chnl=0 +char id=199 x=106 y=0 width=11 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=200 x=199 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=201 x=208 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=202 x=217 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=203 x=226 y=19 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=204 x=235 y=19 width=6 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=205 x=241 y=19 width=6 height=16 xoffset=0 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=206 x=247 y=19 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=207 x=0 y=36 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=208 x=188 y=154 width=14 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=209 x=8 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=210 x=19 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=211 x=32 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=212 x=45 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=213 x=58 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=214 x=71 y=36 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=215 x=226 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=216 x=237 y=68 width=13 height=15 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=217 x=84 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=218 x=95 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=219 x=106 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=220 x=117 y=36 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=221 x=128 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=222 x=202 y=154 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=223 x=28 y=99 width=10 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=224 x=38 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=225 x=47 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=226 x=56 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=227 x=211 y=154 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=228 x=220 y=154 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=229 x=65 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=230 x=153 y=232 width=14 height=10 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=231 x=74 y=99 width=9 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=232 x=83 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=233 x=93 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=234 x=103 y=99 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=235 x=229 y=154 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=236 x=113 y=99 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=237 x=119 y=99 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=238 x=125 y=99 width=7 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=239 x=239 y=154 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=240 x=132 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=241 x=0 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=242 x=143 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=243 x=154 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=244 x=165 y=99 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=245 x=9 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=246 x=20 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=247 x=167 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=248 x=121 y=219 width=11 height=12 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=249 x=176 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=250 x=185 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=251 x=194 y=99 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=252 x=31 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=253 x=0 y=0 width=10 height=19 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=254 x=117 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=255 x=24 y=0 width=10 height=18 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=256 x=0 y=84 width=12 height=15 xoffset=-1 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=257 x=132 y=219 width=9 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=258 x=139 y=36 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=259 x=40 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=260 x=127 y=0 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=261 x=203 y=99 width=10 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=262 x=151 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=263 x=213 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=264 x=162 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=265 x=222 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=266 x=173 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=267 x=49 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=268 x=184 y=36 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=269 x=231 y=99 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=270 x=195 y=36 width=12 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=271 x=240 y=99 width=14 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=272 x=58 y=167 width=14 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=273 x=0 y=113 width=12 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=274 x=12 y=84 width=9 height=15 xoffset=0 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=275 x=141 y=219 width=10 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=276 x=207 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=277 x=72 y=167 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=278 x=216 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=279 x=82 y=167 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=280 x=139 y=0 width=9 height=17 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=281 x=12 y=113 width=10 height=14 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=282 x=225 y=36 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=283 x=22 y=113 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=284 x=234 y=36 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=285 x=34 y=0 width=10 height=18 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=286 x=0 y=52 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=287 x=148 y=0 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=288 x=12 y=52 width=12 height=16 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=289 x=158 y=0 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=290 x=168 y=0 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=291 x=44 y=0 width=10 height=18 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=292 x=24 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=293 x=180 y=0 width=11 height=17 xoffset=-2 yoffset=-4 xadvance=9 page=0 chnl=0 +char id=294 x=92 y=167 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=295 x=32 y=113 width=11 height=14 xoffset=-2 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=296 x=246 y=36 width=7 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=297 x=247 y=154 width=7 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=298 x=21 y=84 width=6 height=15 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=299 x=105 y=167 width=6 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=300 x=35 y=52 width=7 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=301 x=111 y=167 width=7 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=302 x=191 y=0 width=6 height=17 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=303 x=197 y=0 width=6 height=17 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=304 x=42 y=52 width=4 height=16 xoffset=0 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=305 x=178 y=232 width=4 height=10 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=306 x=118 y=167 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=307 x=203 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=308 x=46 y=52 width=9 height=16 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=309 x=212 y=0 width=7 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=310 x=219 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=311 x=54 y=0 width=9 height=18 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=312 x=182 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=313 x=55 y=52 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=314 x=229 y=0 width=7 height=17 xoffset=-1 yoffset=-4 xadvance=4 page=0 chnl=0 +char id=315 x=236 y=0 width=9 height=17 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=316 x=63 y=0 width=5 height=18 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=317 x=128 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=318 x=43 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=319 x=137 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=320 x=49 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=321 x=146 y=167 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=322 x=55 y=113 width=6 height=14 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=323 x=64 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=324 x=61 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=325 x=0 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=326 x=70 y=113 width=9 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=327 x=75 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=328 x=79 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=329 x=88 y=113 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=330 x=11 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=331 x=157 y=167 width=9 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=332 x=27 y=84 width=13 height=15 xoffset=-1 yoffset=-2 xadvance=11 page=0 chnl=0 +char id=333 x=151 y=219 width=11 height=12 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=334 x=86 y=52 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=335 x=166 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=336 x=99 y=52 width=13 height=16 xoffset=-1 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=337 x=98 y=113 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=338 x=40 y=84 width=16 height=15 xoffset=-1 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=339 x=191 y=232 width=16 height=10 xoffset=-1 yoffset=3 xadvance=14 page=0 chnl=0 +char id=340 x=112 y=52 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=341 x=109 y=113 width=6 height=14 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=342 x=245 y=0 width=10 height=17 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=343 x=115 y=113 width=7 height=14 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=344 x=122 y=52 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=345 x=122 y=113 width=7 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=346 x=132 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=347 x=129 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=348 x=142 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=349 x=137 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=350 x=22 y=19 width=10 height=17 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=351 x=145 y=113 width=8 height=14 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=352 x=152 y=52 width=10 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=353 x=153 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=354 x=32 y=19 width=11 height=17 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=355 x=162 y=52 width=7 height=16 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=356 x=169 y=52 width=11 height=16 xoffset=-2 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=357 x=161 y=113 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=358 x=177 y=167 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=359 x=162 y=219 width=7 height=12 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=360 x=180 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=361 x=188 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=362 x=56 y=84 width=11 height=15 xoffset=0 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=363 x=197 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=364 x=191 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=365 x=206 y=167 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=366 x=202 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=367 x=169 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=368 x=213 y=52 width=11 height=16 xoffset=0 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=369 x=178 y=113 width=9 height=14 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=370 x=43 y=19 width=11 height=17 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=371 x=187 y=113 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=372 x=224 y=52 width=16 height=16 xoffset=-1 yoffset=-3 xadvance=14 page=0 chnl=0 +char id=373 x=197 y=113 width=14 height=14 xoffset=-1 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=374 x=240 y=52 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=375 x=10 y=0 width=10 height=19 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=376 x=0 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=377 x=11 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=378 x=211 y=113 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=379 x=22 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=380 x=215 y=167 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=381 x=33 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=382 x=220 y=113 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=894 x=224 y=167 width=5 height=13 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=900 x=34 y=263 width=5 height=5 xoffset=0 yoffset=0 xadvance=5 page=0 chnl=0 +char id=901 x=39 y=263 width=8 height=5 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=902 x=229 y=167 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=903 x=47 y=263 width=5 height=5 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=904 x=241 y=167 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=905 x=0 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=906 x=13 y=180 width=6 height=13 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=908 x=19 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=910 x=33 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=911 x=47 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=912 x=229 y=113 width=8 height=14 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=913 x=61 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=914 x=73 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=915 x=83 y=180 width=8 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=916 x=91 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=917 x=103 y=180 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=918 x=112 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=919 x=123 y=180 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=920 x=134 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=921 x=147 y=180 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=922 x=151 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=923 x=161 y=180 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=924 x=173 y=180 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=925 x=187 y=180 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=926 x=198 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=927 x=209 y=180 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=928 x=222 y=180 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=929 x=232 y=180 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=931 x=241 y=180 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=932 x=0 y=193 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=933 x=11 y=193 width=12 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=934 x=237 y=113 width=13 height=14 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=935 x=23 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=936 x=34 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=937 x=47 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=938 x=44 y=68 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=939 x=67 y=84 width=12 height=15 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=940 x=60 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=941 x=71 y=193 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=942 x=54 y=19 width=10 height=17 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=943 x=80 y=193 width=5 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=944 x=0 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=945 x=207 y=232 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=946 x=68 y=0 width=10 height=18 xoffset=0 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=947 x=10 y=127 width=11 height=14 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=948 x=21 y=127 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=949 x=218 y=232 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=950 x=52 y=68 width=9 height=16 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=951 x=32 y=127 width=10 height=14 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=952 x=42 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=953 x=227 y=232 width=5 height=10 xoffset=0 yoffset=3 xadvance=4 page=0 chnl=0 +char id=954 x=232 y=232 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=955 x=52 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=956 x=62 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=957 x=241 y=232 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=958 x=64 y=19 width=9 height=17 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=959 x=0 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=960 x=11 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=961 x=72 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=962 x=85 y=193 width=9 height=13 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=963 x=237 y=219 width=11 height=11 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=964 x=22 y=243 width=10 height=10 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=965 x=32 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=966 x=79 y=84 width=12 height=15 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=967 x=82 y=127 width=10 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=968 x=73 y=19 width=12 height=17 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=969 x=42 y=243 width=13 height=10 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=970 x=94 y=193 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=971 x=102 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=972 x=112 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=973 x=123 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=974 x=133 y=193 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1025 x=61 y=68 width=9 height=16 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1026 x=70 y=68 width=13 height=16 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1027 x=83 y=68 width=8 height=16 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=1028 x=146 y=193 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1029 x=157 y=193 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1030 x=167 y=193 width=4 height=13 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1031 x=91 y=68 width=8 height=16 xoffset=-2 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=1032 x=171 y=193 width=7 height=13 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1033 x=92 y=127 width=17 height=14 xoffset=-2 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1034 x=178 y=193 width=15 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1035 x=193 y=193 width=13 height=13 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1036 x=99 y=68 width=10 height=16 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=1038 x=109 y=68 width=11 height=16 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1039 x=120 y=68 width=10 height=16 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1040 x=206 y=193 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1041 x=218 y=193 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1042 x=228 y=193 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1043 x=238 y=193 width=8 height=13 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1044 x=130 y=68 width=12 height=16 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1045 x=246 y=193 width=9 height=13 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1046 x=0 y=206 width=15 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1047 x=15 y=206 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1048 x=25 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1049 x=142 y=68 width=11 height=16 xoffset=0 yoffset=-3 xadvance=11 page=0 chnl=0 +char id=1050 x=36 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1051 x=46 y=206 width=12 height=13 xoffset=-2 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1052 x=58 y=206 width=14 height=13 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1053 x=72 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1054 x=83 y=206 width=13 height=13 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1055 x=96 y=206 width=11 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1056 x=107 y=206 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1057 x=116 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1058 x=127 y=206 width=11 height=13 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1059 x=138 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1060 x=109 y=127 width=13 height=14 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1061 x=149 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1062 x=153 y=68 width=11 height=16 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1063 x=160 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1064 x=170 y=206 width=14 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1065 x=164 y=68 width=15 height=16 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1066 x=184 y=206 width=13 height=13 xoffset=-2 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1067 x=197 y=206 width=12 height=13 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1068 x=209 y=206 width=10 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1069 x=219 y=206 width=11 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1070 x=230 y=206 width=15 height=13 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=1071 x=245 y=206 width=10 height=13 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1072 x=55 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1073 x=122 y=127 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1074 x=64 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1075 x=73 y=243 width=7 height=10 xoffset=0 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1076 x=0 y=219 width=10 height=13 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1077 x=80 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1078 x=90 y=243 width=13 height=10 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1079 x=103 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1080 x=112 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1081 x=10 y=219 width=9 height=13 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1082 x=121 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1083 x=130 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1084 x=139 y=243 width=12 height=10 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=1085 x=151 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1086 x=160 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1087 x=171 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1088 x=132 y=127 width=10 height=14 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1089 x=180 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1090 x=189 y=243 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1091 x=91 y=84 width=10 height=15 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1092 x=78 y=0 width=12 height=18 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1093 x=198 y=243 width=10 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1094 x=19 y=219 width=10 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1095 x=208 y=243 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1096 x=217 y=243 width=12 height=10 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1097 x=29 y=219 width=13 height=13 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1098 x=229 y=243 width=11 height=10 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1099 x=240 y=243 width=11 height=10 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1100 x=0 y=253 width=9 height=10 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1101 x=9 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1102 x=18 y=253 width=12 height=10 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1103 x=30 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1105 x=42 y=219 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1106 x=85 y=19 width=11 height=17 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1107 x=142 y=127 width=7 height=14 xoffset=0 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1108 x=39 y=253 width=9 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1109 x=48 y=253 width=8 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1110 x=52 y=219 width=5 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1111 x=57 y=219 width=8 height=13 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1112 x=96 y=19 width=6 height=17 xoffset=-2 yoffset=0 xadvance=4 page=0 chnl=0 +char id=1113 x=0 y=232 width=14 height=11 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=1114 x=56 y=253 width=13 height=10 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 +char id=1115 x=149 y=127 width=11 height=14 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1116 x=160 y=127 width=9 height=14 xoffset=0 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1118 x=90 y=0 width=10 height=18 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1119 x=65 y=219 width=9 height=13 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1168 x=101 y=84 width=9 height=15 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=1169 x=169 y=219 width=7 height=12 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=0 +char id=1241 x=69 y=253 width=12 height=10 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8211 x=111 y=263 width=10 height=3 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=8212 x=121 y=263 width=18 height=3 xoffset=-1 yoffset=6 xadvance=16 page=0 chnl=0 +char id=8216 x=179 y=253 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8217 x=184 y=253 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8218 x=241 y=253 width=5 height=6 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=8220 x=189 y=253 width=8 height=7 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8221 x=197 y=253 width=8 height=7 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8222 x=246 y=253 width=8 height=6 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=8224 x=169 y=127 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8225 x=179 y=127 width=10 height=14 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8226 x=0 y=263 width=6 height=6 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=8230 x=52 y=263 width=16 height=5 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 +char id=8240 x=189 y=127 width=21 height=14 xoffset=-1 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=8249 x=136 y=253 width=6 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8250 x=142 y=253 width=6 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=8260 x=74 y=219 width=14 height=13 xoffset=-4 yoffset=0 xadvance=2 page=0 chnl=0 +char id=8363 x=176 y=219 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=8364 x=88 y=219 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +kernings count=4316 +kerning first=362 second=913 amount=-1 +kerning first=8216 second=281 amount=-1 +kerning first=221 second=285 amount=-1 +kerning first=39 second=961 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=1090 second=8212 amount=-1 +kerning first=34 second=74 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=8218 second=376 amount=-2 +kerning first=86 second=248 amount=-1 +kerning first=8221 second=301 amount=-1 +kerning first=362 second=258 amount=-1 +kerning first=358 second=335 amount=-1 +kerning first=957 second=46 amount=-1 +kerning first=257 second=84 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=1058 second=1035 amount=1 +kerning first=910 second=965 amount=-1 +kerning first=8220 second=229 amount=-1 +kerning first=8216 second=937 amount=-1 +kerning first=1168 second=1040 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=208 second=8230 amount=-1 +kerning first=932 second=940 amount=-1 +kerning first=354 second=93 amount=1 +kerning first=229 second=932 amount=-1 +kerning first=939 second=959 amount=-1 +kerning first=321 second=173 amount=-1 +kerning first=932 second=244 amount=-1 +kerning first=220 second=198 amount=-1 +kerning first=915 second=71 amount=-1 +kerning first=929 second=923 amount=-1 +kerning first=221 second=308 amount=-1 +kerning first=86 second=279 amount=-1 +kerning first=358 second=227 amount=-1 +kerning first=192 second=39 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=87 second=358 amount=1 +kerning first=196 second=221 amount=-1 +kerning first=279 second=932 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=947 second=44 amount=-1 +kerning first=87 second=267 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=315 second=262 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=1027 second=187 amount=-1 +kerning first=931 second=264 amount=-1 +kerning first=91 second=1058 amount=1 +kerning first=8218 second=358 amount=-1 +kerning first=1098 second=1091 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=915 second=941 amount=-1 +kerning first=939 second=181 amount=-1 +kerning first=1043 second=44 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=334 second=44 amount=-1 +kerning first=1043 second=1032 amount=-1 +kerning first=219 second=195 amount=-1 +kerning first=932 second=260 amount=-1 +kerning first=89 second=173 amount=-1 +kerning first=8216 second=940 amount=-1 +kerning first=1168 second=1074 amount=-1 +kerning first=354 second=285 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=65 second=34 amount=-1 +kerning first=227 second=8221 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=1059 second=1066 amount=1 +kerning first=84 second=973 amount=-1 +kerning first=931 second=8211 amount=-1 +kerning first=220 second=194 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=109 second=356 amount=-1 +kerning first=230 second=354 amount=-1 +kerning first=933 second=45 amount=-1 +kerning first=160 second=86 amount=-1 +kerning first=1066 second=1059 amount=-1 +kerning first=902 second=39 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=319 second=8220 amount=-2 +kerning first=932 second=8249 amount=-1 +kerning first=358 second=287 amount=-1 +kerning first=8220 second=937 amount=-1 +kerning first=372 second=263 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=8221 second=111 amount=-1 +kerning first=915 second=916 amount=-2 +kerning first=317 second=89 amount=-1 +kerning first=46 second=8220 amount=-2 +kerning first=315 second=376 amount=-1 +kerning first=39 second=74 amount=-1 +kerning first=923 second=356 amount=-1 +kerning first=91 second=372 amount=1 +kerning first=910 second=210 amount=-1 +kerning first=45 second=376 amount=-1 +kerning first=927 second=44 amount=-1 +kerning first=227 second=354 amount=-1 +kerning first=354 second=308 amount=-1 +kerning first=315 second=332 amount=-1 +kerning first=8204 second=354 amount=-1 +kerning first=171 second=933 amount=-1 +kerning first=932 second=948 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=319 second=219 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=8216 second=260 amount=-1 +kerning first=1100 second=8217 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=376 second=913 amount=-1 +kerning first=1033 second=1026 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=8212 second=1035 amount=-1 +kerning first=1059 second=173 amount=-1 +kerning first=372 second=192 amount=-1 +kerning first=275 second=354 amount=-1 +kerning first=40 second=221 amount=1 +kerning first=109 second=8217 amount=-1 +kerning first=912 second=958 amount=1 +kerning first=225 second=356 amount=-1 +kerning first=1168 second=1109 amount=-1 +kerning first=319 second=81 amount=-1 +kerning first=354 second=369 amount=-1 +kerning first=376 second=258 amount=-1 +kerning first=317 second=34 amount=-2 +kerning first=356 second=973 amount=-1 +kerning first=102 second=39 amount=1 +kerning first=915 second=8250 amount=-1 +kerning first=40 second=84 amount=1 +kerning first=44 second=34 amount=-2 +kerning first=923 second=8217 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=362 second=196 amount=-1 +kerning first=86 second=913 amount=-1 +kerning first=1038 second=1066 amount=1 +kerning first=933 second=79 amount=-1 +kerning first=1027 second=1169 amount=-1 +kerning first=80 second=916 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=354 second=942 amount=-1 +kerning first=358 second=365 amount=-1 +kerning first=8220 second=940 amount=-1 +kerning first=258 second=8216 amount=-1 +kerning first=916 second=39 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=915 second=949 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=315 second=358 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=910 second=971 amount=-1 +kerning first=101 second=84 amount=-1 +kerning first=246 second=358 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=8216 second=948 amount=-1 +kerning first=160 second=932 amount=-1 +kerning first=45 second=358 amount=-1 +kerning first=933 second=8212 amount=-1 +kerning first=910 second=173 amount=-1 +kerning first=225 second=8217 amount=-1 +kerning first=8217 second=331 amount=-1 +kerning first=915 second=336 amount=-1 +kerning first=173 second=1058 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=84 second=954 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=939 second=943 amount=-1 +kerning first=971 second=39 amount=-1 +kerning first=358 second=941 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=358 second=246 amount=-1 +kerning first=372 second=234 amount=-1 +kerning first=81 second=46 amount=-1 +kerning first=932 second=269 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=933 second=912 amount=-1 +kerning first=1066 second=1038 amount=-1 +kerning first=1038 second=173 amount=-1 +kerning first=932 second=117 amount=-1 +kerning first=372 second=354 amount=1 +kerning first=89 second=339 amount=-1 +kerning first=315 second=199 amount=-1 +kerning first=358 second=105 amount=-1 +kerning first=87 second=301 amount=1 +kerning first=111 second=932 amount=-1 +kerning first=360 second=256 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=915 second=338 amount=-1 +kerning first=944 second=34 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=315 second=288 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=364 second=913 amount=-1 +kerning first=8220 second=260 amount=-1 +kerning first=343 second=8230 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=932 second=197 amount=-1 +kerning first=358 second=916 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=8221 second=339 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=364 second=258 amount=-1 +kerning first=1168 second=1087 amount=-1 +kerning first=939 second=268 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=933 second=193 amount=-2 +kerning first=221 second=358 amount=1 +kerning first=1113 second=1090 amount=-1 +kerning first=356 second=954 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=195 second=376 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=8221 second=312 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=228 second=932 amount=-1 +kerning first=8217 second=349 amount=-1 +kerning first=218 second=198 amount=-1 +kerning first=933 second=58 amount=-1 +kerning first=955 second=39 amount=-1 +kerning first=932 second=341 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=8221 second=275 amount=-1 +kerning first=324 second=8221 amount=-1 +kerning first=194 second=39 amount=-1 +kerning first=932 second=187 amount=-1 +kerning first=8220 second=948 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=112 second=8221 amount=-1 +kerning first=358 second=8250 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=277 second=932 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=915 second=195 amount=-2 +kerning first=315 second=362 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=8216 second=197 amount=-1 +kerning first=1046 second=1033 amount=1 +kerning first=345 second=46 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=8217 second=236 amount=-1 +kerning first=932 second=963 amount=-1 +kerning first=915 second=290 amount=-1 +kerning first=313 second=262 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=939 second=951 amount=-1 +kerning first=932 second=235 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=197 second=34 amount=-1 +kerning first=102 second=59 amount=1 +kerning first=358 second=949 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=321 second=372 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=319 second=356 amount=-1 +kerning first=324 second=354 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=376 second=196 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=242 second=356 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=187 second=932 amount=-1 +kerning first=112 second=354 amount=-1 +kerning first=76 second=8212 amount=-1 +kerning first=929 second=260 amount=-1 +kerning first=936 second=46 amount=-1 +kerning first=1034 second=1035 amount=-1 +kerning first=358 second=84 amount=1 +kerning first=915 second=8230 amount=-2 +kerning first=195 second=358 amount=-1 +kerning first=224 second=8221 amount=-1 +kerning first=87 second=111 amount=-1 +kerning first=1057 second=1066 amount=1 +kerning first=218 second=194 amount=-1 +kerning first=308 second=93 amount=1 +kerning first=86 second=196 amount=-1 +kerning first=123 second=1026 amount=1 +kerning first=356 second=279 amount=-1 +kerning first=931 second=45 amount=-1 +kerning first=358 second=378 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=317 second=8220 amount=-2 +kerning first=354 second=358 amount=1 +kerning first=89 second=243 amount=-1 +kerning first=934 second=88 amount=-1 +kerning first=8217 second=46 amount=-2 +kerning first=8216 second=963 amount=-1 +kerning first=1168 second=1066 amount=1 +kerning first=44 second=8220 amount=-2 +kerning first=313 second=376 amount=-1 +kerning first=319 second=8217 amount=-2 +kerning first=354 second=267 amount=-1 +kerning first=932 second=41 amount=1 +kerning first=8216 second=235 amount=-1 +kerning first=242 second=8217 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=46 second=8217 amount=-2 +kerning first=354 second=119 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=224 second=354 amount=-1 +kerning first=8212 second=356 amount=-1 +kerning first=84 second=969 amount=-1 +kerning first=313 second=332 amount=-1 +kerning first=1059 second=1058 amount=1 +kerning first=1091 second=46 amount=-1 +kerning first=102 second=93 amount=2 +kerning first=216 second=44 amount=-1 +kerning first=84 second=241 amount=-1 +kerning first=8217 second=297 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=8221 second=243 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=86 second=333 amount=-1 +kerning first=8216 second=8216 amount=-1 +kerning first=1043 second=1115 amount=1 +kerning first=1098 second=8217 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=217 second=913 amount=-1 +kerning first=321 second=171 amount=-1 +kerning first=8230 second=8221 amount=-2 +kerning first=366 second=65 amount=-1 +kerning first=360 second=192 amount=-1 +kerning first=358 second=265 amount=-1 +kerning first=283 second=354 amount=-1 +kerning first=80 second=8230 amount=-2 +kerning first=376 second=356 amount=1 +kerning first=8221 second=103 amount=-1 +kerning first=317 second=81 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=315 second=210 amount=-1 +kerning first=358 second=118 amount=-1 +kerning first=8220 second=197 amount=-1 +kerning first=91 second=354 amount=1 +kerning first=45 second=910 amount=-1 +kerning first=217 second=258 amount=-1 +kerning first=923 second=86 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=86 second=233 amount=-1 +kerning first=364 second=196 amount=-1 +kerning first=84 second=913 amount=-1 +kerning first=1168 second=173 amount=-1 +kerning first=931 second=79 amount=-1 +kerning first=8204 second=87 amount=-1 +kerning first=1035 second=1066 amount=-1 +kerning first=936 second=198 amount=-1 +kerning first=86 second=356 amount=1 +kerning first=1058 second=1096 amount=-1 +kerning first=358 second=195 amount=-1 +kerning first=1043 second=1059 amount=1 +kerning first=45 second=1066 amount=-1 +kerning first=271 second=311 amount=1 +kerning first=912 second=950 amount=1 +kerning first=1168 second=1100 amount=-1 +kerning first=84 second=258 amount=-1 +kerning first=87 second=224 amount=-1 +kerning first=313 second=358 amount=-1 +kerning first=8221 second=256 amount=-1 +kerning first=213 second=46 amount=-1 +kerning first=354 second=343 amount=-1 +kerning first=243 second=358 amount=-1 +kerning first=913 second=221 amount=-1 +kerning first=939 second=65 amount=-2 +kerning first=89 second=171 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=931 second=8212 amount=-1 +kerning first=356 second=969 amount=-1 +kerning first=84 second=307 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=1038 second=1058 amount=1 +kerning first=933 second=71 amount=-1 +kerning first=913 second=84 amount=-1 +kerning first=932 second=367 amount=-1 +kerning first=8217 second=198 amount=-1 +kerning first=260 second=39 amount=-1 +kerning first=354 second=965 amount=-1 +kerning first=79 second=46 amount=-1 +kerning first=358 second=345 amount=-1 +kerning first=8220 second=963 amount=-1 +kerning first=931 second=912 amount=1 +kerning first=104 second=358 amount=-1 +kerning first=256 second=221 amount=-1 +kerning first=376 second=291 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=358 second=8230 amount=-1 +kerning first=910 second=962 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=315 second=173 amount=-1 +kerning first=915 second=214 amount=-1 +kerning first=87 second=339 amount=-1 +kerning first=313 second=199 amount=-1 +kerning first=109 second=932 amount=-1 +kerning first=370 second=256 amount=-1 +kerning first=974 second=34 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=123 second=106 amount=1 +kerning first=932 second=972 amount=-1 +kerning first=256 second=84 amount=-1 +kerning first=123 second=1095 amount=-1 +kerning first=8220 second=8216 amount=-1 +kerning first=313 second=288 amount=-1 +kerning first=356 second=913 amount=-1 +kerning first=932 second=250 amount=-1 +kerning first=84 second=946 amount=-1 +kerning first=939 second=966 amount=-1 +kerning first=936 second=194 amount=-1 +kerning first=341 second=8230 amount=-1 +kerning first=8222 second=86 amount=-1 +kerning first=358 second=232 amount=-1 +kerning first=923 second=932 amount=-1 +kerning first=929 second=197 amount=-1 +kerning first=372 second=225 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=329 second=356 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=933 second=941 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=356 second=258 amount=-1 +kerning first=932 second=109 amount=-1 +kerning first=926 second=970 amount=1 +kerning first=358 second=97 amount=-1 +kerning first=87 second=275 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=356 second=307 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=321 second=927 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=192 second=376 amount=-1 +kerning first=8217 second=194 amount=-1 +kerning first=8211 second=1026 amount=-1 +kerning first=225 second=932 amount=-1 +kerning first=910 second=256 amount=-2 +kerning first=376 second=363 amount=-1 +kerning first=261 second=358 amount=-1 +kerning first=915 second=973 amount=-1 +kerning first=321 second=286 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=319 second=268 amount=-1 +kerning first=1043 second=1038 amount=1 +kerning first=173 second=354 amount=-1 +kerning first=933 second=916 amount=-2 +kerning first=8216 second=972 amount=-1 +kerning first=1168 second=1079 amount=-1 +kerning first=110 second=8221 amount=-1 +kerning first=354 second=301 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=329 second=8217 amount=-1 +kerning first=34 second=193 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=221 second=173 amount=-1 +kerning first=939 second=44 amount=-2 +kerning first=313 second=362 amount=-1 +kerning first=356 second=946 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=1043 second=8249 amount=-1 +kerning first=1090 second=8230 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=196 second=34 amount=-1 +kerning first=372 second=273 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=932 second=324 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=321 second=8221 amount=-2 +kerning first=8221 second=263 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=89 second=927 amount=-1 +kerning first=217 second=196 amount=-1 +kerning first=372 second=277 amount=-1 +kerning first=123 second=376 amount=1 +kerning first=244 second=356 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=8222 second=932 amount=-1 +kerning first=110 second=354 amount=-1 +kerning first=934 second=46 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=933 second=8250 amount=-1 +kerning first=192 second=358 amount=-1 +kerning first=902 second=376 amount=-1 +kerning first=226 second=8221 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=86 second=245 amount=-1 +kerning first=932 second=953 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=932 second=226 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=8221 second=192 amount=-1 +kerning first=939 second=213 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=1027 second=46 amount=-1 +kerning first=333 second=84 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=933 second=949 amount=-1 +kerning first=1168 second=1114 amount=-1 +kerning first=87 second=243 amount=-1 +kerning first=319 second=86 amount=-1 +kerning first=271 second=8221 amount=1 +kerning first=331 second=358 amount=-1 +kerning first=70 second=371 amount=-1 +kerning first=1034 second=8217 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=317 second=8217 amount=-2 +kerning first=1059 second=1106 amount=1 +kerning first=210 second=8230 amount=-1 +kerning first=244 second=8217 amount=-1 +kerning first=933 second=336 amount=-1 +kerning first=40 second=89 amount=1 +kerning first=44 second=8217 amount=-2 +kerning first=226 second=354 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=1057 second=1058 amount=1 +kerning first=84 second=333 amount=-1 +kerning first=339 second=84 amount=-1 +kerning first=354 second=971 amount=-1 +kerning first=358 second=361 amount=-1 +kerning first=8220 second=972 amount=-1 +kerning first=219 second=913 amount=-1 +kerning first=123 second=358 amount=1 +kerning first=356 second=115 amount=-1 +kerning first=8221 second=8221 amount=-1 +kerning first=8218 second=372 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=362 second=65 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=370 second=192 amount=-1 +kerning first=915 second=954 amount=-1 +kerning first=1058 second=1054 amount=-1 +kerning first=354 second=173 amount=-1 +kerning first=1168 second=1058 amount=1 +kerning first=313 second=210 amount=-1 +kerning first=89 second=354 amount=1 +kerning first=366 second=923 amount=-1 +kerning first=8216 second=226 amount=-1 +kerning first=219 second=258 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=902 second=358 amount=-1 +kerning first=933 second=338 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=235 second=84 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=84 second=959 amount=-1 +kerning first=932 second=331 amount=-1 +kerning first=358 second=973 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=8217 second=285 amount=-1 +kerning first=8221 second=234 amount=-1 +kerning first=356 second=196 amount=-1 +kerning first=1033 second=1066 amount=-1 +kerning first=39 second=193 amount=-1 +kerning first=358 second=251 amount=-1 +kerning first=923 second=939 amount=-2 +kerning first=1043 second=1107 amount=-1 +kerning first=372 second=239 amount=1 +kerning first=932 second=283 amount=-1 +kerning first=84 second=356 amount=1 +kerning first=8221 second=354 amount=1 +kerning first=932 second=122 amount=-1 +kerning first=291 second=84 amount=-1 +kerning first=214 second=46 amount=-1 +kerning first=358 second=110 amount=-1 +kerning first=910 second=927 amount=-1 +kerning first=97 second=84 amount=-1 +kerning first=372 second=100 amount=-1 +kerning first=952 second=8230 amount=-1 +kerning first=910 second=192 amount=-2 +kerning first=91 second=87 amount=1 +kerning first=1038 second=1106 amount=1 +kerning first=319 second=932 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=932 second=934 amount=-1 +kerning first=242 second=932 amount=-1 +kerning first=321 second=211 amount=-1 +kerning first=910 second=286 amount=-1 +kerning first=1035 second=1058 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=931 second=71 amount=-1 +kerning first=939 second=923 amount=-2 +kerning first=258 second=39 amount=-1 +kerning first=84 second=181 amount=-1 +kerning first=8217 second=308 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=45 second=1058 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=1168 second=1092 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=933 second=195 amount=-2 +kerning first=313 second=173 amount=-1 +kerning first=1113 second=1095 amount=-1 +kerning first=84 second=8217 amount=1 +kerning first=197 second=356 amount=-1 +kerning first=1059 second=1084 amount=-1 +kerning first=368 second=256 amount=-1 +kerning first=356 second=959 amount=-1 +kerning first=973 second=34 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=916 second=358 amount=-1 +kerning first=933 second=290 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=1043 second=187 amount=-1 +kerning first=932 second=349 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=86 second=230 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=356 second=356 amount=1 +kerning first=8221 second=289 amount=-1 +kerning first=118 second=8230 amount=-1 +kerning first=358 second=328 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=8211 second=376 amount=-1 +kerning first=295 second=356 amount=-1 +kerning first=1058 second=44 amount=-1 +kerning first=376 second=271 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=8212 second=932 amount=-1 +kerning first=1058 second=1032 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=910 second=961 amount=-1 +kerning first=8220 second=226 amount=-1 +kerning first=76 second=336 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=315 second=372 amount=-1 +kerning first=933 second=8230 amount=-2 +kerning first=245 second=8221 amount=-1 +kerning first=932 second=968 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=171 second=221 amount=-1 +kerning first=932 second=236 amount=-1 +kerning first=194 second=376 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=358 second=954 amount=-1 +kerning first=1169 second=44 amount=-1 +kerning first=376 second=932 amount=1 +kerning first=356 second=181 amount=-1 +kerning first=86 second=271 amount=-1 +kerning first=1027 second=59 amount=-1 +kerning first=358 second=228 amount=-1 +kerning first=319 second=370 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=1168 second=171 amount=-1 +kerning first=34 second=941 amount=-1 +kerning first=259 second=358 amount=-1 +kerning first=272 second=46 amount=-1 +kerning first=171 second=84 amount=-1 +kerning first=317 second=268 amount=-1 +kerning first=932 second=101 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=76 second=338 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=356 second=8217 amount=1 +kerning first=354 second=339 amount=-1 +kerning first=8221 second=74 amount=-1 +kerning first=87 second=263 amount=-1 +kerning first=295 second=8217 amount=-1 +kerning first=376 second=65 amount=-1 +kerning first=8216 second=349 amount=-1 +kerning first=908 second=44 amount=-1 +kerning first=245 second=354 amount=-1 +kerning first=1038 second=1084 amount=-1 +kerning first=86 second=932 amount=1 +kerning first=8230 second=933 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=193 second=34 amount=-1 +kerning first=8211 second=358 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=354 second=312 amount=-1 +kerning first=321 second=264 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=358 second=248 amount=-1 +kerning first=219 second=196 amount=-1 +kerning first=241 second=356 amount=-1 +kerning first=34 second=916 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=271 second=108 amount=1 +kerning first=354 second=275 amount=-1 +kerning first=932 second=46 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=195 second=936 amount=-1 +kerning first=315 second=171 amount=-1 +kerning first=84 second=943 amount=-1 +kerning first=194 second=358 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=8221 second=353 amount=-1 +kerning first=40 second=1035 amount=1 +kerning first=8216 second=101 amount=-1 +kerning first=1043 second=1169 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=932 second=297 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=321 second=8211 amount=-1 +kerning first=103 second=356 amount=-1 +kerning first=335 second=84 amount=-1 +kerning first=358 second=279 amount=-1 +kerning first=372 second=257 amount=-1 +kerning first=915 second=913 amount=-2 +kerning first=317 second=86 amount=-1 +kerning first=40 second=309 amount=1 +kerning first=315 second=220 amount=-1 +kerning first=372 second=113 amount=-1 +kerning first=376 second=99 amount=-1 +kerning first=76 second=290 amount=-1 +kerning first=910 second=211 amount=-1 +kerning first=212 second=8230 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=241 second=8217 amount=-1 +kerning first=931 second=336 amount=-1 +kerning first=932 second=945 amount=-1 +kerning first=329 second=932 amount=-1 +kerning first=915 second=258 amount=-2 +kerning first=1168 second=1241 amount=-1 +kerning first=123 second=1066 amount=1 +kerning first=319 second=213 amount=-1 +kerning first=65 second=932 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=46 second=939 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=8216 second=46 amount=-2 +kerning first=372 second=193 amount=-1 +kerning first=1027 second=1026 amount=1 +kerning first=34 second=949 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=86 second=99 amount=-1 +kerning first=912 second=955 amount=1 +kerning first=364 second=65 amount=-1 +kerning first=87 second=234 amount=-1 +kerning first=368 second=192 amount=-1 +kerning first=1168 second=1106 amount=1 +kerning first=933 second=214 amount=-1 +kerning first=8220 second=349 amount=-1 +kerning first=89 second=8211 amount=-1 +kerning first=87 second=354 amount=1 +kerning first=931 second=338 amount=-1 +kerning first=356 second=943 amount=-1 +kerning first=362 second=923 amount=-1 +kerning first=376 second=44 amount=-2 +kerning first=39 second=941 amount=-1 +kerning first=233 second=84 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=85 second=256 amount=-1 +kerning first=913 second=89 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=195 second=372 amount=-1 +kerning first=173 second=933 amount=-1 +kerning first=80 second=913 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=257 second=356 amount=-1 +kerning first=932 second=198 amount=-1 +kerning first=354 second=962 amount=-1 +kerning first=372 second=335 amount=-1 +kerning first=915 second=946 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=8212 second=939 amount=-1 +kerning first=910 second=970 amount=-1 +kerning first=287 second=84 amount=-1 +kerning first=76 second=368 amount=-1 +kerning first=8216 second=945 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=211 second=46 amount=-1 +kerning first=354 second=372 amount=1 +kerning first=932 second=944 amount=-1 +kerning first=256 second=89 amount=-1 +kerning first=8217 second=358 amount=1 +kerning first=260 second=376 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=84 second=951 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=939 second=940 amount=-1 +kerning first=317 second=932 amount=-1 +kerning first=932 second=255 amount=-1 +kerning first=39 second=916 amount=-1 +kerning first=915 second=81 amount=-1 +kerning first=358 second=969 amount=-1 +kerning first=244 second=932 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1033 second=1058 amount=-1 +kerning first=358 second=241 amount=-1 +kerning first=913 second=34 amount=-1 +kerning first=366 second=260 amount=-1 +kerning first=932 second=261 amount=-1 +kerning first=372 second=227 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=933 second=973 amount=-1 +kerning first=293 second=358 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=922 second=74 amount=1 +kerning first=357 second=8221 amount=1 +kerning first=932 second=114 amount=-1 +kerning first=315 second=927 amount=-1 +kerning first=926 second=912 amount=1 +kerning first=8204 second=902 amount=-1 +kerning first=257 second=8217 amount=-1 +kerning first=84 second=86 amount=1 +kerning first=1059 second=8211 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=354 second=256 amount=-1 +kerning first=373 second=46 amount=-1 +kerning first=315 second=286 amount=-1 +kerning first=8216 second=198 amount=-1 +kerning first=931 second=290 amount=-1 +kerning first=256 second=34 amount=-1 +kerning first=910 second=264 amount=-1 +kerning first=8220 second=46 amount=-2 +kerning first=932 second=194 amount=-1 +kerning first=358 second=913 amount=-1 +kerning first=1068 second=1026 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=8221 second=305 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=1056 second=44 amount=-2 +kerning first=1168 second=1084 amount=-1 +kerning first=1056 second=1032 amount=-1 +kerning first=939 second=260 amount=-2 +kerning first=922 second=970 amount=1 +kerning first=89 second=277 amount=-1 +kerning first=358 second=258 amount=-1 +kerning first=34 second=195 amount=-1 +kerning first=260 second=358 amount=-1 +kerning first=8221 second=8204 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=315 second=8221 amount=-2 +kerning first=1059 second=1076 amount=-1 +kerning first=313 second=372 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=356 second=951 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=246 second=8221 amount=-1 +kerning first=39 second=949 amount=-1 +kerning first=8216 second=261 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=910 second=8211 amount=-1 +kerning first=8217 second=343 amount=-1 +kerning first=8221 second=273 amount=-1 +kerning first=358 second=307 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=160 second=8216 amount=-1 +kerning first=932 second=337 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=8216 second=1103 amount=-1 +kerning first=8211 second=910 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=8221 second=277 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=332 second=46 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=8220 second=945 amount=-1 +kerning first=84 second=120 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=356 second=86 amount=1 +kerning first=915 second=196 amount=-2 +kerning first=1038 second=8211 amount=-1 +kerning first=221 second=927 amount=-1 +kerning first=1168 second=1028 amount=-1 +kerning first=8218 second=1063 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=217 second=65 amount=-1 +kerning first=34 second=8230 amount=-2 +kerning first=8216 second=194 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=8217 second=237 amount=-1 +kerning first=246 second=354 amount=-1 +kerning first=1107 second=46 amount=-1 +kerning first=8211 second=1066 amount=-1 +kerning first=84 second=932 amount=1 +kerning first=45 second=354 amount=-1 +kerning first=65 second=939 amount=-2 +kerning first=939 second=948 amount=-1 +kerning first=932 second=231 amount=-1 +kerning first=1040 second=1033 amount=1 +kerning first=358 second=946 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=376 second=923 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=86 second=259 amount=-1 +kerning first=1058 second=1115 amount=1 +kerning first=1114 second=8217 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=933 second=954 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=939 second=334 amount=-1 +kerning first=932 second=93 amount=1 +kerning first=89 second=351 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=85 second=192 amount=-1 +kerning first=40 second=356 amount=1 +kerning first=929 second=46 amount=-2 +kerning first=8220 second=198 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=1028 second=1035 amount=1 +kerning first=192 second=936 amount=-1 +kerning first=313 second=171 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=86 second=923 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=8221 second=351 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=101 second=356 amount=-1 +kerning first=197 second=932 amount=-1 +kerning first=356 second=120 amount=-1 +kerning first=915 second=959 amount=-1 +kerning first=89 second=239 amount=1 +kerning first=939 second=216 amount=-1 +kerning first=1058 second=1059 amount=1 +kerning first=321 second=45 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=8220 second=261 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=84 second=966 amount=-1 +kerning first=356 second=932 amount=1 +kerning first=366 second=197 amount=-1 +kerning first=8220 second=1103 amount=-1 +kerning first=295 second=932 amount=-1 +kerning first=221 second=354 amount=1 +kerning first=84 second=238 amount=-1 +kerning first=8217 second=301 amount=-1 +kerning first=8221 second=239 amount=-1 +kerning first=317 second=213 amount=-1 +kerning first=39 second=195 amount=-1 +kerning first=358 second=382 amount=-1 +kerning first=44 second=939 amount=-1 +kerning first=372 second=246 amount=-1 +kerning first=932 second=285 amount=-1 +kerning first=220 second=256 amount=-1 +kerning first=376 second=229 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=230 second=84 amount=-1 +kerning first=360 second=193 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=8221 second=100 amount=-1 +kerning first=356 second=65 amount=-1 +kerning first=354 second=192 amount=-1 +kerning first=315 second=211 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=358 second=115 amount=-1 +kerning first=8220 second=194 amount=-1 +kerning first=931 second=214 amount=-1 +kerning first=8204 second=221 amount=-1 +kerning first=915 second=181 amount=-1 +kerning first=902 second=936 amount=-1 +kerning first=364 second=923 amount=-1 +kerning first=913 second=8220 amount=-1 +kerning first=227 second=84 amount=-1 +kerning first=86 second=229 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=123 second=1058 amount=1 +kerning first=1035 second=1063 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=8204 second=84 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=192 second=372 amount=-1 +kerning first=939 second=197 amount=-2 +kerning first=1058 second=1093 amount=-1 +kerning first=39 second=8230 amount=-2 +kerning first=929 second=198 amount=-1 +kerning first=358 second=196 amount=-1 +kerning first=1075 second=44 amount=-1 +kerning first=932 second=308 amount=-1 +kerning first=8216 second=1026 amount=1 +kerning first=321 second=79 amount=-1 +kerning first=1168 second=1097 amount=-1 +kerning first=87 second=225 amount=-1 +kerning first=939 second=284 amount=-1 +kerning first=275 second=84 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=354 second=8221 amount=1 +kerning first=1059 second=1089 amount=-1 +kerning first=232 second=358 amount=-1 +kerning first=356 second=966 amount=-1 +kerning first=8216 second=285 amount=-1 +kerning first=258 second=376 amount=-1 +kerning first=221 second=289 amount=-1 +kerning first=356 second=238 amount=-1 +kerning first=932 second=369 amount=-1 +kerning first=241 second=932 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=321 second=8212 amount=-1 +kerning first=1027 second=1109 amount=-1 +kerning first=84 second=299 amount=-1 +kerning first=8221 second=303 amount=-1 +kerning first=1041 second=1098 amount=-1 +kerning first=362 second=260 amount=-1 +kerning first=358 second=333 amount=-1 +kerning first=354 second=961 amount=-1 +kerning first=289 second=358 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=939 second=187 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=1058 second=1038 amount=1 +kerning first=70 second=227 amount=-1 +kerning first=313 second=927 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=336 second=8230 amount=-1 +kerning first=98 second=358 amount=-1 +kerning first=376 second=125 amount=1 +kerning first=8218 second=87 amount=-1 +kerning first=123 second=372 amount=1 +kerning first=253 second=8230 amount=-1 +kerning first=354 second=354 amount=1 +kerning first=76 second=89 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=932 second=942 amount=-1 +kerning first=1059 second=45 amount=-1 +kerning first=916 second=936 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=103 second=932 amount=-1 +kerning first=313 second=286 amount=-1 +kerning first=939 second=963 amount=-1 +kerning first=932 second=242 amount=-1 +kerning first=358 second=959 amount=-1 +kerning first=8216 second=308 amount=-1 +kerning first=1058 second=8249 amount=-1 +kerning first=902 second=372 amount=-1 +kerning first=86 second=281 amount=-1 +kerning first=8212 second=1059 amount=-1 +kerning first=358 second=233 amount=-1 +kerning first=929 second=194 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=1168 second=8211 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=1066 second=1026 amount=-1 +kerning first=86 second=125 amount=1 +kerning first=87 second=273 amount=-1 +kerning first=114 second=8230 amount=-1 +kerning first=171 second=89 amount=-1 +kerning first=8249 second=376 amount=-1 +kerning first=358 second=356 amount=1 +kerning first=356 second=44 amount=-1 +kerning first=89 second=8212 amount=-1 +kerning first=947 second=46 amount=-1 +kerning first=87 second=277 amount=-1 +kerning first=372 second=84 amount=1 +kerning first=1033 second=8221 amount=-1 +kerning first=258 second=358 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=313 second=8221 amount=-2 +kerning first=1038 second=1089 amount=-1 +kerning first=315 second=264 amount=-1 +kerning first=76 second=34 amount=-2 +kerning first=196 second=86 amount=-1 +kerning first=243 second=8221 amount=-1 +kerning first=84 second=373 amount=-1 +kerning first=356 second=299 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=8220 second=1026 amount=1 +kerning first=197 second=939 amount=-2 +kerning first=915 second=943 amount=-1 +kerning first=910 second=45 amount=-1 +kerning first=1043 second=46 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=358 second=181 amount=-1 +kerning first=334 second=46 amount=-1 +kerning first=933 second=913 amount=-2 +kerning first=1168 second=1076 amount=-2 +kerning first=354 second=289 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=8220 second=285 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=104 second=8221 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=315 second=8211 amount=-1 +kerning first=358 second=8217 amount=1 +kerning first=257 second=932 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=219 second=65 amount=-1 +kerning first=84 second=974 amount=-1 +kerning first=220 second=192 amount=-1 +kerning first=933 second=258 amount=-2 +kerning first=243 second=354 amount=-1 +kerning first=1038 second=45 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=1062 second=1112 amount=1 +kerning first=208 second=44 amount=-1 +kerning first=75 second=308 amount=1 +kerning first=376 second=244 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=217 second=923 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=319 second=8249 amount=-1 +kerning first=8249 second=358 amount=-1 +kerning first=358 second=291 amount=-1 +kerning first=372 second=265 amount=-1 +kerning first=1059 second=8212 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=8221 second=113 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=923 second=8216 amount=-1 +kerning first=104 second=354 amount=-1 +kerning first=927 second=46 amount=-1 +kerning first=1061 second=1060 amount=-1 +kerning first=8220 second=308 amount=-1 +kerning first=1026 second=1035 amount=-1 +kerning first=194 second=936 amount=-1 +kerning first=915 second=268 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=86 second=244 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=84 second=923 amount=-1 +kerning first=319 second=217 amount=-1 +kerning first=356 second=373 amount=-1 +kerning first=89 second=58 amount=-1 +kerning first=8211 second=1058 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=8221 second=193 amount=-1 +kerning first=910 second=79 amount=-1 +kerning first=939 second=212 amount=-1 +kerning first=8212 second=1038 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=319 second=334 amount=-1 +kerning first=372 second=195 amount=-1 +kerning first=196 second=932 amount=-1 +kerning first=933 second=946 amount=-1 +kerning first=8216 second=1040 amount=-1 +kerning first=1168 second=1111 amount=-1 +kerning first=87 second=239 amount=1 +kerning first=324 second=84 amount=-1 +kerning first=354 second=371 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=70 second=365 amount=-1 +kerning first=376 second=260 amount=-1 +kerning first=261 second=8221 amount=-1 +kerning first=112 second=84 amount=-1 +kerning first=356 second=974 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=913 second=356 amount=-1 +kerning first=87 second=100 amount=-1 +kerning first=910 second=8212 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=362 second=197 amount=-1 +kerning first=933 second=81 amount=-1 +kerning first=221 second=8211 amount=-1 +kerning first=932 second=380 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=319 second=216 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=8221 second=335 amount=-1 +kerning first=354 second=970 amount=-1 +kerning first=358 second=363 amount=-1 +kerning first=337 second=358 amount=-1 +kerning first=218 second=256 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=915 second=951 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=910 second=912 amount=-1 +kerning first=370 second=193 amount=-1 +kerning first=372 second=8230 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=376 second=8249 amount=-1 +kerning first=1038 second=8212 amount=-1 +kerning first=256 second=356 amount=-1 +kerning first=313 second=211 amount=-1 +kerning first=261 second=354 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=1059 second=58 amount=-1 +kerning first=8217 second=312 amount=-1 +kerning first=356 second=923 amount=-1 +kerning first=939 second=972 amount=-1 +kerning first=932 second=358 amount=1 +kerning first=358 second=943 amount=-1 +kerning first=1058 second=187 amount=-1 +kerning first=224 second=84 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=1033 second=1063 amount=-1 +kerning first=358 second=245 amount=-1 +kerning first=248 second=358 amount=-1 +kerning first=913 second=8217 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=932 second=267 amount=-1 +kerning first=194 second=372 amount=-1 +kerning first=372 second=232 amount=-1 +kerning first=1027 second=1066 amount=1 +kerning first=1043 second=1103 amount=-1 +kerning first=91 second=221 amount=1 +kerning first=932 second=119 amount=-1 +kerning first=929 second=308 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=1034 second=1059 amount=-1 +kerning first=283 second=84 amount=-1 +kerning first=372 second=97 amount=-1 +kerning first=45 second=933 amount=-1 +kerning first=910 second=193 amount=-2 +kerning first=234 second=358 amount=-1 +kerning first=91 second=84 amount=1 +kerning first=331 second=8221 amount=-1 +kerning first=256 second=8217 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=939 second=920 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=8220 second=1040 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=910 second=58 amount=-1 +kerning first=1043 second=59 amount=-1 +kerning first=968 second=39 amount=-1 +kerning first=40 second=932 amount=1 +kerning first=1058 second=1085 amount=-1 +kerning first=364 second=260 amount=-1 +kerning first=319 second=284 amount=-1 +kerning first=285 second=358 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=321 second=71 amount=-1 +kerning first=1168 second=1089 amount=-1 +kerning first=1036 second=1051 amount=1 +kerning first=939 second=266 amount=-1 +kerning first=922 second=912 amount=1 +kerning first=89 second=287 amount=-1 +kerning first=76 second=8220 amount=-2 +kerning first=8216 second=358 amount=1 +kerning first=933 second=196 amount=-2 +kerning first=221 second=273 amount=-1 +kerning first=1027 second=173 amount=-1 +kerning first=354 second=8211 amount=-1 +kerning first=331 second=354 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=1038 second=58 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=101 second=932 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=1057 second=1033 amount=1 +kerning first=1100 second=1098 amount=-1 +kerning first=902 second=8221 amount=-1 +kerning first=932 second=343 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=8221 second=287 amount=-1 +kerning first=1041 second=1090 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=84 second=125 amount=1 +kerning first=376 second=269 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=1168 second=45 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=123 second=354 amount=1 +kerning first=955 second=947 amount=-1 +kerning first=260 second=936 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=76 second=81 amount=-1 +kerning first=932 second=965 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=354 second=87 amount=1 +kerning first=89 second=71 amount=-1 +kerning first=313 second=264 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=939 second=953 amount=-1 +kerning first=932 second=237 amount=-1 +kerning first=915 second=65 amount=-2 +kerning first=358 second=951 amount=-1 +kerning first=1068 second=1066 amount=-1 +kerning first=333 second=356 amount=-1 +kerning first=902 second=354 amount=-1 +kerning first=86 second=269 amount=-1 +kerning first=1058 second=1169 amount=-1 +kerning first=319 second=364 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=343 second=44 amount=-1 +kerning first=376 second=197 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=196 second=939 amount=-2 +kerning first=936 second=256 amount=-1 +kerning first=933 second=959 amount=-1 +kerning first=8249 second=910 amount=-1 +kerning first=34 second=969 amount=-1 +kerning first=319 second=8216 amount=-2 +kerning first=89 second=365 amount=-1 +kerning first=958 second=125 amount=1 +kerning first=376 second=284 amount=-1 +kerning first=46 second=8216 amount=-2 +kerning first=354 second=305 amount=-1 +kerning first=1034 second=1038 amount=-1 +kerning first=358 second=86 amount=1 +kerning first=87 second=257 amount=-1 +kerning first=102 second=8221 amount=1 +kerning first=221 second=351 amount=-1 +kerning first=87 second=113 amount=-1 +kerning first=313 second=8211 amount=-1 +kerning first=218 second=192 amount=-1 +kerning first=339 second=356 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=173 second=221 amount=-1 +kerning first=916 second=8221 amount=-1 +kerning first=219 second=923 amount=-1 +kerning first=8217 second=256 amount=-1 +kerning first=356 second=125 amount=1 +kerning first=915 second=966 amount=-1 +kerning first=317 second=8249 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=963 second=912 amount=1 +kerning first=358 second=230 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=8220 second=358 amount=1 +kerning first=1043 second=1026 amount=1 +kerning first=333 second=8217 amount=-1 +kerning first=34 second=913 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=235 second=356 amount=-1 +kerning first=173 second=84 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=239 amount=1 +kerning first=933 second=181 amount=-1 +kerning first=195 second=933 amount=-2 +kerning first=354 second=121 amount=-1 +kerning first=84 second=940 amount=-1 +kerning first=34 second=258 amount=-1 +kerning first=216 second=46 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=260 second=372 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=8221 second=246 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=932 second=301 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=1168 second=8212 amount=-1 +kerning first=291 second=356 amount=-1 +kerning first=916 second=354 amount=-1 +kerning first=317 second=334 amount=-1 +kerning first=360 second=195 amount=-1 +kerning first=358 second=271 amount=-1 +kerning first=97 second=356 amount=-1 +kerning first=193 second=932 amount=-1 +kerning first=8221 second=105 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=358 second=120 amount=-1 +kerning first=87 second=335 amount=-1 +kerning first=217 second=260 amount=-1 +kerning first=259 second=8221 amount=-1 +kerning first=110 second=84 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=86 second=235 amount=-1 +kerning first=315 second=79 amount=-1 +kerning first=364 second=197 amount=-1 +kerning first=319 second=212 amount=-1 +kerning first=931 second=81 amount=-1 +kerning first=8204 second=89 amount=-1 +kerning first=939 second=934 amount=-1 +kerning first=358 second=932 amount=1 +kerning first=915 second=44 amount=-2 +kerning first=910 second=71 amount=-1 +kerning first=317 second=216 amount=-1 +kerning first=321 second=336 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=271 second=318 amount=1 +kerning first=326 second=358 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=912 second=952 amount=1 +kerning first=1168 second=1102 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=87 second=227 amount=-1 +kerning first=368 second=193 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=939 second=67 amount=-1 +kerning first=259 second=354 amount=-1 +kerning first=315 second=8212 amount=-1 +kerning first=70 second=8230 amount=-2 +kerning first=358 second=65 amount=-1 +kerning first=356 second=940 amount=-1 +kerning first=97 second=8217 amount=-1 +kerning first=376 second=41 amount=1 +kerning first=39 second=969 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=913 second=86 amount=-1 +kerning first=955 second=8221 amount=-1 +kerning first=226 second=84 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=321 second=338 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=358 second=347 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=354 second=239 amount=-1 +kerning first=910 second=941 amount=-1 +kerning first=1168 second=58 amount=-1 +kerning first=915 second=213 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=8211 second=354 amount=-1 +kerning first=86 second=41 amount=1 +kerning first=89 second=336 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=932 second=971 amount=-1 +kerning first=256 second=86 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=89 second=84 amount=1 +kerning first=70 second=97 amount=-1 +kerning first=84 second=948 amount=-1 +kerning first=942 second=8217 amount=-1 +kerning first=939 second=968 amount=-1 +kerning first=932 second=252 amount=-1 +kerning first=39 second=913 amount=-1 +kerning first=358 second=966 amount=-1 +kerning first=936 second=192 amount=-1 +kerning first=932 second=173 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=358 second=238 amount=-1 +kerning first=372 second=228 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=376 second=212 amount=-1 +kerning first=171 second=356 amount=-1 +kerning first=933 second=943 amount=-1 +kerning first=1027 second=1058 amount=1 +kerning first=1043 second=1095 amount=-1 +kerning first=8216 second=1066 amount=1 +kerning first=356 second=260 amount=-1 +kerning first=1113 second=8221 amount=-1 +kerning first=317 second=284 amount=-1 +kerning first=932 second=111 amount=-1 +kerning first=39 second=258 amount=-1 +kerning first=281 second=358 amount=-1 +kerning first=8221 second=84 amount=1 +kerning first=65 second=8216 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=358 second=99 amount=-1 +kerning first=910 second=916 amount=-2 +kerning first=76 second=8217 amount=-2 +kerning first=319 second=920 amount=-1 +kerning first=160 second=8218 amount=-2 +kerning first=221 second=8212 amount=-1 +kerning first=8217 second=192 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=969 second=34 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=321 second=290 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=319 second=266 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=372 second=248 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=913 second=932 amount=-1 +kerning first=1168 second=1081 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=89 second=265 amount=-1 +kerning first=34 second=196 amount=-1 +kerning first=936 second=961 amount=-1 +kerning first=939 second=46 amount=-2 +kerning first=258 second=936 amount=-1 +kerning first=358 second=44 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=356 second=948 amount=-1 +kerning first=88 second=934 amount=-1 +kerning first=933 second=268 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=910 second=8250 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=1066 second=1066 amount=-1 +kerning first=335 second=356 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=8217 second=8221 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=256 second=932 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=8221 second=265 amount=-1 +kerning first=358 second=299 amount=-1 +kerning first=341 second=44 amount=-1 +kerning first=217 second=197 amount=-1 +kerning first=372 second=279 amount=-1 +kerning first=193 second=939 amount=-2 +kerning first=84 second=117 amount=-1 +kerning first=915 second=923 amount=-2 +kerning first=317 second=8216 amount=-2 +kerning first=89 second=195 amount=-1 +kerning first=910 second=949 amount=-1 +kerning first=293 second=8221 amount=-1 +kerning first=44 second=8216 amount=-2 +kerning first=89 second=290 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=123 second=87 amount=1 +kerning first=8217 second=234 amount=-1 +kerning first=910 second=336 amount=-1 +kerning first=366 second=198 amount=-1 +kerning first=939 second=945 amount=-1 +kerning first=932 second=224 amount=-1 +kerning first=1068 second=1058 amount=-1 +kerning first=8220 second=1066 amount=1 +kerning first=84 second=197 amount=-1 +kerning first=376 second=920 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=8217 second=354 amount=1 +kerning first=8221 second=195 amount=-1 +kerning first=946 second=34 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=221 second=58 amount=-1 +kerning first=902 second=87 amount=-1 +kerning first=933 second=951 amount=-1 +kerning first=1168 second=1116 amount=-1 +kerning first=87 second=246 amount=-1 +kerning first=1041 second=1026 amount=-1 +kerning first=335 second=8217 amount=-1 +kerning first=70 second=361 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=85 second=193 amount=-1 +kerning first=293 second=354 amount=-1 +kerning first=354 second=8212 amount=-1 +kerning first=89 second=8230 amount=-2 +kerning first=1059 second=1108 amount=-1 +kerning first=233 second=356 amount=-1 +kerning first=8250 second=932 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=192 second=933 amount=-2 +kerning first=910 second=338 amount=-1 +kerning first=1027 second=171 amount=-1 +kerning first=245 second=84 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=80 second=923 amount=-1 +kerning first=258 second=372 amount=-1 +kerning first=84 second=341 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=8221 second=345 amount=-1 +kerning first=931 second=8217 amount=-1 +kerning first=354 second=912 amount=-1 +kerning first=932 second=339 amount=-1 +kerning first=358 second=373 amount=-1 +kerning first=287 second=356 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=8221 second=8230 amount=-2 +kerning first=356 second=117 amount=-1 +kerning first=939 second=198 amount=-2 +kerning first=354 second=253 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=1090 second=44 amount=-1 +kerning first=70 second=251 amount=-1 +kerning first=370 second=195 amount=-1 +kerning first=1168 second=1060 amount=-1 +kerning first=923 second=39 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=8216 second=224 amount=-1 +kerning first=219 second=260 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=84 second=963 amount=-1 +kerning first=366 second=194 amount=-1 +kerning first=8204 second=8220 amount=-1 +kerning first=939 second=944 amount=-1 +kerning first=932 second=312 amount=-1 +kerning first=358 second=974 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=313 second=79 amount=-1 +kerning first=356 second=197 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=260 second=354 amount=-1 +kerning first=317 second=212 amount=-1 +kerning first=8221 second=232 amount=-1 +kerning first=39 second=196 amount=-1 +kerning first=358 second=249 amount=-1 +kerning first=1043 second=1109 amount=-1 +kerning first=932 second=275 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=328 second=358 amount=-1 +kerning first=358 second=259 amount=-1 +kerning first=1059 second=8230 amount=-2 +kerning first=354 second=193 amount=-1 +kerning first=358 second=112 amount=-1 +kerning first=1111 second=1106 amount=1 +kerning first=76 second=268 amount=-1 +kerning first=333 second=932 amount=-1 +kerning first=902 second=933 amount=-2 +kerning first=910 second=195 amount=-2 +kerning first=313 second=8212 amount=-1 +kerning first=68 second=8230 amount=-1 +kerning first=91 second=89 amount=1 +kerning first=1038 second=1108 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=321 second=214 amount=-1 +kerning first=86 second=226 amount=-1 +kerning first=315 second=71 amount=-1 +kerning first=910 second=290 amount=-1 +kerning first=210 second=44 amount=-1 +kerning first=356 second=341 amount=-1 +kerning first=358 second=923 amount=-1 +kerning first=372 second=913 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=939 second=194 amount=-2 +kerning first=1058 second=1090 amount=-1 +kerning first=271 second=293 amount=1 +kerning first=1107 second=173 amount=-1 +kerning first=8217 second=74 amount=-1 +kerning first=913 second=939 amount=-2 +kerning first=1168 second=1094 amount=-1 +kerning first=319 second=67 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=339 second=932 amount=-1 +kerning first=372 second=258 amount=-1 +kerning first=84 second=41 amount=1 +kerning first=1027 second=1241 amount=-1 +kerning first=939 second=59 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=356 second=963 amount=-1 +kerning first=197 second=8216 amount=-1 +kerning first=221 second=287 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=229 second=358 amount=-1 +kerning first=87 second=84 amount=1 +kerning first=356 second=235 amount=-1 +kerning first=910 second=8230 amount=-2 +kerning first=933 second=65 amount=-2 +kerning first=1027 second=1106 amount=1 +kerning first=8218 second=221 amount=-2 +kerning first=256 second=939 amount=-2 +kerning first=187 second=1026 amount=-1 +kerning first=235 second=932 amount=-1 +kerning first=358 second=326 amount=-1 +kerning first=1058 second=46 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=8220 second=224 amount=-1 +kerning first=279 second=358 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=1038 second=8230 amount=-2 +kerning first=8230 second=34 amount=-2 +kerning first=76 second=86 amount=-1 +kerning first=958 second=41 amount=1 +kerning first=932 second=962 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=291 second=932 amount=-1 +kerning first=916 second=933 amount=-1 +kerning first=952 second=44 amount=-1 +kerning first=317 second=920 amount=-1 +kerning first=932 second=243 amount=-1 +kerning first=1169 second=46 amount=-1 +kerning first=97 second=932 amount=-1 +kerning first=86 second=283 amount=-1 +kerning first=358 second=229 amount=-1 +kerning first=319 second=360 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=932 second=372 amount=1 +kerning first=1043 second=1087 amount=-1 +kerning first=1168 second=8250 amount=-1 +kerning first=933 second=966 amount=-1 +kerning first=8216 second=1058 amount=1 +kerning first=317 second=266 amount=-1 +kerning first=932 second=103 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=356 second=41 amount=1 +kerning first=87 second=265 amount=-1 +kerning first=8220 second=339 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=908 second=46 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=931 second=268 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=376 second=349 amount=-1 +kerning first=915 second=940 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=219 second=197 amount=-1 +kerning first=932 second=256 amount=-1 +kerning first=8216 second=962 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=173 second=89 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=160 second=376 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=84 second=972 amount=-1 +kerning first=8204 second=8222 amount=-2 +kerning first=98 second=8221 amount=-1 +kerning first=220 second=193 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=362 second=198 amount=-1 +kerning first=230 second=356 amount=-1 +kerning first=232 second=354 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=933 second=44 amount=-2 +kerning first=1066 second=1058 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=76 second=932 amount=-1 +kerning first=8211 second=933 amount=-1 +kerning first=319 second=39 amount=-2 +kerning first=1060 second=1061 amount=-1 +kerning first=932 second=171 amount=-1 +kerning first=358 second=281 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=8221 second=110 amount=-1 +kerning first=46 second=39 amount=-2 +kerning first=315 second=221 amount=-1 +kerning first=358 second=125 amount=1 +kerning first=376 second=101 amount=-1 +kerning first=289 second=354 amount=-1 +kerning first=87 second=8230 amount=-1 +kerning first=910 second=214 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=227 second=356 amount=-1 +kerning first=315 second=336 amount=-1 +kerning first=171 second=932 amount=-1 +kerning first=8204 second=356 amount=-1 +kerning first=98 second=354 amount=-1 +kerning first=194 second=933 amount=-2 +kerning first=915 second=260 amount=-2 +kerning first=315 second=84 amount=-1 +kerning first=319 second=218 amount=-1 +kerning first=356 second=367 amount=-1 +kerning first=246 second=84 amount=-1 +kerning first=8216 second=256 amount=-1 +kerning first=8220 second=1058 amount=1 +kerning first=258 second=8221 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=372 second=196 amount=-1 +kerning first=1043 second=1066 amount=1 +kerning first=275 second=356 amount=-1 +kerning first=1027 second=1028 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=86 second=101 amount=-1 +kerning first=1168 second=1108 amount=-1 +kerning first=87 second=232 amount=-1 +kerning first=368 second=195 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=933 second=213 amount=-1 +kerning first=160 second=358 amount=-1 +kerning first=315 second=338 amount=-1 +kerning first=1068 second=8221 amount=-1 +kerning first=356 second=972 amount=-1 +kerning first=376 second=46 amount=-2 +kerning first=87 second=97 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=362 second=194 amount=-1 +kerning first=91 second=1035 amount=1 +kerning first=8217 second=305 amount=-1 +kerning first=227 second=8217 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=8221 second=328 amount=-1 +kerning first=354 second=941 amount=-1 +kerning first=8220 second=962 amount=-1 +kerning first=372 second=333 amount=-1 +kerning first=1058 second=59 amount=-1 +kerning first=915 second=948 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=8220 second=243 amount=-1 +kerning first=91 second=309 amount=1 +kerning first=910 second=973 amount=-1 +kerning first=8217 second=8204 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=321 second=34 amount=-2 +kerning first=80 second=260 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=955 second=967 amount=-1 +kerning first=111 second=358 amount=-1 +kerning first=1043 second=173 amount=-1 +kerning first=335 second=932 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=915 second=334 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=84 second=953 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=939 second=942 amount=-1 +kerning first=358 second=940 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=313 second=71 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=212 second=44 amount=-1 +kerning first=358 second=244 amount=-1 +kerning first=951 second=8221 amount=-1 +kerning first=372 second=233 amount=-1 +kerning first=221 second=84 amount=1 +kerning first=932 second=263 amount=-1 +kerning first=360 second=913 amount=-1 +kerning first=260 second=87 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=1168 second=8230 amount=-1 +kerning first=8230 second=8220 amount=-2 +kerning first=354 second=916 amount=-1 +kerning first=70 second=913 amount=-1 +kerning first=372 second=356 amount=1 +kerning first=317 second=67 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=187 second=376 amount=-1 +kerning first=360 second=258 amount=-1 +kerning first=8249 second=354 amount=-1 +kerning first=915 second=216 amount=-1 +kerning first=315 second=290 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=196 second=8216 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=8220 second=256 amount=-1 +kerning first=228 second=358 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=271 second=295 amount=1 +kerning first=932 second=192 amount=-1 +kerning first=8221 second=248 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=233 second=932 amount=-1 +kerning first=1056 second=46 amount=-2 +kerning first=376 second=198 amount=-1 +kerning first=933 second=923 amount=-2 +kerning first=1168 second=1086 amount=-1 +kerning first=939 second=262 amount=-1 +kerning first=277 second=358 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=358 second=260 amount=-1 +kerning first=337 second=8221 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=356 second=953 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=287 second=932 amount=-1 +kerning first=221 second=265 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=1100 second=1095 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=34 second=65 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=965 second=34 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=8221 second=279 amount=-1 +kerning first=317 second=360 amount=-1 +kerning first=354 second=949 amount=-1 +kerning first=932 second=8221 amount=1 +kerning first=76 second=213 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=65 second=39 amount=-1 +kerning first=187 second=358 amount=-1 +kerning first=1058 second=1026 amount=1 +kerning first=358 second=8249 amount=-1 +kerning first=248 second=8221 amount=-1 +kerning first=910 second=954 amount=-1 +kerning first=337 second=354 amount=-1 +kerning first=915 second=197 amount=-2 +kerning first=260 second=933 amount=-2 +kerning first=315 second=368 amount=-1 +kerning first=8216 second=192 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=932 second=961 amount=-1 +kerning first=8217 second=239 amount=-1 +kerning first=915 second=284 amount=-1 +kerning first=171 second=939 amount=-1 +kerning first=173 second=1035 amount=-1 +kerning first=354 second=84 amount=1 +kerning first=84 second=934 amount=-1 +kerning first=1040 second=1035 amount=-1 +kerning first=932 second=234 amount=-1 +kerning first=358 second=948 amount=-1 +kerning first=102 second=58 amount=1 +kerning first=1068 second=1063 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=920 second=8230 amount=-1 +kerning first=86 second=261 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=324 second=356 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=932 second=354 amount=1 +kerning first=376 second=194 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=939 second=332 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=112 second=356 amount=-1 +kerning first=248 second=354 amount=-1 +kerning first=929 second=256 amount=-1 +kerning first=85 second=195 amount=-1 +kerning first=1059 second=1113 amount=-1 +kerning first=376 second=59 amount=-1 +kerning first=915 second=187 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=270 second=8230 amount=-1 +kerning first=1027 second=8211 amount=-1 +kerning first=218 second=193 amount=-1 +kerning first=221 second=8230 amount=-2 +kerning first=86 second=194 amount=-1 +kerning first=364 second=198 amount=-1 +kerning first=84 second=349 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=234 second=354 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=915 second=963 amount=-1 +kerning first=317 second=39 amount=-2 +kerning first=8216 second=961 amount=-2 +kerning first=44 second=39 amount=-2 +kerning first=313 second=221 amount=-1 +kerning first=324 second=8217 amount=-1 +kerning first=354 second=265 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=285 second=354 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=112 second=8217 amount=-1 +kerning first=224 second=356 amount=-1 +kerning first=84 second=968 amount=-1 +kerning first=313 second=336 amount=-1 +kerning first=356 second=934 amount=-1 +kerning first=8216 second=354 amount=1 +kerning first=84 second=236 amount=-1 +kerning first=8217 second=303 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=8221 second=241 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=86 second=337 amount=-1 +kerning first=243 second=84 amount=-1 +kerning first=34 second=44 amount=-2 +kerning first=372 second=245 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=932 second=289 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=1027 second=1076 amount=-2 +kerning first=321 second=8220 amount=-2 +kerning first=923 second=376 amount=-1 +kerning first=360 second=196 amount=-1 +kerning first=89 second=913 amount=-1 +kerning first=358 second=269 amount=-1 +kerning first=283 second=356 amount=-1 +kerning first=1041 second=1066 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=354 second=195 amount=-1 +kerning first=39 second=65 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=315 second=214 amount=-1 +kerning first=358 second=117 amount=-1 +kerning first=8220 second=192 amount=-1 +kerning first=91 second=356 amount=1 +kerning first=931 second=213 amount=-1 +kerning first=376 second=93 amount=1 +kerning first=313 second=338 amount=-1 +kerning first=1066 second=8221 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=1038 second=1113 amount=-1 +kerning first=104 second=84 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=86 second=231 amount=-1 +kerning first=1098 second=1118 amount=-1 +kerning first=364 second=194 amount=-1 +kerning first=356 second=349 amount=-1 +kerning first=8221 second=913 amount=-1 +kerning first=8204 second=86 amount=-1 +kerning first=224 second=8217 amount=-1 +kerning first=939 second=199 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=8212 second=1026 amount=-1 +kerning first=358 second=197 amount=-1 +kerning first=1043 second=1058 amount=1 +kerning first=1075 second=46 amount=-1 +kerning first=944 second=39 amount=-1 +kerning first=321 second=81 amount=-1 +kerning first=86 second=93 amount=1 +kerning first=1168 second=1099 amount=-1 +kerning first=87 second=228 amount=-1 +kerning first=8221 second=258 amount=-1 +kerning first=939 second=288 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=932 second=74 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=1050 second=1051 amount=1 +kerning first=354 second=8230 amount=-1 +kerning first=109 second=358 amount=-1 +kerning first=356 second=968 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=934 second=933 amount=-1 +kerning first=8221 second=307 amount=-1 +kerning first=356 second=236 amount=-1 +kerning first=932 second=371 amount=-1 +kerning first=1027 second=1111 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=923 second=358 amount=-1 +kerning first=84 second=297 amount=-1 +kerning first=1118 second=8230 amount=-1 +kerning first=358 second=341 amount=-1 +kerning first=370 second=913 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=8220 second=961 amount=-2 +kerning first=376 second=285 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=358 second=187 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=915 second=212 amount=-1 +kerning first=8218 second=89 amount=-2 +kerning first=955 second=957 amount=-1 +kerning first=87 second=248 amount=-1 +kerning first=8230 second=8217 amount=-2 +kerning first=8222 second=376 amount=-2 +kerning first=1168 second=1044 amount=-1 +kerning first=230 second=932 amount=-1 +kerning first=370 second=258 amount=-1 +kerning first=221 second=214 amount=-1 +kerning first=8220 second=354 amount=1 +kerning first=932 second=970 amount=-1 +kerning first=261 second=84 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=1059 second=1035 amount=1 +kerning first=84 second=945 amount=-1 +kerning first=313 second=290 amount=-1 +kerning first=193 second=8216 amount=-1 +kerning first=932 second=353 amount=-1 +kerning first=939 second=965 amount=-1 +kerning first=358 second=963 amount=-1 +kerning first=936 second=193 amount=-1 +kerning first=225 second=358 amount=-1 +kerning first=358 second=235 amount=-1 +kerning first=929 second=192 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=933 second=940 amount=-1 +kerning first=34 second=974 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=227 second=932 amount=-1 +kerning first=217 second=198 amount=-1 +kerning first=8204 second=932 amount=-1 +kerning first=376 second=308 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=39 second=44 amount=-2 +kerning first=87 second=279 amount=-1 +kerning first=910 second=913 amount=-2 +kerning first=326 second=8221 amount=-1 +kerning first=197 second=39 amount=-1 +kerning first=1028 second=1051 amount=1 +kerning first=221 second=361 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=275 second=932 amount=-1 +kerning first=8217 second=193 amount=-1 +kerning first=1098 second=1095 amount=-1 +kerning first=356 second=297 amount=-1 +kerning first=910 second=258 amount=-2 +kerning first=84 second=198 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=915 second=972 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=319 second=262 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=372 second=230 amount=-1 +kerning first=173 second=356 amount=-1 +kerning first=34 second=923 amount=-1 +kerning first=8222 second=358 amount=-1 +kerning first=1168 second=1078 amount=-1 +kerning first=8216 second=353 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=326 second=354 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=258 second=933 amount=-2 +kerning first=358 second=41 amount=1 +kerning first=84 second=944 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=356 second=945 amount=-1 +kerning first=336 second=44 amount=-1 +kerning first=220 second=195 amount=-1 +kerning first=933 second=260 amount=-2 +kerning first=253 second=44 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=1043 second=171 amount=-1 +kerning first=1038 second=1035 amount=1 +kerning first=331 second=84 amount=-1 +kerning first=208 second=46 amount=-1 +kerning first=1066 second=1063 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=75 second=74 amount=1 +kerning first=932 second=8211 amount=-1 +kerning first=217 second=194 amount=-1 +kerning first=372 second=271 amount=-1 +kerning first=123 second=221 amount=1 +kerning first=84 second=114 amount=-1 +kerning first=8221 second=115 amount=-1 +kerning first=915 second=920 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=110 second=356 amount=-1 +kerning first=910 second=946 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=950 second=125 amount=1 +kerning first=123 second=84 amount=1 +kerning first=902 second=221 amount=-1 +kerning first=915 second=266 amount=-1 +kerning first=86 second=242 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=319 second=376 amount=-1 +kerning first=932 second=225 amount=-1 +kerning first=372 second=932 amount=1 +kerning first=84 second=194 amount=-1 +kerning first=910 second=81 amount=-1 +kerning first=356 second=198 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=8221 second=196 amount=-1 +kerning first=939 second=210 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=1058 second=1109 amount=-1 +kerning first=1027 second=45 amount=-1 +kerning first=319 second=332 amount=-1 +kerning first=902 second=84 amount=-1 +kerning first=8249 second=933 amount=-1 +kerning first=933 second=948 amount=-1 +kerning first=1168 second=1113 amount=-1 +kerning first=319 second=85 amount=-1 +kerning first=932 second=87 amount=1 +kerning first=354 second=361 amount=-1 +kerning first=70 second=363 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=1034 second=1026 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=372 second=65 amount=-1 +kerning first=356 second=944 amount=-1 +kerning first=39 second=974 amount=-1 +kerning first=933 second=334 amount=-1 +kerning first=281 second=354 amount=-1 +kerning first=110 second=8217 amount=-1 +kerning first=226 second=356 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=913 second=8216 amount=-1 +kerning first=315 second=34 amount=-2 +kerning first=84 second=337 amount=-1 +kerning first=8221 second=333 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=932 second=305 amount=-1 +kerning first=358 second=367 amount=-1 +kerning first=354 second=973 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=370 second=196 amount=-1 +kerning first=87 second=913 amount=-1 +kerning first=8220 second=353 amount=-1 +kerning first=915 second=953 amount=-1 +kerning first=321 second=8217 amount=-2 +kerning first=8212 second=376 amount=-1 +kerning first=1168 second=1057 amount=-1 +kerning first=313 second=214 amount=-1 +kerning first=89 second=356 amount=1 +kerning first=8216 second=225 amount=-1 +kerning first=933 second=216 amount=-1 +kerning first=1043 second=1241 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=256 second=8216 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=319 second=358 amount=-1 +kerning first=939 second=971 amount=-1 +kerning first=932 second=273 amount=-1 +kerning first=39 second=923 amount=-1 +kerning first=358 second=972 amount=-1 +kerning first=242 second=358 amount=-1 +kerning first=957 second=8230 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=356 second=194 amount=-1 +kerning first=8221 second=233 amount=-1 +kerning first=358 second=250 amount=-1 +kerning first=939 second=173 amount=-1 +kerning first=1043 second=1106 amount=1 +kerning first=932 second=277 amount=-1 +kerning first=226 second=8217 amount=-1 +kerning first=8216 second=1076 amount=-1 +kerning first=8221 second=356 amount=1 +kerning first=932 second=121 amount=-1 +kerning first=1041 second=1058 amount=-1 +kerning first=974 second=39 amount=-1 +kerning first=916 second=84 amount=-1 +kerning first=84 second=93 amount=1 +kerning first=376 second=332 amount=-1 +kerning first=358 second=109 amount=-1 +kerning first=929 second=74 amount=-1 +kerning first=372 second=99 amount=-1 +kerning first=910 second=196 amount=-2 +kerning first=271 second=8217 amount=1 +kerning first=91 second=86 amount=1 +kerning first=1038 second=1105 amount=-1 +kerning first=1027 second=8212 amount=-1 +kerning first=324 second=932 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=319 second=199 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=112 second=932 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=319 second=288 amount=-1 +kerning first=368 second=913 amount=-1 +kerning first=8212 second=358 amount=-1 +kerning first=1168 second=1091 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=76 second=8249 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=933 second=197 amount=-2 +kerning first=958 second=93 amount=1 +kerning first=8221 second=8217 amount=-1 +kerning first=1059 second=1083 amount=-1 +kerning first=368 second=258 amount=-1 +kerning first=372 second=44 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=160 second=372 amount=-1 +kerning first=259 second=84 amount=-1 +kerning first=933 second=284 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=1057 second=1035 amount=1 +kerning first=932 second=351 amount=-1 +kerning first=376 second=358 amount=1 +kerning first=1027 second=1102 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=84 second=285 amount=-1 +kerning first=8221 second=291 amount=-1 +kerning first=354 second=954 amount=-1 +kerning first=358 second=324 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=8211 second=221 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=356 second=93 amount=1 +kerning first=915 second=934 amount=-1 +kerning first=354 second=228 amount=-1 +kerning first=224 second=932 amount=-1 +kerning first=910 second=959 amount=-1 +kerning first=8220 second=225 amount=-1 +kerning first=219 second=198 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=1028 second=1098 amount=-1 +kerning first=1168 second=1035 amount=1 +kerning first=328 second=8221 amount=-1 +kerning first=196 second=39 amount=-1 +kerning first=8211 second=84 amount=-1 +kerning first=933 second=187 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=936 second=916 amount=-1 +kerning first=86 second=358 amount=1 +kerning first=932 second=239 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=283 second=932 amount=-1 +kerning first=915 second=67 amount=-1 +kerning first=358 second=953 amount=-1 +kerning first=8220 second=1076 amount=-1 +kerning first=65 second=376 amount=-1 +kerning first=86 second=267 amount=-1 +kerning first=1027 second=58 amount=-1 +kerning first=358 second=226 amount=-1 +kerning first=319 second=362 amount=-1 +kerning first=91 second=932 amount=1 +kerning first=343 second=46 amount=-1 +kerning first=8217 second=105 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=933 second=963 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=84 second=308 amount=-1 +kerning first=317 second=262 amount=-1 +kerning first=932 second=100 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=195 second=34 amount=-1 +kerning first=376 second=288 amount=-1 +kerning first=1107 second=8211 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=74 second=125 amount=1 +kerning first=328 second=354 amount=-1 +kerning first=102 second=8230 amount=-1 +kerning first=8216 second=351 amount=-1 +kerning first=245 second=356 amount=-1 +kerning first=910 second=181 amount=-1 +kerning first=1038 second=1083 amount=-1 +kerning first=218 second=195 amount=-1 +kerning first=1035 second=1035 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=356 second=285 amount=-1 +kerning first=229 second=8221 amount=-1 +kerning first=915 second=968 amount=-1 +kerning first=321 second=268 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=1058 second=1066 amount=1 +kerning first=8220 second=273 amount=-1 +kerning first=1043 second=1028 amount=-1 +kerning first=219 second=194 amount=-1 +kerning first=45 second=1035 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=271 second=107 amount=1 +kerning first=354 second=279 amount=-1 +kerning first=932 second=45 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=315 second=8220 amount=-2 +kerning first=84 second=942 amount=-1 +kerning first=1107 second=1076 amount=-1 +kerning first=329 second=358 amount=-1 +kerning first=34 second=260 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=65 second=358 amount=-1 +kerning first=8221 second=245 amount=-1 +kerning first=317 second=376 amount=-1 +kerning first=358 second=331 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=245 second=8217 amount=-1 +kerning first=932 second=303 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=229 second=354 amount=-1 +kerning first=356 second=308 amount=-1 +kerning first=317 second=332 amount=-1 +kerning first=358 second=283 amount=-1 +kerning first=372 second=259 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=358 second=122 amount=-1 +kerning first=87 second=333 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=221 second=913 amount=-1 +kerning first=360 second=65 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=1058 second=173 amount=-1 +kerning first=279 second=354 amount=-1 +kerning first=931 second=334 amount=-1 +kerning first=81 second=8230 amount=-1 +kerning first=315 second=81 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=319 second=210 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=915 second=46 amount=-2 +kerning first=372 second=923 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=358 second=934 amount=-1 +kerning first=313 second=34 amount=-2 +kerning first=1058 second=1100 amount=-1 +kerning first=271 second=320 amount=1 +kerning first=8217 second=84 amount=1 +kerning first=321 second=86 amount=-1 +kerning first=87 second=233 amount=-1 +kerning first=1168 second=1105 amount=-1 +kerning first=85 second=913 amount=-1 +kerning first=368 second=196 amount=-1 +kerning first=1169 second=173 amount=-1 +kerning first=933 second=212 amount=-1 +kerning first=8220 second=351 amount=-1 +kerning first=87 second=356 amount=1 +kerning first=931 second=216 amount=-1 +kerning first=356 second=942 amount=-1 +kerning first=293 second=84 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=85 second=258 amount=-1 +kerning first=317 second=358 amount=-1 +kerning first=244 second=358 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=173 second=932 amount=-1 +kerning first=932 second=8212 amount=-1 +kerning first=354 second=969 amount=-1 +kerning first=358 second=349 amount=-1 +kerning first=935 second=934 amount=-1 +kerning first=915 second=945 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=8212 second=910 amount=-1 +kerning first=310 second=308 amount=1 +kerning first=910 second=943 amount=-1 +kerning first=973 second=39 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=76 second=8216 amount=-2 +kerning first=80 second=46 amount=-2 +kerning first=1046 second=1051 amount=1 +kerning first=932 second=912 amount=-1 +kerning first=260 second=221 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=939 second=962 amount=-1 +kerning first=932 second=253 amount=-1 +kerning first=936 second=195 amount=-1 +kerning first=319 second=173 amount=-1 +kerning first=358 second=968 amount=-1 +kerning first=8217 second=265 amount=-1 +kerning first=317 second=199 amount=-1 +kerning first=86 second=301 amount=1 +kerning first=8212 second=1066 amount=-1 +kerning first=358 second=236 amount=-1 +kerning first=110 second=932 amount=-1 +kerning first=923 second=936 amount=-1 +kerning first=932 second=257 amount=-1 +kerning first=366 second=256 amount=-1 +kerning first=372 second=229 amount=-1 +kerning first=260 second=84 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=933 second=972 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=317 second=288 amount=-1 +kerning first=354 second=913 amount=-1 +kerning first=932 second=113 amount=-1 +kerning first=39 second=260 amount=-1 +kerning first=345 second=8230 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=358 second=101 amount=-1 +kerning first=121 second=8230 amount=-1 +kerning first=915 second=198 amount=-2 +kerning first=321 second=932 amount=-1 +kerning first=354 second=258 amount=-1 +kerning first=8230 second=939 amount=-1 +kerning first=931 second=284 amount=-1 +kerning first=8217 second=195 amount=-1 +kerning first=70 second=44 amount=-2 +kerning first=84 second=380 amount=-1 +kerning first=910 second=268 amount=-1 +kerning first=932 second=193 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=936 second=8230 amount=-1 +kerning first=915 second=944 amount=-1 +kerning first=354 second=307 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=197 second=376 amount=-1 +kerning first=933 second=920 amount=-1 +kerning first=1168 second=1083 amount=-1 +kerning first=226 second=932 amount=-1 +kerning first=939 second=256 amount=-2 +kerning first=89 second=271 amount=-1 +kerning first=34 second=197 amount=-1 +kerning first=358 second=46 amount=-1 +kerning first=193 second=39 amount=-1 +kerning first=933 second=266 amount=-1 +kerning first=8216 second=257 amount=-1 +kerning first=160 second=354 amount=-1 +kerning first=84 second=358 amount=1 +kerning first=8217 second=345 amount=-1 +kerning first=1043 second=8211 amount=-1 +kerning first=111 second=8221 amount=-1 +kerning first=950 second=41 amount=1 +kerning first=8216 second=113 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=932 second=335 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=8217 second=8230 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=376 second=173 amount=-1 +kerning first=8221 second=271 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=89 second=932 amount=1 +kerning first=354 second=946 amount=-1 +kerning first=76 second=212 amount=-1 +kerning first=358 second=297 amount=-1 +kerning first=341 second=46 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=372 second=281 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=923 second=372 amount=-1 +kerning first=910 second=951 amount=-1 +kerning first=1091 second=8230 amount=-1 +kerning first=372 second=125 amount=1 +kerning first=192 second=34 amount=-1 +kerning first=941 second=912 amount=1 +kerning first=376 second=111 amount=-1 +kerning first=915 second=194 amount=-2 +kerning first=1028 second=1090 amount=-1 +kerning first=357 second=8217 amount=1 +kerning first=315 second=356 amount=-1 +kerning first=8216 second=193 amount=-1 +kerning first=123 second=89 amount=1 +kerning first=221 second=196 amount=-1 +kerning first=246 second=356 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=8221 second=932 amount=1 +kerning first=111 second=354 amount=-1 +kerning first=932 second=227 amount=-1 +kerning first=1107 second=45 amount=-1 +kerning first=915 second=59 amount=-1 +kerning first=358 second=945 amount=-1 +kerning first=1033 second=1035 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=1043 second=1076 amount=-2 +kerning first=902 second=89 amount=-1 +kerning first=197 second=358 amount=-1 +kerning first=228 second=8221 amount=-1 +kerning first=933 second=953 amount=-1 +kerning first=86 second=111 amount=-1 +kerning first=1168 second=1119 amount=-1 +kerning first=87 second=245 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=8221 second=65 amount=-1 +kerning first=85 second=196 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=313 second=8220 amount=-2 +kerning first=356 second=358 amount=1 +kerning first=1027 second=8250 amount=-1 +kerning first=295 second=358 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=173 second=939 amount=-1 +kerning first=315 second=8217 amount=-2 +kerning first=84 second=343 amount=-1 +kerning first=8221 second=347 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=213 second=8230 amount=-1 +kerning first=246 second=8217 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=228 second=354 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=1058 second=1058 amount=1 +kerning first=358 second=198 amount=-1 +kerning first=70 second=249 amount=-1 +kerning first=1090 second=46 amount=-1 +kerning first=902 second=34 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=8216 second=227 amount=-1 +kerning first=8220 second=257 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=220 second=913 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=8222 second=372 amount=-1 +kerning first=370 second=65 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=84 second=965 amount=-1 +kerning first=366 second=192 amount=-1 +kerning first=277 second=354 amount=-1 +kerning first=358 second=944 amount=-1 +kerning first=79 second=8230 amount=-1 +kerning first=221 second=356 amount=1 +kerning first=84 second=237 amount=-1 +kerning first=8221 second=238 amount=-1 +kerning first=313 second=81 amount=-1 +kerning first=317 second=210 amount=-1 +kerning first=40 second=1026 amount=1 +kerning first=39 second=197 amount=-1 +kerning first=358 second=255 amount=-1 +kerning first=372 second=244 amount=-1 +kerning first=932 second=287 amount=-1 +kerning first=360 second=923 amount=-1 +kerning first=220 second=258 amount=-1 +kerning first=76 second=920 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=1043 second=1111 amount=-1 +kerning first=232 second=84 amount=-1 +kerning first=1041 second=1063 amount=-1 +kerning first=70 second=923 amount=-1 +kerning first=358 second=261 amount=-1 +kerning first=8221 second=99 amount=-1 +kerning first=1107 second=8212 amount=-1 +kerning first=1034 second=1066 amount=-1 +kerning first=354 second=196 amount=-1 +kerning first=358 second=114 amount=-1 +kerning first=8220 second=193 amount=-1 +kerning first=931 second=212 amount=-1 +kerning first=76 second=266 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=913 second=39 amount=-1 +kerning first=289 second=84 amount=-1 +kerning first=321 second=213 amount=-1 +kerning first=86 second=224 amount=-1 +kerning first=89 second=44 amount=-2 +kerning first=210 second=46 amount=-1 +kerning first=356 second=343 amount=-1 +kerning first=939 second=927 amount=-1 +kerning first=98 second=84 amount=-1 +kerning first=241 second=358 amount=-1 +kerning first=102 second=34 amount=1 +kerning first=910 second=65 amount=-2 +kerning first=939 second=192 amount=-2 +kerning first=1058 second=1092 amount=-1 +kerning first=358 second=194 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=933 second=934 amount=-1 +kerning first=912 second=946 amount=1 +kerning first=245 second=932 amount=-1 +kerning first=1168 second=1096 amount=-1 +kerning first=939 second=286 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=916 second=34 amount=-1 +kerning first=372 second=260 amount=-1 +kerning first=256 second=39 amount=-1 +kerning first=8221 second=44 amount=-2 +kerning first=356 second=965 amount=-1 +kerning first=929 second=912 amount=1 +kerning first=8216 second=287 amount=-1 +kerning first=103 second=358 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=221 second=291 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=933 second=67 amount=-1 +kerning first=317 second=173 amount=-1 +kerning first=932 second=365 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=1114 second=1095 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=86 second=339 amount=-1 +kerning first=84 second=301 amount=-1 +kerning first=8221 second=299 amount=-1 +kerning first=362 second=256 amount=-1 +kerning first=354 second=959 amount=-1 +kerning first=358 second=337 amount=-1 +kerning first=971 second=34 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=8220 second=227 amount=-1 +kerning first=910 second=966 amount=-1 +kerning first=8218 second=86 amount=-1 +kerning first=87 second=230 amount=-1 +kerning first=354 second=356 amount=1 +kerning first=119 second=8230 amount=-1 +kerning first=8211 second=89 amount=-1 +kerning first=932 second=941 amount=-1 +kerning first=1059 second=44 amount=-2 +kerning first=1059 second=1032 amount=-1 +kerning first=74 second=41 amount=1 +kerning first=939 second=961 amount=-1 +kerning first=952 second=46 amount=-1 +kerning first=932 second=246 amount=-1 +kerning first=1058 second=171 amount=-1 +kerning first=68 second=44 amount=-1 +kerning first=86 second=275 amount=-1 +kerning first=8212 second=1058 amount=-1 +kerning first=358 second=231 amount=-1 +kerning first=929 second=193 amount=-1 +kerning first=319 second=372 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=934 second=8230 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=933 second=968 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=932 second=105 amount=-1 +kerning first=8249 second=221 amount=-1 +kerning first=196 second=376 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=931 second=920 amount=-1 +kerning first=354 second=181 amount=-1 +kerning first=358 second=93 amount=1 +kerning first=87 second=271 amount=-1 +kerning first=1100 second=8221 amount=-1 +kerning first=40 second=106 amount=1 +kerning first=221 second=363 amount=-1 +kerning first=257 second=358 amount=-1 +kerning first=40 second=1095 amount=-1 +kerning first=315 second=268 amount=-1 +kerning first=8249 second=84 amount=-1 +kerning first=1027 second=8230 amount=-1 +kerning first=931 second=266 amount=-1 +kerning first=932 second=916 amount=-1 +kerning first=354 second=8217 amount=1 +kerning first=109 second=8221 amount=-1 +kerning first=123 second=1035 amount=1 +kerning first=356 second=301 amount=-1 +kerning first=915 second=942 amount=-1 +kerning first=910 second=44 amount=-2 +kerning first=1043 second=45 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=87 second=932 amount=1 +kerning first=955 second=34 amount=-1 +kerning first=8216 second=941 amount=-1 +kerning first=80 second=308 amount=-1 +kerning first=123 second=309 amount=1 +kerning first=1168 second=1075 amount=-1 +kerning first=923 second=8221 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=194 second=34 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=1075 second=173 amount=-1 +kerning first=84 second=971 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=220 second=196 amount=-1 +kerning first=243 second=356 amount=-1 +kerning first=1038 second=44 amount=-2 +kerning first=84 second=252 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=8218 second=932 amount=-1 +kerning first=1038 second=1032 amount=-1 +kerning first=109 second=354 amount=-1 +kerning first=84 second=173 amount=-1 +kerning first=933 second=46 amount=-2 +kerning first=8221 second=160 amount=-1 +kerning first=160 second=87 amount=-1 +kerning first=902 second=8220 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=319 second=171 amount=-1 +kerning first=932 second=8250 amount=-1 +kerning first=89 second=923 amount=-1 +kerning first=358 second=285 amount=-1 +kerning first=196 second=358 amount=-1 +kerning first=372 second=269 amount=-1 +kerning first=225 second=8221 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=8221 second=112 amount=-1 +kerning first=923 second=354 amount=-1 +kerning first=376 second=103 amount=-1 +kerning first=8216 second=916 amount=-1 +kerning first=104 second=356 amount=-1 +kerning first=910 second=213 amount=-1 +kerning first=1058 second=1241 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=337 second=84 amount=-1 +kerning first=932 second=949 amount=-1 +kerning first=915 second=262 amount=-1 +kerning first=86 second=243 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=319 second=220 amount=-1 +kerning first=8221 second=923 amount=-1 +kerning first=8204 second=8216 amount=-1 +kerning first=65 second=936 amount=-1 +kerning first=1033 second=8217 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=313 second=8217 amount=-2 +kerning first=939 second=211 amount=-1 +kerning first=1058 second=1106 amount=1 +kerning first=214 second=8230 amount=-1 +kerning first=243 second=8217 amount=-1 +kerning first=372 second=197 amount=-1 +kerning first=933 second=945 amount=-1 +kerning first=40 second=376 amount=1 +kerning first=225 second=354 amount=-1 +kerning first=932 second=84 amount=1 +kerning first=354 second=363 amount=-1 +kerning first=358 second=308 amount=-1 +kerning first=376 second=256 amount=-1 +kerning first=248 second=84 amount=-1 +kerning first=356 second=971 amount=-1 +kerning first=218 second=913 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=1028 second=1026 amount=1 +kerning first=87 second=99 amount=-1 +kerning first=1043 second=8212 amount=-1 +kerning first=356 second=252 amount=-1 +kerning first=368 second=65 amount=-1 +kerning first=362 second=192 amount=-1 +kerning first=356 second=173 amount=-1 +kerning first=932 second=378 amount=-1 +kerning first=104 second=8217 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=8221 second=326 amount=-1 +kerning first=358 second=369 amount=-1 +kerning first=370 second=923 amount=-1 +kerning first=218 second=258 amount=-1 +kerning first=354 second=943 amount=-1 +kerning first=8220 second=941 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=234 second=84 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=376 second=171 amount=-1 +kerning first=76 second=360 amount=-1 +kerning first=8216 second=949 amount=-1 +kerning first=1168 second=1054 amount=-1 +kerning first=261 second=356 amount=-1 +kerning first=933 second=198 amount=-2 +kerning first=915 second=332 amount=-1 +kerning first=173 second=1059 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=939 second=970 amount=-1 +kerning first=285 second=84 amount=-1 +kerning first=358 second=942 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=212 second=46 amount=-1 +kerning first=358 second=242 amount=-1 +kerning first=8216 second=84 amount=1 +kerning first=372 second=235 amount=-1 +kerning first=932 second=265 amount=-1 +kerning first=933 second=944 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=260 second=89 amount=-1 +kerning first=40 second=358 amount=1 +kerning first=65 second=372 amount=-1 +kerning first=932 second=118 amount=-1 +kerning first=315 second=932 amount=-1 +kerning first=8220 second=916 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=246 second=932 amount=-1 +kerning first=1034 second=1058 amount=-1 +kerning first=910 second=923 amount=-2 +kerning first=45 second=932 amount=-1 +kerning first=360 second=260 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=319 second=927 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=101 second=358 amount=-1 +kerning first=261 second=8217 amount=-1 +kerning first=8211 second=1035 amount=-1 +kerning first=958 second=955 amount=1 +kerning first=272 second=8230 amount=-1 +kerning first=931 second=67 amount=-1 +kerning first=932 second=195 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=1043 second=58 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=364 second=256 amount=-1 +kerning first=319 second=286 amount=-1 +kerning first=260 second=34 amount=-1 +kerning first=1168 second=1088 amount=-1 +kerning first=939 second=264 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=76 second=39 amount=-2 +kerning first=933 second=194 amount=-2 +kerning first=1113 second=1091 amount=-1 +kerning first=89 second=125 amount=1 +kerning first=372 second=41 amount=1 +kerning first=331 second=356 amount=-1 +kerning first=8216 second=265 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=84 second=312 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=933 second=59 amount=-1 +kerning first=932 second=345 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=319 second=8221 amount=-2 +kerning first=8221 second=281 amount=-1 +kerning first=317 second=372 amount=-1 +kerning first=932 second=8230 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=354 second=951 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=242 second=8221 amount=-1 +kerning first=8220 second=949 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=939 second=8211 amount=-1 +kerning first=46 second=8221 amount=-2 +kerning first=1058 second=1028 amount=-1 +kerning first=193 second=376 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=915 second=199 amount=-1 +kerning first=1168 second=44 amount=-1 +kerning first=1028 second=1095 amount=-1 +kerning first=8250 second=1026 amount=-1 +kerning first=221 second=932 amount=1 +kerning first=123 second=356 amount=1 +kerning first=1168 second=1032 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=8216 second=195 amount=-1 +kerning first=1098 second=8221 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=915 second=288 amount=-1 +kerning first=936 second=913 amount=-1 +kerning first=354 second=86 amount=1 +kerning first=173 second=1038 amount=-1 +kerning first=8220 second=84 amount=1 +kerning first=313 second=268 amount=-1 +kerning first=932 second=232 amount=-1 +kerning first=929 second=916 amount=-1 +kerning first=902 second=356 amount=-1 +kerning first=376 second=927 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=86 second=263 amount=-1 +kerning first=331 second=8217 amount=-1 +kerning first=8222 second=1063 amount=-1 +kerning first=319 second=354 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=376 second=192 amount=-1 +kerning first=936 second=258 amount=-1 +kerning first=242 second=354 amount=-1 +kerning first=1027 second=1044 amount=-1 +kerning first=932 second=97 amount=-1 +kerning first=1065 second=1112 amount=1 +kerning first=376 second=286 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=87 second=259 amount=-1 +kerning first=1059 second=1115 amount=1 +kerning first=306 second=125 amount=1 +kerning first=221 second=347 amount=-1 +kerning first=8217 second=913 amount=-1 +kerning first=356 second=312 amount=-1 +kerning first=8216 second=8230 amount=-2 +kerning first=218 second=196 amount=-1 +kerning first=85 second=65 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=358 second=380 amount=-1 +kerning first=8217 second=258 amount=-1 +kerning first=197 second=936 amount=-1 +kerning first=317 second=171 amount=-1 +kerning first=915 second=965 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=87 second=923 amount=-1 +kerning first=193 second=358 amount=-1 +kerning first=902 second=8217 amount=-1 +kerning first=271 second=104 amount=1 +kerning first=354 second=271 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=8220 second=265 amount=-1 +kerning first=8217 second=307 amount=-1 +kerning first=195 second=932 amount=-1 +kerning first=354 second=120 amount=-1 +kerning first=8212 second=354 amount=-1 +kerning first=70 second=117 amount=-1 +kerning first=84 second=962 amount=-1 +kerning first=326 second=84 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=8221 second=244 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=358 second=358 amount=1 +kerning first=8216 second=97 amount=-1 +kerning first=34 second=46 amount=-2 +kerning first=1043 second=1116 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=321 second=8249 amount=-1 +kerning first=916 second=356 amount=-1 +kerning first=84 second=372 amount=1 +kerning first=211 second=8230 amount=-1 +kerning first=354 second=932 amount=1 +kerning first=360 second=197 amount=-1 +kerning first=358 second=267 amount=-1 +kerning first=920 second=44 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=376 second=354 amount=1 +kerning first=315 second=213 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=358 second=119 amount=-1 +kerning first=8220 second=195 amount=-1 +kerning first=45 second=939 amount=-1 +kerning first=217 second=256 amount=-1 +kerning first=1044 second=1112 amount=1 +kerning first=923 second=87 amount=-1 +kerning first=1038 second=1115 amount=1 +kerning first=89 second=260 amount=-1 +kerning first=1026 second=1026 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=354 second=65 amount=-1 +kerning first=86 second=234 amount=-1 +kerning first=364 second=192 amount=-1 +kerning first=319 second=211 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=270 second=44 amount=-1 +kerning first=321 second=334 amount=-1 +kerning first=86 second=354 amount=1 +kerning first=1058 second=1097 amount=-1 +kerning first=271 second=314 amount=1 +kerning first=368 second=923 amount=-1 +kerning first=221 second=44 amount=-2 +kerning first=1043 second=1060 amount=-1 +kerning first=8230 second=8216 amount=-2 +kerning first=1168 second=1101 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=87 second=229 amount=-1 +kerning first=8221 second=260 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=373 second=8230 amount=-1 +kerning first=913 second=376 amount=-1 +kerning first=916 second=8217 amount=-1 +kerning first=197 second=372 amount=-1 +kerning first=259 second=356 amount=-1 +kerning first=89 second=8249 amount=-1 +kerning first=8220 second=8230 amount=-2 +kerning first=356 second=962 amount=-1 +kerning first=934 second=935 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=40 second=1066 amount=1 +kerning first=281 second=84 amount=-1 +kerning first=932 second=361 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=321 second=216 amount=-1 +kerning first=356 second=372 amount=1 +kerning first=354 second=966 amount=-1 +kerning first=329 second=8221 amount=-1 +kerning first=358 second=343 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=256 second=376 amount=-1 +kerning first=376 second=289 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=354 second=238 amount=-1 +kerning first=910 second=940 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=313 second=932 amount=-1 +kerning first=915 second=210 amount=-1 +kerning first=8211 second=356 amount=-1 +kerning first=243 second=932 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=370 second=260 amount=-1 +kerning first=34 second=198 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=932 second=973 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=8220 second=97 amount=-1 +kerning first=1040 second=1051 amount=1 +kerning first=317 second=927 amount=-1 +kerning first=932 second=251 amount=-1 +kerning first=332 second=8230 amount=-1 +kerning first=936 second=196 amount=-1 +kerning first=358 second=965 amount=-1 +kerning first=259 second=8217 amount=-1 +kerning first=8222 second=87 amount=-1 +kerning first=1058 second=8211 amount=-1 +kerning first=255 second=8230 amount=-1 +kerning first=929 second=195 amount=-1 +kerning first=358 second=237 amount=-1 +kerning first=372 second=226 amount=-1 +kerning first=923 second=933 amount=-2 +kerning first=194 second=356 amount=-1 +kerning first=329 second=354 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=933 second=942 amount=-1 +kerning first=1027 second=1057 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=104 second=932 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=356 second=256 amount=-1 +kerning first=317 second=286 amount=-1 +kerning first=932 second=110 amount=-1 +kerning first=913 second=358 amount=-1 +kerning first=258 second=34 amount=-1 +kerning first=1107 second=8230 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=39 second=46 amount=-2 +kerning first=87 second=281 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=1169 second=8211 amount=-1 +kerning first=87 second=125 amount=1 +kerning first=950 second=93 amount=1 +kerning first=8249 second=89 amount=-1 +kerning first=8250 second=376 amount=-1 +kerning first=8217 second=196 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=910 second=260 amount=-2 +kerning first=1034 second=8221 amount=-1 +kerning first=256 second=358 amount=-1 +kerning first=915 second=971 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=317 second=8221 amount=-2 +kerning first=321 second=284 amount=-1 +kerning first=376 second=371 amount=-1 +kerning first=1058 second=1076 amount=-2 +kerning first=929 second=8230 amount=-2 +kerning first=319 second=264 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=244 second=8221 amount=-1 +kerning first=955 second=8217 amount=-1 +kerning first=44 second=8221 amount=-2 +kerning first=1168 second=1080 amount=-1 +kerning first=915 second=173 amount=-1 +kerning first=354 second=299 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=1118 second=44 amount=-1 +kerning first=34 second=194 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=195 second=939 amount=-2 +kerning first=939 second=45 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=336 second=46 amount=-1 +kerning first=933 second=262 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=1043 second=8250 amount=-1 +kerning first=1169 second=1076 amount=-1 +kerning first=932 second=328 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=319 second=8211 amount=-1 +kerning first=261 second=932 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=220 second=65 amount=-1 +kerning first=8221 second=269 amount=-1 +kerning first=358 second=301 amount=-1 +kerning first=217 second=192 amount=-1 +kerning first=372 second=283 amount=-1 +kerning first=244 second=354 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=910 second=948 amount=-1 +kerning first=221 second=923 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1113 second=8217 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=8250 second=358 amount=-1 +kerning first=123 second=86 amount=1 +kerning first=932 second=954 amount=-1 +kerning first=8217 second=233 amount=-1 +kerning first=910 second=334 amount=-1 +kerning first=932 second=228 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=8217 second=356 amount=1 +kerning first=8221 second=197 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=1058 second=1111 amount=-1 +kerning first=39 second=198 amount=-1 +kerning first=902 second=86 amount=-1 +kerning first=196 second=936 amount=-1 +kerning first=1027 second=1035 amount=1 +kerning first=321 second=8216 amount=-2 +kerning first=1168 second=1115 amount=1 +kerning first=87 second=244 amount=-1 +kerning first=319 second=87 amount=-1 +kerning first=85 second=923 amount=-1 +kerning first=354 second=373 amount=-1 +kerning first=70 second=367 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=293 second=356 amount=-1 +kerning first=939 second=79 amount=-1 +kerning first=933 second=332 amount=-1 +kerning first=192 second=932 amount=-1 +kerning first=910 second=216 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=328 second=84 amount=-1 +kerning first=8221 second=341 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=932 second=248 amount=-1 +kerning first=354 second=974 amount=-1 +kerning first=84 second=8221 amount=1 +kerning first=354 second=249 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=939 second=8212 amount=-1 +kerning first=70 second=250 amount=-1 +kerning first=370 second=197 amount=-1 +kerning first=376 second=8211 amount=-1 +kerning first=8217 second=8217 amount=-1 +kerning first=331 second=932 amount=-1 +kerning first=160 second=902 amount=-1 +kerning first=1168 second=1059 amount=1 +kerning first=313 second=213 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=8216 second=228 amount=-1 +kerning first=333 second=358 amount=-1 +kerning first=219 second=256 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=84 second=961 amount=-1 +kerning first=366 second=193 amount=-1 +kerning first=939 second=912 amount=-1 +kerning first=358 second=971 amount=-1 +kerning first=293 second=8217 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=356 second=192 amount=-1 +kerning first=8221 second=235 amount=-1 +kerning first=260 second=356 amount=-1 +kerning first=317 second=211 amount=-1 +kerning first=39 second=194 amount=-1 +kerning first=358 second=252 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=932 second=279 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=358 second=173 amount=-1 +kerning first=123 second=932 amount=1 +kerning first=84 second=354 amount=1 +kerning first=354 second=923 amount=-1 +kerning first=229 second=84 amount=-1 +kerning first=1034 second=1063 amount=-1 +kerning first=358 second=111 amount=-1 +kerning first=339 second=358 amount=-1 +kerning first=372 second=101 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=76 second=262 amount=-1 +kerning first=196 second=372 amount=-1 +kerning first=1028 second=1066 amount=1 +kerning first=902 second=932 amount=-1 +kerning first=910 second=197 amount=-2 +kerning first=8216 second=248 amount=-1 +kerning first=321 second=212 amount=-1 +kerning first=86 second=225 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=910 second=284 amount=-1 +kerning first=279 second=84 amount=-1 +kerning first=46 second=933 amount=-1 +kerning first=1068 second=1035 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=356 second=8221 amount=1 +kerning first=939 second=193 amount=-2 +kerning first=947 second=8230 amount=-1 +kerning first=235 second=358 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=295 second=8221 amount=-1 +kerning first=45 second=1059 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=1168 second=1093 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=933 second=199 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=939 second=58 amount=-1 +kerning first=969 second=39 amount=-1 +kerning first=74 second=93 amount=1 +kerning first=368 second=260 amount=-1 +kerning first=372 second=46 amount=-1 +kerning first=356 second=961 amount=-1 +kerning first=1040 second=1098 amount=-1 +kerning first=291 second=358 amount=-1 +kerning first=34 second=308 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=933 second=288 amount=-1 +kerning first=910 second=187 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=1043 second=8230 amount=-1 +kerning first=40 second=1058 amount=1 +kerning first=334 second=8230 amount=-1 +kerning first=97 second=358 amount=-1 +kerning first=221 second=125 amount=1 +kerning first=376 second=273 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=8216 second=1113 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=356 second=354 amount=1 +kerning first=76 second=376 amount=-1 +kerning first=295 second=354 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=957 second=44 amount=-1 +kerning first=1058 second=45 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=8212 second=933 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=8220 second=228 amount=-1 +kerning first=910 second=963 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=1168 second=1038 amount=1 +kerning first=76 second=85 amount=-1 +kerning first=932 second=969 amount=-1 +kerning first=1090 second=173 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=86 second=273 amount=-1 +kerning first=916 second=932 amount=-1 +kerning first=171 second=376 amount=-1 +kerning first=932 second=241 amount=-1 +kerning first=1169 second=45 amount=-1 +kerning first=306 second=41 amount=1 +kerning first=86 second=277 amount=-1 +kerning first=358 second=224 amount=-1 +kerning first=319 second=366 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=1168 second=8249 amount=-1 +kerning first=933 second=965 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=927 second=8230 amount=-1 +kerning first=317 second=264 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=241 second=8221 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=40 second=372 amount=1 +kerning first=87 second=269 amount=-1 +kerning first=8220 second=248 amount=-1 +kerning first=192 second=939 amount=-2 +kerning first=946 second=39 amount=-1 +kerning first=321 second=920 amount=-1 +kerning first=931 second=262 amount=-1 +kerning first=932 second=913 amount=-1 +kerning first=84 second=371 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=76 second=358 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=915 second=962 amount=-1 +kerning first=321 second=266 amount=-1 +kerning first=259 second=932 amount=-1 +kerning first=317 second=8211 amount=-1 +kerning first=358 second=339 amount=-1 +kerning first=218 second=65 amount=-1 +kerning first=372 second=198 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=219 second=192 amount=-1 +kerning first=45 second=1038 amount=-1 +kerning first=932 second=258 amount=-1 +kerning first=241 second=354 amount=-1 +kerning first=8216 second=969 amount=-1 +kerning first=1168 second=1072 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=319 second=45 amount=-1 +kerning first=1036 second=1033 amount=1 +kerning first=354 second=281 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=160 second=221 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=220 second=923 amount=-1 +kerning first=354 second=125 amount=1 +kerning first=315 second=8249 amount=-1 +kerning first=84 second=970 amount=-1 +kerning first=171 second=358 amount=-1 +kerning first=8204 second=8218 amount=-2 +kerning first=932 second=307 amount=-1 +kerning first=8220 second=1113 amount=-1 +kerning first=1058 second=8212 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=358 second=312 amount=-1 +kerning first=232 second=356 amount=-1 +kerning first=160 second=84 amount=-1 +kerning first=376 second=239 amount=1 +kerning first=1027 second=1083 amount=-1 +kerning first=8211 second=932 amount=-1 +kerning first=103 second=354 amount=-1 +kerning first=89 second=920 amount=-1 +kerning first=39 second=308 amount=-1 +kerning first=76 second=199 amount=-1 +kerning first=358 second=275 amount=-1 +kerning first=372 second=261 amount=-1 +kerning first=193 second=936 amount=-1 +kerning first=8221 second=109 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=76 second=288 amount=-1 +kerning first=8216 second=913 amount=-1 +kerning first=1169 second=8212 amount=-1 +kerning first=289 second=356 amount=-1 +kerning first=902 second=939 amount=-2 +kerning first=910 second=212 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=315 second=334 amount=-1 +kerning first=931 second=332 amount=-1 +kerning first=932 second=946 amount=-1 +kerning first=98 second=356 amount=-1 +kerning first=194 second=932 amount=-1 +kerning first=915 second=256 amount=-2 +kerning first=86 second=239 amount=1 +kerning first=356 second=371 amount=-1 +kerning first=65 second=933 amount=-2 +kerning first=102 second=44 amount=-1 +kerning first=8216 second=258 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=257 second=8221 amount=-1 +kerning first=111 second=84 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=372 second=194 amount=-1 +kerning first=8216 second=1035 amount=1 +kerning first=86 second=100 amount=-1 +kerning first=1168 second=1107 amount=-1 +kerning first=87 second=235 amount=-1 +kerning first=319 second=79 amount=-1 +kerning first=368 second=197 amount=-1 +kerning first=933 second=210 amount=-1 +kerning first=939 second=71 amount=-1 +kerning first=315 second=216 amount=-1 +kerning first=356 second=970 amount=-1 +kerning first=335 second=358 amount=-1 +kerning first=376 second=45 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=85 second=260 amount=-1 +kerning first=1057 second=1051 amount=1 +kerning first=362 second=193 amount=-1 +kerning first=8216 second=8220 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=1075 second=8211 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=257 second=354 amount=-1 +kerning first=319 second=8212 amount=-1 +kerning first=8221 second=324 amount=-1 +kerning first=98 second=8217 amount=-1 +kerning first=354 second=940 amount=-1 +kerning first=8220 second=969 amount=-1 +kerning first=372 second=337 amount=-1 +kerning first=1058 second=58 amount=-1 +kerning first=84 second=8211 amount=-1 +kerning first=915 second=947 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=910 second=972 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=228 second=84 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=310 second=74 amount=1 +kerning first=196 second=8221 amount=-1 +kerning first=193 second=372 amount=-1 +kerning first=1026 second=1066 amount=-1 +kerning first=916 second=939 amount=-1 +kerning first=939 second=941 amount=-1 +kerning first=932 second=382 amount=-1 +kerning first=358 second=962 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=87 second=41 amount=1 +kerning first=8217 second=271 amount=-1 +kerning first=1033 second=1059 amount=-1 +kerning first=277 second=84 amount=-1 +kerning first=358 second=243 amount=-1 +kerning first=44 second=933 amount=-1 +kerning first=372 second=231 amount=-1 +kerning first=1043 second=1099 amount=-1 +kerning first=81 second=44 amount=-1 +kerning first=1168 second=187 amount=-1 +kerning first=1066 second=1035 amount=-1 +kerning first=933 second=971 amount=-1 +kerning first=260 second=86 amount=-1 +kerning first=1075 second=1076 amount=-1 +kerning first=8230 second=39 amount=-2 +kerning first=233 second=358 amount=-1 +kerning first=271 second=322 amount=1 +kerning first=932 second=115 amount=-1 +kerning first=358 second=372 amount=1 +kerning first=936 second=65 amount=-1 +kerning first=8220 second=913 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=84 second=87 amount=1 +kerning first=933 second=173 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=358 second=103 amount=-1 +kerning first=372 second=93 amount=1 +kerning first=931 second=199 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=8249 second=356 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=910 second=920 amount=-1 +kerning first=1028 second=1058 amount=1 +kerning first=8217 second=932 amount=1 +kerning first=354 second=260 amount=-1 +kerning first=1114 second=8221 amount=-1 +kerning first=315 second=284 amount=-1 +kerning first=8220 second=258 amount=-1 +kerning first=931 second=288 amount=-1 +kerning first=287 second=358 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=70 second=46 amount=-2 +kerning first=939 second=916 amount=-2 +kerning first=910 second=266 amount=-1 +kerning first=1068 second=8217 amount=-1 +kerning first=932 second=196 amount=-1 +kerning first=8220 second=1035 amount=1 +kerning first=84 second=305 amount=-1 +kerning first=356 second=8211 amount=-1 +kerning first=293 second=932 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=1043 second=1044 amount=-1 +kerning first=376 second=8212 amount=-1 +kerning first=8217 second=65 amount=-1 +kerning first=321 second=67 amount=-1 +kerning first=913 second=936 amount=-1 +kerning first=1168 second=1085 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=358 second=256 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=8220 second=8220 amount=-1 +kerning first=1040 second=1090 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=8221 second=331 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=8216 second=115 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=932 second=333 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=8211 second=939 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=8221 second=283 amount=-1 +kerning first=256 second=936 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=354 second=948 amount=-1 +kerning first=76 second=210 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=356 second=87 amount=1 +kerning first=915 second=927 amount=-1 +kerning first=939 second=8250 amount=-1 +kerning first=358 second=171 amount=-1 +kerning first=910 second=953 amount=-1 +kerning first=951 second=8217 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=337 second=356 amount=-1 +kerning first=915 second=192 amount=-2 +kerning first=216 second=8230 amount=-1 +kerning first=260 second=932 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=8216 second=196 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=194 second=939 amount=-2 +kerning first=932 second=959 amount=-1 +kerning first=8217 second=238 amount=-1 +kerning first=915 second=286 amount=-1 +kerning first=171 second=910 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=315 second=8216 amount=-2 +kerning first=939 second=949 amount=-1 +kerning first=932 second=233 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=929 second=913 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1033 second=1038 amount=-1 +kerning first=321 second=360 amount=-1 +kerning first=86 second=257 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=932 second=356 amount=1 +kerning first=376 second=193 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=86 second=113 amount=-1 +kerning first=1168 second=1169 amount=-1 +kerning first=939 second=336 amount=-1 +kerning first=360 second=198 amount=-1 +kerning first=89 second=349 amount=-1 +kerning first=248 second=356 amount=-1 +kerning first=929 second=258 amount=-1 +kerning first=936 second=44 amount=-1 +kerning first=85 second=197 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=40 second=354 amount=1 +kerning first=70 second=198 amount=-1 +kerning first=376 second=58 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=218 second=923 amount=-1 +kerning first=913 second=372 amount=-1 +kerning first=313 second=8249 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=337 second=8217 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=8221 second=349 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=234 second=356 amount=-1 +kerning first=932 second=181 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=101 second=354 amount=-1 +kerning first=356 second=121 amount=-1 +kerning first=76 second=173 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=197 second=933 amount=-2 +kerning first=915 second=961 amount=-2 +kerning first=939 second=338 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=8217 second=44 amount=-2 +kerning first=8216 second=959 amount=-1 +kerning first=256 second=372 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=932 second=8217 amount=1 +kerning first=70 second=261 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=285 second=356 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=248 second=8217 amount=-1 +kerning first=313 second=334 amount=-1 +kerning first=366 second=195 amount=-1 +kerning first=8220 second=115 amount=-1 +kerning first=1091 second=44 amount=-1 +kerning first=8216 second=356 amount=1 +kerning first=84 second=239 amount=-1 +kerning first=8217 second=299 amount=-1 +kerning first=8221 second=236 amount=-1 +kerning first=86 second=335 amount=-1 +kerning first=372 second=242 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=932 second=291 amount=-1 +kerning first=220 second=260 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=8216 second=1083 amount=-1 +kerning first=321 second=39 amount=-2 +kerning first=109 second=84 amount=-1 +kerning first=923 second=221 amount=-1 +kerning first=360 second=194 amount=-1 +kerning first=358 second=263 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=8221 second=101 amount=-1 +kerning first=317 second=79 amount=-1 +kerning first=354 second=197 amount=-1 +kerning first=315 second=212 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=910 second=934 amount=-1 +kerning first=8220 second=196 amount=-1 +kerning first=931 second=210 amount=-1 +kerning first=8204 second=376 amount=-1 +kerning first=923 second=84 amount=-1 +kerning first=313 second=216 amount=-1 +kerning first=1057 second=1098 amount=-1 +kerning first=308 second=125 amount=1 +kerning first=321 second=218 amount=-1 +kerning first=86 second=227 amount=-1 +kerning first=89 second=46 amount=-2 +kerning first=364 second=193 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=910 second=67 amount=-1 +kerning first=939 second=195 amount=-2 +kerning first=317 second=8212 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=358 second=192 amount=-1 +kerning first=1043 second=1057 amount=-1 +kerning first=1075 second=45 amount=-1 +kerning first=221 second=41 amount=1 +kerning first=1168 second=1098 amount=-1 +kerning first=87 second=226 amount=-1 +kerning first=319 second=71 amount=-1 +kerning first=939 second=290 amount=-1 +kerning first=213 second=44 amount=-1 +kerning first=354 second=341 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=225 second=84 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=8221 second=46 amount=-2 +kerning first=354 second=187 amount=-1 +kerning first=230 second=358 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=102 second=125 amount=2 +kerning first=8216 second=291 amount=-1 +kerning first=356 second=239 amount=-1 +kerning first=91 second=1026 amount=1 +kerning first=932 second=363 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=8221 second=297 amount=-1 +kerning first=354 second=963 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=195 second=8216 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=8220 second=959 amount=-1 +kerning first=376 second=287 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=227 second=358 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=939 second=8230 amount=-2 +kerning first=358 second=8221 amount=1 +kerning first=910 second=968 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=8204 second=358 amount=-1 +kerning first=915 second=211 amount=-1 +kerning first=931 second=173 amount=-1 +kerning first=8222 second=221 amount=-2 +kerning first=260 second=939 amount=-2 +kerning first=232 second=932 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=8220 second=356 amount=1 +kerning first=932 second=943 amount=-1 +kerning first=936 second=923 amount=-1 +kerning first=965 second=39 amount=-1 +kerning first=1026 second=1058 amount=-1 +kerning first=1059 second=46 amount=-2 +kerning first=313 second=284 amount=-1 +kerning first=8217 second=160 amount=-1 +kerning first=932 second=245 amount=-1 +kerning first=275 second=358 amount=-1 +kerning first=358 second=961 amount=-1 +kerning first=1058 second=8250 amount=-1 +kerning first=8220 second=1083 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=68 second=46 amount=-1 +kerning first=1066 second=8217 amount=-1 +kerning first=358 second=234 amount=-1 +kerning first=929 second=196 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=950 second=955 amount=1 +kerning first=8217 second=112 amount=-1 +kerning first=1027 second=1054 amount=-1 +kerning first=933 second=962 amount=-1 +kerning first=289 second=932 amount=-1 +kerning first=315 second=920 amount=-1 +kerning first=358 second=354 amount=1 +kerning first=98 second=932 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=968 second=34 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=87 second=283 amount=-1 +kerning first=376 second=71 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=8217 second=923 amount=-1 +kerning first=315 second=266 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=1075 second=8212 amount=-1 +kerning first=354 second=41 amount=1 +kerning first=356 second=303 amount=-1 +kerning first=84 second=8212 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=915 second=970 amount=-1 +kerning first=8221 second=198 amount=-1 +kerning first=910 second=46 amount=-2 +kerning first=1043 second=1035 amount=1 +kerning first=1168 second=1077 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=326 second=356 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=258 second=932 amount=-1 +kerning first=84 second=912 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=220 second=197 amount=-1 +kerning first=933 second=256 amount=-2 +kerning first=1038 second=46 amount=-2 +kerning first=84 second=253 amount=-1 +kerning first=313 second=8216 amount=-2 +kerning first=8217 second=326 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=160 second=89 amount=-1 +kerning first=372 second=358 amount=1 +kerning first=376 second=246 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=358 second=289 amount=-1 +kerning first=217 second=193 amount=-1 +kerning first=372 second=267 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=8221 second=114 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=370 second=198 amount=-1 +kerning first=910 second=945 amount=-1 +kerning first=934 second=44 amount=-1 +kerning first=221 second=920 amount=-1 +kerning first=91 second=106 amount=1 +kerning first=70 second=308 amount=-1 +kerning first=913 second=8221 amount=-1 +kerning first=91 second=1095 amount=-1 +kerning first=932 second=951 amount=-1 +kerning first=86 second=246 amount=-1 +kerning first=89 second=59 amount=-1 +kerning first=915 second=264 amount=-1 +kerning first=173 second=1026 amount=-1 +kerning first=8211 second=1059 amount=-1 +kerning first=319 second=221 amount=-1 +kerning first=1040 second=1026 amount=-1 +kerning first=326 second=8217 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=356 second=8212 amount=-1 +kerning first=8221 second=194 amount=-1 +kerning first=939 second=214 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=1027 second=44 amount=-1 +kerning first=319 second=336 amount=-1 +kerning first=8249 second=932 amount=-1 +kerning first=196 second=933 amount=-2 +kerning first=1027 second=1032 amount=-1 +kerning first=319 second=84 amount=-1 +kerning first=932 second=86 amount=1 +kerning first=354 second=367 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=70 second=369 amount=-1 +kerning first=242 second=84 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=358 second=74 amount=-1 +kerning first=1059 second=1103 amount=-1 +kerning first=356 second=912 amount=-1 +kerning first=915 second=8211 amount=-1 +kerning first=281 second=356 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=913 second=354 amount=-1 +kerning first=934 second=939 amount=-1 +kerning first=87 second=101 amount=-1 +kerning first=910 second=198 amount=-2 +kerning first=356 second=253 amount=-1 +kerning first=362 second=195 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=319 second=338 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=8221 second=337 amount=-1 +kerning first=932 second=230 amount=-1 +kerning first=358 second=371 amount=-1 +kerning first=218 second=260 amount=-1 +kerning first=354 second=972 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=370 second=194 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=910 second=944 amount=-1 +kerning first=76 second=372 amount=-1 +kerning first=8212 second=221 amount=-1 +kerning first=256 second=354 amount=-1 +kerning first=313 second=212 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=1059 second=59 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=89 second=93 amount=1 +kerning first=324 second=358 amount=-1 +kerning first=939 second=973 amount=-1 +kerning first=358 second=970 amount=-1 +kerning first=8212 second=84 amount=-1 +kerning first=1058 second=8230 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=356 second=193 amount=-1 +kerning first=904 second=912 amount=1 +kerning first=8217 second=281 amount=-1 +kerning first=8221 second=231 amount=-1 +kerning first=112 second=358 amount=-1 +kerning first=358 second=353 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=932 second=271 amount=-1 +kerning first=337 second=932 amount=-1 +kerning first=91 second=376 amount=1 +kerning first=932 second=120 amount=-1 +kerning first=376 second=336 amount=-1 +kerning first=317 second=71 amount=-1 +kerning first=214 second=44 amount=-1 +kerning first=376 second=84 amount=1 +kerning first=1169 second=8230 amount=-1 +kerning first=910 second=194 amount=-2 +kerning first=1057 second=1090 amount=-1 +kerning first=1038 second=1103 amount=-1 +kerning first=8216 second=230 amount=-1 +kerning first=932 second=932 amount=1 +kerning first=187 second=89 amount=-1 +kerning first=8211 second=1038 amount=-1 +kerning first=315 second=67 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=248 second=932 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=935 second=970 amount=1 +kerning first=910 second=59 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=319 second=290 amount=-1 +kerning first=192 second=8216 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=933 second=927 amount=-1 +kerning first=908 second=8230 amount=-1 +kerning first=224 second=358 amount=-1 +kerning first=86 second=84 amount=1 +kerning first=1168 second=1090 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=932 second=65 amount=-1 +kerning first=89 second=285 amount=-1 +kerning first=76 second=171 amount=-1 +kerning first=933 second=192 amount=-2 +kerning first=258 second=939 amount=-2 +kerning first=1040 second=1095 amount=-1 +kerning first=234 second=932 amount=-1 +kerning first=306 second=93 amount=1 +kerning first=8216 second=271 amount=-1 +kerning first=933 second=286 amount=-1 +kerning first=1038 second=59 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=283 second=358 amount=-1 +kerning first=333 second=8221 amount=-1 +kerning first=932 second=347 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=917 second=912 amount=1 +kerning first=84 second=287 amount=-1 +kerning first=8221 second=285 amount=-1 +kerning first=91 second=358 amount=1 +kerning first=354 second=953 amount=-1 +kerning first=76 second=220 amount=-1 +kerning first=372 second=301 amount=1 +kerning first=285 second=932 amount=-1 +kerning first=376 second=265 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=358 second=8211 amount=-1 +kerning first=313 second=920 amount=-1 +kerning first=1168 second=46 amount=-1 +kerning first=8216 second=932 amount=1 +kerning first=87 second=198 amount=-1 +kerning first=89 second=308 amount=-1 +kerning first=315 second=360 amount=-1 +kerning first=932 second=966 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=1059 second=1026 amount=1 +kerning first=313 second=266 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=939 second=954 amount=-1 +kerning first=932 second=238 amount=-1 +kerning first=333 second=354 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=86 second=265 amount=-1 +kerning first=358 second=225 amount=-1 +kerning first=8216 second=65 amount=-1 +kerning first=319 second=368 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=902 second=8216 amount=-1 +kerning first=376 second=195 amount=-1 +kerning first=8249 second=939 amount=-1 +kerning first=936 second=260 amount=-1 +kerning first=933 second=961 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=272 second=44 amount=-1 +kerning first=8221 second=308 amount=-1 +kerning first=932 second=99 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=1041 second=1035 amount=-1 +kerning first=329 second=84 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=358 second=87 amount=1 +kerning first=87 second=261 amount=-1 +kerning first=8220 second=230 amount=-1 +kerning first=328 second=356 amount=-1 +kerning first=8216 second=347 amount=-1 +kerning first=221 second=349 amount=-1 +kerning first=218 second=197 amount=-1 +kerning first=160 second=8220 amount=-1 +kerning first=339 second=354 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=173 second=376 amount=-1 +kerning first=8217 second=260 amount=-1 +kerning first=321 second=262 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=358 second=305 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=97 second=8221 amount=-1 +kerning first=219 second=193 amount=-1 +kerning first=376 second=8230 amount=-2 +kerning first=8216 second=966 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=368 second=198 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=932 second=44 amount=-1 +kerning first=235 second=354 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=315 second=39 amount=-2 +kerning first=84 second=941 amount=-1 +kerning first=102 second=8216 amount=1 +kerning first=34 second=256 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=8221 second=242 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1038 second=1026 amount=1 +kerning first=1090 second=8211 amount=-1 +kerning first=328 second=8217 amount=-1 +kerning first=358 second=273 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=932 second=299 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=76 second=927 amount=-1 +kerning first=291 second=354 amount=-1 +kerning first=308 second=41 amount=1 +kerning first=86 second=8230 amount=-1 +kerning first=229 second=356 amount=-1 +kerning first=317 second=336 amount=-1 +kerning first=354 second=934 amount=-1 +kerning first=358 second=277 amount=-1 +kerning first=8220 second=932 amount=1 +kerning first=97 second=354 amount=-1 +kerning first=920 second=46 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=193 second=933 amount=-2 +kerning first=317 second=84 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=358 second=121 amount=-1 +kerning first=87 second=337 amount=-1 +kerning first=942 second=8221 amount=-1 +kerning first=372 second=111 amount=-1 +kerning first=244 second=84 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=1111 second=1115 amount=1 +kerning first=923 second=89 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=279 second=356 amount=-1 +kerning first=321 second=376 amount=-1 +kerning first=86 second=232 amount=-1 +kerning first=364 second=195 amount=-1 +kerning first=8220 second=65 amount=-1 +kerning first=319 second=214 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=84 second=916 amount=-1 +kerning first=173 second=358 amount=-1 +kerning first=102 second=41 amount=2 +kerning first=915 second=45 amount=-1 +kerning first=317 second=338 amount=-1 +kerning first=321 second=332 amount=-1 +kerning first=270 second=46 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=8216 second=44 amount=-2 +kerning first=271 second=316 amount=1 +kerning first=221 second=46 amount=-2 +kerning first=1090 second=1076 amount=-1 +kerning first=8216 second=1032 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=86 second=97 amount=-1 +kerning first=87 second=231 amount=-1 +kerning first=368 second=194 amount=-1 +kerning first=1168 second=1103 amount=-1 +kerning first=354 second=349 amount=-1 +kerning first=76 second=8221 amount=-2 +kerning first=933 second=211 amount=-1 +kerning first=8220 second=347 amount=-1 +kerning first=229 second=8217 amount=-1 +kerning first=1059 second=1095 amount=-1 +kerning first=356 second=941 amount=-1 +kerning first=923 second=34 amount=-1 +kerning first=87 second=93 amount=1 +kerning first=356 second=246 amount=-1 +kerning first=913 second=87 amount=-1 +kerning first=1056 second=8230 amount=-2 +kerning first=932 second=373 amount=-1 +kerning first=1027 second=1115 amount=1 +kerning first=110 second=358 amount=-1 +kerning first=354 second=968 amount=-1 +kerning first=358 second=351 amount=-1 +kerning first=8220 second=966 amount=-1 +kerning first=326 second=932 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=354 second=236 amount=-1 +kerning first=1058 second=1044 amount=-1 +kerning first=910 second=942 amount=-1 +kerning first=1168 second=59 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=211 second=44 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=366 second=913 amount=-1 +kerning first=932 second=974 amount=-1 +kerning first=256 second=87 amount=-1 +kerning first=1026 second=1063 amount=-1 +kerning first=321 second=358 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=356 second=916 amount=-1 +kerning first=84 second=949 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=932 second=249 amount=-1 +kerning first=915 second=79 amount=-1 +kerning first=936 second=197 amount=-1 +kerning first=8222 second=89 amount=-2 +kerning first=313 second=67 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=922 second=308 amount=1 +kerning first=358 second=239 amount=-1 +kerning first=366 second=258 amount=-1 +kerning first=372 second=224 amount=-1 +kerning first=932 second=259 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=171 second=354 amount=-1 +kerning first=933 second=970 amount=-1 +kerning first=1027 second=1059 amount=1 +kerning first=1043 second=1096 amount=-1 +kerning first=317 second=290 amount=-1 +kerning first=194 second=8216 amount=-1 +kerning first=932 second=112 amount=-1 +kerning first=39 second=256 amount=-1 +kerning first=931 second=927 amount=-1 +kerning first=84 second=84 amount=1 +kerning first=226 second=358 amount=-1 +kerning first=358 second=100 amount=-1 +kerning first=929 second=65 amount=-1 +kerning first=915 second=8212 amount=-1 +kerning first=1038 second=1095 amount=-1 +kerning first=373 second=44 amount=-1 +kerning first=160 second=8222 amount=-2 +kerning first=931 second=286 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=91 second=1066 amount=1 +kerning first=932 second=923 amount=-1 +kerning first=8217 second=197 amount=-1 +kerning first=321 second=199 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=910 second=262 amount=-1 +kerning first=8220 second=44 amount=-2 +kerning first=939 second=913 amount=-2 +kerning first=335 second=8221 amount=-1 +kerning first=195 second=39 amount=-1 +kerning first=8220 second=1032 amount=-1 +kerning first=915 second=912 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=321 second=288 amount=-1 +kerning first=89 second=358 amount=1 +kerning first=1058 second=1078 amount=-1 +kerning first=372 second=339 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=281 second=932 amount=-1 +kerning first=8216 second=974 amount=-1 +kerning first=913 second=933 amount=-2 +kerning first=1168 second=1082 amount=-1 +kerning first=939 second=258 amount=-2 +kerning first=354 second=297 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=1118 second=46 amount=-1 +kerning first=34 second=192 amount=-1 +kerning first=1050 second=1033 amount=1 +kerning first=85 second=198 amount=-1 +kerning first=358 second=45 amount=-1 +kerning first=313 second=360 amount=-1 +kerning first=931 second=8221 amount=-1 +kerning first=356 second=949 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=8216 second=259 amount=-1 +kerning first=933 second=264 amount=-1 +kerning first=160 second=356 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=8217 second=341 amount=-1 +kerning first=8221 second=358 amount=1 +kerning first=1057 second=1026 amount=1 +kerning first=1100 second=1091 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=932 second=326 amount=-1 +kerning first=335 second=354 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=84 second=265 amount=-1 +kerning first=256 second=933 amount=-2 +kerning first=8221 second=267 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=354 second=945 amount=-1 +kerning first=332 second=44 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=358 second=303 amount=-1 +kerning first=217 second=195 amount=-1 +kerning first=372 second=275 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=356 second=84 amount=1 +kerning first=89 second=199 amount=-1 +kerning first=295 second=84 amount=-1 +kerning first=8216 second=923 amount=-1 +kerning first=915 second=193 amount=-2 +kerning first=1168 second=1026 amount=1 +kerning first=89 second=288 amount=-1 +kerning first=933 second=8211 amount=-1 +kerning first=221 second=194 amount=-1 +kerning first=8204 second=372 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=910 second=332 amount=-1 +kerning first=1107 second=44 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=939 second=946 amount=-1 +kerning first=111 second=356 amount=-1 +kerning first=932 second=229 amount=-1 +kerning first=915 second=58 amount=-1 +kerning first=1068 second=1059 amount=-1 +kerning first=84 second=195 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=221 second=59 amount=-1 +kerning first=1027 second=1038 amount=1 +kerning first=34 second=961 amount=-1 +kerning first=1168 second=1118 amount=-1 +kerning first=87 second=242 amount=-1 +kerning first=319 second=89 amount=-1 +kerning first=85 second=194 amount=-1 +kerning first=354 second=198 amount=-1 +kerning first=939 second=81 amount=-1 +kerning first=929 second=44 amount=-2 +kerning first=233 second=354 amount=-1 +kerning first=1059 second=1109 amount=-1 +kerning first=1028 second=1033 amount=1 +kerning first=221 second=337 amount=-1 +kerning first=313 second=39 amount=-2 +kerning first=1027 second=8249 amount=-1 +kerning first=1075 second=8230 amount=-1 +kerning first=173 second=910 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=356 second=265 amount=-1 +kerning first=8221 second=343 amount=-1 +kerning first=1035 second=1026 amount=-1 +kerning first=354 second=944 amount=-1 +kerning first=8220 second=974 amount=-1 +kerning first=287 second=354 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=84 second=8230 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=111 second=8217 amount=-1 +kerning first=228 second=356 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=915 second=957 amount=-1 +kerning first=1058 second=1057 amount=-1 +kerning first=358 second=8212 amount=-1 +kerning first=70 second=252 amount=-1 +kerning first=1090 second=45 amount=-1 +kerning first=45 second=1026 amount=-1 +kerning first=923 second=8220 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=319 second=34 amount=-2 +kerning first=271 second=98 amount=1 +kerning first=354 second=261 amount=-1 +kerning first=241 second=84 amount=-1 +kerning first=8216 second=229 amount=-1 +kerning first=8220 second=259 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=173 second=1066 amount=-1 +kerning first=46 second=34 amount=-2 +kerning first=354 second=114 amount=-1 +kerning first=1040 second=1066 amount=-1 +kerning first=366 second=196 amount=-1 +kerning first=277 second=356 amount=-1 +kerning first=358 second=912 amount=-1 +kerning first=8212 second=89 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=8221 second=237 amount=-1 +kerning first=356 second=195 amount=-1 +kerning first=317 second=214 amount=-1 +kerning first=39 second=192 amount=-1 +kerning first=358 second=253 amount=-1 +kerning first=372 second=243 amount=-1 +kerning first=932 second=281 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=221 second=93 amount=1 +kerning first=260 second=8216 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=932 second=125 amount=1 +kerning first=358 second=257 amount=-1 +kerning first=8220 second=923 amount=-1 +kerning first=103 second=84 amount=-1 +kerning first=245 second=358 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=354 second=194 amount=-1 +kerning first=358 second=113 amount=-1 +kerning first=931 second=211 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=228 second=8217 amount=-1 +kerning first=910 second=199 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=1038 second=1109 amount=-1 +kerning first=321 second=210 amount=-1 +kerning first=86 second=228 amount=-1 +kerning first=910 second=288 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=1068 second=1038 amount=-1 +kerning first=935 second=912 amount=1 +kerning first=356 second=8230 amount=-1 +kerning first=939 second=196 amount=-2 +kerning first=1058 second=1091 amount=-1 +kerning first=358 second=193 amount=-1 +kerning first=1043 second=1054 amount=-1 +kerning first=328 second=932 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=1168 second=1095 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=76 second=8211 amount=-1 +kerning first=372 second=256 amount=-1 +kerning first=1113 second=1098 amount=-1 diff --git a/assets/style/myriad-medium-small.fnt b/assets/style/myriad-medium-small.fnt new file mode 100644 index 00000000..7c582e6b --- /dev/null +++ b/assets/style/myriad-medium-small.fnt @@ -0,0 +1,3178 @@ +info face="MyriadPro-Regular" size=12 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=15 base=9 scaleW=128 scaleH=512 pages=1 packed=0 +page id=0 file="myriad-medium-small.png" +chars count=506 +char id=0 x=72 y=121 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=33 x=80 y=121 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=34 x=93 y=349 width=6 height=5 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=35 x=117 y=276 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=36 x=8 y=42 width=8 height=13 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=37 x=0 y=287 width=12 height=10 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=38 x=85 y=121 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=39 x=123 y=254 width=4 height=5 xoffset=-1 yoffset=0 xadvance=2 page=0 chnl=0 +char id=40 x=91 y=108 width=6 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=41 x=97 y=108 width=5 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=42 x=0 y=349 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=43 x=78 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=44 x=38 y=349 width=5 height=6 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=45 x=64 y=356 width=6 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=46 x=11 y=356 width=5 height=4 xoffset=-1 yoffset=6 xadvance=2 page=0 chnl=0 +char id=47 x=95 y=121 width=8 height=11 xoffset=-2 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=48 x=12 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=49 x=20 y=287 width=5 height=10 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=50 x=25 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=51 x=33 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=52 x=41 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=53 x=49 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=54 x=57 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=55 x=65 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=56 x=73 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=57 x=103 y=121 width=8 height=11 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=58 x=122 y=297 width=5 height=8 xoffset=-1 yoffset=2 xadvance=2 page=0 chnl=0 +char id=59 x=111 y=121 width=5 height=11 xoffset=-1 yoffset=2 xadvance=2 page=0 chnl=0 +char id=60 x=87 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=61 x=99 y=349 width=9 height=5 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=62 x=96 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=63 x=116 y=121 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=64 x=81 y=287 width=11 height=10 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=65 x=0 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=66 x=10 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=67 x=18 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=68 x=27 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=69 x=37 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=70 x=45 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=71 x=53 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=72 x=63 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=73 x=123 y=121 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=74 x=72 y=133 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=75 x=78 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=76 x=87 y=133 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=77 x=95 y=133 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=78 x=106 y=133 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=79 x=115 y=133 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=80 x=0 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=81 x=16 y=42 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=82 x=8 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=83 x=17 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=84 x=25 y=144 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=85 x=34 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=86 x=43 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=87 x=52 y=144 width=13 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=88 x=65 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=89 x=74 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=90 x=83 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=91 x=26 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=92 x=92 y=144 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=93 x=122 y=28 width=5 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=94 x=0 y=317 width=9 height=8 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=95 x=70 y=356 width=8 height=3 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=96 x=16 y=356 width=5 height=4 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=97 x=9 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=98 x=99 y=144 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=99 x=17 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=100 x=108 y=144 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=101 x=25 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=102 x=116 y=144 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=103 x=0 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=104 x=8 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=105 x=122 y=144 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=106 x=0 y=0 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=107 x=16 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=108 x=123 y=82 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=109 x=33 y=317 width=12 height=8 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=110 x=45 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=111 x=53 y=317 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=112 x=24 y=155 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=113 x=33 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=114 x=62 y=317 width=6 height=8 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=115 x=68 y=317 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=116 x=92 y=287 width=6 height=10 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=117 x=75 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=118 x=83 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=119 x=91 y=317 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=120 x=102 y=317 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=121 x=41 y=155 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=122 x=110 y=317 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=123 x=32 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=124 x=6 y=0 width=3 height=14 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=125 x=38 y=42 width=6 height=13 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=126 x=108 y=349 width=9 height=5 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=161 x=49 y=155 width=5 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=162 x=102 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=163 x=98 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=164 x=106 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=165 x=114 y=287 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=166 x=44 y=42 width=3 height=13 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=167 x=110 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=168 x=21 y=356 width=6 height=4 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=169 x=0 y=297 width=10 height=10 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=170 x=43 y=349 width=6 height=6 xoffset=-1 yoffset=1 xadvance=4 page=0 chnl=0 +char id=171 x=7 y=349 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=172 x=49 y=349 width=9 height=6 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=173 x=78 y=356 width=6 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=174 x=14 y=349 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=175 x=84 y=356 width=6 height=3 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=176 x=58 y=349 width=6 height=6 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=177 x=10 y=297 width=9 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=178 x=121 y=325 width=6 height=7 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=179 x=117 y=317 width=6 height=8 xoffset=-1 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=180 x=27 y=356 width=5 height=4 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=181 x=54 y=155 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=182 x=118 y=108 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=183 x=32 y=356 width=4 height=4 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=184 x=117 y=349 width=5 height=5 xoffset=-1 yoffset=8 xadvance=4 page=0 chnl=0 +char id=185 x=121 y=341 width=5 height=7 xoffset=-1 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=186 x=64 y=349 width=7 height=6 xoffset=-1 yoffset=1 xadvance=4 page=0 chnl=0 +char id=187 x=21 y=349 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=188 x=19 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=189 x=30 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=190 x=41 y=297 width=11 height=10 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=191 x=63 y=155 width=7 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=192 x=47 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=193 x=57 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=194 x=67 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=195 x=9 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=196 x=77 y=42 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=197 x=19 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=198 x=70 y=155 width=13 height=11 xoffset=-2 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=199 x=29 y=0 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=200 x=87 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=201 x=95 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=202 x=103 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=203 x=111 y=42 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=204 x=119 y=42 width=6 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=205 x=0 y=56 width=6 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=206 x=6 y=56 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=207 x=13 y=56 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=208 x=83 y=155 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=209 x=38 y=0 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=210 x=20 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=211 x=30 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=212 x=40 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=213 x=47 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=214 x=50 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=215 x=105 y=307 width=9 height=9 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=216 x=0 y=121 width=10 height=12 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=217 x=60 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=218 x=69 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=219 x=78 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=220 x=87 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=221 x=96 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=222 x=94 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=223 x=102 y=155 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=224 x=111 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=225 x=119 y=155 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=226 x=0 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=227 x=8 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=228 x=16 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=229 x=24 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=230 x=0 y=325 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=231 x=32 y=166 width=8 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=232 x=40 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=233 x=48 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=234 x=56 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=235 x=64 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=236 x=72 y=166 width=5 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=237 x=77 y=166 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=238 x=83 y=166 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=239 x=89 y=166 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=240 x=96 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=241 x=104 y=166 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=242 x=112 y=166 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=243 x=0 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=244 x=9 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=245 x=18 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=246 x=27 y=177 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=247 x=11 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=248 x=52 y=297 width=9 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=249 x=36 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=250 x=44 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=251 x=52 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=252 x=60 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=253 x=57 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=254 x=65 y=0 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=255 x=74 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=256 x=105 y=56 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=257 x=61 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=258 x=82 y=0 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=7 page=0 chnl=0 +char id=259 x=68 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=260 x=92 y=0 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=261 x=76 y=177 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=262 x=115 y=56 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=263 x=84 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=264 x=0 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=265 x=92 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=266 x=9 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=267 x=100 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=268 x=18 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=269 x=108 y=177 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=270 x=27 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=271 x=116 y=177 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=272 x=0 y=188 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=273 x=11 y=188 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=274 x=37 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=275 x=69 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=276 x=102 y=0 width=8 height=14 xoffset=-1 yoffset=-4 xadvance=6 page=0 chnl=0 +char id=277 x=20 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=278 x=45 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=279 x=28 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=280 x=110 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=281 x=36 y=188 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=282 x=53 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=283 x=44 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=284 x=61 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=285 x=118 y=0 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=286 x=0 y=14 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=287 x=10 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=288 x=71 y=69 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=289 x=18 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=290 x=26 y=14 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=291 x=36 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=292 x=81 y=69 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=293 x=90 y=69 width=9 height=13 xoffset=-2 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=294 x=52 y=188 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=295 x=62 y=188 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=296 x=44 y=14 width=6 height=14 xoffset=-2 yoffset=-4 xadvance=3 page=0 chnl=0 +char id=297 x=121 y=166 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=298 x=99 y=69 width=5 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=299 x=122 y=287 width=5 height=10 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=300 x=50 y=14 width=6 height=14 xoffset=-2 yoffset=-4 xadvance=3 page=0 chnl=0 +char id=301 x=71 y=188 width=6 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=302 x=56 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=303 x=61 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=304 x=104 y=69 width=5 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=305 x=123 y=317 width=4 height=8 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=306 x=77 y=188 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=307 x=66 y=14 width=7 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=308 x=109 y=69 width=7 height=13 xoffset=-1 yoffset=-3 xadvance=4 page=0 chnl=0 +char id=309 x=73 y=14 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=310 x=79 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=311 x=88 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=312 x=20 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=313 x=116 y=69 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=314 x=0 y=82 width=6 height=13 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=315 x=96 y=14 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=316 x=104 y=14 width=5 height=14 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=317 x=86 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=318 x=94 y=188 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=319 x=100 y=188 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=320 x=108 y=188 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=321 x=114 y=188 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=322 x=0 y=199 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=323 x=6 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=324 x=5 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=325 x=109 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=326 x=13 y=199 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=327 x=15 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=328 x=21 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=329 x=29 y=199 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=330 x=118 y=14 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=331 x=37 y=199 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=332 x=24 y=82 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=333 x=77 y=297 width=9 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=334 x=0 y=28 width=10 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=335 x=45 y=199 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=336 x=34 y=82 width=10 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=337 x=54 y=199 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=338 x=44 y=82 width=13 height=13 xoffset=-1 yoffset=-2 xadvance=11 page=0 chnl=0 +char id=339 x=28 y=325 width=12 height=8 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=340 x=57 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=341 x=63 y=199 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=342 x=10 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=343 x=69 y=199 width=6 height=11 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=344 x=66 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=345 x=75 y=199 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=346 x=75 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=347 x=81 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=348 x=83 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=349 x=88 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=350 x=19 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=351 x=95 y=199 width=7 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=352 x=91 y=82 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=353 x=102 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=354 x=27 y=28 width=9 height=14 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=355 x=99 y=82 width=6 height=13 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=356 x=105 y=82 width=9 height=13 xoffset=-2 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=357 x=109 y=199 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=358 x=116 y=199 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=359 x=86 y=297 width=6 height=10 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=360 x=36 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=361 x=0 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=362 x=114 y=82 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=363 x=92 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=364 x=45 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=365 x=8 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=366 x=54 y=28 width=9 height=14 xoffset=-1 yoffset=-4 xadvance=8 page=0 chnl=0 +char id=367 x=16 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=368 x=0 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=369 x=24 y=210 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=370 x=63 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=371 x=32 y=210 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=372 x=9 y=95 width=13 height=13 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=373 x=41 y=210 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=374 x=22 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=375 x=72 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=376 x=31 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=377 x=40 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=378 x=52 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=379 x=49 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=380 x=59 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=381 x=58 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=382 x=66 y=210 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=894 x=73 y=210 width=5 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=900 x=36 y=356 width=4 height=4 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=901 x=40 y=356 width=7 height=4 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=902 x=78 y=210 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=903 x=47 y=356 width=5 height=4 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=904 x=88 y=210 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=905 x=97 y=210 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=906 x=107 y=210 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=908 x=112 y=210 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=910 x=0 y=221 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=911 x=11 y=221 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=912 x=22 y=221 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=913 x=29 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=914 x=39 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=915 x=47 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=916 x=55 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=917 x=65 y=221 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=918 x=73 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=919 x=82 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=920 x=91 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=921 x=123 y=188 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=922 x=101 y=221 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=923 x=110 y=221 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=924 x=0 y=232 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=925 x=11 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=926 x=20 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=927 x=29 y=232 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=928 x=39 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=929 x=48 y=232 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=931 x=56 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=932 x=65 y=232 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=933 x=74 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=934 x=10 y=121 width=11 height=12 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=935 x=83 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=936 x=92 y=232 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=937 x=102 y=232 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=938 x=67 y=95 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=939 x=74 y=95 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=940 x=113 y=232 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=941 x=0 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=942 x=80 y=28 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=943 x=120 y=221 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=944 x=8 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=945 x=40 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=946 x=88 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=947 x=16 y=243 width=9 height=11 xoffset=-2 yoffset=2 xadvance=6 page=0 chnl=0 +char id=948 x=25 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=949 x=49 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=950 x=83 y=95 width=7 height=13 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=951 x=34 y=243 width=8 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=952 x=42 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=953 x=57 y=325 width=5 height=8 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=954 x=62 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=955 x=50 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=956 x=58 y=243 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=957 x=70 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=958 x=90 y=95 width=8 height=13 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=959 x=78 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=960 x=87 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=961 x=67 y=243 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=962 x=100 y=297 width=7 height=10 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=963 x=96 y=325 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=964 x=105 y=325 width=8 height=8 xoffset=-2 yoffset=2 xadvance=5 page=0 chnl=0 +char id=965 x=113 y=325 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=966 x=21 y=121 width=10 height=12 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=967 x=76 y=243 width=8 height=11 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=968 x=98 y=95 width=10 height=13 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=969 x=0 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=970 x=107 y=297 width=7 height=10 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=971 x=114 y=297 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=972 x=84 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=973 x=93 y=243 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=974 x=101 y=243 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1025 x=108 y=95 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=1026 x=116 y=95 width=11 height=13 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1027 x=0 y=108 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=1028 x=111 y=243 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1029 x=0 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1030 x=123 y=210 width=4 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1031 x=8 y=108 width=7 height=13 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=1032 x=120 y=243 width=6 height=11 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=1033 x=31 y=121 width=14 height=12 xoffset=-2 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=1034 x=8 y=254 width=13 height=11 xoffset=-1 yoffset=-1 xadvance=11 page=0 chnl=0 +char id=1035 x=21 y=254 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1036 x=15 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=1038 x=24 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=1039 x=97 y=28 width=9 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1040 x=32 y=254 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1041 x=42 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1042 x=51 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1043 x=59 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=1044 x=33 y=108 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1045 x=67 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1046 x=75 y=254 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1047 x=87 y=254 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1048 x=95 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1049 x=43 y=108 width=9 height=13 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1050 x=104 y=254 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1051 x=113 y=254 width=10 height=11 xoffset=-2 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1052 x=0 y=265 width=11 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1053 x=11 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1054 x=20 y=265 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1055 x=30 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1056 x=39 y=265 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1057 x=47 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1058 x=56 y=265 width=9 height=11 xoffset=-2 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1059 x=65 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1060 x=45 y=121 width=11 height=12 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1061 x=74 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1062 x=52 y=108 width=10 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1063 x=83 y=265 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1064 x=92 y=265 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1065 x=62 y=108 width=12 height=13 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1066 x=104 y=265 width=11 height=11 xoffset=-2 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1067 x=115 y=265 width=10 height=11 xoffset=-1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=1068 x=0 y=276 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1069 x=9 y=276 width=9 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1070 x=18 y=276 width=12 height=11 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=1071 x=30 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1072 x=10 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1073 x=38 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1074 x=18 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1075 x=26 y=333 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1076 x=0 y=307 width=8 height=10 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1077 x=33 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1078 x=41 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1079 x=51 y=333 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1080 x=58 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1081 x=46 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1082 x=66 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1083 x=74 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1084 x=82 y=333 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1085 x=92 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1086 x=100 y=333 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1087 x=109 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1088 x=54 y=276 width=9 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1089 x=117 y=333 width=8 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1090 x=0 y=341 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1091 x=63 y=276 width=8 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1092 x=106 y=28 width=10 height=14 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=1093 x=7 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1094 x=8 y=307 width=9 height=10 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1095 x=15 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1096 x=23 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1097 x=17 y=307 width=11 height=10 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1098 x=33 y=341 width=9 height=8 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=1099 x=42 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1100 x=52 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1101 x=60 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1102 x=68 y=341 width=10 height=8 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=1103 x=78 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1105 x=71 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1106 x=74 y=108 width=9 height=13 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1107 x=79 y=276 width=7 height=11 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=1108 x=86 y=341 width=8 height=8 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1109 x=94 y=341 width=7 height=8 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=1110 x=122 y=232 width=5 height=11 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1111 x=86 y=276 width=7 height=11 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1112 x=116 y=28 width=6 height=14 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=1113 x=114 y=307 width=11 height=9 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1114 x=101 y=341 width=11 height=8 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=1115 x=93 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=1116 x=101 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1118 x=0 y=42 width=8 height=14 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=1119 x=28 y=307 width=8 height=10 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=1168 x=83 y=108 width=8 height=13 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=1169 x=36 y=307 width=7 height=10 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1241 x=112 y=341 width=9 height=8 xoffset=-1 yoffset=2 xadvance=4 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8211 x=90 y=356 width=8 height=3 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=8212 x=98 y=356 width=14 height=3 xoffset=-1 yoffset=4 xadvance=12 page=0 chnl=0 +char id=8216 x=71 y=349 width=5 height=6 xoffset=-1 yoffset=-2 xadvance=2 page=0 chnl=0 +char id=8217 x=76 y=349 width=5 height=6 xoffset=-1 yoffset=-2 xadvance=2 page=0 chnl=0 +char id=8218 x=122 y=349 width=5 height=5 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=8220 x=81 y=349 width=6 height=6 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=8221 x=87 y=349 width=6 height=6 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=8222 x=0 y=356 width=6 height=5 xoffset=-1 yoffset=7 xadvance=4 page=0 chnl=0 +char id=8224 x=56 y=121 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8225 x=64 y=121 width=8 height=12 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8226 x=6 y=356 width=5 height=5 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=8230 x=52 y=356 width=12 height=4 xoffset=0 yoffset=6 xadvance=12 page=0 chnl=0 +char id=8240 x=43 y=307 width=16 height=10 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=8249 x=28 y=349 width=5 height=7 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=8250 x=33 y=349 width=5 height=7 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=8260 x=59 y=307 width=11 height=10 xoffset=-3 yoffset=0 xadvance=1 page=0 chnl=0 +char id=8363 x=109 y=276 width=8 height=11 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=8364 x=70 y=307 width=8 height=10 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +kernings count=2667 +kerning first=8216 second=281 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=39 second=961 amount=-1 +kerning first=34 second=74 amount=-1 +kerning first=8218 second=376 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=358 second=335 amount=-1 +kerning first=957 second=46 amount=-1 +kerning first=257 second=84 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=8216 second=937 amount=-1 +kerning first=1168 second=1040 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=932 second=940 amount=-1 +kerning first=354 second=93 amount=1 +kerning first=229 second=932 amount=-1 +kerning first=939 second=959 amount=-1 +kerning first=321 second=173 amount=-1 +kerning first=929 second=923 amount=-1 +kerning first=932 second=244 amount=-1 +kerning first=221 second=308 amount=-1 +kerning first=358 second=227 amount=-1 +kerning first=192 second=39 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=947 second=44 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=1027 second=187 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=8218 second=358 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=915 second=941 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=1043 second=1032 amount=-1 +kerning first=1043 second=44 amount=-1 +kerning first=932 second=260 amount=-1 +kerning first=89 second=173 amount=-1 +kerning first=8216 second=940 amount=-1 +kerning first=1168 second=1074 amount=-1 +kerning first=354 second=285 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=65 second=34 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=1059 second=1066 amount=1 +kerning first=84 second=251 amount=-1 +kerning first=109 second=356 amount=-1 +kerning first=933 second=45 amount=-1 +kerning first=1066 second=1059 amount=-1 +kerning first=902 second=39 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=319 second=8220 amount=-1 +kerning first=932 second=8249 amount=-1 +kerning first=358 second=287 amount=-1 +kerning first=8220 second=937 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=317 second=89 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=315 second=376 amount=-1 +kerning first=923 second=356 amount=-1 +kerning first=39 second=74 amount=-1 +kerning first=91 second=372 amount=1 +kerning first=8221 second=111 amount=-1 +kerning first=915 second=916 amount=-1 +kerning first=45 second=376 amount=-1 +kerning first=227 second=354 amount=-1 +kerning first=354 second=308 amount=-1 +kerning first=171 second=933 amount=-1 +kerning first=932 second=948 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=8216 second=260 amount=-1 +kerning first=1100 second=8217 amount=-1 +kerning first=376 second=913 amount=-1 +kerning first=1033 second=1026 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=372 second=192 amount=-1 +kerning first=225 second=356 amount=-1 +kerning first=354 second=369 amount=-1 +kerning first=376 second=258 amount=-1 +kerning first=317 second=34 amount=-1 +kerning first=915 second=8250 amount=-1 +kerning first=102 second=39 amount=1 +kerning first=40 second=84 amount=1 +kerning first=923 second=8217 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=44 second=34 amount=-1 +kerning first=86 second=913 amount=-1 +kerning first=1038 second=1066 amount=1 +kerning first=1027 second=1169 amount=-1 +kerning first=80 second=916 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=358 second=365 amount=-1 +kerning first=8220 second=940 amount=-1 +kerning first=916 second=39 amount=-1 +kerning first=258 second=8216 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=915 second=949 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=315 second=358 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=8216 second=948 amount=-1 +kerning first=45 second=358 amount=-1 +kerning first=933 second=8212 amount=-1 +kerning first=910 second=173 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=971 second=39 amount=-1 +kerning first=358 second=941 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=358 second=246 amount=-1 +kerning first=932 second=269 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=933 second=912 amount=1 +kerning first=1066 second=1038 amount=-1 +kerning first=932 second=117 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=358 second=105 amount=-1 +kerning first=87 second=301 amount=1 +kerning first=944 second=34 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=343 second=8230 amount=-1 +kerning first=8220 second=260 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=932 second=197 amount=-1 +kerning first=358 second=916 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=8221 second=339 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=1168 second=1087 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=933 second=193 amount=-1 +kerning first=1113 second=1090 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=195 second=376 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=8217 second=349 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=228 second=932 amount=-1 +kerning first=955 second=39 amount=-1 +kerning first=932 second=341 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=194 second=39 amount=-1 +kerning first=8221 second=275 amount=-1 +kerning first=8220 second=948 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=915 second=195 amount=-1 +kerning first=8216 second=197 amount=-1 +kerning first=345 second=46 amount=-1 +kerning first=932 second=963 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=197 second=34 amount=-1 +kerning first=932 second=235 amount=-1 +kerning first=358 second=949 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=321 second=372 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=319 second=356 amount=-1 +kerning first=324 second=354 amount=-1 +kerning first=376 second=196 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=187 second=932 amount=-1 +kerning first=76 second=8212 amount=-1 +kerning first=929 second=260 amount=-1 +kerning first=936 second=46 amount=-1 +kerning first=1034 second=1035 amount=-1 +kerning first=915 second=8230 amount=-1 +kerning first=195 second=358 amount=-1 +kerning first=86 second=196 amount=-1 +kerning first=308 second=93 amount=1 +kerning first=356 second=279 amount=-1 +kerning first=358 second=378 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=317 second=8220 amount=-1 +kerning first=89 second=243 amount=-1 +kerning first=8217 second=46 amount=-2 +kerning first=8216 second=963 amount=-1 +kerning first=44 second=8220 amount=-1 +kerning first=313 second=376 amount=-1 +kerning first=319 second=8217 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=932 second=41 amount=1 +kerning first=8216 second=235 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=8212 second=356 amount=-1 +kerning first=46 second=8217 amount=-1 +kerning first=224 second=354 amount=-1 +kerning first=84 second=969 amount=-1 +kerning first=1059 second=1058 amount=1 +kerning first=1091 second=46 amount=-1 +kerning first=102 second=93 amount=1 +kerning first=84 second=241 amount=-1 +kerning first=8221 second=243 amount=-1 +kerning first=8216 second=8216 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=1098 second=8217 amount=-1 +kerning first=8230 second=8221 amount=-1 +kerning first=358 second=265 amount=-1 +kerning first=80 second=8230 amount=-2 +kerning first=8221 second=103 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=8220 second=197 amount=-1 +kerning first=91 second=354 amount=1 +kerning first=45 second=910 amount=-1 +kerning first=923 second=86 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=84 second=913 amount=-1 +kerning first=1168 second=173 amount=-1 +kerning first=1035 second=1066 amount=-1 +kerning first=936 second=198 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=358 second=195 amount=-1 +kerning first=271 second=311 amount=1 +kerning first=912 second=950 amount=1 +kerning first=84 second=258 amount=-1 +kerning first=313 second=358 amount=-1 +kerning first=354 second=343 amount=-1 +kerning first=8221 second=256 amount=-1 +kerning first=1168 second=1100 amount=-1 +kerning first=913 second=221 amount=-1 +kerning first=939 second=65 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=356 second=969 amount=-1 +kerning first=84 second=307 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=1038 second=1058 amount=1 +kerning first=913 second=84 amount=-1 +kerning first=932 second=367 amount=-1 +kerning first=260 second=39 amount=-1 +kerning first=8217 second=198 amount=-1 +kerning first=358 second=345 amount=-1 +kerning first=8220 second=963 amount=-1 +kerning first=104 second=358 amount=-1 +kerning first=256 second=221 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=358 second=8230 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=910 second=962 amount=-1 +kerning first=315 second=173 amount=-1 +kerning first=109 second=932 amount=-1 +kerning first=974 second=34 amount=-1 +kerning first=123 second=106 amount=1 +kerning first=932 second=972 amount=-1 +kerning first=256 second=84 amount=-1 +kerning first=356 second=913 amount=-1 +kerning first=932 second=250 amount=-1 +kerning first=341 second=8230 amount=-1 +kerning first=8220 second=8216 amount=-1 +kerning first=8222 second=86 amount=-1 +kerning first=936 second=194 amount=-1 +kerning first=939 second=966 amount=-1 +kerning first=358 second=232 amount=-1 +kerning first=923 second=932 amount=-1 +kerning first=929 second=197 amount=-1 +kerning first=329 second=356 amount=-1 +kerning first=933 second=941 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=356 second=258 amount=-1 +kerning first=932 second=109 amount=-1 +kerning first=123 second=1095 amount=-1 +kerning first=358 second=97 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=356 second=307 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=192 second=376 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=8217 second=194 amount=-1 +kerning first=225 second=932 amount=-1 +kerning first=910 second=256 amount=-1 +kerning first=261 second=358 amount=-1 +kerning first=376 second=363 amount=-1 +kerning first=915 second=973 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=173 second=354 amount=-1 +kerning first=933 second=916 amount=-1 +kerning first=8216 second=972 amount=-1 +kerning first=1168 second=1079 amount=-1 +kerning first=354 second=301 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=34 second=193 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=221 second=173 amount=-1 +kerning first=939 second=44 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=1090 second=8230 amount=-1 +kerning first=196 second=34 amount=-1 +kerning first=932 second=324 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=8221 second=263 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=8222 second=932 amount=-1 +kerning first=110 second=354 amount=-1 +kerning first=934 second=46 amount=-1 +kerning first=192 second=358 amount=-1 +kerning first=902 second=376 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=932 second=226 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=8221 second=192 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=1027 second=46 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=933 second=949 amount=-1 +kerning first=1168 second=1114 amount=-1 +kerning first=319 second=86 amount=-1 +kerning first=271 second=8221 amount=1 +kerning first=331 second=358 amount=-1 +kerning first=1034 second=8217 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=44 second=8217 amount=-1 +kerning first=226 second=354 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=358 second=361 amount=-1 +kerning first=8220 second=972 amount=-1 +kerning first=123 second=358 amount=1 +kerning first=356 second=115 amount=-1 +kerning first=8221 second=8221 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=8218 second=372 amount=-1 +kerning first=915 second=954 amount=-1 +kerning first=354 second=173 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=902 second=358 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=84 second=959 amount=-1 +kerning first=932 second=331 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=356 second=196 amount=-1 +kerning first=8217 second=285 amount=-1 +kerning first=358 second=251 amount=-1 +kerning first=39 second=193 amount=-1 +kerning first=372 second=239 amount=1 +kerning first=932 second=283 amount=-1 +kerning first=8221 second=234 amount=-1 +kerning first=923 second=939 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=1033 second=1066 amount=-1 +kerning first=932 second=122 amount=-1 +kerning first=358 second=110 amount=-1 +kerning first=97 second=84 amount=-1 +kerning first=910 second=192 amount=-1 +kerning first=91 second=87 amount=1 +kerning first=319 second=932 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=1035 second=1058 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=939 second=923 amount=-1 +kerning first=258 second=39 amount=-1 +kerning first=8217 second=308 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=1168 second=1092 amount=-1 +kerning first=933 second=195 amount=-1 +kerning first=313 second=173 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=356 second=959 amount=-1 +kerning first=973 second=34 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=916 second=358 amount=-1 +kerning first=932 second=349 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=1043 second=187 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=8221 second=289 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=358 second=328 amount=-1 +kerning first=295 second=356 amount=-1 +kerning first=376 second=271 amount=-1 +kerning first=8211 second=376 amount=-1 +kerning first=1058 second=44 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=8212 second=932 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=910 second=961 amount=-1 +kerning first=1058 second=1032 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=315 second=372 amount=-1 +kerning first=933 second=8230 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=932 second=236 amount=-1 +kerning first=194 second=376 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=1169 second=44 amount=-1 +kerning first=1027 second=59 amount=-1 +kerning first=358 second=228 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=34 second=941 amount=-1 +kerning first=259 second=358 amount=-1 +kerning first=932 second=101 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=8221 second=74 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=376 second=65 amount=-1 +kerning first=8230 second=933 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=193 second=34 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=8211 second=358 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=354 second=312 amount=-1 +kerning first=358 second=248 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=241 second=356 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=34 second=916 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=271 second=108 amount=1 +kerning first=354 second=275 amount=-1 +kerning first=932 second=46 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=195 second=936 amount=-1 +kerning first=194 second=358 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=8221 second=353 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=1043 second=1169 amount=-1 +kerning first=932 second=297 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=321 second=8211 amount=-1 +kerning first=358 second=279 amount=-1 +kerning first=915 second=913 amount=-1 +kerning first=317 second=86 amount=-1 +kerning first=40 second=309 amount=1 +kerning first=376 second=99 amount=-1 +kerning first=932 second=945 amount=-1 +kerning first=329 second=932 amount=-1 +kerning first=915 second=258 amount=-1 +kerning first=1168 second=1241 amount=-1 +kerning first=65 second=932 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=46 second=939 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=372 second=193 amount=-1 +kerning first=8216 second=46 amount=-1 +kerning first=34 second=949 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=912 second=955 amount=1 +kerning first=1027 second=1026 amount=1 +kerning first=89 second=8211 amount=-1 +kerning first=376 second=44 amount=-1 +kerning first=39 second=941 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=913 second=89 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=195 second=372 amount=-1 +kerning first=80 second=913 amount=-1 +kerning first=257 second=356 amount=-1 +kerning first=932 second=198 amount=-1 +kerning first=354 second=962 amount=-1 +kerning first=173 second=933 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=915 second=946 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=910 second=970 amount=1 +kerning first=8212 second=939 amount=-1 +kerning first=8216 second=945 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=256 second=89 amount=-1 +kerning first=260 second=376 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=317 second=932 amount=-1 +kerning first=939 second=940 amount=-1 +kerning first=358 second=969 amount=-1 +kerning first=39 second=916 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1033 second=1058 amount=-1 +kerning first=358 second=241 amount=-1 +kerning first=913 second=34 amount=-1 +kerning first=932 second=261 amount=-1 +kerning first=293 second=358 amount=-1 +kerning first=357 second=8221 amount=1 +kerning first=1043 second=1098 amount=-1 +kerning first=932 second=114 amount=-1 +kerning first=926 second=912 amount=1 +kerning first=8204 second=902 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=354 second=256 amount=-1 +kerning first=8216 second=198 amount=-1 +kerning first=256 second=34 amount=-1 +kerning first=8220 second=46 amount=-1 +kerning first=932 second=194 amount=-1 +kerning first=358 second=913 amount=-1 +kerning first=1068 second=1026 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=1056 second=44 amount=-2 +kerning first=1168 second=1084 amount=-1 +kerning first=1056 second=1032 amount=-1 +kerning first=939 second=260 amount=-1 +kerning first=922 second=970 amount=1 +kerning first=89 second=277 amount=-1 +kerning first=358 second=258 amount=-1 +kerning first=34 second=195 amount=-1 +kerning first=8221 second=8204 amount=-1 +kerning first=260 second=358 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=313 second=372 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=39 second=949 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=910 second=8211 amount=-1 +kerning first=8221 second=273 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=358 second=307 amount=-1 +kerning first=932 second=337 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=160 second=8216 amount=-1 +kerning first=8211 second=910 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=8221 second=277 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=8220 second=945 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=915 second=196 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=34 second=8230 amount=-1 +kerning first=8216 second=194 amount=-1 +kerning first=221 second=192 amount=-1 +kerning first=1107 second=46 amount=-1 +kerning first=45 second=354 amount=-1 +kerning first=932 second=231 amount=-1 +kerning first=65 second=939 amount=-1 +kerning first=939 second=948 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=376 second=923 amount=-1 +kerning first=1114 second=8217 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=932 second=93 amount=1 +kerning first=89 second=351 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=40 second=356 amount=1 +kerning first=929 second=46 amount=-2 +kerning first=8220 second=198 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=192 second=936 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=86 second=923 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=8221 second=351 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=197 second=932 amount=-1 +kerning first=915 second=959 amount=-1 +kerning first=89 second=239 amount=1 +kerning first=321 second=45 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=84 second=966 amount=-1 +kerning first=295 second=932 amount=-1 +kerning first=84 second=238 amount=-1 +kerning first=39 second=195 amount=-1 +kerning first=358 second=382 amount=-1 +kerning first=44 second=939 amount=-1 +kerning first=932 second=285 amount=-1 +kerning first=376 second=229 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=8221 second=100 amount=-1 +kerning first=356 second=65 amount=-1 +kerning first=354 second=192 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=358 second=115 amount=-1 +kerning first=8220 second=194 amount=-1 +kerning first=8204 second=221 amount=-1 +kerning first=915 second=181 amount=-1 +kerning first=902 second=936 amount=-1 +kerning first=913 second=8220 amount=-1 +kerning first=227 second=84 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=1035 second=1063 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=192 second=372 amount=-1 +kerning first=939 second=197 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=39 second=8230 amount=-1 +kerning first=929 second=198 amount=-1 +kerning first=358 second=196 amount=-1 +kerning first=1075 second=44 amount=-1 +kerning first=932 second=308 amount=-1 +kerning first=8216 second=1026 amount=1 +kerning first=1168 second=1097 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=356 second=966 amount=-1 +kerning first=258 second=376 amount=-1 +kerning first=8216 second=285 amount=-1 +kerning first=356 second=238 amount=-1 +kerning first=241 second=932 amount=-1 +kerning first=932 second=369 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=321 second=8212 amount=-1 +kerning first=84 second=299 amount=-1 +kerning first=358 second=333 amount=-1 +kerning first=354 second=961 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=70 second=227 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=376 second=125 amount=1 +kerning first=123 second=372 amount=1 +kerning first=8218 second=87 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=916 second=936 amount=-1 +kerning first=939 second=963 amount=-1 +kerning first=932 second=242 amount=-1 +kerning first=8216 second=308 amount=-1 +kerning first=358 second=959 amount=-1 +kerning first=902 second=372 amount=-1 +kerning first=358 second=233 amount=-1 +kerning first=929 second=194 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=86 second=125 amount=1 +kerning first=1043 second=1090 amount=-1 +kerning first=114 second=8230 amount=-1 +kerning first=1168 second=8211 amount=-1 +kerning first=1066 second=1026 amount=-1 +kerning first=356 second=44 amount=-1 +kerning first=89 second=8212 amount=-1 +kerning first=947 second=46 amount=-1 +kerning first=1033 second=8221 amount=-1 +kerning first=258 second=358 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=76 second=34 amount=-1 +kerning first=356 second=299 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=8220 second=1026 amount=1 +kerning first=197 second=939 amount=-1 +kerning first=915 second=943 amount=-1 +kerning first=910 second=45 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=1043 second=46 amount=-1 +kerning first=933 second=913 amount=-1 +kerning first=1168 second=1076 amount=-1 +kerning first=354 second=289 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=8220 second=285 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=315 second=8211 amount=-1 +kerning first=257 second=932 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=84 second=974 amount=-1 +kerning first=933 second=258 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=376 second=244 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=358 second=291 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=8221 second=113 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=104 second=354 amount=-1 +kerning first=923 second=8216 amount=-1 +kerning first=8220 second=308 amount=-1 +kerning first=1026 second=1035 amount=-1 +kerning first=194 second=936 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=84 second=923 amount=-1 +kerning first=8221 second=193 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=372 second=195 amount=-1 +kerning first=196 second=932 amount=-1 +kerning first=1168 second=1111 amount=-1 +kerning first=87 second=239 amount=1 +kerning first=8216 second=1040 amount=-1 +kerning first=324 second=84 amount=-1 +kerning first=354 second=371 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=376 second=260 amount=-1 +kerning first=356 second=974 amount=-1 +kerning first=913 second=356 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=910 second=8212 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=221 second=8211 amount=-1 +kerning first=932 second=380 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=8221 second=335 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=358 second=363 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=915 second=951 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=910 second=912 amount=1 +kerning first=372 second=8230 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=376 second=8249 amount=-1 +kerning first=256 second=356 amount=-1 +kerning first=261 second=354 amount=-1 +kerning first=8220 second=242 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=356 second=923 amount=-1 +kerning first=939 second=972 amount=-1 +kerning first=1058 second=187 amount=-1 +kerning first=224 second=84 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=358 second=245 amount=-1 +kerning first=1033 second=1063 amount=-1 +kerning first=913 second=8217 amount=-1 +kerning first=194 second=372 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=932 second=267 amount=-1 +kerning first=1043 second=1103 amount=-1 +kerning first=929 second=308 amount=-1 +kerning first=1034 second=1059 amount=-1 +kerning first=45 second=933 amount=-1 +kerning first=910 second=193 amount=-1 +kerning first=91 second=84 amount=1 +kerning first=256 second=8217 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=1043 second=59 amount=-1 +kerning first=40 second=932 amount=1 +kerning first=968 second=39 amount=-1 +kerning first=1168 second=1089 amount=-1 +kerning first=1058 second=1085 amount=-1 +kerning first=8220 second=1040 amount=-1 +kerning first=922 second=912 amount=1 +kerning first=76 second=8220 amount=-1 +kerning first=933 second=196 amount=-1 +kerning first=221 second=273 amount=-1 +kerning first=1027 second=173 amount=-1 +kerning first=354 second=8211 amount=-1 +kerning first=331 second=354 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=1100 second=1098 amount=-1 +kerning first=902 second=8221 amount=-1 +kerning first=932 second=343 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=8221 second=287 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=84 second=125 amount=1 +kerning first=376 second=269 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=1168 second=45 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=123 second=354 amount=1 +kerning first=260 second=936 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=932 second=237 amount=-1 +kerning first=915 second=65 amount=-1 +kerning first=1068 second=1066 amount=-1 +kerning first=902 second=354 amount=-1 +kerning first=343 second=44 amount=-1 +kerning first=376 second=197 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=196 second=939 amount=-1 +kerning first=936 second=256 amount=-1 +kerning first=933 second=959 amount=-1 +kerning first=319 second=8216 amount=-1 +kerning first=8249 second=910 amount=-1 +kerning first=34 second=969 amount=-1 +kerning first=89 second=365 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=1058 second=1169 amount=-1 +kerning first=46 second=8216 amount=-1 +kerning first=354 second=305 amount=-1 +kerning first=1034 second=1038 amount=-1 +kerning first=102 second=8221 amount=1 +kerning first=221 second=351 amount=-1 +kerning first=313 second=8211 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=173 second=221 amount=-1 +kerning first=916 second=8221 amount=-1 +kerning first=8217 second=256 amount=-1 +kerning first=356 second=125 amount=1 +kerning first=915 second=966 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=358 second=230 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=1043 second=1026 amount=1 +kerning first=34 second=913 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=173 second=84 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=239 amount=1 +kerning first=8220 second=267 amount=-1 +kerning first=195 second=933 amount=-1 +kerning first=84 second=940 amount=-1 +kerning first=34 second=258 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=260 second=372 amount=-1 +kerning first=8221 second=246 amount=-1 +kerning first=932 second=301 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=916 second=354 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=1168 second=8212 amount=-1 +kerning first=358 second=271 amount=-1 +kerning first=97 second=356 amount=-1 +kerning first=193 second=932 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=110 second=84 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=8204 second=89 amount=-1 +kerning first=915 second=44 amount=-1 +kerning first=271 second=318 amount=1 +kerning first=326 second=358 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=1168 second=1102 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=259 second=354 amount=-1 +kerning first=315 second=8212 amount=-1 +kerning first=70 second=8230 amount=-1 +kerning first=358 second=65 amount=-1 +kerning first=356 second=940 amount=-1 +kerning first=376 second=41 amount=1 +kerning first=39 second=969 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=913 second=86 amount=-1 +kerning first=955 second=8221 amount=-1 +kerning first=226 second=84 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=358 second=347 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=354 second=239 amount=-1 +kerning first=910 second=941 amount=-1 +kerning first=1168 second=58 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=86 second=41 amount=1 +kerning first=8211 second=354 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=256 second=86 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=84 second=948 amount=-1 +kerning first=932 second=252 amount=-1 +kerning first=39 second=913 amount=-1 +kerning first=936 second=192 amount=-1 +kerning first=358 second=966 amount=-1 +kerning first=932 second=173 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=358 second=238 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=1043 second=1095 amount=-1 +kerning first=8216 second=1066 amount=1 +kerning first=356 second=260 amount=-1 +kerning first=1113 second=8221 amount=-1 +kerning first=932 second=111 amount=-1 +kerning first=39 second=258 amount=-1 +kerning first=65 second=8216 amount=-1 +kerning first=358 second=99 amount=-1 +kerning first=910 second=916 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=160 second=8218 amount=-1 +kerning first=221 second=8212 amount=-1 +kerning first=8217 second=192 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=969 second=34 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=913 second=932 amount=-1 +kerning first=1168 second=1081 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=89 second=265 amount=-1 +kerning first=34 second=196 amount=-1 +kerning first=936 second=961 amount=-1 +kerning first=358 second=44 amount=-1 +kerning first=258 second=936 amount=-1 +kerning first=356 second=948 amount=-1 +kerning first=939 second=46 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=8217 second=8221 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=1066 second=1066 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=256 second=932 amount=-1 +kerning first=8221 second=265 amount=-1 +kerning first=358 second=299 amount=-1 +kerning first=341 second=44 amount=-1 +kerning first=193 second=939 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=915 second=923 amount=-1 +kerning first=317 second=8216 amount=-1 +kerning first=89 second=195 amount=-1 +kerning first=910 second=949 amount=-1 +kerning first=44 second=8216 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=123 second=87 amount=1 +kerning first=8217 second=234 amount=-1 +kerning first=939 second=945 amount=-1 +kerning first=932 second=224 amount=-1 +kerning first=1068 second=1058 amount=-1 +kerning first=8220 second=1066 amount=1 +kerning first=84 second=197 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=8221 second=195 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=902 second=87 amount=-1 +kerning first=1168 second=1116 amount=-1 +kerning first=1041 second=1026 amount=-1 +kerning first=293 second=354 amount=-1 +kerning first=354 second=8212 amount=-1 +kerning first=89 second=8230 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=8250 second=932 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=192 second=933 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=80 second=923 amount=-1 +kerning first=258 second=372 amount=-1 +kerning first=84 second=341 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=932 second=339 amount=-1 +kerning first=356 second=117 amount=-1 +kerning first=8221 second=8230 amount=-2 +kerning first=89 second=232 amount=-1 +kerning first=939 second=198 amount=-1 +kerning first=1090 second=44 amount=-1 +kerning first=1168 second=1060 amount=-1 +kerning first=923 second=39 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=84 second=963 amount=-1 +kerning first=8204 second=8220 amount=-1 +kerning first=932 second=312 amount=-1 +kerning first=358 second=974 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=356 second=197 amount=-1 +kerning first=260 second=354 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=358 second=249 amount=-1 +kerning first=39 second=196 amount=-1 +kerning first=8221 second=232 amount=-1 +kerning first=932 second=275 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=328 second=358 amount=-1 +kerning first=358 second=259 amount=-1 +kerning first=1059 second=8230 amount=-1 +kerning first=354 second=193 amount=-1 +kerning first=358 second=112 amount=-1 +kerning first=1111 second=1106 amount=1 +kerning first=902 second=933 amount=-1 +kerning first=313 second=8212 amount=-1 +kerning first=910 second=195 amount=-1 +kerning first=1038 second=1108 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=356 second=341 amount=-1 +kerning first=358 second=923 amount=-1 +kerning first=372 second=913 amount=-1 +kerning first=939 second=194 amount=-1 +kerning first=1058 second=1090 amount=-1 +kerning first=271 second=293 amount=1 +kerning first=8217 second=74 amount=-1 +kerning first=913 second=939 amount=-1 +kerning first=1168 second=1094 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=372 second=258 amount=-1 +kerning first=84 second=41 amount=1 +kerning first=1027 second=1241 amount=-1 +kerning first=356 second=963 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=197 second=8216 amount=-1 +kerning first=229 second=358 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=933 second=65 amount=-1 +kerning first=910 second=8230 amount=-1 +kerning first=8218 second=221 amount=-1 +kerning first=256 second=939 amount=-1 +kerning first=358 second=326 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=1058 second=46 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=8230 second=34 amount=-1 +kerning first=1038 second=8230 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=932 second=962 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=916 second=933 amount=-1 +kerning first=932 second=243 amount=-1 +kerning first=1169 second=46 amount=-1 +kerning first=97 second=932 amount=-1 +kerning first=358 second=229 amount=-1 +kerning first=933 second=966 amount=-1 +kerning first=1043 second=1087 amount=-1 +kerning first=1168 second=8250 amount=-1 +kerning first=8216 second=1058 amount=1 +kerning first=194 second=87 amount=-1 +kerning first=932 second=103 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=356 second=41 amount=1 +kerning first=8220 second=339 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=376 second=349 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=915 second=940 amount=-1 +kerning first=932 second=256 amount=-1 +kerning first=8216 second=962 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=173 second=89 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=160 second=376 amount=-1 +kerning first=84 second=972 amount=-1 +kerning first=8204 second=8222 amount=-1 +kerning first=84 second=250 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=933 second=44 amount=-1 +kerning first=1066 second=1058 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=76 second=932 amount=-1 +kerning first=8211 second=933 amount=-1 +kerning first=319 second=39 amount=-1 +kerning first=932 second=171 amount=-1 +kerning first=358 second=281 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=46 second=39 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=358 second=125 amount=1 +kerning first=376 second=101 amount=-1 +kerning first=87 second=8230 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=227 second=356 amount=-1 +kerning first=194 second=933 amount=-1 +kerning first=915 second=260 amount=-1 +kerning first=315 second=84 amount=-1 +kerning first=356 second=367 amount=-1 +kerning first=8216 second=256 amount=-1 +kerning first=258 second=8221 amount=-1 +kerning first=8220 second=1058 amount=1 +kerning first=45 second=84 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=372 second=196 amount=-1 +kerning first=321 second=89 amount=-1 +kerning first=1168 second=1108 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=1068 second=8221 amount=-1 +kerning first=356 second=972 amount=-1 +kerning first=376 second=46 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=354 second=941 amount=-1 +kerning first=8220 second=962 amount=-1 +kerning first=1058 second=59 amount=-1 +kerning first=915 second=948 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=91 second=309 amount=1 +kerning first=8220 second=243 amount=-1 +kerning first=321 second=34 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=8217 second=8204 amount=-1 +kerning first=1043 second=173 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=358 second=940 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=358 second=244 amount=-1 +kerning first=932 second=263 amount=-1 +kerning first=260 second=87 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=8230 second=8220 amount=-1 +kerning first=1168 second=8230 amount=-1 +kerning first=354 second=916 amount=-1 +kerning first=70 second=913 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=187 second=376 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=196 second=8216 amount=-1 +kerning first=8220 second=256 amount=-1 +kerning first=228 second=358 amount=-1 +kerning first=271 second=295 amount=1 +kerning first=356 second=324 amount=-1 +kerning first=932 second=192 amount=-1 +kerning first=8221 second=248 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=1056 second=46 amount=-2 +kerning first=376 second=198 amount=-1 +kerning first=933 second=923 amount=-1 +kerning first=1168 second=1086 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=358 second=260 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=221 second=265 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=34 second=65 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=965 second=34 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=8221 second=279 amount=-1 +kerning first=354 second=949 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=65 second=39 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=187 second=358 amount=-1 +kerning first=1058 second=1026 amount=1 +kerning first=358 second=8249 amount=-1 +kerning first=915 second=197 amount=-1 +kerning first=260 second=933 amount=-1 +kerning first=8216 second=192 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=932 second=961 amount=-1 +kerning first=171 second=939 amount=-1 +kerning first=1040 second=1035 amount=-1 +kerning first=932 second=234 amount=-1 +kerning first=358 second=948 amount=-1 +kerning first=1068 second=1063 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=324 second=356 amount=-1 +kerning first=376 second=194 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=929 second=256 amount=-1 +kerning first=915 second=187 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=1027 second=8211 amount=-1 +kerning first=221 second=8230 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=84 second=349 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=317 second=39 amount=-1 +kerning first=915 second=963 amount=-1 +kerning first=8216 second=961 amount=-1 +kerning first=44 second=39 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=354 second=265 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=224 second=356 amount=-1 +kerning first=84 second=236 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=34 second=44 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=932 second=289 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=321 second=8220 amount=-1 +kerning first=1043 second=1114 amount=-1 +kerning first=923 second=376 amount=-1 +kerning first=89 second=913 amount=-1 +kerning first=358 second=269 amount=-1 +kerning first=1041 second=1066 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=354 second=195 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=358 second=117 amount=-1 +kerning first=39 second=65 amount=-1 +kerning first=91 second=356 amount=1 +kerning first=8220 second=192 amount=-1 +kerning first=376 second=93 amount=1 +kerning first=1066 second=8221 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=104 second=84 amount=-1 +kerning first=356 second=349 amount=-1 +kerning first=8221 second=913 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=358 second=197 amount=-1 +kerning first=1075 second=46 amount=-1 +kerning first=944 second=39 amount=-1 +kerning first=86 second=93 amount=1 +kerning first=1168 second=1099 amount=-1 +kerning first=8221 second=258 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=932 second=74 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=354 second=8230 amount=-1 +kerning first=109 second=358 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=934 second=933 amount=-1 +kerning first=356 second=236 amount=-1 +kerning first=932 second=371 amount=-1 +kerning first=1027 second=1111 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=923 second=358 amount=-1 +kerning first=84 second=297 amount=-1 +kerning first=358 second=341 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=8220 second=961 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=1118 second=8230 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=8230 second=8217 amount=-1 +kerning first=8218 second=89 amount=-1 +kerning first=8222 second=376 amount=-1 +kerning first=1168 second=1044 amount=-1 +kerning first=932 second=970 amount=1 +kerning first=261 second=84 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=84 second=945 amount=-1 +kerning first=193 second=8216 amount=-1 +kerning first=932 second=353 amount=-1 +kerning first=936 second=193 amount=-1 +kerning first=358 second=963 amount=-1 +kerning first=225 second=358 amount=-1 +kerning first=1059 second=1035 amount=1 +kerning first=358 second=235 amount=-1 +kerning first=929 second=192 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=933 second=940 amount=-1 +kerning first=34 second=974 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=227 second=932 amount=-1 +kerning first=376 second=308 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=39 second=44 amount=-1 +kerning first=910 second=913 amount=-1 +kerning first=197 second=39 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=8217 second=193 amount=-1 +kerning first=910 second=258 amount=-1 +kerning first=356 second=297 amount=-1 +kerning first=84 second=198 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=915 second=972 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=173 second=356 amount=-1 +kerning first=34 second=923 amount=-1 +kerning first=8222 second=358 amount=-1 +kerning first=1168 second=1078 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=326 second=354 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=358 second=41 amount=1 +kerning first=258 second=933 amount=-1 +kerning first=356 second=945 amount=-1 +kerning first=933 second=260 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=1038 second=1035 amount=1 +kerning first=331 second=84 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=1066 second=1063 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=932 second=8211 amount=-1 +kerning first=84 second=114 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=8221 second=115 amount=-1 +kerning first=110 second=356 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=950 second=125 amount=1 +kerning first=123 second=84 amount=1 +kerning first=902 second=221 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=319 second=376 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=932 second=225 amount=-1 +kerning first=84 second=194 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=356 second=198 amount=-1 +kerning first=8221 second=196 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=1027 second=45 amount=-1 +kerning first=902 second=84 amount=-1 +kerning first=8249 second=933 amount=-1 +kerning first=933 second=948 amount=-1 +kerning first=1168 second=1113 amount=-1 +kerning first=354 second=361 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=1034 second=1026 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=372 second=65 amount=-1 +kerning first=39 second=974 amount=-1 +kerning first=226 second=356 amount=-1 +kerning first=913 second=8216 amount=-1 +kerning first=315 second=34 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=8221 second=333 amount=-1 +kerning first=932 second=305 amount=-1 +kerning first=358 second=367 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=87 second=913 amount=-1 +kerning first=915 second=953 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=8212 second=376 amount=-1 +kerning first=1043 second=1241 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=256 second=8216 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=319 second=358 amount=-1 +kerning first=932 second=273 amount=-1 +kerning first=39 second=923 amount=-1 +kerning first=358 second=972 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=356 second=194 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=358 second=250 amount=-1 +kerning first=8221 second=233 amount=-1 +kerning first=939 second=173 amount=-1 +kerning first=932 second=277 amount=-1 +kerning first=957 second=8230 amount=-1 +kerning first=8216 second=1076 amount=-1 +kerning first=1041 second=1058 amount=-1 +kerning first=974 second=39 amount=-1 +kerning first=916 second=84 amount=-1 +kerning first=84 second=93 amount=1 +kerning first=929 second=74 amount=-1 +kerning first=358 second=109 amount=-1 +kerning first=910 second=196 amount=-1 +kerning first=271 second=8217 amount=1 +kerning first=91 second=86 amount=1 +kerning first=1027 second=8212 amount=-1 +kerning first=1038 second=1105 amount=-1 +kerning first=324 second=932 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=8212 second=358 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=933 second=197 amount=-1 +kerning first=1168 second=1091 amount=-1 +kerning first=8221 second=8217 amount=-1 +kerning first=372 second=44 amount=-1 +kerning first=259 second=84 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=932 second=351 amount=-1 +kerning first=1027 second=1102 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=84 second=285 amount=-1 +kerning first=8221 second=291 amount=-1 +kerning first=358 second=324 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=8211 second=221 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=356 second=93 amount=1 +kerning first=354 second=228 amount=-1 +kerning first=224 second=932 amount=-1 +kerning first=910 second=959 amount=-1 +kerning first=196 second=39 amount=-1 +kerning first=8211 second=84 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=936 second=916 amount=-1 +kerning first=932 second=239 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=8220 second=1076 amount=-1 +kerning first=65 second=376 amount=-1 +kerning first=1027 second=58 amount=-1 +kerning first=358 second=226 amount=-1 +kerning first=343 second=46 amount=-1 +kerning first=91 second=932 amount=1 +kerning first=933 second=963 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=84 second=308 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=932 second=100 amount=-1 +kerning first=195 second=34 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=74 second=125 amount=1 +kerning first=328 second=354 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=1035 second=1035 amount=-1 +kerning first=356 second=285 amount=-1 +kerning first=915 second=968 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=8220 second=273 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=271 second=107 amount=1 +kerning first=354 second=279 amount=-1 +kerning first=932 second=45 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=315 second=8220 amount=-1 +kerning first=329 second=358 amount=-1 +kerning first=34 second=260 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=65 second=358 amount=-1 +kerning first=317 second=376 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=358 second=331 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=8221 second=245 amount=-1 +kerning first=932 second=303 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=229 second=354 amount=-1 +kerning first=356 second=308 amount=-1 +kerning first=358 second=283 amount=-1 +kerning first=358 second=122 amount=-1 +kerning first=221 second=913 amount=-1 +kerning first=1058 second=173 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=915 second=46 amount=-1 +kerning first=372 second=923 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=313 second=34 amount=-1 +kerning first=1058 second=1100 amount=-1 +kerning first=271 second=320 amount=1 +kerning first=321 second=86 amount=-1 +kerning first=1168 second=1105 amount=-1 +kerning first=293 second=84 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=317 second=358 amount=-1 +kerning first=173 second=932 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=932 second=8212 amount=-1 +kerning first=354 second=969 amount=-1 +kerning first=358 second=349 amount=-1 +kerning first=915 second=945 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=8212 second=910 amount=-1 +kerning first=973 second=39 amount=-1 +kerning first=76 second=8216 amount=-1 +kerning first=80 second=46 amount=-2 +kerning first=932 second=912 amount=1 +kerning first=260 second=221 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=939 second=962 amount=-1 +kerning first=319 second=173 amount=-1 +kerning first=936 second=195 amount=-1 +kerning first=8217 second=265 amount=-1 +kerning first=86 second=301 amount=1 +kerning first=358 second=236 amount=-1 +kerning first=110 second=932 amount=-1 +kerning first=932 second=257 amount=-1 +kerning first=260 second=84 amount=-1 +kerning first=923 second=936 amount=-1 +kerning first=933 second=972 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=354 second=913 amount=-1 +kerning first=932 second=113 amount=-1 +kerning first=345 second=8230 amount=-1 +kerning first=39 second=260 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=358 second=101 amount=-1 +kerning first=915 second=198 amount=-1 +kerning first=321 second=932 amount=-1 +kerning first=354 second=258 amount=-1 +kerning first=8230 second=939 amount=-1 +kerning first=8217 second=195 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=932 second=193 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=936 second=8230 amount=-1 +kerning first=915 second=944 amount=-1 +kerning first=354 second=307 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=197 second=376 amount=-1 +kerning first=1168 second=1083 amount=-1 +kerning first=226 second=932 amount=-1 +kerning first=89 second=271 amount=-1 +kerning first=939 second=256 amount=-1 +kerning first=34 second=197 amount=-1 +kerning first=358 second=46 amount=-1 +kerning first=193 second=39 amount=-1 +kerning first=1043 second=8211 amount=-1 +kerning first=950 second=41 amount=1 +kerning first=8216 second=113 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=932 second=335 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=8217 second=8230 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=376 second=173 amount=-1 +kerning first=358 second=297 amount=-1 +kerning first=341 second=46 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=8221 second=271 amount=-1 +kerning first=923 second=372 amount=-1 +kerning first=1091 second=8230 amount=-1 +kerning first=372 second=125 amount=1 +kerning first=192 second=34 amount=-1 +kerning first=376 second=111 amount=-1 +kerning first=357 second=8217 amount=1 +kerning first=915 second=194 amount=-1 +kerning first=315 second=356 amount=-1 +kerning first=8216 second=193 amount=-1 +kerning first=221 second=196 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=932 second=227 amount=-1 +kerning first=915 second=59 amount=-1 +kerning first=358 second=945 amount=-1 +kerning first=1033 second=1035 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=197 second=358 amount=-1 +kerning first=902 second=89 amount=-1 +kerning first=1168 second=1119 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=8221 second=65 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=313 second=8220 amount=-1 +kerning first=1027 second=8250 amount=-1 +kerning first=295 second=358 amount=-1 +kerning first=173 second=939 amount=-1 +kerning first=315 second=8217 amount=-1 +kerning first=84 second=343 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=8221 second=347 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=228 second=354 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=358 second=198 amount=-1 +kerning first=1090 second=46 amount=-1 +kerning first=902 second=34 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=8222 second=372 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=84 second=237 amount=-1 +kerning first=39 second=197 amount=-1 +kerning first=1043 second=1111 amount=-1 +kerning first=932 second=287 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=70 second=923 amount=-1 +kerning first=358 second=261 amount=-1 +kerning first=8221 second=99 amount=-1 +kerning first=1034 second=1066 amount=-1 +kerning first=354 second=196 amount=-1 +kerning first=358 second=114 amount=-1 +kerning first=8220 second=193 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=913 second=39 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=356 second=343 amount=-1 +kerning first=241 second=358 amount=-1 +kerning first=102 second=34 amount=1 +kerning first=910 second=65 amount=-1 +kerning first=939 second=192 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=358 second=194 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=1168 second=1096 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=372 second=260 amount=-1 +kerning first=916 second=34 amount=-1 +kerning first=256 second=39 amount=-1 +kerning first=8221 second=44 amount=-2 +kerning first=8216 second=287 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=317 second=173 amount=-1 +kerning first=932 second=365 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=84 second=301 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=354 second=959 amount=-1 +kerning first=358 second=337 amount=-1 +kerning first=971 second=34 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=8218 second=86 amount=-1 +kerning first=910 second=966 amount=-1 +kerning first=8211 second=89 amount=-1 +kerning first=932 second=941 amount=-1 +kerning first=1059 second=44 amount=-1 +kerning first=74 second=41 amount=1 +kerning first=939 second=961 amount=-1 +kerning first=932 second=246 amount=-1 +kerning first=1059 second=1032 amount=-1 +kerning first=358 second=231 amount=-1 +kerning first=929 second=193 amount=-1 +kerning first=319 second=372 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=934 second=8230 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=932 second=105 amount=-1 +kerning first=196 second=376 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=358 second=93 amount=1 +kerning first=40 second=106 amount=1 +kerning first=1100 second=8221 amount=-1 +kerning first=257 second=358 amount=-1 +kerning first=221 second=363 amount=-1 +kerning first=40 second=1095 amount=-1 +kerning first=1027 second=8230 amount=-1 +kerning first=932 second=916 amount=-1 +kerning first=356 second=301 amount=-1 +kerning first=915 second=942 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=910 second=44 amount=-1 +kerning first=955 second=34 amount=-1 +kerning first=8216 second=941 amount=-1 +kerning first=80 second=308 amount=-1 +kerning first=923 second=8221 amount=-1 +kerning first=123 second=309 amount=1 +kerning first=1168 second=1075 amount=-1 +kerning first=1043 second=45 amount=-1 +kerning first=194 second=34 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=1038 second=44 amount=-1 +kerning first=84 second=252 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=8218 second=932 amount=-1 +kerning first=109 second=354 amount=-1 +kerning first=1038 second=1032 amount=-1 +kerning first=84 second=173 amount=-1 +kerning first=8221 second=160 amount=-1 +kerning first=902 second=8220 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=933 second=46 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=89 second=923 amount=-1 +kerning first=358 second=285 amount=-1 +kerning first=196 second=358 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=923 second=354 amount=-1 +kerning first=8216 second=916 amount=-1 +kerning first=104 second=356 amount=-1 +kerning first=1058 second=1241 amount=-1 +kerning first=932 second=949 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=8221 second=923 amount=-1 +kerning first=8204 second=8216 amount=-1 +kerning first=65 second=936 amount=-1 +kerning first=1033 second=8217 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=372 second=197 amount=-1 +kerning first=933 second=945 amount=-1 +kerning first=225 second=354 amount=-1 +kerning first=354 second=363 amount=-1 +kerning first=358 second=308 amount=-1 +kerning first=376 second=256 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=356 second=252 amount=-1 +kerning first=1043 second=8212 amount=-1 +kerning first=356 second=173 amount=-1 +kerning first=932 second=378 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=358 second=369 amount=-1 +kerning first=8220 second=941 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=376 second=171 amount=-1 +kerning first=261 second=356 amount=-1 +kerning first=8216 second=949 amount=-1 +kerning first=933 second=198 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=358 second=242 amount=-1 +kerning first=932 second=265 amount=-1 +kerning first=1043 second=1102 amount=-1 +kerning first=260 second=89 amount=-1 +kerning first=40 second=358 amount=1 +kerning first=65 second=372 amount=-1 +kerning first=315 second=932 amount=-1 +kerning first=8220 second=916 amount=-1 +kerning first=1034 second=1058 amount=-1 +kerning first=45 second=932 amount=-1 +kerning first=910 second=923 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=932 second=195 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=1043 second=58 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=260 second=34 amount=-1 +kerning first=1168 second=1088 amount=-1 +kerning first=76 second=39 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=933 second=194 amount=-1 +kerning first=89 second=125 amount=1 +kerning first=372 second=41 amount=1 +kerning first=331 second=356 amount=-1 +kerning first=8216 second=265 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=84 second=312 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=932 second=345 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=319 second=8221 amount=-1 +kerning first=317 second=372 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=932 second=8230 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=8221 second=281 amount=-1 +kerning first=939 second=8211 amount=-1 +kerning first=46 second=8221 amount=-1 +kerning first=8220 second=949 amount=-1 +kerning first=193 second=376 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=123 second=356 amount=1 +kerning first=1028 second=1095 amount=-1 +kerning first=1168 second=1032 amount=-1 +kerning first=1168 second=44 amount=-1 +kerning first=8216 second=195 amount=-1 +kerning first=1098 second=8221 amount=-1 +kerning first=936 second=913 amount=-1 +kerning first=932 second=232 amount=-1 +kerning first=929 second=916 amount=-1 +kerning first=902 second=356 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=319 second=354 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=376 second=192 amount=-1 +kerning first=936 second=258 amount=-1 +kerning first=1027 second=1044 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=932 second=97 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=306 second=125 amount=1 +kerning first=221 second=347 amount=-1 +kerning first=356 second=312 amount=-1 +kerning first=8217 second=913 amount=-1 +kerning first=8216 second=8230 amount=-1 +kerning first=86 second=192 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=358 second=380 amount=-1 +kerning first=8217 second=258 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=197 second=936 amount=-1 +kerning first=87 second=923 amount=-1 +kerning first=915 second=965 amount=-1 +kerning first=193 second=358 amount=-1 +kerning first=902 second=8217 amount=-1 +kerning first=271 second=104 amount=1 +kerning first=354 second=271 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=8220 second=265 amount=-1 +kerning first=195 second=932 amount=-1 +kerning first=8212 second=354 amount=-1 +kerning first=84 second=962 amount=-1 +kerning first=326 second=84 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=8221 second=244 amount=-1 +kerning first=34 second=46 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=916 second=356 amount=-1 +kerning first=1043 second=1116 amount=-1 +kerning first=358 second=267 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=8220 second=195 amount=-1 +kerning first=45 second=939 amount=-1 +kerning first=923 second=87 amount=-1 +kerning first=89 second=260 amount=-1 +kerning first=1026 second=1026 amount=-1 +kerning first=354 second=65 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=1058 second=1097 amount=-1 +kerning first=271 second=314 amount=1 +kerning first=221 second=44 amount=-1 +kerning first=1043 second=1060 amount=-1 +kerning first=8230 second=8216 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=8221 second=260 amount=-1 +kerning first=1168 second=1101 amount=-1 +kerning first=913 second=376 amount=-1 +kerning first=197 second=372 amount=-1 +kerning first=916 second=8217 amount=-1 +kerning first=259 second=356 amount=-1 +kerning first=89 second=8249 amount=-1 +kerning first=8220 second=8230 amount=-1 +kerning first=356 second=962 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=932 second=361 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=354 second=966 amount=-1 +kerning first=358 second=343 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=256 second=376 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=354 second=238 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=313 second=932 amount=-1 +kerning first=910 second=940 amount=-1 +kerning first=8211 second=356 amount=-1 +kerning first=34 second=198 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=932 second=251 amount=-1 +kerning first=936 second=196 amount=-1 +kerning first=8222 second=87 amount=-1 +kerning first=1058 second=8211 amount=-1 +kerning first=929 second=195 amount=-1 +kerning first=358 second=237 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=329 second=354 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=923 second=933 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=104 second=932 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=356 second=256 amount=-1 +kerning first=932 second=110 amount=-1 +kerning first=913 second=358 amount=-1 +kerning first=258 second=34 amount=-1 +kerning first=1107 second=8230 amount=-1 +kerning first=39 second=46 amount=-1 +kerning first=376 second=74 amount=-1 +kerning first=87 second=125 amount=1 +kerning first=950 second=93 amount=1 +kerning first=8250 second=376 amount=-1 +kerning first=8217 second=196 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=910 second=260 amount=-1 +kerning first=1034 second=8221 amount=-1 +kerning first=256 second=358 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=376 second=371 amount=-1 +kerning first=929 second=8230 amount=-2 +kerning first=915 second=971 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=44 second=8221 amount=-1 +kerning first=955 second=8217 amount=-1 +kerning first=915 second=173 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=354 second=299 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=34 second=194 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=195 second=939 amount=-1 +kerning first=939 second=45 amount=-1 +kerning first=1168 second=1080 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=1118 second=44 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=1043 second=8250 amount=-1 +kerning first=932 second=328 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=319 second=8211 amount=-1 +kerning first=261 second=932 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=358 second=301 amount=-1 +kerning first=8221 second=269 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=910 second=948 amount=-1 +kerning first=221 second=923 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1113 second=8217 amount=-1 +kerning first=8250 second=358 amount=-1 +kerning first=123 second=86 amount=1 +kerning first=8217 second=233 amount=-1 +kerning first=932 second=228 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=8221 second=197 amount=-1 +kerning first=1058 second=1111 amount=-1 +kerning first=39 second=198 amount=-1 +kerning first=902 second=86 amount=-1 +kerning first=196 second=936 amount=-1 +kerning first=321 second=8216 amount=-1 +kerning first=319 second=87 amount=-1 +kerning first=293 second=356 amount=-1 +kerning first=192 second=932 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=328 second=84 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=932 second=248 amount=-1 +kerning first=354 second=974 amount=-1 +kerning first=939 second=8212 amount=-1 +kerning first=354 second=249 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=331 second=932 amount=-1 +kerning first=376 second=8211 amount=-1 +kerning first=160 second=902 amount=-1 +kerning first=8217 second=8217 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=84 second=961 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=356 second=192 amount=-1 +kerning first=260 second=356 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=358 second=252 amount=-1 +kerning first=39 second=194 amount=-1 +kerning first=8221 second=235 amount=-1 +kerning first=932 second=279 amount=-1 +kerning first=358 second=173 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=123 second=932 amount=1 +kerning first=1043 second=1108 amount=-1 +kerning first=354 second=923 amount=-1 +kerning first=229 second=84 amount=-1 +kerning first=358 second=111 amount=-1 +kerning first=1034 second=1063 amount=-1 +kerning first=196 second=372 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=902 second=932 amount=-1 +kerning first=910 second=197 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=46 second=933 amount=-1 +kerning first=1068 second=1035 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=939 second=193 amount=-1 +kerning first=947 second=8230 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=1168 second=1093 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=969 second=39 amount=-1 +kerning first=74 second=93 amount=1 +kerning first=372 second=46 amount=-1 +kerning first=34 second=308 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=356 second=961 amount=-1 +kerning first=1043 second=8230 amount=-1 +kerning first=97 second=358 amount=-1 +kerning first=376 second=273 amount=-1 +kerning first=221 second=125 amount=1 +kerning first=1027 second=1105 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=76 second=376 amount=-1 +kerning first=295 second=354 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=957 second=44 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=910 second=963 amount=-1 +kerning first=8212 second=933 amount=-1 +kerning first=1058 second=45 amount=-1 +kerning first=932 second=969 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=916 second=932 amount=-1 +kerning first=932 second=241 amount=-1 +kerning first=306 second=41 amount=1 +kerning first=358 second=224 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=40 second=372 amount=1 +kerning first=8220 second=248 amount=-1 +kerning first=192 second=939 amount=-1 +kerning first=932 second=913 amount=-1 +kerning first=84 second=371 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=76 second=358 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=317 second=8211 amount=-1 +kerning first=259 second=932 amount=-1 +kerning first=358 second=339 amount=-1 +kerning first=372 second=198 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=241 second=354 amount=-1 +kerning first=932 second=258 amount=-1 +kerning first=915 second=962 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=319 second=45 amount=-1 +kerning first=354 second=281 amount=-1 +kerning first=8216 second=969 amount=-1 +kerning first=1168 second=1072 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=160 second=221 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=354 second=125 amount=1 +kerning first=8204 second=8218 amount=-1 +kerning first=932 second=307 amount=-1 +kerning first=1058 second=8212 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=358 second=312 amount=-1 +kerning first=376 second=239 amount=1 +kerning first=1027 second=1083 amount=-1 +kerning first=8211 second=932 amount=-1 +kerning first=358 second=275 amount=-1 +kerning first=39 second=308 amount=-1 +kerning first=193 second=936 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=8216 second=913 amount=-1 +kerning first=902 second=939 amount=-1 +kerning first=194 second=932 amount=-1 +kerning first=915 second=256 amount=-1 +kerning first=86 second=239 amount=1 +kerning first=356 second=371 amount=-1 +kerning first=65 second=933 amount=-1 +kerning first=8216 second=258 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=372 second=194 amount=-1 +kerning first=8216 second=1035 amount=1 +kerning first=1168 second=1107 amount=-1 +kerning first=376 second=45 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=8216 second=8220 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=257 second=354 amount=-1 +kerning first=319 second=8212 amount=-1 +kerning first=354 second=940 amount=-1 +kerning first=8220 second=969 amount=-1 +kerning first=1058 second=58 amount=-1 +kerning first=84 second=8211 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=910 second=972 amount=-1 +kerning first=228 second=84 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=196 second=8221 amount=-1 +kerning first=193 second=372 amount=-1 +kerning first=1026 second=1066 amount=-1 +kerning first=916 second=939 amount=-1 +kerning first=932 second=382 amount=-1 +kerning first=939 second=941 amount=-1 +kerning first=358 second=962 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=87 second=41 amount=1 +kerning first=8217 second=271 amount=-1 +kerning first=1033 second=1059 amount=-1 +kerning first=358 second=243 amount=-1 +kerning first=44 second=933 amount=-1 +kerning first=1043 second=1099 amount=-1 +kerning first=1168 second=187 amount=-1 +kerning first=1066 second=1035 amount=-1 +kerning first=260 second=86 amount=-1 +kerning first=8230 second=39 amount=-1 +kerning first=271 second=322 amount=1 +kerning first=932 second=115 amount=-1 +kerning first=936 second=65 amount=-1 +kerning first=8220 second=913 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=933 second=173 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=358 second=103 amount=-1 +kerning first=372 second=93 amount=1 +kerning first=196 second=354 amount=-1 +kerning first=354 second=260 amount=-1 +kerning first=1114 second=8221 amount=-1 +kerning first=8220 second=258 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=932 second=196 amount=-1 +kerning first=939 second=916 amount=-1 +kerning first=1068 second=8217 amount=-1 +kerning first=8220 second=1035 amount=1 +kerning first=84 second=305 amount=-1 +kerning first=293 second=932 amount=-1 +kerning first=356 second=8211 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=1043 second=1044 amount=-1 +kerning first=376 second=8212 amount=-1 +kerning first=8217 second=65 amount=-1 +kerning first=913 second=936 amount=-1 +kerning first=1168 second=1085 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=358 second=256 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=8220 second=8220 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=932 second=333 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=8211 second=939 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=8221 second=283 amount=-1 +kerning first=256 second=936 amount=-1 +kerning first=354 second=948 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=358 second=171 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=915 second=192 amount=-1 +kerning first=260 second=932 amount=-1 +kerning first=8216 second=196 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=194 second=939 amount=-1 +kerning first=932 second=959 amount=-1 +kerning first=315 second=8216 amount=-1 +kerning first=171 second=910 amount=-1 +kerning first=939 second=949 amount=-1 +kerning first=932 second=233 amount=-1 +kerning first=929 second=913 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1033 second=1038 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=376 second=193 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=1168 second=1169 amount=-1 +kerning first=89 second=349 amount=-1 +kerning first=929 second=258 amount=-1 +kerning first=936 second=44 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=40 second=354 amount=1 +kerning first=70 second=198 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=913 second=372 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=8221 second=349 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=76 second=173 amount=-1 +kerning first=197 second=933 amount=-1 +kerning first=915 second=961 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=8217 second=44 amount=-2 +kerning first=8216 second=959 amount=-1 +kerning first=256 second=372 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=1091 second=44 amount=-1 +kerning first=84 second=239 amount=-1 +kerning first=932 second=291 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=321 second=39 amount=-1 +kerning first=109 second=84 amount=-1 +kerning first=923 second=221 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=358 second=263 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=8221 second=101 amount=-1 +kerning first=354 second=197 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=8220 second=196 amount=-1 +kerning first=8204 second=376 amount=-1 +kerning first=923 second=84 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=308 second=125 amount=1 +kerning first=356 second=351 amount=-1 +kerning first=939 second=195 amount=-1 +kerning first=317 second=8212 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=358 second=192 amount=-1 +kerning first=221 second=41 amount=1 +kerning first=1168 second=1098 amount=-1 +kerning first=354 second=341 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=225 second=84 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=8221 second=46 amount=-2 +kerning first=193 second=8221 amount=-1 +kerning first=102 second=125 amount=1 +kerning first=8216 second=291 amount=-1 +kerning first=356 second=239 amount=-1 +kerning first=932 second=363 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=354 second=963 amount=-1 +kerning first=195 second=8216 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=8220 second=959 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=227 second=358 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=939 second=8230 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=8222 second=221 amount=-1 +kerning first=260 second=939 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=936 second=923 amount=-1 +kerning first=965 second=39 amount=-1 +kerning first=1026 second=1058 amount=-1 +kerning first=8217 second=160 amount=-1 +kerning first=932 second=245 amount=-1 +kerning first=1059 second=46 amount=-1 +kerning first=358 second=961 amount=-1 +kerning first=1058 second=8250 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=1066 second=8217 amount=-1 +kerning first=358 second=234 amount=-1 +kerning first=929 second=196 amount=-1 +kerning first=933 second=962 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=968 second=34 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=8217 second=923 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=354 second=41 amount=1 +kerning first=356 second=303 amount=-1 +kerning first=84 second=8212 amount=-1 +kerning first=915 second=970 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=8221 second=198 amount=-1 +kerning first=910 second=46 amount=-1 +kerning first=1168 second=1077 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=326 second=356 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=258 second=932 amount=-1 +kerning first=933 second=256 amount=-1 +kerning first=1038 second=46 amount=-1 +kerning first=313 second=8216 amount=-1 +kerning first=160 second=89 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=358 second=289 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=910 second=945 amount=-1 +kerning first=934 second=44 amount=-1 +kerning first=91 second=106 amount=1 +kerning first=70 second=308 amount=-1 +kerning first=913 second=8221 amount=-1 +kerning first=91 second=1095 amount=-1 +kerning first=319 second=221 amount=-1 +kerning first=1040 second=1026 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=8221 second=194 amount=-1 +kerning first=356 second=8212 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=1027 second=44 amount=-1 +kerning first=1027 second=1032 amount=-1 +kerning first=196 second=933 amount=-1 +kerning first=319 second=84 amount=-1 +kerning first=354 second=367 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=358 second=74 amount=-1 +kerning first=915 second=8211 amount=-1 +kerning first=913 second=354 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=934 second=939 amount=-1 +kerning first=910 second=198 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=8221 second=337 amount=-1 +kerning first=932 second=230 amount=-1 +kerning first=358 second=371 amount=-1 +kerning first=354 second=972 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=76 second=372 amount=-1 +kerning first=8212 second=221 amount=-1 +kerning first=256 second=354 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=324 second=358 amount=-1 +kerning first=89 second=93 amount=1 +kerning first=8212 second=84 amount=-1 +kerning first=1058 second=8230 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=904 second=912 amount=1 +kerning first=356 second=193 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=358 second=353 amount=-1 +kerning first=8217 second=281 amount=-1 +kerning first=8221 second=231 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=932 second=271 amount=-1 +kerning first=1169 second=8230 amount=-1 +kerning first=910 second=194 amount=-1 +kerning first=187 second=89 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=192 second=8216 amount=-1 +kerning first=224 second=358 amount=-1 +kerning first=1168 second=1090 amount=-1 +kerning first=932 second=65 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=933 second=192 amount=-1 +kerning first=258 second=939 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=306 second=93 amount=1 +kerning first=8216 second=271 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=932 second=347 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=917 second=912 amount=1 +kerning first=84 second=287 amount=-1 +kerning first=8221 second=285 amount=-1 +kerning first=91 second=358 amount=1 +kerning first=372 second=301 amount=1 +kerning first=376 second=265 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=358 second=8211 amount=-1 +kerning first=1168 second=46 amount=-1 +kerning first=87 second=198 amount=-1 +kerning first=89 second=308 amount=-1 +kerning first=932 second=966 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=1059 second=1026 amount=1 +kerning first=193 second=87 amount=-1 +kerning first=932 second=238 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=358 second=225 amount=-1 +kerning first=902 second=8216 amount=-1 +kerning first=376 second=195 amount=-1 +kerning first=8216 second=65 amount=-1 +kerning first=936 second=260 amount=-1 +kerning first=933 second=961 amount=-1 +kerning first=8221 second=308 amount=-1 +kerning first=8249 second=939 amount=-1 +kerning first=932 second=99 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=329 second=84 amount=-1 +kerning first=1041 second=1035 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=328 second=356 amount=-1 +kerning first=221 second=349 amount=-1 +kerning first=160 second=8220 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=173 second=376 amount=-1 +kerning first=8217 second=260 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=358 second=305 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=376 second=8230 amount=-1 +kerning first=8216 second=966 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=932 second=44 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=315 second=39 amount=-1 +kerning first=84 second=941 amount=-1 +kerning first=102 second=8216 amount=1 +kerning first=34 second=256 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=8221 second=242 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1038 second=1026 amount=1 +kerning first=358 second=273 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=932 second=299 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=308 second=41 amount=1 +kerning first=86 second=8230 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=229 second=356 amount=-1 +kerning first=358 second=277 amount=-1 +kerning first=97 second=354 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=193 second=933 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=1111 second=1115 amount=1 +kerning first=923 second=89 amount=-1 +kerning first=321 second=376 amount=-1 +kerning first=8220 second=65 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=84 second=916 amount=-1 +kerning first=173 second=358 amount=-1 +kerning first=102 second=41 amount=1 +kerning first=915 second=45 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=271 second=316 amount=1 +kerning first=221 second=46 amount=-1 +kerning first=8216 second=44 amount=-1 +kerning first=8216 second=1032 amount=-1 +kerning first=1168 second=1103 amount=-1 +kerning first=354 second=349 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=356 second=941 amount=-1 +kerning first=923 second=34 amount=-1 +kerning first=356 second=246 amount=-1 +kerning first=87 second=93 amount=1 +kerning first=913 second=87 amount=-1 +kerning first=1056 second=8230 amount=-2 +kerning first=110 second=358 amount=-1 +kerning first=358 second=351 amount=-1 +kerning first=326 second=932 amount=-1 +kerning first=8220 second=966 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=354 second=236 amount=-1 +kerning first=1058 second=1044 amount=-1 +kerning first=1168 second=59 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=256 second=87 amount=-1 +kerning first=932 second=974 amount=-1 +kerning first=321 second=358 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=356 second=916 amount=-1 +kerning first=932 second=249 amount=-1 +kerning first=84 second=949 amount=-1 +kerning first=936 second=197 amount=-1 +kerning first=1026 second=1063 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=8222 second=89 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=358 second=239 amount=-1 +kerning first=932 second=259 amount=-1 +kerning first=933 second=970 amount=1 +kerning first=1043 second=1096 amount=-1 +kerning first=194 second=8216 amount=-1 +kerning first=932 second=112 amount=-1 +kerning first=39 second=256 amount=-1 +kerning first=226 second=358 amount=-1 +kerning first=358 second=100 amount=-1 +kerning first=929 second=65 amount=-1 +kerning first=915 second=8212 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=160 second=8222 amount=-1 +kerning first=932 second=923 amount=-1 +kerning first=8217 second=197 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=8220 second=44 amount=-1 +kerning first=939 second=913 amount=-1 +kerning first=195 second=39 amount=-1 +kerning first=8220 second=1032 amount=-1 +kerning first=915 second=912 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=1058 second=1078 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=913 second=933 amount=-1 +kerning first=8216 second=974 amount=-1 +kerning first=1168 second=1082 amount=-1 +kerning first=939 second=258 amount=-1 +kerning first=354 second=297 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=1118 second=46 amount=-1 +kerning first=34 second=192 amount=-1 +kerning first=358 second=45 amount=-1 +kerning first=356 second=949 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=932 second=326 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=84 second=265 amount=-1 +kerning first=8221 second=267 amount=-1 +kerning first=358 second=303 amount=-1 +kerning first=256 second=933 amount=-1 +kerning first=354 second=945 amount=-1 +kerning first=295 second=84 amount=-1 +kerning first=8216 second=923 amount=-1 +kerning first=915 second=193 amount=-1 +kerning first=1168 second=1026 amount=1 +kerning first=933 second=8211 amount=-1 +kerning first=221 second=194 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=1107 second=44 amount=-1 +kerning first=932 second=229 amount=-1 +kerning first=915 second=58 amount=-1 +kerning first=1068 second=1059 amount=-1 +kerning first=84 second=195 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=34 second=961 amount=-1 +kerning first=1168 second=1118 amount=-1 +kerning first=319 second=89 amount=-1 +kerning first=354 second=198 amount=-1 +kerning first=929 second=44 amount=-2 +kerning first=221 second=337 amount=-1 +kerning first=313 second=39 amount=-1 +kerning first=1075 second=8230 amount=-1 +kerning first=173 second=910 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=356 second=265 amount=-1 +kerning first=1035 second=1026 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=84 second=8230 amount=-1 +kerning first=8220 second=974 amount=-1 +kerning first=228 second=356 amount=-1 +kerning first=358 second=8212 amount=-1 +kerning first=923 second=8220 amount=-1 +kerning first=319 second=34 amount=-1 +kerning first=271 second=98 amount=1 +kerning first=354 second=261 amount=-1 +kerning first=241 second=84 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=46 second=34 amount=-1 +kerning first=354 second=114 amount=-1 +kerning first=1040 second=1066 amount=-1 +kerning first=8212 second=89 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=356 second=195 amount=-1 +kerning first=39 second=192 amount=-1 +kerning first=221 second=93 amount=1 +kerning first=932 second=281 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=260 second=8216 amount=-1 +kerning first=932 second=125 amount=1 +kerning first=358 second=257 amount=-1 +kerning first=8220 second=923 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=354 second=194 amount=-1 +kerning first=358 second=113 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=1068 second=1038 amount=-1 +kerning first=935 second=912 amount=1 +kerning first=356 second=8230 amount=-1 +kerning first=939 second=196 amount=-1 +kerning first=1058 second=1091 amount=-1 +kerning first=358 second=193 amount=-1 +kerning first=328 second=932 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=1168 second=1095 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=76 second=8211 amount=-1 +kerning first=372 second=256 amount=-1 +kerning first=1113 second=1098 amount=-1 diff --git a/assets/style/myriad-medium.fnt b/assets/style/myriad-medium.fnt new file mode 100644 index 00000000..7e302b2b --- /dev/null +++ b/assets/style/myriad-medium.fnt @@ -0,0 +1,3951 @@ +info face="MyriadPro-Regular" size=14 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=18 base=11 scaleW=128 scaleH=512 pages=1 packed=0 +page id=0 file="myriad-medium.png" +chars count=506 +char id=0 x=9 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=13 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=33 x=121 y=121 width=5 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=34 x=81 y=425 width=7 height=6 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=35 x=18 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=36 x=110 y=0 width=9 height=15 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=37 x=27 y=162 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=38 x=40 y=162 width=11 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=39 x=88 y=425 width=4 height=6 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=40 x=115 y=92 width=6 height=14 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=41 x=121 y=92 width=6 height=14 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=42 x=12 y=425 width=8 height=7 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=43 x=110 y=367 width=10 height=10 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=44 x=20 y=425 width=5 height=7 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=45 x=75 y=433 width=6 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=46 x=39 y=433 width=5 height=4 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=47 x=105 y=135 width=8 height=13 xoffset=-2 yoffset=0 xadvance=5 page=0 chnl=0 +char id=48 x=51 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=49 x=60 y=162 width=6 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=50 x=66 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=51 x=75 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=52 x=84 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=53 x=93 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=54 x=102 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=55 x=111 y=162 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=56 x=0 y=175 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=57 x=113 y=135 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=58 x=120 y=367 width=5 height=9 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=59 x=120 y=162 width=5 height=12 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=60 x=32 y=379 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=61 x=92 y=425 width=10 height=6 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=62 x=42 y=379 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=63 x=9 y=175 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=64 x=17 y=175 width=12 height=12 xoffset=-1 yoffset=2 xadvance=10 page=0 chnl=0 +char id=65 x=29 y=175 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=66 x=40 y=175 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=67 x=49 y=175 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=68 x=59 y=175 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=69 x=69 y=175 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=70 x=77 y=175 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=71 x=85 y=175 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=72 x=96 y=175 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=73 x=122 y=135 width=4 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=74 x=106 y=175 width=7 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=75 x=113 y=175 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=76 x=0 y=187 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=77 x=8 y=187 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=78 x=21 y=187 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=79 x=31 y=187 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=80 x=43 y=187 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=81 x=0 y=107 width=12 height=14 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=82 x=51 y=187 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=83 x=60 y=187 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=84 x=69 y=187 width=10 height=12 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=85 x=79 y=187 width=9 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=86 x=88 y=187 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=87 x=98 y=187 width=14 height=12 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=88 x=112 y=187 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=89 x=0 y=199 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=90 x=10 y=199 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=91 x=12 y=107 width=5 height=14 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=92 x=0 y=149 width=7 height=13 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=93 x=17 y=107 width=5 height=14 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=94 x=52 y=379 width=10 height=9 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=95 x=81 y=433 width=9 height=3 xoffset=-1 yoffset=11 xadvance=7 page=0 chnl=0 +char id=96 x=121 y=425 width=5 height=5 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=97 x=62 y=379 width=8 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=98 x=20 y=199 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=99 x=70 y=379 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=100 x=30 y=199 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=101 x=78 y=379 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=102 x=39 y=199 width=7 height=12 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=103 x=46 y=199 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=104 x=55 y=199 width=8 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=105 x=122 y=175 width=5 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=106 x=119 y=0 width=6 height=15 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=107 x=63 y=199 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=108 x=122 y=187 width=4 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=109 x=87 y=379 width=13 height=9 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=110 x=100 y=379 width=9 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=111 x=109 y=379 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=112 x=71 y=199 width=10 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=113 x=81 y=199 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=114 x=119 y=379 width=7 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=115 x=0 y=389 width=7 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=116 x=18 y=367 width=7 height=11 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=117 x=7 y=389 width=9 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=118 x=16 y=389 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=119 x=25 y=389 width=13 height=9 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=120 x=38 y=389 width=9 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=121 x=22 y=107 width=9 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=122 x=47 y=389 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=123 x=31 y=107 width=6 height=14 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=124 x=0 y=0 width=4 height=17 xoffset=0 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=125 x=37 y=107 width=6 height=14 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=126 x=0 y=433 width=10 height=5 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=161 x=90 y=199 width=5 height=12 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=162 x=7 y=149 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=163 x=95 y=199 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=164 x=0 y=379 width=9 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=165 x=104 y=199 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=166 x=43 y=107 width=4 height=14 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=167 x=16 y=149 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=168 x=44 y=433 width=7 height=4 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=169 x=25 y=367 width=11 height=11 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=170 x=25 y=425 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=171 x=94 y=416 width=8 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=172 x=32 y=425 width=10 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=173 x=90 y=433 width=6 height=3 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=174 x=42 y=425 width=8 height=7 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=175 x=96 y=433 width=6 height=3 xoffset=-1 yoffset=1 xadvance=4 page=0 chnl=0 +char id=176 x=102 y=425 width=7 height=6 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=177 x=9 y=379 width=10 height=10 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=178 x=102 y=416 width=6 height=8 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=179 x=108 y=416 width=6 height=8 xoffset=-1 yoffset=-2 xadvance=4 page=0 chnl=0 +char id=180 x=10 y=433 width=5 height=5 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=181 x=113 y=199 width=9 height=12 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=182 x=47 y=107 width=8 height=14 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=183 x=51 y=433 width=5 height=4 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=184 x=15 y=433 width=6 height=5 xoffset=-1 yoffset=10 xadvance=4 page=0 chnl=0 +char id=185 x=114 y=416 width=5 height=8 xoffset=-1 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=186 x=50 y=425 width=7 height=7 xoffset=-1 yoffset=2 xadvance=5 page=0 chnl=0 +char id=187 x=119 y=416 width=8 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=188 x=0 y=211 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=189 x=13 y=211 width=12 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=190 x=25 y=211 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=191 x=38 y=211 width=8 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=192 x=0 y=17 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=193 x=11 y=17 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=194 x=22 y=17 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=195 x=33 y=17 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=196 x=55 y=107 width=11 height=14 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=197 x=44 y=17 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=198 x=46 y=211 width=14 height=12 xoffset=-2 yoffset=0 xadvance=11 page=0 chnl=0 +char id=199 x=55 y=17 width=10 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=200 x=65 y=17 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=201 x=73 y=17 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=202 x=81 y=17 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=203 x=66 y=107 width=8 height=14 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=204 x=89 y=17 width=6 height=15 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=205 x=95 y=17 width=6 height=15 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=206 x=101 y=17 width=7 height=15 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=207 x=74 y=107 width=7 height=14 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=208 x=60 y=211 width=12 height=12 xoffset=-2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=209 x=108 y=17 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=210 x=0 y=32 width=12 height=15 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=211 x=12 y=32 width=12 height=15 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=212 x=81 y=107 width=12 height=14 xoffset=-1 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=213 x=24 y=32 width=12 height=15 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=214 x=93 y=107 width=12 height=14 xoffset=-1 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=215 x=55 y=389 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=216 x=25 y=149 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=217 x=118 y=17 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=218 x=36 y=32 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=219 x=45 y=32 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=220 x=105 y=107 width=9 height=14 xoffset=0 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=221 x=54 y=32 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=222 x=72 y=211 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=223 x=80 y=211 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=224 x=89 y=211 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=225 x=97 y=211 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=226 x=105 y=211 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=227 x=113 y=211 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=228 x=0 y=223 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=229 x=8 y=223 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=230 x=65 y=389 width=13 height=9 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=231 x=16 y=223 width=8 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=232 x=24 y=223 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=233 x=33 y=223 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=234 x=42 y=223 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=235 x=51 y=223 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=236 x=121 y=211 width=6 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=237 x=60 y=223 width=6 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=238 x=66 y=223 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=239 x=73 y=223 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=240 x=80 y=223 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=241 x=90 y=223 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=242 x=99 y=223 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=243 x=109 y=223 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=244 x=0 y=235 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=245 x=10 y=235 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=246 x=20 y=235 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=247 x=78 y=389 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=248 x=36 y=367 width=10 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=249 x=30 y=235 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=250 x=39 y=235 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=251 x=48 y=235 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=252 x=57 y=235 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=253 x=4 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=254 x=64 y=32 width=9 height=15 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=255 x=13 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=256 x=114 y=107 width=11 height=14 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=257 x=46 y=367 width=8 height=11 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=258 x=73 y=32 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=259 x=119 y=223 width=8 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=260 x=84 y=32 width=11 height=15 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=261 x=66 y=235 width=9 height=12 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=262 x=95 y=32 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=263 x=75 y=235 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=264 x=105 y=32 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=265 x=83 y=235 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=266 x=0 y=121 width=10 height=14 xoffset=-1 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=267 x=91 y=235 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=268 x=10 y=121 width=10 height=14 xoffset=-1 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=269 x=99 y=235 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=270 x=115 y=32 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=271 x=107 y=235 width=11 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=272 x=0 y=247 width=12 height=12 xoffset=-2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=273 x=12 y=247 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=274 x=20 y=121 width=8 height=14 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=275 x=54 y=367 width=9 height=11 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=276 x=0 y=47 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=277 x=118 y=235 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=278 x=28 y=121 width=8 height=14 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=279 x=22 y=247 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=280 x=8 y=47 width=8 height=15 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=281 x=31 y=247 width=9 height=12 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=282 x=16 y=47 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=283 x=40 y=247 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=284 x=24 y=47 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=285 x=35 y=47 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=286 x=44 y=47 width=11 height=15 xoffset=-1 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=287 x=55 y=47 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=288 x=36 y=121 width=11 height=14 xoffset=-1 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=289 x=64 y=47 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=290 x=40 y=0 width=11 height=16 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=291 x=73 y=47 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=292 x=82 y=47 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=293 x=47 y=121 width=10 height=14 xoffset=-2 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=294 x=49 y=247 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=295 x=60 y=247 width=10 height=12 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=296 x=92 y=47 width=7 height=15 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=297 x=70 y=247 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=298 x=57 y=121 width=6 height=14 xoffset=-1 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=299 x=121 y=307 width=6 height=11 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=0 +char id=300 x=99 y=47 width=7 height=15 xoffset=-2 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=301 x=77 y=247 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=302 x=106 y=47 width=5 height=15 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=303 x=111 y=47 width=5 height=15 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=304 x=63 y=121 width=5 height=14 xoffset=-1 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=305 x=123 y=331 width=4 height=9 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=0 +char id=306 x=84 y=247 width=9 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=307 x=116 y=47 width=8 height=15 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=308 x=0 y=62 width=8 height=15 xoffset=-1 yoffset=-3 xadvance=5 page=0 chnl=0 +char id=309 x=8 y=62 width=7 height=15 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=310 x=51 y=0 width=9 height=16 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=311 x=60 y=0 width=8 height=16 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=312 x=88 y=389 width=8 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=313 x=15 y=62 width=8 height=15 xoffset=0 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=314 x=23 y=62 width=6 height=15 xoffset=-1 yoffset=-3 xadvance=3 page=0 chnl=0 +char id=315 x=68 y=0 width=8 height=16 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=316 x=76 y=0 width=5 height=16 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=317 x=93 y=247 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=318 x=101 y=247 width=7 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=319 x=108 y=247 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=320 x=116 y=247 width=6 height=12 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=321 x=0 y=259 width=10 height=12 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=322 x=10 y=259 width=6 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=323 x=29 y=62 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=324 x=16 y=259 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=325 x=81 y=0 width=10 height=16 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=326 x=37 y=149 width=9 height=13 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=327 x=39 y=62 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=328 x=25 y=259 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=329 x=46 y=149 width=9 height=13 xoffset=-1 yoffset=-1 xadvance=8 page=0 chnl=0 +char id=330 x=49 y=62 width=10 height=15 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=331 x=34 y=259 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=332 x=68 y=121 width=12 height=14 xoffset=-1 yoffset=-2 xadvance=10 page=0 chnl=0 +char id=333 x=63 y=367 width=10 height=11 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=334 x=59 y=62 width=12 height=15 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=335 x=43 y=259 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=336 x=71 y=62 width=12 height=15 xoffset=-1 yoffset=-3 xadvance=10 page=0 chnl=0 +char id=337 x=53 y=259 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=338 x=80 y=121 width=14 height=14 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0 +char id=339 x=96 y=389 width=14 height=9 xoffset=-1 yoffset=3 xadvance=12 page=0 chnl=0 +char id=340 x=83 y=62 width=9 height=15 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=341 x=63 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=342 x=91 y=0 width=9 height=16 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=343 x=55 y=149 width=7 height=13 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=344 x=92 y=62 width=9 height=15 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=345 x=70 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=346 x=101 y=62 width=9 height=15 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=347 x=77 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=348 x=94 y=121 width=9 height=14 xoffset=-1 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=349 x=84 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=350 x=110 y=62 width=9 height=15 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=351 x=91 y=259 width=7 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=352 x=103 y=121 width=9 height=14 xoffset=-1 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=353 x=98 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=354 x=100 y=0 width=10 height=16 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=355 x=119 y=62 width=7 height=15 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=356 x=0 y=77 width=10 height=15 xoffset=-2 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=357 x=105 y=259 width=7 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=358 x=112 y=259 width=10 height=12 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=359 x=73 y=367 width=7 height=11 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=360 x=10 y=77 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=361 x=0 y=271 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=362 x=112 y=121 width=9 height=14 xoffset=0 yoffset=-2 xadvance=9 page=0 chnl=0 +char id=363 x=80 y=367 width=9 height=11 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=364 x=19 y=77 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=365 x=9 y=271 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=366 x=28 y=77 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=367 x=18 y=271 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=368 x=37 y=77 width=9 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=369 x=27 y=271 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=370 x=46 y=77 width=9 height=15 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=371 x=36 y=271 width=10 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=372 x=55 y=77 width=14 height=15 xoffset=-1 yoffset=-3 xadvance=12 page=0 chnl=0 +char id=373 x=46 y=271 width=13 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=374 x=69 y=77 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=375 x=22 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=376 x=0 y=135 width=10 height=14 xoffset=-1 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=377 x=79 y=77 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=378 x=59 y=271 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=379 x=10 y=135 width=10 height=14 xoffset=-1 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=380 x=67 y=271 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=381 x=89 y=77 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=382 x=75 y=271 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=894 x=89 y=367 width=5 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=900 x=21 y=433 width=5 height=5 xoffset=0 yoffset=0 xadvance=4 page=0 chnl=0 +char id=901 x=26 y=433 width=7 height=5 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=902 x=83 y=271 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=903 x=56 y=433 width=5 height=4 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=904 x=94 y=271 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=905 x=104 y=271 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=906 x=116 y=271 width=6 height=12 xoffset=-1 yoffset=0 xadvance=4 page=0 chnl=0 +char id=908 x=0 y=283 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=910 x=12 y=283 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=911 x=24 y=283 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=912 x=62 y=149 width=9 height=13 xoffset=-2 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=913 x=36 y=283 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=914 x=47 y=283 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=915 x=56 y=283 width=8 height=12 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=916 x=64 y=283 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=917 x=75 y=283 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=918 x=83 y=283 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=919 x=93 y=283 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=920 x=103 y=283 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=921 x=122 y=199 width=4 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=922 x=115 y=283 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=923 x=0 y=295 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=924 x=11 y=295 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=925 x=24 y=295 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=926 x=34 y=295 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=927 x=44 y=295 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=928 x=56 y=295 width=9 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=929 x=65 y=295 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=931 x=73 y=295 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=932 x=83 y=295 width=10 height=12 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=933 x=93 y=295 width=11 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=934 x=20 y=135 width=12 height=14 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0 +char id=935 x=104 y=295 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=936 x=114 y=295 width=11 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=937 x=0 y=307 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=938 x=32 y=135 width=7 height=14 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=939 x=39 y=135 width=11 height=14 xoffset=-1 yoffset=-2 xadvance=8 page=0 chnl=0 +char id=940 x=12 y=307 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=941 x=22 y=307 width=8 height=12 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=942 x=99 y=77 width=9 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=943 x=122 y=247 width=5 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=944 x=71 y=149 width=9 height=13 xoffset=-1 yoffset=-1 xadvance=7 page=0 chnl=0 +char id=945 x=110 y=389 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=946 x=108 y=77 width=10 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=947 x=30 y=307 width=10 height=12 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 +char id=948 x=40 y=307 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=949 x=0 y=398 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=950 x=118 y=77 width=8 height=15 xoffset=-1 yoffset=-1 xadvance=6 page=0 chnl=0 +char id=951 x=50 y=307 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=952 x=59 y=307 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=953 x=120 y=389 width=4 height=9 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=0 +char id=954 x=8 y=398 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=955 x=68 y=307 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=956 x=77 y=307 width=9 height=12 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=957 x=17 y=398 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=958 x=0 y=92 width=8 height=15 xoffset=-1 yoffset=0 xadvance=6 page=0 chnl=0 +char id=959 x=26 y=398 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=960 x=36 y=398 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=961 x=86 y=307 width=10 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=962 x=94 y=367 width=8 height=11 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=963 x=46 y=398 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=964 x=56 y=398 width=9 height=9 xoffset=-2 yoffset=3 xadvance=6 page=0 chnl=0 +char id=965 x=65 y=398 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=966 x=80 y=149 width=11 height=13 xoffset=-1 yoffset=2 xadvance=9 page=0 chnl=0 +char id=967 x=96 y=307 width=9 height=12 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=968 x=50 y=135 width=11 height=14 xoffset=-1 yoffset=1 xadvance=9 page=0 chnl=0 +char id=969 x=74 y=398 width=12 height=9 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=970 x=105 y=307 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=971 x=112 y=307 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=972 x=0 y=319 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=973 x=10 y=319 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=974 x=19 y=319 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1025 x=61 y=135 width=8 height=14 xoffset=0 yoffset=-2 xadvance=7 page=0 chnl=0 +char id=1026 x=69 y=135 width=12 height=14 xoffset=-2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1027 x=8 y=92 width=8 height=15 xoffset=0 yoffset=-3 xadvance=6 page=0 chnl=0 +char id=1028 x=31 y=319 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1029 x=41 y=319 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1030 x=122 y=259 width=4 height=12 xoffset=0 yoffset=0 xadvance=3 page=0 chnl=0 +char id=1031 x=81 y=135 width=7 height=14 xoffset=-2 yoffset=-2 xadvance=3 page=0 chnl=0 +char id=1032 x=50 y=319 width=7 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1033 x=91 y=149 width=15 height=13 xoffset=-2 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1034 x=57 y=319 width=14 height=12 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=0 +char id=1035 x=71 y=319 width=12 height=12 xoffset=-2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1036 x=16 y=92 width=9 height=15 xoffset=0 yoffset=-3 xadvance=8 page=0 chnl=0 +char id=1038 x=25 y=92 width=10 height=15 xoffset=-1 yoffset=-3 xadvance=7 page=0 chnl=0 +char id=1039 x=35 y=92 width=9 height=15 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1040 x=83 y=319 width=11 height=12 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1041 x=94 y=319 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1042 x=103 y=319 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1043 x=112 y=319 width=8 height=12 xoffset=0 yoffset=0 xadvance=6 page=0 chnl=0 +char id=1044 x=44 y=92 width=11 height=15 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1045 x=0 y=331 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1046 x=8 y=331 width=14 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1047 x=22 y=331 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1048 x=31 y=331 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1049 x=55 y=92 width=10 height=15 xoffset=0 yoffset=-3 xadvance=9 page=0 chnl=0 +char id=1050 x=41 y=331 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1051 x=50 y=331 width=11 height=12 xoffset=-2 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1052 x=61 y=331 width=13 height=12 xoffset=-1 yoffset=0 xadvance=11 page=0 chnl=0 +char id=1053 x=74 y=331 width=10 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1054 x=84 y=331 width=12 height=12 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1055 x=96 y=331 width=9 height=12 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1056 x=105 y=331 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1057 x=113 y=331 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1058 x=0 y=343 width=10 height=12 xoffset=-2 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1059 x=10 y=343 width=10 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1060 x=106 y=149 width=12 height=13 xoffset=-1 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1061 x=20 y=343 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1062 x=65 y=92 width=10 height=15 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1063 x=30 y=343 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1064 x=40 y=343 width=12 height=12 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1065 x=75 y=92 width=13 height=15 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1066 x=52 y=343 width=12 height=12 xoffset=-2 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1067 x=64 y=343 width=11 height=12 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=0 +char id=1068 x=75 y=343 width=9 height=12 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1069 x=84 y=343 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1070 x=94 y=343 width=13 height=12 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=0 +char id=1071 x=107 y=343 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1072 x=86 y=398 width=8 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1073 x=116 y=343 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1074 x=94 y=398 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1075 x=103 y=398 width=8 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=1076 x=0 y=355 width=9 height=12 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1077 x=111 y=398 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1078 x=0 y=407 width=12 height=9 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1079 x=12 y=407 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1080 x=20 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1081 x=9 y=355 width=9 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1082 x=29 y=407 width=8 height=9 xoffset=0 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1083 x=37 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1084 x=46 y=407 width=11 height=9 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1085 x=57 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1086 x=66 y=407 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1087 x=76 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1088 x=18 y=355 width=10 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1089 x=85 y=407 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1090 x=93 y=407 width=8 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1091 x=88 y=135 width=9 height=14 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1092 x=88 y=92 width=11 height=15 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 +char id=1093 x=101 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1094 x=28 y=355 width=10 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1095 x=110 y=407 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1096 x=0 y=416 width=12 height=9 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=1097 x=38 y=355 width=13 height=12 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=1098 x=12 y=416 width=10 height=9 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1099 x=22 y=416 width=11 height=9 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=1100 x=33 y=416 width=9 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1101 x=119 y=407 width=8 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1102 x=42 y=416 width=12 height=9 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=1103 x=54 y=416 width=8 height=9 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=1105 x=51 y=355 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1106 x=99 y=92 width=10 height=15 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1107 x=60 y=355 width=8 height=12 xoffset=-1 yoffset=0 xadvance=5 page=0 chnl=0 +char id=1108 x=62 y=416 width=9 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1109 x=120 y=398 width=7 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=1110 x=122 y=271 width=5 height=12 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=1111 x=120 y=319 width=7 height=12 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=1112 x=109 y=92 width=6 height=15 xoffset=-2 yoffset=0 xadvance=3 page=0 chnl=0 +char id=1113 x=19 y=379 width=13 height=10 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1114 x=71 y=416 width=13 height=9 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=1115 x=68 y=355 width=10 height=12 xoffset=-1 yoffset=0 xadvance=8 page=0 chnl=0 +char id=1116 x=78 y=355 width=8 height=12 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1118 x=31 y=0 width=9 height=17 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=1119 x=86 y=355 width=9 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=1168 x=97 y=135 width=8 height=14 xoffset=0 yoffset=-2 xadvance=6 page=0 chnl=0 +char id=1169 x=102 y=367 width=8 height=11 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=0 +char id=1241 x=84 y=416 width=10 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=8204 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=3 page=0 chnl=0 +char id=8211 x=102 y=433 width=9 height=3 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=8212 x=111 y=433 width=16 height=3 xoffset=-1 yoffset=6 xadvance=14 page=0 chnl=0 +char id=8216 x=57 y=425 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8217 x=62 y=425 width=5 height=7 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=8218 x=109 y=425 width=5 height=6 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=8220 x=67 y=425 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=8221 x=74 y=425 width=7 height=7 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=0 +char id=8222 x=114 y=425 width=7 height=6 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=8224 x=118 y=149 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8225 x=0 y=162 width=9 height=13 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8226 x=33 y=433 width=6 height=5 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=8230 x=61 y=433 width=14 height=4 xoffset=0 yoffset=8 xadvance=14 page=0 chnl=0 +char id=8240 x=95 y=355 width=18 height=12 xoffset=-1 yoffset=0 xadvance=16 page=0 chnl=0 +char id=8249 x=0 y=425 width=6 height=8 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=8250 x=6 y=425 width=6 height=8 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=8260 x=113 y=355 width=12 height=12 xoffset=-4 yoffset=0 xadvance=2 page=0 chnl=0 +char id=8363 x=0 y=367 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +char id=8364 x=9 y=367 width=9 height=12 xoffset=-1 yoffset=0 xadvance=7 page=0 chnl=0 +kernings count=3440 +kerning first=8216 second=281 amount=-1 +kerning first=221 second=285 amount=-1 +kerning first=39 second=961 amount=-1 +kerning first=356 second=232 amount=-1 +kerning first=34 second=74 amount=-1 +kerning first=1027 second=1107 amount=-1 +kerning first=8218 second=376 amount=-1 +kerning first=8221 second=301 amount=-1 +kerning first=358 second=335 amount=-1 +kerning first=957 second=46 amount=-1 +kerning first=257 second=84 amount=-1 +kerning first=376 second=279 amount=-1 +kerning first=356 second=97 amount=-1 +kerning first=354 second=231 amount=-1 +kerning first=89 second=210 amount=-1 +kerning first=70 second=224 amount=-1 +kerning first=1058 second=1035 amount=1 +kerning first=8216 second=937 amount=-1 +kerning first=1168 second=1040 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=932 second=940 amount=-1 +kerning first=354 second=93 amount=1 +kerning first=229 second=932 amount=-1 +kerning first=939 second=959 amount=-1 +kerning first=321 second=173 amount=-1 +kerning first=932 second=244 amount=-1 +kerning first=915 second=71 amount=-1 +kerning first=929 second=923 amount=-1 +kerning first=221 second=308 amount=-1 +kerning first=358 second=227 amount=-1 +kerning first=192 second=39 amount=-1 +kerning first=1043 second=1088 amount=-1 +kerning first=8217 second=109 amount=-1 +kerning first=196 second=221 amount=-1 +kerning first=65 second=89 amount=-1 +kerning first=947 second=44 amount=-1 +kerning first=221 second=369 amount=-1 +kerning first=315 second=262 amount=-1 +kerning first=1027 second=187 amount=-1 +kerning first=196 second=84 amount=-1 +kerning first=931 second=264 amount=-1 +kerning first=8218 second=358 amount=-1 +kerning first=1098 second=1091 amount=-1 +kerning first=84 second=361 amount=-1 +kerning first=915 second=941 amount=-1 +kerning first=939 second=181 amount=-1 +kerning first=1043 second=44 amount=-1 +kerning first=89 second=252 amount=-1 +kerning first=1043 second=1032 amount=-1 +kerning first=932 second=260 amount=-1 +kerning first=89 second=173 amount=-1 +kerning first=8216 second=940 amount=-1 +kerning first=1168 second=1074 amount=-1 +kerning first=354 second=285 amount=-1 +kerning first=8216 second=244 amount=-1 +kerning first=8220 second=281 amount=-1 +kerning first=221 second=242 amount=-1 +kerning first=65 second=34 amount=-1 +kerning first=89 second=111 amount=-1 +kerning first=1059 second=1066 amount=1 +kerning first=84 second=973 amount=-1 +kerning first=84 second=251 amount=-1 +kerning first=8217 second=324 amount=-1 +kerning first=109 second=356 amount=-1 +kerning first=933 second=45 amount=-1 +kerning first=160 second=86 amount=-1 +kerning first=1066 second=1059 amount=-1 +kerning first=902 second=39 amount=-1 +kerning first=1027 second=1085 amount=-1 +kerning first=319 second=8220 amount=-2 +kerning first=932 second=8249 amount=-1 +kerning first=358 second=287 amount=-1 +kerning first=8220 second=937 amount=-1 +kerning first=84 second=110 amount=-1 +kerning first=8221 second=111 amount=-1 +kerning first=915 second=916 amount=-2 +kerning first=317 second=89 amount=-1 +kerning first=46 second=8220 amount=-1 +kerning first=315 second=376 amount=-1 +kerning first=39 second=74 amount=-1 +kerning first=923 second=356 amount=-1 +kerning first=91 second=372 amount=1 +kerning first=45 second=376 amount=-1 +kerning first=227 second=354 amount=-1 +kerning first=354 second=308 amount=-1 +kerning first=315 second=332 amount=-1 +kerning first=8204 second=354 amount=-1 +kerning first=171 second=933 amount=-1 +kerning first=932 second=948 amount=-1 +kerning first=315 second=85 amount=-1 +kerning first=319 second=219 amount=-1 +kerning first=356 second=361 amount=-1 +kerning first=8216 second=260 amount=-1 +kerning first=1100 second=8217 amount=-1 +kerning first=221 second=262 amount=-1 +kerning first=376 second=913 amount=-1 +kerning first=1033 second=1026 amount=-1 +kerning first=1058 second=1105 amount=-1 +kerning first=1059 second=173 amount=-1 +kerning first=372 second=192 amount=-1 +kerning first=40 second=221 amount=1 +kerning first=225 second=356 amount=-1 +kerning first=1168 second=1109 amount=-1 +kerning first=319 second=81 amount=-1 +kerning first=354 second=369 amount=-1 +kerning first=376 second=258 amount=-1 +kerning first=317 second=34 amount=-1 +kerning first=356 second=973 amount=-1 +kerning first=102 second=39 amount=1 +kerning first=915 second=8250 amount=-1 +kerning first=40 second=84 amount=1 +kerning first=44 second=34 amount=-1 +kerning first=923 second=8217 amount=-1 +kerning first=356 second=251 amount=-1 +kerning first=1038 second=1066 amount=1 +kerning first=86 second=913 amount=-1 +kerning first=1027 second=1169 amount=-1 +kerning first=80 second=916 amount=-1 +kerning first=84 second=328 amount=-1 +kerning first=358 second=365 amount=-1 +kerning first=8220 second=940 amount=-1 +kerning first=258 second=8216 amount=-1 +kerning first=916 second=39 amount=-1 +kerning first=356 second=110 amount=-1 +kerning first=915 second=949 amount=-1 +kerning first=354 second=242 amount=-1 +kerning first=86 second=258 amount=-1 +kerning first=89 second=224 amount=-1 +kerning first=315 second=358 amount=-1 +kerning first=8220 second=244 amount=-1 +kerning first=246 second=358 amount=-1 +kerning first=76 second=366 amount=-1 +kerning first=8216 second=948 amount=-1 +kerning first=160 second=932 amount=-1 +kerning first=45 second=358 amount=-1 +kerning first=933 second=8212 amount=-1 +kerning first=910 second=173 amount=-1 +kerning first=8217 second=331 amount=-1 +kerning first=915 second=336 amount=-1 +kerning first=8222 second=356 amount=-1 +kerning first=1040 second=1058 amount=-1 +kerning first=971 second=39 amount=-1 +kerning first=358 second=941 amount=-1 +kerning first=221 second=332 amount=-1 +kerning first=84 second=228 amount=-1 +kerning first=8217 second=283 amount=-1 +kerning first=358 second=246 amount=-1 +kerning first=1043 second=1101 amount=-1 +kerning first=1066 second=1038 amount=-1 +kerning first=932 second=269 amount=-1 +kerning first=933 second=912 amount=1 +kerning first=1038 second=173 amount=-1 +kerning first=932 second=117 amount=-1 +kerning first=89 second=339 amount=-1 +kerning first=315 second=199 amount=-1 +kerning first=358 second=105 amount=-1 +kerning first=87 second=301 amount=1 +kerning first=111 second=932 amount=-1 +kerning first=376 second=81 amount=-1 +kerning first=944 second=34 amount=-1 +kerning first=915 second=338 amount=-1 +kerning first=70 second=256 amount=-1 +kerning first=315 second=288 amount=-1 +kerning first=76 second=45 amount=-1 +kerning first=8220 second=260 amount=-1 +kerning first=343 second=8230 amount=-1 +kerning first=356 second=328 amount=-1 +kerning first=932 second=197 amount=-1 +kerning first=358 second=916 amount=-1 +kerning first=84 second=248 amount=-1 +kerning first=8221 second=339 amount=-1 +kerning first=1058 second=1083 amount=-1 +kerning first=1168 second=1087 amount=-1 +kerning first=89 second=275 amount=-1 +kerning first=933 second=193 amount=-1 +kerning first=1113 second=1090 amount=-1 +kerning first=197 second=89 amount=-1 +kerning first=195 second=376 amount=-1 +kerning first=8216 second=269 amount=-1 +kerning first=221 second=267 amount=-1 +kerning first=8221 second=312 amount=-1 +kerning first=356 second=228 amount=-1 +kerning first=8217 second=349 amount=-1 +kerning first=228 second=932 amount=-1 +kerning first=933 second=58 amount=-1 +kerning first=955 second=39 amount=-1 +kerning first=932 second=341 amount=-1 +kerning first=1027 second=1098 amount=-1 +kerning first=84 second=279 amount=-1 +kerning first=8221 second=275 amount=-1 +kerning first=194 second=39 amount=-1 +kerning first=932 second=187 amount=-1 +kerning first=8220 second=948 amount=-1 +kerning first=65 second=8220 amount=-1 +kerning first=358 second=8250 amount=-1 +kerning first=193 second=221 amount=-1 +kerning first=376 second=115 amount=-1 +kerning first=915 second=195 amount=-2 +kerning first=315 second=362 amount=-1 +kerning first=76 second=79 amount=-1 +kerning first=8216 second=197 amount=-1 +kerning first=1046 second=1033 amount=1 +kerning first=345 second=46 amount=-1 +kerning first=221 second=199 amount=-1 +kerning first=932 second=963 amount=-1 +kerning first=8217 second=236 amount=-1 +kerning first=915 second=290 amount=-1 +kerning first=313 second=262 amount=-1 +kerning first=193 second=84 amount=-1 +kerning first=939 second=951 amount=-1 +kerning first=932 second=235 amount=-1 +kerning first=121 second=46 amount=-1 +kerning first=197 second=34 amount=-1 +kerning first=358 second=949 amount=-1 +kerning first=221 second=288 amount=-1 +kerning first=356 second=248 amount=-1 +kerning first=321 second=372 amount=-1 +kerning first=1058 second=1119 amount=-1 +kerning first=319 second=356 amount=-1 +kerning first=324 second=354 amount=-1 +kerning first=1043 second=1080 amount=-1 +kerning first=376 second=196 amount=-1 +kerning first=8217 second=101 amount=-1 +kerning first=242 second=356 amount=-1 +kerning first=354 second=380 amount=-1 +kerning first=187 second=932 amount=-1 +kerning first=112 second=354 amount=-1 +kerning first=76 second=8212 amount=-1 +kerning first=929 second=260 amount=-1 +kerning first=936 second=46 amount=-1 +kerning first=1034 second=1035 amount=-1 +kerning first=358 second=84 amount=1 +kerning first=915 second=8230 amount=-2 +kerning first=195 second=358 amount=-1 +kerning first=308 second=93 amount=1 +kerning first=86 second=196 amount=-1 +kerning first=356 second=279 amount=-1 +kerning first=358 second=378 amount=-1 +kerning first=80 second=195 amount=-1 +kerning first=376 second=333 amount=-1 +kerning first=317 second=8220 amount=-2 +kerning first=354 second=358 amount=1 +kerning first=89 second=243 amount=-1 +kerning first=8217 second=46 amount=-2 +kerning first=8216 second=963 amount=-1 +kerning first=1168 second=1066 amount=1 +kerning first=44 second=8220 amount=-1 +kerning first=313 second=376 amount=-1 +kerning first=319 second=8217 amount=-1 +kerning first=354 second=267 amount=-1 +kerning first=932 second=41 amount=1 +kerning first=8216 second=235 amount=-1 +kerning first=8220 second=269 amount=-1 +kerning first=46 second=8217 amount=-2 +kerning first=354 second=119 amount=-1 +kerning first=89 second=103 amount=-1 +kerning first=8212 second=356 amount=-1 +kerning first=224 second=354 amount=-1 +kerning first=84 second=969 amount=-1 +kerning first=1059 second=1058 amount=1 +kerning first=313 second=332 amount=-1 +kerning first=1091 second=46 amount=-1 +kerning first=102 second=93 amount=1 +kerning first=84 second=241 amount=-1 +kerning first=8217 second=297 amount=-1 +kerning first=313 second=85 amount=-1 +kerning first=8221 second=243 amount=-1 +kerning first=317 second=219 amount=-1 +kerning first=8216 second=8216 amount=-1 +kerning first=1098 second=8217 amount=-1 +kerning first=376 second=233 amount=-1 +kerning first=1027 second=1077 amount=-1 +kerning first=321 second=171 amount=-1 +kerning first=8230 second=8221 amount=-2 +kerning first=358 second=265 amount=-1 +kerning first=80 second=8230 amount=-2 +kerning first=8221 second=103 amount=-1 +kerning first=317 second=81 amount=-1 +kerning first=70 second=192 amount=-1 +kerning first=315 second=210 amount=-1 +kerning first=358 second=118 amount=-1 +kerning first=8220 second=197 amount=-1 +kerning first=45 second=910 amount=-1 +kerning first=91 second=354 amount=1 +kerning first=923 second=86 amount=-1 +kerning first=89 second=256 amount=-1 +kerning first=321 second=220 amount=-1 +kerning first=1168 second=173 amount=-1 +kerning first=84 second=913 amount=-1 +kerning first=1035 second=1066 amount=-1 +kerning first=931 second=79 amount=-1 +kerning first=8204 second=87 amount=-1 +kerning first=936 second=198 amount=-1 +kerning first=1058 second=1096 amount=-1 +kerning first=358 second=195 amount=-1 +kerning first=1043 second=1059 amount=1 +kerning first=271 second=311 amount=1 +kerning first=912 second=950 amount=1 +kerning first=1168 second=1100 amount=-1 +kerning first=84 second=258 amount=-1 +kerning first=313 second=358 amount=-1 +kerning first=8221 second=256 amount=-1 +kerning first=354 second=343 amount=-1 +kerning first=243 second=358 amount=-1 +kerning first=913 second=221 amount=-1 +kerning first=939 second=65 amount=-1 +kerning first=89 second=171 amount=-1 +kerning first=1059 second=1092 amount=-1 +kerning first=356 second=969 amount=-1 +kerning first=84 second=307 amount=-1 +kerning first=356 second=241 amount=-1 +kerning first=1038 second=1058 amount=1 +kerning first=913 second=84 amount=-1 +kerning first=932 second=367 amount=-1 +kerning first=8217 second=198 amount=-1 +kerning first=260 second=39 amount=-1 +kerning first=354 second=965 amount=-1 +kerning first=358 second=345 amount=-1 +kerning first=8220 second=963 amount=-1 +kerning first=104 second=358 amount=-1 +kerning first=256 second=221 amount=-1 +kerning first=376 second=291 amount=-1 +kerning first=354 second=237 amount=-1 +kerning first=358 second=8230 amount=-1 +kerning first=910 second=962 amount=-1 +kerning first=8220 second=235 amount=-1 +kerning first=315 second=173 amount=-1 +kerning first=915 second=214 amount=-1 +kerning first=313 second=199 amount=-1 +kerning first=109 second=932 amount=-1 +kerning first=974 second=34 amount=-1 +kerning first=221 second=210 amount=-1 +kerning first=123 second=106 amount=1 +kerning first=932 second=972 amount=-1 +kerning first=256 second=84 amount=-1 +kerning first=123 second=1095 amount=-1 +kerning first=8220 second=8216 amount=-1 +kerning first=313 second=288 amount=-1 +kerning first=356 second=913 amount=-1 +kerning first=932 second=250 amount=-1 +kerning first=939 second=966 amount=-1 +kerning first=936 second=194 amount=-1 +kerning first=341 second=8230 amount=-1 +kerning first=8222 second=86 amount=-1 +kerning first=358 second=232 amount=-1 +kerning first=923 second=932 amount=-1 +kerning first=929 second=197 amount=-1 +kerning first=1043 second=1093 amount=-1 +kerning first=329 second=356 amount=-1 +kerning first=8217 second=114 amount=-1 +kerning first=933 second=941 amount=-1 +kerning first=65 second=356 amount=-1 +kerning first=356 second=258 amount=-1 +kerning first=932 second=109 amount=-1 +kerning first=926 second=970 amount=1 +kerning first=358 second=97 amount=-1 +kerning first=197 second=8220 amount=-1 +kerning first=356 second=307 amount=-1 +kerning first=1038 second=1092 amount=-1 +kerning first=321 second=927 amount=-1 +kerning first=196 second=89 amount=-1 +kerning first=8250 second=221 amount=-1 +kerning first=192 second=376 amount=-1 +kerning first=8217 second=194 amount=-1 +kerning first=8211 second=1026 amount=-1 +kerning first=225 second=932 amount=-1 +kerning first=910 second=256 amount=-1 +kerning first=376 second=363 amount=-1 +kerning first=261 second=358 amount=-1 +kerning first=915 second=973 amount=-1 +kerning first=321 second=286 amount=-1 +kerning first=1058 second=1075 amount=-1 +kerning first=8250 second=84 amount=-1 +kerning first=319 second=268 amount=-1 +kerning first=1043 second=1038 amount=1 +kerning first=173 second=354 amount=-1 +kerning first=933 second=916 amount=-1 +kerning first=8216 second=972 amount=-1 +kerning first=1168 second=1079 amount=-1 +kerning first=354 second=301 amount=-1 +kerning first=89 second=263 amount=-1 +kerning first=34 second=193 amount=-1 +kerning first=221 second=252 amount=-1 +kerning first=65 second=8217 amount=-1 +kerning first=939 second=44 amount=-1 +kerning first=221 second=173 amount=-1 +kerning first=313 second=362 amount=-1 +kerning first=84 second=382 amount=-1 +kerning first=8217 second=337 amount=-1 +kerning first=1043 second=8249 amount=-1 +kerning first=1090 second=8230 amount=-1 +kerning first=119 second=46 amount=-1 +kerning first=196 second=34 amount=-1 +kerning first=221 second=111 amount=-1 +kerning first=932 second=324 amount=-1 +kerning first=376 second=245 amount=-1 +kerning first=1027 second=1090 amount=-1 +kerning first=321 second=8221 amount=-1 +kerning first=8221 second=263 amount=-1 +kerning first=317 second=356 amount=-1 +kerning first=89 second=927 amount=-1 +kerning first=123 second=376 amount=1 +kerning first=244 second=356 amount=-1 +kerning first=84 second=115 amount=-1 +kerning first=89 second=192 amount=-1 +kerning first=8222 second=932 amount=-1 +kerning first=110 second=354 amount=-1 +kerning first=934 second=46 amount=-1 +kerning first=89 second=286 amount=-1 +kerning first=76 second=71 amount=-1 +kerning first=192 second=358 amount=-1 +kerning first=902 second=376 amount=-1 +kerning first=8217 second=231 amount=-1 +kerning first=70 second=74 amount=-1 +kerning first=932 second=226 amount=-1 +kerning first=84 second=196 amount=-1 +kerning first=8221 second=192 amount=-1 +kerning first=321 second=354 amount=-1 +kerning first=1027 second=46 amount=-1 +kerning first=333 second=84 amount=-1 +kerning first=1043 second=1072 amount=-1 +kerning first=933 second=949 amount=-1 +kerning first=1168 second=1114 amount=-1 +kerning first=319 second=86 amount=-1 +kerning first=271 second=8221 amount=1 +kerning first=331 second=358 amount=-1 +kerning first=1034 second=8217 amount=-1 +kerning first=1113 second=1118 amount=-1 +kerning first=376 second=268 amount=-1 +kerning first=317 second=8217 amount=-1 +kerning first=1059 second=1106 amount=1 +kerning first=40 second=89 amount=1 +kerning first=44 second=8217 amount=-2 +kerning first=226 second=354 amount=-1 +kerning first=356 second=382 amount=-1 +kerning first=84 second=333 amount=-1 +kerning first=354 second=971 amount=-1 +kerning first=358 second=361 amount=-1 +kerning first=8220 second=972 amount=-1 +kerning first=123 second=358 amount=1 +kerning first=8221 second=8221 amount=-1 +kerning first=356 second=115 amount=-1 +kerning first=915 second=954 amount=-1 +kerning first=8218 second=372 amount=-1 +kerning first=354 second=252 amount=-1 +kerning first=89 second=234 amount=-1 +kerning first=354 second=173 amount=-1 +kerning first=1168 second=1058 amount=1 +kerning first=313 second=210 amount=-1 +kerning first=221 second=224 amount=-1 +kerning first=902 second=358 amount=-1 +kerning first=354 second=111 amount=-1 +kerning first=87 second=256 amount=-1 +kerning first=84 second=959 amount=-1 +kerning first=932 second=331 amount=-1 +kerning first=358 second=973 amount=-1 +kerning first=84 second=233 amount=-1 +kerning first=8217 second=285 amount=-1 +kerning first=8221 second=234 amount=-1 +kerning first=356 second=196 amount=-1 +kerning first=1033 second=1066 amount=-1 +kerning first=39 second=193 amount=-1 +kerning first=358 second=251 amount=-1 +kerning first=923 second=939 amount=-1 +kerning first=1043 second=1107 amount=-1 +kerning first=372 second=239 amount=1 +kerning first=932 second=283 amount=-1 +kerning first=84 second=356 amount=1 +kerning first=8221 second=354 amount=1 +kerning first=932 second=122 amount=-1 +kerning first=358 second=110 amount=-1 +kerning first=97 second=84 amount=-1 +kerning first=910 second=192 amount=-1 +kerning first=91 second=87 amount=1 +kerning first=1038 second=1106 amount=1 +kerning first=319 second=932 amount=-1 +kerning first=221 second=339 amount=-1 +kerning first=932 second=934 amount=-1 +kerning first=242 second=932 amount=-1 +kerning first=321 second=211 amount=-1 +kerning first=1035 second=1058 amount=-1 +kerning first=356 second=333 amount=-1 +kerning first=931 second=71 amount=-1 +kerning first=939 second=923 amount=-1 +kerning first=258 second=39 amount=-1 +kerning first=8217 second=308 amount=-1 +kerning first=1058 second=1088 amount=-1 +kerning first=376 second=230 amount=-1 +kerning first=1168 second=1092 amount=-1 +kerning first=89 second=289 amount=-1 +kerning first=933 second=195 amount=-1 +kerning first=313 second=173 amount=-1 +kerning first=197 second=356 amount=-1 +kerning first=356 second=959 amount=-1 +kerning first=973 second=34 amount=-1 +kerning first=8216 second=283 amount=-1 +kerning first=221 second=275 amount=-1 +kerning first=916 second=358 amount=-1 +kerning first=356 second=233 amount=-1 +kerning first=1043 second=187 amount=-1 +kerning first=932 second=349 amount=-1 +kerning first=1114 second=1091 amount=-1 +kerning first=1027 second=1103 amount=-1 +kerning first=84 second=291 amount=-1 +kerning first=356 second=356 amount=1 +kerning first=8221 second=289 amount=-1 +kerning first=118 second=8230 amount=-1 +kerning first=358 second=328 amount=-1 +kerning first=76 second=221 amount=-1 +kerning first=8211 second=376 amount=-1 +kerning first=295 second=356 amount=-1 +kerning first=1058 second=44 amount=-1 +kerning first=376 second=271 amount=-1 +kerning first=354 second=224 amount=-1 +kerning first=89 second=211 amount=-1 +kerning first=8212 second=932 amount=-1 +kerning first=1058 second=1032 amount=-1 +kerning first=70 second=225 amount=-1 +kerning first=910 second=961 amount=-1 +kerning first=76 second=336 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=196 second=8220 amount=-1 +kerning first=315 second=372 amount=-1 +kerning first=933 second=8230 amount=-1 +kerning first=932 second=968 amount=-1 +kerning first=8217 second=242 amount=-1 +kerning first=89 second=74 amount=-1 +kerning first=193 second=89 amount=-1 +kerning first=932 second=236 amount=-1 +kerning first=194 second=376 amount=-1 +kerning first=197 second=8217 amount=-1 +kerning first=1169 second=44 amount=-1 +kerning first=1027 second=59 amount=-1 +kerning first=358 second=228 amount=-1 +kerning first=319 second=370 amount=-1 +kerning first=1043 second=1085 amount=-1 +kerning first=1168 second=171 amount=-1 +kerning first=34 second=941 amount=-1 +kerning first=259 second=358 amount=-1 +kerning first=317 second=268 amount=-1 +kerning first=932 second=101 amount=-1 +kerning first=89 second=371 amount=-1 +kerning first=76 second=338 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=8221 second=74 amount=-1 +kerning first=354 second=339 amount=-1 +kerning first=376 second=65 amount=-1 +kerning first=245 second=354 amount=-1 +kerning first=8230 second=933 amount=-1 +kerning first=84 second=363 amount=-1 +kerning first=356 second=291 amount=-1 +kerning first=193 second=34 amount=-1 +kerning first=8211 second=358 amount=-1 +kerning first=376 second=347 amount=-1 +kerning first=354 second=312 amount=-1 +kerning first=321 second=264 amount=-1 +kerning first=89 second=353 amount=-1 +kerning first=358 second=248 amount=-1 +kerning first=241 second=356 amount=-1 +kerning first=34 second=916 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=87 second=192 amount=-1 +kerning first=271 second=108 amount=1 +kerning first=354 second=275 amount=-1 +kerning first=932 second=46 amount=-1 +kerning first=8220 second=283 amount=-1 +kerning first=221 second=243 amount=-1 +kerning first=195 second=936 amount=-1 +kerning first=315 second=171 amount=-1 +kerning first=194 second=358 amount=-1 +kerning first=84 second=245 amount=-1 +kerning first=8221 second=353 amount=-1 +kerning first=8216 second=101 amount=-1 +kerning first=1043 second=1169 amount=-1 +kerning first=221 second=103 amount=-1 +kerning first=932 second=297 amount=-1 +kerning first=1027 second=1082 amount=-1 +kerning first=321 second=8211 amount=-1 +kerning first=335 second=84 amount=-1 +kerning first=358 second=279 amount=-1 +kerning first=915 second=913 amount=-2 +kerning first=317 second=86 amount=-1 +kerning first=40 second=309 amount=1 +kerning first=315 second=220 amount=-1 +kerning first=376 second=99 amount=-1 +kerning first=76 second=290 amount=-1 +kerning first=89 second=264 amount=-1 +kerning first=931 second=336 amount=-1 +kerning first=932 second=945 amount=-1 +kerning first=329 second=932 amount=-1 +kerning first=915 second=258 amount=-2 +kerning first=1168 second=1241 amount=-1 +kerning first=319 second=213 amount=-1 +kerning first=65 second=932 amount=-1 +kerning first=356 second=363 amount=-1 +kerning first=46 second=939 amount=-1 +kerning first=221 second=256 amount=-1 +kerning first=1058 second=1101 amount=-1 +kerning first=8216 second=46 amount=-2 +kerning first=372 second=193 amount=-1 +kerning first=1027 second=1026 amount=1 +kerning first=34 second=949 amount=-1 +kerning first=321 second=87 amount=-1 +kerning first=912 second=955 amount=1 +kerning first=89 second=8211 amount=-1 +kerning first=931 second=338 amount=-1 +kerning first=376 second=44 amount=-1 +kerning first=39 second=941 amount=-1 +kerning first=356 second=245 amount=-1 +kerning first=913 second=89 amount=-1 +kerning first=221 second=171 amount=-1 +kerning first=195 second=372 amount=-1 +kerning first=173 second=933 amount=-1 +kerning first=80 second=913 amount=-1 +kerning first=1027 second=1118 amount=-1 +kerning first=257 second=356 amount=-1 +kerning first=932 second=198 amount=-1 +kerning first=354 second=962 amount=-1 +kerning first=915 second=946 amount=-1 +kerning first=8218 second=354 amount=-1 +kerning first=354 second=243 amount=-1 +kerning first=89 second=225 amount=-1 +kerning first=8212 second=939 amount=-1 +kerning first=910 second=970 amount=1 +kerning first=76 second=368 amount=-1 +kerning first=8216 second=945 amount=-1 +kerning first=80 second=258 amount=-1 +kerning first=86 second=44 amount=-1 +kerning first=354 second=372 amount=1 +kerning first=932 second=944 amount=-1 +kerning first=256 second=89 amount=-1 +kerning first=8217 second=358 amount=1 +kerning first=260 second=376 amount=-1 +kerning first=354 second=103 amount=-1 +kerning first=8220 second=101 amount=-1 +kerning first=939 second=940 amount=-1 +kerning first=317 second=932 amount=-1 +kerning first=932 second=255 amount=-1 +kerning first=39 second=916 amount=-1 +kerning first=915 second=81 amount=-1 +kerning first=358 second=969 amount=-1 +kerning first=244 second=932 amount=-1 +kerning first=8217 second=267 amount=-1 +kerning first=1033 second=1058 amount=-1 +kerning first=358 second=241 amount=-1 +kerning first=913 second=34 amount=-1 +kerning first=1043 second=1098 amount=-1 +kerning first=932 second=261 amount=-1 +kerning first=376 second=213 amount=-1 +kerning first=293 second=358 amount=-1 +kerning first=922 second=74 amount=1 +kerning first=357 second=8221 amount=1 +kerning first=932 second=114 amount=-1 +kerning first=315 second=927 amount=-1 +kerning first=926 second=912 amount=1 +kerning first=8204 second=902 amount=-1 +kerning first=84 second=86 amount=1 +kerning first=1059 second=8211 amount=-1 +kerning first=196 second=356 amount=-1 +kerning first=354 second=256 amount=-1 +kerning first=373 second=46 amount=-1 +kerning first=315 second=286 amount=-1 +kerning first=8216 second=198 amount=-1 +kerning first=931 second=290 amount=-1 +kerning first=256 second=34 amount=-1 +kerning first=8220 second=46 amount=-2 +kerning first=932 second=194 amount=-1 +kerning first=358 second=913 amount=-1 +kerning first=1068 second=1026 amount=-1 +kerning first=84 second=230 amount=-1 +kerning first=8221 second=305 amount=-1 +kerning first=1058 second=1080 amount=-1 +kerning first=89 second=273 amount=-1 +kerning first=8250 second=89 amount=-1 +kerning first=1056 second=44 amount=-2 +kerning first=1168 second=1084 amount=-1 +kerning first=1056 second=1032 amount=-1 +kerning first=939 second=260 amount=-1 +kerning first=922 second=970 amount=1 +kerning first=89 second=277 amount=-1 +kerning first=358 second=258 amount=-1 +kerning first=34 second=195 amount=-1 +kerning first=8221 second=8204 amount=-1 +kerning first=260 second=358 amount=-1 +kerning first=354 second=171 amount=-1 +kerning first=315 second=8221 amount=-1 +kerning first=1059 second=1076 amount=-1 +kerning first=313 second=372 amount=-1 +kerning first=193 second=8220 amount=-1 +kerning first=197 second=86 amount=-1 +kerning first=39 second=949 amount=-1 +kerning first=221 second=263 amount=-1 +kerning first=910 second=8211 amount=-1 +kerning first=8217 second=343 amount=-1 +kerning first=8221 second=273 amount=-1 +kerning first=358 second=307 amount=-1 +kerning first=196 second=8217 amount=-1 +kerning first=160 second=8216 amount=-1 +kerning first=932 second=337 amount=-1 +kerning first=376 second=249 amount=-1 +kerning first=1027 second=1095 amount=-1 +kerning first=8211 second=910 amount=-1 +kerning first=84 second=271 amount=-1 +kerning first=8221 second=277 amount=-1 +kerning first=317 second=370 amount=-1 +kerning first=76 second=214 amount=-1 +kerning first=8220 second=945 amount=-1 +kerning first=376 second=259 amount=-1 +kerning first=255 second=46 amount=-1 +kerning first=356 second=86 amount=1 +kerning first=915 second=196 amount=-2 +kerning first=1038 second=8211 amount=-1 +kerning first=221 second=927 amount=-1 +kerning first=315 second=354 amount=-1 +kerning first=8216 second=194 amount=-1 +kerning first=34 second=8230 amount=-2 +kerning first=221 second=192 amount=-1 +kerning first=8217 second=237 amount=-1 +kerning first=246 second=354 amount=-1 +kerning first=1107 second=46 amount=-1 +kerning first=84 second=932 amount=1 +kerning first=45 second=354 amount=-1 +kerning first=65 second=939 amount=-1 +kerning first=939 second=948 amount=-1 +kerning first=932 second=231 amount=-1 +kerning first=221 second=286 amount=-1 +kerning first=376 second=923 amount=-1 +kerning first=356 second=230 amount=-1 +kerning first=321 second=366 amount=-1 +kerning first=1114 second=8217 amount=-1 +kerning first=1043 second=1077 amount=-1 +kerning first=933 second=954 amount=-1 +kerning first=1027 second=1040 amount=-1 +kerning first=932 second=93 amount=1 +kerning first=89 second=351 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=40 second=356 amount=1 +kerning first=929 second=46 amount=-2 +kerning first=8220 second=198 amount=-1 +kerning first=8216 second=337 amount=-1 +kerning first=192 second=936 amount=-1 +kerning first=313 second=171 amount=-1 +kerning first=1038 second=1076 amount=-1 +kerning first=86 second=923 amount=-1 +kerning first=84 second=347 amount=-1 +kerning first=8221 second=351 amount=-1 +kerning first=356 second=271 amount=-1 +kerning first=80 second=196 amount=-1 +kerning first=197 second=932 amount=-1 +kerning first=915 second=959 amount=-1 +kerning first=89 second=239 amount=1 +kerning first=1058 second=1059 amount=1 +kerning first=321 second=45 amount=-1 +kerning first=313 second=220 amount=-1 +kerning first=354 second=263 amount=-1 +kerning first=70 second=257 amount=-1 +kerning first=8216 second=231 amount=-1 +kerning first=221 second=234 amount=-1 +kerning first=89 second=100 amount=-1 +kerning first=84 second=966 amount=-1 +kerning first=356 second=932 amount=1 +kerning first=295 second=932 amount=-1 +kerning first=84 second=238 amount=-1 +kerning first=8217 second=301 amount=-1 +kerning first=8221 second=239 amount=-1 +kerning first=317 second=213 amount=-1 +kerning first=39 second=195 amount=-1 +kerning first=358 second=382 amount=-1 +kerning first=44 second=939 amount=-1 +kerning first=932 second=285 amount=-1 +kerning first=376 second=229 amount=-1 +kerning first=1027 second=1074 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=8221 second=100 amount=-1 +kerning first=356 second=65 amount=-1 +kerning first=354 second=192 amount=-1 +kerning first=315 second=211 amount=-1 +kerning first=70 second=193 amount=-1 +kerning first=358 second=115 amount=-1 +kerning first=8220 second=194 amount=-1 +kerning first=931 second=214 amount=-1 +kerning first=8204 second=221 amount=-1 +kerning first=915 second=181 amount=-1 +kerning first=902 second=936 amount=-1 +kerning first=913 second=8220 amount=-1 +kerning first=227 second=84 amount=-1 +kerning first=89 second=45 amount=-1 +kerning first=1035 second=1063 amount=-1 +kerning first=356 second=347 amount=-1 +kerning first=8204 second=84 amount=-1 +kerning first=195 second=8221 amount=-1 +kerning first=192 second=372 amount=-1 +kerning first=939 second=197 amount=-1 +kerning first=1058 second=1093 amount=-1 +kerning first=39 second=8230 amount=-2 +kerning first=929 second=198 amount=-1 +kerning first=358 second=196 amount=-1 +kerning first=1075 second=44 amount=-1 +kerning first=932 second=308 amount=-1 +kerning first=8216 second=1026 amount=1 +kerning first=321 second=79 amount=-1 +kerning first=1168 second=1097 amount=-1 +kerning first=8220 second=337 amount=-1 +kerning first=84 second=44 amount=-1 +kerning first=256 second=8220 amount=-1 +kerning first=1059 second=1089 amount=-1 +kerning first=356 second=966 amount=-1 +kerning first=8216 second=285 amount=-1 +kerning first=258 second=376 amount=-1 +kerning first=221 second=289 amount=-1 +kerning first=356 second=238 amount=-1 +kerning first=932 second=369 amount=-1 +kerning first=241 second=932 amount=-1 +kerning first=1027 second=1109 amount=-1 +kerning first=195 second=354 amount=-1 +kerning first=321 second=8212 amount=-1 +kerning first=84 second=299 amount=-1 +kerning first=8221 second=303 amount=-1 +kerning first=354 second=961 amount=-1 +kerning first=358 second=333 amount=-1 +kerning first=376 second=281 amount=-1 +kerning first=356 second=99 amount=-1 +kerning first=354 second=234 amount=-1 +kerning first=1058 second=1038 amount=1 +kerning first=70 second=227 amount=-1 +kerning first=313 second=927 amount=-1 +kerning first=8220 second=231 amount=-1 +kerning first=98 second=358 amount=-1 +kerning first=376 second=125 amount=1 +kerning first=8218 second=87 amount=-1 +kerning first=123 second=372 amount=1 +kerning first=253 second=8230 amount=-1 +kerning first=354 second=354 amount=1 +kerning first=76 second=89 amount=-1 +kerning first=193 second=356 amount=-1 +kerning first=221 second=211 amount=-1 +kerning first=1059 second=45 amount=-1 +kerning first=916 second=936 amount=-1 +kerning first=89 second=79 amount=-1 +kerning first=313 second=286 amount=-1 +kerning first=939 second=963 amount=-1 +kerning first=932 second=242 amount=-1 +kerning first=358 second=959 amount=-1 +kerning first=8216 second=308 amount=-1 +kerning first=1058 second=8249 amount=-1 +kerning first=902 second=372 amount=-1 +kerning first=358 second=233 amount=-1 +kerning first=929 second=194 amount=-1 +kerning first=221 second=74 amount=-1 +kerning first=1043 second=1090 amount=-1 +kerning first=1168 second=8211 amount=-1 +kerning first=8217 second=111 amount=-1 +kerning first=1066 second=1026 amount=-1 +kerning first=86 second=125 amount=1 +kerning first=114 second=8230 amount=-1 +kerning first=358 second=356 amount=1 +kerning first=356 second=44 amount=-1 +kerning first=89 second=8212 amount=-1 +kerning first=947 second=46 amount=-1 +kerning first=1033 second=8221 amount=-1 +kerning first=258 second=358 amount=-1 +kerning first=221 second=371 amount=-1 +kerning first=313 second=8221 amount=-1 +kerning first=1038 second=1089 amount=-1 +kerning first=315 second=264 amount=-1 +kerning first=76 second=34 amount=-1 +kerning first=196 second=86 amount=-1 +kerning first=84 second=373 amount=-1 +kerning first=356 second=299 amount=-1 +kerning first=193 second=8217 amount=-1 +kerning first=8220 second=1026 amount=1 +kerning first=197 second=939 amount=-1 +kerning first=915 second=943 amount=-1 +kerning first=910 second=45 amount=-1 +kerning first=1043 second=46 amount=-1 +kerning first=1058 second=1072 amount=-1 +kerning first=933 second=913 amount=-1 +kerning first=1168 second=1076 amount=-1 +kerning first=354 second=289 amount=-1 +kerning first=89 second=257 amount=-1 +kerning first=8216 second=242 amount=-1 +kerning first=8220 second=285 amount=-1 +kerning first=221 second=353 amount=-1 +kerning first=89 second=113 amount=-1 +kerning first=315 second=8211 amount=-1 +kerning first=257 second=932 amount=-1 +kerning first=84 second=974 amount=-1 +kerning first=313 second=354 amount=-1 +kerning first=933 second=258 amount=-1 +kerning first=243 second=354 amount=-1 +kerning first=1038 second=45 amount=-1 +kerning first=84 second=249 amount=-1 +kerning first=75 second=308 amount=1 +kerning first=376 second=244 amount=-1 +kerning first=1027 second=1087 amount=-1 +kerning first=84 second=259 amount=-1 +kerning first=319 second=8249 amount=-1 +kerning first=358 second=291 amount=-1 +kerning first=1059 second=8212 amount=-1 +kerning first=84 second=112 amount=-1 +kerning first=8221 second=113 amount=-1 +kerning first=89 second=193 amount=-1 +kerning first=923 second=8216 amount=-1 +kerning first=104 second=354 amount=-1 +kerning first=1061 second=1060 amount=-1 +kerning first=8220 second=308 amount=-1 +kerning first=1026 second=1035 amount=-1 +kerning first=194 second=936 amount=-1 +kerning first=915 second=268 amount=-1 +kerning first=354 second=74 amount=-1 +kerning first=315 second=87 amount=-1 +kerning first=84 second=923 amount=-1 +kerning first=319 second=217 amount=-1 +kerning first=356 second=373 amount=-1 +kerning first=221 second=264 amount=-1 +kerning first=8221 second=193 amount=-1 +kerning first=1058 second=1107 amount=-1 +kerning first=319 second=334 amount=-1 +kerning first=372 second=195 amount=-1 +kerning first=196 second=932 amount=-1 +kerning first=933 second=946 amount=-1 +kerning first=8216 second=1040 amount=-1 +kerning first=1168 second=1111 amount=-1 +kerning first=87 second=239 amount=1 +kerning first=324 second=84 amount=-1 +kerning first=354 second=371 amount=-1 +kerning first=89 second=335 amount=-1 +kerning first=376 second=260 amount=-1 +kerning first=112 second=84 amount=-1 +kerning first=356 second=974 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=913 second=356 amount=-1 +kerning first=910 second=8212 amount=-1 +kerning first=356 second=249 amount=-1 +kerning first=221 second=8211 amount=-1 +kerning first=932 second=380 amount=-1 +kerning first=8217 second=339 amount=-1 +kerning first=84 second=326 amount=-1 +kerning first=319 second=216 amount=-1 +kerning first=356 second=259 amount=-1 +kerning first=8221 second=335 amount=-1 +kerning first=358 second=363 amount=-1 +kerning first=337 second=358 amount=-1 +kerning first=356 second=112 amount=-1 +kerning first=915 second=951 amount=-1 +kerning first=354 second=353 amount=-1 +kerning first=86 second=260 amount=-1 +kerning first=89 second=227 amount=-1 +kerning first=910 second=912 amount=1 +kerning first=8220 second=242 amount=-1 +kerning first=372 second=8230 amount=-1 +kerning first=376 second=8249 amount=-1 +kerning first=1038 second=8212 amount=-1 +kerning first=256 second=356 amount=-1 +kerning first=313 second=211 amount=-1 +kerning first=261 second=354 amount=-1 +kerning first=221 second=225 amount=-1 +kerning first=1059 second=58 amount=-1 +kerning first=8217 second=312 amount=-1 +kerning first=356 second=923 amount=-1 +kerning first=939 second=972 amount=-1 +kerning first=932 second=358 amount=1 +kerning first=1058 second=187 amount=-1 +kerning first=224 second=84 amount=-1 +kerning first=84 second=229 amount=-1 +kerning first=8217 second=275 amount=-1 +kerning first=1033 second=1063 amount=-1 +kerning first=358 second=245 amount=-1 +kerning first=248 second=358 amount=-1 +kerning first=913 second=8217 amount=-1 +kerning first=192 second=8221 amount=-1 +kerning first=932 second=267 amount=-1 +kerning first=194 second=372 amount=-1 +kerning first=1027 second=1066 amount=1 +kerning first=1043 second=1103 amount=-1 +kerning first=91 second=221 amount=1 +kerning first=932 second=119 amount=-1 +kerning first=929 second=308 amount=-1 +kerning first=376 second=334 amount=-1 +kerning first=1034 second=1059 amount=-1 +kerning first=45 second=933 amount=-1 +kerning first=910 second=193 amount=-1 +kerning first=91 second=84 amount=1 +kerning first=256 second=8217 amount=-1 +kerning first=356 second=326 amount=-1 +kerning first=8250 second=356 amount=-1 +kerning first=8220 second=1040 amount=-1 +kerning first=192 second=354 amount=-1 +kerning first=910 second=58 amount=-1 +kerning first=1043 second=59 amount=-1 +kerning first=968 second=39 amount=-1 +kerning first=40 second=932 amount=1 +kerning first=1058 second=1085 amount=-1 +kerning first=319 second=284 amount=-1 +kerning first=376 second=216 amount=-1 +kerning first=321 second=71 amount=-1 +kerning first=1168 second=1089 amount=-1 +kerning first=1036 second=1051 amount=1 +kerning first=922 second=912 amount=1 +kerning first=89 second=287 amount=-1 +kerning first=76 second=8220 amount=-2 +kerning first=8216 second=358 amount=1 +kerning first=933 second=196 amount=-1 +kerning first=221 second=273 amount=-1 +kerning first=1027 second=173 amount=-1 +kerning first=354 second=8211 amount=-1 +kerning first=331 second=354 amount=-1 +kerning first=8216 second=267 amount=-1 +kerning first=1038 second=58 amount=-1 +kerning first=221 second=277 amount=-1 +kerning first=356 second=229 amount=-1 +kerning first=1100 second=1098 amount=-1 +kerning first=902 second=8221 amount=-1 +kerning first=932 second=343 amount=-1 +kerning first=1027 second=1100 amount=-1 +kerning first=84 second=281 amount=-1 +kerning first=8221 second=287 amount=-1 +kerning first=195 second=87 amount=-1 +kerning first=76 second=219 amount=-1 +kerning first=84 second=125 amount=1 +kerning first=376 second=269 amount=-1 +kerning first=354 second=225 amount=-1 +kerning first=1168 second=45 amount=-1 +kerning first=376 second=117 amount=-1 +kerning first=123 second=354 amount=1 +kerning first=260 second=936 amount=-1 +kerning first=315 second=366 amount=-1 +kerning first=76 second=81 amount=-1 +kerning first=932 second=965 amount=-1 +kerning first=8217 second=243 amount=-1 +kerning first=354 second=87 amount=1 +kerning first=89 second=71 amount=-1 +kerning first=313 second=264 amount=-1 +kerning first=193 second=86 amount=-1 +kerning first=932 second=237 amount=-1 +kerning first=915 second=65 amount=-2 +kerning first=1068 second=1066 amount=-1 +kerning first=333 second=356 amount=-1 +kerning first=902 second=354 amount=-1 +kerning first=1058 second=1169 amount=-1 +kerning first=319 second=364 amount=-1 +kerning first=1043 second=1082 amount=-1 +kerning first=343 second=44 amount=-1 +kerning first=376 second=197 amount=-1 +kerning first=8217 second=103 amount=-1 +kerning first=196 second=939 amount=-1 +kerning first=936 second=256 amount=-1 +kerning first=933 second=959 amount=-1 +kerning first=8249 second=910 amount=-1 +kerning first=34 second=969 amount=-1 +kerning first=319 second=8216 amount=-2 +kerning first=89 second=365 amount=-1 +kerning first=958 second=125 amount=1 +kerning first=376 second=284 amount=-1 +kerning first=46 second=8216 amount=-1 +kerning first=354 second=305 amount=-1 +kerning first=1034 second=1038 amount=-1 +kerning first=358 second=86 amount=1 +kerning first=102 second=8221 amount=1 +kerning first=221 second=351 amount=-1 +kerning first=313 second=8211 amount=-1 +kerning first=86 second=197 amount=-1 +kerning first=315 second=45 amount=-1 +kerning first=356 second=281 amount=-1 +kerning first=173 second=221 amount=-1 +kerning first=916 second=8221 amount=-1 +kerning first=8217 second=256 amount=-1 +kerning first=356 second=125 amount=1 +kerning first=915 second=966 amount=-1 +kerning first=317 second=8249 amount=-1 +kerning first=89 second=246 amount=-1 +kerning first=963 second=912 amount=1 +kerning first=358 second=230 amount=-1 +kerning first=354 second=273 amount=-1 +kerning first=8220 second=358 amount=1 +kerning first=1043 second=1026 amount=1 +kerning first=34 second=913 amount=-1 +kerning first=87 second=193 amount=-1 +kerning first=354 second=277 amount=-1 +kerning first=173 second=84 amount=-1 +kerning first=933 second=181 amount=-1 +kerning first=8220 second=267 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=221 second=239 amount=1 +kerning first=195 second=933 amount=-1 +kerning first=354 second=121 amount=-1 +kerning first=84 second=940 amount=-1 +kerning first=34 second=258 amount=-1 +kerning first=84 second=244 amount=-1 +kerning first=313 second=87 amount=-1 +kerning first=8221 second=246 amount=-1 +kerning first=260 second=372 amount=-1 +kerning first=317 second=217 amount=-1 +kerning first=1043 second=1118 amount=-1 +kerning first=221 second=100 amount=-1 +kerning first=932 second=301 amount=-1 +kerning first=376 second=235 amount=-1 +kerning first=1027 second=1079 amount=-1 +kerning first=1168 second=8212 amount=-1 +kerning first=916 second=354 amount=-1 +kerning first=317 second=334 amount=-1 +kerning first=358 second=271 amount=-1 +kerning first=97 second=356 amount=-1 +kerning first=193 second=932 amount=-1 +kerning first=8221 second=105 amount=-1 +kerning first=70 second=195 amount=-1 +kerning first=110 second=84 amount=-1 +kerning first=321 second=221 amount=-1 +kerning first=315 second=79 amount=-1 +kerning first=319 second=212 amount=-1 +kerning first=931 second=81 amount=-1 +kerning first=8204 second=89 amount=-1 +kerning first=358 second=932 amount=1 +kerning first=915 second=44 amount=-2 +kerning first=317 second=216 amount=-1 +kerning first=321 second=336 amount=-1 +kerning first=1058 second=1098 amount=-1 +kerning first=271 second=318 amount=1 +kerning first=326 second=358 amount=-1 +kerning first=221 second=45 amount=-1 +kerning first=321 second=84 amount=-1 +kerning first=1168 second=1102 amount=-1 +kerning first=84 second=260 amount=-1 +kerning first=354 second=351 amount=-1 +kerning first=259 second=354 amount=-1 +kerning first=315 second=8212 amount=-1 +kerning first=70 second=8230 amount=-1 +kerning first=358 second=65 amount=-1 +kerning first=356 second=940 amount=-1 +kerning first=376 second=41 amount=1 +kerning first=39 second=969 amount=-1 +kerning first=356 second=244 amount=-1 +kerning first=913 second=86 amount=-1 +kerning first=955 second=8221 amount=-1 +kerning first=226 second=84 amount=-1 +kerning first=1027 second=1114 amount=-1 +kerning first=321 second=338 amount=-1 +kerning first=194 second=8221 amount=-1 +kerning first=358 second=347 amount=-1 +kerning first=84 second=8249 amount=-1 +kerning first=354 second=239 amount=-1 +kerning first=910 second=941 amount=-1 +kerning first=1168 second=58 amount=-1 +kerning first=915 second=213 amount=-1 +kerning first=76 second=356 amount=-1 +kerning first=8211 second=354 amount=-1 +kerning first=86 second=41 amount=1 +kerning first=89 second=336 amount=-1 +kerning first=80 second=44 amount=-2 +kerning first=932 second=971 amount=-1 +kerning first=256 second=86 amount=-1 +kerning first=354 second=100 amount=-1 +kerning first=70 second=97 amount=-1 +kerning first=84 second=948 amount=-1 +kerning first=932 second=252 amount=-1 +kerning first=39 second=913 amount=-1 +kerning first=358 second=966 amount=-1 +kerning first=936 second=192 amount=-1 +kerning first=932 second=173 amount=-1 +kerning first=8217 second=263 amount=-1 +kerning first=358 second=238 amount=-1 +kerning first=221 second=79 amount=-1 +kerning first=194 second=354 amount=-1 +kerning first=376 second=212 amount=-1 +kerning first=1027 second=1058 amount=1 +kerning first=1043 second=1095 amount=-1 +kerning first=8216 second=1066 amount=1 +kerning first=356 second=260 amount=-1 +kerning first=1113 second=8221 amount=-1 +kerning first=317 second=284 amount=-1 +kerning first=932 second=111 amount=-1 +kerning first=39 second=258 amount=-1 +kerning first=8221 second=84 amount=1 +kerning first=65 second=8216 amount=-1 +kerning first=89 second=338 amount=-1 +kerning first=358 second=99 amount=-1 +kerning first=910 second=916 amount=-1 +kerning first=76 second=8217 amount=-1 +kerning first=319 second=920 amount=-1 +kerning first=160 second=8218 amount=-2 +kerning first=221 second=8212 amount=-1 +kerning first=8217 second=192 amount=-1 +kerning first=354 second=45 amount=-1 +kerning first=969 second=34 amount=-1 +kerning first=1098 second=1098 amount=-1 +kerning first=356 second=8249 amount=-1 +kerning first=376 second=367 amount=-1 +kerning first=321 second=290 amount=-1 +kerning first=1058 second=1077 amount=-1 +kerning first=319 second=266 amount=-1 +kerning first=192 second=87 amount=-1 +kerning first=1043 second=1040 amount=-1 +kerning first=913 second=932 amount=-1 +kerning first=1168 second=1081 amount=-1 +kerning first=354 second=303 amount=-1 +kerning first=89 second=265 amount=-1 +kerning first=34 second=196 amount=-1 +kerning first=936 second=961 amount=-1 +kerning first=939 second=46 amount=-1 +kerning first=258 second=936 amount=-1 +kerning first=358 second=44 amount=-1 +kerning first=313 second=366 amount=-1 +kerning first=356 second=948 amount=-1 +kerning first=88 second=934 amount=-1 +kerning first=221 second=257 amount=-1 +kerning first=1100 second=1090 amount=-1 +kerning first=8216 second=111 amount=-1 +kerning first=221 second=113 amount=-1 +kerning first=1066 second=1066 amount=-1 +kerning first=335 second=356 amount=-1 +kerning first=376 second=250 amount=-1 +kerning first=8217 second=8221 amount=-1 +kerning first=1027 second=1092 amount=-1 +kerning first=84 second=269 amount=-1 +kerning first=256 second=932 amount=-1 +kerning first=8221 second=265 amount=-1 +kerning first=317 second=364 amount=-1 +kerning first=358 second=299 amount=-1 +kerning first=341 second=44 amount=-1 +kerning first=193 second=939 amount=-1 +kerning first=84 second=117 amount=-1 +kerning first=915 second=923 amount=-2 +kerning first=317 second=8216 amount=-2 +kerning first=89 second=195 amount=-1 +kerning first=910 second=949 amount=-1 +kerning first=44 second=8216 amount=-1 +kerning first=89 second=290 amount=-1 +kerning first=221 second=193 amount=-1 +kerning first=123 second=87 amount=1 +kerning first=8217 second=234 amount=-1 +kerning first=939 second=945 amount=-1 +kerning first=932 second=224 amount=-1 +kerning first=1068 second=1058 amount=-1 +kerning first=8220 second=1066 amount=1 +kerning first=84 second=197 amount=-1 +kerning first=376 second=920 amount=-1 +kerning first=313 second=45 amount=-1 +kerning first=8217 second=354 amount=1 +kerning first=8221 second=195 amount=-1 +kerning first=321 second=368 amount=-1 +kerning first=1043 second=1074 amount=-1 +kerning first=902 second=87 amount=-1 +kerning first=933 second=951 amount=-1 +kerning first=1168 second=1116 amount=-1 +kerning first=1041 second=1026 amount=-1 +kerning first=376 second=266 amount=-1 +kerning first=293 second=354 amount=-1 +kerning first=354 second=8212 amount=-1 +kerning first=89 second=8230 amount=-1 +kerning first=1059 second=1108 amount=-1 +kerning first=8250 second=932 amount=-1 +kerning first=192 second=933 amount=-1 +kerning first=221 second=335 amount=-1 +kerning first=1027 second=171 amount=-1 +kerning first=245 second=84 amount=-1 +kerning first=260 second=8221 amount=-1 +kerning first=80 second=923 amount=-1 +kerning first=258 second=372 amount=-1 +kerning first=84 second=341 amount=-1 +kerning first=356 second=269 amount=-1 +kerning first=8221 second=345 amount=-1 +kerning first=932 second=339 amount=-1 +kerning first=358 second=373 amount=-1 +kerning first=84 second=187 amount=-1 +kerning first=8221 second=8230 amount=-2 +kerning first=356 second=117 amount=-1 +kerning first=939 second=198 amount=-1 +kerning first=354 second=253 amount=-1 +kerning first=89 second=232 amount=-1 +kerning first=1090 second=44 amount=-1 +kerning first=1168 second=1060 amount=-1 +kerning first=923 second=39 amount=-1 +kerning first=354 second=257 amount=-1 +kerning first=221 second=227 amount=-1 +kerning first=354 second=113 amount=-1 +kerning first=89 second=97 amount=-1 +kerning first=8220 second=111 amount=-1 +kerning first=84 second=963 amount=-1 +kerning first=8204 second=8220 amount=-1 +kerning first=932 second=312 amount=-1 +kerning first=358 second=974 amount=-1 +kerning first=84 second=235 amount=-1 +kerning first=313 second=79 amount=-1 +kerning first=356 second=197 amount=-1 +kerning first=8217 second=289 amount=-1 +kerning first=260 second=354 amount=-1 +kerning first=317 second=212 amount=-1 +kerning first=8221 second=232 amount=-1 +kerning first=39 second=196 amount=-1 +kerning first=358 second=249 amount=-1 +kerning first=1043 second=1109 amount=-1 +kerning first=932 second=275 amount=-1 +kerning first=376 second=226 amount=-1 +kerning first=328 second=358 amount=-1 +kerning first=358 second=259 amount=-1 +kerning first=1059 second=8230 amount=-1 +kerning first=354 second=193 amount=-1 +kerning first=358 second=112 amount=-1 +kerning first=1111 second=1106 amount=1 +kerning first=76 second=268 amount=-1 +kerning first=333 second=932 amount=-1 +kerning first=902 second=933 amount=-1 +kerning first=910 second=195 amount=-1 +kerning first=313 second=8212 amount=-1 +kerning first=91 second=89 amount=1 +kerning first=1038 second=1108 amount=-1 +kerning first=8216 second=339 amount=-1 +kerning first=321 second=214 amount=-1 +kerning first=315 second=71 amount=-1 +kerning first=356 second=341 amount=-1 +kerning first=358 second=923 amount=-1 +kerning first=372 second=913 amount=-1 +kerning first=356 second=187 amount=-1 +kerning first=939 second=194 amount=-1 +kerning first=1058 second=1090 amount=-1 +kerning first=271 second=293 amount=1 +kerning first=8217 second=74 amount=-1 +kerning first=913 second=939 amount=-1 +kerning first=1168 second=1094 amount=-1 +kerning first=319 second=67 amount=-1 +kerning first=354 second=335 amount=-1 +kerning first=372 second=258 amount=-1 +kerning first=84 second=41 amount=1 +kerning first=1027 second=1241 amount=-1 +kerning first=939 second=59 amount=-1 +kerning first=1059 second=1086 amount=-1 +kerning first=356 second=963 amount=-1 +kerning first=197 second=8216 amount=-1 +kerning first=221 second=287 amount=-1 +kerning first=8216 second=275 amount=-1 +kerning first=910 second=8230 amount=-1 +kerning first=229 second=358 amount=-1 +kerning first=356 second=235 amount=-1 +kerning first=933 second=65 amount=-1 +kerning first=8218 second=221 amount=-1 +kerning first=256 second=939 amount=-1 +kerning first=358 second=326 amount=-1 +kerning first=1058 second=46 amount=-1 +kerning first=376 second=283 amount=-1 +kerning first=354 second=227 amount=-1 +kerning first=89 second=214 amount=-1 +kerning first=70 second=228 amount=-1 +kerning first=8218 second=84 amount=-1 +kerning first=1038 second=8230 amount=-1 +kerning first=8230 second=34 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=958 second=41 amount=1 +kerning first=932 second=962 amount=-1 +kerning first=8217 second=353 amount=-1 +kerning first=916 second=933 amount=-1 +kerning first=317 second=920 amount=-1 +kerning first=932 second=243 amount=-1 +kerning first=1169 second=46 amount=-1 +kerning first=97 second=932 amount=-1 +kerning first=358 second=229 amount=-1 +kerning first=319 second=360 amount=-1 +kerning first=221 second=71 amount=-1 +kerning first=932 second=372 amount=1 +kerning first=1043 second=1087 amount=-1 +kerning first=1168 second=8250 amount=-1 +kerning first=933 second=966 amount=-1 +kerning first=8216 second=1058 amount=1 +kerning first=317 second=266 amount=-1 +kerning first=932 second=103 amount=-1 +kerning first=194 second=87 amount=-1 +kerning first=89 second=361 amount=-1 +kerning first=356 second=41 amount=1 +kerning first=8220 second=339 amount=-1 +kerning first=376 second=67 amount=-1 +kerning first=221 second=365 amount=-1 +kerning first=1038 second=1086 amount=-1 +kerning first=931 second=268 amount=-1 +kerning first=1098 second=1090 amount=-1 +kerning first=84 second=367 amount=-1 +kerning first=376 second=349 amount=-1 +kerning first=915 second=940 amount=-1 +kerning first=89 second=251 amount=-1 +kerning first=932 second=256 amount=-1 +kerning first=8216 second=962 amount=-1 +kerning first=87 second=195 amount=-1 +kerning first=354 second=287 amount=-1 +kerning first=118 second=44 amount=-1 +kerning first=173 second=89 amount=-1 +kerning first=8216 second=243 amount=-1 +kerning first=8220 second=275 amount=-1 +kerning first=160 second=376 amount=-1 +kerning first=221 second=246 amount=-1 +kerning first=84 second=972 amount=-1 +kerning first=8204 second=8222 amount=-2 +kerning first=84 second=250 amount=-1 +kerning first=8216 second=103 amount=-1 +kerning first=933 second=44 amount=-1 +kerning first=1066 second=1058 amount=-1 +kerning first=1027 second=1084 amount=-1 +kerning first=76 second=932 amount=-1 +kerning first=8211 second=933 amount=-1 +kerning first=319 second=39 amount=-1 +kerning first=1060 second=1061 amount=-1 +kerning first=932 second=171 amount=-1 +kerning first=358 second=281 amount=-1 +kerning first=84 second=109 amount=-1 +kerning first=8221 second=110 amount=-1 +kerning first=46 second=39 amount=-1 +kerning first=315 second=221 amount=-1 +kerning first=358 second=125 amount=1 +kerning first=376 second=101 amount=-1 +kerning first=87 second=8230 amount=-1 +kerning first=45 second=221 amount=-1 +kerning first=227 second=356 amount=-1 +kerning first=315 second=336 amount=-1 +kerning first=8204 second=356 amount=-1 +kerning first=98 second=354 amount=-1 +kerning first=194 second=933 amount=-1 +kerning first=915 second=260 amount=-2 +kerning first=315 second=84 amount=-1 +kerning first=319 second=218 amount=-1 +kerning first=356 second=367 amount=-1 +kerning first=246 second=84 amount=-1 +kerning first=8216 second=256 amount=-1 +kerning first=8220 second=1058 amount=1 +kerning first=258 second=8221 amount=-1 +kerning first=45 second=84 amount=-1 +kerning first=1058 second=1103 amount=-1 +kerning first=372 second=196 amount=-1 +kerning first=1043 second=1066 amount=1 +kerning first=321 second=89 amount=-1 +kerning first=1168 second=1108 amount=-1 +kerning first=354 second=365 amount=-1 +kerning first=160 second=358 amount=-1 +kerning first=315 second=338 amount=-1 +kerning first=1068 second=8221 amount=-1 +kerning first=356 second=972 amount=-1 +kerning first=376 second=46 amount=-1 +kerning first=356 second=250 amount=-1 +kerning first=1100 second=1118 amount=-1 +kerning first=8217 second=305 amount=-1 +kerning first=258 second=354 amount=-1 +kerning first=84 second=324 amount=-1 +kerning first=8221 second=328 amount=-1 +kerning first=354 second=941 amount=-1 +kerning first=8220 second=962 amount=-1 +kerning first=1058 second=59 amount=-1 +kerning first=915 second=948 amount=-1 +kerning first=356 second=109 amount=-1 +kerning first=354 second=246 amount=-1 +kerning first=89 second=228 amount=-1 +kerning first=8220 second=243 amount=-1 +kerning first=91 second=309 amount=1 +kerning first=8217 second=8204 amount=-1 +kerning first=76 second=370 amount=-1 +kerning first=321 second=34 amount=-1 +kerning first=80 second=260 amount=-1 +kerning first=86 second=46 amount=-1 +kerning first=111 second=358 amount=-1 +kerning first=1043 second=173 amount=-1 +kerning first=335 second=932 amount=-1 +kerning first=8217 second=273 amount=-1 +kerning first=915 second=334 amount=-1 +kerning first=354 second=105 amount=-1 +kerning first=1059 second=1044 amount=-1 +kerning first=8220 second=103 amount=-1 +kerning first=939 second=942 amount=-1 +kerning first=358 second=940 amount=-1 +kerning first=221 second=336 amount=-1 +kerning first=84 second=226 amount=-1 +kerning first=313 second=71 amount=-1 +kerning first=8217 second=277 amount=-1 +kerning first=358 second=244 amount=-1 +kerning first=1043 second=1100 amount=-1 +kerning first=932 second=263 amount=-1 +kerning first=1168 second=8230 amount=-1 +kerning first=260 second=87 amount=-1 +kerning first=8230 second=8220 amount=-1 +kerning first=354 second=916 amount=-1 +kerning first=70 second=913 amount=-1 +kerning first=317 second=67 amount=-1 +kerning first=89 second=248 amount=-1 +kerning first=187 second=376 amount=-1 +kerning first=915 second=216 amount=-1 +kerning first=315 second=290 amount=-1 +kerning first=70 second=258 amount=-1 +kerning first=196 second=8216 amount=-1 +kerning first=8220 second=256 amount=-1 +kerning first=221 second=338 amount=-1 +kerning first=228 second=358 amount=-1 +kerning first=356 second=324 amount=-1 +kerning first=271 second=295 amount=1 +kerning first=932 second=192 amount=-1 +kerning first=8221 second=248 amount=-1 +kerning first=1058 second=1082 amount=-1 +kerning first=1056 second=46 amount=-2 +kerning first=376 second=198 amount=-1 +kerning first=933 second=923 amount=-1 +kerning first=1168 second=1086 amount=-1 +kerning first=89 second=279 amount=-1 +kerning first=358 second=260 amount=-1 +kerning first=354 second=8250 amount=-1 +kerning first=195 second=221 amount=-1 +kerning first=8216 second=263 amount=-1 +kerning first=221 second=265 amount=-1 +kerning first=84 second=331 amount=-1 +kerning first=8217 second=351 amount=-1 +kerning first=356 second=226 amount=-1 +kerning first=1038 second=1044 amount=-1 +kerning first=34 second=65 amount=-1 +kerning first=1027 second=1097 amount=-1 +kerning first=965 second=34 amount=-1 +kerning first=86 second=198 amount=-1 +kerning first=84 second=283 amount=-1 +kerning first=8221 second=279 amount=-1 +kerning first=317 second=360 amount=-1 +kerning first=354 second=949 amount=-1 +kerning first=76 second=213 amount=-1 +kerning first=195 second=84 amount=-1 +kerning first=84 second=122 amount=-1 +kerning first=376 second=261 amount=-1 +kerning first=65 second=39 amount=-1 +kerning first=187 second=358 amount=-1 +kerning first=1058 second=1026 amount=1 +kerning first=358 second=8249 amount=-1 +kerning first=910 second=954 amount=-1 +kerning first=915 second=197 amount=-2 +kerning first=337 second=354 amount=-1 +kerning first=260 second=933 amount=-1 +kerning first=315 second=368 amount=-1 +kerning first=8216 second=192 amount=-1 +kerning first=221 second=195 amount=-1 +kerning first=932 second=961 amount=-1 +kerning first=171 second=939 amount=-1 +kerning first=8217 second=239 amount=-1 +kerning first=915 second=284 amount=-1 +kerning first=354 second=84 amount=1 +kerning first=84 second=934 amount=-1 +kerning first=1040 second=1035 amount=-1 +kerning first=932 second=234 amount=-1 +kerning first=358 second=948 amount=-1 +kerning first=1068 second=1063 amount=-1 +kerning first=221 second=290 amount=-1 +kerning first=1058 second=1118 amount=-1 +kerning first=324 second=356 amount=-1 +kerning first=1043 second=1079 amount=-1 +kerning first=932 second=354 amount=1 +kerning first=376 second=194 amount=-1 +kerning first=8217 second=100 amount=-1 +kerning first=354 second=378 amount=-1 +kerning first=112 second=356 amount=-1 +kerning first=248 second=354 amount=-1 +kerning first=929 second=256 amount=-1 +kerning first=915 second=187 amount=-1 +kerning first=356 second=331 amount=-1 +kerning first=1027 second=8211 amount=-1 +kerning first=221 second=8230 amount=-1 +kerning first=86 second=194 amount=-1 +kerning first=84 second=349 amount=-1 +kerning first=356 second=283 amount=-1 +kerning first=80 second=197 amount=-1 +kerning first=376 second=337 amount=-1 +kerning first=356 second=122 amount=-1 +kerning first=915 second=963 amount=-1 +kerning first=317 second=39 amount=-1 +kerning first=8216 second=961 amount=-1 +kerning first=44 second=39 amount=-1 +kerning first=313 second=221 amount=-1 +kerning first=354 second=265 amount=-1 +kerning first=8216 second=234 amount=-1 +kerning first=8220 second=263 amount=-1 +kerning first=221 second=232 amount=-1 +kerning first=354 second=118 amount=-1 +kerning first=224 second=356 amount=-1 +kerning first=84 second=968 amount=-1 +kerning first=313 second=336 amount=-1 +kerning first=356 second=934 amount=-1 +kerning first=8216 second=354 amount=1 +kerning first=84 second=236 amount=-1 +kerning first=8217 second=303 amount=-1 +kerning first=313 second=84 amount=-1 +kerning first=8221 second=241 amount=-1 +kerning first=317 second=218 amount=-1 +kerning first=243 second=84 amount=-1 +kerning first=34 second=44 amount=-2 +kerning first=1043 second=1114 amount=-1 +kerning first=221 second=97 amount=-1 +kerning first=932 second=289 amount=-1 +kerning first=376 second=231 amount=-1 +kerning first=1027 second=1076 amount=-1 +kerning first=321 second=8220 amount=-2 +kerning first=923 second=376 amount=-1 +kerning first=89 second=913 amount=-1 +kerning first=1041 second=1066 amount=-1 +kerning first=358 second=269 amount=-1 +kerning first=84 second=101 amount=-1 +kerning first=354 second=195 amount=-1 +kerning first=39 second=65 amount=-1 +kerning first=70 second=196 amount=-1 +kerning first=315 second=214 amount=-1 +kerning first=358 second=117 amount=-1 +kerning first=8220 second=192 amount=-1 +kerning first=91 second=356 amount=1 +kerning first=931 second=213 amount=-1 +kerning first=376 second=93 amount=1 +kerning first=313 second=338 amount=-1 +kerning first=1066 second=8221 amount=-1 +kerning first=89 second=258 amount=-1 +kerning first=104 second=84 amount=-1 +kerning first=321 second=219 amount=-1 +kerning first=1098 second=1118 amount=-1 +kerning first=356 second=349 amount=-1 +kerning first=8221 second=913 amount=-1 +kerning first=8204 second=86 amount=-1 +kerning first=1058 second=1095 amount=-1 +kerning first=8212 second=1026 amount=-1 +kerning first=358 second=197 amount=-1 +kerning first=1043 second=1058 amount=1 +kerning first=1075 second=46 amount=-1 +kerning first=944 second=39 amount=-1 +kerning first=321 second=81 amount=-1 +kerning first=86 second=93 amount=1 +kerning first=1168 second=1099 amount=-1 +kerning first=8221 second=258 amount=-1 +kerning first=354 second=345 amount=-1 +kerning first=932 second=74 amount=-1 +kerning first=84 second=46 amount=-1 +kerning first=1050 second=1051 amount=1 +kerning first=354 second=8230 amount=-1 +kerning first=109 second=358 amount=-1 +kerning first=356 second=968 amount=-1 +kerning first=8216 second=289 amount=-1 +kerning first=934 second=933 amount=-1 +kerning first=8221 second=307 amount=-1 +kerning first=356 second=236 amount=-1 +kerning first=932 second=371 amount=-1 +kerning first=1027 second=1111 amount=-1 +kerning first=1114 second=1098 amount=-1 +kerning first=923 second=358 amount=-1 +kerning first=84 second=297 amount=-1 +kerning first=1118 second=8230 amount=-1 +kerning first=358 second=341 amount=-1 +kerning first=8220 second=961 amount=-1 +kerning first=258 second=87 amount=-1 +kerning first=376 second=285 amount=-1 +kerning first=356 second=101 amount=-1 +kerning first=354 second=232 amount=-1 +kerning first=1058 second=1040 amount=-1 +kerning first=358 second=187 amount=-1 +kerning first=8220 second=234 amount=-1 +kerning first=915 second=212 amount=-1 +kerning first=8218 second=89 amount=-1 +kerning first=8230 second=8217 amount=-2 +kerning first=8222 second=376 amount=-1 +kerning first=1168 second=1044 amount=-1 +kerning first=8220 second=354 amount=1 +kerning first=221 second=214 amount=-1 +kerning first=932 second=970 amount=1 +kerning first=261 second=84 amount=-1 +kerning first=354 second=97 amount=-1 +kerning first=89 second=81 amount=-1 +kerning first=1059 second=1035 amount=1 +kerning first=84 second=945 amount=-1 +kerning first=313 second=290 amount=-1 +kerning first=193 second=8216 amount=-1 +kerning first=932 second=353 amount=-1 +kerning first=358 second=963 amount=-1 +kerning first=936 second=193 amount=-1 +kerning first=225 second=358 amount=-1 +kerning first=358 second=235 amount=-1 +kerning first=929 second=192 amount=-1 +kerning first=8216 second=74 amount=-1 +kerning first=1043 second=1092 amount=-1 +kerning first=8217 second=113 amount=-1 +kerning first=933 second=940 amount=-1 +kerning first=34 second=974 amount=-1 +kerning first=1036 second=1095 amount=-1 +kerning first=227 second=932 amount=-1 +kerning first=8204 second=932 amount=-1 +kerning first=376 second=308 amount=-1 +kerning first=356 second=46 amount=-1 +kerning first=39 second=44 amount=-2 +kerning first=910 second=913 amount=-1 +kerning first=197 second=39 amount=-1 +kerning first=221 second=361 amount=-1 +kerning first=192 second=221 amount=-1 +kerning first=8217 second=193 amount=-1 +kerning first=356 second=297 amount=-1 +kerning first=910 second=258 amount=-1 +kerning first=84 second=198 amount=-1 +kerning first=376 second=369 amount=-1 +kerning first=915 second=972 amount=-1 +kerning first=1058 second=1074 amount=-1 +kerning first=319 second=262 amount=-1 +kerning first=192 second=84 amount=-1 +kerning first=173 second=356 amount=-1 +kerning first=34 second=923 amount=-1 +kerning first=8222 second=358 amount=-1 +kerning first=1168 second=1078 amount=-1 +kerning first=8220 second=289 amount=-1 +kerning first=326 second=354 amount=-1 +kerning first=221 second=251 amount=-1 +kerning first=89 second=115 amount=-1 +kerning first=258 second=933 amount=-1 +kerning first=358 second=41 amount=1 +kerning first=84 second=944 amount=-1 +kerning first=313 second=368 amount=-1 +kerning first=356 second=945 amount=-1 +kerning first=933 second=260 amount=-1 +kerning first=253 second=44 amount=-1 +kerning first=84 second=255 amount=-1 +kerning first=8217 second=335 amount=-1 +kerning first=1043 second=171 amount=-1 +kerning first=1038 second=1035 amount=1 +kerning first=331 second=84 amount=-1 +kerning first=1066 second=1063 amount=-1 +kerning first=376 second=242 amount=-1 +kerning first=1027 second=1089 amount=-1 +kerning first=84 second=261 amount=-1 +kerning first=75 second=74 amount=1 +kerning first=932 second=8211 amount=-1 +kerning first=123 second=221 amount=1 +kerning first=84 second=114 amount=-1 +kerning first=8221 second=115 amount=-1 +kerning first=915 second=920 amount=-1 +kerning first=89 second=196 amount=-1 +kerning first=110 second=356 amount=-1 +kerning first=910 second=946 amount=-1 +kerning first=114 second=44 amount=-1 +kerning first=950 second=125 amount=1 +kerning first=123 second=84 amount=1 +kerning first=902 second=221 amount=-1 +kerning first=915 second=266 amount=-1 +kerning first=315 second=89 amount=-1 +kerning first=8220 second=74 amount=-1 +kerning first=319 second=376 amount=-1 +kerning first=932 second=225 amount=-1 +kerning first=84 second=194 amount=-1 +kerning first=45 second=89 amount=-1 +kerning first=356 second=198 amount=-1 +kerning first=8221 second=196 amount=-1 +kerning first=321 second=356 amount=-1 +kerning first=1058 second=1109 amount=-1 +kerning first=1027 second=45 amount=-1 +kerning first=319 second=332 amount=-1 +kerning first=902 second=84 amount=-1 +kerning first=8249 second=933 amount=-1 +kerning first=933 second=948 amount=-1 +kerning first=1168 second=1113 amount=-1 +kerning first=319 second=85 amount=-1 +kerning first=932 second=87 amount=1 +kerning first=354 second=361 amount=-1 +kerning first=89 second=333 amount=-1 +kerning first=376 second=262 amount=-1 +kerning first=1034 second=1026 amount=-1 +kerning first=1059 second=1105 amount=-1 +kerning first=372 second=65 amount=-1 +kerning first=356 second=944 amount=-1 +kerning first=39 second=974 amount=-1 +kerning first=226 second=356 amount=-1 +kerning first=356 second=255 amount=-1 +kerning first=913 second=8216 amount=-1 +kerning first=315 second=34 amount=-1 +kerning first=84 second=337 amount=-1 +kerning first=8221 second=333 amount=-1 +kerning first=356 second=261 amount=-1 +kerning first=932 second=305 amount=-1 +kerning first=354 second=973 amount=-1 +kerning first=358 second=367 amount=-1 +kerning first=356 second=114 amount=-1 +kerning first=915 second=953 amount=-1 +kerning first=354 second=251 amount=-1 +kerning first=89 second=233 amount=-1 +kerning first=87 second=913 amount=-1 +kerning first=321 second=8217 amount=-1 +kerning first=8212 second=376 amount=-1 +kerning first=313 second=214 amount=-1 +kerning first=1043 second=1241 amount=-1 +kerning first=221 second=228 amount=-1 +kerning first=256 second=8216 amount=-1 +kerning first=354 second=110 amount=-1 +kerning first=87 second=258 amount=-1 +kerning first=319 second=358 amount=-1 +kerning first=932 second=273 amount=-1 +kerning first=39 second=923 amount=-1 +kerning first=358 second=972 amount=-1 +kerning first=242 second=358 amount=-1 +kerning first=957 second=8230 amount=-1 +kerning first=84 second=231 amount=-1 +kerning first=8217 second=287 amount=-1 +kerning first=356 second=194 amount=-1 +kerning first=8221 second=233 amount=-1 +kerning first=358 second=250 amount=-1 +kerning first=939 second=173 amount=-1 +kerning first=932 second=277 amount=-1 +kerning first=8216 second=1076 amount=-1 +kerning first=8221 second=356 amount=1 +kerning first=932 second=121 amount=-1 +kerning first=1041 second=1058 amount=-1 +kerning first=974 second=39 amount=-1 +kerning first=916 second=84 amount=-1 +kerning first=84 second=93 amount=1 +kerning first=376 second=332 amount=-1 +kerning first=358 second=109 amount=-1 +kerning first=929 second=74 amount=-1 +kerning first=910 second=196 amount=-1 +kerning first=271 second=8217 amount=1 +kerning first=91 second=86 amount=1 +kerning first=1038 second=1105 amount=-1 +kerning first=1027 second=8212 amount=-1 +kerning first=324 second=932 amount=-1 +kerning first=221 second=248 amount=-1 +kerning first=319 second=199 amount=-1 +kerning first=356 second=337 amount=-1 +kerning first=112 second=932 amount=-1 +kerning first=1058 second=1087 amount=-1 +kerning first=319 second=288 amount=-1 +kerning first=8212 second=358 amount=-1 +kerning first=1168 second=1091 amount=-1 +kerning first=1056 second=1040 amount=-1 +kerning first=354 second=328 amount=-1 +kerning first=89 second=291 amount=-1 +kerning first=76 second=8249 amount=-1 +kerning first=8216 second=273 amount=-1 +kerning first=933 second=197 amount=-1 +kerning first=958 second=93 amount=1 +kerning first=8221 second=8217 amount=-1 +kerning first=372 second=44 amount=-1 +kerning first=8216 second=277 amount=-1 +kerning first=160 second=372 amount=-1 +kerning first=259 second=84 amount=-1 +kerning first=221 second=279 amount=-1 +kerning first=356 second=231 amount=-1 +kerning first=932 second=351 amount=-1 +kerning first=1114 second=1090 amount=-1 +kerning first=1027 second=1102 amount=-1 +kerning first=84 second=285 amount=-1 +kerning first=8221 second=291 amount=-1 +kerning first=358 second=324 amount=-1 +kerning first=76 second=217 amount=-1 +kerning first=195 second=89 amount=-1 +kerning first=8211 second=221 amount=-1 +kerning first=376 second=267 amount=-1 +kerning first=356 second=93 amount=1 +kerning first=915 second=934 amount=-1 +kerning first=354 second=228 amount=-1 +kerning first=224 second=932 amount=-1 +kerning first=910 second=959 amount=-1 +kerning first=76 second=334 amount=-1 +kerning first=1168 second=1035 amount=1 +kerning first=196 second=39 amount=-1 +kerning first=8211 second=84 amount=-1 +kerning first=8217 second=246 amount=-1 +kerning first=936 second=916 amount=-1 +kerning first=932 second=239 amount=-1 +kerning first=194 second=221 amount=-1 +kerning first=915 second=67 amount=-1 +kerning first=8220 second=1076 amount=-1 +kerning first=65 second=376 amount=-1 +kerning first=1027 second=58 amount=-1 +kerning first=358 second=226 amount=-1 +kerning first=319 second=362 amount=-1 +kerning first=91 second=932 amount=1 +kerning first=343 second=46 amount=-1 +kerning first=8217 second=105 amount=-1 +kerning first=376 second=199 amount=-1 +kerning first=933 second=963 amount=-1 +kerning first=1043 second=1084 amount=-1 +kerning first=84 second=308 amount=-1 +kerning first=317 second=262 amount=-1 +kerning first=932 second=100 amount=-1 +kerning first=194 second=84 amount=-1 +kerning first=89 second=363 amount=-1 +kerning first=195 second=34 amount=-1 +kerning first=76 second=216 amount=-1 +kerning first=376 second=288 amount=-1 +kerning first=354 second=248 amount=-1 +kerning first=70 second=230 amount=-1 +kerning first=74 second=125 amount=1 +kerning first=328 second=354 amount=-1 +kerning first=245 second=356 amount=-1 +kerning first=910 second=181 amount=-1 +kerning first=1035 second=1035 amount=-1 +kerning first=84 second=369 amount=-1 +kerning first=356 second=285 amount=-1 +kerning first=915 second=968 amount=-1 +kerning first=321 second=268 amount=-1 +kerning first=89 second=245 amount=-1 +kerning first=1058 second=1066 amount=1 +kerning first=8220 second=273 amount=-1 +kerning first=87 second=196 amount=-1 +kerning first=271 second=107 amount=1 +kerning first=354 second=279 amount=-1 +kerning first=932 second=45 amount=-1 +kerning first=8220 second=277 amount=-1 +kerning first=315 second=8220 amount=-2 +kerning first=1107 second=1076 amount=-1 +kerning first=329 second=358 amount=-1 +kerning first=34 second=260 amount=-1 +kerning first=84 second=242 amount=-1 +kerning first=313 second=89 amount=-1 +kerning first=65 second=358 amount=-1 +kerning first=8221 second=245 amount=-1 +kerning first=317 second=376 amount=-1 +kerning first=358 second=331 amount=-1 +kerning first=8216 second=100 amount=-1 +kerning first=932 second=303 amount=-1 +kerning first=1027 second=1081 amount=-1 +kerning first=229 second=354 amount=-1 +kerning first=356 second=308 amount=-1 +kerning first=317 second=332 amount=-1 +kerning first=358 second=283 amount=-1 +kerning first=317 second=85 amount=-1 +kerning first=315 second=219 amount=-1 +kerning first=358 second=122 amount=-1 +kerning first=76 second=284 amount=-1 +kerning first=221 second=913 amount=-1 +kerning first=89 second=268 amount=-1 +kerning first=1058 second=173 amount=-1 +kerning first=931 second=334 amount=-1 +kerning first=315 second=81 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=319 second=210 amount=-1 +kerning first=356 second=369 amount=-1 +kerning first=915 second=46 amount=-2 +kerning first=358 second=934 amount=-1 +kerning first=372 second=923 amount=-1 +kerning first=221 second=258 amount=-1 +kerning first=313 second=34 amount=-1 +kerning first=1058 second=1100 amount=-1 +kerning first=271 second=320 amount=1 +kerning first=8217 second=84 amount=1 +kerning first=321 second=86 amount=-1 +kerning first=1168 second=1105 amount=-1 +kerning first=931 second=216 amount=-1 +kerning first=293 second=84 amount=-1 +kerning first=356 second=242 amount=-1 +kerning first=317 second=358 amount=-1 +kerning first=244 second=358 amount=-1 +kerning first=1027 second=1116 amount=-1 +kerning first=173 second=932 amount=-1 +kerning first=932 second=8212 amount=-1 +kerning first=354 second=969 amount=-1 +kerning first=358 second=349 amount=-1 +kerning first=935 second=934 amount=-1 +kerning first=915 second=945 amount=-1 +kerning first=354 second=241 amount=-1 +kerning first=8218 second=356 amount=-1 +kerning first=8212 second=910 amount=-1 +kerning first=310 second=308 amount=1 +kerning first=973 second=39 amount=-1 +kerning first=76 second=364 amount=-1 +kerning first=76 second=8216 amount=-2 +kerning first=80 second=46 amount=-2 +kerning first=1046 second=1051 amount=1 +kerning first=932 second=912 amount=1 +kerning first=260 second=221 amount=-1 +kerning first=8220 second=100 amount=-1 +kerning first=939 second=962 amount=-1 +kerning first=932 second=253 amount=-1 +kerning first=358 second=968 amount=-1 +kerning first=936 second=195 amount=-1 +kerning first=319 second=173 amount=-1 +kerning first=8217 second=265 amount=-1 +kerning first=317 second=199 amount=-1 +kerning first=86 second=301 amount=1 +kerning first=358 second=236 amount=-1 +kerning first=110 second=932 amount=-1 +kerning first=923 second=936 amount=-1 +kerning first=932 second=257 amount=-1 +kerning first=221 second=81 amount=-1 +kerning first=376 second=210 amount=-1 +kerning first=1027 second=1060 amount=-1 +kerning first=933 second=972 amount=-1 +kerning first=260 second=84 amount=-1 +kerning first=1043 second=1097 amount=-1 +kerning first=317 second=288 amount=-1 +kerning first=354 second=913 amount=-1 +kerning first=932 second=113 amount=-1 +kerning first=39 second=260 amount=-1 +kerning first=345 second=8230 amount=-1 +kerning first=89 second=230 amount=-1 +kerning first=358 second=101 amount=-1 +kerning first=121 second=8230 amount=-1 +kerning first=915 second=198 amount=-2 +kerning first=321 second=932 amount=-1 +kerning first=354 second=258 amount=-1 +kerning first=8230 second=939 amount=-1 +kerning first=931 second=284 amount=-1 +kerning first=8217 second=195 amount=-1 +kerning first=70 second=44 amount=-1 +kerning first=84 second=380 amount=-1 +kerning first=932 second=193 amount=-1 +kerning first=195 second=8220 amount=-1 +kerning first=936 second=8230 amount=-1 +kerning first=915 second=944 amount=-1 +kerning first=354 second=307 amount=-1 +kerning first=1058 second=1079 amount=-1 +kerning first=192 second=89 amount=-1 +kerning first=197 second=376 amount=-1 +kerning first=1168 second=1083 amount=-1 +kerning first=226 second=932 amount=-1 +kerning first=939 second=256 amount=-1 +kerning first=89 second=271 amount=-1 +kerning first=34 second=197 amount=-1 +kerning first=358 second=46 amount=-1 +kerning first=193 second=39 amount=-1 +kerning first=160 second=354 amount=-1 +kerning first=84 second=358 amount=1 +kerning first=8217 second=345 amount=-1 +kerning first=1043 second=8211 amount=-1 +kerning first=950 second=41 amount=1 +kerning first=8216 second=113 amount=-1 +kerning first=221 second=115 amount=-1 +kerning first=932 second=335 amount=-1 +kerning first=376 second=252 amount=-1 +kerning first=8217 second=8230 amount=-2 +kerning first=1027 second=1094 amount=-1 +kerning first=84 second=267 amount=-1 +kerning first=376 second=173 amount=-1 +kerning first=8221 second=271 amount=-1 +kerning first=317 second=362 amount=-1 +kerning first=76 second=212 amount=-1 +kerning first=358 second=297 amount=-1 +kerning first=341 second=46 amount=-1 +kerning first=80 second=198 amount=-1 +kerning first=84 second=119 amount=-1 +kerning first=923 second=372 amount=-1 +kerning first=910 second=951 amount=-1 +kerning first=1091 second=8230 amount=-1 +kerning first=372 second=125 amount=1 +kerning first=192 second=34 amount=-1 +kerning first=376 second=111 amount=-1 +kerning first=915 second=194 amount=-2 +kerning first=357 second=8217 amount=1 +kerning first=315 second=356 amount=-1 +kerning first=8216 second=193 amount=-1 +kerning first=123 second=89 amount=1 +kerning first=221 second=196 amount=-1 +kerning first=246 second=356 amount=-1 +kerning first=8217 second=232 amount=-1 +kerning first=89 second=65 amount=-1 +kerning first=45 second=356 amount=-1 +kerning first=356 second=380 amount=-1 +kerning first=8221 second=932 amount=1 +kerning first=111 second=354 amount=-1 +kerning first=932 second=227 amount=-1 +kerning first=915 second=59 amount=-1 +kerning first=358 second=945 amount=-1 +kerning first=1033 second=1035 amount=-1 +kerning first=321 second=370 amount=-1 +kerning first=1058 second=1114 amount=-1 +kerning first=1043 second=1076 amount=-1 +kerning first=902 second=89 amount=-1 +kerning first=197 second=358 amount=-1 +kerning first=1168 second=1119 amount=-1 +kerning first=89 second=347 amount=-1 +kerning first=8221 second=65 amount=-1 +kerning first=8216 second=335 amount=-1 +kerning first=221 second=333 amount=-1 +kerning first=313 second=8220 amount=-2 +kerning first=356 second=358 amount=1 +kerning first=1027 second=8250 amount=-1 +kerning first=295 second=358 amount=-1 +kerning first=1114 second=1118 amount=-1 +kerning first=173 second=939 amount=-1 +kerning first=315 second=8217 amount=-1 +kerning first=84 second=343 amount=-1 +kerning first=8221 second=347 amount=-1 +kerning first=356 second=267 amount=-1 +kerning first=80 second=194 amount=-1 +kerning first=356 second=119 amount=-1 +kerning first=228 second=354 amount=-1 +kerning first=354 second=382 amount=-1 +kerning first=1058 second=1058 amount=1 +kerning first=1090 second=46 amount=-1 +kerning first=358 second=198 amount=-1 +kerning first=902 second=34 amount=-1 +kerning first=313 second=219 amount=-1 +kerning first=70 second=259 amount=-1 +kerning first=221 second=233 amount=-1 +kerning first=354 second=115 amount=-1 +kerning first=89 second=99 amount=-1 +kerning first=8222 second=372 amount=-1 +kerning first=84 second=965 amount=-1 +kerning first=8220 second=113 amount=-1 +kerning first=358 second=944 amount=-1 +kerning first=84 second=237 amount=-1 +kerning first=8221 second=238 amount=-1 +kerning first=313 second=81 amount=-1 +kerning first=317 second=210 amount=-1 +kerning first=39 second=197 amount=-1 +kerning first=358 second=255 amount=-1 +kerning first=1043 second=1111 amount=-1 +kerning first=932 second=287 amount=-1 +kerning first=376 second=224 amount=-1 +kerning first=76 second=920 amount=-1 +kerning first=1041 second=1063 amount=-1 +kerning first=70 second=923 amount=-1 +kerning first=358 second=261 amount=-1 +kerning first=8221 second=99 amount=-1 +kerning first=1034 second=1066 amount=-1 +kerning first=354 second=196 amount=-1 +kerning first=358 second=114 amount=-1 +kerning first=8220 second=193 amount=-1 +kerning first=931 second=212 amount=-1 +kerning first=76 second=266 amount=-1 +kerning first=187 second=354 amount=-1 +kerning first=913 second=39 amount=-1 +kerning first=321 second=213 amount=-1 +kerning first=89 second=44 amount=-1 +kerning first=356 second=343 amount=-1 +kerning first=98 second=84 amount=-1 +kerning first=241 second=358 amount=-1 +kerning first=102 second=34 amount=1 +kerning first=910 second=65 amount=-1 +kerning first=939 second=192 amount=-1 +kerning first=1058 second=1092 amount=-1 +kerning first=358 second=194 amount=-1 +kerning first=376 second=339 amount=-1 +kerning first=245 second=932 amount=-1 +kerning first=1168 second=1096 amount=-1 +kerning first=354 second=333 amount=-1 +kerning first=8220 second=335 amount=-1 +kerning first=916 second=34 amount=-1 +kerning first=372 second=260 amount=-1 +kerning first=256 second=39 amount=-1 +kerning first=8221 second=44 amount=-2 +kerning first=356 second=965 amount=-1 +kerning first=929 second=912 amount=1 +kerning first=8216 second=287 amount=-1 +kerning first=258 second=221 amount=-1 +kerning first=221 second=291 amount=-1 +kerning first=356 second=237 amount=-1 +kerning first=317 second=173 amount=-1 +kerning first=932 second=365 amount=-1 +kerning first=1027 second=1108 amount=-1 +kerning first=195 second=356 amount=-1 +kerning first=84 second=301 amount=-1 +kerning first=8221 second=299 amount=-1 +kerning first=354 second=959 amount=-1 +kerning first=971 second=34 amount=-1 +kerning first=358 second=337 amount=-1 +kerning first=258 second=84 amount=-1 +kerning first=376 second=275 amount=-1 +kerning first=354 second=233 amount=-1 +kerning first=89 second=213 amount=-1 +kerning first=70 second=229 amount=-1 +kerning first=910 second=966 amount=-1 +kerning first=8218 second=86 amount=-1 +kerning first=354 second=356 amount=1 +kerning first=119 second=8230 amount=-1 +kerning first=8211 second=89 amount=-1 +kerning first=932 second=941 amount=-1 +kerning first=1059 second=44 amount=-1 +kerning first=1059 second=1032 amount=-1 +kerning first=74 second=41 amount=1 +kerning first=939 second=961 amount=-1 +kerning first=932 second=246 amount=-1 +kerning first=1058 second=171 amount=-1 +kerning first=358 second=231 amount=-1 +kerning first=929 second=193 amount=-1 +kerning first=319 second=372 amount=-1 +kerning first=192 second=8220 amount=-1 +kerning first=934 second=8230 amount=-1 +kerning first=8217 second=110 amount=-1 +kerning first=1043 second=1089 amount=-1 +kerning first=194 second=89 amount=-1 +kerning first=932 second=105 amount=-1 +kerning first=196 second=376 amount=-1 +kerning first=195 second=8217 amount=-1 +kerning first=931 second=920 amount=-1 +kerning first=358 second=93 amount=1 +kerning first=1100 second=8221 amount=-1 +kerning first=40 second=106 amount=1 +kerning first=221 second=363 amount=-1 +kerning first=257 second=358 amount=-1 +kerning first=40 second=1095 amount=-1 +kerning first=315 second=268 amount=-1 +kerning first=1027 second=8230 amount=-1 +kerning first=931 second=266 amount=-1 +kerning first=932 second=916 amount=-1 +kerning first=356 second=301 amount=-1 +kerning first=910 second=44 amount=-1 +kerning first=915 second=942 amount=-1 +kerning first=1043 second=45 amount=-1 +kerning first=89 second=249 amount=-1 +kerning first=955 second=34 amount=-1 +kerning first=8216 second=941 amount=-1 +kerning first=80 second=308 amount=-1 +kerning first=123 second=309 amount=1 +kerning first=1168 second=1075 amount=-1 +kerning first=923 second=8221 amount=-1 +kerning first=354 second=291 amount=-1 +kerning first=194 second=34 amount=-1 +kerning first=118 second=46 amount=-1 +kerning first=89 second=259 amount=-1 +kerning first=8216 second=246 amount=-1 +kerning first=8220 second=287 amount=-1 +kerning first=221 second=245 amount=-1 +kerning first=84 second=971 amount=-1 +kerning first=313 second=356 amount=-1 +kerning first=243 second=356 amount=-1 +kerning first=1038 second=44 amount=-1 +kerning first=84 second=252 amount=-1 +kerning first=87 second=65 amount=-1 +kerning first=8217 second=328 amount=-1 +kerning first=8218 second=932 amount=-1 +kerning first=1038 second=1032 amount=-1 +kerning first=109 second=354 amount=-1 +kerning first=84 second=173 amount=-1 +kerning first=933 second=46 amount=-1 +kerning first=8221 second=160 amount=-1 +kerning first=160 second=87 amount=-1 +kerning first=902 second=8220 amount=-1 +kerning first=376 second=243 amount=-1 +kerning first=1027 second=1086 amount=-1 +kerning first=319 second=171 amount=-1 +kerning first=932 second=8250 amount=-1 +kerning first=89 second=923 amount=-1 +kerning first=358 second=285 amount=-1 +kerning first=196 second=358 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=8221 second=112 amount=-1 +kerning first=923 second=354 amount=-1 +kerning first=376 second=103 amount=-1 +kerning first=8216 second=916 amount=-1 +kerning first=104 second=356 amount=-1 +kerning first=1058 second=1241 amount=-1 +kerning first=76 second=67 amount=-1 +kerning first=337 second=84 amount=-1 +kerning first=932 second=949 amount=-1 +kerning first=915 second=262 amount=-1 +kerning first=315 second=86 amount=-1 +kerning first=319 second=220 amount=-1 +kerning first=8221 second=923 amount=-1 +kerning first=8204 second=8216 amount=-1 +kerning first=65 second=936 amount=-1 +kerning first=1033 second=8217 amount=-1 +kerning first=221 second=268 amount=-1 +kerning first=313 second=8217 amount=-1 +kerning first=372 second=197 amount=-1 +kerning first=933 second=945 amount=-1 +kerning first=40 second=376 amount=1 +kerning first=225 second=354 amount=-1 +kerning first=932 second=84 amount=1 +kerning first=354 second=363 amount=-1 +kerning first=358 second=308 amount=-1 +kerning first=376 second=256 amount=-1 +kerning first=248 second=84 amount=-1 +kerning first=356 second=971 amount=-1 +kerning first=102 second=8220 amount=1 +kerning first=1028 second=1026 amount=1 +kerning first=1043 second=8212 amount=-1 +kerning first=356 second=252 amount=-1 +kerning first=356 second=173 amount=-1 +kerning first=932 second=378 amount=-1 +kerning first=8217 second=248 amount=-1 +kerning first=8221 second=326 amount=-1 +kerning first=358 second=369 amount=-1 +kerning first=8220 second=941 amount=-1 +kerning first=356 second=111 amount=-1 +kerning first=354 second=245 amount=-1 +kerning first=86 second=256 amount=-1 +kerning first=89 second=229 amount=-1 +kerning first=8220 second=246 amount=-1 +kerning first=376 second=171 amount=-1 +kerning first=76 second=360 amount=-1 +kerning first=8216 second=949 amount=-1 +kerning first=261 second=356 amount=-1 +kerning first=933 second=198 amount=-1 +kerning first=915 second=332 amount=-1 +kerning first=8222 second=354 amount=-1 +kerning first=84 second=224 amount=-1 +kerning first=87 second=44 amount=-1 +kerning first=8217 second=279 amount=-1 +kerning first=358 second=242 amount=-1 +kerning first=8216 second=84 amount=1 +kerning first=1043 second=1102 amount=-1 +kerning first=932 second=265 amount=-1 +kerning first=260 second=89 amount=-1 +kerning first=40 second=358 amount=1 +kerning first=65 second=372 amount=-1 +kerning first=932 second=118 amount=-1 +kerning first=315 second=932 amount=-1 +kerning first=8220 second=916 amount=-1 +kerning first=1050 second=1095 amount=-1 +kerning first=246 second=932 amount=-1 +kerning first=1034 second=1058 amount=-1 +kerning first=910 second=923 amount=-1 +kerning first=45 second=932 amount=-1 +kerning first=70 second=260 amount=-1 +kerning first=319 second=927 amount=-1 +kerning first=221 second=230 amount=-1 +kerning first=958 second=955 amount=1 +kerning first=931 second=67 amount=-1 +kerning first=932 second=195 amount=-1 +kerning first=192 second=356 amount=-1 +kerning first=84 second=339 amount=-1 +kerning first=1043 second=58 amount=-1 +kerning first=1058 second=1084 amount=-1 +kerning first=319 second=286 amount=-1 +kerning first=260 second=34 amount=-1 +kerning first=1168 second=1088 amount=-1 +kerning first=89 second=281 amount=-1 +kerning first=76 second=39 amount=-1 +kerning first=933 second=194 amount=-1 +kerning first=1113 second=1091 amount=-1 +kerning first=89 second=125 amount=1 +kerning first=372 second=41 amount=1 +kerning first=331 second=356 amount=-1 +kerning first=8216 second=265 amount=-1 +kerning first=221 second=271 amount=-1 +kerning first=84 second=312 amount=-1 +kerning first=356 second=224 amount=-1 +kerning first=933 second=59 amount=-1 +kerning first=932 second=345 amount=-1 +kerning first=1027 second=1099 amount=-1 +kerning first=84 second=275 amount=-1 +kerning first=319 second=8221 amount=-1 +kerning first=8221 second=281 amount=-1 +kerning first=317 second=372 amount=-1 +kerning first=932 second=8230 amount=-1 +kerning first=194 second=8220 amount=-1 +kerning first=76 second=218 amount=-1 +kerning first=195 second=86 amount=-1 +kerning first=8220 second=949 amount=-1 +kerning first=376 second=263 amount=-1 +kerning first=939 second=8211 amount=-1 +kerning first=46 second=8221 amount=-2 +kerning first=193 second=376 amount=-1 +kerning first=192 second=8217 amount=-1 +kerning first=915 second=199 amount=-1 +kerning first=1168 second=44 amount=-1 +kerning first=1028 second=1095 amount=-1 +kerning first=123 second=356 amount=1 +kerning first=1168 second=1032 amount=-1 +kerning first=315 second=370 amount=-1 +kerning first=8216 second=195 amount=-1 +kerning first=1098 second=8221 amount=-1 +kerning first=8217 second=241 amount=-1 +kerning first=915 second=288 amount=-1 +kerning first=936 second=913 amount=-1 +kerning first=354 second=86 amount=1 +kerning first=8220 second=84 amount=1 +kerning first=313 second=268 amount=-1 +kerning first=932 second=232 amount=-1 +kerning first=929 second=916 amount=-1 +kerning first=902 second=356 amount=-1 +kerning first=376 second=927 amount=-1 +kerning first=356 second=339 amount=-1 +kerning first=319 second=354 amount=-1 +kerning first=221 second=65 amount=-1 +kerning first=1043 second=1081 amount=-1 +kerning first=376 second=192 amount=-1 +kerning first=936 second=258 amount=-1 +kerning first=1027 second=1044 amount=-1 +kerning first=242 second=354 amount=-1 +kerning first=932 second=97 amount=-1 +kerning first=376 second=286 amount=-1 +kerning first=354 second=230 amount=-1 +kerning first=306 second=125 amount=1 +kerning first=221 second=347 amount=-1 +kerning first=8217 second=913 amount=-1 +kerning first=356 second=312 amount=-1 +kerning first=8216 second=8230 amount=-2 +kerning first=86 second=192 amount=-1 +kerning first=356 second=275 amount=-1 +kerning first=358 second=380 amount=-1 +kerning first=8217 second=258 amount=-1 +kerning first=197 second=936 amount=-1 +kerning first=915 second=965 amount=-1 +kerning first=317 second=171 amount=-1 +kerning first=89 second=244 amount=-1 +kerning first=87 second=923 amount=-1 +kerning first=193 second=358 amount=-1 +kerning first=902 second=8217 amount=-1 +kerning first=271 second=104 amount=1 +kerning first=354 second=271 amount=-1 +kerning first=8216 second=232 amount=-1 +kerning first=8220 second=265 amount=-1 +kerning first=8217 second=307 amount=-1 +kerning first=195 second=932 amount=-1 +kerning first=8212 second=354 amount=-1 +kerning first=84 second=962 amount=-1 +kerning first=326 second=84 amount=-1 +kerning first=84 second=243 amount=-1 +kerning first=313 second=86 amount=-1 +kerning first=8221 second=244 amount=-1 +kerning first=317 second=220 amount=-1 +kerning first=358 second=358 amount=1 +kerning first=34 second=46 amount=-2 +kerning first=1043 second=1116 amount=-1 +kerning first=221 second=99 amount=-1 +kerning first=376 second=234 amount=-1 +kerning first=1027 second=1078 amount=-1 +kerning first=321 second=8249 amount=-1 +kerning first=916 second=356 amount=-1 +kerning first=84 second=372 amount=1 +kerning first=354 second=932 amount=1 +kerning first=358 second=267 amount=-1 +kerning first=84 second=103 amount=-1 +kerning first=315 second=213 amount=-1 +kerning first=70 second=197 amount=-1 +kerning first=358 second=119 amount=-1 +kerning first=8220 second=195 amount=-1 +kerning first=45 second=939 amount=-1 +kerning first=923 second=87 amount=-1 +kerning first=89 second=260 amount=-1 +kerning first=1026 second=1026 amount=-1 +kerning first=321 second=217 amount=-1 +kerning first=354 second=65 amount=-1 +kerning first=319 second=211 amount=-1 +kerning first=102 second=8217 amount=1 +kerning first=321 second=334 amount=-1 +kerning first=1058 second=1097 amount=-1 +kerning first=271 second=314 amount=1 +kerning first=1043 second=1060 amount=-1 +kerning first=221 second=44 amount=-1 +kerning first=8230 second=8216 amount=-1 +kerning first=1168 second=1101 amount=-1 +kerning first=84 second=256 amount=-1 +kerning first=8221 second=260 amount=-1 +kerning first=354 second=347 amount=-1 +kerning first=373 second=8230 amount=-1 +kerning first=913 second=376 amount=-1 +kerning first=916 second=8217 amount=-1 +kerning first=197 second=372 amount=-1 +kerning first=259 second=356 amount=-1 +kerning first=89 second=8249 amount=-1 +kerning first=8220 second=8230 amount=-2 +kerning first=356 second=962 amount=-1 +kerning first=356 second=243 amount=-1 +kerning first=932 second=361 amount=-1 +kerning first=1027 second=1113 amount=-1 +kerning first=260 second=8220 amount=-1 +kerning first=321 second=216 amount=-1 +kerning first=356 second=372 amount=1 +kerning first=354 second=966 amount=-1 +kerning first=358 second=343 amount=-1 +kerning first=258 second=89 amount=-1 +kerning first=84 second=171 amount=-1 +kerning first=256 second=376 amount=-1 +kerning first=376 second=289 amount=-1 +kerning first=65 second=8221 amount=-1 +kerning first=356 second=103 amount=-1 +kerning first=354 second=238 amount=-1 +kerning first=910 second=940 amount=-1 +kerning first=8220 second=232 amount=-1 +kerning first=313 second=932 amount=-1 +kerning first=915 second=210 amount=-1 +kerning first=8211 second=356 amount=-1 +kerning first=243 second=932 amount=-1 +kerning first=89 second=334 amount=-1 +kerning first=34 second=198 amount=-1 +kerning first=221 second=213 amount=-1 +kerning first=932 second=973 amount=-1 +kerning first=354 second=99 amount=-1 +kerning first=317 second=927 amount=-1 +kerning first=932 second=251 amount=-1 +kerning first=358 second=965 amount=-1 +kerning first=936 second=196 amount=-1 +kerning first=1058 second=8211 amount=-1 +kerning first=8222 second=87 amount=-1 +kerning first=255 second=8230 amount=-1 +kerning first=929 second=195 amount=-1 +kerning first=358 second=237 amount=-1 +kerning first=923 second=933 amount=-1 +kerning first=1043 second=1094 amount=-1 +kerning first=194 second=356 amount=-1 +kerning first=329 second=354 amount=-1 +kerning first=376 second=211 amount=-1 +kerning first=8217 second=115 amount=-1 +kerning first=933 second=942 amount=-1 +kerning first=104 second=932 amount=-1 +kerning first=65 second=354 amount=-1 +kerning first=356 second=256 amount=-1 +kerning first=317 second=286 amount=-1 +kerning first=932 second=110 amount=-1 +kerning first=913 second=358 amount=-1 +kerning first=258 second=34 amount=-1 +kerning first=1107 second=8230 amount=-1 +kerning first=89 second=216 amount=-1 +kerning first=39 second=46 amount=-2 +kerning first=376 second=74 amount=-1 +kerning first=87 second=125 amount=1 +kerning first=950 second=93 amount=1 +kerning first=8250 second=376 amount=-1 +kerning first=8217 second=196 amount=-1 +kerning first=354 second=44 amount=-1 +kerning first=910 second=260 amount=-1 +kerning first=1034 second=8221 amount=-1 +kerning first=256 second=358 amount=-1 +kerning first=915 second=971 amount=-1 +kerning first=356 second=171 amount=-1 +kerning first=317 second=8221 amount=-1 +kerning first=321 second=284 amount=-1 +kerning first=376 second=371 amount=-1 +kerning first=1058 second=1076 amount=-1 +kerning first=929 second=8230 amount=-2 +kerning first=319 second=264 amount=-1 +kerning first=192 second=86 amount=-1 +kerning first=955 second=8217 amount=-1 +kerning first=44 second=8221 amount=-2 +kerning first=1168 second=1080 amount=-1 +kerning first=915 second=173 amount=-1 +kerning first=354 second=299 amount=-1 +kerning first=194 second=8217 amount=-1 +kerning first=89 second=269 amount=-1 +kerning first=1118 second=44 amount=-1 +kerning first=34 second=194 amount=-1 +kerning first=221 second=249 amount=-1 +kerning first=195 second=939 amount=-1 +kerning first=939 second=45 amount=-1 +kerning first=89 second=117 amount=-1 +kerning first=1059 second=1072 amount=-1 +kerning first=313 second=370 amount=-1 +kerning first=221 second=259 amount=-1 +kerning first=253 second=46 amount=-1 +kerning first=8217 second=333 amount=-1 +kerning first=1043 second=8250 amount=-1 +kerning first=1169 second=1076 amount=-1 +kerning first=932 second=328 amount=-1 +kerning first=376 second=353 amount=-1 +kerning first=1027 second=1091 amount=-1 +kerning first=84 second=263 amount=-1 +kerning first=319 second=8211 amount=-1 +kerning first=261 second=932 amount=-1 +kerning first=317 second=354 amount=-1 +kerning first=8221 second=269 amount=-1 +kerning first=358 second=301 amount=-1 +kerning first=244 second=354 amount=-1 +kerning first=89 second=197 amount=-1 +kerning first=910 second=948 amount=-1 +kerning first=221 second=923 amount=-1 +kerning first=114 second=46 amount=-1 +kerning first=1113 second=8217 amount=-1 +kerning first=89 second=284 amount=-1 +kerning first=8250 second=358 amount=-1 +kerning first=123 second=86 amount=1 +kerning first=8217 second=233 amount=-1 +kerning first=932 second=228 amount=-1 +kerning first=84 second=192 amount=-1 +kerning first=8217 second=356 amount=1 +kerning first=8221 second=197 amount=-1 +kerning first=321 second=364 amount=-1 +kerning first=1058 second=1111 amount=-1 +kerning first=39 second=198 amount=-1 +kerning first=902 second=86 amount=-1 +kerning first=1027 second=1035 amount=1 +kerning first=196 second=936 amount=-1 +kerning first=321 second=8216 amount=-2 +kerning first=319 second=87 amount=-1 +kerning first=354 second=373 amount=-1 +kerning first=376 second=264 amount=-1 +kerning first=293 second=356 amount=-1 +kerning first=192 second=932 amount=-1 +kerning first=1038 second=1072 amount=-1 +kerning first=328 second=84 amount=-1 +kerning first=8221 second=341 amount=-1 +kerning first=356 second=263 amount=-1 +kerning first=932 second=248 amount=-1 +kerning first=354 second=974 amount=-1 +kerning first=939 second=8212 amount=-1 +kerning first=354 second=249 amount=-1 +kerning first=89 second=235 amount=-1 +kerning first=376 second=8211 amount=-1 +kerning first=8217 second=8217 amount=-1 +kerning first=331 second=932 amount=-1 +kerning first=160 second=902 amount=-1 +kerning first=1168 second=1059 amount=1 +kerning first=313 second=213 amount=-1 +kerning first=354 second=259 amount=-1 +kerning first=333 second=358 amount=-1 +kerning first=221 second=229 amount=-1 +kerning first=354 second=112 amount=-1 +kerning first=87 second=260 amount=-1 +kerning first=84 second=961 amount=-1 +kerning first=358 second=971 amount=-1 +kerning first=84 second=234 amount=-1 +kerning first=8217 second=291 amount=-1 +kerning first=356 second=192 amount=-1 +kerning first=8221 second=235 amount=-1 +kerning first=260 second=356 amount=-1 +kerning first=317 second=211 amount=-1 +kerning first=39 second=194 amount=-1 +kerning first=358 second=252 amount=-1 +kerning first=1043 second=1108 amount=-1 +kerning first=932 second=279 amount=-1 +kerning first=376 second=225 amount=-1 +kerning first=358 second=173 amount=-1 +kerning first=123 second=932 amount=1 +kerning first=84 second=354 amount=1 +kerning first=354 second=923 amount=-1 +kerning first=229 second=84 amount=-1 +kerning first=1034 second=1063 amount=-1 +kerning first=358 second=111 amount=-1 +kerning first=197 second=8221 amount=-1 +kerning first=76 second=262 amount=-1 +kerning first=196 second=372 amount=-1 +kerning first=902 second=932 amount=-1 +kerning first=910 second=197 amount=-1 +kerning first=8216 second=248 amount=-1 +kerning first=321 second=212 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=46 second=933 amount=-1 +kerning first=1068 second=1035 amount=-1 +kerning first=258 second=8220 amount=-1 +kerning first=939 second=193 amount=-1 +kerning first=947 second=8230 amount=-1 +kerning first=1058 second=1089 amount=-1 +kerning first=260 second=8217 amount=-1 +kerning first=1168 second=1093 amount=-1 +kerning first=354 second=326 amount=-1 +kerning first=1046 second=1095 amount=-1 +kerning first=197 second=354 amount=-1 +kerning first=939 second=58 amount=-1 +kerning first=969 second=39 amount=-1 +kerning first=74 second=93 amount=1 +kerning first=372 second=46 amount=-1 +kerning first=356 second=961 amount=-1 +kerning first=8216 second=279 amount=-1 +kerning first=34 second=308 amount=-1 +kerning first=221 second=281 amount=-1 +kerning first=356 second=234 amount=-1 +kerning first=1043 second=8230 amount=-1 +kerning first=97 second=358 amount=-1 +kerning first=221 second=125 amount=1 +kerning first=376 second=273 amount=-1 +kerning first=1027 second=1105 amount=-1 +kerning first=8216 second=1113 amount=-1 +kerning first=84 second=289 amount=-1 +kerning first=356 second=354 amount=1 +kerning first=76 second=376 amount=-1 +kerning first=295 second=354 amount=-1 +kerning first=957 second=44 amount=-1 +kerning first=1058 second=45 amount=-1 +kerning first=376 second=277 amount=-1 +kerning first=354 second=229 amount=-1 +kerning first=89 second=212 amount=-1 +kerning first=8212 second=933 amount=-1 +kerning first=70 second=226 amount=-1 +kerning first=910 second=963 amount=-1 +kerning first=76 second=332 amount=-1 +kerning first=1168 second=1038 amount=1 +kerning first=76 second=85 amount=-1 +kerning first=932 second=969 amount=-1 +kerning first=8217 second=245 amount=-1 +kerning first=916 second=932 amount=-1 +kerning first=932 second=241 amount=-1 +kerning first=306 second=41 amount=1 +kerning first=358 second=224 amount=-1 +kerning first=319 second=366 amount=-1 +kerning first=1043 second=1086 amount=-1 +kerning first=1168 second=8249 amount=-1 +kerning first=1056 second=1076 amount=-1 +kerning first=317 second=264 amount=-1 +kerning first=89 second=367 amount=-1 +kerning first=194 second=86 amount=-1 +kerning first=84 second=74 amount=-1 +kerning first=65 second=87 amount=-1 +kerning first=40 second=372 amount=1 +kerning first=8220 second=248 amount=-1 +kerning first=192 second=939 amount=-1 +kerning first=321 second=920 amount=-1 +kerning first=931 second=262 amount=-1 +kerning first=932 second=913 amount=-1 +kerning first=84 second=371 amount=-1 +kerning first=356 second=289 amount=-1 +kerning first=76 second=358 amount=-1 +kerning first=376 second=351 amount=-1 +kerning first=915 second=962 amount=-1 +kerning first=321 second=266 amount=-1 +kerning first=259 second=932 amount=-1 +kerning first=317 second=8211 amount=-1 +kerning first=358 second=339 amount=-1 +kerning first=89 second=250 amount=-1 +kerning first=372 second=198 amount=-1 +kerning first=932 second=258 amount=-1 +kerning first=241 second=354 amount=-1 +kerning first=8216 second=969 amount=-1 +kerning first=1168 second=1072 amount=-1 +kerning first=87 second=197 amount=-1 +kerning first=319 second=45 amount=-1 +kerning first=1036 second=1033 amount=1 +kerning first=354 second=281 amount=-1 +kerning first=8220 second=279 amount=-1 +kerning first=160 second=221 amount=-1 +kerning first=221 second=244 amount=-1 +kerning first=354 second=125 amount=1 +kerning first=315 second=8249 amount=-1 +kerning first=8204 second=8218 amount=-2 +kerning first=932 second=307 amount=-1 +kerning first=8220 second=1113 amount=-1 +kerning first=1058 second=8212 amount=-1 +kerning first=84 second=353 amount=-1 +kerning first=358 second=312 amount=-1 +kerning first=160 second=84 amount=-1 +kerning first=376 second=239 amount=1 +kerning first=1027 second=1083 amount=-1 +kerning first=8211 second=932 amount=-1 +kerning first=89 second=920 amount=-1 +kerning first=39 second=308 amount=-1 +kerning first=76 second=199 amount=-1 +kerning first=358 second=275 amount=-1 +kerning first=193 second=936 amount=-1 +kerning first=8221 second=109 amount=-1 +kerning first=356 second=74 amount=-1 +kerning first=317 second=87 amount=-1 +kerning first=315 second=217 amount=-1 +kerning first=376 second=100 amount=-1 +kerning first=76 second=288 amount=-1 +kerning first=8216 second=913 amount=-1 +kerning first=902 second=939 amount=-1 +kerning first=89 second=266 amount=-1 +kerning first=315 second=334 amount=-1 +kerning first=931 second=332 amount=-1 +kerning first=98 second=356 amount=-1 +kerning first=194 second=932 amount=-1 +kerning first=915 second=256 amount=-2 +kerning first=86 second=239 amount=1 +kerning first=356 second=371 amount=-1 +kerning first=65 second=933 amount=-1 +kerning first=8216 second=258 amount=-1 +kerning first=221 second=260 amount=-1 +kerning first=111 second=84 amount=-1 +kerning first=1058 second=1102 amount=-1 +kerning first=372 second=194 amount=-1 +kerning first=8216 second=1035 amount=1 +kerning first=1168 second=1107 amount=-1 +kerning first=319 second=79 amount=-1 +kerning first=315 second=216 amount=-1 +kerning first=335 second=358 amount=-1 +kerning first=376 second=45 amount=-1 +kerning first=356 second=353 amount=-1 +kerning first=8216 second=8220 amount=-1 +kerning first=221 second=8249 amount=-1 +kerning first=1027 second=1119 amount=-1 +kerning first=258 second=356 amount=-1 +kerning first=257 second=354 amount=-1 +kerning first=319 second=8212 amount=-1 +kerning first=8221 second=324 amount=-1 +kerning first=354 second=940 amount=-1 +kerning first=8220 second=969 amount=-1 +kerning first=1058 second=58 amount=-1 +kerning first=84 second=8211 amount=-1 +kerning first=915 second=947 amount=-1 +kerning first=354 second=244 amount=-1 +kerning first=89 second=226 amount=-1 +kerning first=910 second=972 amount=-1 +kerning first=76 second=362 amount=-1 +kerning first=228 second=84 amount=-1 +kerning first=80 second=256 amount=-1 +kerning first=310 second=74 amount=1 +kerning first=196 second=8221 amount=-1 +kerning first=193 second=372 amount=-1 +kerning first=1026 second=1066 amount=-1 +kerning first=916 second=939 amount=-1 +kerning first=939 second=941 amount=-1 +kerning first=932 second=382 amount=-1 +kerning first=358 second=962 amount=-1 +kerning first=221 second=334 amount=-1 +kerning first=84 second=225 amount=-1 +kerning first=87 second=41 amount=1 +kerning first=8217 second=271 amount=-1 +kerning first=1033 second=1059 amount=-1 +kerning first=358 second=243 amount=-1 +kerning first=44 second=933 amount=-1 +kerning first=1043 second=1099 amount=-1 +kerning first=1168 second=187 amount=-1 +kerning first=1066 second=1035 amount=-1 +kerning first=260 second=86 amount=-1 +kerning first=1075 second=1076 amount=-1 +kerning first=8230 second=39 amount=-1 +kerning first=271 second=322 amount=1 +kerning first=932 second=115 amount=-1 +kerning first=358 second=372 amount=1 +kerning first=936 second=65 amount=-1 +kerning first=8220 second=913 amount=-1 +kerning first=258 second=8217 amount=-1 +kerning first=84 second=87 amount=1 +kerning first=933 second=173 amount=-1 +kerning first=187 second=221 amount=-1 +kerning first=358 second=103 amount=-1 +kerning first=372 second=93 amount=1 +kerning first=931 second=199 amount=-1 +kerning first=376 second=79 amount=-1 +kerning first=196 second=354 amount=-1 +kerning first=8217 second=932 amount=1 +kerning first=354 second=260 amount=-1 +kerning first=1114 second=8221 amount=-1 +kerning first=315 second=284 amount=-1 +kerning first=8220 second=258 amount=-1 +kerning first=931 second=288 amount=-1 +kerning first=221 second=216 amount=-1 +kerning first=187 second=84 amount=-1 +kerning first=70 second=46 amount=-1 +kerning first=1068 second=8217 amount=-1 +kerning first=939 second=916 amount=-1 +kerning first=932 second=196 amount=-1 +kerning first=8220 second=1035 amount=1 +kerning first=84 second=305 amount=-1 +kerning first=356 second=8211 amount=-1 +kerning first=293 second=932 amount=-1 +kerning first=1058 second=1081 amount=-1 +kerning first=1043 second=1044 amount=-1 +kerning first=376 second=8212 amount=-1 +kerning first=8217 second=65 amount=-1 +kerning first=321 second=67 amount=-1 +kerning first=913 second=936 amount=-1 +kerning first=1168 second=1085 amount=-1 +kerning first=89 second=283 amount=-1 +kerning first=358 second=256 amount=-1 +kerning first=354 second=8249 amount=-1 +kerning first=1059 second=1077 amount=-1 +kerning first=8220 second=8220 amount=-1 +kerning first=197 second=87 amount=-1 +kerning first=221 second=269 amount=-1 +kerning first=84 second=273 amount=-1 +kerning first=8221 second=331 amount=-1 +kerning first=356 second=225 amount=-1 +kerning first=8217 second=347 amount=-1 +kerning first=221 second=117 amount=-1 +kerning first=932 second=333 amount=-1 +kerning first=1027 second=1096 amount=-1 +kerning first=8211 second=939 amount=-1 +kerning first=84 second=277 amount=-1 +kerning first=8221 second=283 amount=-1 +kerning first=256 second=936 amount=-1 +kerning first=317 second=366 amount=-1 +kerning first=354 second=948 amount=-1 +kerning first=76 second=210 amount=-1 +kerning first=84 second=121 amount=-1 +kerning first=376 second=257 amount=-1 +kerning first=356 second=87 amount=1 +kerning first=915 second=927 amount=-1 +kerning first=358 second=171 amount=-1 +kerning first=376 second=113 amount=-1 +kerning first=915 second=192 amount=-2 +kerning first=337 second=356 amount=-1 +kerning first=260 second=932 amount=-1 +kerning first=315 second=364 amount=-1 +kerning first=8216 second=196 amount=-1 +kerning first=345 second=44 amount=-1 +kerning first=221 second=197 amount=-1 +kerning first=171 second=910 amount=-1 +kerning first=194 second=939 amount=-1 +kerning first=932 second=959 amount=-1 +kerning first=8217 second=238 amount=-1 +kerning first=915 second=286 amount=-1 +kerning first=89 second=67 amount=-1 +kerning first=315 second=8216 amount=-2 +kerning first=939 second=949 amount=-1 +kerning first=932 second=233 amount=-1 +kerning first=121 second=44 amount=-1 +kerning first=929 second=913 amount=-1 +kerning first=221 second=284 amount=-1 +kerning first=356 second=305 amount=-1 +kerning first=1033 second=1038 amount=-1 +kerning first=321 second=360 amount=-1 +kerning first=1058 second=1116 amount=-1 +kerning first=1043 second=1078 amount=-1 +kerning first=932 second=356 amount=1 +kerning first=376 second=193 amount=-1 +kerning first=8217 second=99 amount=-1 +kerning first=1168 second=1169 amount=-1 +kerning first=89 second=349 amount=-1 +kerning first=248 second=356 amount=-1 +kerning first=929 second=258 amount=-1 +kerning first=936 second=44 amount=-1 +kerning first=317 second=45 amount=-1 +kerning first=40 second=354 amount=1 +kerning first=70 second=198 amount=-1 +kerning first=8216 second=333 amount=-1 +kerning first=913 second=372 amount=-1 +kerning first=313 second=8249 amount=-1 +kerning first=356 second=273 amount=-1 +kerning first=1038 second=1077 amount=-1 +kerning first=86 second=193 amount=-1 +kerning first=84 second=351 amount=-1 +kerning first=8221 second=349 amount=-1 +kerning first=356 second=277 amount=-1 +kerning first=80 second=192 amount=-1 +kerning first=197 second=933 amount=-1 +kerning first=376 second=335 amount=-1 +kerning first=356 second=121 amount=-1 +kerning first=76 second=173 amount=-1 +kerning first=915 second=961 amount=-1 +kerning first=1058 second=1060 amount=-1 +kerning first=8217 second=44 amount=-2 +kerning first=8216 second=959 amount=-1 +kerning first=256 second=372 amount=-1 +kerning first=313 second=217 amount=-1 +kerning first=354 second=269 amount=-1 +kerning first=70 second=261 amount=-1 +kerning first=8216 second=233 amount=-1 +kerning first=221 second=235 amount=-1 +kerning first=354 second=117 amount=-1 +kerning first=89 second=101 amount=-1 +kerning first=1091 second=44 amount=-1 +kerning first=313 second=334 amount=-1 +kerning first=8216 second=356 amount=1 +kerning first=84 second=239 amount=-1 +kerning first=8217 second=299 amount=-1 +kerning first=8221 second=236 amount=-1 +kerning first=1043 second=1113 amount=-1 +kerning first=932 second=291 amount=-1 +kerning first=376 second=227 amount=-1 +kerning first=1027 second=1075 amount=-1 +kerning first=8216 second=1083 amount=-1 +kerning first=321 second=39 amount=-1 +kerning first=109 second=84 amount=-1 +kerning first=923 second=221 amount=-1 +kerning first=358 second=263 amount=-1 +kerning first=84 second=100 amount=-1 +kerning first=8221 second=101 amount=-1 +kerning first=317 second=79 amount=-1 +kerning first=354 second=197 amount=-1 +kerning first=315 second=212 amount=-1 +kerning first=70 second=194 amount=-1 +kerning first=8220 second=196 amount=-1 +kerning first=931 second=210 amount=-1 +kerning first=8204 second=376 amount=-1 +kerning first=923 second=84 amount=-1 +kerning first=313 second=216 amount=-1 +kerning first=308 second=125 amount=1 +kerning first=321 second=218 amount=-1 +kerning first=89 second=46 amount=-1 +kerning first=356 second=351 amount=-1 +kerning first=939 second=195 amount=-1 +kerning first=317 second=8212 amount=-1 +kerning first=1058 second=1094 amount=-1 +kerning first=358 second=192 amount=-1 +kerning first=221 second=41 amount=1 +kerning first=1168 second=1098 amount=-1 +kerning first=319 second=71 amount=-1 +kerning first=354 second=341 amount=-1 +kerning first=8220 second=333 amount=-1 +kerning first=225 second=84 amount=-1 +kerning first=84 second=45 amount=-1 +kerning first=8221 second=46 amount=-2 +kerning first=354 second=187 amount=-1 +kerning first=193 second=8221 amount=-1 +kerning first=102 second=125 amount=1 +kerning first=8216 second=291 amount=-1 +kerning first=356 second=239 amount=-1 +kerning first=932 second=363 amount=-1 +kerning first=84 second=303 amount=-1 +kerning first=8221 second=297 amount=-1 +kerning first=354 second=963 amount=-1 +kerning first=195 second=8216 amount=-1 +kerning first=8220 second=959 amount=-1 +kerning first=258 second=86 amount=-1 +kerning first=376 second=287 amount=-1 +kerning first=356 second=100 amount=-1 +kerning first=939 second=8230 amount=-1 +kerning first=227 second=358 amount=-1 +kerning first=354 second=235 amount=-1 +kerning first=8220 second=233 amount=-1 +kerning first=8204 second=358 amount=-1 +kerning first=915 second=211 amount=-1 +kerning first=8222 second=221 amount=-1 +kerning first=260 second=939 amount=-1 +kerning first=193 second=354 amount=-1 +kerning first=221 second=212 amount=-1 +kerning first=8220 second=356 amount=1 +kerning first=1026 second=1058 amount=-1 +kerning first=1059 second=46 amount=-1 +kerning first=936 second=923 amount=-1 +kerning first=965 second=39 amount=-1 +kerning first=313 second=284 amount=-1 +kerning first=8217 second=160 amount=-1 +kerning first=932 second=245 amount=-1 +kerning first=358 second=961 amount=-1 +kerning first=1058 second=8250 amount=-1 +kerning first=8220 second=1083 amount=-1 +kerning first=8222 second=84 amount=-1 +kerning first=1066 second=8217 amount=-1 +kerning first=358 second=234 amount=-1 +kerning first=929 second=196 amount=-1 +kerning first=1043 second=1091 amount=-1 +kerning first=8217 second=112 amount=-1 +kerning first=933 second=962 amount=-1 +kerning first=315 second=920 amount=-1 +kerning first=358 second=354 amount=1 +kerning first=98 second=932 amount=-1 +kerning first=356 second=45 amount=-1 +kerning first=968 second=34 amount=-1 +kerning first=89 second=198 amount=-1 +kerning first=376 second=71 amount=-1 +kerning first=221 second=367 amount=-1 +kerning first=8217 second=923 amount=-1 +kerning first=315 second=266 amount=-1 +kerning first=196 second=87 amount=-1 +kerning first=354 second=41 amount=1 +kerning first=356 second=303 amount=-1 +kerning first=84 second=8212 amount=-1 +kerning first=376 second=365 amount=-1 +kerning first=915 second=970 amount=-1 +kerning first=8221 second=198 amount=-1 +kerning first=910 second=46 amount=-1 +kerning first=1043 second=1035 amount=1 +kerning first=1168 second=1077 amount=-1 +kerning first=89 second=261 amount=-1 +kerning first=8216 second=245 amount=-1 +kerning first=8220 second=291 amount=-1 +kerning first=80 second=74 amount=-1 +kerning first=326 second=356 amount=-1 +kerning first=221 second=250 amount=-1 +kerning first=258 second=932 amount=-1 +kerning first=313 second=364 amount=-1 +kerning first=933 second=256 amount=-1 +kerning first=1038 second=46 amount=-1 +kerning first=84 second=253 amount=-1 +kerning first=313 second=8216 amount=-2 +kerning first=8217 second=326 amount=-1 +kerning first=119 second=44 amount=-1 +kerning first=160 second=89 amount=-1 +kerning first=376 second=246 amount=-1 +kerning first=1027 second=1088 amount=-1 +kerning first=84 second=257 amount=-1 +kerning first=358 second=289 amount=-1 +kerning first=84 second=113 amount=-1 +kerning first=8221 second=114 amount=-1 +kerning first=89 second=194 amount=-1 +kerning first=910 second=945 amount=-1 +kerning first=934 second=44 amount=-1 +kerning first=221 second=920 amount=-1 +kerning first=91 second=106 amount=1 +kerning first=70 second=308 amount=-1 +kerning first=913 second=8221 amount=-1 +kerning first=91 second=1095 amount=-1 +kerning first=915 second=264 amount=-1 +kerning first=173 second=1026 amount=-1 +kerning first=319 second=221 amount=-1 +kerning first=1040 second=1026 amount=-1 +kerning first=221 second=266 amount=-1 +kerning first=84 second=193 amount=-1 +kerning first=8221 second=194 amount=-1 +kerning first=356 second=8212 amount=-1 +kerning first=1058 second=1108 amount=-1 +kerning first=1027 second=44 amount=-1 +kerning first=319 second=336 amount=-1 +kerning first=1027 second=1032 amount=-1 +kerning first=196 second=933 amount=-1 +kerning first=319 second=84 amount=-1 +kerning first=932 second=86 amount=1 +kerning first=354 second=367 amount=-1 +kerning first=89 second=337 amount=-1 +kerning first=242 second=84 amount=-1 +kerning first=256 second=8221 amount=-1 +kerning first=358 second=74 amount=-1 +kerning first=1059 second=1103 amount=-1 +kerning first=915 second=8211 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=913 second=354 amount=-1 +kerning first=934 second=939 amount=-1 +kerning first=910 second=198 amount=-1 +kerning first=356 second=253 amount=-1 +kerning first=84 second=335 amount=-1 +kerning first=319 second=338 amount=-1 +kerning first=356 second=257 amount=-1 +kerning first=8221 second=337 amount=-1 +kerning first=932 second=230 amount=-1 +kerning first=354 second=972 amount=-1 +kerning first=358 second=371 amount=-1 +kerning first=356 second=113 amount=-1 +kerning first=354 second=250 amount=-1 +kerning first=89 second=231 amount=-1 +kerning first=8220 second=245 amount=-1 +kerning first=76 second=372 amount=-1 +kerning first=8212 second=221 amount=-1 +kerning first=256 second=354 amount=-1 +kerning first=313 second=212 amount=-1 +kerning first=1061 second=1095 amount=-1 +kerning first=221 second=226 amount=-1 +kerning first=1059 second=59 amount=-1 +kerning first=354 second=109 amount=-1 +kerning first=89 second=93 amount=1 +kerning first=324 second=358 amount=-1 +kerning first=8212 second=84 amount=-1 +kerning first=1058 second=8230 amount=-1 +kerning first=84 second=227 amount=-1 +kerning first=87 second=46 amount=-1 +kerning first=356 second=193 amount=-1 +kerning first=904 second=912 amount=1 +kerning first=8217 second=281 amount=-1 +kerning first=8221 second=231 amount=-1 +kerning first=112 second=358 amount=-1 +kerning first=358 second=353 amount=-1 +kerning first=1043 second=1105 amount=-1 +kerning first=932 second=271 amount=-1 +kerning first=337 second=932 amount=-1 +kerning first=91 second=376 amount=1 +kerning first=376 second=336 amount=-1 +kerning first=317 second=71 amount=-1 +kerning first=1169 second=8230 amount=-1 +kerning first=910 second=194 amount=-1 +kerning first=1038 second=1103 amount=-1 +kerning first=932 second=932 amount=1 +kerning first=187 second=89 amount=-1 +kerning first=315 second=67 amount=-1 +kerning first=356 second=335 amount=-1 +kerning first=248 second=932 amount=-1 +kerning first=8250 second=354 amount=-1 +kerning first=935 second=970 amount=1 +kerning first=910 second=59 amount=-1 +kerning first=1058 second=1086 amount=-1 +kerning first=319 second=290 amount=-1 +kerning first=192 second=8216 amount=-1 +kerning first=376 second=338 amount=-1 +kerning first=224 second=358 amount=-1 +kerning first=1168 second=1090 amount=-1 +kerning first=354 second=324 amount=-1 +kerning first=932 second=65 amount=-1 +kerning first=89 second=285 amount=-1 +kerning first=76 second=171 amount=-1 +kerning first=933 second=192 amount=-1 +kerning first=258 second=939 amount=-1 +kerning first=1040 second=1095 amount=-1 +kerning first=306 second=93 amount=1 +kerning first=8216 second=271 amount=-1 +kerning first=1038 second=59 amount=-1 +kerning first=221 second=283 amount=-1 +kerning first=356 second=227 amount=-1 +kerning first=932 second=347 amount=-1 +kerning first=1027 second=1101 amount=-1 +kerning first=917 second=912 amount=1 +kerning first=84 second=287 amount=-1 +kerning first=8221 second=285 amount=-1 +kerning first=91 second=358 amount=1 +kerning first=76 second=220 amount=-1 +kerning first=372 second=301 amount=1 +kerning first=376 second=265 amount=-1 +kerning first=354 second=226 amount=-1 +kerning first=358 second=8211 amount=-1 +kerning first=313 second=920 amount=-1 +kerning first=1168 second=46 amount=-1 +kerning first=8216 second=932 amount=1 +kerning first=87 second=198 amount=-1 +kerning first=89 second=308 amount=-1 +kerning first=315 second=360 amount=-1 +kerning first=932 second=966 amount=-1 +kerning first=8217 second=244 amount=-1 +kerning first=1059 second=1026 amount=1 +kerning first=313 second=266 amount=-1 +kerning first=193 second=87 amount=-1 +kerning first=939 second=954 amount=-1 +kerning first=932 second=238 amount=-1 +kerning first=333 second=354 amount=-1 +kerning first=65 second=221 amount=-1 +kerning first=358 second=225 amount=-1 +kerning first=8216 second=65 amount=-1 +kerning first=319 second=368 amount=-1 +kerning first=221 second=67 amount=-1 +kerning first=902 second=8216 amount=-1 +kerning first=376 second=195 amount=-1 +kerning first=8249 second=939 amount=-1 +kerning first=936 second=260 amount=-1 +kerning first=933 second=961 amount=-1 +kerning first=1043 second=1083 amount=-1 +kerning first=8221 second=308 amount=-1 +kerning first=932 second=99 amount=-1 +kerning first=89 second=369 amount=-1 +kerning first=1041 second=1035 amount=-1 +kerning first=329 second=84 amount=-1 +kerning first=376 second=290 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=358 second=87 amount=1 +kerning first=328 second=356 amount=-1 +kerning first=221 second=349 amount=-1 +kerning first=160 second=8220 amount=-1 +kerning first=86 second=195 amount=-1 +kerning first=84 second=365 amount=-1 +kerning first=356 second=287 amount=-1 +kerning first=173 second=376 amount=-1 +kerning first=8217 second=260 amount=-1 +kerning first=321 second=262 amount=-1 +kerning first=354 second=331 amount=-1 +kerning first=358 second=305 amount=-1 +kerning first=89 second=242 amount=-1 +kerning first=376 second=8230 amount=-1 +kerning first=8216 second=966 amount=-1 +kerning first=87 second=194 amount=-1 +kerning first=354 second=283 amount=-1 +kerning first=932 second=44 amount=-1 +kerning first=8220 second=271 amount=-1 +kerning first=354 second=122 amount=-1 +kerning first=315 second=39 amount=-1 +kerning first=84 second=941 amount=-1 +kerning first=102 second=8216 amount=1 +kerning first=34 second=256 amount=-1 +kerning first=84 second=246 amount=-1 +kerning first=8221 second=242 amount=-1 +kerning first=317 second=221 amount=-1 +kerning first=1038 second=1026 amount=1 +kerning first=358 second=273 amount=-1 +kerning first=8216 second=99 amount=-1 +kerning first=1043 second=1119 amount=-1 +kerning first=221 second=101 amount=-1 +kerning first=932 second=299 amount=-1 +kerning first=376 second=232 amount=-1 +kerning first=1027 second=1080 amount=-1 +kerning first=76 second=927 amount=-1 +kerning first=308 second=41 amount=1 +kerning first=86 second=8230 amount=-1 +kerning first=229 second=356 amount=-1 +kerning first=317 second=336 amount=-1 +kerning first=354 second=934 amount=-1 +kerning first=358 second=277 amount=-1 +kerning first=8220 second=932 amount=1 +kerning first=97 second=354 amount=-1 +kerning first=193 second=933 amount=-1 +kerning first=84 second=105 amount=-1 +kerning first=317 second=84 amount=-1 +kerning first=315 second=218 amount=-1 +kerning first=358 second=121 amount=-1 +kerning first=244 second=84 amount=-1 +kerning first=376 second=97 amount=-1 +kerning first=76 second=286 amount=-1 +kerning first=1111 second=1115 amount=1 +kerning first=923 second=89 amount=-1 +kerning first=89 second=262 amount=-1 +kerning first=321 second=376 amount=-1 +kerning first=8220 second=65 amount=-1 +kerning first=319 second=214 amount=-1 +kerning first=356 second=365 amount=-1 +kerning first=84 second=916 amount=-1 +kerning first=173 second=358 amount=-1 +kerning first=915 second=45 amount=-1 +kerning first=102 second=41 amount=1 +kerning first=317 second=338 amount=-1 +kerning first=321 second=332 amount=-1 +kerning first=1058 second=1099 amount=-1 +kerning first=8216 second=44 amount=-2 +kerning first=271 second=316 amount=1 +kerning first=221 second=46 amount=-1 +kerning first=1090 second=1076 amount=-1 +kerning first=8216 second=1032 amount=-1 +kerning first=321 second=85 amount=-1 +kerning first=1168 second=1103 amount=-1 +kerning first=354 second=349 amount=-1 +kerning first=76 second=8221 amount=-1 +kerning first=356 second=941 amount=-1 +kerning first=923 second=34 amount=-1 +kerning first=87 second=93 amount=1 +kerning first=356 second=246 amount=-1 +kerning first=913 second=87 amount=-1 +kerning first=1056 second=8230 amount=-2 +kerning first=932 second=373 amount=-1 +kerning first=110 second=358 amount=-1 +kerning first=354 second=968 amount=-1 +kerning first=358 second=351 amount=-1 +kerning first=8220 second=966 amount=-1 +kerning first=326 second=932 amount=-1 +kerning first=84 second=8250 amount=-1 +kerning first=356 second=105 amount=-1 +kerning first=354 second=236 amount=-1 +kerning first=1058 second=1044 amount=-1 +kerning first=910 second=942 amount=-1 +kerning first=1168 second=59 amount=-1 +kerning first=76 second=354 amount=-1 +kerning first=89 second=332 amount=-1 +kerning first=932 second=974 amount=-1 +kerning first=256 second=87 amount=-1 +kerning first=1026 second=1063 amount=-1 +kerning first=321 second=358 amount=-1 +kerning first=354 second=101 amount=-1 +kerning first=8220 second=99 amount=-1 +kerning first=356 second=916 amount=-1 +kerning first=84 second=949 amount=-1 +kerning first=1059 second=1040 amount=-1 +kerning first=932 second=249 amount=-1 +kerning first=915 second=79 amount=-1 +kerning first=936 second=197 amount=-1 +kerning first=8222 second=89 amount=-1 +kerning first=313 second=67 amount=-1 +kerning first=8217 second=269 amount=-1 +kerning first=922 second=308 amount=1 +kerning first=358 second=239 amount=-1 +kerning first=1043 second=1096 amount=-1 +kerning first=932 second=259 amount=-1 +kerning first=376 second=214 amount=-1 +kerning first=1027 second=1059 amount=1 +kerning first=933 second=970 amount=1 +kerning first=317 second=290 amount=-1 +kerning first=194 second=8216 amount=-1 +kerning first=932 second=112 amount=-1 +kerning first=39 second=256 amount=-1 +kerning first=931 second=927 amount=-1 +kerning first=84 second=84 amount=1 +kerning first=226 second=358 amount=-1 +kerning first=358 second=100 amount=-1 +kerning first=929 second=65 amount=-1 +kerning first=915 second=8212 amount=-1 +kerning first=373 second=44 amount=-1 +kerning first=160 second=8222 amount=-2 +kerning first=931 second=286 amount=-1 +kerning first=221 second=198 amount=-1 +kerning first=932 second=923 amount=-1 +kerning first=8217 second=197 amount=-1 +kerning first=321 second=199 amount=-1 +kerning first=354 second=46 amount=-1 +kerning first=84 second=378 amount=-1 +kerning first=8220 second=44 amount=-2 +kerning first=939 second=913 amount=-1 +kerning first=195 second=39 amount=-1 +kerning first=8220 second=1032 amount=-1 +kerning first=915 second=912 amount=-1 +kerning first=356 second=8250 amount=-1 +kerning first=376 second=361 amount=-1 +kerning first=321 second=288 amount=-1 +kerning first=1058 second=1078 amount=-1 +kerning first=197 second=221 amount=-1 +kerning first=8216 second=974 amount=-1 +kerning first=913 second=933 amount=-1 +kerning first=1168 second=1082 amount=-1 +kerning first=939 second=258 amount=-1 +kerning first=354 second=297 amount=-1 +kerning first=89 second=267 amount=-1 +kerning first=1118 second=46 amount=-1 +kerning first=34 second=192 amount=-1 +kerning first=1050 second=1033 amount=1 +kerning first=358 second=45 amount=-1 +kerning first=313 second=360 amount=-1 +kerning first=356 second=949 amount=-1 +kerning first=197 second=84 amount=-1 +kerning first=160 second=356 amount=-1 +kerning first=221 second=261 amount=-1 +kerning first=8217 second=341 amount=-1 +kerning first=8221 second=358 amount=1 +kerning first=1057 second=1026 amount=1 +kerning first=1100 second=1091 amount=-1 +kerning first=1038 second=1040 amount=-1 +kerning first=932 second=326 amount=-1 +kerning first=335 second=354 amount=-1 +kerning first=376 second=251 amount=-1 +kerning first=1027 second=1093 amount=-1 +kerning first=84 second=265 amount=-1 +kerning first=256 second=933 amount=-1 +kerning first=8221 second=267 amount=-1 +kerning first=317 second=368 amount=-1 +kerning first=354 second=945 amount=-1 +kerning first=358 second=303 amount=-1 +kerning first=76 second=211 amount=-1 +kerning first=84 second=118 amount=-1 +kerning first=255 second=44 amount=-1 +kerning first=356 second=84 amount=1 +kerning first=89 second=199 amount=-1 +kerning first=295 second=84 amount=-1 +kerning first=915 second=193 amount=-2 +kerning first=8216 second=923 amount=-1 +kerning first=1168 second=1026 amount=1 +kerning first=89 second=288 amount=-1 +kerning first=933 second=8211 amount=-1 +kerning first=221 second=194 amount=-1 +kerning first=8204 second=372 amount=-1 +kerning first=8217 second=235 amount=-1 +kerning first=1107 second=44 amount=-1 +kerning first=356 second=378 amount=-1 +kerning first=939 second=946 amount=-1 +kerning first=111 second=356 amount=-1 +kerning first=932 second=229 amount=-1 +kerning first=915 second=58 amount=-1 +kerning first=1068 second=1059 amount=-1 +kerning first=84 second=195 amount=-1 +kerning first=321 second=362 amount=-1 +kerning first=1058 second=1113 amount=-1 +kerning first=1043 second=1075 amount=-1 +kerning first=1027 second=1038 amount=1 +kerning first=34 second=961 amount=-1 +kerning first=1168 second=1118 amount=-1 +kerning first=319 second=89 amount=-1 +kerning first=354 second=198 amount=-1 +kerning first=929 second=44 amount=-2 +kerning first=1059 second=1109 amount=-1 +kerning first=221 second=337 amount=-1 +kerning first=313 second=39 amount=-1 +kerning first=1027 second=8249 amount=-1 +kerning first=1075 second=8230 amount=-1 +kerning first=173 second=910 amount=-1 +kerning first=84 second=345 amount=-1 +kerning first=1035 second=1026 amount=-1 +kerning first=356 second=265 amount=-1 +kerning first=8221 second=343 amount=-1 +kerning first=354 second=944 amount=-1 +kerning first=8220 second=974 amount=-1 +kerning first=80 second=193 amount=-1 +kerning first=84 second=8230 amount=-1 +kerning first=356 second=118 amount=-1 +kerning first=915 second=957 amount=-1 +kerning first=228 second=356 amount=-1 +kerning first=354 second=255 amount=-1 +kerning first=358 second=8212 amount=-1 +kerning first=45 second=1026 amount=-1 +kerning first=923 second=8220 amount=-1 +kerning first=313 second=218 amount=-1 +kerning first=319 second=34 amount=-1 +kerning first=271 second=98 amount=1 +kerning first=354 second=261 amount=-1 +kerning first=241 second=84 amount=-1 +kerning first=221 second=231 amount=-1 +kerning first=46 second=34 amount=-1 +kerning first=354 second=114 amount=-1 +kerning first=1040 second=1066 amount=-1 +kerning first=8212 second=89 amount=-1 +kerning first=84 second=232 amount=-1 +kerning first=8221 second=237 amount=-1 +kerning first=356 second=195 amount=-1 +kerning first=317 second=214 amount=-1 +kerning first=39 second=192 amount=-1 +kerning first=358 second=253 amount=-1 +kerning first=221 second=93 amount=1 +kerning first=932 second=281 amount=-1 +kerning first=376 second=228 amount=-1 +kerning first=1027 second=1072 amount=-1 +kerning first=260 second=8216 amount=-1 +kerning first=932 second=125 amount=1 +kerning first=358 second=257 amount=-1 +kerning first=8220 second=923 amount=-1 +kerning first=245 second=358 amount=-1 +kerning first=84 second=97 amount=-1 +kerning first=354 second=194 amount=-1 +kerning first=358 second=113 amount=-1 +kerning first=931 second=211 amount=-1 +kerning first=76 second=264 amount=-1 +kerning first=1057 second=1095 amount=-1 +kerning first=187 second=356 amount=-1 +kerning first=1038 second=1109 amount=-1 +kerning first=321 second=210 amount=-1 +kerning first=356 second=345 amount=-1 +kerning first=1068 second=1038 amount=-1 +kerning first=935 second=912 amount=1 +kerning first=356 second=8230 amount=-1 +kerning first=939 second=196 amount=-1 +kerning first=1058 second=1091 amount=-1 +kerning first=358 second=193 amount=-1 +kerning first=328 second=932 amount=-1 +kerning first=376 second=248 amount=-1 +kerning first=1168 second=1095 amount=-1 +kerning first=1056 second=1044 amount=-1 +kerning first=354 second=337 amount=-1 +kerning first=76 second=8211 amount=-1 +kerning first=372 second=256 amount=-1 +kerning first=1113 second=1098 amount=-1 diff --git a/assets/style/uiskin.atlas b/assets/style/uiskin.atlas new file mode 100644 index 00000000..e597b1eb --- /dev/null +++ b/assets/style/uiskin.atlas @@ -0,0 +1,1506 @@ + +uiskin.png +size: 1024,1024 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +align-center-horisontal + rotate: false + xy: 360, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-center-vertical + rotate: false + xy: 306, 416 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-edge-down + rotate: false + xy: 380, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-edge-left + rotate: false + xy: 400, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-edge-right + rotate: false + xy: 420, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-edge-up + rotate: false + xy: 440, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-simple-down + rotate: false + xy: 460, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-simple-left + rotate: false + xy: 480, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-simple-right + rotate: false + xy: 500, 490 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +align-simple-up + rotate: false + xy: 235, 387 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +alpha-bar-10px + rotate: false + xy: 520, 982 + size: 130, 10 + orig: 130, 10 + offset: 0, 0 + index: -1 +alpha-bar-25px + rotate: false + xy: 520, 994 + size: 130, 28 + orig: 130, 28 + offset: 0, 0 + index: -1 +alpha-bar-25px-shifted + rotate: false + xy: 2, 377 + size: 130, 28 + orig: 130, 28 + offset: 0, 0 + index: -1 +border + rotate: false + xy: 134, 378 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +border-circle + rotate: false + xy: 681, 975 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +border-circle-error + rotate: false + xy: 520, 488 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +border-error + rotate: false + xy: 67, 326 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +box + rotate: false + xy: 520, 950 + size: 17, 30 + split: 8, 8, 23, 6 + orig: 17, 30 + offset: 0, 0 + index: -1 +box-colapse-off + rotate: false + xy: 697, 969 + size: 11, 11 + orig: 11, 11 + offset: 0, 0 + index: -1 +box-colapse-on + rotate: false + xy: 710, 969 + size: 11, 11 + orig: 11, 11 + offset: 0, 0 + index: -1 +button + rotate: false + xy: 520, 588 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-dark + rotate: false + xy: 520, 786 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-dark-down + rotate: false + xy: 520, 830 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-dark-over + rotate: false + xy: 520, 808 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 4, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-down + rotate: false + xy: 520, 764 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-orange + rotate: false + xy: 520, 698 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-orange-down + rotate: false + xy: 520, 742 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-orange-over + rotate: false + xy: 520, 720 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-over + rotate: false + xy: 520, 676 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 3, 3 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-red + rotate: false + xy: 520, 654 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-resource + rotate: false + xy: 520, 610 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +button-resource-over + rotate: false + xy: 520, 632 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +check-down + rotate: false + xy: 882, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-down-on + rotate: false + xy: 898, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-off + rotate: false + xy: 914, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +textfield + rotate: false + xy: 914, 984 + size: 14, 14 + split: 2, 2, 3, 2 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 930, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-on-disabled + rotate: false + xy: 946, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-over-off + rotate: false + xy: 962, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +check-over-on + rotate: false + xy: 978, 984 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +color-picker-bar-selector + rotate: false + xy: 303, 377 + size: 7, 14 + orig: 7, 14 + offset: 0, 0 + index: -1 +color-picker-cross + rotate: false + xy: 875, 976 + size: 5, 5 + orig: 5, 5 + offset: 0, 0 + index: -1 +color-picker-selector-horizontal + rotate: false + xy: 349, 421 + size: 3, 1 + orig: 3, 1 + offset: 0, 0 + index: -1 +color-picker-selector-vertical + rotate: false + xy: 328, 392 + size: 1, 3 + orig: 1, 3 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 355, 482 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +default-pane + rotate: false + xy: 27, 275 + size: 5, 3 + split: 1, 1, 1, 1 + orig: 5, 3 + offset: 0, 0 + index: -1 +default-pane-noborder + rotate: false + xy: 888, 981 + size: 1, 1 + split: 0, 0, 0, 0 + orig: 1, 1 + offset: 0, 0 + index: -1 +default-select + rotate: false + xy: 134, 383 + size: 27, 22 + split: 2, 16, 0, 22 + orig: 27, 22 + offset: 0, 0 + index: -1 +default-select-selection + rotate: false + xy: 360, 485 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +default-select-white + rotate: false + xy: 331, 487 + size: 27, 21 + split: 2, 17, 0, 21 + orig: 27, 21 + offset: 0, 0 + index: -1 +default-select-white-over + rotate: false + xy: 253, 413 + size: 27, 21 + split: 2, 17, 0, 21 + orig: 27, 21 + offset: 0, 0 + index: -1 +dropHere + rotate: false + xy: 2, 407 + size: 249, 101 + orig: 249, 101 + offset: 0, 0 + index: -1 +expandable-properties-active-bg + rotate: false + xy: 46, 280 + size: 4, 17 + split: 1, 2, 0, 17 + orig: 4, 17 + offset: 0, 0 + index: -1 +expandable-properties-collapse-off + rotate: false + xy: 833, 974 + size: 7, 7 + orig: 7, 7 + offset: 0, 0 + index: -1 +expandable-properties-collapse-on + rotate: false + xy: 842, 974 + size: 7, 7 + orig: 7, 7 + offset: 0, 0 + index: -1 +expandable-properties-inactive-bg + rotate: false + xy: 326, 416 + size: 4, 18 + split: 1, 2, 0, 18 + orig: 4, 18 + offset: 0, 0 + index: -1 +icon-animation + rotate: false + xy: 163, 383 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-arrow-left + rotate: false + xy: 349, 424 + size: 6, 11 + orig: 6, 11 + offset: 0, 0 + index: -1 +icon-arrow-right + rotate: false + xy: 723, 969 + size: 6, 11 + orig: 6, 11 + offset: 0, 0 + index: -1 +icon-close + rotate: false + xy: 2, 226 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-close-orange + rotate: false + xy: 783, 973 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-close-orange-down + rotate: false + xy: 793, 973 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-close-orange-over + rotate: false + xy: 803, 973 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +icon-close-small + rotate: false + xy: 994, 986 + size: 12, 12 + orig: 12, 12 + offset: 0, 0 + index: -1 +icon-composite + rotate: false + xy: 75, 353 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-composite2 + rotate: false + xy: 1008, 974 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-drive + rotate: false + xy: 721, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-file-audio + rotate: false + xy: 587, 958 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-file-image + rotate: false + xy: 187, 383 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-file-pdf + rotate: false + xy: 2, 202 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-file-text + rotate: false + xy: 99, 353 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-folder + rotate: false + xy: 745, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-folder-new + rotate: false + xy: 611, 958 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-folder-parent + rotate: false + xy: 211, 383 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-folder-star + rotate: false + xy: 2, 178 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-group + rotate: false + xy: 769, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-image + rotate: false + xy: 2, 154 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-label + rotate: false + xy: 793, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-library + rotate: false + xy: 2, 130 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-library-over + rotate: false + xy: 817, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-link-active + rotate: false + xy: 332, 420 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +icon-link-inactive + rotate: false + xy: 697, 982 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +icon-list-settings + rotate: false + xy: 2, 106 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-lock-active + rotate: false + xy: 841, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-lock-inactive + rotate: false + xy: 2, 82 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-new-layer + rotate: false + xy: 1009, 1007 + size: 13, 15 + orig: 13, 15 + offset: 0, 0 + index: -1 +icon-particle + rotate: false + xy: 865, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-particle-over + rotate: false + xy: 2, 58 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-particle-white + rotate: false + xy: 889, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 2, 34 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-root + rotate: false + xy: 539, 941 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +icon-spine + rotate: false + xy: 913, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-star + rotate: false + xy: 2, 10 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-star-outline + rotate: false + xy: 937, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 1009, 990 + size: 13, 15 + orig: 13, 15 + offset: 0, 0 + index: -1 +icon-trash-disabled + rotate: false + xy: 520, 504 + size: 13, 15 + orig: 13, 15 + offset: 0, 0 + index: -1 +icon-trash-over + rotate: false + xy: 714, 982 + size: 13, 15 + orig: 13, 15 + offset: 0, 0 + index: -1 +icon-unlink-active + rotate: false + xy: 729, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +icon-unlink-inactive + rotate: false + xy: 746, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +icon-visible-off + rotate: false + xy: 961, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-visible-on + rotate: false + xy: 985, 1000 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +icon-zoomin + rotate: false + xy: 35, 299 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +icon-zoomin-disabled + rotate: false + xy: 255, 394 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +icon-zoomin-over + rotate: false + xy: 27, 280 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +icon-zoomout + rotate: false + xy: 274, 393 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +icon-zoomout-disabled + rotate: false + xy: 293, 393 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +icon-zoomout-over + rotate: false + xy: 312, 397 + size: 17, 17 + orig: 17, 17 + offset: 0, 0 + index: -1 +layer-bg + rotate: false + xy: 520, 521 + size: 5, 19 + split: 2, 2, 0, 19 + orig: 5, 19 + offset: 0, 0 + index: -1 +layer-bg-over + rotate: false + xy: 67, 331 + size: 5, 19 + split: 2, 2, 0, 19 + orig: 5, 19 + offset: 0, 0 + index: -1 +list-selection + rotate: false + xy: 139, 380 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 139, 380 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +list-selection-white + rotate: false + xy: 355, 479 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +logo + rotate: false + xy: 2, 275 + size: 23, 23 + orig: 23, 23 + offset: 0, 0 + index: -1 +menu-bg + rotate: false + xy: 35, 344 + size: 14, 31 + split: 2, 2, 0, 31 + orig: 14, 31 + offset: 0, 0 + index: -1 +menu-bg-down + rotate: false + xy: 520, 924 + size: 14, 24 + split: 2, 2, 0, 24 + orig: 14, 24 + offset: 0, 0 + index: -1 +menu-bg-over + rotate: false + xy: 35, 318 + size: 14, 24 + split: 2, 2, 0, 24 + orig: 14, 24 + offset: 0, 0 + index: -1 +menu-bg-up + rotate: false + xy: 51, 326 + size: 14, 24 + split: 2, 2, 0, 24 + orig: 14, 24 + offset: 0, 0 + index: -1 +myriad-medium + rotate: false + xy: 260, 510 + size: 128, 512 + orig: 128, 512 + offset: 0, 0 + index: -1 +myriad-medium-big + rotate: false + xy: 2, 510 + size: 256, 512 + orig: 256, 512 + offset: 0, 0 + index: -1 +myriad-medium-small + rotate: false + xy: 390, 510 + size: 128, 512 + orig: 128, 512 + offset: 0, 0 + index: -1 +origin-anchor + rotate: false + xy: 731, 972 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +popup-menu + rotate: false + xy: 34, 275 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +popup-menu-disabled + rotate: false + xy: 61, 321 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +popup-menu-down + rotate: false + xy: 661, 983 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +tree-selection + rotate: false + xy: 661, 983 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +popup-menu-over + rotate: false + xy: 648, 971 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +progressbar + rotate: false + xy: 536, 943 + size: 1, 5 + orig: 1, 5 + offset: 0, 0 + index: -1 +progressbar-filled + rotate: false + xy: 533, 917 + size: 1, 5 + orig: 1, 5 + offset: 0, 0 + index: -1 +progressbar-filled-vertical + rotate: false + xy: 332, 417 + size: 5, 1 + orig: 5, 1 + offset: 0, 0 + index: -1 +progressbar-vertical + rotate: false + xy: 536, 922 + size: 5, 1 + orig: 5, 1 + offset: 0, 0 + index: -1 +radio-down + rotate: false + xy: 763, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-down-on + rotate: false + xy: 780, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-off + rotate: false + xy: 797, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-on + rotate: false + xy: 814, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-on-disabled + rotate: false + xy: 831, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-over-off + rotate: false + xy: 848, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +radio-over-on + rotate: false + xy: 865, 983 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 17, 2 + size: 5, 6 + split: 2, 2, 2, 2 + orig: 5, 6 + offset: 0, 0 + index: -1 +scroll-horizontal + rotate: false + xy: 859, 976 + size: 6, 5 + split: 2, 2, 0, 5 + pad: -1, -1, 2, 2 + orig: 6, 5 + offset: 0, 0 + index: -1 +scroll-knob-horizontal + rotate: false + xy: 867, 976 + size: 6, 5 + split: 2, 2, 0, 5 + pad: -1, -1, 2, 2 + orig: 6, 5 + offset: 0, 0 + index: -1 +scroll-knob-vertical + rotate: false + xy: 10, 2 + size: 5, 6 + split: 2, 2, 2, 2 + orig: 5, 6 + offset: 0, 0 + index: -1 +select-box-list-bg + rotate: false + xy: 360, 482 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +select-box-list-bg-white + rotate: false + xy: 365, 487 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +select-down + rotate: false + xy: 652, 982 + size: 7, 4 + orig: 7, 4 + offset: 0, 0 + index: -1 +select-up + rotate: false + xy: 648, 976 + size: 7, 4 + orig: 7, 4 + offset: 0, 0 + index: -1 +selection-anchor + rotate: false + xy: 742, 972 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +separator + rotate: false + xy: 657, 978 + size: 1, 2 + orig: 1, 2 + offset: 0, 0 + index: -1 +separator-menu + rotate: false + xy: 657, 978 + size: 1, 2 + orig: 1, 2 + offset: 0, 0 + index: -1 +separator-vertical + rotate: false + xy: 731, 969 + size: 2, 1 + orig: 2, 1 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 529, 559 + size: 1, 4 + orig: 1, 4 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 635, 958 + size: 11, 22 + orig: 11, 22 + offset: 0, 0 + index: -1 +slider-knob-disabled + rotate: false + xy: 520, 900 + size: 11, 22 + orig: 11, 22 + offset: 0, 0 + index: -1 +slider-knob-down + rotate: false + xy: 520, 876 + size: 11, 22 + orig: 11, 22 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 520, 852 + size: 11, 22 + orig: 11, 22 + offset: 0, 0 + index: -1 +slider-vertical + rotate: false + xy: 306, 413 + size: 4, 1 + orig: 4, 1 + offset: 0, 0 + index: -1 +splash_logo + rotate: false + xy: 253, 436 + size: 76, 72 + orig: 76, 72 + offset: 0, 0 + index: -1 +splitpane + rotate: false + xy: 235, 384 + size: 4, 1 + orig: 4, 1 + offset: 0, 0 + index: -1 +splitpane-over + rotate: false + xy: 312, 378 + size: 4, 1 + orig: 4, 1 + offset: 0, 0 + index: -1 +splitpane-vertical + rotate: false + xy: 584, 935 + size: 1, 4 + orig: 1, 4 + offset: 0, 0 + index: -1 +splitpane-vertical-over + rotate: false + xy: 587, 936 + size: 1, 4 + orig: 1, 4 + offset: 0, 0 + index: -1 +static-text + rotate: false + xy: 520, 542 + size: 7, 21 + split: 3, 3, 0, 21 + orig: 7, 21 + offset: 0, 0 + index: -1 +sub-menu + rotate: false + xy: 851, 974 + size: 6, 7 + orig: 6, 7 + offset: 0, 0 + index: -1 +sub-menu-bg + rotate: false + xy: 681, 991 + size: 14, 31 + split: 2, 2, 0, 31 + orig: 14, 31 + offset: 0, 0 + index: -1 +tab-active + rotate: false + xy: 520, 565 + size: 10, 21 + split: 4, 4, 3, 1 + orig: 10, 21 + offset: 0, 0 + index: -1 +tab-inactive + rotate: false + xy: 123, 354 + size: 8, 21 + split: 3, 3, 2, 1 + orig: 8, 21 + offset: 0, 0 + index: -1 +textfield-light + rotate: false + xy: 587, 942 + size: 14, 14 + split: 3, 3, 4, 3 + orig: 14, 14 + offset: 0, 0 + index: -1 +textfield-light-down + rotate: false + xy: 555, 941 + size: 14, 14 + split: 3, 3, 4, 3 + orig: 14, 14 + offset: 0, 0 + index: -1 +textfield-light-over + rotate: false + xy: 571, 941 + size: 14, 14 + split: 3, 3, 4, 3 + orig: 14, 14 + offset: 0, 0 + index: -1 +textfield-over + rotate: false + xy: 571, 941 + size: 14, 14 + split: 2, 2, 3, 2 + orig: 14, 14 + offset: 0, 0 + index: -1 +thumbnail + rotate: false + xy: 882, 978 + size: 4, 4 + split: 1, 2, 1, 2 + orig: 4, 4 + offset: 0, 0 + index: -1 +thumbnail-over + rotate: false + xy: 26, 269 + size: 4, 4 + split: 1, 2, 1, 2 + orig: 4, 4 + offset: 0, 0 + index: -1 +tint-border + rotate: false + xy: 2, 2 + size: 6, 6 + split: 2, 2, 2, 2 + orig: 6, 6 + offset: 0, 0 + index: -1 +tool-align + rotate: false + xy: 331, 462 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-conuslight + rotate: false + xy: 539, 957 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-label + rotate: false + xy: 2, 250 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-mesh + rotate: false + xy: 51, 352 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-move + rotate: false + xy: 697, 999 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-sphericlight + rotate: false + xy: 331, 437 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-transform + rotate: false + xy: 563, 957 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +toolbar-bg + rotate: false + xy: 51, 320 + size: 8, 4 + split: 1, 2, 1, 1 + orig: 8, 4 + offset: 0, 0 + index: -1 +toolbar-down + rotate: false + xy: 753, 972 + size: 8, 9 + split: 2, 2, 3, 3 + orig: 8, 9 + offset: 0, 0 + index: -1 +toolbar-normal + rotate: false + xy: 763, 972 + size: 8, 9 + split: 2, 2, 3, 3 + orig: 8, 9 + offset: 0, 0 + index: -1 +toolbar-over + rotate: false + xy: 773, 972 + size: 8, 9 + split: 2, 2, 3, 3 + orig: 8, 9 + offset: 0, 0 + index: -1 +tooltip-bg + rotate: false + xy: 26, 264 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +touchpad-knob + rotate: false + xy: 282, 412 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +tree-minus + rotate: false + xy: 813, 973 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +tree-over + rotate: false + xy: 66, 323 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +tree-plus + rotate: false + xy: 823, 973 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +vis-blue + rotate: false + xy: 666, 985 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +vis-check + rotate: false + xy: 603, 942 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-check-down + rotate: false + xy: 619, 942 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-check-over + rotate: false + xy: 536, 925 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-check-tick + rotate: false + xy: 552, 925 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-check-tick-disabled + rotate: false + xy: 568, 925 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-radio + rotate: false + xy: 635, 942 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-radio-down + rotate: false + xy: 255, 378 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-radio-over + rotate: false + xy: 271, 377 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-radio-tick + rotate: false + xy: 287, 377 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-radio-tick-disabled + rotate: false + xy: 312, 381 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +vis-red + rotate: false + xy: 648, 968 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +white + rotate: false + xy: 32, 270 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +window + rotate: false + xy: 2, 300 + size: 31, 75 + split: 6, 6, 32, 7 + orig: 31, 75 + offset: 0, 0 + index: -1 +window-bg + rotate: false + xy: 653, 973 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +window-noborder + rotate: false + xy: 652, 988 + size: 27, 34 + split: 5, 4, 26, 3 + orig: 27, 34 + offset: 0, 0 + index: -1 diff --git a/assets/style/uiskin.json b/assets/style/uiskin.json new file mode 100644 index 00000000..5785b796 --- /dev/null +++ b/assets/style/uiskin.json @@ -0,0 +1,777 @@ +{ + com.badlogic.gdx.graphics.g2d.BitmapFont: { + default-font: { + file: myriad-medium.fnt + }, + small-font: { + file: myriad-medium-small.fnt + }, + big-font: { + file: myriad-medium-big.fnt + }, + default-font-normal: { + file: myriad-medium.fnt + }, + small-font-normal: { + file: myriad-medium-small.fnt + }, + big-font-normal: { + file: myriad-medium-big.fnt + } + }, + com.badlogic.gdx.graphics.Color: { + hyperlap2d-menuitem-grey: { + a: 1, + b: 0.87, + g: 0.87, + r: 0.87 + }, + hyperlap2d-menuitem-disabled-grey: { + a: 1, + b: 0.45, + g: 0.45, + r: 0.45 + }, + hyperlap2d-menuitem-shortcut-grey: { + a: 1, + b: 0.8, + g: 0.75, + r: 0.72 + }, + hyperlap2d-button-text-black: { + a: 0.9, + b: 0.1, + g: 0.1, + r: 0.1 + }, + green: { + a: 1, + b: 0, + g: 1, + r: 0 + }, + white: { + a: 1, + b: 1, + g: 1, + r: 1 + }, + red: { + a: 1, + b: 0, + g: 0, + r: 1 + }, + black: { + a: 1, + b: 0, + g: 0, + r: 0 + }, + grey: { + a: 1, + b: 0.32, + g: 0.32, + r: 0.32 + }, + menuitem-grey: { + a: 1, + b: 0.65, + g: 0.65, + r: 0.65 + }, + vis-blue: { + a: 1, + b: 0.886, + g: 0.631, + r: 0.105 + }, + link-label: {a: 1, b: 0.886, g: 0.631, r: 0.105 } + }, + com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { + dialogDim: { + name: white, + color: { + r: 0, + g: 0, + b: 0, + a: 0.45 + } + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { + default: { + down: button-down, + up: button + }, + toggle: { + down: button-down, + checked: button-down, + up: button + } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { + default: { + down: button-down, + up: button, + over: button-over, + disabled: button, + font: default-font, + fontColor: hyperlap2d-button-text-black, + disabledFontColor: grey + }, + toggle: { + down: button-down, + up: button, + checked: button-down, + over: button-over, + font: default-font, + fontColor: white + } + }, + com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { + default: { + vScroll: scroll, + vScrollKnob: scroll-knob-vertical, + hScroll: scroll-horizontal, + hScrollKnob: scroll-knob-horizontal, + background: border + }, + list: { + vScroll: scroll, + vScrollKnob: scroll-knob-vertical, + hScroll: scroll-horizontal, + hScrollKnob: scroll-knob-horizontal + } + }, + com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { + default: { + font: default-font, + fontColor: white, + background: default-select, + scrollStyle: default, + listStyle: { + font: default-font, + selection: list-selection, + background: select-box-list-bg + } + }, + white: { + font: default-font-normal, + fontColor: black, + background: default-select-white, + scrollStyle: default, + listStyle: { + font: default-font-normal, + fontColorSelected: black, + fontColorUnselected: black, + selection: list-selection-white, + background: select-box-list-bg-white + } + } + }, + com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { + default-vertical: { + handle: splitpane-vertical + }, + default-horizontal: { + handle: splitpane + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { + default: { + titleFont: big-font, + background: window, + titleFontColor: white + }, + noborder: { + titleFont: big-font, + background: window-noborder, + titleFontColor: white + }, + dialog: { + titleFont: big-font, + background: window, + titleFontColor: white, + stageBackground: dialogDim + }, + box: { + titleFont: big-font, + background: box, + titleFontColor: white + } + }, + com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { + default-horizontal: { + background: progressbar, + knob: progressbar-filled, + knobBefore: progressbar-filled + }, + default-vertical: { + background: progressbar-vertical, + knob: progressbar-filled-vertical, + knobBefore: progressbar-filled-vertical + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { + background: slider, + knob: slider-knob, + disabledKnob: slider-knob-disabled + }, + default-vertical: { + background: slider-vertical, + knob: slider-knob, + disabledKnob: slider-knob-disabled + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { + default: { + font: default-font, + fontColor: white + }, + small: { + font: small-font, + fontColor: white + }, + menuitem-shortcut: { + font: small-font, + fontColor: hyperlap2d-menuitem-shortcut-grey + } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { + default: { + selection: selection, + background: textfield, + font: default-font, + fontColor: white, + cursor: cursor + } + }, + com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { + default: { + checkboxOn: check-on, + checkboxOff: check-off, + font: default-font, + fontColor: white, + disabledFontColor: grey + }, + radio: { + checkboxOn: radio-on, + checkboxOff: radio-off, + font: default-font, + fontColor: white, + disabledFontColor: grey + } + }, + com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { + default: { + fontColorUnselected: white, + selection: list-selection, + fontColorSelected: white, + font: default-font + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { + default: { + background: default-pane, + knob: touchpad-knob + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { + default: { + minus: tree-minus, + plus: tree-plus, + selection: tree-selection, + over: tree-over + } + }, + com.kotcrab.vis.ui.widget.VisTextField$VisTextFieldStyle: { + default: { + selection: selection, + background: textfield, + backgroundOver: textfield-over, + focusBorder: border, + errorBorder: border-error, + font: default-font, + fontColor: white, + disabledFontColor: grey, + cursor: cursor + }, + light: { + selection: selection, + background: textfield-light, + backgroundOver: textfield-light-over, + focusBorder: border, + errorBorder: border-error, + font: default-font, + fontColor: white, + disabledFontColor: grey, + cursor: cursor + }, + transparent: { + selection: default-select-selection, + focusBorder: border, + errorBorder: border-error, + font: default-font, + fontColor: white, + cursor: cursor + } + }, + com.kotcrab.vis.ui.widget.VisImageTextButton$VisImageTextButtonStyle: { + hierarchy-item-root: { + imageUp: icon-root, + imageDown: icon-root, + imageOver: icon-root, + font: big-font-normal + }, + hierarchy-item: { + imageUp: icon-composite2, + imageDown: icon-composite2, + imageOver: icon-composite2, + font: big-font-normal + } + }, + com.kotcrab.vis.ui.widget.VisTextButton$VisTextButtonStyle: { + default: { + down: button-down, + up: button, + over: button-over, + disabled: button, + font: big-font-normal, + fontColor: hyperlap2d-button-text-black, + disabledFontColor: grey + }, + dark: { + down: button-dark-down, + up: button-dark, + over: button-dark-over, + disabled: button-dark, + font: big-font, + fontColor: hyperlap2d-button-text-black, + disabledFontColor: grey + }, + orange: { + down: button-orange-down, + up: button-orange, + over: button-orange-over, + disabled: button-orange, + font: big-font-normal, + fontColor: hyperlap2d-button-text-black, + disabledFontColor: grey + }, + tagBtn: { + down: toolbar-over, + up: toolbar-over, + fontColor: white, + font: default-font + }, + toggle: { + down: button-down, + up: button, + checked: button-down, + over: button-over, + font: default-font, + fontColor: white, + focusBorder: border + }, + menu-bar: { + down: menu-bg-down, + up: menu-bg-up, + over: menu-bg-over, + font: big-font, + fontColor: hyperlap2d-menuitem-grey + } + }, + games.rednblack.editor.view.ui.box.resourcespanel.draggable.list.ListItemResource$ListItemResourceStyle: { + library: { + up: button-resource, + over: button-resource-over, + down: button-resource-over, + resourceUp: icon-library, + resourceDown: icon-library-over, + resourceOver: icon-library-over, + labelStyle: { + font: small-font, + fontColor: white + } + }, + particle: { + up: button-resource, + over: button-resource-over, + down: button-resource-over, + resourceUp: icon-particle, + resourceDown: icon-particle-over, + resourceOver: icon-particle-over, + labelStyle: { + font: small-font, + fontColor: white + } + } + }, + com.kotcrab.vis.ui.widget.VisImageButton$VisImageButtonStyle: { + default: { + down: button-down, + up: button, + over: button-over, + disabled: button, + focusBorder: border + }, + dark: { + down: button-dark-down, + up: button-dark, + over: button-dark-over, + disabled: button-dark + }, + toggle: { + down: button-down, + up: button, + checked: button-down, + over: button-over, + focusBorder: border + }, + close-window: { + down: button-down, + up: button, + over: button-over, + imageUp: icon-close + }, + close-panel: { + imageDown: icon-close-orange-down, + imageOver: icon-close-orange-over, + imageUp: icon-close-orange + }, + trash-button: { + imageDown: icon-trash-disabled, + imageOver: icon-trash-over, + imageUp: icon-trash + }, + close: { + down: button-red, + up: button, + over: button-over, + imageUp: icon-close + }, + close-active-tab: { + down: button-red, + up: button, + over: button-over, + imageUp: icon-close + }, + close-box: { + imageUp: box-colapse-on, + imageChecked: box-colapse-off + }, + tool-SELECTION_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-move + }, + tool-TRANSFORM_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-transform + }, + tool-TEXT_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-label + }, + tool-POINT_LIGHT_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-sphericlight + }, + tool-CONE_LIGHT_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-conuslight + }, + tool-MESH_TOOL: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + checked: toolbar-down, + imageUp: tool-mesh + }, + align-center-horisontal: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-center-horisontal + }, + align-center-vertical: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-center-vertical + }, + align-simple-down: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-simple-down + }, + align-simple-up: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-simple-up + }, + align-simple-left: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-simple-left + }, + align-simple-right: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-simple-right + }, + align-edge-down: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-edge-down + }, + align-edge-right: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-edge-right + }, + align-edge-up: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-edge-up + }, + align-edge-left: { + down: toolbar-down, + up: toolbar-normal, + over: toolbar-over, + imageUp: align-edge-left + }, + expandable-properties-button: { + imageUp: expandable-properties-collapse-on, + imageChecked: expandable-properties-collapse-off + }, + layer-lock: { + imageUp: icon-lock-inactive, + imageChecked: icon-lock-active + }, + layer-visible: { + imageUp: icon-visible-on, + imageChecked: icon-visible-off + }, + new-layer-button: { + imageDown: icon-new-layer, + imageOver: icon-new-layer, + imageUp: icon-new-layer + }, + library-link-button: { + imageUp: icon-unlink-inactive, + imageOver: icon-link-inactive, + imageChecked: icon-link-active, + imageCheckedOver: icon-unlink-active + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { + background: slider, + knob: slider-knob, + disabledKnob: slider-knob-disabled, + knobOver: slider-knob-over, + knobDown: slider-knob-down + }, + default-vertical: { + background: slider-vertical, + knob: slider-knob, + disabledKnob: slider-knob-disabled, + knobOver: slider-knob-over, + knobDown: slider-knob-down + } + }, + com.kotcrab.vis.ui.widget.VisCheckBox$VisCheckBoxStyle: { + default: { + checkBackground: vis-check, + checkBackgroundOver: vis-check-over, + checkBackgroundDown: vis-check-down, + tick: vis-check-tick, + tickDisabled: vis-check-tick-disabled, + focusBorder: border, + errorBorder: border-error, + font: default-font, + fontColor: white, + disabledFontColor: grey + }, + radio: { + checkBackground: vis-radio, + checkBackgroundOver: vis-radio-over, + checkBackgroundDown: vis-radio-down, + tick: vis-radio-tick, + tickDisabled: vis-radio-tick-disabled, + focusBorder: border-circle, + errorBorder: border-circle-error, + font: default-font, + fontColor: white, + disabledFontColor: grey + } +}, + com.kotcrab.vis.ui.widget.PopupMenu$PopupMenuStyle: { + default: { + background: popup-menu, + border: border + }, + noborder: { + background: button + } + }, + com.kotcrab.vis.ui.widget.Separator$SeparatorStyle: { + default: { + background: separator, + thickness: 2 + }, + vertical: { + background: separator-vertical, + thickness: 2, + }, + menu: { + background: separator-menu, + thickness: 2 + } + }, + com.kotcrab.vis.ui.widget.VisSplitPane$VisSplitPaneStyle: { + default-vertical: { + handle: splitpane-vertical, + handleOver: splitpane-vertical-over + }, + default-horizontal: { + handle: splitpane, + handleOver: splitpane-over + } + }, + com.kotcrab.vis.ui.widget.MenuItem$MenuItemStyle: { + default: { + down: popup-menu-down, + up: popup-menu, + over: popup-menu-over, + disabled: popup-menu, + font: default-font, + fontColor: hyperlap2d-menuitem-grey, + disabledFontColor: hyperlap2d-menuitem-disabled-grey, + subMenu: sub-menu + } + }, + com.kotcrab.vis.ui.Sizes: { + default: {scaleFactor: 1, spacingBottom: 8, spacingRight: 6, buttonBarSpacing: 10, menuItemIconSize: 22, borderSize: 1, spinnerButtonHeight: 12, spinnerFieldSize: 40, fileChooserViewModeBigIconsSize: 200, fileChooserViewModeMediumIconsSize: 128, fileChooserViewModeSmallIconsSize: 64, fileChooserViewModeListWidthSize: 155 }, + x2: {scaleFactor: 2, menuItemIconSize: 44, spinnerButtonHeight: 24, spinnerFieldSize: 80, spacingBottom: 8, spacingRight: 6, buttonBarSpacing: 10, borderSize: 1, fileChooserViewModeBigIconsSize: 200, fileChooserViewModeMediumIconsSize: 128, fileChooserViewModeSmallIconsSize: 64, fileChooserViewModeListWidthSize: 155 } +}, + com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { + default: + { + label: {font: default-font}, + background: tooltip-bg + } + }, + com.kotcrab.vis.ui.widget.Tooltip$TooltipStyle: { + default: + { + background: tooltip-bg + } + }, +// com.kotcrab.vis.ui.widget.file.FileChooserStyle: { +// default: { +// highlight: list-selection, +// // popupMenuStyleName: default, +// iconArrowLeft: icon-arrow-left, +// iconArrowRight: icon-arrow-right, +// iconFolder: icon-folder, +// iconFolderParent: icon-folder, +// iconFolderNew: icon-folder, +// iconDrive: icon-drive, +// iconFolderStar: icon-folder, +// iconTrash: icon-trash, +// iconFileText: icon-label, +// iconFileImage: icon-image, +// iconFilePdf: icon-label, +// iconFileAudio: icon-label +// } +// }, + com.kotcrab.vis.ui.widget.file.FileChooserStyle: { + default: {highlight: list-selection, popupMenuStyle: "default", iconArrowLeft: icon-arrow-left, iconArrowRight: icon-arrow-right, iconFolder: icon-folder, iconFolderParent: icon-folder-parent, iconFolderNew: icon-folder-new, iconDrive: icon-drive, iconFolderStar: icon-folder-star, iconTrash: icon-trash, iconStar: icon-star, iconStarOutline: icon-star-outline, iconRefresh: icon-refresh, iconFileText: icon-file-text, iconFileImage: icon-file-image, iconFilePdf: icon-file-pdf, iconFileAudio: icon-file-audio, iconListSettings: icon-list-settings, contextMenuSelectedItem: vis-radio-tick, expandDropdown: select-down } +}, + com.kotcrab.vis.ui.widget.color.ColorPickerStyle: { + default: {pickerStyle: {barSelector: color-picker-bar-selector, cross: color-picker-cross, iconArrowRight: icon-arrow-right, verticalSelector: color-picker-selector-vertical, horizontalSelector: color-picker-selector-horizontal}, titleFont: default-font, background: window, titleFontColor: white } +}, +com.kotcrab.vis.ui.widget.LinkLabel$LinkLabelStyle: { + default: {fontColor: link-label, underline: white, font: default-font } +}, +// com.kotcrab.vis.ui.widget.tabbedpane.TabbedPane$TabbedPaneStyle: { +// default: { +// //background: menu-bg, +// //bottomBar: list-selection, +// buttonStyle: { +// up: tab-inactive, +// checked: tab-active, +// font: default-font, +// fontColor: white +// } +// } +// }, + com.kotcrab.vis.ui.widget.tabbedpane.TabbedPane$TabbedPaneStyle: { + default: { + draggable: false, + background: menu-bg, + separatorBar: list-selection, + vertical: false, + buttonStyle: { + down: tab-active, + up: tab-inactive, + checked: tab-active, + over: tab-inactive, + disabled: tab-inactive, + font: default-font, + fontColor: white, + disabledFontColor: grey} }, + vertical: { + vertical: true, + background: menu-bg, + separatorBar: list-selection, + buttonStyle: { + down: button-down, + up: button, + checked: button-down, + over: button-over, + disabled: button, + font: default-font, + fontColor: white, + disabledFontColor: grey + } + } +}, + + com.kotcrab.vis.ui.widget.ListViewStyle: { + default: {scrollPaneStyle: list } +}, + com.kotcrab.vis.ui.widget.BusyBar$BusyBarStyle: { + default: {height: 2, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 }, + slim: {height: 1, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 }, + thick: {height: 6, segment: vis-blue, segmentWidth: 100, segmentOverflow: 50 } +}, + com.kotcrab.vis.ui.widget.spinner.Spinner$SpinnerStyle: { + default: {down: select-down, up: select-up } +} +} diff --git a/assets/style/uiskin.png b/assets/style/uiskin.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fcdee0193315128bbfee2c0682b15aab8d887d GIT binary patch literal 142266 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 z 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%0D`xM{f;Mn_Mw)K1> zWw}=(1Ky&g8?n;`O{06KY_5#F%nlS0yi^=1P0mDYs_(+ul7DUssrx0>gx*>G8AWHT ziaKG9l?=AjBx_9yC{=+;%@5W(i z-7>jg>4`Yiw)d}ZY5Q{df5R>%q8zei8-}W(47M8(;eCNPw!4b1BD@8_m}2YeV$NT@ z3}j5D(+5pr06Vfwv#xoST(iyBR<(vzxGP;o1OT~+07$!_IrT@X?%d;Kx*{B zB#>;5UK&?UR%}wo=xypI5&h1Lt%szZRae`d)#iRo<|!wtNGXN8;2R|g&CTO6W9Olt z5u}I21>dg`Z9k;9BkMrcU?1bD*IpURiN<&GGa@@~q$l(n(j$bt#dc)j%A zJ{gKP9hNN;`;wi^LjSgxBt$R`!Q>sAa(&>sf?$j`4Ftm+1qjxChym0-C9`EwTVwSZJj3EitT z=_4A~i?PR&v&YCg;-+4N!MyCz>1y#vIQSw*@Z6IZ6fu5@CLfv zwGz4NkDVS9i~WEkZE#Z2qOi`4sPk9F3!mtH;zzy^XNh=!)pqzk zo`R5H#N1COV50z@UkEys#=yueLGpafHxi+?*KL_);z9E5843?-O5I7<9?=Y&#=nQo zphxRIiKXNFNc284EcDb8d9g`z?5KzUsHfa}t)=R~D7vhM&lSU2pYQMDMwz{pp-e@6 zo~iswd2d8+VznvNm^Dd1q_U1P-eRRY=7v$E;{z50*Kgju#y@FkI0HaN%6FsPe&&JT zgQy!EQo?8|><4@CD?9IxEx2NdN7y#z zF1Jl02|h&z=N6Ro3jt%qpR&TWc%0z27CkcQ`ufAiqX2wkw00>JcYTndO3~3dnbtP5 zRpu_wvHjINzgOJs zUvV`X))fYfl#kkSL<(#e0Zn!n2aDh5+0PPw9=w)oV#ZUZ|0$qQUFtWAOCTrgkM}>2 z&wN#8@yWvMFp$a`YXr)4r+J{8D&mHI@^FTpTBv62zb+Pv=$wYe1kj6FPvyhzrP*fH zenz-F68tD`{W>e2VTY$b%ItCd%7*85nV{$9iL8RRDg#=$Tqm{U6sGO}iIm;{@2qS{h;}$BYNz>2q6(OxVda>sIbkdBomBRc=?3v&caty5%y7xcOi$63iX8Wr<%9%y*Kd; z(#GA1^4uqU`y4|j)KqJlDzhyH%a#4Ng_rQu)A?Uf8+O(M;41asYWFg(+1hY<_Pq<$ zl|Y(le>osr$EA5>D?hO(VY=5NM^|Afjg(+w5&bl?92BC~QEgd36HI=Vmg~ILB@`ps z6(xaL(Ot1H#{_@16`Nw+iI8ZSM$!t;GhsM?3aM8wbPmJvJN@Hqzp;aXZi2oG()xo@ zP3`}mk=qP>O67++F#$?OmVO1cu2;Pkgn>AT?0%qEVevyMFwjH0)18H*d3h|~c;;XQ z3@lDjv`s6HG0TF0?q~Z;oH*gV+OhR;xEv;w~ElnmMK(^;s+9_6DWb ze{6|vUSSqJyb9N$FJvgN1)^ao6#Rk4tH*KBiKq` zSq4(dEWgO`pS^OHCERyrKR*`M<1G*eHPCuRhUFTVHYJFDEwknHKUCyxexlZKBX_py zFHk_>O>Jp>MR-%Ca<&LS-b)Sjg93L+)7xVA@kF=QmGFAIMMCEh7yQ2y>Qi69bBn3( z#S?rg8~<9nZ01Fmt%N0jyUxvkG!KTZt`ss1=MIiMoi9CqsGl+S3tBcoTtT5I8tL-D zcs`G=(Yx^Z1=i-~xWZ=5O7r;BGiiGPrh5K)@ha>C@-=7UO0`qOg=yFLG-Qx4Z7+R8 zwtn8+HYvYkGcjr3C!T!xds^ zDH$HM6euvVS93rM=1)Pe0<%j^Od!_!8MuObjmts46G#$+J-w%V4JAeT zDv!$YFdhL$xsjR}WF$qGi_UDtg)XN82a8i*rljCUW_SsjTKJ?hVI)YuuPfZgiv_;!Qcjq6PlTX_B69Wp#;EOqJBM#|MLpRe2Vq&H zHFN(E`gkj{QWWXWq~=-b#~>eN1W0p5ozo(v&QgXgn+P$AQJgF;Im6wM=^9eeZ)6)9 z(el+G6xAb^zNu9kOo{$A)SJzS31{iH_=-&aMAkcH&(te)748XI&lqNzKNzFkUb86x z0|-!q(;Na8WB}(LO?@+Doea;N} zm7wJ#;Cp+h*yM;=0fE>Y}@I_gtuH*NM)ASLKP;0G>N=`NL*eNZ@4~xkUo)`0K>l z!<&>pk6gb-SCXTgaH)9tkh)E3lYtYY_N`B08le=Q^WGKDMr&)pXR?mGm9(^IgmF@& zl6n2O4}c7hU7O_MWl)Z<*H8`$fw^r#z~P`#S)e6hiKwr*2g zNwo%b+G6Qj+rOm^2p74Jo>jwV{wUf0RpWlflU&mbBaRgT*5Mm-Ipf~$HmOs_sgg`y z`P{~M4Tw>D&3$-RP)bYkU7U_(9D@j3=}1cGNZelfv#jE0)d=@Y7g*|> zr51B9yyfzA_xLzWYx0NHiXh0v-69yL`31t+$&cOH%48m4xcBLDGE^w{B`V$7x9;i|yIp|9ln z?+rHMwJlZ(I&@C1?Ohp;Sz~N*M9_h_<17(TE9ojr?5gCqU#k_Tcwxot413h^b*%(R zd%ro?=e3NQeLJZspP8hThvV;P$e3Y&Qa}F;cYMM3_Mp$iTO^2?y5Hw?;*hz->IjSd znQ`Y2H%EzQqixB+W7y%}^St^k@o`oQ_mJ_gqaf93ROol%f@FK#4SW3;L?k_~6`?Xp zbe&}`MutUuawU;XUU$YGhY?qOlkVds3xv_munB2Sg_FH12)>~fdP$2+tUjBHlf_@N zQ2ik+0*pc~izscEq1%UG<>Pcl;OL0S205FZ?%v*{Zqy6Fd)^uoA3=gNilw^|uv8P* ziqzw(M1xA@54Vh{a1}!-e)&7@9p%YAFKP#f_Al)B!rsRp+f4H=P3fQN{IP|vC?-H3 zpp0)@KWg0XC{MS}4jGf~4pZ=88^VYT+h>xO=ly z-KfUIyR*-SBiO-AVgT)KYBTHaDju_<6}uDTi55lk zF@j$wbgah;Lrv@BR#D@RO{je<3%Z~TecIk_Q3n)j8nve5{4O+iM~6-88V9CUX+Bt zfN^aR_O2Z~)Ac$1u_cnsb$SI4ky;<9O10Zf?<7a+jYBHlFHDA)Ze9demSOZ5H=i632umBMOGi0}hwT~DeuI^-l?@uD3VvJZ zOb_#`NfcslI3^pSNlI2O*elIO*W_dAcllo{f4D%cFoLkQB5@8QId-|d*%YCEs}%p4 zXPpLsE}w~2-_o^;{y?wjJXS%R>GGqp$_ZdroKO%_9M@GO?nVIJ>|jdiRlSW8{B1d? zff-djQ{Uzm#xd>|o?IDmZ^fE}@52F%0$fK5nXqQ9%1o16MZ`&Vt}*wEUwIwDSs?c+ zWd4>AZ@0?6viS*R-)MAfGu`N7`t|A)-#Q1LBKHWR30Thpw8Ap7(yi~bk!feO+?K3W z1A*~(Cz-^z=!rniuH=80yr=sgn@9nph>821l?T0UR1#4u_7=Xh!lR}1^S7~FC?v&c zDHJ3x92J}>WbkPCU7~G+6yAJMCs|!bWU)?el1;KIvzqwF`D1j7(sSGe$zIRi;#fBJ zka3H9te5!GD>V#a6Qu7{hwGA+jQt!nRo1U3HEJdEa7)It8@Fa7VvhyMQ>~cLu2^&o z+s6G!(m%C)&%2s9U1~ben2ERG>0?mHJgj>%ZXc>>_Kz< z>LHcoz7bKUC61CpBPQ_SZ0!m(k6}YEW|swBk!2%}sfa@yI28f0)mw?nVZLUX68M`3 zst5p7ob>jn8^F;Ek8oh7&zwE8gr0 zov6vAJx2`GcvFQ-<4J*F>VG8Y0qt^+==WD~bA7}43Z~B25*?(<9Bh4z620f^W+oIm zje-S!KnW`{T#S1b11^N?YRJBs974*pHCiG-xGPP4Qx4_B=x4WI-V-7ZDz4ttW%4d? zk&X0k&_CcUR4@Bk`^jbS!U5}cHuPFG3ifBzR|Ktf@+;u%mbcdKXeZa3U9z63KU`LY zrS{j%DE>So8L<4&k9pF$Y$lmE+iSos19KsO6Oi3D;VLIvOImZ+|B#=^Q}uDxLKrh` z-Jls7`sDtGp8a+I!npJ=paGmqgvo<3RNnL8FR*N;cXa-Jp{3l^Diey*M=qr>@4Sk* zEn&pa2yI0W@DJCSuUg@_-n;)s_(q(`7k52VvjLIJ8Pu*@WbFL?nv}zxQmG@DHSH7y zfv(GigPS<{3hW8viCw1#NlDzvLVHC5!ze4P5u;Y@ks~mCiwUB$7HIr8pnkyA5Se zXpdslXMcTXQm^1wPED@-YyE|X50`?C$H)FwTu0sKfC?)n(X-%ja!{%1VPoZ^&>J7t zUm6mzu~SnCPn2MW>5~JKitg>aEVZJ%kH>)qGS}9!s-u2bh*mZC`Fq#2Cj4R@SPr7^ z3f<@w-h7Y89C^C(nH&u;PT7t7M}j7{Lr;U#y3XJfD>=G>#^iC5&l7(IKetB}6lH~q zpH+9xX8-ZfU&(|4#wY6d``7kLC$p3ep`D-q!<ym!$c zuc2B-u8O_3*Z`%*NyqIENOrqSB<>W!h;pue12GJoQs#kM`IY?D5v*VMiXD?s$w|d+ zz#CPq8z&!5osa*3UQ)>$V3hrUYL6(eTHb^NP9}sNnda9GXLnGeL@R1S1f9nU2;j7^ z!gg=gDy{ek{q9Aj96?nPaIqbLV0TrO{3heTFU)>1pYP6**iq=5Q3jB4mK^nFr)N)# zs3mZ`X|jVE&Pk}ErW^6AiME!uUj+E0J@Q(@D`xI5J=UaC#B<$Ts_W?`Tu;d`EY z_oMS}65^9$h0dP=6o9@Xj=+Qp_hQ-r|XC@ zOL}YIJ@=2JWSjev4x)pTUK&I#{27Z|x%aI#sTP9WfSXn!2U1e|;!}gavHKtGFR9@| zsmVv~186c4i7ewvKIFG1wwsib+P8z!LVlLL!+89c*kmZk_@{T1AbTVysqk6OOvr?F zd%jKB>c?-Cmd6;#Q_l5s-rUA(e~Fx;K=S#dGC9d}I~!dzjKCk~R$o4V%CBU8Db|qf zS*);N@@ixbo?4kH&l~2TwX~k`i?#a0rc3{xfXPCwGLB~5Z~3>LHiZLwce28-s2VeQ z4(H=EJy24dLygLd) zbh%sRm8d@m8~;M$ABN8Q20|z)4o?MO*;MTBquk!x?||4MnAlch*fy(rL2u}n!>>#e zCP>VGumQ%+2Y;%jM5D;E9H`{Rs2C_#jK*XFw`}W5sk=w>aYWk7571pAbcK9&bhyv- zVjM!kxnR^--!;-#fAY;XQGjtoGMpr0+*tW5u9~umPbHL`U8*d0PjW+|G9+hiJ14OM zy|OR}C)I%8$S1gmdJB(D-;Vl@mW$um=n#rb&@gT1RrcdUN3bAf9tqtj^lJo4!86unjonb{FKF7Yyei&I$wKbhEwI?W4dHmIq80`j$}A9 zk(Jg*<|!Yn+!RQDycqvIX_GD);g-Y^fbGxOfZ=JXN1tE1xXe53nWl;MXVK)=Kf{~I zRu8S-4Cm-}8Vr4lZFBIVL&H{<1C`hYzzeP{4V;#K#tnDAVIPRsXu2qclZh4UM>-Bfdp(_@>(rQs$9VPnsGllj|~2FP+@Su6R`bITJ=jA}%` zQM6LpXVQ_7a1oo-g{mWS{M8_d>;)bW%7*r4I)VH@9*3w^=`>s+iZ*!=(l?h&_R_Vl z7BhXS6Eo%3S$syU9E=wl$V9nB>N{IqT@Wa`2)&DLB4H0=Vh=TEsB(CEgl93zM?O zqyTe$$iX>})`FRN%I`EF7y0%JfNP(5juK(Kh4jn57LA~cv?iE_TY@gK++ zKDrCRYeE0I?ZF7F-48Irxs@3(elffwOCpOm_dowvDGqAA-}%#LYa-}?E90Hkj~%6b zxj+ov_(zA~{0qzRix`S)^doO{H$*=@RgLU75rDx)FJe9gw~Cf}9+*ItXu7yI#UY)9 zrzH6)p=RY7t?V@;n9%X{Q21BqB@`oSEiQI5>QAV@GKSYVwSqTht|_Qv7LW0#jIh&- zb*aaqf1dwoEjc37&()yZh)>;E0?Cwd`dPABj<_S2LA4cIsl3RQ%H(Rq$fVQG>=@-# zQGjDnIncy)PKkSz1|B>x={lc0l8p8)wMiie&ZIi9Qd*G(xZHU$Lf$RmYp?E@Ed@x% zo>L@0Esxy({YBOnPG4#Bwo^|9r5opV{mIAj+)ZJD?cu`1VDhzX>fs(^txR?;@>JlT zJ^2K151R>^wp`;?^rIF2YJhXgt_^divpKAT16)>6T7-*$!`E6C&1*(+$k-#w9{q?O z>+8i*MnJFa+a{HP?6c+U6RK|@u7;eOio(FA3lnuZ$Zbk@Tli-8kN6GBkFn=9Q9L;; z_>A|Dwe%8*0YNH^K@E^Syyb$)ALF|e=d(?nVOPU!ARV}j~#`{A~ z=*M{zeV}IO^Bah4Bqvd;cm5(?Z19T_jA9ORr(w7%+x_j%^?xw9B;NnfAXjOOR_faD zkKC*z!bpKppjc#@<8XVdi5Kb49rV+B@&uA9_LBMEkHmLfTBoG+6ybczHCL2!N!zxb zo{U8|tM)WfdYJQa8f;U7~VTEyxca}LDP!&29nBPI^OpODRoJZHZg z$?L$+t=YQ4;WEmVsYCOOwwEyb?r<{%9rE5<3ju+E!NmsbeduhafTx=_WNxOeSzy!q zHhy*+Sxf=Q1WKZa|E$u#e98e#M$V0FDsN(-ma1Px?Y()`vOcQNBg;pi|H!bau<85u zOC!efYN<*ReYzoQBXxBZ5h~YM&#Wpc$-OL_IX=ZdGxma0;44~WiZ_Qt*3fQ*o&SV= z{3!c8m4;!g=IVIxO;33FYGZKz>Vw^gcO0{SE)ZPeCs_1rz8sQZYZTXF3bX1yZ89%5 zb)TrYLCvzCXnwfQgQXmg?~ZU|uWpL1NCyR1VWh%LpIM2MX0?j;ZdlT+4O@fz>#~Df z#UnYdW%9;ukQH1k%(g`M&aY^^4!g#AbtM3_^virVa7x&kK<+seANzn+VAq2Y??vpI zN^B?fVHlm>e9Yf>!|>A~5!rR2wRz}bV+_&W7P>^1yNf3(7CjJf92vTasz}I{l!h&a3$-%k4qE%}DI@rwbuFhr`H~LWq3t)x zF{Ou*6XXP$eH9qfnJD2|4mj%of}Xjbyi~E#-N?~zlHB0cG_2gAgg@p@3Nf|BFxQYv z#wNugW4=?8xAN!*@s0`It*jR&tRrF&F6)dbWOrrnGic9di{(T)&0*tzg>5n5C(iRh z4f0130wAASAf41x`FgZyayNE^mN@vj@MI{Z=PYIuwM6cFv0<}1W6*g@*}X>nuOycp zIb*Ei)TV|0Nn{#*uao~A^UTuP2GSjMOM}l3!73f3vf7<9Rd)YJAk`lioD|7(vGwir zI(GUj7jlq6kn|q8AYSqzR5$&FtlglQ?n(d?C_s9qmERGN!D|tO%B8>2l6Z(1h-#W&U?^;LP=D z8|vrCqa3dyPc`G9FQTR_(U9W!*hjzT3C65HR)h*7muTRGg(+^)<>BulPIhQj)m{qK zNM;q$M=RaMvfSh-9Xz<_aR}_*i!RSOK=dv(XHK67p#v%GN$>XjIDa>0U$94<1>*q&v)~w41F~Q>18DstL~!OI*a}U2DA#PIQY6 z9xL}?8n!ZrvfPCdo7ZiVZPs#buavq4{1Xt9BAtLKMLFKNJ8O_Sdi|Rz1;3x+riZg4 z_iwRHJ=eIdq@)Z|G{dTW#a>)_oud0czXzu@`R|_z!LKOi^NU|AbJSZWm&)3@jYX-3 z@QgHt4aB7>VKNqF(OV}`?xB1?<0I_?DSI2Vl- zXl3#OEPuh}{K~*+G2mr|w5r^e*STMYINwV>87W;h#jpru{e%k7onB02A6G#wi8@uQTf&p(nyq zk67)=m6o%lB@z=W9E#w;&j2n?syrL%D%!=yxvxq81asy)L{=cpolt4;9DEDsC>KW!)8zMEOsoLhZfXjmmz z0=+f|Ip@LO6^Z$gq<9TQF>+-Q>q0*{N=%e`52=ym%`nt#n>_e7I?Z0iF zo+#m}9~mgGvSF&Xxo>gH+liYl`)Q6(XFeldpkBF6WChNxVa=_-k$Z>68gMl&AgR<_ zyxom!MPC#`R-Qw9U=~G*2obB9ETOX&QqOSGH9rQx6iV!pyJv+ZNa{RVX|Gd{Wd(Tn zG++I{86+5;o(M%bYbrhVnCO?tskFiHS?nbE-&#q*0obC}RHdRkv54Rs1V|vCp+?)ymGD&6zK# z=^H}EReJ3lwqksi`e-Ur3K+H34x{85XDpBfd%&y;n`8-|>q@x5A3sVpjYp7a{u|@F_ z{R5@5SBaoYUfam))2F&=;v)4#Ul6aXIcDJcrm^Dd+4Y^hMt+NKRnHOLk{QfCRmCY{ z3R_Lec6*LY?sJ?aRxF@BUCO^;+{M5D3@H_CF}AZwQM|uAp(jr6O$)g|6FG#BD=RfT zcRYdzReIX4tMX;~J!qF0xYF@P3qu_i^ggER@+rZNOl>bQOhXWj(Mva>ym@&d|WX zWYgxS$~BIp`1Smu#&75UAQ-bg8I)|wC3?f$PW;`_k0SeK3ixg$q+)ehObnPpn>@hN z>6&KTwP*!ZW;cN^TY8^&J?H?55V*!8V;r4I zefW=w*zf}Bp1H4>ku`Fdt z4!5Ag#xNB{L|D|C+~>lI^-#NGSwdjrwa-JP)rkv>tnjn_sb57N5M7#->~MWrb&62& zWeA(y(Q$Z;2`3dtMT^}<@FfyQM!vJg6M6nch=mp`COl?nrAQFY_t7#nd%qQ;KyKxs zAgToSGrIpA;Br)K$^0+C{l~%${?akyz5^YnlJnQ^z(Aje?Q3JsUVPGlO*n2l5&hZA z>&PzHQeM^zAk%I^t zw9<{zi1{8Wl<;S%F0XN8`R`>$r6RK9vTGa0h7R6RH&x4fy2M!1s(tpFt_;h8G}ify z6a;5xa+F4Wev%<$KH3!140i*1MlP5sllAQMah_nf(^A(&}97XEEnio#JPxko&{8HeS5 zeq?=UKZ~Krbu(epi@cdRiE*dGcslOb^@w`n?!Am*i|7j}vQdey?o|ZaE@(32RA9@NR)14isb*p_{A1(ZgCGg8 zruI{KZI9k2;`rU=alS*ouj3I_>Ey@(Pl6ZNHE_DJee;sd+uaV=Z0@FP9Cr4xP50V7 z9E4uc`zDz=C|PE2x&zs4u~ETYiq4pRy_Y$4%4uHf8hdAW$WBfV_RgZ05~@2qwgpVI z#XwXJf{z1w&qVFeZMMmTCm4wqWDpr^bq57VoeBNT0&PnxE0=F*v2)#}@>*eogyJ>L zmSs5TL2J;1f=e7$SQ*|#C@g-M+c>cFuMzSErvu^YaN#J(ELp9y=@ag(@}pp+iz1D zv*?Ew#?i|c@-ZK2c%{NEUXT5BXK`SWDXGEA4SRcLa8UgoiRHxu#5!X4P7{u*_+%{dx1elT8&ElciYW(hWu$VI&8LCH$U zqX=h^*(TzQk|U7rtXB082V@m$y03++OL+>q#kawJUg*60tt+sQ#i?QS zG*V@&jDPH=W=Ij?IF#%A*{4<}6t}S}5_#P5*G3AQ<>Km#>e_7P=`gFwNve`MxBoan zQje*c?5M!ur)iq{S@d$(6;1DBrz8VSZ|)EsASS7C!NN)p`E(G8?4%*lC~uG$Z%mDF zl%-%q+lVYsvtGEp1_vVsp4~v5Ug$iEFm|conc=idn^)X0bdC=r!3L!zRH|=(<#=2{ z>wnn!O8f-vzT2jParB=v?#_*sQWcu$RJ+Pv`o#+@m=sevo}1 z$@J0jn`sMiY=&{!Zp7q27BIjC65-7QS3K%XL)#{`=p+UG^ZmhM&RA*F!-T>;jQa?% z?ADxXvOr9@0`)ToGfiRo`~}vS*sQR8A+ZL3K;x@yZmg3$XWZ>avL-cWaGzd_GhO<@ zRawSk#X2pibf#Tc-!5b5P-|VW*$3FB^v2XA93J;I4#Q91Fy6edy~up^+YRHbD^5{qpk| zIn#hc>94;N2QSS#oY+bJ=Fd4=CkZTa*QyRn|2`lo2)^e{O)jx$%loGsc(OT@;Ps)k zD#r1m=|QjLO45!i+A=m;M4C09lKYcdWNM(TbJKYEw>3HMcK1wyRvi47|CL3Yq@$ao zU3RGa3{3^aX50<_;kt1*x73$iia+QR58e1LH0YyN!$d+KJtXrZy+&xyoc4R{>*z&; z217#VGiHUcl1`Yed-~K#Grph29G!UJC-TT3lWaZ$OYuuL+6P+JSE@UuRo9V(-Js4G zc5!$|HDQ6Yw6qC({N|_U?0n{)p3`r6pg1aC8%OM!UEOvUcgLw3`w_6X(m#iL`K~w! zeH3S%HnSis`F-o4uXEUO{>=w+Zl|hx2mX&1q7 zhfaLIMSLvT>YsNeS8o59%#P`I)6sBI0n_T87&p$$Y%4Aw*`Fdoy=zV5{6;$#`fG(e zy-!yBXL6)Vd&t=~(+QTiA~x*>W<4vh-eQE4KQS|^Zp*3drFB(RCzm7DmfbQ>{!HeE zRyG>fSMu=m7mF9bZ={l)a31W^^qY9Xwq@M2yZbi1jPGU5a7WR7nUmgctm>i$dz(c= zyj}WIvnJOa*_Mx1Z?Sk!TGcd12FKoxsN%AHV_Pc$OOn@Y1)o!VL8_6=M@7C1dwE{? zDFNpzvcA9aY5n_a{rU2JLl-0tBqlae+ck71;lq0oB#JJ}tT8({Iju;Clj5Fl+j>3G zW#Yg<@bgJGWyV1P>|b_Wzl+6$)jQv1=Zjqzf1H&&GOKwIbA)Y?-%A^KDyGW`!(D3E zf(lQFa(^fkwGbv$@pT>TNgdnw?SdNWR*-+4`g4g7^&%?Kd4gW-D60Q)6-QCNawS12 ztq0>Z%+5EAa@GBAo6>3y8)n(9A!LK$CQU7PfESgvE>0!LNdAH~lr(atqoyqkA?}IC z%ZDv+i-%WL$ST$m$Ib+|3voY8Px?E~?Ze2#6j8HtN7jLh-<4$d!#tK$*kJ?S>*Hby zX6CP>o0QM6wa1`)K(DXw>5h--A5hkC0;%)ruVc64N1FL(cweq@9+9^-Nqg$~DX#7I zei|H@l!gzaxt{*Bydrq&vN2en7{i?E8WP8Byg9hshW9|y`!ZBC3VQ7Vkhj>@UrGSu z^;cFC{fveF!-o&tQSa=h_w~+8N=Z}byF^=z{ha{qeDOJcr ze!RBPx++kafcih6)jD?NMz@Et;IEuEd;l^LmPPu!n_*S>n93_}c*54!)^Ru)oq=#K zR-*U#3osg9y}FIz`VC=N+kocdA4j!p?>xXg&^J-{Z&6rn`EBlAZnD9w{>vH&uH=%9 z4c)-a5;vchZ{;<9Rk+T7N#M6Qkwmm`>WDyKnu9oI(**@)y`}^l+Ob6W!TJR;J%&?W!(`@3FI|&5`r)4o0}+5 zng}CGY{BAP_%-NzF+*i#G;sDHTSojOg|AFs~1& zx2`7(1b}Gjrd`wnXiYX&G`LxYr61CfXINeM(>(YJW}I2BRJwKM|FY_0aS)o)k2@S? zWp-RzB)-=4yHs}Vfw6~&UYWAYI@P_Vj#+WM^k=r#&)ldm{mDOUv&sB5XDk0^-=<1+ zOWcKFU3uf;%ZWz94U@$%7l7bqv2@Uued6doel5QJ7){_G)SGNRSGNT_;a*}8~*u&nBnt*(pF&caOAmzrUxtMw5#OWqCPtv zuCl+-rTb(*y<0T{Ih1rk3pc|YP~&OtcpzH=e2s7EVX(kQea3P9BvUdPEF880FX<#aEWU$TTdKC}m{d zdTFh9YOX-iYU_aWu?oqGpLN?4b=fw5Wuc>1Cu%^ z@N>{o;4KB@A07pM>V)n5k~~$MJ;)7)P6gYX`_SGRBbRR^4y+py*ww(Hpe31npT7zY za$k}6?%usC`O10eyy4b&>ny3Y*zF_W3kqde2)urJ>%9L`KxSRc>HKti*9b2vIgAxz z5KXCP+8~~F&UN0bgD6rXEK2LQ2LZEMe~B!SDg+Q9*;l^$CJyZhj7Y-}W7gXbXAzaRmU~T%V?74mdBWmA=^`v!xV5!4;S%=cObvo>i3SU^#8EYT5c_p?iNca( zH_yUVx60Q)o}67|$^H{6@tLWgL;>!ti#s62_q>Gi=WEalSKx&rNufm;l3Y_-_tq@h z*Sn{n<(S58nXviA#U?GmpTX@Afk5yKjOadliK{n3-Xb$mk&q(3tp~AvYU!K5G}zlQ z5t5pSSU&C5z&1SlKURb9a-2u#PogENA4cmU zaV57dJZvK3VHj)@#zi?cVWkPrZ5F`#1%h(_>{vQg*HW9|Orb@^QxD{_j(6Z&^P%)T zjMhK$p75)oWOETGl?D5{0Cj?T9hS@N$1f*M6cFj&mGB?6x$W@GUJzRU66Q7n!spKt ze>5?E!Hx32M}hs$PD&3d2s$gusx&y~$1Mu9JAIa#YYZ#SUV3%knZvz*pa+G-T0^SMF%N!jRRu@L4Og?|a+ncT|AWK&tSA>o6>^AMR zvJu@o1x?VkCouR8FP~kEgYspgY@H|mZn{Jkf|vvdPQoY%ko+aUjy!%Fl_F&|8?rtB zOw7OUz+u)~P?Z$=`1F4s4XQXa`xH5WdXCSHYwE!u(}uao9j>zu8tUr#0nv$duU|)A zM$Z$g@w{2D>{$o`UPw45|N90jiQ*v3c=OSE6FEkMzHV+x_f~$5r_X2n$2cIIy7+hU=F%lguJWr!IOlrw;F*GV;TjmdH;R5%-wkUj zXEKfL4r^Y$v$Cd+Dk(27AODV~Hi}-;zJWQ`wq24ZN{uU@^vvmaVtw2m4b^pC^X@Fh)mWMWv38Rq6Sn%11iGw^P|OJ%%mZ*PZaIhD~f5|}j~%vC4b=9w8U z^1K_gDep!tLvJ?RCen<^+haL_A`J8rU8M+O9?WsJcC30R6iFt5dbSOHE|)P1d!L6G zZ|7tGV*$HhmG(y37qU7hwIHy0WPX00X3Iv7O48)DXBFkZ&qsWjXHbsZCBiW%|hfJp`mp~=G>ON?iKAI-ys?S^UbTL(UV+p0|epELzr_V(x< zP|i7~)E;{42XybyR0niGD;TLrK$+4X%1#KiouZDgqN#829BmBC2`G-YaJ*l#RrrI4 zFj4moow(5#cCm*3@H}hc*exNZuj|_4V6UraTW5UutfMAiF!!=R+Bg}e>tmd-d?O^1 zj|igfHM%$nqcNM-ZxQ`bMPZ9ChawLiJUB5te9K-H~zk@{i?_3&gPz#3a5o;MrlU5*`iDIgvRyj1Ll+8n4?#F2MZNnoxKEpA1i_Xj^## z^}Er2KNSbsZjG|3bjReN^u{tmZgH+j(eHH@;p2m$guhpg_#aI&_+pDHn-Y{2~L_1l#qD z`3jZFF20V~)@G4Z3SJqv9!p{_(!HG1Y<(XVJ<+g`r4l9D%=s0uGHe*Q$^1{T=6M*C z4mpQpK#j9T{TRk-F~%veIGO0jLfCc=XX!pjIq0NvEq*1ZlHU4qgFdhZvnk|`gUOBd z#9#}@d&%gtPEPMa8Ru#Uvu>fET%c((#x1E4*Vy5O3_jsxfh?j|Z0;-KsDVQnV^be$^jSA;ZRaD_eA40-%=#&^FS^cYgEr zk3G39nWn^fiy``K)5L@;E$~c6d1dpcfgnBLRnfx~%6KugO{q~Mb~#OG+R|-v2PA*= zwNfroR)cct3J#~fYly%A~C8`&McN$FC2>*y9FkYF^F{*;2=hh(~ z!`0g%aqk%$-Iw(T>&ZR~;&hnf_|k3s>+xMt>mj(m8lwF08~{Mo=I9~Q(}A)@wdatA z;`FDSvEi1MmRY<9JdUCV_n+jv019ibkZy~Cx*`P>N!7HGzq3&R2MM$tc!#*e=@Aag zi4r+9!aF8r^4x;=uBE~B;~pz=!WI^4_+U-`ysZ%ikG4+QqOs4Wk~ja~es_Ya?M$NS(-d zUDq(%()X2TMY=?3sqSRV_*nRSe>j6yv_o~*Cqtz_=kf@w>aD!89lsFabV9AB8YCSn z9SiHVyjh=kX#7iseBDC&6G zPfIDLzkSXgw5*Uv@7r1@y6GTb3SSu30(P`KYhtP8=2bYZbnPU%9h{tkOR&;Rqs1Ub zgKTZ}I|7kZgE5p~!R}$K-#`S}F9jnU!s)X&+-O(G3|0df5r~Z}v$WRuW;T4nHzcBf z7fz($u2)6N@sU+N>Z$g%a^S*P?vs4vKlwYjX(I0s%vwUUH}Ih_Yr)? zgF{Bsr>{e~J`ocbe?u2KQLL4%{=RFLvae2dh!q7Q7_o29V|FSFp;wm}olmW^!ftP} zdL6zaUy^yF?D2EvGQ3P}#BY~h5qX)m@VZmbHHkp3cIW~NfxIhJAQwKj zaz0xJN7)4`^juaao~m<6B>JRk3P zENzid*ZgY_WP#qa*_bVN{q=<66%L36VWdNTety)A3;eM>0wo^BJge&>L*Q0^K1W79 zK4R8@_?;L=jCpv7>PU5|=Uy7hF{K~n%X27&R7}TZ+G_ToNbh7ByKt6j1JF&`CElr# zTttu;A7)3JLM{n&jBlNFdErK}qk>dr%;vNQZ86K|Qsbmc|7zp<{)mZTPNTr7_L+WT zi9<~zeF`5k-s8{kLl#AgIxH>WF$V*@QGbg>E>B1R4a`ROmcdf}LD&fVDtB{XxC+S5 zC|(E+y^F2noH}SqZz!feF5b;aJ4wPX{i?KwMP6P*fki)ejltJY$xcYLDOfjAJ;XA0EZmVEUr? znKZCI1d|<8Zg7slC_GS>!vb}e@lCaHLm=#lN3)tcX7;|3jiH`m9njs^U<8SBfzM8tPT@}6D}L@vBS z@Kw~_O~H&YvDLlV+7uX1BeyWIwL`7cr@ms~E_FSDs(u^`Q?=>+sksQgR16yT|Gyvs z>~t(f#@S;h=nX@W5S=y@G2!F76ah^?=q#Ro7f^&D)-=g56Y*%=M}E1F+NRJG)pzLm z1nNT6S&dXdNU^l%TAvS87}m-OB}7=f$- zdsi)Td?5*;>GxT!*8L5#_R9BDYhQ0zU(<_PlhnC1Ucc%AMA>LSla(q+NhH~p?r}el zBt=oK=-_B^>5KSWg*eTa!5&~TKpj0|MXza{)`o9a#W{v9SiW~%=lhA*iLV~3^!M}y zfVl9bA?#FVrqm32mQ-XE1t(XX*}+!w?lIs{A0)R=0QyhwaHE@w8QoIABo&Hj;mT$) zN#%n+FlA3+iZxO95ZOE1@cR+>s6;rn2q?7cG{r&xS-$Ygi;Akb5v@2aa{}A1msOp` zDQci^9+gqp?@q@|Zln%6=%?RNI}!Wd;|#xsH#8k*Y55_>2U;Hm82?+vTROf-L*B0} zv>E-1$x{l=3o(eqaruJWusRX#{!*~m1`Pi6{aeVCK z4e7H53E@-?dfbmAbWh1POlm~FPJsAJHa9sOuXA6eI4HNT^qwE8%yMkA7XHy%Eh;~) zRU9i>>$sTLA87jsVxl(j`TE2?!^V>C6Z9$>zC%Vn0yDv-4E;jb-w5yd@MEvx*3UtI z+S;PBA(d03v831d(&&p6m(WjVX3x^ySPXg8Q0hz%IMoFMI@@nm=|#)9z8h#m)6Vbk z>{NWtgtDnjabilv@P&wHVY3Zyc8Z%3$2`Uh$gMGsrd7~lb-EDulJ|MA(9_d%oG^uT zNOB{osnc|kwKeWm*kjtjgw(ko1f@U!>ZXloX~S2rU@syQQ!p;v;1d&$52AVN@}&Gw zd9z0f?Kplrh8~j=&bXZ(QgYX@Itm-UR({%a{qGW%B=xKvoHOCga3g@@A{v+{=Fw#MX|zdsCuVqLTKPTc;K({d@K*f>VrY`OUM?Z>w-AX$SSpx<#|TXO=y zcu*_17B`SA8(YQON5~Lu{g88ObTTaWz5X#Dyf%WOgis`-mx_dLX6}zd;Mcd8K7p~? z=00D0xKs~4TFXJDxxVviZir;gTkJpL<9{M7U=7p$Tn$Y`Yab`c+t6!tIgks}V!=?^ z+N4n}8Ow0+PN2q0YC9;LQirvrThfM=yy>s{0BQJ=;`V7knM^)A4}PBs6C8(OgL9!< zQQ^&-KhMv9euhs!b-^$mo_bB!Z>f=mj!yZLJ+Z{*m^~@ZOqm(N`PGkAvi%^8$ldGvE!^`LEnqS;7d2?9HPg@y1sJv|+8K*lkfzQp3h zM5fzoS8K#UDIX~So=?&RsgQ3yT0+opa`DSJDzSWwC%aS>Jo!I=E4d9Y;eBP`hY@ab(D=XOOH}0M60N`2*=BR%j z3t*V03~iHUaJv_*#DK40hJ}hm3(9oCy+;<4JX6I|lKsOK{7x?+gLE#iD-{wjH;vUw zs_vg0i)qyKMRsYy&7u}r(nitB^nH8x?ni;gCI-y1@M$5B)n#F5i*=(yldxu;k;WQ~=L)wI2MtPoQ^kw*pZj@^XB4C_hPOxgL+;Nt9*oE~ z%XoRKf}Ky{{FUQ+VB+2ZxFX<&joozN z3%I6v{&U9t`}b$edTe6UeKlH*$A8F8RA#m?`Bs#(Q|yBemB51i90Db;DijHB?fh{c zz?|}NEUZNjFhUkg&-0XY-seK-_gU3aukM;*z7?wI$@_w6TS?f>sw7Wg#zfI$Ioo#2 z^r$4wH&Rl49WR*3fb}^S_HYpNWTLL#EZ)<-GI=acXnU&BPJ&n2~7b9+^^4|1xM0{!zw`X3xR6 zor*cSuY`)h>%rHwQ++JFSyEWQ%3akMWyVNx<#LVEHQGzn3D1Us)fl)gg`!FtjCiYM zjlkJ;@zRV(YFj9Rz)Em;!$i5{o(+ijv>X4Jh< zARM9F*CI%i@b;=_5-gp*=0i9bx`C2C0hD?G1 z6R&5()kTM6$2k1P>#OZv?9%H$Bqb^HhSfr$>P~w`>v14tT-?96wnDfz1)_Cc3}rwPGQ{bgYVT z?!?E=*w0@&rQiOlo;^%^IWH3u?LRBZN86V;Tr6FX^o#qF82kkgHP3kEzrN{K(>Vma`KWi&2WqGd=ylS?trqsq4|!z#_{9Dx{qd!z zZun-qG8BF_=V%rzre#Kbi0k}k-(*qPsV`!nIu*(BreEm!SZGD~cdva?^-a2%P!N34E>xzj6LvcHcv(_WxFVSobbR0{)PO0&cYtn<-i66OxV z?U>#lL=i4Wo!JMnU(!cIL6CeEY+sz0W3h8tyYu}zyKKe+9m5O0Rmn}b%ur}sHX%3$ z8_XS1?!@_B&GayYPRT$=n?R+M$oq=$ti|E1=@Sx9g@f{^Yny|gMy-x2w}oJ5OfFs5 z(_!`e(ou$Emb-&eW4)Z#R;_=E$=*A4k7Me@r;Bug)77!H8<=)vYF=ir=UnmWm|7w@sb7uXQKR!8=7B=@j&d1w(>H_QU=f$4E z8XYIBIN7PvZZ|aE69v6Q$;ye|{BT!p>&aju@>yM|Aazq+JU#e2WPz z4?pj5(|Ia1w6%6T#Z!xAdy24DCr+q$4yu$&hKe4BQJU!4k>&a=X5-lvIz9T*-IEWt zA6}-V7f|8Q;=jKb@b1dp(XIGdzy<)jzBX=sc z@k$4l&BI`gHKfh_5;ukRQZn?%$I0zd3YBV^&hI{?rg!`zBJ{eFt`1L;n&;1V;~Kc-v16&*U!M#QRl$!*qVa|)BmCqixK4+<1Hc$XM+jl@o zrNeHo!<`j3&8E;>n^E^c1*bDJUA&7K4_x_f8##)%raWvZ?5Ly*sN>62T1F!HRGVDW04X`pQuRnv!Fq_5l8Wbk#Ta z>5lJ&u{g<^NZqedicCJV<GB|3v+?8Q1-sC^sn0jc2=BrY5(}U2U)1 z)!~#;toK3}5}e4&Q))9vmC<^HcGKFOK{RZ%b)erndgGSMvU*Cj-84qqYd;jLI88oo z&6OsDj%`%@FP1{IVA$J9b!Qm=Z!#oTPs(o~~t zR6io^iW&aMi;ykR<@_CS{V2Q$OS``N^%HXGZca)(}}p? z-CCVf<0V}f$eR!Hb7Z>D9u#syWKhzs4S)Wrr0y?Di18isliG-$%l95W^xKJPr&w}@ z91#GWZzb_P6w75s_&HX*!m@@wdq-Mn>@|Jw^ZVNvY)=%i`K|6_8B$KEc+7E$*cZ28 z*6*O_*=y}-p4_hv!cTV_q~Yz`s6KUcfrkvD)W9HmX@e3LN)>Dn*cv_Bg4( zH9VaZqa9b-OP3G@u-(gQ(W{ZX%7t~%e{mawTFzXozD#n(2vSFT@TNTeow1TiA@tXQ zg@WYHQ6=3MUf{~5yXo81^jj21sii=G1ecrSOeBvWH9iD-UzFgv-rR( z`DIk*SKmkH?_Blj$5B_$0eaIt?O9m{wEx+|bB%rA7Rnj*lf44;rFjF`Q5NlSuGdry zmJ|ap)c_+3F1a?e7!Y)O%z|BEZI<7?k8VBZP1W743MQB?Av?Zr7Qg?5sPY2J9t>6Y z*Ows~t?tUq$x>J}8Chh*g{{PXXHmR%5zJYopZL(`OKdjs8?KV``*1JCj?$kB2TAU9 z$Mn{k57+m0e*TYPiXxeM`vVh$wdsEo5;TIp9^Sd;pkGCj;fQu#3%pgf%NLOJZco?7 zhTaSB^tfEhg|$<8>nut3xph!*12%yYGn7%FEJZw0)`+?69J06(%uL812-rOi>SGSE zHZv)cXTM#Yc57M1^BxfMS@CSQmd<~pF=X@pq_($aST;;%ei&JK7ljjJw zuSXcRrBbwzIHjCs0YVNT623@UuK{iSs@U&2(nM;X+f&JtKI^k8Q?V6qIY4MnboFIW zezR=YOExj!88~wMxM6&7hPd_z<&a@VgnMplCW22jIY$V1>n}V7+4{LZ@yh$7i1NKf zi1(_`BHB2B_V&MC|W|@SU>dwgp>1i%3EkGRPj4^+bU$8pzCEFM9yyot2S*sQF1;Drd@2UYgQCs95=NpIEUm1#Z-Yn}lT7PLW(C)I zfBw)$t5(U!x~+C2e(g!YNG4C47b@xRe!@l~a;Sf3Tfaaech(-LWC53@3?JIjN)nfC z5@=(Y#W{lqqcT)29xkia)by1ju;V(-4T+J7aA~l>!|xHaqSWNCpb-I(-X)wSXo+KwC*_7o*{3 zOXbnv@8}BSpdDFfS%SVp8p&a);%+u9grB8HM?XL@gAx`QVVAjN|C#A7P!bNGM1adj zwQJxUtbXeFeGv6&4rVu6Dnla;RV%{LfR?29d5SBTmmZv~OhM zJU26Ow5QPSZpJ4#(9+2a=v$H=$loLJdAA7jEAD02H3OU@qWaP_E01Is%nlW&#gBFb z)^K@h);^zBI#JlQvbq{#lRd^q_7Y8izsAYIA-VP7AGJ*36Jjvf)s~1`N`dU z;n=CnIsJR0kcZRPr_KDIf?dBl7&i)~hFP_x-Hx_wt5%*cZEMJ6m3x*Fq$LoTqG!jp zek_Yst|BE|>&EYon4x6>#p6N0qON-U zoYP6WNv@IK6^7D(ZK@u?k9mq5EwM+VN=m2xO=^&-DGmdNyv>KjKr);@XDvmq1_=rf zdS$4(U#{Fx&7TR&pElbI##5mm?x4+SVo3)-)^9(PrqS%1avuB}LL3)JRf2!69iSv6 z^K6M!?139NCHErWvd!^SOcOTjB5=?~!2GH6`$xS`zf>Ry0Us(5n*3CDN(d+YO$x&O zC8_Y!I`J5fE(=!ZoLet9)-GP;If5_ke^UV(Tqu(TXf~fch(eMGdX}MxjTORLun@N3 zpm}{v6ZBkG3#(}%m=uoPzFi4xHXL9&{ASf;T`i{ikp9kXA6kcn_70LoF)QBuYw zZh&IJS|hEIfmbfT#Wmq9RBKWz;VgCw9`+S2JW#)KJKcwEC^LgsU+*4F zjtxA`OMpWFUPF&optsWlCM0IDE{jk3s$}`#I6huqvE|EmVeGAP_Js<~ld!TDJjiE; zn&3664vFU*-#rR@-d}NLaeK-{fl&^5!(N9QyGa-zZ@hEI%9%UylB2C$if}2lUwO2;#j6D5?9wl@<*F>Pu>KlTw%Y7%)KEh|zSfPwQz8 z918MQCa&&*2ZT>q-+&){ZR$H|oV7=t8~cofg>b2y1=~*aJOJ^3zvMl42Zt%^A5p^# zEC-%v8jf)Z|LPtbto6_IrJHtwQ_)rjSl;&lO;wIZK5B@&0>hS4qQJ6@{Yo0V*azTy zYX5^vq8b@;&3?8wYj+N;@g~FSPBRA4oK@;oDnSaA2$B`y3!#}X;bDN4LXlpqxDt_1 zIsG}D*`uYy1%h;|G^*-`c}N|=mm``doQEn!(I8yO;>HpY5IbEr=&>z|V4|l4W`P@! zMirrAk77NQ@4Ml^FYirqTzja2RznTOukYz|rcMNe_u z5<0%SU}SNGuKw}85a2gQWcZ$zkxfNZ5#uz8Zp_?RXE}Ozo97UV370(KBdFR*+WiLL zM2IyQah%Bot~LW$79lPwE{q-J&PxG7hE>`@aCu~*FrtTbiFrbS3u{Dx<4MA2!mk#l zN4TBXQ0(&6RIocB6q~_4%tY0qM83&7R4_1nKSAQCN7JZ(W>CtM}?lR`?jxPs)~ zi*y4`zLg|Gf1D(hKL}YRr71xz^hKkb*?zv#1bsiO{u0=UY)@Spgxj|R2MtG0ZeSxw zk$J9Ma;eY-Rno*6JaIQw6pXj1HSPYq!F&qBneY=UvR+s*eXz?)xeGyfz?S!V+B1$3j2{c}BAy7pC`}?~yU*Q6)nz?;v>@asPIc zH+WOA8XNo$`D=)vJU(g{Z(NGm*D}OOd&7y6^bt0$HcgP;Y|stg!?*w64m$oP#=*e+ z@N;F-lQZQzxv)d7QN5Xns;(qGH@FsIIAnGAB{0m8KCmB5VaY%uh31F#GyFdvI)1D{ z5a}|fi8O_Y!WOi@N~x;m1JV3N2EXSCoM<^2GW;^DJN7l?LYYKePbosvnt!cpq;xAd z7~>#{47f6#tFH;NEq{4#XL;c>2m5rYcmP;{iwKSn<6$C=$RnY%u!rxLfspzwgFxxC zO_8C#lExD+{qoLP0f9KiHO^qhVQo#|EQOl;2sHO1)MZg6Wy3qLiUb~#DxnTrhmt|8 z1z!MH1kWPhGYuo6nW@5*t0Z}XF`QtNp~RAcNz$bK$!EdoS|o!xoI~$T2}X^gN6~iA z@3j@}n={6%mPYFkRj2zL_Jh8;#4RC08Wyb_Am2Vr&Z*tU!wukk*q=ZMHu#MAy`VOb z*yoDb3bh(en4`k2h1~d%V%p?Y zZ`9Hu?fvXQiJyj~-Jdb$ms90=e@TGo3m>cVL0Og+ROH^Lsh1YQr z{HWjf-yQ(|WwMP+_0v3SPTj&Ar&2rD zcnEoM#_p=5x~VPn*XxKNUD#c45+oMHfnvWl7nNJnRFGQE{S&c{${T+BI118LDJHTK zIu4jFvKrq{cRW|dCc894yvIi4#b&fOL#N%PN@S=v_j)HK?Zp0jnIN9s$Ro?zZ-J;` zxTb`0v>pee80E)0HMM^k?Y%Hur2t(X!4G&w;A6KURavkC=T5Mg{BlK*au8MKDT{kX z^HV+Nsus@;T>CVa2Q*$@0RA=;^An}qSqMYLQEB0T5rP82@{TBAIZQCV&qIhg!37d# z&$6m9uOXNCTcF(}q`R1A-$mnuofyuXMLxtZQUlW6k#;zM!T~rtX&0K_% zMm4h)avs;*0l|ra!<}Hq?*ofV?Jdyt`)j~Y`=CrTV8#r>H*=de7cPr@GdXmen}|HA zkOu5Z5bqzPegY0mh6=g2y31yMfI5Wr;m5}Ue?Mc6KIYF#s69XkAlx8~2%QJ@PY~{u z=&htKv|=jb?b;H--kfM>FvhWf^KBqwU?jEIGn#i#C6JZ>lL9hhf>|z`?Sh2m|2~ZZ zO(C%Z!EUEd3kGw^)_(826By^p&H}QYixaLq?PS3|qrYR588nO7uGUfP`*~o{J1d}*pQ0bu;_EN3B#g)_dOuBBe>I`!K`3xe0dsh zO#S!OSqw$zf%S{&eTEHM5427(tjJ@!(#ZJWs~E%a^)q=Gj2Iw=D6sYTG4uk%iz_Q9 zCo?l7U%q@f_itcsh_J)EpZfz?Wq?iH(7QkrUS;oKJfJJGY>6&(*b7wluF7UuvTWHV z2ZaN31(Kt;WF)@tFPogys3M?g|8)JFKcc{-1}&)%@dC%!T`PdIo{Ag&=O{RQG}Qpk znmnJX@FaGl=VY}n$!Y=|rhIvR+EC8`i?atW8G;Mq;vvTfV8ZQE5{wr$(iDciPf+tV}m-if*I+;_h3N1nY;M6TF7 zBc7A_WUgl&IY|&uNFbnJzkq;%`2QLZ5b*!{1OkHidzBVe;-?mu5upVElKVGD>pC88 zzP}E3wRHBgaO?2nzdZ5pL;m-xf&RU>buj(E-s=DK zf%>P9se`_emGS@673tqyT^;o8?2H}$uO&&u^TlmHfPgSSfPiTK^AZ7DTPH`Szw4#- z&21E&^c|dx9f;^@46XDX9itS+ZRYuqx#wG*>5Bs&gxwSQbj8grds#xkl;ikls1%(2 zR-`Tn(#9}E_aQ!zu~_iyc0gXp2I`O?erY?=JK{M`Ew(*RP3vy^0=b2E0^PSZgm(P6 z+U<&w#)I=>0z=IC4 zh4Q;eq94OGttUh7AGWu7m){;^Qk*5F6eTn+Ky$x>9Ntl~n0KDzFmB0lBI6?o!({iX zQt=|-9TPjAmCP!eA{r|^71cIvI(1#UCSzPw(L2>8OG0O_RQeJ{{MG)tLQ*aSX{AMS zP-;|nj+9{J&c9UV5Ww|#OE*Ah6?9WaR?B04N|#`m0G-IqwdN~Z{8)!$@UsK>l9H81 z?z`Z@`dWZEvuABvItgYLk-FA(u-$4mfW@2(Eh(9fe`5?WUda#wQa54 z3dXE&-*@lsrR~U#4NqkGM7Yu4#pfGqAmxmGr&Ep?&MwQ9?Z*twtODbi;vK|nQ~d_N z;T5Gtj_HZKu&oTfqQ~i`K!L||U1U=EfW@FzKSx!_`brOs#}9d(!Cu>cN51(FstP_2dJh>IHldL~vIwjZChS-*KcKk5Gz zyoiecAu;ImgF&DPrY6!68)9CM-S8*T5$damK&KdK4S6yg#i9%YBH>Yuw0f280eAv3 za@9e0+I>F}6&QZE5*T8$5__$L>39+GL+Q(}j71dS!_w%B5BdDS56%xX1~(pKYRjT; zbVy6V@Go&vbd_OzK^&!o{)$xIfnHbMJZMOo``vQfBpg7dzc^+&gfh7_=oxk5n(SO3 zr$pV6O0%ZXyK~yn++5#x`M^HzFb3N>Vb-4J%(TAy#3qjo2RzzD*|8Y} z7fEdoY5x9b3idE~-!45v?HQ$IQWc(c>@OZ>p*o&Om#YU904cMNGuEfV=7=&sEBWEO z0*!=GVSv0>d^i9z7Sg{z#So+GM2TEu7$KXJ6>)Bor8P5J(xrxgx+fTLn1?Jlotz*U z(ekS*a2*ml5ft&R;h3Gc2ndTElB!bdMa>UptgIl{pA+&b+z_Y&aS7SWUlwJf-+PRv z$#v|!SP92+41^ppe}~aariwztUtwKA8BBLa5=?j3@~qHfjxkvID8CD`t5*+4s|u4T zLJ9iEfhO4YuAl$)?VsWcln|?(P=CA|!u}ab3c3fL8ej9fW;K|@3-c@y4I;^8?K!i0 zS(5Cm#i85BGZov}qp+<-5!Fh+KZev3(sA2D_4Z~ZLmB5B$_Yw2aY{kA$zuzggbD{T zE>#yd3ilpjM4F^dmfW#p#*;@RgBg{!_3b6cW?^iYcP!mjj!}pkNi{2da-ZCD2TKKz zH^x^+YgBb=dtg@_(Cy33D|#IZ&8t?w8$E8P0fmX#GIzq~w51uYmFs{aY76e0_~z2M z(o%PNTIipeOIq(H5O>OJ*v8KZE>U@kw5(LkumNrY>Rv7BlW7{_R9v@N63rK)*tu|S zKzq|aNs@81YUVZ5vm>+pc42CDPwQa>oxrsXkRdowWP!w?=M(fn3y6frEV*;WwfUV$s31D!S_;_~E@MEZ>|~wmIr05#z2J+& zBme6rnxfCp&kP@sP)NwG>!#WqzG>KN7VC~Gdg493So%%-P%Rk!<|~-U|L3VASMj9K zk(Pfm1oj~>$A>MFFdAC8M&X0i9-cV7Q($(R5C&nR5RH$T&7M=pCDl`MpAHPOha!4r zQnYz$7B1iLK$>_Ai%kZQaj-9)nH$)tESWUSDGs2|7plF4cq1Oj-U|+l4Ga}>k!efC z*ecEudbliG+%wI8J#qI!s@t%0y9R$MBUFB)4d47VmI`FjtzNd_xit&l1T@drx z&4>Aj<2{1gUW8&EihwT1mZeliwrCN{R|4@w4@@Btov?x5ZVzrs&gF0n4jGSE33ddUnBg_nO4Zw)yB$J-{@a8 z);m%fvX2fvXxogriNb}}A8HxA)1P-oK+Da4C3pofK3>U_6%DsXFpPX}3F8O`uIpLn zdKjq(QxJTJ4xh->(=lxWO#^XAa~<7UxQl8~8=izS!TcPmAiBP5Et7y?qEbFd9Q=%IJ;%Kn$lto-~3`}&`x=AVS+Uo7N*hbUxhqVH_w^sn!74z{Ka#*U6s z=8jIrHpUMBC@@9Jn~GS<$lse*EKuX%3Swl5&3~GiK_$vn8Vjqe{mjhBlH}m4I8qK+ ztU50COh7)d-gXpq-|}T;biGa^e=VjxjjFuoGIA8`2jJ}wNBRcsx24?7lJ7W4ksNPv zA7|gcXT@~7KTID#0|EX#OAXvgaBJ8Jg!7X#kc1^Tvl;I(=~(jtn-(5bhB=~J^w5bw z8^Hifeupm;nwsSDkT{?x?E(DgLC~Nh8HKQGv`~2jMYrz9PwS^8qs3@nz4ZBCP5}%i z=w}jr2*$X-f(zDhu%D8(hWCpix>TQpi{e`-{p^y?x4?9%)^wWc?L}UMcfp~lL|;g) zmtkcXGi9#?cFOQQi_!Z8b;4R%4y{$SN~fkFedDJ&3eBfHg|DRSx09!tjoDHgD510Z z_aJLHdS&7;Dl;X|WBVyl_+d+2_MK07^X1JEi_)v$Z*ny-()VrD6VWx|Un{)gO0*FQ zX{8Ss3JMrV15zXyfCTsVO@hs49m&mN(QMdL3&x@uQqOyh2gnGJYocz0G=?BX7qxA{ zXe0bn4ij^;wfZfnRlIYkWS^usYI@goI9PccI>}Ih*B!%zv6P$DoXsS%?G)|HHevkG z>`b#vtP=Lx$Ee(t??%_+jh(nuc0Q&mCU{E3U z1NqNK!XOE#H2Pybjg0_tYz^bzX`^RR{F2ML^+<8Q{a;t(#&af8@c6K2y2m zP|parK=qf`I`#YxwL=NTP>tMiLR(d|<#gEu=L-c!r&(+CpSMB5ChYW1pUmTVdCWw|!Ao?j&-*~50S`=) z9#Knf7GPA19g%Y7wip@`nj$aJcV|SakXZ*Q2k$_SZlNMx!eY8exF;navr&R)?NO9k z#V&~KLZ0c9m|Mf4Gic}+<=w9YPlY@|Pw*z?70dwOtb<9-(0GOg>{sZaMkZc9DVk0r zKt%g5B1-8xj$Z)>tWK-Gl4{%XF55_Ra3}pSY<@Y&9mw`1jW8|&Zm{BmHt^g=FlE{` z9Lu7fI2v3_0u~apyA;wa|S4NaaG>eHEw&3lNFVd_R9E=Y? zgpVQxc9{drFt2pP#ZiN~(PL%9daP4pWd*5ABZYK{a@e&Vb`TYiLt$1S>KceK36Ehz z;;MI%V;I`#VoSVAgK3I%-c>ViA>nt=5EZ zjr$Jv~$_vg<$q<@CpZ1gdqP_3v^)uaqZ`?RS_>f(pWx3(H;gWpjR?W8L++YPW;)Vw3)~tozdySrB3A2;O<%1F8?Il4G|rO0mEZYHDz!?ke!$^bEiWRC1B%j~ws0+hHS;B8l5Wh)e+Ms7f4M4CbL%Q_*i~cP}5-B(UkE&f7*pW6OtYk5okQCEoN4v|7;(+~~nyViqo5 z(bMGQi$)KN6EmfVHv4pf2zZMJbcAKyYy>jY@>LB5eId|2Vsp{>NMlsee-tmh({;@b z@g;wiv8@a1qrDf-@7$(MR^M^*dKYBewhIDFX%;*8s zR#u?E;DJO;VnTY6IfbO=dQ61V0DisUAs4~t|9`9ZE(jG}ax#-xikDhsO_4^RaK ziZ?9AJQP_{9WuzVk^s_U+3V8gOvVl5(#1>}a|RL>};+uJB%nQM-J>M4~yK)cioytFXtnmOaJZSiE+3g}C`Im~6H z*+-vjI>ng5w>>Y!L(+DwX2gs0!&-BFEaDie4i5ln*NGP$te7$F9iUlJl4`XpkAsPm z0l?GQ17uN^=g~u1*$)S`30xL%!`LW*flwT*#svAtY(kHXFfvA`dj*pDfr0pBZ`!La zWmX$Z@qyv|{nNsRS|+CzN-Pvb>47HEDeUGFhpp5C_NL0Vp~{Wc{bsm_5J!#tuqW@? z)Be zb&Gj&(l*bHQDq7w-b`F9MHEH*{Dh~0`Gn8t`pz}!R+q~4u$T@cVaUu`E^%0f-q*hM z1To6V31UGJN7a-QW5;nhk#C26vmHyjTVZkdV zqYMI9jQY)3oZt=V0L7JZQ=^c2k){Y_lHp&V_LIi*iX^Ih3vZ_K<@Di(hY<&g^f?c$wwF-wX1VLj>ZC4{0#e`XhbL_$a9uXS zKph*4LupSV2TQBCJ4AfOXD8fs2;bAGz-qU4=Qj$^1ZJX z2TtaVdq>OjaWGvv9)agwV)QW9eTZ-xv`us2!yXSARnD5DwX_Vg*@g4w!-zT|5<}-7 zsnllGRQz>k!LwdU`|i&!Bw^W7CTUU3x`Zg8>XgHj=bo!cd<#pI8*pa*1N`gg~I0ace!wzZoJ)oGScm~D_Sc;#wFed zUo;-*0LaWVCC2yqr6IbeW3`hvXyMfAH94qP2|cN``Z%dSuz8HcQ!WT0k38!X34<6l zHtMV%4fH5<6z-lYcK;CTvzzT6-^xSP>~a*8LfbByHyp$|X*#I6HCAi){gCu1nvN%& zvlSbNFJRCc&8>f`$2Qa`fb@w!C11v1KCn)P9<}ei0}g*cl~9A9h=7(}FO!=cVllq3 z7nD)E%gt;&AYdo{Ljb2~Fm5jy{I><%i*GUlU8crR4k(zwQf#nima@xb%O71M#t-4< z(yjX(m^mp_Y;5()naqt2-VibylPS)Oof9uBp$3Gj`>7@gjKwnwRCc>rx%$esn);gI z5B9;~uz57n7Rpm8K^o=_sFPyU?>liHM&8&#O%f)}C5F7gvj#n#TLp@!M~Q?iW~lS}(gy%d&G3p?iBP z(PZQUv07@7!o3~1_l|m5m;Xr)^QK_JaVAY3v1UREC*6>v;AT$BO`nA~KZa1x3kV2F z%iwG7SaaAcT8kalCa^Hg&|eINWmBQA_d8$}B+-Q_@6j_{>a- zwT3CMWG!A}Ef$EvQsjK>o)lJ;q!~#F%wo`k-_mT=+yo%6+`iGe9(XeUl;*-4(`G;M zc@+ep^Xv&<3e7l4wt48iwaLIC1RhSsYrf6>7zXfVD zNNJ1#zM;CjKgfqCabzacX7#oEN{koCnq1-stV+-CMQ=ZX7Fpd*n9`+AEg9=p&q7mTAKXvcbo?$AVvOOp{F>#a;S?joYZl_f}BECS%u&0x!95DR;|QkR9i}`FEAsPb=)I z8nb=4iwjiLRgAF}8WTwAb^eA>QjL4Srqb#n zTwx^-*Z38Uzh@bX$_1tq>m{o8PBX*t3Lqaf$EBqiOU*2NFp{LJX#3}p9{|v{^Hg4f zlhllKI>F+>*%mu6i9V7TT*Wx-zdK z(p8faUOwGOm5mBC%UGA1jO0@IKkG;i&+6Ur8XR2ZuRb$*a}R^-H6eKxcYodlXsF`& z{NkO+;_Yh-Ni@vV9iyzM43Yibn;oC7hPAzC24zs&+RYdY&r`3&&fg2hs62ysV^G`N zHMfBEFo8E3S$0C_m({bL8QCe$B@M{n1dLsaJYIU;(!n*V?0I1OvBB=iYh&`?u8 z&~n-$nbVIhO3mMhCQRlq%XRr1;Hvl=9E_F0sc9!VLnM>@mY~=Cx3K5}wxHKEZF9pC zIdyu1qucM!gEiomw7bW0-RwbX7?o=FE#K0l4`U2KhC8*kMWaEWJyVNZVu_tY2e&4F zb54Lh=Oz>(3?V$!ArXFXh8Cb3i;%KQGCrW$W#;kvx$YA2gofNeu?@nt>Yq8?2uJQp zUTo14hS%&dHF3Uhm~Z1>W)yb%&HoM!3z?%a%dmKT#>}}kKy2B=V3{Nu=bae%V%wU$ zb4%^m?&qn==QeHo`nAs3H}wtiK~!!&i|iBLfazh6!y9F)ToKNyE0B385!zq{p)5vB zvu`R#ULIS|2{3w52c*c$4}Pe>9Fw&U^>Bb_LUWn!xPx3X-uQsv(b1XFvFzn#voq0* z5~o`V_G805QXdgAOwOjoqmZ?uzwBVYSNP0Ie8FL`P0VK1J4CzV@t&%0duHB{;yIL$FZ9 zz#s#%ZG6ya&AwE;0_~^$1K

Hnj76Oym1QVh(3qRgs)GmgnEt-KxP|nCFY3uezZn zmtR0CZ$Z_-+f07?lu_tr~IC{&U6+QOth>ZgYk4V2FI$B2V3`M`Jk zsr>>lupymPeK129PfpDt9?GA2;I>03Ktz8NxwvTroqu8oaRB&bXT}G=^2UyOW}(4H z;9sG^YwV8K7pC&&viM^X_pfeFoN!cIhrE>OPQ5E<4KKDyPhRV^BGb_^Y6GO6#w}c= zu`0fC-@F4qXQtnB^nPmfI7Uw0bLhY^09TCO+H2(nvg8jdPjMAi4oSX%GP3oeo0`ks z%DoV|waU-Q7_libJCwnnOL9~LoapKqFPpZx?5FygX zsA~*ZR7X=@i{smf?fgxbcY6Y`JvD50P=R;Xv^sANPRp-Hc8n~Wb*gLIaoZJ2Q^CFe z_=G}y&{_NXT|Ob??}$cF7)$oPQMaeN_va1f%>C>V2E01uDU=h~<_fQKjtnl_aho2i zmI|R9jrNdhtl+q*X@}>l08Izz&UJygYkbsqu?4OOclV{GI5h98vfszu2QPiF?{Tvh19u_-C^+NjdAq!tq&Rd`ejXw#` z@U15c$Nmylco)Yj4kctX{L+lz$&CqTT5~}Q>0r-Xe!m5+?du6R&XY|YD5r5C-k*`s zOq-NOg%}RJr5ZWV4)?EO%XzZg&e8qVFQ?40r=8BI-~L%9T7@_{1X@<7RjboXqMzsV z8FiSINMjV*vC^FCv_;`jdJ-{U1<_xjZg4g?ek z4FtsapW_vFGqiGcGHP%?8US~Dfqi8^ZqtHx!}0%dqZFg%nQB)8`mE$~;1)Fb76nFk z@rK#&>2@@)4vO&gb{9&~R8-_{8qz6Rmw`4zeckD(L9xq}{r(fUO0Zh-R(d#x{<0j| z?6xZ2sp3mWnC}40B~g2QinHs1CZqZH&`+x2yBLT8hF7oWNIs_#YK2cyHO6AoGRG|RM>Hyn(ddpXFPAOGh~^0zcat`%&WoEQf9)!@l*3Tt@m>Lb z6$+$c!zsy_=%L9!_;jfd`?VXDd*^Vn%G>n~V9Vr6+_D@#E+dWB#&zAE+6xJeDMr1j zV+Tp~ht!M%^6f?)LBf8U1O4G#CutR07SB>8C&_&;g3TdIR#~e~qRtwd>&)|-ztJJ#4y0|UMjhJZlS8gA zAA260zUh+!$+xMfWKs|Lr23bcy#)JNnY|?WOka&wTS7_u%*N7PrMl1Lp9gxJY%CF? zz4IA@VVxX{knZPlNF+$9)>YIj#+(|$aflt=Wnforgn6`^3T+vaMmbshBjDi&tR(a7 zky~xCa77poRXPPam)@_UCwPdha^X~Aum=c0I@yTyD&Z!3pkA7LKr%Y6g%;~0<`{2& zS7W$AY$Kd}3Tg9CJgx=_gKR59zTMROsos?PU6&ocyCwCs8Qx1R%2#!&5c%~B+APu( z<1EXfahbm{XtOBK%@2a3&!cJ6R^g|2iLIN1)C2|l=;uj%tgSHoq2ojec6_4@6b<8BYG1h-Pm_V6dkRB!{T?jwVIIj&;~b7#%5Ew=0Fx zc(p7D1TT&e=hVt4spli}{J6tJ^}WL>sb`k}&gz+6It`Yz6dZdI53%$TR6!kSK2CfT*Q$`P30 z;$+G$D*C$U(^kkeY!OWn$j@IUu0_a{bZQ=TCbHD1EtmZ0-IBR<_3=tT%cz$>EE!V}pvfn7EMWs^971+XK}~kxSc_ATJJD$?)1Gz^Jq!>Hz#KkdCJ~jb-Y*Xv01_}}=T_V-A1<3O!V9Ezf z%Lnjihb3>=ZV}jSeqNu5AAdVbe|`;|p<%W#-<$s1oDYrB;C({psqV>ENkhadsC{cfEx=teVSB`?FOs+}d#pssxP z(ihudAVu3%%!*vOIWY11fn1M0&W|(|<2lEShz|#%W|wV2qM%#+P9NOy1x8jytHpfU zh;_L^uiL<<$L@~NpRXSrkJgdC>9R=>FmVu3^#C?3H>P{ue=mcv7lBmnfA?mB|L)EF zHv%Nl|D}0Tb~JVnv$ZysvbD8zw)>|5NpW3foe!QHipV9>Zy`|<5?O+rsBr*nZ4OE} zUytv%Rw7>^moSMsSU?@&a9+OdVgzWZnD>QXcUd{dd7vad+=0Hy)4|0A`}rpCx6cu!Ee5AM=iJ?|6=pG^>q(ExotyZP3(2PGhgg6-FkkQHS?nHX(yU0NG;4foCV|&)7 z1YK!bnv%#5n<25|CZ>4r1nK=D39qMzLAja*^#CN(aBbMx${?Iur3t=g2EMK|KwOF?I@W~0y`al&TGqJ zwf#~(?!>@#|JbDjQV9ct%+51l%q|lcY&f{FV&ACRVW*%VY6G5DzTpC!e%=T30mvav zRk$JOTntNoxRv>PDlJG1X=uep&???K00ep|l_#7=YZPuRHYoM46Z$O=ZZuGy_njgC z>P@gd+zKH5SjpWQ!h_r*!ol1s{9DS@sD4}xgFxaw>|av!xrKzg?rGnhZ#uZeU~iod z3-i*Hl@7cge0);y{DCVU(Ni1zg{yE&CxYT7)@zJ%ZZABj-Fh}0au^)*aw`vpmym;( z5|JZ!EACYenKNXH%=Md{my$sI3!8^FgtqkMcUR%w_)EBdP5DZ64aCIR%K99tId6SU ziT8Ef)K%7{XuIpPi}N+&FCm$elE>oKY;3c$x+*mXy?~wt6~?ss$HGqCm=YL2xzVTQ zr>*2_F;7j{5}NUPQ(aY0+h~rOKN|IA28L7^4XjX!L0C^vFB+3R5*1+s@k7;4d#U=5 zXTy8JN^_BCx1a4O3HMa9rf@?Fz>>dq}uvkY7!c?oksgs~xrpCo1{}^PD?w}Ug z3MbfBtRi z$ze~eRSLW^6bDJJeAt^5El{T*i1*v9wX{T7`a2wAVA z%j>3m*g^lc*~GOHFNy?h7>f7mPU*)3J>yPosaGkok}2#?wX5d$9moM~{NTzLznVhX zKa}bFQt#De`atoWzj4Lb@ZCud_T9rA@6VcmvW(+X?oIaH-FDbEg#0Slwf|7f!zUO( z7EUzpBOODL&w~(tNt0z|<9}Filev&4y;SQPp+?kIvJgnpc!^eYmsWz1)^n`LmP&Ui z-Oi1J2&O|$I<^V@g2Z91l3OArSbCkYAD0Tuw-O(INJJ>t%`DfIj}6%zmO+=-L{b!P zLRKvZHBT=^`60YuZon~D$;8UDlb-5l8J=1erf$H(r~ryWFN)+yY@a;=CjeUGNmexR zN)@)xaHmyp$SJcl>9)buKst5_+XomJu34&QMyS zQR(N@C$@%EmfWB8dFN(@Z%xmRma@>QU}!{3=E`wrRCQ~W=Dwb}*CW8KxAJ;v@TAs3 zW}Pq5JPc)(C8Rths1LR}Bgcf6dPOX<#X08^QHkznM-S>6YF(siF;pf~!@)O{KR4q1_c`T9gxSEf`_;a-=bg6=8W zQ&t`BK^gsK-E0Jp{^gW&8F9k?L4<#}Y0icYT2r+Dvg!bnY;lNNCj_3=N=yd9cM9kY zLFg|R0X;NRMY%zD*DbAmFV`(V@IANtz4^_32CH*)XCc$A>P-v49$k@!o$8%Ug>3-- z$#Fpo9J>eUMKg>Cn+T0H!n0Hf#avZX4pp54cv}YcutP+CmKC~a745-zhZp`KNms;J zS3S49WEyS8gCRAY|B~6yDh*cehY52jOSA#MZmk2dzu`_XpBXx9jDf!H3~!`n zaGe=)1VkfIz?*$T3t>-Pwhrw447idZxrsi;ks;(NF>uVl12}zI(N~2Gxi)8yDv-TLgbZ;L&{ax&TBv;m@z6RcbakF^el{!&)<___n#_|XR%jedxzfXG!a2Eyi)4g zYAWkYK{bQzhm|=>4+*SLTG2<#7g-{oB48b05=?PeW;Jo3ebWlo5y5|cl?p8)~PVZqiT^A~w-V*st8kV%%Et1(}x(mE0br-#hyPspVehofF`{gjFXla1lrqXJqQKE9M)8Xe0ZO&s$}Q zBTPjH>N!UU%bRFqaX(O9KMoG$Zy|xt-kCDjz(E*VDaI={%q? zURR{qi>G^wNteX|?&ZfhK-93KZlPXmGMsPd1o?*f_ej~TkoQ#no}~&#{O=>RadgtR zvig@~IZMsm3)vOr`>TGKD&fbRoB*0xhK7|R?Jh-NzkmR}H6lJiAZTIM1#AXE1LOGx zm7j;4b(Lu6d6GwtnsCvImB8%KJD+8z?W{_bDEB$ulcKP*v;c z*Ymsd)aP+t$dAfC-XnbwDx3HXKrB{91~O}OBx)fsb{s-qXkY<@QK7p-q-aaX&F?GS z2};`CqoNJ$<0DuM2!NCbtIpJ9*1a8?PH#bnF#xf~AYOIc4dx1Bw@K=)9bRX;ehYs; z$_=Ro(1!iIM=kZDlHFB>Ef46#rUwLM%)(#oAG(gYp>0tc##V{#aBl!q``!iIe1GBn z+6^G^5)(nr z8h#bm1ZzI450T?!EL)>RWX8VwT1X`2f;dW!{b~S>#$Pa~D6#Hp!;85XzluH%v5325 z730-aW?rY1!EAt;j7d23qfbMEyRZqxP};uID8xmG@mGw~3#2T^B~~14K5?&dP&H@r zL|aXJsEcAAXEXfu2d-!otZTV=if~^EQD*!NkUFQaheV&b-?-zH6JfjKO)aYN=Do*5 zYZ-@m#)5U0c&sUqu_%-Editr5#%Ne&bs)DxOj2_}`f;I_ReEY9U&Cf3rb>A3LK(ZD zid0_-3RfsS*t&g!zw}C_9u(_ze-vc1L59CdBl(IS^yrvsksfvjXfm>(lcol%L3))Q z@ZT;aumO3Q#8R!-)U697NBM@11jQ>lWBPs#?M4_(w=V_73rsiZh8awEm>q1phn1Ks ze@D|zskeome3uilE8-dgG(EojlI(@Yhfm}Xh_AgueHV`SL##I@?VR+bEHH=sh21A_ zhs&pIN7YTLcmJiyf4lZ;`?pN0`8@QbzDpmT`$m0CTrTMiCq%dE&Cd_{-h`I~f8Kps zAuZt4z)}@T>w$9V@iLi=mh({yiCl}}d>JN)z;*G<6&mgl(CYhJHCAPl=PYK2D>*F zy;YK=xS@1JW7i=C)T04(2P#|fowalY=`Y`G8?eRMAKt|ddG9UF^0M5 zW=ZGZ5qb-z@}iS`4RKXvuPIfzUHT)rv<8a|b?bgB3n=ziCiX4m2~CdVBKHWxw2+Hz zLvqoAij9(0moKoo2$`dqS0?5-(?^RXfcsQB6hU2SAgq8wyeasuyFGcK+@An?8ZzVw zW8wwbZB@i=<<4fA7JKPkki6y>>qO3_bW>-uQ*>9g+g7M0U^`RV)YTrGu2Q=2K>fiI zY0dFs>+}xuOZE^efLK2K6&X@>+y10Oqejnnq^NjfXt9JpK4K_E=cl29 z(t2P;kl4AK_Jg9v{1(z)ESpyo_(Z`74D&J1A#J?l5&J^Ad1sm5;Po@s9v7wOs(=_T zkutjt`BaxT09G{-r>yzyKLlM(k`GZl5m+Tgvq=IN|VjtJ*Zu66@#Rw;qdfZqi15A@fr^vz?071F5!T`s>Lx5!TszI%UK|7dDU;rUCwrRcLh!TZZ9$UMfo z@Qzjw>tKS3&-pyWS^p4mMtx`AvwxVc?g?#8aj@jQ#YKDG0aCx{pU+36?ctAiz=f$k z05S(b&VPQgA(Sm`oP&M^eiHvBe&PcTb+j$!!Yx(j3iI5zcQLOn(QqfX5OElbSsQBUw7);5C92onieJyx`p{V!iwXk)+1v zA6vStRZo0hc>m5yz-pkby#9`iG5+qJ{x>6I@qeAK zSBFylj8{FU*0YbFd2FZ6zdt^2p?V;3F~kap`UQgf@}c33+6xP)hK)fmDo@mm=`47* z9S6rnwCSL&aqgZs959!lhEZZp`*>V8ifNmL;cqajMuaJ~t`;jLPB?X~Ylk_Z#Q;%} zV+sAJ=4505-DdnIR=@D_a`Gy#RxtSX+i-zInO@LVDOd*p>M-|X(qRrZ3S(>(=Oj>} z89d75&n?m^j>;SOXM=)vNoum|3YmzxjYx%^AU*V|5v@SjBYtESp^yz?eQ#>5pnCj} zJ_WCw23wGd2AA-iBve8Hq8`%B3K4@9q@a}sf$49IA^IPsX@QK)36mrzqOv?R_n9K@ zw3=^_m#j{gNR0;&+F~wlS(i8IQN8mIvIO)mkx|e)u*y+xDie}%mkZ*m)BQM^$R@-g z1FrP0{8A?EcxtxxxX&J;393ljwwG?2A2?y-1M0-tw$?5ssoEsbPi?sd2!s~TrwPLF zYo-5XYV7AU-c|Vb-v;>pVi^CwX(Rpt<9{Ic?@<9SrNu>F(gwij%?dC9^!Xo90o1-| z&_aPKo%+xyw64e&v<}F^-7sO0Cz-VOF@7**i@v&(Oy4Q8PbV+4&rKwmYyokM z48OZ|^%*mC_Q)RJ31D#b4o4Jzr{~BX4D#swW<31;qCil2qlim;e=9ymJAEXfv-|h3 z)>uqQ5~S+8IgiWW28Fqbq+@ukCLy+k7eGa1i5#G_tAUquw$FjFvQt6~kWa69KXvAj z-knF`5yWMEJvCbTX!K{L)VeNF?(+s?eNjtE5ivg^-#937-l()2nKr#cHShB&Pl^l8 zVYws26D^7nXPlm<_DYU{iDS>6Bq0@QsN%6n>XHVvP<^rDWscC!c+LFrK#)T@$%_0{ zob%f&oaq>1_Z8Ata@Y2K6n?GYg|l8SgUr(}hi4D!@KL~hjRv<}ZZ`tCD^ev=H&^0pP%6q2e+t=Ua`ag8xqWvNnIvCU|6ZA^L5v{DD)!mcQ@n6{=; z#Z)PrAz>*+h-|IV!&J*f@{xb!L7h3{?FEs*ifw5z2U9$&OkYseI68yb=V4xv*VK3- zVxGhtmedujX32y-kC{5ej-Wy#JvB~4oxTb{|1H825_B(A0#?CjUTc=PrGh6jAgK9h zoLAe`+NBdStZE@Y8UH^Rd*|R-|7Ke}wr$(CZQHhO+upHlCp)%n+fH_}S8%^%xqhu%20_1p=x#Dl9ia`c3iM+9Vh5?gyY8M9c$tJ5>}V_sidHN zoMl%rSgSK!7+Y8tQkYq|;Vh`4by2uMsUfnxkk2{S@a>V#d}fv}Yud*>paVi_~T zU!GoYwWbnG%92!Cte(zhZX-i9#KJ;b{$(aZs|{MerP#6||UUx$=y)4XOb zihyKn`_QhJ#~@_peJ*8yD4>I7wQyKkZG%#FTKZfb(@G+9x7-3@hG}+ZC&$7DwbaB$ zC)jLj7yituY&WpOWlG7Z4Tuxzdwo6k!3lgwhh7BYMyB? zO9Q5nvn77~g~c623b`Pe5efNzYD#2Sfmg>aMB5s?4NC|-0pIXy%%`J;+E{(irb!Szc8M8A@!}0zqJLoG4SJ5$~1*yRo0^Z`uObA+= zV?1sYNvzvWbP%AsMzoIo3Cwx~y%i8rHF(BgLS>tH5Ab|1wp$X_3o2_VB(pFxgQ5QQ zk@)Vy95$b%HVf4@ppX(wrv^Jwfrsu+9N_OUm}nD7Ch_7STj66EYsZR#`9k|Tf^@p& ziHwnO$p{TB#R(Q{Os>Un~0!r$JO zLZ&F%SP|%$TuG)mFeOhKr1?S!aa0jTV$2XIeZb_fgO&n{8HTe9s`L&(tKoy?OaS^$ zLHNrgYgq920EI~M>LyU7gK70$7*`nFKD^d>MoEAhsBU0%@*RW@%T(J z?+wVbz=mcN%4#7qlCpl_^Ay7VB%?+uW1WSNnQOj^tALyqTpV zkEN2C;qO_W)MYl^Ow5I;t3;z#iG82F(qe}#QeE;AjA=wM==dB(Gu+ez*5|RVxO4}l zt`o?*B;);-0`vR(#+Q^L4WH_9wklh-S-L-_zd%Q0LZ%|H5=>Z)-x#Z+m%p&6$2ScV zEBneIGo)r0oT)xjze*Q~AIqhB%lOM5Id}^eKwS!?b_;B&TouZsemyL&y`)#FX}ZKp zp)ZnB*^)1P@2bCoe+Z|#KhTBNrT)UN@WIuudw})fwHl)re1|b~E1F=xpH?7L77p>5 zei$aD@KO0<+zo1<&7OuZatNsPq24Whu%0jD_ z$ZZy6MzayYgTJulNEy8D$F%JDYgx|d6{6kpDg#s170<15bM#4tzvrDU$6bvu-hH@6 zgcjq&3aR3k(23$FaUA|iuoy*bO{2F6W0<+ZdsYvXjc?d@ZT8kM!GD}r@qr;TF@0Hb z2Dz-A!HZ$-qJ?F%w6_`t`8xk$f$MNBfjqwvJiVdD+pf7NVFGh?O=qp2vh%UcYvc{rFldib~rkIlo`seU%pO_6hmBWGMcUhsBSWiQYYPMX<-Cjp49@7U==iS57bG zw3T9Nbm`)m9<<4e$U74`t~zRo0JSfi}=GdQXGLLPyW zlT^I}y=t$j{Vx!wN^z8X4l0|@RNrC#)G>bK)7IT7Qop>YdS^NnI3gfP>vtp)pXkr2WSVcAAv8uN>@ z`6)kICvNYU$DA8pnkl4sQopDC6<_M8zGJ^@ANXJL(yd#n1XFj9pH;rld*gwY8om_I zdB55w@FUQ_2k}d%HtQsmUx_7Mzftky&o2X2yDQrgGcehmrDDDtUJj5``AX$gzEbMc zUj2Qzp)Lo>y-O*@HJ|g9$GR2-jgjKfB68J6OlIg;4F2@2?FlW zqj|lO7A2Ts-Kd!SO|r9XLbPt_B~pBpF40xcr0h=a&$bg(cwjp>v%d~Uk-7GUWom?1 z92p+C0~)Og*-N~daT#gQdG{&dPRZso(#{jGeDb1G`N)^nFSB`{2-UQ&!fkPyK`m03 z_Di94`{-(%3nE4}7;4MZ)Pmawf#{}lyTSs5f(r;r1Dp4<;27K=F}Oga^VsUs3*NIn zOsYstpqpRF&rq^9>m50LRORj>=;{CV2&#C$-{M5{oY9biBSoQyXvugVcwyT-19S;pf!`GSNqb4**TI%Y z*zyV)XN3Fdp3RNNr9FU+cV*tt?4L8>D@kJp^rkf_rJ~DPYL}oJngd1^l!4ITQN`0RTT^iq4xMg|S6;d}lznE$Ip^8pW-CHu zP*^!U>Lcd3*shqa)pswq;y<|ISM1g1RG#`|MSPNAsw*XH1IAD(e(Kgqp6aDHgv>fI z!P67$z{#()Pdo3;4dUoy*Xor(O?+YTRPe=g*FfRj*9q9!8p%1l>g3e^rQ_nm{(@4t z?^nMDC2J8@my5q0QyCljCSp_@)No+6bZ*y)lSdrkLFcR6YOHu*vZ-q(C);5$MmM_z z1WT>Gc8g%`Rt~6*!}JhWi0=Rc_z5c8GR9YXW+cdoK~Ea(@wyXf|89HagNuFAO-V7k zUb|9zaCCWH3^Fz(m7$8K$|0ZOP!SNpgP!ql<)!z8w$Z$?9gq2f<~koe3|zD=imLfD z>IV5?SkRZ;7JlOG%z%Tlze$GXr0A}ResyF63ZGZVDLv2k4HWtoqoCaq+Z&GaVKuLA z>@zhNjYYc=sexH?;DTe4&2vnQE}C@UFo&|qcLddvH0FwswdRUc(p*X&IT^Zu>xLpG zn(@C%3ig(l2ZPm#Fc){+0b+%O7nt4zbOt+3@GQVm|1t70=-U(>yo3VY2`FnXFHUyi zwiqf(akt0kEE5_Pa-a*VCS}Pi6?`~P%bvX6UT~r-tUAY%I4XF3^nC+tf3alyL{M`w zv?aVQ#usdwpZmkrfv19O39}tQPQM+oY**a{X?@3Qe>r$+G!>r#?Id&U&m^HU(f= zjVpSi9M||1FyNQA&PO`*94&(qTTMQv3-z`bpCXs-3bX}#Ovqec<>omYhB*VrwxqjY zF3#OXFsj`h#G?F}UAilxTQ|78-edHc-Uc-LHaH*Y(K%R#dVw>_gz}kRD4s#+U&Pq= zps)kMf_t9`GHR7CO4zI8WVj0%qiSqy50N{e_5o#GrvNhMpJf5_sCPrEa%a@ltFnss ziaWh26vEW4fQp}qa4oP(l4xIMpA)~VHD9!lP%;Tm`(HD$jYMM-5Ag>S(gC35J35$%?^gk(r|`4Ewi-W z;f&;B*fO=kC@N=r<-#nGW|yXE;`zb0Y3TJOAkw1a$SQgoTawHZTck+V%T=spmP`^BHihc(jc+S1ObX%6AYQ6LVVc+BfM*P{2s0T2z zVIs*5{ql%#CKAzv0?@S+%||z;`dpfj0Y(VtA51n$j%sG5I%A|h98VU}PkVZFrk1*G zaw75v3(N50lanvr&ND4=7Db;HS4fpi)2vTME7aD2-8N5+kcOXmYCrLE?*5&dWhvB` zbD5)ADuIwwpS*Ms;1qyns(8&tZ*)0*&_lNa`_(phwqkL}h#WdX_ zyKg%+7vP>*&Fus9E4SqIN*Ms`QLB(YOnJ|md%U|X`r#tVN$#q6nEH1|blQ?9e(3|3 z`i#;GUl~v?I6&I6%YvkvmR?*l%&z)Pv8irzVQsWrZSr%aoYuPJa#EjK|4NmiuswK= zlKP2v&;yXv3>LQ$P){aYWrb)5GICwbj;ygw>*amKP;Z{xb^cF}O@IeQ^hB-OjEK{l z>#PNyLuVkeDroL9SK2*ChHmJJSkv@YRn7)E49fy!3tqhq`HtHs_(DK|2Lyv(%9L&f zSy+H}Uk{nE2^5h7zN7;{tP3)$1GK9Xcv^L48Sodg0}ZST@}x607yJo2O*XCfs7*wT@d?G^Q6QQRb!kVn?}iZLUVoyh8M4A^ElaHD*Nn2= zkfCS=(Bg9-Mck6K{ z%ZM59Rs4(j1tSG1B#wS=$kQfXSvw6V>A(IC@>F;5RrCos`N{>Oyg|o*qR2EJ>5Gpe ze~a4CB{mmDXC7C>uS@VL&t%X#&4k<`nDx;Zjmo%?A4fV3KOhBr;VuO!cvM8s2;pG5 zcAs!j?nshFQhNA`G3HMS z?8bfRyy1LwSYktu+I7Hurb-AIU9r|rl5nMd!S&!()6xYNJ1EqJd9BkjgDH@F*! zzjtj4ezywvlkV7X@dG^oOB}T76eK=y!YZB#53LhYsZuP&HdmVL>6kH8&xwa zxv8;t-AE>D5K<{`-({E0O4%fGiLVI8#GfZ0aXR6SfYiPUJKnujMoTI5El<1ZO9w|u zS3lJFx<7XUoUD(@)$pDcs3taMb*(v2yj#G)=Mz-1M1q@Tf4o{s9}Uj9Yo?8refJwV zJ;b+7kf0M}fluzHHHS!Ph8MGJxJNks7C$58^EmlaJcp`5nx+O7?J)4}1!Y>-GHf9o zk}oTyPa>+YC$)(Qm8|MhEWbj?XEq}R=0NFH@F3ymW>&KS!e&k5*05>V@O*~my_Th; zlP05~S5@q+XG>0EuSH!~gZe_@5Dbj}oNIiPJpEOip+3l!gyze@%qOkmjmx=?FWJLF zj?b}f8Vet*yYd16KmM43rVfZo?rz3u|L6Foi*GQe4+{REUv9*}d?%a{%=8|i;I!aT z7Wxm}QJC`?cEt9+$@kSkB!@`TKZz1|yrA1^*7geq zD5Kx-zf|pvWA+8s$egLrb=kY385v2WCGL{y4I15NCz5NMnyXP_^@rsP#LN$%`2+AL zJaUyV<5;B^7f+pLzTN50Z~6KC0WI<|#bMfv+JiP3RTN^2!a7*oi+@v3w*sm5#|7zz zosF*{&;fHBXn2@uguQ1IDsh(oJzH#i4%pk;Qh^T zfQLyOW;E*NqU!Fki*f-T4j(?C$lY2CT{e!uW}8E(evb3!S%>v^NtNy@BTYAD;DkVo zn9ehVGaO7s?PQBP{p%b#orGi6Y&~<;D%XLWdUi}`Nu-(U$wBBTt*|N4##sm2JSuWc)TRoYg57cM*VDGj~ka<=&JF zo8=4>Z8F`wA?AUHtoi$_hHoK!3v?l*P0$g^yipOWlcex4?N2?Ewb1U=lu}0`QICA4 zef61j-^1p}hkA*0_(esa!p%dX6%-1e-eMfQsIp6wRgtE=6=hDe`&jel{y=6x5;78s z?5^{J|t!#x1aS8<3C`v%E%u{*wZwSXr$0Owl5_ zmXh>D>C_SjOCL^CyGZpBpM5`eymt{*rf~9`%F&&o7*S!H%3X)7~QFgn^J>6 zD+yV}u{HN-x9*_$R;a+k?4k*1f)rE~K|QvcC3dlr>!nftB?gE-cfcPMj&9mRl>|Lg zQyCe|&SuZopU0>IfRmcV3^_mhueN5oQ=J+H4%UsSIum4r4!`^DJqZr?1j3BU)Ttzg z6LwM)W&UEMIe*H2T6|{rQ;x9qGbp7ca#-!Egm4|ECNTMN);`>2Q&%|BpOdIJ4l|fp zk!qEhl;n(Y7~R1YNt7FnY10bQZXRna2X`E_D1f*}v1bW^lJorDD0_p2Rkr32n}hY! zCDB(t$)4YOd)97R60gfg3|wrlsVs#4=poh4JS7Ykg$H)vE#B|YFrxU-$Ae^~62e;! zK9mwxK?dV4(|0_sv(zY&mzkf{x@!T8@}Z6Bf)#sfGy#XyRS1{$Bl(6&+db=>uy-@y z$Eq~9fYX$06>PSKAs#|7RqJ3GFb;@(^e`jpo-14%^{|%}&|6h{CD(w@8(bu-m=dVl zoWmYtxTjwKlI!^nwJ}^+ql`&fE#pcj*3I|_Z>#y##e@AvnlSN4po#4N#}WT)V5oNP zkG+h_Yb=fB$)i`e2Fd28kS$;$*_sI;o0Xoj#uVAtsB6CjX&|;Bk}HzQ*hJ!HDQ&qZ z^qf{}c`l^h5sg-i(pEg#_9aW(yTi?#WH=48?2Hfl_X+(SfW)_c48bG5Bf+MDNp>Y#Mpil%{IzCXD&azAq4&1U10=$#ETJzev$)C*S;Pr9papU3OabRQk_toRZ!Ge(4-=Ki8Db?eSBq~ZT#ufL6SKaXZ+9rA~ zQwyTQTI7*NXOhn?^$QOU>Y6PyCFP|pg;wi8VZ5Z$)7+(I_9cy--(;T#c9SO;Hk~|_ z0tEQ)?geu8C(E$>e1wy%f@o;Ar2e#3HZP$I#+9ar9bDa(RUOA+y!oB;NEBQ`VMb@_ zLFj{syU4mN%9GF;zCwNbx@^)jkv$|vFtbtbi7_odG)9s=q(-PtOnIVcwy(FxnEZm&O^y`vwRfhB z7Urcums9SQS6(swAgl?S|WDGUTFQu51yG$8069U zviuZ=@J&7tQ8DZG<(a->RzV+sUrmH$WG+QvZmUJhT*IoR3#3{ugW%XG0s?_ycS6V6 zS)019<_Rl@DN~8K4#w3g_lvRm4mK3&jmI$mwROr0>D`mX+228Dw4r;mvx7df zy~$zP8NjVX?xkGFaV>|BLuXMQ+BN+MMrIB4S6X)p&5l$;6=S8oI9qi&1iQbs?TroDMfCmIeJ}pbVVtVqHhS(zutEy6#UjTk29-+3@W0`KfehW`@np zhhu#)O&g%r)hTj4b$CY41NYp_)7!bYyG;v(rts z^}YDJt2W88H^H;e$LSm3dh=~yi@)mzJtEfW8=4avbeOE&;Oc>-6OHO+MW`XBZ4rO6 zS;nAi**w3Yso4&Ty+8f$uvT?Z)eaLe$KW1I~9YM2zeTIT}C%_G6FPH-s5Wi3r`=I&juGTfl zZ;4qFZV|6V0c&>t!Y>mvGx#1WWL0N5evV=u28K9**dv`}U3tJ$W?>3InXiwyc)SA% zcnH}(zb0@&wmE>J07n#DOs7~lw>5qUY0(JDQszC~KAAM}Bmd-2tGIzUpO@|yGBrJyXGJk3d+7 zJBN0$?Se(rEb0-z2m%CBd;~_4aH04%9UnSc4KP!FDAM5F_EFujJZ!KDR-fn181GX` z8A?8BUYV}D9bCE0eV~M>9SPag%iVCLWOYQJDzC4~B~Ct0{H7x|kOmVcTQ;esvyHJC zi$H0R73Z8+Z!9^3|2tNut#&MVKbm`8?65s)UM8rg6uE(|e^DYqvoc15-f;u8c=>3;Viz*T# zN%!T+Hex0>>_gUKs%+lgY9jo6CnxL6qnQ>C*RseLWRpipqI;AQE7;LUwL`zM%b`Vu z%Sa-+?a#+=)HaD|k2%_(b;pHRF96(c;QyPl6XHL8IqGQKC$M8R=US-c8;hUe?LKo&l!{V)8d&55sUXEu z5uITcO~`ipddh+Nr{7ibp^Wd{bU)^3##<5`lkuqfckxEU*9{pgNpTB2=ku1c-|3dK z|LIQF=ld@I7swq^4|G1VA}BK85&>2p#*P95W`I1FF(8G9vfNJ6MoN$+C^M89u!X=< zJSS%l?Qj>$J%9?0#0&S6#*h*(-9Z$}q*G#hP?cX7cAvM0eiVFhJJ~$`iZM!N5NhDb zi<1u_m#?jzpIaOe7h|Kiap#mHA`L|)ATnPJ7du{^ybuNx@1jA+V1l8ux#{LJ#teM(6=%gZcMq24J$2p z`wcC!qRssmwUv4H6Psw{(YdDNOv$!sq&O1SvIS}fCKZa+`T=Ayt@uZjQqEC{@Uj+| z!;i3W+p~=@fqEEhW@gT^JtCR<`m`i|Htg<TSJ&v`p;55ed zt@a|)70mq;#RP@=%76*iz>fAr7FKd|X8*@?9sWOFf$gbH$XFG zcUNu#=_+ovUd>FW*twO`+NSo*bcea=nbQ_gu^C7iR*dZtYbMkXL5mB@4a3@0wnwH! z(fZKLy+yfQRd%}-!aPC z4GB%OvPHXl(^H(BwVr6u6s=I;`SHQ1um7GPCdP-BjO%OQUH!_UKbEGvHCY}{OL`8FU$GZ;Y$SlS$-0VjK%lCP?U0shcadt4x7lN4%V}wBrLEbiEcK-OHl+pcBNSqN#mftpRj2A4Q z+av@-<#t_Dj_FN^O2~wq(ij1O*+=RVl+6gNV^~CI1UED- zn^zN@UOq8?q58b^4RA>lV}x;jA2OE=SqMYV9P#RsUlI+pp!y*jpwHgp-w3i$V)%?L z>irn1pnRc|P@r|Z0pCeMZ*k$}$`1GVGCT&QtJ`V%Mq!TXoge?8Fjn$bz}NqDn*2ZQ z$p3@F_^(}IVS76>OLNzs`O5!pF=LZ$<&gyuM$HQzHx8ww^FVxnP%Yv2i=m*1ASF~~ zP=!H}b`xl`k0pL5byku2QOS~!_1po!6vQyQL#LQ#rIRr?G5^W?yuNvw-PP{}%m35i$i+I?DJ%RGRcqekT#X~CxOjkV1UQrd&m_bbJ+gsSGbPwKS{F& zU-`QNw!*yq#Co#{)2JvP-6>lY$J$2u+e=r0&kEc#j#jh@4Tp;l*s<28wU%r= zezVPG^r*a?&Fn_(M|A7^xTPD998E-)-A4agNwT?=>FbrHz8w~w?hWBeHVYM()|buJ zvGv4j<%!U_Rh^ZKi~2(h1vk-?o9;`*Zc}m5#o@a1ncp)}rO2SDD9y!nT$_Eb%h`>% zDmssJ8Dl=gDn<-7Ug$~nTaRzd?CJh;?}nCco$7Pz<#J8;YL40#VFbAG|4nA$co;l^byBOT2Ki@gAO!{xU7-TY|rujdYTaWV(Rr{Jwu?(_TA zDR1|~ExJBfJ?MAReMF47u!oEw>JHVREmROknZUs2>yaboEyVs$Pg1f6vs06gCQp$b z?##4PWI#BxjCAVl>46V_dm4?uw=Y@h#}ER4|ACU{lddiweg`vq>gmB25`XuhNai1- zjt{?&%;TRFE+2Y_Gn;p^&&|bU44M=`9!Mc%NbHv|2E4!2+dUL z>6be$Kh|Duz}+)(R7WXsh!m`+#t^Its($x`pqDaN-^E z?*a=0Ck^rZBLQV~jY-SBliN&7%-y3s@FB;X)z(t&D=~@U0vT%xfcu`Lix=W#WVE{{ z2=C~L$>`~@JCIg8RAyk= zYG`(@w4H95n0@Fqv16~nlDU!+QZw&#w@K)hv!V>zA!ZOL$1Iykd&Su3rEln@(gxO| zxWc++T-rQEIL+j7i`TeatMfp4z7Ir31(TE4+_Ds@M|-+cwQg(z>s=S}gsSz{X*Wm+ ziKJWgOd`5^o|5a#i%?Gvw~8e?Rpi7C>nQ5dvPHVTO$PI^mnJ*7?gd3RD{|c_a>WrXT#Es3d}(k z$wpmA#$Q^zFclx{-GUL_M$i0&mRQMd4J#xq-5es)yD{kYCP1s!An(~K5JDRkv6DUSKgo^s@lVM5|V4mWjNZp zsuw^##l%rbRDKglQyj?YT!nk$lNUzh%kH705HWhiMuv(5a<~yoRDM&oCqm+1#S~|8 zA$g2Xr=}p_FX%Eaq{tUO9i*Q1i!>$+1JYZCL}flWRvF0y1=#D#y-JQTwx6uP-(bC} z_uP7)c;Xd`C6k#JVW?#Id7-|`uW+hN0>OM=C2Ta^4?G zr;EvxJ{%l|8D-heRYRM%f*LBC)krHZJ@%&CL0)FADWh14&7KV<9km6gE=o9(7keg~^rIQtthK^_8%Jk&aZLY_bc6SbY>IcwDK9{sV*t1GfKwf8aCo8t za)yALEi^-WXb!k6n>W-62Z^n8hO|eRYr&uZiW5d_URi??nl*aGu?ioQ+9RF9u8kwD z6UZ6HVd(G%l9>y7E)uyn?gAJMKeki0@tG*jdcE-}K?8(D-&n=Ld1i=A1AI<1z>u5p=B z<1}|q3@2jNxW-}Q4z~s|j&^Qc;nXIdS3K8caP_07#ig} z#KAD&ue2jXc&K#Q`Hy#x+LeT4HHUCzi1e?*3w{tK+5Tij(#2l2%p#YGI-b~{5{aS8 z!jABC*n6y~W|h;P!kn(a4$Ri2G118!?0WHDNn((QDJP^I{{wPf<^efQWW?zS>VS?X zfIUgCS{7oV$|7z2hJBt+pp1CPx4L{B_yC3oWdE)d)20WG6m5qknl}8@;kjPJE@!xP zV(Nkv^-Vz>DuwBXmKT(z>57*D<$u=Blt)IS-RK0j89omD{5Ya*ULWkoO)qeM_*)jF zIn87l{kXPp=}4ufM1h7t(lAL?-kEq>_DE-in8-!@+>E1+gCV9Fq)5V3SY?**;AKq0 zIpQ(1u*3MVh#tHRu5E5=B{W-QOI34plm`#uH(mk*;9&Re%?|v-=fvb;?qvVL@gc|l z8^L?2_0ZrVFS-stRY(E>UiQeG_sMrw5UiO znGFLOP-GO{JtBM@!)Q37k3G_p&JhdwPwtJS6@R4_($Ut^b!8HP{52-tkue8MG=Zwr z7u6WaFranJq4oNadY)>_6d~?pKVxg$2Uz`zZPnZVHOh-;M|H7qbV0OF8}z;ZPoI+| z(`e}bn6u*kJpRLC>OZ}gX#eHCMEk#d8y$XzSU;QZ|An$pQ%uZC$=Ki!h@&m8$5(xCtGaY3X1FsU?l5w^Fr{Q-?+EbUBxx+b?D z80o*@qg0juG;aZhj=tO=YHjfo=1+-NqLME~Kw7Y1A*?}M7#cOyT(vd$1tVPKKd@U! z&oV!RzZcK6gPWj`*8FIAy2I&x``h_sXPe*O{|ih(Y+V3|o68MWq~2Iy^iQ8RqK76f zC$1+hXqd^jsz`U{+EFo^VQNrLZt#R`qE*>2-Ip&(@6FmtAngx@+YnG}b5B9Y)^wg#oc z24KlT2s!H_4ZR^1_nDX#UH4(UTgl603&Q3g{G4!?6Sl9Om=Sy|8CjWO>d@e9?Q%s- z-OS3*W_H7*LW|Ne{b+^#LqQ}UKDmiZDma@no2!ydO^jcm>+z379K%=Ifs{20mT|xh zP$e7P=?N(tW4PMHJOQ`a8?n}>^&@<`1Rgo`aRevPp^1n7ibeS6sc8^GPe>c&{Kc+R z^2_F~K=HVI45Pf|<3)^;I{?H}vU7-QK3L1nHpcn3!1_)<$V;e0d_b8^d1T==rVpky zZTn~UvKrjdr11k}UO@o>aR2wn{jX5`KQQM1J1A?^wAFvi&A#NA#`_qKksu`sQ0tdM ziif17TO<{wDq_Q;OM}+1xMji^5X=syK=$QdZnS#dwe$;JYC7JozV8KpwfV}?As|^! zFlln0UitprIpuzLd$`<{_XoUV>rrHgc{cUQH-Px#(_Ul%=#ENrfJe@MRP_$E@FLMa zI`(J)Imw$o427@Oc^3(U&vz}<3Lfmy7diVpJJJ@gA>e;q-&gj zcGcBC_luF%_;**EB?o--G?AkaruJ%-b*8aX$4E+-?V@RWMnjHJ;hx27Vd7l0nUUY( z6OQb&8g8cvN3LZ%^xvIav*X|Epqm@yrTZk9U{GSZXAUJt8Lh(%7?Eaf&AzmXOVvU| zmz<@l1oMe#^POR38KT6q3@c`{%eYNu4ccurv`q?b5DzLxENjSfYOJHAI$MbSNgB*D zJsP>i*BgrFlIn?x&DH9x~UbPBtMFj{_vJ#CaAF>1$oE&k`EF&L@HCa@mN>Q7~!RU>7 zW%fv84aCKSgBacmuvg}r@)YKqO$U{D5|!`vG-Gp%An}raz2gESWm0Exhux4C)zE}} z_@kn z3t}bvm?L+@@az@<*jG>(Xopq&c*;^mttlJ!mv;5k6o%Ac<_`o`4G3qzzo(GO{!&F8 zW+~bF?S;7gO1dQ@>gwZ?iIHjE#^@;Ix!Z`R6{RYLlGB&v4A)ha(2hc`RGV-8`LcvSf+Y@lhT%(Z7$tWEF;cZs2{B|9k#&C}sPyr; zd-g~${TqY7E$9X+h4_(yMxQ%q;tm(h(lKzK)2FQ%k#b2}aMy+a=LHYgk?1|1VQ=&e z9)olOA5H}UD{%nu+!3^HsrBoX^D9Iy0pw!xNGXB6bPSpKDAaun{!fT~Z~`xp&Ii~k zdac?&*lkM+k_&+4oc6=KJ6RwIkB|st@DiQ!4`sI;@40>%zAG^!oG2@ z@eBM$2PJ@F&_3_}oc8A*7mp-0bWng^he9UYX#Ph*JL+<>y+moP^xvQF!MD_)h@b}c2GVX8Ez`x!kjAIV>y9h;2EgwMhDc~tn<2~`lf9j8-Q~yL zM=!Ahm|3JL3?@Tt(OuDDfljlbbN@nIgn#k+7VC+Ko;@iKi>~ovA)(M6rz5KP(yiH| z#iwJqOB7VmFZ#6qI~93C`&qTxT(*Q@om-Xb%ntm_?E;|58Ipd1F!r>^vEjy}*M^E(WslbfLE z<+71#sY~m$gZvoRX@=^FY}X?5qoU|Vg8(o`Om5RM6I(baU^6HmB<+n9rBl@N$CmP41^s?s1ey}wu3r3 z4~1dkyi%kA#*pLQy0phlXa-u(oK2Dwzhuex$YZv=*t*Tg5=n~H=}fJA!p2L78y3D2 zimkqC1gTU(0q||k9QM#><$b-Ilw#Ut2>JF=T^qN34^qcBEd={! zB)rxUbM2IwvMo?S;Id^aglw}-t9et}@TP;!QlFoqqcs(-HfNt9VqGFJ4*Ko*Kk#*B zGpJ>tA9(=t|4#M!kBaf%{$Kfj3-uf|ZFgiU`Bo>%k_OuAp~vnE^_Tg8*% z*?)4JdzyMTzvNDy{r$c``zBw=Vr)6c4}CBIv#mw()3h7`?V-;LF?J&N5a>kjpy;9n zQyXvuu`n?+W84QV=(i`JEJY=}Ak+u4>!Lyt2P!$nBl}T=^|pG*z@)_l!)OKB{tIV&&E@hj=OIhSBHgPV~X=R3NrTMh?VzDm?1yW^IJ&zzAn2{8rE~MRX5EE)a(-T&oE)1J4pGXBYi+nexX-?5! z{EZ4Ju=Y8MQ87=uNc2t^7@X)?85KeSoc`?BmCD;Uv_cwQaLyc}vvnJKHV zuK)H_d)xhGKB!_pRXv{$XgfZ_(8G%N3o$ZI#_ zixQj~so0*m^iuA!bT>&8R@>b%#B~zbIlwt4Ba0v&>B(`*Z;~?6!>-aQ zal+Qt4^dCcjZZMd4b4Khg~(GP#8$3BeB8j!-6l?*##)H?J$PeUy)cA_I26#0aggao zaM5PweS_Sb@{OZ@Uw*(!DNV)KTQU+BTRi?AUAv0Vowth`7mr9)ZVC+TI?@; zWGL&zydnsuE3+D7#U~P%PrxpD3nTc9#mm621iX*?ZMS_Q#n9SzOJ~Hg@`rX{d?qJ; zt}`76!H)MX#=VKifJZP$3<8@}0-llthFpq3FV;(UP$-k63MkHHq~J&}d?C<+c~*Zk z<#G&>AD7EoiAVO38TO2TOBKN>6N|JS*{+`}V-)T0j(bAzGlEUWEvWLrMOIItYexh) z?he>SJk*#bywgDF6+*&%>n%0`-3tOY72+n&Q1NJ`A-bX*2tJV(@;%b6&RxMcUd7+# z@UzOmc9DolSHc-D$5(GouinaE%&uOVMyD&CTdKaEB{Qap4_wU7_=23CULKQ;jmZuV;+Y$(`#Gh0@}s7-!qk-^&#IG>7B{yft?UoA)H5 z|B0u3Tu0TF{AB0jpT|E&RsYB$3WiQU^5p*|f)^Si_#^j+Ao^|5(gNjn+!0|NtXDt* z5fwxpajl@e0FrdEuj2s#Pg>gUvJdko9RBwEe_4@?aEM?SiA2nvm^tsLML{-AvBWM7 z_bm7%tu*MaJkUWd#?GWVrqaQ0>B%Azkxj+Yidvc$XdG1{@$U~uF|1oovneldx`h;9 zB1>H;;n1_5(h`2ECl?bu-sSY@d!QTa`3DrNj_F@vUIdW5{R7$|K{fN11_l7={h7@D z4}I;wCCq>QR6(;JbVbb4$=OBO)#zVu|0iK~SnW~{SrOq&j*_>YRzU&bHUhPPwiy($ zK0qin8U;#F@@}_P_flw`bW_v^G;ct?Pb65%=%egDBgS#YF3?E36$9xzdvYqjAZoK#hcjctJu~MF^S*$q3`o2;!L|jPnM1x*Q~qF%BH(5UDFYglsJwO zEdEuB7NihnTXK6$)F~``nmSQNFP7x7hE{WuOjTAhEjGw#XxvL@S;aZYuyu9)!yZ~X zo35D6Cwb8`shRXCCR;xlR`n`cs4aie!SSM`0)x3ykwM*k zK~w^4x2u#=jEEi`3Q9AU!wE)Zpn#)0!*~)(T^SEjIJveav(d1$RaSMC0|}<)?}nSG zRC2xEBN_YAsuKyl_3yDt%W^F`J-TyeGrcfboC_0Ta=KcW_?~RLb>xbqIVI6`%iWz; zM8Kq9QzwO8w!TntqcB;gNuV$gd+N|(4?6A9GEzYs z5f4(*N5}&ObeYA~I28r;?pKUj4N6}iloE=ok%1|X()Ahdwir?xf6QJfY7owe>pPj)Me*}c^%W-pP6`dnX1&6 z`b#*_P0PeM+1FR)t)Rnr22f!@UFBW!TxgjV)u0%_C~gIbb_D3aPhZ~Wmex0)Lj`VoZKjoW)dUoKY6*| z0|V)|XyjiKgZ}s5(SN?te*muif87vD_(wYOiOjOKNI4L*aK||2$~;s25HS#iY6r=)WW8a^dkd0Y|pPc1-9jmy&wqoCbL84`C94At6$lm_o!8m*did^?o$m?ozIp{RmZ*M%YMX_i$KYkz_Q)QK?Fdm)REqf*f=@>C-SnW{Lb;yYfk&2nAC~b}&B@@^fY7g;n(FVh_hy zW}ifIO9T7nSBHBQP5%-&GF8@A-!%wJAjDn{gAg=lV6IJv!|-QEXT+O>3yoZNCSD3V zG$B?5Xl20xQT?c%cCh?mParFHBsMGB=_5hl#!$W@JHM-vKkiwYqr8kZJ06n%w|-bS zE?p&12hR2B+YB$0GQd;40fJd6#37-qd1}xc1mNCeC%PDxb zlK=X|WE*qn2fROb4{oXtJZSyjOFleI3i8RBZ?2u?EEL1W-~L%7<`H6Vp0;cz5vv`7jlTXf-7XGwp}3|Xl6tNaII3GC z9y1w*@jFLl2iFA!<5AQ~e@S|uK4WL9<$R^??V^aM?Bgy=#|wl$D2P$o;06>{f)P+X z91};NrzVV+)b}k2#rYLF0X0-A+eRul=opDju)g0+vd79B%i!Y}*&a^L$_|C&jQN^j z9q#4<(4)3qNst^+ZYpyVF2hP;DN|OMxM9w(+)%kFQRcYVI zO-frej9x6a%-D%Xuwedcw9#3VSVkOjNF!BYRoY1KD3wFJ%?ML*3QwcarMK)@v`o%s z$w=NLrO>og`nRJpZZ(%~*hNJU#Y~k;_Ci3~gc=4UQO!Ydje^?=W^DgCKyO;Zz4LgQ zKtm($MdY;UZ((U_g5*pMY+dYGyyT1ERkaj`U#S-2yyJ47wMonCpV+2rI8zPNHDfo& zc59dFz*2#^A-R?P6Np}jhDLi4&vP%$NW#8J>=CLj1mlf$XzmQezH*F1jNOiPgXl2j zzD07AKLT*h$CA*OsOba2etPLU%|p?=XhplXo?vOu@q0{QBo++)@6U?YKv_)GFK(^Y zm&uFBbrQyzJm;c49O00PIt;|{&ei%VSS%Y3m3#~L#(3%Gso^a4#9AaB$w@vnAvdr6 z%!2#)YS0HFt%o)q6~BelT;?%oUjX%9qQCn#-~+TM(a^s%Y>&aBkL(UY{+?a9@&Q+a;t%c_6u^6_r@>MEAN9ir5q=Yo|R8z4lKYd1sv^LyTozFn$KqaJ>? zoH&+`AX>E03Gv=71+NZK2>!-NasKeCfMp;@5rZ z*m<}q2!$AgKUwWRXTVHs!E>`FcMT|fzJo30W551|6RoE#Q0WPD$fdA>IRD-C=ae&$=Fuzc6q1CNF>b3z_c<9!;))OViz@ zP58XOt`WOQS)r@tD0IiEIo4Umc(5f%J1p{y4F(1&3AzeAP%V)e#}>2%8W9~x^l}S4 zUOc9^;@m{eUDGL={35TN0+kQbN$X~)P>~L?3FD>s;=PIq9f{Xsl)b7D@8JW{!WVi=s?aqGVKrSJB zO-V&R>_|3@u=MEV1AF%!V*;mZS=ZK9u5OVbETOE$9JhOs!YRxgwRS9XMQ0TArkAi< zu1EC{6!O{djvwxWk_cF`2JgB zE{oo?Cyjy5@Et}<6+>vsYWY3T7S-EcO?8lrm&3!318GR}f~VZMy+(GQ#X9yLEXnnX z7)UaEJSIHQtj5?O(ZJQ{0W{^JrD=EqH_h`gxh^HS!~)?S)s<7ox3eeb7lS!XiKNiWDj5!S1ZVr8m*Vm(LX=PFO>N%y7l+73j-eS1>v0g}5&G zp?qu*PR0C>)@9!mP#acrxNj`*gh}21yrvqyhpQQK)U6|hk1wt3`@h^0-$GQCE z^f#SJiU zb@27$QZ^SVuNSI7qoRcwiH6H(ax|Xx!@g__4i%NN5wu0;mM`CSTZjJw96htSu%C7? z#pPQ9o4xEOJ#DT#KRu9mzu!GH0jb{vhP$nkD}v`n1`tnnNls#^_AN-c~PD;MVeGMBhLT0Ce2O2nwYOlg39xtI24v>pzQ zanl2Vr$77%weA<>>iVZQ&*K9_hfmv=tXiu#PVzNA;M@2}l&vaQsh84GX_+hrIfZC= z0Se*ilv-%zoXRHyvAQW9nOI2C$%DlFH1%zP-4r8bEfHjB3;8{WH`gOYt zg+fX)HIleuMKewYtjg+cSVRUIxAD9xCn+MT zs`DA7)Wx;B`ycL8Q&dR8+8mfhK;a^Rw9 zh9tC~qa>%5T{^8THrj^VEl5Do4j4h@nkrBG6+k8CDD~KB=57m@BL-)vXGkKIuVO9v z7t_L5rpY^0y=uu5iNw0v&Ca-zWk>v;fLJ=+SaV&V#C-o^}8 zp&Xp$v?~ccnfR=&5Df)32^d6QJLg*iuF#s|0M4zJF@Hza1p`q|f}~K)q;HC*I1_9t zQ&1jr9-kdUi8)DGxiwdqU|rPxYWDQPWY&SI&Rxkhxobp~C=Y*`d?HD4JW?WjU7dBPeuIE`ABLq95b#lfKS52IB^6KoHmm60$R}TESplQt59#mboJj+Na!P)V{ic@$yQ-&Z za^JU0T+n0Lf2VdusoNr0?g~1DMsY)zdY-63yH!Ii#aWe|;0TO>L7#YlaDrH}xvYXn zh-NYa>O>f_NTTBG=|k0qWH+X?d5@+INsQ}WcI_3z1Z4-%Gj#_{P$0A~cAye`?j0cW z8)hd(V}7rattLUSMvgZ4g96P7n` z^{55A&&29;-P992{yhkGWa3v_Z6iB4a&~NmL)IpC&dsSwe$9jS(4RVJGt=Y!b-O~1 zSCl@wlaba_cA*yt(QvulMcLUuK z>(ys_!{vqKy{%%~d#4ibQ5$yKn6|4Ky0_ngH>x-}h3pHzRt;iqs}KzajS!i!Pqs8c zCP%xI*d=F=6za_0g`{ZO^mAwRk0iwkzKB7D)SaLR0h|ovGF2w9C9g8;f#EtDN*vBP9yl;n=;B2a7#E8(%Bw()z(M$_pu zQ+9uFnlJ!5&$kk^S_+kJ>r9y8MFPpSf9;o8v;ZxsMA!p>eaAIwt5xNiQ|2_ydGkbi zkggG;Xp&I7C8R{>ten^j@MsN#V5JPs1Ezc!74->Nh0a}U){OK@j=OIoY}C7IYYd8-V9 zQ6s?v=Y7(?Y$7=P#Wwub-*0DLqli?I%kT-D^jqK?c2~HEx<2(poRWAUoC}!~6$1=I z*M(IfPmdID8i+5l@=1(+`?i`G_ew=1Y!gF?tFbdgtW2etKLOFoNozkH(i!Qa7(h^| zF`9!VeqQQwM+yO6J`;oWUWq@9l6hP~FiG8-{Pj*T`XI3~s@FfjW2Tl(llpa901$&y`F}K1uZuHEo;=mr+_8d(o z2Be#yWHEN@euC$=VUSB+3A}khJdF$)0r#<5(f3n`kx>ZT8ifaKyX*OhffeHH1?6OM z*-19$j5tMNYQoB)>cGpz@11>J%q4KW`GLNj?uB>LcNg$0G@}XN#Tqf2F5@jv<`|~p zqB^l!%v!g{R_+0GX5z0>3Q~O``%T$NFc==dsPsTj-;{b$XUS0TGoJs2BUA*H;4S?w z|Nigt|F@9hf7QLSo}JPEK#CPgYgTjrdCSChx0yJeRdbXipF(OwV)ZvghYba)5NZxS zm=L8k_7Lb?f8`=vpv(@m%gzsCs9^E$D5Jn+sf}1lep*zz&5V?~qi_@B?-$Vd1ti(rCi*I0}c}slKv@H_+g?#yarVzpYZN zIk21Bz9Z#WOF`JG&TC&C%a*3*`)GJx9I!U8+!#J4}@5rm8*jK%Xg2VLjP-a;H zFydWO;nxOZ&|{yOW;ta$ZU^6*4vFP)idD6M*M0+9buB#hK4z%YTGBdSva?Pvxim2` zF-?QVGuRQ2-1eYzd1Y%}w^`t1S7|{{8=Es#ApC0<;pc$|NJ)IU%WVK+4gnTWA7-t1 z0K{DCESXb}!y_tzrycr^%%|G4T4)`$BC8+qm|n1lS?CO=`V`1T#ykY#5g5$dc$lGt zqGHyw-*Av%C;33nEiU(rU?w^3F46!dEz#cHd3IF<(XCq)>JG?Bi)4v26MQr1A-g5RqhFoPy%^TD3sa|D^9aS>>_2-X2i#? ztVp@ZkyMB;Uo#9s!R!@G#CCaFVaxx*8YYu$kGFk4g3|9t!1nKqOaDBAe;w!(6#w)0 z?{&F2BgctT1=Z;TvjOGL_!}Vlt=kaLA7#W`mv1h%hUg983!wA*K@_r6_cd6o z6LHiCE6qwlt2H&|Ica~%b9C?Z@$dreBNR_!NKcfL)%8kGr7!IVq|^&6PKYK%EhcKu z6+uR*%EOw=rF6Q42Mx|a> z$2XrM*NV2x9ci6|X^eh1UAbJ9Ky!#*Q5w7)#o#%}d!#-^k8To=n8{UU*LmFsS-wRj zi6-p76V6g?If3S&Bj~GW&QI_WtyPY0@u3hjKtqf9`8S!wn{@P&Tc8uu8cf)YmrX7+ zrC+O3V{9}JG6ihA&^2Q7@)Kq)j(Y_oTzsoBUYQDG!}`Ame`bbcr>J-6E%gaBPEDCU zflX#1-)Ih^HJV*lew*N_SdG-4!b2}G8%U&9_V0~Qt?ZS z@H3L&5ybV8X}A@KQADl93H`}0qkNm!jGHkCJUM%r8`mP1nV?Oo%^l;yDnU6IJtbuY z`X2Sf8|r00mB_f)Q0;S{FqS1Yq?otd-BVbw`#@SDd5}n5X4lqdDi1*vtVv8-Zi10q zexCj0eyngrp`UxjEOrdzUt`?%jRlj7zSU-V-%R?y+_w7P7f1ge%t1ozmN+&)%3xQW zT3u@)))(_a<6`lTJd`DIYw>(pkb=PMKvCNEG~zza+LVNqkY^}QoGMVdS0K;gS*A3f z;6Ua!^sSV-try(M^pB6D9dsX}c>$Da#NHucp9vr(fg4pbBR*uPhYq+N>q1X4RSOCl znIQj4=A+y+8{?LQ$3L@(!Yy~~Cu4Sx72*%@dW>eP%Br7=uaynV6Mqa-49A9) z|L&5r=4K5SClwc`!2J|>(#n$4y1>lmR~2Om8q6HkcpK>d(Fk!T^NO?hM4Fc+(5J{` z&K|vrBz;;zWlNO%=a~JkMxMiZa%wYz#G901lw#+2SUaMMHrebb&|1L8tKoGJK*QhJ zU9|WkDy^-4F6U&VYSc3ScHDk@kV^0801#I|-pSK%az5=DwI}gMm)@s2O+-ESTk?QY z;y9gyucaXO(Cc+cd{B>2)euMHFT71$a6DssWU>>oLw4E-7>FC-YgZH1QAbRwmdahD zO4KAeuA^0q&yWS|zLTx%(P4VOqZv-^BO`0OFAXdBNt9>LAXmPALi3b|gt{b?e-$z0 z4n7H$eg6y_zs(c>*4FT!kN*$H`43~1p!g;IZ8-mYbUPTejaLW#BZnAPFES?ApM{TQ zE*TC%O8)apqcX|PrNjIZE-z{q`I(LwIE0kf=PLjExEX>)oIu><<@lt>-Ng9i$Lrk( znGXl|i4dP;Mt^-IbEp7K0e#*c7By@gCo@VQIW$93ujLL`)lMbA9R?C_5u~7^KopaAMj#6&>n-SOWlup_@{4 zcJ?w_!9JKPM=&Bd#IQ37F*x39y!azm$;~IRlkm>bHdABcNwW-TdDKD$pkD{j6A8d* z{vP~|<}bj_Oz#83K$ieRtsA4a@4a5cRjJ}A01{PgxXn3;fx)5ElMEPwDX_mW9)9oB z*;scve~v#HHqUj3KdC$tdV3&0)Whkp-=hKKz{SzD7g0@N!wyv;ZAime7AjB7&)!)5 zp_iVblaf)%agwJqOG2e7WTCM1&khq`{b>fN4n8hOJbvO?Y;60>LIwagLXWC@@0RSR zo%lPo1cUU=g$ahJ8D=;`v~ORUSl(1-&a@yTAC5Y8E892@{P@MM=GXUGpBSXSbSs!N z;L~0D_s7{+^F6c!WW+^yz5~o7eWtsOE}8{hKaFlHgnyBeUJ8Zz2$k7Lrh?NuMU|No zVvsq@57)8zin;&ckR1;*Z%(xH2lBw z`x%N;|H1En8au588bPDxP^$kfpO!bIzz>K=5Jiq9Rg(NGde0g!rKagLa+&yC)jg7y zq}~2IH)N*FJC31qrIH-2;%3^F?=bDD^U2Y;%ftN(v71oY;od+vh!!2z^}GHR$43rg z0In@ki}TglIsMU^O1(SiLK#oiuyw zB>-@z?&uW`ILoPupw0_cs?C|2YoX&87~us+ny%eo{A!3M<-7O7mHUBCgA~{yR!Dc^ zb= z8}s4Ly!GdxEQj7HHr<}iu@%Lu+-bV>EZ6MnB~{v7U59;q<9$h}&0WT;SKRpf2IId ztAjig0@{@!ab z{yVt$e@uJ{3R~8*vfrL03KVF2pS5`oR75rm?1c`@a8e{G$zfx^mA*~d>1x`8#dRm) zFESmEnSSsupfB>h7MipTeE!t>BayDVjH~pu&(FI%bRUpZ*H615?2(_6vNmYwbc^KX4HqSi!&mY9$w zpf%C6vy@O30&3N5#0s_!jDk|6qjb-7wE3YT3DA7q3D`Q&Y*y>XbgE7=g#rPx1hnf8 zTWd{IC!Iysq*vZup5VGrO)UM<3)6raR`rOwk(!ikf3XPp!n|gz0hS*P=VDXAyMW(s zL??-`&IusEuOMrz>m(A1W5Q~>9xJwCExAcMkOBD` zD5BJSadd{0u}%z4r!9qA`FW4;Ka_Qk>FcHxiucGw4L9qhtoge|ag8jbr`7LHSbVQz z6|xUo*^LV1SLxS>?D`m=g{8IC&1YF$e}VRGD#ZOc_15QW%J@FbEj8tE-nGxo4?X02 z@|q#k*G4xMW>q84Xc09pRj@>Hz8t^fMm3n&G;Al6KU*;=W`7Q{$^|=bnZiJ7?(s)@ zB`vW>#zJ{}!8=*|?p(~fcXSanO^j8+q7V!q16*ic!HLRdz0TzNI6}m+=OKd2b8KX< zAcDTj*%~vQlcO+%@H01gjv-1zZaOXVoM*t-+KXTR#NoTf-#{dQAm?GqK6q8Ta zu3xW?t=NE$EfYa#=0HofLn5~c#m-U#Ct_r6~X-pg6k*F zYIP7De52BBwcAnK?O(j?YEs1;q60!-!hTuKzw3T;XcA_w5HvU;tO~}byLA^cggu8i z-IP@pxFjTy&ie28m}j66dm@g78xK7aG{QSR^bAcY+W*xWu;G~I08sf(GK4>K-cbfJ z-%v9DGR77He<291M~=fg>>9&NFQlboP)pC6fT;{>_!lM`A&&HWIMd)Y6e@IL;nvRdBE*Tn({&3{-XJ9helJa{G51Ck}-_Y=5C|fEo z)7fZlsHxN&SY&ZLTdYuBBZnwIh0#VTzmyK>U0|r&SXb&GP0m)1dGV8z(^x6s5yQ-z zEyniK${#U@Y7p@Yxx}E+jA?1@{=|e6UM;iyai=0=aItVvqieogZUq@sio2#9NLW~L z{w@^H!HEGU;>;T0lu{Ad20Hr6u;?-9YHKvkjEc)}wsb4Y-ArRK8`24uBT8N)8m%Ee zYJX21)|e{peL26}VUUKYQ3L@NSe8rEbN#AIo$tjJm-$B|IJU?mu(h$Sq`XNY0@NhY z0?WeMtPwP)sUdk}dWA4qBUV^x>P|is-kPgVe)*WV>dKDL>gOq1 zUYw(nU|N#dw>97A_(c3?VA_zDfF{^A1eE#8Bucd^ON(sv-{tc@&i)Y)3V~o7U~+AA zOwnXB5`WN^z$z<9^@(?LY%7?y5X_C(j1ip-Ug^f7Tt6suI3&a=&~#EJegG4r2^tKz zJoEXCVOc1QdOSNHp2d;t&smxL%CfK@mSl)Ky}`!6kCsi#7s5&G2Q!sM9S6o)&mdx% zz|2M~pav2;Th=DTN5yB@6HFAO!pl-y+tEJsh}(? z!tIyg01O*w@mWxsFhHMi7%Gqz!v(Osc5WxK+^1PGfsozw)FE}VIxk9GexmAohPNAF*SAjxG3Al#(xQoYXdI}TR zoCHAFS6+LDqsP8L1SZH{RxJjFK_=vy4nNH^?M!OsQWe^qC~$c1r&y`H9n5;D z2F$t-Htc%2@K(>opJHE{NytI2<_J<6Kz*p$wtKUTEH}zITx?H0L%!5%i@!rLphSBrkFs>jscP6?HVQovX8!~b~ZY|0h%&souT7e5nD@OxuSgC zVW*eo0B|1POwg7;6fJSUC`g+`1%XQvwpRc*&|AtV*h!#5nQM(@m!K)-Qop!Rt3F`a z9HUO zF3w{uI_==EpjFQWV4boF^A?wc@@@U+KrKPjn6sK{OLu-~1UloSqt-aHYo*^@kQy2+ zH(9*-mFz?YV4cL7EW)9hsdmG{5jaYXLvm*&3PZ4y?8z`$9z6`q9fgsJm@*W$-QSzu zut}57hroSbTd=&RJpuy#?K?A6!-;_MowpK8eb~5T-^eye%3O-T^ktSMbd%PT0j-B?#yAKr37u%gB z*2)WJMw6Y)6BvY$JjD`(06ci7u;u$hv}gN5oS&Q^*y$J6L)0#BD<>XL|;pZgtZaxp3~$0zxA(;6Qr_AP$?8l@S)C^Hoaz#rQFK^lA}3&)Gr}Fsca? zK>9BkVcl;c*E2P9UMppEIB&38dL9R?Xg9N{Nl~4*w!qsZJElz}Xc9gz#}cwnP4u{+ z6VNTEx*>u67?3bn{sWk*P`1_$YfsB+)Ax0+jt|)0p&VS?N0k8IAp2KH_#eY3I#{Hw zB$vObUDtXyZX)*wVh*@BefnUej#jv@%uiA=>ngX0kQXaz>8(WM)fX~v__@I}7|!Il z@J%r#I!JqqFwGd4JPhmDmL>1Bh}nn_BE;hgKUesNOf9zQhiuhn%4B}O8jnxEwJiQFDaiiuXw2sb?*8a}Lr;_#7+IPfIjhVDhazSpbQZECL+4)p8lO;)!y>Rt=0X*;O# zX{s(p-*d{#{Y3gVhL;A{4a(Z5sIfpk;WMCqdFA&Mb7mp;YMXhBF@p`}$ShAug+bo`;<9fm!~F z-;1yCj$GQ^mzucrfuatilXrYLr)`izjn_m(f~);txN?D7d?Kg4wDuPXilVyeVwjzf z=4Kewf=u}X_H*viVfPWZW?Sqa3G#h3|;b!Q7>BRc7-Wox0}&>}Lqo=0v;T_i~% zqB&h;14|~nK{W0N=$obGP@O%(c8SraYS^qiu%Q`B zBHdA!`Vk7#Bz*@_3eE#bizLzjBV;F0vfSA~+7@8+F{$7Y?fwI~Pp_X`2ORgqW6g@2 z{cQV!niSsMEVr1IaeRAj8~|*4yW~X5$6o`crw4uTHhgPs^qAk?9UPu;xy5wh2^jZ; z)@27Q=QKa?8w7_C0|u`@k=%b9Ce$D7x42CdLsckF2<$wLuV2kpik8PXex2^Co$n2o z)l#H*;#>?yrPw0x6LI@x(X$nezCBa0Obi%|I5ZV|4bJSPtNHjDkS|3S?fiv(i_(n* zFbve0g!B0!MMmakRsgg_if8nwImb=kk%|s+08xGQ)J?vpkdaya3UD|RJK+LQ72|g> zc4LnwInx!2pN-5Yvp7rvRF#B=(ZO8gyVB^0Dh#ZdHA2BjjppfV<=2Nm#w_t{%6O$W z`-?7N?LwL0DWgK0Y7L#ChSHfa{=DOpJpl8L@V70cd%ei)n%SQO;Z+Xw#li#%LUfbs z&hP%UzN(qM3cw#bWQS6_B@>1^ea-AqNA12xoiQeb_Zdtf>yHljqeIHqlyC^gzH)h1 zstXTFEb0r=l9;><<$a}YWlscH7VW_xeKVZ#*#v#HiuUOs7PPj8ml4#!BiGEK)kDpO zX=2mU0ZuIDDnhfV7v_Rs)0R#ff6I6_|MrzV(R$3Nt#S7D?GQy6?a^WRvA@r2~?7f~s99*9;fuqJ(843U`hRl2O|sk>J@WMsR2O zwyZt$@J)DnSUNkF@B3MPNz|<@`72{M*S5d<1Vkg+G=q~u{8OP84Yh6VCE5pNC*#m> z*jzHy5Tc82sBVw+6W7DoR5@LXZ|+>;)Q%czg%8pyMyeE2-)R^oHg~SrO~#I8MxNc> z6pWT&F&H1mX7#2@mBY>#rRoFKszT z(gvV#j3x|7sF|Dt0*CgsJTdH1R!>inYZWp*2RDbjjQCP98L_ds!$x&{t85NRYk4ii ztJ3HyC8h2A2&`kq^Cfci>N*r&btHg_|v6=s|v=(-MQ zK4kjqoI^~y`j9poC2r{Izdlehm8!AcMP^+SwDUce1Zon(%YvxK)x|rXsJRlO?-K91 zMsmHgI&PmqT_W}C0mdA_6L!EEjgJzidRvTN;vQRJ-uBl#{dEeN?24PRwx)7c5kF^ut=M0)e@zr?z_vpYf=%;;@UYF9>9-->Qf2FW*# z5*#VFB$$-k(zphh4sAElMiLbp`$+SKm*{l6qX;Q8GZ7b|J>OhC!yg$}8dt$dx3E8b z$FlaM*K@6mSsYCoe#*QjLEB3|_Vs4GbZI#!>Ya}dzh%uMn}sw0gFQQ{+V+e|_`q)M3nK27)nAqQ-viJoPHUKdr9HN`v0 z+tZo0ORLuv_d)x}gO|~s(H!12RM(aMfqLG>KSH#kGxC{sUUj>FUC(6;ds1cOjeDYu zOrd>q@bNFq5?0s&@5nbF3-rw{{V&YYf3o_9|K-X4k861UwZ&C2bH+A7^%7nizU>b? zC2@*VlrqprJiv$rx{+^+Op9i3RM;IHq@a;34=Gn%B+rXMZi=UsHC@TEFk4{*fs96p z)wNUY?AhVkdLGQmPESuh@-!iqSZrnxIT~Mon)J+i+B~9VdL8QE`^4=2@lNaKluUVx z_^i7~5E4dN4&gVMi%;7ast@WIY21Q`+^iTC*Gx@IMVYB`BLFHzPh{Fpc6LKZTk@>P zquo2E*Pgq(0MX>h>4)YaJYbIK&V?-W}JfL@&R0I2)TOA!Teg zNa4DBO&)`Nn0$Inb|d8ea|)qqOLYVbQIBRC4T4E<5#Nzc2 z57|Bq7mYsW8y?uLA$XMj%OeK+1|DAKcLYB98-vDP<3*+SKYcPcOkm&}H|!{9l*9%L zbiYJYJ^)Cql-&wPwABGD>Ai7SUXe15m zIr^wNEU$9)D6@atm z(w(1~GuLpHi?JGgIBj`Ovy;j4M`XjrCNs?JsGh1zKsZ{8 z@%G?i>LaU7#uSQLpypocm*onI)$8zFgVWc7_8PVuuw>u`j-<@R$Of}T`glJ!@v*N^ zc(T~+N+M!ZczPSXN&?Ww(<@B=+*jZ+KmcpB8* zDY_1bZ3fwTw|urH{LLWB;DCGzz$jD|VX#Af@HC%BktA8F7VJSy&!5iTt};#U^e0_q zh6j7KCTInKqriZ1`BiF3iq2LWk;gyt0ORIFc4Mi3Bx`7WEuFq{u^C49-SYVjnv!_40m1>7x*+<8~Xkq?056 z!RBfE@osP%SxzOw>cLAQ$bioAOC0V!OzIXIc};)8HjfPtc~8tnah$PtoAz`4k)7$FDUc2O@D)g_uAo&nXMymK$##V?gYUPt^l zj{6NFDL(l-Rh(xkAHP%bBa=($r%3Y~jB!eQ1Smuq2iuQ|>n%Y=p(26SE5gFu11*Q< zaPN5G^d;Iovf`VY&Gh58z~%JpGzaeUz6QoBL^J%+U4|30w7Q&g9i}}@l61eKEfCgo zST6qMxF_Eaj7;0OC)TSU{4_m}%FOa6B{AxS$QIcmmG~IVjjf;7Uk!HBtHfm{%LsLb zu8~5VQFyOZk&!VY(wxL__haJ;>Bj?g&n`+i&=X{unJmv&0whCitWfGlOr6+Tc-lMZ z(ZRXqC-=O+GAvTXKViA9vdwu{aifhk$tYh~-9BScg!Yr*M2zw&9`pHMxHGh`dUH-1;~^6lF@ep;X9PjQ!rqmXNWJ?#P-qb%*TB%xe&3 zX*5V>xuW7)$3!Yc$y>cwBqd8+p+u>WS7p7~O80ipG{(a*#=NJ`^Ld6k-`|;Y&htFy zIi2(Sm)4eD=o+CGo~M3%qF|O9P0+ahmc%EklI?NgX05W3+OdS`_Rd#wg-}hd1&txU5wXy zy`x)05?WVZvELw`XWetIAg6$|(^4ntaE;=f$Wcpwbxm7?bLDnPs-1!bRoMcy!EeOh zpIv8ewDzcIU}mv1NxV!&(Wf7~_kqGAk=2=j&O5FA)z2!APCcDQPnIaiqMkVT4fUyX z))R|WvOJyzcU6d=z0q8JDt42*`js4g+_t{YP7lVguX+vhEejJ3TAIo*Z6jizHm#S- zZT_}-STQAa-0Gn8+RmR7V}{Ns1@jJ{^Sb!9&RSXXP;^ep)r6;&PW++~XYXC9a=zSF z?sp(JQo&MROb~b1Y*Xw4!P)>PHT>Z<)*U=Ax_75^OUw97pNudbxS1XPtNrIg zQ5YB77E@i7$2Ia}(^JcCi@OX`9a|m}PY%-th2m~y+)eCl>fTVjCP^lDOBLyhg1DZ+ z)~G{&OkDc$!;t~`gq(wz@qW3lh9B^ic$>-h#nV!H8d#l+>C(M%g}u2g=I#&W|L!VD zqHYoQkBW;`r|fW02u{7X!X;}T7X4iAaWzkeOh}7&o!F1qt4#$1|BDF;(2VlgEqJ$F zy8Ba-y(%fs`MzpvyXlQLEhS^ed$7Va2hO%?$-D>^*f$b)2Hx;}Ao$UqFt7l26<7eP z!{!C7PVrq>=794Zqmc z%LKkzIBZq@%Ja8EkH}?>c5ILG(EAMS*JHu?#9_7TsELw)8LZzN>f2Y6YN{AJC?34> zh42sPa1%2JpCeS9&E1URm+Pb}B>A1M`R{+O+2~}c(@^1Rf&J9p(4QqHl;E^4w5;I5 zM{?(A^eg*6DY_kI*-9!?If^HaNBfuh*u==X1_a?8$EQ3z!&;v2iJ``O7mZh%G)(O8 ze<4wX?N94(Ozf9`j+=TZpCbH>KVjWyLUe*SCiYO=rFZ4}S~Tq|ln75Jz7$AcKl$=hub=-0RM1s(0WMmE`(OPtAj>7_2I5&76hu2KPIA0y;9{+8yKa;9-m??hIE5t`5DrZ8DzRsQ+{p1jk-VFL9U z2NK_oIeqvyze>1K%b|V?-t;Wv`nY~?-t;tMC4ozyk8CR(hoZTno3!*8ZTc15`?MFf zDI892&g&3lshOEv4E@w-*_%)8C_<&HhV`0D5lN$WT4Q^UWHNSAE+RZe(o z%bqR^hp1IsDr47e^AajFtlppT)2F6yPcrWO9{Kw{o=P6y^HOW$Wqd_)_fwzn`ikZl zOGVc0+S(*=xZ_KbL0Nr`Sx$$CWEbw$52udl1f=X6CZEcFMA*nl>`0gn4&tc5^`!!)tGw<}^Q>P7E}$ zialDUofH*XcB3r9@tA@lnS}dA(@nK_xuw0b;FPUnNGD0;MIySCw=cSzB#=3>F37V-nni3UNB)-;;Gkk;3l9fh6FIjSZU zk=Eo2a`6i7@i*4>ym5`R?i-uZFv6+iX*Gi^I}ZU1OrLAX8aGiT@`*YnjeF>}$U}ORP`+EY5`eqVC_&4yG z;Tp>+2QbZ?lt1GB+D}q14W3dWP8lWnN zf(nlT6+XW&(zme{FbyDpP^NakA<~TK=Y}H^eS%2rt0v8Lr)B}@B!cTvC=9FM;7q4@ zf*;vb4HG>RFpY5?vFCp27VEnVIGx~-na6biU4{+UoYe=}^R#_My6wT$5d&r*=kpAA zu;=-c0|~yqi(N8&*H;aNfhyey+HHQ7J_qae*_CgG2V8j=Tq936S0DC8r3BXBql3Gz z0pLo_`|4Q+oY3rPBNaLmL{QM};9dke>ujP^j@z-N;fNlKb|edn>)YaafDaJ>GWKP$ z5}l&#$QFhN!CMT;WH&z-5E)kvM|36lV!^#3z{@2FF>HsgUO4PMqO#U$X%+U>K!xJ@ zBFs|+woG_9HZQs_Tw*vnCPGhlXG@>y|6pJT$I67!aP&b0o$AF2JwFy9OoapQAk>k7 z**+$_5L;5fKof<;NBX%_;vP@eyD=Z0(QW)5AF7 zp|=tk3p?5)*e~Inuydz-U?%Kuj4%zToS5I|lolPT!B)ZuRVkVa>f*-2aPeV3R79xh zB)3A$>X~szg#}>uNkpLPG#3IKyeMHM*pUuV5=-Jji7S6PSQ9oCLo{oXxzOZfF$PP) zrYwlmSQ-~n94uO3CD{K0QTmj@g%Yzn7_xQ4fTduU0Yqvln`e_`CdXH5iQ5qRr1 zBC;}%YZ2!4I>*=sR)O~jBPx6sxmIEBnq)s-fHz_y0z8-gPl2Us4BiBXNR5CIF!YR@ zb9B305SilU*@4|+ x6JBtc8JSt5M0pkooaq!^FqtuD_KdXXTo>Mw54>`rP&>h&58!3a6l6r9{sG7g--!SK literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..ba94df84 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..2fe81a7d --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..9618d8d9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/h2d-libgdx-spine-extension/build.gradle b/h2d-libgdx-spine-extension/build.gradle new file mode 100644 index 00000000..4a791721 --- /dev/null +++ b/h2d-libgdx-spine-extension/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +ext { + gdxVersion = '1.9.10' + box2dlightsVersion = '1.5' + ashleyVersion = '1.7.3' + spineVersion = '3.8.55.1' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + implementation "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" + implementation "com.badlogicgames.box2dlights:box2dlights:$box2dlightsVersion" + + implementation "com.esotericsoftware.spine:spine-libgdx:$spineVersion" + + implementation project(":hyperlap2d-runtime-libgdx") + + testImplementation group: 'junit', name: 'junit', version: '4.12' +} diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineComponentFactory.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineComponentFactory.java new file mode 100644 index 00000000..5b15c26e --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineComponentFactory.java @@ -0,0 +1,110 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.extention.spine; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.physics.box2d.World; +import com.esotericsoftware.spine.*; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.SpineDataComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.factory.component.ComponentFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 5/22/2015. + */ +public class SpineComponentFactory extends ComponentFactory { + + private SpineObjectComponent spineObjectComponent; + + public SpineComponentFactory() { + super(); + } + + public SpineComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.SPINE_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + createPhysicsComponents(entity, vo); + createLightComponents(entity, vo); + spineObjectComponent = createSpineObjectComponent(entity, (SpineVO) vo); + createSpineDataComponent(entity, (SpineVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + entity.add(component); + return component; + } + + protected SpineObjectComponent createSpineObjectComponent(Entity entity, SpineVO vo) { + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + + SpineObjectComponent component = new SpineObjectComponent(); + component.skeletonJson = new SkeletonJson(rm.getSkeletonAtlas(vo.animationName)); + component.skeletonData = component.skeletonJson.readSkeletonData((rm.getSkeletonJSON(vo.animationName))); + + BoneData rootBone = component.skeletonData.getBones().get(0); // this has to be the root bone. + //TODO this does not work + //rootBone.setScale(vo.scaleX / projectInfoVO.pixelToWorld, vo.scaleY / projectInfoVO.pixelToWorld); // TODO: resolution part and multipliers + component.skeleton = new Skeleton(component.skeletonData); // Skeleton holds skeleton state (bone positions, slot attachments, etc). + component.worldMultiplier = 1f/projectInfoVO.pixelToWorld; + AnimationStateData stateData = new AnimationStateData(component.skeletonData); // Defines mixing (crossfading) between animations. + component.state = new AnimationState(stateData); // Holds the animation state for a skeleton (current animation, time, etc). + + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + component.computeBoundBox(dimensionsComponent, component.worldMultiplier); + + component.setAnimation(vo.currentAnimationName.isEmpty() ? component.skeletonData.getAnimations().get(0).getName() : vo.currentAnimationName); + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.scaleX = vo.scaleX; + transformComponent.scaleY = vo.scaleY; + + entity.add(component); + + return component; + } + + protected SpineDataComponent createSpineDataComponent(Entity entity, SpineVO vo) { + SpineDataComponent component = new SpineDataComponent(); + component.animationName = vo.animationName; + + component.currentAnimationName = vo.currentAnimationName.isEmpty() ? spineObjectComponent.skeletonData.getAnimations().get(0).getName() : vo.currentAnimationName; + + entity.add(component); + + return component; + } +} diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic.java new file mode 100644 index 00000000..2b3587d1 --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic.java @@ -0,0 +1,28 @@ +package games.rednblack.h2d.extention.spine; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; +import com.esotericsoftware.spine.SkeletonRenderer; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.render.logic.Drawable; + +public class SpineDrawableLogic implements Drawable { + + private ComponentMapper spineMapper; + private SkeletonRenderer skeletonRenderer; + + public SpineDrawableLogic() { + spineMapper = ComponentMapper.getFor(SpineObjectComponent.class); + skeletonRenderer = new SkeletonRenderer(); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + SpineObjectComponent spineObjectComponent = spineMapper.get(entity); + //TODO parent alpha thing + skeletonRenderer.draw((PolygonSpriteBatch)batch, spineObjectComponent.skeleton); + } + +} diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic2.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic2.java new file mode 100644 index 00000000..2baaaf3f --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineDrawableLogic2.java @@ -0,0 +1,81 @@ +package games.rednblack.h2d.extention.spine; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; +import com.badlogic.gdx.math.Affine2; +import com.badlogic.gdx.math.Matrix4; +import com.esotericsoftware.spine.SkeletonRenderer; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.render.logic.Drawable; + +public class SpineDrawableLogic2 implements Drawable { + + private ComponentMapper spineObjectComponentMapper = ComponentMapper.getFor(SpineObjectComponent.class); + private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + + private ComponentMapper spineMapper; + private SkeletonRenderer skeletonRenderer; + + public SpineDrawableLogic2() { + spineMapper = ComponentMapper.getFor(SpineObjectComponent.class); + skeletonRenderer = new SkeletonRenderer(); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + SpineObjectComponent spineObjectComponent = spineMapper.get(entity); + + ParentNodeComponent parentNodeComponent = entity.getComponent(ParentNodeComponent.class); + Entity parentEntity = parentNodeComponent.parentEntity; + TransformComponent parentTransformComponent = transformComponentMapper.get(parentEntity); + if (parentTransformComponent.scaleX == 1 && parentTransformComponent.scaleY == 1 && parentTransformComponent.rotation == 0) { + computeTransform(entity); + applyTransform(entity, batch); + skeletonRenderer.draw((PolygonSpriteBatch)batch, spineObjectComponent.skeleton); + resetTransform(entity, batch); + } else { + + skeletonRenderer.draw((PolygonSpriteBatch)batch, spineObjectComponent.skeleton); + } + + //TODO parent alpha thing + //TODO rotation when in composite does not work well + //TODO Scale is not aware of ppwu + } + + protected Matrix4 computeTransform (Entity rootEntity) { + SpineObjectComponent spineObjectComponent = spineObjectComponentMapper.get(rootEntity); + TransformComponent curTransform = transformComponentMapper.get(rootEntity); + + Affine2 worldTransform = spineObjectComponent.worldTransform; + + float originX = curTransform.originX; + float originY = curTransform.originY; + float x = curTransform.x; + float y = curTransform.y; + float rotation = curTransform.rotation; + float scaleX = curTransform.scaleX; + float scaleY = curTransform.scaleY; + + worldTransform.setToTrnRotScl(x + originX , y + originY, rotation, scaleX, scaleY); + if (originX != 0 || originY != 0) worldTransform.translate(-originX, -originY); + worldTransform.translate(-spineObjectComponent.minX, -spineObjectComponent.minY); + + spineObjectComponent.computedTransform.set(worldTransform); + return spineObjectComponent.computedTransform; + } + + protected void applyTransform (Entity rootEntity, Batch batch) { + SpineObjectComponent spineObjectComponent = spineObjectComponentMapper.get(rootEntity); + spineObjectComponent.oldTransform.set(batch.getTransformMatrix()); + batch.setTransformMatrix(spineObjectComponent.computedTransform); + } + + protected void resetTransform (Entity rootEntity, Batch batch) { + SpineObjectComponent spineObjectComponent = spineObjectComponentMapper.get(rootEntity); + batch.setTransformMatrix(spineObjectComponent.oldTransform); + } +} \ No newline at end of file diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineItemType.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineItemType.java new file mode 100644 index 00000000..f80ba9a1 --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineItemType.java @@ -0,0 +1,75 @@ +package games.rednblack.h2d.extention.spine;/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +import box2dLight.RayHandler; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.commons.IExternalItemType; +import games.rednblack.editor.renderer.components.SpineDataComponent; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.factory.component.ComponentFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.systems.render.logic.Drawable; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 7/20/2015. + */ +public class SpineItemType implements IExternalItemType { + + private ComponentFactory factory; + private IteratingSystem system; + private Drawable drawable; + + public SpineItemType() { + factory = new SpineComponentFactory(); + system = new SpineSystem(); + drawable = new SpineDrawableLogic2(); + } + + @Override + public int getTypeId() { + return EntityFactory.SPINE_TYPE; + } + + @Override + public Drawable getDrawable() { + return drawable; + } + + @Override + public IteratingSystem getSystem() { + return system; + } + + @Override + public ComponentFactory getComponentFactory() { + return factory; + } + + @Override + public void injectMappers() { + ComponentRetriever.addMapper(SpineDataComponent.class); + ComponentRetriever.addMapper(SpineObjectComponent.class); + } + + @Override + public void injectDependencies(RayHandler rayHandler, World world, IResourceRetriever rm) { + factory.injectDependencies(rayHandler, world, rm); + } +} diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineObjectComponent.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineObjectComponent.java new file mode 100644 index 00000000..dca3e8d9 --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineObjectComponent.java @@ -0,0 +1,78 @@ +package games.rednblack.h2d.extention.spine; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.math.Affine2; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.FloatArray; +import com.esotericsoftware.spine.*; +import com.esotericsoftware.spine.attachments.Attachment; +import com.esotericsoftware.spine.attachments.MeshAttachment; +import com.esotericsoftware.spine.attachments.RegionAttachment; +import games.rednblack.editor.renderer.components.DimensionsComponent; + +public class SpineObjectComponent implements Component { + public SkeletonData skeletonData; + public Skeleton skeleton; + public SkeletonJson skeletonJson; + public AnimationState state; + public float minX; + public float minY; + public float worldMultiplier; + private FloatArray temp = new FloatArray(); + public final Affine2 worldTransform = new Affine2(); + public final Matrix4 computedTransform = new Matrix4(); + public final Matrix4 oldTransform = new Matrix4(); + + public Array getAnimations() { + return skeletonData.getAnimations(); + } + + public void setAnimation(String animName) { + state.setAnimation(0, animName, true); + } + + public AnimationState getState() { + return state; + } + + public void computeBoundBox(DimensionsComponent dimensionsComponent, float worldMultiplier) { + skeleton.updateWorldTransform(); + Array drawOrder = skeleton.getDrawOrder(); + minX = Float.MAX_VALUE; + minY = Float.MAX_VALUE; + float maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE; + for (int i = 0, n = drawOrder.size; i < n; i++) { + Slot slot = drawOrder.get(i); + if (!slot.getBone().isActive()) continue; + int verticesLength = 0; + float[] vertices = null; + Attachment attachment = slot.getAttachment(); + if (attachment instanceof RegionAttachment) { + verticesLength = 8; + vertices = temp.setSize(8); + ((RegionAttachment)attachment).computeWorldVertices(slot.getBone(), vertices, 0, 2); + } else if (attachment instanceof MeshAttachment) { + MeshAttachment mesh = (MeshAttachment)attachment; + verticesLength = mesh.getWorldVerticesLength(); + vertices = temp.setSize(verticesLength); + mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2); + } + if (vertices != null) { + for (int ii = 0; ii < verticesLength; ii += 2) { + float x = vertices[ii], y = vertices[ii + 1]; + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + } + } + + dimensionsComponent.width = (maxX - minX);// * worldMultiplier; + dimensionsComponent.height = (maxY - minY);// * worldMultiplier; + + //minX *= worldMultiplier; + //minY *= worldMultiplier; + } +} diff --git a/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineSystem.java b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineSystem.java new file mode 100644 index 00000000..bcd930f8 --- /dev/null +++ b/h2d-libgdx-spine-extension/src/main/java/games/rednblack/h2d/extention/spine/SpineSystem.java @@ -0,0 +1,61 @@ +package games.rednblack.h2d.extention.spine; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.SpineDataComponent; +import games.rednblack.editor.renderer.components.TransformComponent; + +public class SpineSystem extends IteratingSystem { + + private ComponentMapper spineObjectComponentMapper = ComponentMapper.getFor(SpineObjectComponent.class); + private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + private ComponentMapper dimensionsComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); + + public SpineSystem() { + super(Family.all(SpineDataComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + + TransformComponent transformComponent = transformComponentMapper.get(entity); + SpineObjectComponent spineObjectComponent = spineObjectComponentMapper.get(entity); + DimensionsComponent dimensionsComponent = dimensionsComponentMapper.get(entity); + + ParentNodeComponent parentNodeComponent = entity.getComponent(ParentNodeComponent.class); + Entity parentEntity = parentNodeComponent.parentEntity; + TransformComponent parentTransformComponent = transformComponentMapper.get(parentEntity); + float offsetX = 0; + float offsetY = 0; + + if (parentTransformComponent.scaleX == 1 && parentTransformComponent.scaleY == 1 && parentTransformComponent.rotation == 0) { + offsetX = parentTransformComponent.x; + offsetY = parentTransformComponent.y; + + while (true) { + parentNodeComponent = parentEntity.getComponent(ParentNodeComponent.class); + if (parentNodeComponent == null) { + break; + } + + parentEntity = parentNodeComponent.parentEntity; + if (parentEntity == null) { + break; + } + + parentTransformComponent = transformComponentMapper.get(parentEntity); + offsetX += parentTransformComponent.x; + offsetY += parentTransformComponent.y; + } + } + + spineObjectComponent.skeleton.updateWorldTransform(); // + spineObjectComponent.state.update(deltaTime); // Update the animation time. + spineObjectComponent.state.apply(spineObjectComponent.skeleton); // Poses skeleton using current animations. This sets the bones' local SRT. + //spineObjectComponent.skeleton.setPosition(transformComponent.x - spineObjectComponent.minX + offsetX, transformComponent.y - spineObjectComponent.minY + offsetY); + } +} diff --git a/hyperlap2d-common-api/build.gradle b/hyperlap2d-common-api/build.gradle new file mode 100644 index 00000000..d56917a9 --- /dev/null +++ b/hyperlap2d-common-api/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +repositories { + mavenCentral() +} + +ext { + gdxVersion = '1.9.10' + box2DLightsVersion = '1.5' + ashleyVersion = '1.7.3' + visUIVersion = '1.4.4' +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + implementation "com.kotcrab.vis:vis-ui:$visUIVersion" + implementation "com.badlogicgames.box2dlights:box2dlights:$box2DLightsVersion" + + implementation 'net.mountainblade:modular:1.0' + + implementation project(":hyperlap2d-runtime-libgdx") + + testImplementation group: 'junit', name: 'junit', version: '4.12' +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/Controller.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/Controller.java new file mode 100644 index 00000000..8a68216f --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/Controller.java @@ -0,0 +1,80 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + +import com.puremvc.patterns.command.Command; +import com.puremvc.patterns.observer.Notification; + +/** + * The interface definition for a PureMVC Controller. + *

+ *

+ * In PureMVC, an IController implementor follows the 'Command + * and Controller' strategy, and assumes these responsibilities: + *

+ * + * @see com.puremvc.patterns.observer Notification + * @see com.puremvc.patterns.command Command + */ +public interface Controller { + + /** + * Register a particular ICommand class as the handler for a + * particular INotification. + * + * @param notificationName the name of the INotification + * @param command the Class of the ICommand + */ + void registerCommand(String notificationName, Class command); + + /** + * Execute the ICommand previously registered as the handler + * for INotifications with the given notification name. + * + * @param notification the INotification to execute the associated + * ICommand for + */ + void executeCommand(Notification notification); + + /** + * Remove a previously registered ICommand to + * INotification mapping. + * + * @param notificationName the name of the INotification to remove the + * ICommand mapping for + */ + void removeCommand(String notificationName); + + /** + * Check if a Command is registered for a given Notification + * + * @param notificationName + * @return whether a Command is currently registered for the given notificationName. + */ + boolean hasCommand(String notificationName); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreController.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreController.java new file mode 100644 index 00000000..c263a5cc --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreController.java @@ -0,0 +1,200 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + + +import java.util.HashMap; +import java.util.Map; + +import com.puremvc.patterns.command.Command; +import com.puremvc.patterns.observer.BaseObserver; +import com.puremvc.patterns.observer.Notification; + +/** + * A Singleton Controller implementation. + *

+ *

+ * In PureMVC, the Controller class follows the + * 'Command and Controller' strategy, and assumes these + * responsibilities: + *

    + *
  • Remembering which ICommands + * are intended to handle which INotifications.
  • + *
  • Registering itself as an IObserver with + * the View for each INotification + * that it has an ICommand mapping for.
  • + *
  • Creating a new instance of the proper ICommand + * to handle a given INotification when notified by the View.
  • + *
  • Calling the ICommand's execute + * method, passing in the INotification.
  • + *
+ *

+ *

+ * Your application must register ICommands with the + * Controller. + *

+ * The simplest way is to subclass Facade, + * and use its initializeController method to add your + * registrations. + * + * @see CoreView View + * @see BaseObserver Observer + * @see com.puremvc.patterns.observer.Notification Notification + * @see com.puremvc.patterns.command.SimpleCommand SimpleCommand + * @see com.puremvc.patterns.command.MacroCommand MacroCommand + */ +public class CoreController implements Controller { + + /** + * Reference to the singleton instance + */ + protected static CoreController instance; + /** + * Mapping of Notification names to Command Class references + */ + protected Map> commandMap; + + /** + * Local reference to View + */ + protected CoreView view; + + /** + * Constructor. + *

+ *

+ * This IController implementation is a Singleton, so you + * should not call the constructor directly, but instead call the static + * Singleton Factory method Controller.getInstance() + */ + protected CoreController() { + instance = this; + commandMap = new HashMap<>(); + initializeController(); + } + + /** + * Controller Singleton Factory method. + * + * @return the Singleton instance of Controller + */ + public synchronized static CoreController getInstance() { + if (instance == null) { + instance = new CoreController(); + } + + return instance; + } + + /** + * Initialize the Singleton Controller instance. + *

+ *

Called automatically by the constructor.

+ *

+ *

Note that if you are using a subclass of View + * in your application, you should also subclass Controller + * and override the initializeController method in the + * following way:

+ *

+ *

+ * // ensure that the Controller is talking to my IView implementation + * override public function initializeController( ) : void + * { + * view = MyView.getInstance(); + * } + * + */ + protected void initializeController() { + view = CoreView.getInstance(); + } + + /** + * If an ICommand has previously been registered to handle a + * the given INotification, then it is executed. + * + * @param note The notification to send associated with the command to call. + */ + public void executeCommand(Notification note) { + //No reflexion in GWT + Class commandClass = commandMap.get(note.getName()); + if (commandClass != null) { + Command command; + try { + command = commandClass.newInstance(); + command.execute(note); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + + } + } + + /** + * Register a particular ICommand class as the handler for a + * particular INotification. + *

+ *

+ * If an ICommand has already been registered to handle + * INotifications with this name, it is no longer used, the + * new ICommand is used instead. + *

+ *

+ * The Observer for the new ICommand is only created if this the + * first time an ICommand has been regisered for this Notification name. + * + * @param notificationName the name of the Notification + * @param command an instance of Command + */ + public void registerCommand(String notificationName, Class command) { + if (null != commandMap.put(notificationName, command)) { + return; + } + + view.registerObserver + ( + notificationName, + new BaseObserver(this::executeCommand, this) + ); + } + + /** + * Remove a previously registered ICommand to + * INotification mapping. + * + * @param notificationName the name of the INotification to remove the + * ICommand mapping for + */ + public void removeCommand(String notificationName) { + // if the Command is registered... + if (hasCommand(notificationName)) { + // remove the observer + view.removeObserver(notificationName, this); + commandMap.remove(notificationName); + } + } + + /** + * Check if a Command is registered for a given Notification + * + * @param notificationName The name of the command to check for existance. + * @return whether a Command is currently registered for the given notificationName. + */ + public boolean hasCommand(String notificationName) { + return commandMap.containsKey(notificationName); + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreModel.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreModel.java new file mode 100644 index 00000000..2b1ec43c --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreModel.java @@ -0,0 +1,153 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + + +import java.util.HashMap; +import java.util.Map; + +import com.puremvc.patterns.proxy.Proxy; + +/** + * A Singleton IModel implementation. + *

+ *

+ * In PureMVC, the Model class provides + * access to model objects (Proxies) by named lookup. + *

+ *

+ * The Model assumes these responsibilities:

+ *

+ *

    + *
  • Maintain a cache of IProxy instances.
  • + *
  • Provide methods for registering, retrieving, and removing + * IProxy instances.
  • + *
+ *

+ *

+ * Your application must register IProxy instances + * with the Model. Typically, you use an + * ICommand to create and register IProxy + * instances once the Facade has initialized the Core + * actors.

+ * + * @see com.puremvc.patterns.proxy.BaseProxy BaseProxy + * @see com.puremvc.patterns.proxy.Proxy Proxy + */ +public class CoreModel implements Model { + + /** + * Singleton instance + */ + protected static CoreModel instance; + + /** + * Mapping of proxyNames to IProxy instances + */ + protected Map proxyMap; + + /** + * Constructor. + *

+ *

+ * This IModel implementation is a Multiton, + * so you should not call the constructor + * directly, but instead call the static Multiton + * Factory method Model.getInstance( multitonKey ) + * + * @throws Error Error if instance for this Multiton key instance has already been constructed + */ + protected CoreModel() { + instance = this; + proxyMap = new HashMap<>(); + initializeModel(); + } + + /** + * Model Multiton Factory method. + * + * @return the instance for this Multiton key + */ + public synchronized static CoreModel getInstance() { + if (instance == null) { + instance = new CoreModel(); + } + + return instance; + } + + /** + * Initialize the Singleton Model instance. + *

+ *

+ * Called automatically by the constructor, this is your opportunity to + * initialize the Singleton instance in your subclass without overriding the + * constructor. + *

+ */ + protected void initializeModel() { + } + + /** + * Register an Proxy with the Model. + * + * @param proxy an Proxy to be held by the Model. + */ + public void registerProxy(Proxy proxy) { + proxyMap.put(proxy.getProxyName(), proxy); + proxy.onRegister(); + } + + /** + * Remove an Proxy from the Model. + * + * @param proxyName Name of the Proxy instance to be removed. + * @return The IProxy that was removed from the Model + */ + public Proxy removeProxy(String proxyName) { + Proxy proxy = proxyMap.get(proxyName); + + if (proxy != null) { + proxyMap.remove(proxyName); + proxy.onRemove(); + } + + return proxy; + } + + /** + * Retrieve an Proxy from the Model. + * + * @param proxy + * @return the Proxy instance previously registered with the + * given proxyName. + */ + public T retrieveProxy(String proxy) { + return (T) proxyMap.get(proxy); + } + + /** + * Check if a Proxy is registered + * + * @param proxyName Name of the Proxy object to check for existance. + * @return Whether a Proxy is currently registered with the given proxyName. + */ + public boolean hasProxy(String proxyName) { + return proxyMap.containsKey(proxyName); + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreView.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreView.java new file mode 100644 index 00000000..623d112d --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/CoreView.java @@ -0,0 +1,271 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.puremvc.patterns.mediator.Mediator; +import com.puremvc.patterns.observer.BaseObserver; +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Observer; + +/** + * A Singleton IView implementation. + *

+ *

+ * In PureMVC, the View class assumes these responsibilities: + *

    + *
  • Maintain a cache of IMediator instances.
  • + *
  • Provide methods for registering, retrieving, and removing + * IMediators.
  • + *
  • Managing the observer lists for each INotification in the + * application.
  • + *
  • Providing a method for attaching IObservers to an + * INotification's observer list.
  • + *
  • Providing a method for broadcasting an INotification.
  • + *
  • Notifying the IObservers of a given + * INotification when it broadcast.
  • + *
+ * + * @see com.puremvc.patterns.mediator.Mediator Mediator + * @see com.puremvc.patterns.observer.Observer Observer + * @see com.puremvc.patterns.observer.Notification Notification + */ +public class CoreView implements View { + + // Singleton instance + private static CoreView instance; + // Mapping of Mediator names to Mediator instances + // Mapping of Notification names to Observer lists + private HashMap> observerMap; + private HashMap mediatorMap; + + /** + * Constructor. + *

+ *

+ * This IView implementation is a Singleton, so you should + * not call the constructor directly, but instead call the static Singleton + * Factory method View.getInstance() + * + * @throws Error Error if Singleton instance has already been constructed + */ + protected CoreView() { + instance = this; + + this.mediatorMap = new HashMap<>(); + this.observerMap = new HashMap<>(); + initializeView(); + } + + /** + * View Singleton Factory method. + * + * @return The Singleton instance of View + */ + public synchronized static CoreView getInstance() { + if (instance == null) + instance = new CoreView(); + + return instance; + } + + /** + * Initialize the Singleton View instance. + *

+ *

+ * Called automatically by the constructor, this is your opportunity to + * initialize the Singleton instance in your subclass without overriding + * the constructor. + *

+ */ + protected void initializeView() { + } + + /** + * Notify the Observers for a particular + * Notification. + *

+ *

+ * All previously attached Observers for this + * Notification's list are notified and are passed a + * reference to the Notification in the order in which they + * were registered. + *

+ * + * @param note the Notification to notify + * Observers of. + */ + public void notifyObservers(Notification note) { + List observerList = observerMap.get(note.getName()); + if (observerList != null) { + + // Copy observers from reference array to working array, + // since the reference array may change during the + //notification loop + Observer[] observers = observerList.toArray(new Observer[observerList.size()]); + + // Notify Observers from the working array + for (Observer observer : observers) { + observer.notifyObserver(note); + } + } + } + + /** + * Remove the observer for a given notifyContext from an observer list for a given Notification name. + * + * @param notificationName Which observer list to remove from + * @param notifyContext Remove the observer with this object as its notifyContext + */ + public void removeObserver(String notificationName, Object notifyContext) { + // the observer list for the notification under inspection + List observers = observerMap.get(notificationName); + + if (observers != null) { + // find the observer for the notifyContext + for (int i = 0; i < observers.size(); i++) { + BaseObserver observer = (BaseObserver) observers.get(i); + if (observer.compareNotifyContext(notifyContext)) { + observers.remove(observer); + } + } + + // Also, when a Notification's Observer list length falls to + // zero, delete the notification key from the observer map + if (observers.size() == 0) { + observerMap.remove(notificationName); + } + } + } + + /** + * Register an Mediator instance with the View. + *

+ *

+ * Registers the Mediator so that it can be retrieved by + * name, and further interrogates the Mediator for its + * Notification interests. + *

+ *

+ * If the Mediator returns any Notification + * names to be notified about, an Observer is created + * encapsulating the Mediator instance's + * handleNotification method and registering it as an + * Observer for all Notifications the + * Mediator is interested in. + *

+ * + * @param mediator the name to associate with this IMediator + * instance + */ + public void registerMediator(final Mediator mediator) { + if (mediatorMap.containsKey(mediator.getMediatorName())) { + return; + } + + // Register the Mediator for retrieval by name + mediatorMap.put(mediator.getMediatorName(), mediator); + + // Get Notification interests, if any. + String[] noteInterests = mediator.listNotificationInterests(); + if (noteInterests.length != 0) { + // Create Observer + BaseObserver observer = new BaseObserver(mediator::handleNotification, mediator); + + // Register Mediator as Observer for its list of Notification + // interests + for (String noteInterest : noteInterests) { + registerObserver(noteInterest, observer); + } + } + + // alert the mediator that it has been registered + mediator.onRegister(); + } + + /** + * Register an Observer to be notified of + * INotifications with a given name. + * + * @param notificationName the name of the Notifications to notify this + * Observer of + * @param observer the Observer to register + */ + public void registerObserver(String notificationName, Observer observer) { + if (observerMap.get(notificationName) == null) { + observerMap.put(notificationName, new ArrayList<>()); + } + + List observers = observerMap.get(notificationName); + observers.add(observer); + } + + /** + * Remove an Mediator from the View. + * + * @param mediatorName name of the Mediator instance to be removed. + */ + public Mediator removeMediator(String mediatorName) { + // Retrieve the named mediator + Mediator mediator = mediatorMap.get(mediatorName); + + if (mediator != null) { + // for every notification this mediator is interested in... + String[] interests = mediator.listNotificationInterests(); + for (String interest : interests) { + // remove the observer linking the mediator + // to the notification interest + removeObserver(interest, mediator); + } + + // remove the mediator from the map + mediatorMap.remove(mediatorName); + + // alert the mediator that it has been removed + mediator.onRemove(); + } + + return mediator; + } + + /** + * Retrieve an Mediator from the View. + * + * @param mediatorName the name of the Mediator instance to + * retrieve. + * @return the Mediator instance previously registered with + * the given mediatorName. + */ + public T retrieveMediator(String mediatorName) { + return (T) mediatorMap.get(mediatorName); + } + + /** + * Check if a Mediator is registered or not + * + * @param mediatorName + * @return whether a Mediator is registered with the given mediatorName. + */ + public boolean hasMediator(String mediatorName) { + return mediatorMap.containsKey(mediatorName); + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/Model.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/Model.java new file mode 100644 index 00000000..cc1847f5 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/Model.java @@ -0,0 +1,72 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + +import com.puremvc.patterns.proxy.Proxy; + +/** + * The interface definition for a PureMVC Model. + *

+ *

+ * In PureMVC, Model implementors provide access to + * Proxy objects by named lookup. + *

+ *

+ *

+ * An Model assumes these responsibilities: + *

+ *

+ *

    + *
  • Maintain a cache of Proxy instances
  • + *
  • Provide methods for registering, retrieving, and removing + * Proxy instances
  • + *
+ */ +public interface Model { + + /** + * Register an Proxy instance with the Model. + * + * @param proxy an object reference to be held by the Model. + */ + void registerProxy(Proxy proxy); + + /** + * Retrieve an Proxy instance from the Model. + * + * @param proxy + * @return the Proxy instance previously registered with the + * given proxyName. + */ + T retrieveProxy(String proxy); + + /** + * Remove an Proxy instance from the Model. + * + * @param proxy name of the Proxy instance to be removed. + */ + Proxy removeProxy(String proxy); + + /** + * Check if a Proxy is registered + * + * @param proxyName + * @return whether a Proxy is currently registered with the given proxyName. + */ + boolean hasProxy(String proxyName); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/core/View.java b/hyperlap2d-common-api/src/main/java/com/puremvc/core/View.java new file mode 100644 index 00000000..2d8fa336 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/core/View.java @@ -0,0 +1,122 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.core; + +import com.puremvc.patterns.mediator.Mediator; +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Observer; + +/** + * The interface definition for a PureMVC View. + *

+ *

+ * In PureMVC, View implementors assume these responsibilities: + *

+ *

+ *

+ * In PureMVC, the CoreView class assumes these responsibilities: + *

    + *
  • Maintain a cache of Mediator instances.
  • + *
  • Provide methods for registering, retrieving, and removing + * Mediators.
  • + *
  • Managing the observer lists for each Notification in the + * application.
  • + *
  • Providing a method for attaching Observers to an + * Notification's observer list.
  • + *
  • Providing a method for broadcasting an Notification.
  • + *
  • Notifying the Observers of a given + * Notification when it broadcast.
  • + *
+ * + * @see com.puremvc.patterns.mediator.Mediator Mediator + * @see com.puremvc.patterns.observer.Observer Observer + * @see com.puremvc.patterns.observer.Notification Notification + */ +public interface View { + + /** + * Register an IObserver to be notified of + * INotifications with a given name. + * + * @param noteName the name of the INotifications to notify this + * IObserver of + * @param observer the IObserver to register + */ + void registerObserver(String noteName, Observer observer); + + /** + * Notify the IObservers for a particular + * INotification. + *

+ *

+ * All previously attached IObservers for this + * INotification's list are notified and are passed a + * reference to the INotification in the order in which they + * were registered. + *

+ * + * @param note the INotification to notify + * IObservers of. + */ + void notifyObservers(Notification note); + + /** + * Register an IMediator instance with the View. + *

+ *

+ * Registers the IMediator so that it can be retrieved by + * name, and further interrogates the IMediator for its + * INotification interests. + *

+ *

+ * If the IMediator returns any INotification + * names to be notified about, an Observer is created + * encapsulating the IMediator instance's + * handleNotification method and registering it as an + * Observer for all INotifications the + * IMediator is interested in. + *

+ * + * @param mediator a reference to the IMediator instance + */ + void registerMediator(Mediator mediator); + + /** + * Retrieve an IMediator from the View. + * + * @param mediatorName the name of the IMediator instance to retrieve. + * @return the IMediator instance previously registered with + * the given mediatorName. + */ + T retrieveMediator(String mediatorName); + + /** + * Remove an IMediator from the View. + * + * @param mediatorName name of the IMediator instance to be removed. + */ + Mediator removeMediator(String mediatorName); + + /** + * Check if a Mediator is registered or not + * + * @param mediatorName + * @return whether a Mediator is registered with the given mediatorName. + */ + boolean hasMediator(String mediatorName); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/Command.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/Command.java new file mode 100644 index 00000000..44b1ae93 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/Command.java @@ -0,0 +1,37 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.command; + +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Notifier; + +/** + * The interface definition for a PureMVC Command. + * + * @see com.puremvc.patterns.observer Notification + */ +public interface Command extends Notifier { + + /** + * Execute the Command's logic to handle a given + * Notification. + * + * @param notification an Notification to handle. + */ + void execute(Notification notification); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/MacroCommand.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/MacroCommand.java new file mode 100644 index 00000000..adf281db --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/MacroCommand.java @@ -0,0 +1,138 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.command; + + +import java.util.Collection; +import java.util.Vector; + +import com.puremvc.patterns.observer.BaseNotifier; +import com.puremvc.patterns.observer.Notification; + + +/** + * A base ICommand implementation that executes other + * ICommands. + *

+ *

+ * A MacroCommand maintains an list of ICommand + * Class references called SubCommands. + *

+ *

+ *

+ * When execute is called, the MacroCommand + * instantiates and calls execute on each of its SubCommands + * turn. Each SubCommand will be passed a reference to the original + * INotification that was passed to the MacroCommand's + * execute method. + *

+ *

+ *

+ * Unlike SimpleCommand, your subclass should not override + * execute, but instead, should override the + * initializeMacroCommand method, calling + * addSubCommand once for each SubCommand to be executed. + *

+ *

+ *

+ * + * @see com.puremvc.core.Controller Controller + * @see com.puremvc.patterns.observer.Notification Notification + * @see com.puremvc.patterns.command.SimpleCommand SimpleCommand + */ +public class MacroCommand extends BaseNotifier implements Command { + + private Collection> subCommands = null; + + /** + * Constructor. + *

+ *

+ * You should not need to define a constructor, instead, override the + * initializeMacroCommand method. + *

+ *

+ *

+ * If your subclass does define a constructor, be sure to call + * super(). + *

+ */ + public MacroCommand() { + subCommands = new Vector<>(); + initializeMacroCommand(); + } + + /** + * Initialize the MacroCommand. + *

+ *

+ * In your subclass, override this method to initialize the + * MacroCommand's SubCommand list with + * ICommand class references like this: + *

+ *

+ *

// Initialize MyMacroCommand override protected function + * initializeMacroCommand( ) : void { addSubCommand( + * com.me.myapp.controller.FirstCommand ); addSubCommand( + * com.me.myapp.controller.SecondCommand ); addSubCommand( + * com.me.myapp.controller.ThirdCommand ); } + *

+ *

+ * Note that SubCommands may be any ICommand + * implementor, MacroCommands or SimpleCommands + * are both acceptable. + */ + protected void initializeMacroCommand() { + } + + /** + * Add a SubCommand. + *

+ *

+ * The SubCommands will be called in First In/First Out (FIFO) + * order. + *

+ * + * @param commandClassRef a reference to the Class of the + * ICommand. + */ + protected void addSubCommand(Class commandClassRef) { + subCommands.add(commandClassRef); + } + + /** + * Execute this MacroCommand's SubCommands. + *

+ *

+ * The SubCommands will be called in First In/First Out (FIFO) + * order. + * + * @param notification the INotification object to be passsed to each + * SubCommand. + */ + public void execute(Notification notification) { + for (Class commandClass : subCommands) { + try { + Command command = commandClass.newInstance(); + command.execute(notification); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/SimpleCommand.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/SimpleCommand.java new file mode 100644 index 00000000..9cdcf32e --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/command/SimpleCommand.java @@ -0,0 +1,53 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.command; + + +import com.puremvc.patterns.observer.BaseNotifier; +import com.puremvc.patterns.observer.Notification; + +/** + * A base ICommand implementation. + *

+ *

+ * Your subclass should override the execute method where your + * business logic will handle the INotification. + *

+ * + * @see com.puremvc.core.Controller Controller + * @see com.puremvc.patterns.observer.Notification Notification + * @see com.puremvc.patterns.command.MacroCommand MacroCommand + */ +public class SimpleCommand extends BaseNotifier implements Command { + + /** + * Fulfill the use-case initiated by the given INotification. + *

+ *

+ * In the Command Pattern, an application use-case typically begins with + * some user action, which results in an INotification being + * broadcast, which is handled by business logic in the execute + * method of an ICommand. + *

+ * + * @param notification the INotification to handle. + */ + public void execute(Notification notification) { + } + +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/Facade.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/Facade.java new file mode 100644 index 00000000..3150ad38 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/Facade.java @@ -0,0 +1,144 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.facade; + +import com.puremvc.patterns.command.Command; +import com.puremvc.patterns.mediator.Mediator; +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Notifier; +import com.puremvc.patterns.proxy.Proxy; + +/** + * The interface definition for a PureMVC Facade. + *

+ *

+ * The Facade Pattern suggests providing a single class to act as a central + * point of communication for a subsystem. + *

+ *

+ *

+ * In PureMVC, the Facade acts as an interface between the core MVC actors + * (Model, View, Controller) and the rest of your application. + *

+ * + * @see com.puremvc.core.Model Model + * @see com.puremvc.core.View View + * @see com.puremvc.core.Controller Controller + * @see com.puremvc.patterns.command.Command Command + * @see com.puremvc.patterns.observer.Notification Notification + */ +public interface Facade extends Notifier { + /** + * Notify Observers of an INotification. + * + * @param note the INotification to have the View + * notify observers of. + */ + void notifyObservers(Notification note); + + /** + * Register an IProxy with the Model by name. + * + * @param proxy the IProxy to be registered with the + * Model. + */ + void registerProxy(Proxy proxy); + + /** + * Retrieve a IProxy from the Model by name. + * + * @param proxyName the name of the IProxy instance to be + * retrieved. + * @return the IProxy previously regisetered by + * proxyName with the Model. + */ + T retrieveProxy(String proxyName); + + /** + * Remove an IProxy instance from the Model by + * name. + * + * @param proxyName the IProxy to remove from the + * Model. + */ + T removeProxy(String proxyName); + + /** + * Check if a Proxy is registered + * + * @param proxyName + * @return whether a Proxy is currently registered with the given proxyName. + */ + boolean hasProxy(String proxyName); + + /** + * Register an ICommand with the Controller. + * + * @param noteName the name of the INotification to associate the + * ICommand with. + * @param commandClassRef a reference to the Class of the + * ICommand. + */ + void registerCommand(String noteName, Class commandClassRef); + + /** + * Remove a previously registered ICommand to INotification mapping from the Controller. + * + * @param notificationName the name of the INotification to remove the ICommand mapping for + */ + void removeCommand(String notificationName); + + /** + * Check if a Command is registered for a given Notification + * + * @param notificationName + * @return whether a Command is currently registered for the given notificationName. + */ + boolean hasCommand(String notificationName); + + /** + * Register an IMediator instance with the View. + * + * @param mediator a reference to the IMediator instance + */ + void registerMediator(Mediator mediator); + + /** + * Retrieve an IMediator instance from the View. + * + * @param mediatorName the name of the IMediator instance to retrievve + * @return the IMediator previously registered with the given + * mediatorName. + */ + T retrieveMediator(String mediatorName); + + /** + * Check if a Mediator is registered or not + * + * @param mediatorName + * @return whether a Mediator is registered with the given mediatorName. + */ + boolean hasMediator(String mediatorName); + + /** + * Remove a IMediator instance from the View. + * + * @param mediatorName name of the IMediator instance to be removed. + */ + Mediator removeMediator(String mediatorName); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/SimpleFacade.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/SimpleFacade.java new file mode 100644 index 00000000..282f8cc1 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/facade/SimpleFacade.java @@ -0,0 +1,364 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.facade; + + +import com.puremvc.core.CoreController; +import com.puremvc.core.CoreModel; +import com.puremvc.core.CoreView; +import com.puremvc.patterns.command.Command; +import com.puremvc.patterns.mediator.Mediator; +import com.puremvc.patterns.observer.BaseNotification; +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.proxy.Proxy; + +/** + * A base Singleton Facade implementation. + * + * @see CoreModel Model + * @see CoreView View + * @see CoreController Controller + */ +public class SimpleFacade implements Facade { + /** + * The Singleton instance of the Facade + */ + protected static SimpleFacade instance = null; + + /** + * Reference to the Controller + */ + protected CoreController controller = null; + + /** + * Reference to the Model + */ + protected CoreModel model = null; + + /** + * Reference to the View + */ + protected CoreView view = null; + + /** + * Constructor. + *

+ *

+ * This IFacade implementation is a Singleton, so you should + * not call the constructor directly, but instead call the static Singleton + * Factory method Facade.getInstance() + */ + protected SimpleFacade() { + initializeFacade(); + } + + /** + * Facade Singleton Factory method + * + * @return The Singleton instance of the Facade + */ + public synchronized static SimpleFacade getInstance() { + if (instance == null) { + instance = new SimpleFacade(); + } + + return instance; + } + + /** + * Initialize the Multiton Facade instance. + *

+ *

+ * Called automatically by the constructor. Override in your + * subclass to do any subclass specific initializations. Be + * sure to call super.initializeFacade(), though.

+ */ + protected void initializeFacade() { + initializeModel(); + initializeController(); + initializeView(); + } + + /** + * Initialize the Controller. + *

+ *

+ * Called by the initializeFacade method. Override this + * method in your subclass of Facade if one or both of the + * following are true: + *

    + *
  • You wish to initialize a different IController.
  • + *
  • You have Commands to register with the + * Controller at startup..
  • + *
+ * If you don't want to initialize a different IController, + * call super.initializeController() at the beginning of your + * method, then register Commands. + *

+ */ + protected void initializeController() { + if (controller != null) { + return; + } + + controller = CoreController.getInstance(); + } + + /** + * Initialize the Model. + *

+ *

+ * Called by the initializeFacade method. Override this + * method in your subclass of Facade if one or both of the + * following are true: + *

    + *
  • You wish to initialize a different IModel.
  • + *
  • You have Proxys to register with the Model that do + * not retrieve a reference to the Facade at construction time.
  • + *
+ * If you don't want to initialize a different IModel, call + * super.initializeModel() at the beginning of your method, + * then register Proxys. + *

+ * Note: This method is rarely overridden; in practice you are more + * likely to use a Command to create and register Proxys + * with the Model, since Proxys with mutable + * tools will likely need to send INotifications and thus + * will likely want to fetch a reference to the Facade during + * their construction. + *

+ */ + protected void initializeModel() { + if (model != null) { + return; + } + + model = CoreModel.getInstance(); + } + + /** + * Initialize the View. + *

+ *

+ * Called by the initializeFacade method. Override this + * method in your subclass of Facade if one or both of the + * following are true: + *

    + *
  • You wish to initialize a different IView.
  • + *
  • You have Observers to register with the + * View
  • + *
+ * If you don't want to initialize a different IView, call + * super.initializeView() at the beginning of your method, + * then register IMediator instances. + *

+ * Note: This method is rarely overridden; in practice you are more + * likely to use a Command to create and register + * Mediators with the View, since + * IMediator instances will need to send + * INotifications and thus will likely want to fetch a + * reference to the Facade during their construction. + *

+ */ + protected void initializeView() { + if (view != null) { + return; + } + + view = CoreView.getInstance(); + } + + /** + * Register an ICommand with the Controller by + * Notification name. + * + * @param noteName the name of the INotification to associate the + * ICommand with + * @param command an instance of the ICommand + */ + public void registerCommand(String noteName, Class command) { + controller.registerCommand(noteName, command); + } + + /** + * Remove a previously registered ICommand to INotification mapping from the Controller. + * + * @param notificationName the name of the INotification to remove the ICommand mapping for + */ + public void removeCommand(String notificationName) { + controller.removeCommand(notificationName); + } + + /** + * Check if a Command is registered for a given Notification + * + * @param notificationName + * @return whether a Command is currently registered for the given notificationName. + */ + public boolean hasCommand(String notificationName) { + return controller.hasCommand(notificationName); + } + + /** + * Register a IMediator with the View. + * + * @param mediator the name to associate with this IMediator + */ + public void registerMediator(Mediator mediator) { + if (view != null) { + view.registerMediator(mediator); + } + } + + /** + * Register an IProxy with the Model by name. + * + * @param proxy the name of the IProxy instance to be + * registered with the Model. + */ + public void registerProxy(Proxy proxy) { + model.registerProxy(proxy); + } + + + + /** + * Remove an IMediator from the View. + * + * @param mediatorName name of the IMediator to be removed. + * @return the IMediator that was removed from the View + */ + public Mediator removeMediator(String mediatorName) { + if (this.view != null) { + return this.view.removeMediator(mediatorName); + } + return null; + } + + /** + * Remove an IProxy from the Model by name. + * + * @param proxyName the IProxy to remove from the + * Model. + * @return the IProxy that was removed from the Model + */ + public Proxy removeProxy(String proxyName) { + if (model != null) { + return model.removeProxy(proxyName); + } + return null; + } + + /** + * Check if a Proxy is registered + * + * @param proxyName + * @return whether a Proxy is currently registered with the given proxyName. + */ + public boolean hasProxy(String proxyName) { + return model.hasProxy(proxyName); + } + + + /** + * Check if a Mediator is registered or not + * + * @param mediatorName + * @return whether a Mediator is registered with the given mediatorName. + */ + public boolean hasMediator(String mediatorName) { + return view.hasMediator(mediatorName); + } + + /** + * Retrieve an IMediator from the View. + * + * @param mediatorName + * @return the IMediator previously registered with the given + * mediatorName. + */ + public T retrieveMediator(String mediatorName) { + return this.view.retrieveMediator(mediatorName); + } + + /** + * Retrieve an IProxy from the Model by name. + * + * @param proxyName the name of the proxy to be retrieved. + * @return the IProxy instance previously registered with the + * given proxyName. + */ + + @Override + public T retrieveProxy(String proxyName) { + return this.model.retrieveProxy(proxyName); + } + /** + * Create and send an INotification. + *

+ *

+ * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param notificationName the name of the notification to send + * @param body the body of the notification (optional) + * @param type the type of the notification (optional) + */ + public void sendNotification(String notificationName, Object body, String type) { + notifyObservers(new BaseNotification(notificationName, body, type)); + } + + /** + * Create and send an INotification. + *

+ *

+ * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param notificationName the name of the notification to send + * @param body the body of the notification (optional) + */ + public void sendNotification(String notificationName, Object body) { + sendNotification(notificationName, body, null); + } + + /** + * Create and send an INotification. + *

+ *

+ * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param notificationName the name of the notification to send + */ + public void sendNotification(String notificationName) { + sendNotification(notificationName, null, null); + } + + /** + * Notify Observers of an INotification. + * + * @param note the INotification to have the View + * notify observers of. + */ + public void notifyObservers(Notification note) { + if (view != null) { + view.notifyObservers(note); + } + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/Mediator.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/Mediator.java new file mode 100644 index 00000000..3475ee8a --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/Mediator.java @@ -0,0 +1,143 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.mediator; + +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Notifier; + +/** + * The interface definition for a PureMVC Mediator. + *

+ *

+ * In PureMVC, IMediator implementors assume these + * responsibilities: + *

+ *
    + *
  • Implement a common method which returns a list of all + * INotifications the IMediator has interest in.
  • + *
  • Implement a common notification (callback) method.
  • + *
+ *

+ * Additionally, IMediators typically: + *

    + *
  • Act as an intermediary between one or more view components such as text + * panels or list controls, maintaining references and coordinating their + * behavior.
  • + *
  • In Flash-based apps, this is often the place where event listeners are + * added to view components, and their handlers implemented.
  • + *
  • Respond to and generate INotifications, interacting with + * of the rest of the PureMVC app. + *
+ *

+ *

+ * When an IMediator is registered with the IView, + * the IView will call the IMediator's + * listNotificationInterests method. The IMediator + * will return an Array of INotification names + * which it wishes to be notified about. + *

+ *

+ *

+ * The IView will then create an Observer object + * encapsulating that IMediator's (handleNotification) + * method and register it as an Observer for each INotification + * name returned by listNotificationInterests. + *

+ *

+ *

+ * A concrete IMediator implementor usually looks something like this: + *

+ *

+ *

import org.puremvc.patterns.mediator.~~; import + * org.puremvc.patterns.observer.~~; import org.puremvc.core.view.~~; + *

+ * import com.me.myapp.model.~~; import com.me.myapp.view.~~; import + * com.me.myapp.controller.~~; + *

+ * import mx.controls.ComboBox; import mx.events.ListEvent; + *

+ * public class MyMediator extends Mediator implements IMediator { + *

+ * public function MyComboMediator( viewComponent:Object ) { super( + * viewComponent ); combo.addEventListener( Event.CHANGE, onChange ); } + *

+ * public function listNotificationInterests():Array { return [ + * MyFacade.SET_SELECTION, MyFacade.SET_DATAPROVIDER ]; } + *

+ * public function handleNotification( notification:INotification ):void { + * switch ( notification.getName() ) { case MyFacade.SET_SELECTION: + * setSelection(notification); break; case MyFacade.SET_DATAPROVIDER: + * setDataProvider(notification); break; } } // Set the tools provider of the + * combo box private function setDataProvider( notification:INotification ):void { + * combo.dataProvider = notification.getBody() as Array; } // Invoked when the + * combo box dispatches a change event, we send a // notification with the + * private function onChange(event:ListEvent):void { sendNotification( + * MyFacade.MYCOMBO_CHANGED, this ); } // A private getter for accessing the + * view object by class private function get combo():ComboBox { return view as + * ComboBox; } }

+ * + * @see com.puremvc.patterns.observer.Notification Notification + */ +public interface Mediator extends Notifier { + + /** + * Get the IMediator instance name + * + * @return the IMediator instance name + */ + String getMediatorName(); + + /** + * Get the IMediator's view component. + * + * @return Object the view component + */ + V getViewComponent(); + + /** + * Set the IMediator's view component. + * + * @param viewComponent The view component + */ + void setViewComponent(V viewComponent); + + /** + * List INotification interests. + * + * @return an Array of the INotification names + * this IMediator has an interest in. + */ + String[] listNotificationInterests(); + + /** + * Handle an INotification. + * + * @param notification the INotification to be handled + */ + void handleNotification(Notification notification); + + /** + * Called by the View when the Mediator is registered + */ + void onRegister(); + + /** + * Called by the View when the Mediator is removed + */ + void onRemove(); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/SimpleMediator.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/SimpleMediator.java new file mode 100644 index 00000000..b904d8f1 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/mediator/SimpleMediator.java @@ -0,0 +1,127 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.mediator; + + +import com.puremvc.patterns.observer.BaseNotifier; +import com.puremvc.patterns.observer.Notification; +import com.puremvc.patterns.observer.Notifier; + +/** + * A base Mediator implementation. + * + * @see com.puremvc.core.View View + */ +public class SimpleMediator extends BaseNotifier implements Mediator, Notifier { + + /** + * The default name of the SimpleMediator. + */ + public static final String NAME = "SimpleMediator"; + + /** + * The name of the Mediator. + */ + protected String mediatorName = null; + + /** + * The view component + */ + protected V viewComponent = null; + + /** + * Constructor. + * + * @param mediatorName + * @param viewComponent + */ + public SimpleMediator(String mediatorName, V viewComponent) { + this.mediatorName = (mediatorName != null) ? mediatorName : NAME; + this.viewComponent = viewComponent; + } + + /** + * Get the name of the Mediator. + * + * @return the name + */ + public final String getMediatorName() { + return mediatorName; + } + + /** + * Get the Mediator's view component. + *

+ *

+ * Additionally, an implicit getter will usually be defined in the subclass + * that casts the view object to a type, like this: + *

+ *

+ *

private function get comboBox : mx.controls.ComboBox { return + * viewComponent as mx.controls.ComboBox; } + * + * @return the view component + */ + public V getViewComponent() { + return viewComponent; + } + + /** + * Set the IMediator's view component. + * + * @param viewComponent The view component + */ + public void setViewComponent(V viewComponent) { + this.viewComponent = viewComponent; + } + + /** + * Handle INotifications. + *

+ *

+ * Typically this will be handled in a switch statement, with one 'case' + * entry per INotification the Mediator is + * interested in. + * + * @param notification + */ + public void handleNotification(Notification notification) { + } + + /** + * List the INotification names this Mediator + * is interested in being notified of. + * + * @return String[] the list of INotification names + */ + public String[] listNotificationInterests() { + return new String[]{}; + } + + /** + * Called by the View when the Mediator is registered + */ + public void onRegister() { + } + + /** + * Called by the View when the Mediator is removed + */ + public void onRemove() { + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotification.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotification.java new file mode 100644 index 00000000..6671342e --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotification.java @@ -0,0 +1,169 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + + +/** + * A base Notification implementation. + *

+ *

+ * PureMVC does not rely upon underlying event models such as the one provided + * with Flash, and ActionScript 3 does not have an inherent event model. + *

+ *

+ *

+ * The Observer Pattern as implemented within PureMVC exists to support + * event-driven communication between the application and the actors of the MVC + * triad. + *

+ *

+ *

+ * Notifications are not meant to be a replacement for Events in + * Flex/Flash/Apollo. Generally, IMediator implementors place + * event listeners on their view components, which they then handle in the usual + * way. This may lead to the broadcast of Notifications to + * trigger ICommands or to communicate with other + * IMediators. IProxy and ICommand + * instances communicate with each other and IMediators by + * broadcasting INotifications. + *

+ *

+ *

+ * A key difference between Flash Events and PureMVC + * Notifications is that Events follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy until + * some parent component handles the Event, while PureMVC + * Notifications follow a 'Publish/Subscribe' pattern. PureMVC + * classes need not be related to each other in a parent/child relationship in + * order to communicate with one another using Notifications. + * + * @see com.puremvc.patterns.observer Observer + */ +public class BaseNotification implements Notification { + + // the name of the notification instance + // the type of the notification instance + protected String name = null; + protected String type = null; + + // the body of the notification instance + protected Object body = null; + + /** + * Constructor. + * + * @param name name of the Notification instance. (required) + * @param body the Notification body. (optional) + * @param type the type of the Notification (optional) + */ + public BaseNotification(String name, Object body, String type) { + this.name = name; + this.body = body; + this.type = type; + } + + /** + * Constructor. + * + * @param name name of the Notification instance. (required) + */ + public BaseNotification(String name) { + this.name = name; + body = null; + type = null; + } + + /** + * Constructor. + * + * @param name name of the Notification instance. (required) + * @param body the Notification body. (optional) + */ + public BaseNotification(String name, Object body) { + this.name = name; + this.body = body; + type = null; + } + + /** + * Get the body of the Notification instance. + * + * @return the body object. + */ + public T getBody() { + return (T) body; + } + + /** + * Set the body of the Notification instance. + * + * @param body + */ + public void setBody(T body) { + this.body = body; + } + + /** + * Get the name of the Notification instance. + * + * @return the name of the Notification instance. + */ + public String getName() { + return name; + } + + /** + * Get the type of the Notification instance. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Set the type of the Notification instance. + * + * @param type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Get the string representation of the Notification + * instance. + * + * @return the string representation of the Notification + * instance. + */ + public String toString() { + String result = "Notification Name: " + getName() + " Body:"; + if (body != null) + result += body.toString() + " Type:"; + else + result += "null Type:"; + + if (type != null) + result += type; + else + result += "null "; + + return result; + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotifier.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotifier.java new file mode 100644 index 00000000..4e77a52b --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseNotifier.java @@ -0,0 +1,103 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + + +import com.puremvc.patterns.facade.SimpleFacade; + +/** + * A Base Notifier implementation. + *

+ *

+ * MacroCommand, Command, Mediator and Proxy all + * have a need to send Notifications. + *

+ *

+ * The INotifier interface provides a common method called + * sendNotification that relieves implementation code of the + * necessity to actually construct Notifications. + *

+ *

+ *

+ * The Notifier class, which all of the above mentioned classes + * extend, provides an initialized reference to the Facade + * Singleton, which is required for the convienience method for sending + * Notifications, but also eases implementation as these classes + * have frequent Facade interactions and usually require access + * to the facade anyway. + *

+ * + * @see com.puremvc.patterns.facade.Facade Facade + * @see com.puremvc.patterns.mediator.Mediator Mediator + * @see com.puremvc.patterns.proxy Proxy + * @see com.puremvc.patterns.command.SimpleCommand SimpleCommand + * @see com.puremvc.patterns.command.MacroCommand MacroCommand + */ +public class BaseNotifier { + // The Multiton Key for this app + /** + * Local reference to the Facade Singleton + */ + protected SimpleFacade facade; + + /** + * Send an Notifications. + *

+ *

+ * Keeps us from having to construct new notification instances in our + * implementation code. + * + * @param notificationName the name of the notiification to send + * @param body the body of the notification (optional) + * @param type the type of the notification (optional) + */ + + public void sendNotification(String notificationName, Object body, String type) { + facade.sendNotification(notificationName, body, type); + } + + /** + * Send an INotifications. + *

+ *

+ * Keeps us from having to construct new notification instances in our + * implementation code. + * + * @param notificationName the name of the notiification to send + * @param body the body of the notification (optional) + */ + + public void sendNotification(String notificationName, Object body) { + facade.sendNotification(notificationName, body); + } + + /** + * Send an INotifications. + *

+ *

+ * Keeps us from having to construct new notification instances in our + * implementation code. + * + * @param notificationName the name of the notiification to send + */ + + public void sendNotification(String notificationName) { + facade.sendNotification(notificationName); + } + +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseObserver.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseObserver.java new file mode 100644 index 00000000..e4dc821a --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/BaseObserver.java @@ -0,0 +1,127 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + + +/** + * A base IObserver implementation. + *

+ *

+ * An Observer is an object that encapsulates information about + * an interested object with a method that should be called when a particular + * INotification is broadcast. + *

+ *

+ *

+ * In PureMVC, the Observer class assumes these responsibilities: + *

    + *
  • Encapsulate the notification (callback) method of the interested object.
  • + *
  • Encapsulate the notification context (this) of the interested object.
  • + *
  • Provide methods for setting the notification method and context.
  • + *
  • Provide a method for notifying the interested object.
  • + *
+ * + * @see com.puremvc.core.View View + * @see com.puremvc.patterns.observer.Notification Notification + */ +public class BaseObserver implements Observer { + + private Object context; + + private Function notify; + + /** + * Constructor. + *

+ *

+ * The notification method on the interested object should take one + * parameter of type INotification + *

+ * + * @param notify the notification method of the interested object + * @param context the notification context of the interested object + */ + public BaseObserver(Function notify, Object context) { + setNotifyContext(context); + setNotifyMethod(notify); + } + + /** + * Compare an object to the notification context. + * + * @param object the object to compare + * @return boolean indicating if the object and the notification context are + * the same + */ + public boolean compareNotifyContext(Object object) { + return context == object; + } + + /** + * Notify the interested object. + * + * @param notification the INotification to pass to the interested + * object's notification method. + */ + public void notifyObserver(Notification notification) { + getNotifyMethod().onNotification(notification); + } + + /** + * Get the notification method. + * + * @return the notification (callback) method of the interested object. + */ + public Function getNotifyMethod() { + return notify; + } + + /** + * Set the notification method. + *

+ *

+ * The notification method should take one parameter of type + * INotification. + *

+ * + * @param notifyMethod the notification (callback) method of the interested object. + */ + public void setNotifyMethod(Function notifyMethod) { + notify = notifyMethod; + } + + /** + * Get the notification context. + * + * @return the notification context (this) of the + * interested object. + */ + public Object getNotifyContext() { + return context; + } + + /** + * Set the notification context. + * + * @param notifyContext the notification context (this) of the interested object. + */ + public void setNotifyContext(Object notifyContext) { + context = notifyContext; + } + +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notification.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notification.java new file mode 100644 index 00000000..f7d7503b --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notification.java @@ -0,0 +1,103 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + +/** + * The interface definition for a PureMVC Notification. + *

+ *

+ * PureMVC does not rely upon underlying event models such as the one provided + * with Flash, and ActionScript 3 does not have an inherent event model. + *

+ *

+ *

+ * The Observer Pattern as implemented within PureMVC exists to support + * event-driven communication between the application and the actors of the MVC + * triad. + *

+ *

+ *

+ * Notifications are not meant to be a replacement for Events in + * Flex/Flash/Apollo. Generally, IMediator implementors place + * event listeners on their view components, which they then handle in the usual + * way. This may lead to the broadcast of Notifications to + * trigger ICommands or to communicate with other + * IMediators. IProxy and ICommand + * instances communicate with each other and IMediators by + * broadcasting INotifications. + *

+ *

+ *

+ * A key difference between Flash Events and PureMVC + * Notifications is that Events follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy until + * some parent component handles the Event, while PureMVC + * Notifications follow a 'Publish/Subscribe' pattern. PureMVC + * classes need not be related to each other in a parent/child relationship in + * order to communicate with one another using Notifications. + * + * @see com.puremvc.core.View View + * @see com.puremvc.patterns.observer.Observer Observer + */ +public interface Notification { + + /** + * Get the name of the INotification instance. No setter, + * should be set by constructor only + * + * @return the name + */ + String getName(); + + /** + * Get the body of the INotification instance + * + * @return the body + */ + T getBody(); + + /** + * Set the body of the INotification instance + * + * @param body + */ + void setBody(T body); + + /** + * Get the type of the INotification instance + * + * @return the type + */ + String getType(); + + /** + * Set the type of the Notification instance + * + * @param type the type + */ + void setType(String type); + + /** + * Get the string representation of the INotification + * instance + * + * @return the string representation of the INotification + * instance + */ + String toString(); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notifier.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notifier.java new file mode 100644 index 00000000..1a0774d2 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Notifier.java @@ -0,0 +1,86 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + +/** + * The interface definition for a PureMVC Notifier. + *

+ *

+ * MacroCommand, Command, Mediator and Proxy all + * have a need to send Notifications. + *

+ *

+ *

+ * The INotifier interface provides a common method called + * sendNotification that relieves implementation code of the + * necessity to actually construct Notifications. + *

+ *

+ *

+ * The Notifier class, which all of the above mentioned classes + * extend, also provides an initialized reference to the Facade + * Singleton, which is required for the convienience method for sending + * Notifications, but also eases implementation as these classes + * have frequent Facade interactions and usually require access + * to the facade anyway. + *

+ * + * @see com.puremvc.patterns.facade.Facade Facade + * @see com.puremvc.patterns.observer.Notification Notification + */ +public interface Notifier { + + /** + * Send a INotification. + *

+ *

+ * Convenience method to prevent having to construct new notification + * instances in our implementation code. + *

+ * + * @param notificationName the name of the notification to send + * @param body the body of the notification (optional) + * @param type the type of the notification (optional) + */ + void sendNotification(String notificationName, Object body, String type); + + /** + * Send a INotification. + *

+ *

+ * Convenience method to prevent having to construct new notification + * instances in our implementation code. + *

+ * + * @param notificationName the name of the notification to send + * @param body the body of the notification (optional) + */ + void sendNotification(String notificationName, Object body); + + /** + * Send a INotification. + *

+ *

+ * Convenience method to prevent having to construct new notification + * instances in our implementation code. + *

+ * + * @param notificationName the name of the notification to send + */ + void sendNotification(String notificationName); +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Observer.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Observer.java new file mode 100644 index 00000000..76c24efb --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/observer/Observer.java @@ -0,0 +1,108 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.observer; + +/** + * The interface definition for a PureMVC Observer. + *

+ *

+ * In PureMVC, IObserver implementors assume these + * responsibilities: + *

    + *
  • Encapsulate the notification (callback) method of the interested object.
  • + *
  • Encapsulate the notification context (this) of the interested object.
  • + *
  • Provide methods for setting the interested object' notification method + * and context.
  • + *
  • Provide a method for notifying the interested object.
  • + *
+ *

+ *

+ * PureMVC does not rely upon underlying event models such as the one provided + * with Flash, and ActionScript 3 does not have an inherent event model. + *

+ *

+ *

+ * The Observer Pattern as implemented within PureMVC exists to support event + * driven communication between the application and the actors of the MVC triad. + *

+ *

+ *

+ * An Observer is an object that encapsulates information about an interested + * object with a notification method that should be called when an INotification + * is broadcast. The Observer then acts as a proxy for notifying the interested + * object. + *

+ *

+ * Observers can receive Notifications by having their notifyObserver + * method invoked, passing in an object implementing the INotification + * interface, such as a subclass of Notification. + *

+ * + * @see com.puremvc.core.View View + * @see com.puremvc.patterns.observer.Notification Notification + */ +public interface Observer { + + /** + * Set the notification method. + *

+ *

+ * The notification method should take one parameter of type + * INotification + *

+ * + * @param notifyMethod the notification (callback) method of the interested object + */ + void setNotifyMethod(BaseObserver.Function notifyMethod); + + /** + * Set the notification context. + * + * @param notifyContext the notification context (this) of the interested object + */ + void setNotifyContext(Object notifyContext); + + /** + * Notify the interested object. + * + * @param notification the INotification to pass to the interested + * object's notification method + */ + void notifyObserver(Notification notification); + + /** + * Compare the given object to the notificaiton context object. + * + * @param object the object to compare. + * @return boolean indicating if the notification context and the object are + * the same. + */ + boolean compareNotifyContext(Object object); + + /** + * This interface must be implemented by all classes that want to be notified of + * a notification. + */ + interface Function { + + /** + * @param notification + */ + void onNotification(Notification notification); + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/BaseProxy.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/BaseProxy.java new file mode 100644 index 00000000..dc7c69ca --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/BaseProxy.java @@ -0,0 +1,120 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.proxy; + + +import com.puremvc.patterns.observer.BaseNotifier; + +/** + * A base IProxy implementation. + *

+ *

+ * In PureMVC, Proxy classes are used to manage parts of the + * application's tools model. + *

+ *

+ *

+ * A Proxy might simply manage a reference to a local tools + * object, in which case interacting with it might involve setting and getting + * of its tools in synchronous fashion. + *

+ *

+ *

+ * Proxy classes are also used to encapsulate the application's + * interaction with remote services to save or retrieve tools, in which case, we + * adopt an asyncronous idiom; setting tools (or calling a method) on the + * Proxy and listening for a Notification to be + * sent when the Proxy has retrieved the tools from the service. + *

+ * + * @see com.puremvc.core.Model Model + */ +public class BaseProxy extends BaseNotifier implements Proxy { + + // the proxy name + protected String proxyName = "BaseProxy"; + + // the tools object + protected Object data = null; + + /** + * Constructor + * + * @param proxyName + * @param data + */ + public BaseProxy(String proxyName, Object data) { + if (proxyName != null) { + this.proxyName = proxyName; + } + if (data != null) { + this.data = data; + } + } + + /** + * Constructor + * + * @param proxyName Name of the Proxy + */ + public BaseProxy(String proxyName) { + if (proxyName != null) { + this.proxyName = proxyName; + } + + } + + /** + * Get the proxy name + * + * @return the proxy name + */ + public String getProxyName() { + return proxyName; + } + + /** + * Get the tools object + * + * @return the tools object + */ + public Object getData() { + return data; + } + + /** + * Set the tools object + * + * @param data + */ + public void setData(Object data) { + this.data = data; + } + + /** + * Called by the Model when the Proxy is registered + */ + public void onRegister() { + } + + /** + * Called by the Model when the Proxy is removed + */ + public void onRemove() { + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/Proxy.java b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/Proxy.java new file mode 100644 index 00000000..8dfb86b1 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/puremvc/patterns/proxy/Proxy.java @@ -0,0 +1,76 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package com.puremvc.patterns.proxy; + +import com.puremvc.patterns.observer.Notifier; + +/** + * The interface definition for a PureMVC Proxy. + *

+ *

+ * In PureMVC, Iroxy implementors assume these responsibilities: + *

+ *
    + *
  • Implement a common method which returns the name of the Proxy.
  • + *
+ *

+ * Additionally, IProxys typically: + *

+ *
    + *
  • Maintain references to one or more pieces of model tools.
  • + *
  • Provide methods for manipulating that tools.
  • + *
  • Generate INotifications when their model tools changes.
  • + *
  • Expose their name as a public static const called NAME, if they are not instantiated multiple times.
  • + *
  • Encapsulate interaction with local or remote services used to fetch and + * persist model tools.
  • + *
+ */ +public interface Proxy extends Notifier { + + /** + * Get the Proxy name + * + * @return the Proxy instance name + */ + String getProxyName(); + + /** + * Get the tools object + * + * @return the tools as type Object + */ + Object getData(); + + /** + * Set the tools object + * + * @param data the tools object + */ + void setData(Object data); + + /** + * Called by the Model when the Proxy is registered + */ + void onRegister(); + + /** + * Called by the Model when the Proxy is removed + */ + void onRemove(); + +} diff --git a/hyperlap2d-common-api/src/main/java/com/vo/CursorData.java b/hyperlap2d-common-api/src/main/java/com/vo/CursorData.java new file mode 100644 index 00000000..99551058 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/vo/CursorData.java @@ -0,0 +1,50 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package com.vo; + +import com.badlogic.gdx.graphics.Cursor; + +/** + * Created by azakhary on 5/15/2015. + */ +public class CursorData { + + public String region; + public int hotspotX; + public int hotspotY; + public Cursor.SystemCursor systemCursor; + + public CursorData(String region, int x, int y) { + this.region = region; + hotspotX = x; + hotspotY = y; + } + + public CursorData(Cursor.SystemCursor cursor) { + systemCursor = cursor; + } + + public int getHotspotX() { + return hotspotX; + } + + public int getHotspotY() { + return hotspotY; + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/vo/EditorConfigVO.java b/hyperlap2d-common-api/src/main/java/com/vo/EditorConfigVO.java new file mode 100644 index 00000000..5e0264fa --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/vo/EditorConfigVO.java @@ -0,0 +1,39 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package com.vo; + +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; + +/** + * Created by sargis on 8/1/14. + */ +public class EditorConfigVO { + public static final String EDITOR_CONFIG_FILE = "config.pit"; + public String lastOpenedSystemPath = ""; + public String lastImportedSystemPath = ""; + + public String constructJsonString() { + String str = ""; + Json json = new Json(); + json.setOutputType(JsonWriter.OutputType.json); + str = json.toJson(this); + return str; + } +} diff --git a/hyperlap2d-common-api/src/main/java/com/vo/ProjectVO.java b/hyperlap2d-common-api/src/main/java/com/vo/ProjectVO.java new file mode 100644 index 00000000..805462af --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/vo/ProjectVO.java @@ -0,0 +1,50 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package com.vo; + +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter.OutputType; + +import java.util.ArrayList; + +public class ProjectVO { + + public String projectName = ""; + + public String projectVersion = null; + + public String projectMainExportPath = ""; + + public String lastOpenScene = ""; + public String lastOpenResolution = ""; + public String texturepackerWidth = "2048"; + public String texturepackerHeight = "2048"; + public boolean texturepackerDuplicate; + + public ArrayList sceneConfigs = new ArrayList<>(); + + + public String constructJsonString() { + String str = ""; + Json json = new Json(); + json.setOutputType(OutputType.json); + str = json.toJson(this); + return str; + } +} \ No newline at end of file diff --git a/hyperlap2d-common-api/src/main/java/com/vo/SceneConfigVO.java b/hyperlap2d-common-api/src/main/java/com/vo/SceneConfigVO.java new file mode 100644 index 00000000..8bdd000f --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/com/vo/SceneConfigVO.java @@ -0,0 +1,32 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package com.vo; + +/** + * Created by azakhary on 7/18/2015. + * + * Here we keep all editor specific but not runtime specific data per scene. (like for example last camera position) + */ +public class SceneConfigVO { + + public String sceneName = ""; + + // 0 = x, 1 = y + public float[] cameraPosition = new float[2]; +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/H2DDialog.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/H2DDialog.java new file mode 100644 index 00000000..995d0165 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/H2DDialog.java @@ -0,0 +1,73 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.util.InputValidator; +import com.kotcrab.vis.ui.widget.VisDialog; +import com.kotcrab.vis.ui.widget.VisImageButton; +import com.kotcrab.vis.ui.widget.VisTextField; +import com.kotcrab.vis.ui.widget.VisValidatableTextField; + +/** + * Created by sargis on 4/27/15. + */ +public class H2DDialog extends VisDialog { + protected final Skin skin; + + public H2DDialog(String title) { + super(title); + skin = VisUI.getSkin(); + } + + protected VisTextField createTextField() { + return new VisTextField("", "light"); + } + + protected VisTextField createTextField(String text) { + return new VisTextField(text, "light"); + } + + protected VisTextField createTextField(String text, VisTextField.TextFieldFilter textFieldFilter) { + VisTextField visTextField = createTextField(text); + visTextField.setTextFieldFilter(textFieldFilter); + return visTextField; + } + + protected VisValidatableTextField createValidableTextField(String text, InputValidator inputValidator) { + VisValidatableTextField visTextField = new VisValidatableTextField(inputValidator); + visTextField.setText(text); + visTextField.setStyle(skin.get("light", VisTextField.VisTextFieldStyle.class)); + return visTextField; + } + + protected VisValidatableTextField createValidableTextField(InputValidator inputValidator) { + VisValidatableTextField visTextField = createValidableTextField("", inputValidator); + return visTextField; + } + + protected VisValidatableTextField createValidableTextField(String text, InputValidator inputValidator, VisTextField.TextFieldFilter textFieldFilter) { + VisValidatableTextField visTextField = createValidableTextField(text, inputValidator); + visTextField.setTextFieldFilter(textFieldFilter); + return visTextField; + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/IItemCommand.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/IItemCommand.java new file mode 100644 index 00000000..7c6183ac --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/IItemCommand.java @@ -0,0 +1,29 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common; + +/** + * Created by azakhary on 10/23/2015. + */ +public interface IItemCommand { + + void doAction(Object body); + void undoAction(Object body); + +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java new file mode 100644 index 00000000..f37ce1da --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java @@ -0,0 +1,138 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common; + +/** + * Created by azakhary on 10/23/2015. + */ +public class MsgAPI { + + /** + * Previous Overlap2D class notifications + */ + public static final String GLOBAL_PREFIX = "games.rednblack.editor.HyperLap2D"; + + public static final String APP_EXIT = GLOBAL_PREFIX + ".APP_EXIT"; + + public static final String PAUSE = GLOBAL_PREFIX + ".PAUSE"; + public static final String RESUME = GLOBAL_PREFIX + ".RESUME"; + public static final String RENDER = GLOBAL_PREFIX + ".RENDER"; + public static final String RESIZE = GLOBAL_PREFIX + ".RESIZE"; + public static final String DISPOSE = GLOBAL_PREFIX + ".DISPOSE"; + public static final String CREATE = GLOBAL_PREFIX + ".CREATE_BTN_CLICKED"; + + // tmp events + public static final String ZOOM_CHANGED = GLOBAL_PREFIX + ".ZOOM_CHANGED"; + public static final String GRID_SIZE_CHANGED = GLOBAL_PREFIX + ".GRID_SIZE_CHANGED"; + public static final String LOCK_LINES_CHANGED = GLOBAL_PREFIX + ".LOCK_LINES_CHANGED"; + public static final String HIDE_GRID = GLOBAL_PREFIX + ".HIDE_GRID"; + public static final String SHOW_GRID = GLOBAL_PREFIX + ".SHOW_GRID"; + public static final String ITEM_DATA_UPDATED = GLOBAL_PREFIX + ".ITEM_DATA_UPDATED"; + public static final String ITEM_PROPERTY_DATA_FINISHED_MODIFYING = GLOBAL_PREFIX + ".ITEM_PROPERTY_DATA_FINISHED_MODIFYING"; + + // this should move + public static final String HIDE_SELECTIONS = GLOBAL_PREFIX + ".HIDE_SELECTIONS"; + public static final String SHOW_SELECTIONS = GLOBAL_PREFIX + ".SHOW_SELECTIONS"; + public static final String ITEM_SELECTION_CHANGED = GLOBAL_PREFIX + ".ITEM_SELECTION_CHANGED"; + public static final String EMPTY_SPACE_CLICKED = GLOBAL_PREFIX + ".EMPTY_SPACE_CLICKED"; + + public static final String SCENE_RIGHT_CLICK = GLOBAL_PREFIX + ".SCENE_RIGHT_CLICK"; + public static final String ITEM_RIGHT_CLICK = GLOBAL_PREFIX + ".ITEM_RIGHT_CLICK"; + + public static final String LIBRARY_LIST_UPDATED = GLOBAL_PREFIX + ".LIBRARY_LIST_UPDATED"; + + private static final String TOOL_BOX_MEDIATOR_PREFIX = "games.rednblack.editor.view.ui.box.UIToolBoxMediator"; + public static final String TOOL_SELECTED = TOOL_BOX_MEDIATOR_PREFIX + ".TOOL_CHANGED"; + public static final String NEW_TOOL_ADDED = TOOL_BOX_MEDIATOR_PREFIX + ".NEW_TOOL_ADDED"; + + private static final String IMAGES_TAB_MEDIATOR_PREFIX= "games.rednblack.editor.view.ui.box.resourcespanel.UIImagesTabMediator"; + public static final String ADD_TARGET = IMAGES_TAB_MEDIATOR_PREFIX + ".ADD_TARGET"; + + /** + * Previous Sandbox class notifications + */ + public static final String SANDBOX_PREFIX = "games.rednblack.editor.gdx.commands.Sandbox"; + + public static final String ACTION_GROUP_ITEMS = SANDBOX_PREFIX + "ACTION_GROUP_ITEMS"; + public static final String ACTION_CAMERA_CHANGE_COMPOSITE = SANDBOX_PREFIX + "ACTION_CAMERA_CHANGE_COMPOSITE"; + public static final String ACTION_CONVERT_TO_BUTTON = SANDBOX_PREFIX + "ACTION_CONVERT_TO_BUTTON"; + public static final String ACTION_CUT = SANDBOX_PREFIX + "ACTION_CUT"; + public static final String ACTION_COPY = SANDBOX_PREFIX + "ACTION_COPY"; + public static final String ACTION_PASTE = SANDBOX_PREFIX + "ACTION_PASTE"; + public static final String ACTION_DELETE = SANDBOX_PREFIX + "ACTION_DELETE"; + public static final String ACTION_CREATE_ITEM = SANDBOX_PREFIX + "ACTION_CREATE_ITEM"; + + public static final String ACTION_DELETE_LAYER = SANDBOX_PREFIX + "ACTION_DELETE_LAYER"; + public static final String ACTION_NEW_LAYER = SANDBOX_PREFIX + "ACTION_NEW_LAYER"; + public static final String ACTION_SWAP_LAYERS = SANDBOX_PREFIX + "ACTION_SWAP_LAYERS"; + public static final String ACTION_RENAME_LAYER = SANDBOX_PREFIX + "ACTION_RENAME_LAYER"; + + public static final String ACTION_ADD_COMPONENT = SANDBOX_PREFIX + "ACTION_ADD_COMPONENT"; + public static final String ACTION_REMOVE_COMPONENT = SANDBOX_PREFIX + "ACTION_REMOVE_COMPONENT"; + public static final String CUSTOM_VARIABLE_MODIFY = SANDBOX_PREFIX + "CUSTOM_VARIABLE_MODIFY"; + + public static final String SHOW_ADD_LIBRARY_DIALOG = SANDBOX_PREFIX + "SHOW_ADD_LIBRARY_DIALOG"; + public static final String ACTION_ADD_TO_LIBRARY = SANDBOX_PREFIX + "ACTION_ADD_TO_LIBRARY"; + public static final String ACTION_EDIT_PHYSICS = SANDBOX_PREFIX + "ACTION_EDIT_PHYSICS"; + public static final String ACTION_ITEMS_MOVE_TO = SANDBOX_PREFIX + "ACTION_ITEMS_MOVE_TO"; + public static final String ACTION_ITEM_AND_CHILDREN_TO = GLOBAL_PREFIX + "ACTION_ITEM_AND_CHILDREN_TO"; + public static final String ACTION_ITEM_TRANSFORM_TO = SANDBOX_PREFIX + "ACTION_ITEM_TRANSFORM_TO"; + + public static final String ACTION_CREATE_PRIMITIVE = SANDBOX_PREFIX + "ACTION_CREATE_PRIMITIVE"; + + public static final String ACTION_SET_SELECTION = SANDBOX_PREFIX + "ACTION_SET_SELECTION"; + public static final String ACTION_ADD_SELECTION = SANDBOX_PREFIX + "ACTION_ADD_SELECTION"; + public static final String ACTION_RELEASE_SELECTION = SANDBOX_PREFIX + "ACTION_RELEASE_SELECTION"; + public static final String ACTION_Z_INDEX_CHANGED = SANDBOX_PREFIX + "ACTION_Z_INDEX_CHANGED"; + + public static final String ACTION_UPDATE_ITEM_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_ITEM_DATA"; + public static final String ACTION_UPDATE_LABEL_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_LABEL_DATA"; + public static final String ACTION_UPDATE_LIGHT_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_LIGHT_DATA"; + public static final String ACTION_UPDATE_BODY_LIGHT_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_BODY_LIGHT_DATA"; + public static final String ACTION_UPDATE_SPRITE_ANIMATION_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_SPRITE_ANIMATION_DATA"; + public static final String ACTION_UPDATE_MESH_DATA = SANDBOX_PREFIX + "ACTION_UPDATE_MESH_DATA"; + + public static final String ACTION_PLUGIN_PROXY_COMMAND = SANDBOX_PREFIX + "ACTION_PLUGIN_PROXY_COMMAND"; + + public static final String ACTION_EXPORT_PROJECT = SANDBOX_PREFIX + "ACTION_EXPORT_PROJECT"; + public static final String SAVE_EXPORT_PATH = SANDBOX_PREFIX + "SAVE_EXPORT_SETTINGS"; + + // drop down resources + public static final String ACTION_DELETE_IMAGE_RESOURCE = SANDBOX_PREFIX + "ACTION_DELETE_IMAGE_RESOURCE"; + public static final String ACTION_DELETE_SPRITE_ANIMATION_RESOURCE = SANDBOX_PREFIX + "ACTION_DELETE_SPRITE_ANIMATION_RESOURCE"; + public static final String ACTION_DELETE_SPRITER_ANIMATION_RESOURCE = SANDBOX_PREFIX + "ACTION_DELETE_SPRITER_ANIMATION_RESOURCE"; + public static final String ACTION_DELETE_SPINE_ANIMATION_RESOURCE = SANDBOX_PREFIX + "ACTION_DELETE_SPINE_ANIMATION_RESOURCE"; + public static final String ACTION_DELETE_LIBRARY_ITEM = SANDBOX_PREFIX + "ACTION_DELETE_LIBRARY_ITEM"; + public static final String ACTION_DELETE_PARTICLE_EFFECT = SANDBOX_PREFIX + "ACTION_DELETE_PARTICLE_EFFECT"; + + public static final String ACTION_UPDATE_RULER_POSITION = SANDBOX_PREFIX + "ACTION_UPDATE_RULER_POSITION"; + + /** + * Other + */ + public static final String ITEM_FACTORY_PREFIX = "games.rednblack.editor.factory.ItemFactory"; + public static final String NEW_ITEM_ADDED = ITEM_FACTORY_PREFIX + ".NEW_ITEM_ADDED"; + public static final String SCENE_DATA_PREFIX = "games.rednblack.editor.proxy.SceneDataManager"; + public static final String SCENE_LOADED = SCENE_DATA_PREFIX + ".SCENE_LOADED"; + + private static final String DELETE_ITEMS_COMMAND_CLASS_NAME = "games.rednblack.editor.controller.commands.DeleteItemsCommand"; + public static final String DELETE_ITEMS_COMMAND_DONE = DELETE_ITEMS_COMMAND_CLASS_NAME + "DONE"; + + +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/ResourcePayloadObject.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/ResourcePayloadObject.java new file mode 100644 index 00000000..9d146876 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/ResourcePayloadObject.java @@ -0,0 +1,29 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common; + +public class ResourcePayloadObject { + public String name; + public float xOffset; + public float yOffset; + public String className; + + public ResourcePayloadObject() { + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java new file mode 100644 index 00000000..152647e5 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java @@ -0,0 +1,78 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package games.rednblack.h2d.common; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.utils.Align; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.widget.VisDialog; +import com.kotcrab.vis.ui.widget.VisImageButton; + +/** + * Created by azakhary on 5/12/2015. + */ +public class UIDraggablePanel extends H2DDialog { + + public boolean isOpen; + + public UIDraggablePanel(String title) { + super(title); + setMovable(true); + setModal(false); + setStyle(VisUI.getSkin().get("box", WindowStyle.class)); + getTitleLabel().setAlignment(Align.left); + } + + @Override + public void addCloseButton() { + VisImageButton closeButton = new VisImageButton("close-panel"); + this.getTitleTable().add(closeButton).padBottom(2); + closeButton.addListener(new ChangeListener() { + public void changed(ChangeEvent event, Actor actor) { + UIDraggablePanel.this.close(); + } + }); + if (this.getTitleTable().getChildren().size == 2) { + this.getTitleTable().getCell(this.getTitleLabel()).padLeft(closeButton.getWidth() * 2.0F); + } + } + + public void invalidateHeight() { + float heightOld = getHeight(); + pack(); + float heightDiff = heightOld - getHeight(); + setPosition(getX(), getY() + heightDiff); + } + + @Override + public VisDialog show(Stage stage) { + + isOpen = true; + + return super.show(stage); + } + + @Override + public void hide() { + super.hide(); + + isOpen = false; + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorChannelWidget.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorChannelWidget.java new file mode 100644 index 00000000..82a6f996 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorChannelWidget.java @@ -0,0 +1,156 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.color; + +/** + * Created by azakhary on 7/14/2015. + */ + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.utils.Disposable; +import com.kotcrab.vis.ui.Sizes; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.kotcrab.vis.ui.widget.color.ColorPickerStyle; +import com.kotcrab.vis.ui.widget.color.internal.AlphaChannelBar; +import com.kotcrab.vis.ui.widget.color.internal.ChannelBar; +import com.kotcrab.vis.ui.widget.color.internal.ChannelBar.ChannelBarListener; +import com.kotcrab.vis.ui.widget.color.internal.PickerCommons; + +/** + * Used to display one color channel (hue, saturation etc.) with label, ColorInputField and ChannelBar + * @author Kotcrab + */ +public class ColorChannelWidget extends VisTable implements Disposable { + private ColorPickerStyle style; + private Sizes sizes; + private int value; + private int maxValue; + public ColorChannelWidgetListener drawer; + private boolean useAlpha; + + private ColorInputField inputField; + + private Texture texture; + private Pixmap pixmap; + private ChannelBar bar; + + private ChangeListener barListener; + + public ColorChannelWidget (ColorPickerStyle style, Sizes sizes, String label, int maxValue, final ColorChannelWidgetListener drawer) { + this(style, sizes, label, maxValue, false, drawer); + } + + public ColorChannelWidget (ColorPickerStyle style, Sizes sizes, String label, int maxValue, boolean useAlpha, final ColorChannelWidgetListener drawer) { + super(true); + + this.style = style; + this.sizes = sizes; + this.value = 0; + this.maxValue = maxValue; + this.drawer = drawer; + this.useAlpha = useAlpha; + + barListener = new ChangeListener() { + @Override + public void changed (ChangeEvent event, Actor actor) { + value = bar.getValue(); + drawer.updateFields(); + inputField.setValue(value); + } + }; + + if (useAlpha) + pixmap = new Pixmap(maxValue, 1, Pixmap.Format.RGBA8888); + else + pixmap = new Pixmap(maxValue, 1, Pixmap.Format.RGB888); + + texture = new Texture(pixmap); + add(new VisLabel(label)).width(10 * sizes.scaleFactor).center(); + add(inputField = new ColorInputField(maxValue, new ColorInputField.ColorInputFieldListener() { + @Override + public void changed (int newValue) { + value = newValue; + drawer.updateFields(); + bar.setValue(newValue); + } + })).width(CustomColorPicker.FIELD_WIDTH * sizes.scaleFactor); + bar = createBarImage(); + bar.setChannelBarListener(new ChannelBarListener() { + + @Override + public void updateFields() { + + } + + @Override + public void setShaderUniforms(ShaderProgram shader) { + + } + + }); + add(bar).size(CustomColorPicker.BAR_WIDTH * sizes.scaleFactor, CustomColorPicker.BAR_HEIGHT * sizes.scaleFactor); + + inputField.setValue(0); + } + + @Override + public void dispose () { + pixmap.dispose(); + texture.dispose(); + } + + public void redraw () { + drawer.draw(pixmap); + texture.draw(pixmap, 0, 0); + } + + public int getValue () { + return value; + } + + public void setValue (int value) { + this.value = value; + inputField.setValue(value); + bar.setValue(value); + } + + private ChannelBar createBarImage () { + + PickerCommons commons = new PickerCommons(style.pickerStyle, sizes, true); + if (useAlpha) + return new AlphaChannelBar(commons, value, maxValue, barListener); + else + return new ChannelBar(commons, value, maxValue, barListener); + } + + public boolean isInputValid () { + return inputField.isInputValid(); + } + + interface ColorChannelWidgetListener { + void updateFields (); + + void draw (Pixmap pixmap); + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorInputField.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorInputField.java new file mode 100644 index 00000000..9c32f367 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorInputField.java @@ -0,0 +1,129 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ +package games.rednblack.h2d.common.color; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.FocusListener; +import com.badlogic.gdx.scenes.scene2d.utils.UIUtils; +import com.kotcrab.vis.ui.util.InputValidator; +import com.kotcrab.vis.ui.widget.VisTextField; +import com.kotcrab.vis.ui.widget.VisValidatableTextField; + +/** + * Fields used to enter color numbers in color picker, verifies max allowed value + * provides quick increment/decrement of current value by pressing [shift +] plus or minus on numpad + * @author Kotcrab + */ +public class ColorInputField extends VisValidatableTextField { + private int value; + private int maxValue; + + public ColorInputField (final int maxValue, final ColorInputFieldListener listener) { + super(new ColorFieldValidator(maxValue)); + this.value = 0; + this.maxValue = maxValue; + + setProgrammaticChangeEvents(false); + setMaxLength(3); + setTextFieldFilter(new NumberFilter()); + + addListener(new ChangeListener() { + @Override + public void changed (ChangeEvent event, Actor actor) { + if (getText().length() > 0) + value = Integer.valueOf(getText()); + } + }); + + addListener(new InputListener() { + @Override + public boolean keyTyped (InputEvent event, char character) { + ColorInputField field = (ColorInputField) event.getListenerActor(); + if (character == '+') field.changeValue(UIUtils.shift() ? 10 : 1); + if (character == '-') field.changeValue(UIUtils.shift() ? -10 : -1); + + if (character != 0) listener.changed(getValue()); + + return true; + } + }); + + addListener(new FocusListener() { + @Override + public void keyboardFocusChanged (FocusEvent event, Actor actor, boolean focused) { + if (focused == false && isInputValid() == false) + setValue(maxValue); //only possibility on invalid field is that entered value will be bigger than maxValue so we set field value to maxValue + } + }); + } + + public void changeValue (int byValue) { + this.value += byValue; + + if (value > maxValue) value = maxValue; + if (value < 0) value = 0; + + updateUI(); + } + + public int getValue () { + return value; + } + + public void setValue (int value) { + this.value = value; + updateUI(); + } + + private void updateUI () { + setText(String.valueOf(value)); + setCursorPosition(getMaxLength()); + } + + interface ColorInputFieldListener { + public void changed (int newValue); + } + + private static class NumberFilter implements TextFieldFilter { + @Override + public boolean acceptChar (VisTextField textField, char c) { + return Character.isDigit(c); + } + } + + private static class ColorFieldValidator implements InputValidator { + private int maxValue; + + public ColorFieldValidator (int maxValue) { + this.maxValue = maxValue; + } + + @Override + public boolean validateInput (String input) { + if (input.equals("")) return false; + + Integer number = Integer.parseInt(input); + if (number > maxValue) return false; + + return true; + } + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerAdapter.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerAdapter.java new file mode 100644 index 00000000..10b2e34b --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerAdapter.java @@ -0,0 +1,41 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.color; + +import com.badlogic.gdx.graphics.Color; + +/** + * Created by azakhary on 7/14/2015. + */ +public class ColorPickerAdapter implements ColorPickerListener { + @Override + public void canceled() { + + } + + @Override + public void finished(Color newColor) { + + } + + @Override + public void changed(Color newColor) { + + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerListener.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerListener.java new file mode 100644 index 00000000..f8c3bdbe --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerListener.java @@ -0,0 +1,34 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.color; + +import com.badlogic.gdx.graphics.Color; + +/** + * Created by azakhary on 7/14/2015. + */ +public interface ColorPickerListener { + /** Called when color selection was canceled by user (either by clicking cancel or closing the window) */ + public void canceled (); + + /** Called when user finises selecting new color */ + public void finished (Color newColor); + + public void changed (Color newColor); +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerText.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerText.java new file mode 100644 index 00000000..000963a9 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/ColorPickerText.java @@ -0,0 +1,53 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.color; + +import com.kotcrab.vis.ui.Locales; +import com.kotcrab.vis.ui.i18n.BundleText; + +/** + * Contains texts for chooser access via I18NBundle + * @since 0.7.0 + */ +public enum ColorPickerText implements BundleText { + // @formatter:off + TITLE {public String getName () {return "title";}}, + RESTORE {public String getName () {return "restore";}}, + CANCEL {public String getName () {return "cancel";}}, + OK {public String getName () {return "ok";}}, + //NEW {public String getName () {return "new";}}, + //OLD {public String getName () {return "old";}}, + HEX {public String getName () {return "hex";}}; + // @formatter:on + + @Override + public String get () { + return Locales.getColorPickerBundle().get(getName()); + } + + @Override + public String format () { + throw new UnsupportedOperationException(); + } + + @Override + public String format (Object... arguments) { + throw new UnsupportedOperationException(); + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/CustomColorPicker.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/CustomColorPicker.java new file mode 100644 index 00000000..0dfd8aa3 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/color/CustomColorPicker.java @@ -0,0 +1,589 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.color; + +import static games.rednblack.h2d.common.color.ColorPickerText.CANCEL; +import static games.rednblack.h2d.common.color.ColorPickerText.HEX; +import static games.rednblack.h2d.common.color.ColorPickerText.OK; +import static games.rednblack.h2d.common.color.ColorPickerText.RESTORE; +import static games.rednblack.h2d.common.color.ColorPickerText.TITLE; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Pixmap.Format; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Disposable; +import com.badlogic.gdx.utils.I18NBundle; +import com.kotcrab.vis.ui.Locales; +import com.kotcrab.vis.ui.Sizes; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.util.ColorUtils; +import com.kotcrab.vis.ui.widget.VisImageButton; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.kotcrab.vis.ui.widget.VisTextButton; +import com.kotcrab.vis.ui.widget.VisTextField; +import com.kotcrab.vis.ui.widget.VisTextField.TextFieldFilter; +import com.kotcrab.vis.ui.widget.VisValidatableTextField; +import com.kotcrab.vis.ui.widget.VisWindow; +import com.kotcrab.vis.ui.widget.color.ColorPickerStyle; +import com.kotcrab.vis.ui.widget.color.internal.AlphaImage; +import com.kotcrab.vis.ui.widget.color.internal.Palette; +import com.kotcrab.vis.ui.widget.color.internal.PickerCommons; +import com.kotcrab.vis.ui.widget.color.internal.VerticalChannelBar; + +/** + * Created by azakhary on 7/14/2015. + * some methods are modified to better fit the needs of real time updating. + * Also using new ColorPickerListener that has method "changed" + * + * + * @author Kotcrab + */ +public class CustomColorPicker extends VisWindow implements Disposable { + + private static final Drawable WHITE = VisUI.getSkin().getDrawable("white"); + + static final int FIELD_WIDTH = 50; + static final int HEX_FIELD_WIDTH = 95; + + static final int PALETTE_SIZE = 160; + static final int BAR_WIDTH = 130; + static final int BAR_HEIGHT = 11; + static final float VERTICAL_BAR_WIDTH = 15; + + private ColorPickerStyle style; + private Sizes sizes; + private I18NBundle bundle; + + private ColorPickerListener listener; + + private Color oldColor; + private Color color; + private Color tmpColor; //temp color used for hsv to rgb calculations + + private Pixmap barPixmap; + private Texture barTexture; + private VerticalChannelBar verticalBar; + + private Palette palette; + + private ColorChannelWidget hBar; + private ColorChannelWidget sBar; + private ColorChannelWidget vBar; + + private ColorChannelWidget rBar; + private ColorChannelWidget gBar; + private ColorChannelWidget bBar; + + private ColorChannelWidget aBar; + + private VisValidatableTextField hexField; + + private VisTextButton restoreButton; + private VisTextButton cancelButton; + private VisTextButton okButton; + + private Image currentColor; + private Image newColor; + + private boolean pickerCreated = false; + + private boolean closeAfterPickingFinished = true; + + public CustomColorPicker () { + this((String) null); + } + + public CustomColorPicker (String title) { + this("default", title, null); + } + + public CustomColorPicker (String title, ColorPickerListener listener) { + this("default", title, listener); + } + + public CustomColorPicker (ColorPickerListener listener) { + this("default", null, listener); + } + + public CustomColorPicker (String styleName, String title, ColorPickerListener listener) { + super(title != null ? title : ""); + this.listener = listener; + this.style = VisUI.getSkin().get(styleName, ColorPickerStyle.class); + this.sizes = VisUI.getSizes(); + this.bundle = Locales.getColorPickerBundle(); + + if (title == null) getTitleLabel().setText(getText(TITLE)); + + setModal(true); + setMovable(true); + + addCloseButton(); + closeOnEscape(); + + oldColor = new Color(Color.BLACK); + color = new Color(Color.BLACK); + tmpColor = new Color(Color.BLACK); + + createColorWidgets(); + createUI(); + createListeners(); + updatePixmaps(); + + pack(); + centerWindow(); + + setStyle(VisUI.getSkin().get("box", WindowStyle.class)); + getTitleLabel().setAlignment(Align.left); + + pickerCreated = true; + } + + @Override + public void addCloseButton() { + VisImageButton closeButton = new VisImageButton("close-panel"); + this.getTitleTable().add(closeButton).padBottom(2); + closeButton.addListener(new ChangeListener() { + public void changed(ChangeEvent event, Actor actor) { + CustomColorPicker.this.close(); + } + }); + if (this.getTitleTable().getChildren().size == 2) { + this.getTitleTable().getCell(this.getTitleLabel()).padLeft(closeButton.getWidth() * 2.0F); + } + } + + + private void createUI () { + VisTable rightTable = new VisTable(true); + + rightTable.add(hBar).row(); + rightTable.add(sBar).row(); + rightTable.add(vBar).row(); + + rightTable.add(); + rightTable.row(); + + rightTable.add(rBar).row(); + rightTable.add(gBar).row(); + rightTable.add(bBar).row(); + + rightTable.add(); + rightTable.row(); + + rightTable.add(aBar).row(); + + VisTable leftTable = new VisTable(true); + leftTable.add(palette).size(PALETTE_SIZE * sizes.scaleFactor); + leftTable.row(); + leftTable.add(createColorsPreviewTable()).expandX().fillX(); + leftTable.row(); + leftTable.add(createHexTable()).expandX().left(); + + add(leftTable).top().padRight(5); + add(verticalBar).size(VERTICAL_BAR_WIDTH * sizes.scaleFactor, PALETTE_SIZE * sizes.scaleFactor).top(); + add(rightTable).expand().left().top().pad(4); + row(); + add(createButtons()).pad(3).right().expandX().colspan(3); + } + + private VisTable createColorsPreviewTable () { + VisTable table = new VisTable(false); + PickerCommons commons = new PickerCommons(style.pickerStyle, new Sizes(), true); + //FIXME getText(OLD) + table.add(new VisLabel("Old")).spaceRight(3); + table.add(currentColor = new AlphaImage(commons, 0)).height(25 * sizes.scaleFactor).expandX().fillX(); + table.row(); + //FIXME getText(NEW) + table.add(new VisLabel("New")).spaceRight(3); + + table.add(newColor = new AlphaImage(commons, 0)).height(25 * sizes.scaleFactor).expandX().fillX(); + + currentColor.setColor(color); + newColor.setColor(color); + + return table; + } + + private VisTable createHexTable () { + VisTable table = new VisTable(true); + table.add(new VisLabel(getText(HEX))); + table.add(hexField = new VisValidatableTextField("00000000")).width(HEX_FIELD_WIDTH * sizes.scaleFactor); + table.row(); + + hexField.setMaxLength(8); + hexField.setProgrammaticChangeEvents(false); + hexField.setTextFieldFilter(new TextFieldFilter() { + @Override + public boolean acceptChar (VisTextField textField, char c) { + return Character.isDigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); + } + }); + + hexField.addListener(new ChangeListener() { + @Override + public void changed (ChangeEvent event, Actor actor) { + if (hexField.getText().length() == 8) setColor(Color.valueOf(hexField.getText()), false); + } + }); + + return table; + } + + private VisTable createButtons () { + VisTable table = new VisTable(true); + table.defaults().right(); + table.add(restoreButton = new VisTextButton(getText(RESTORE))); + table.add(okButton = new VisTextButton(getText(OK))); + table.add(cancelButton = new VisTextButton(getText(CANCEL))); + return table; + } + + private void createColorWidgets () { + barPixmap = new Pixmap(1, 360, Format.RGB888); + + for (int h = 0; h < 360; h++) { + ColorUtils.HSVtoRGB(360 - h, 100, 100, tmpColor); + barPixmap.drawPixel(0, h, Color.rgba8888(tmpColor)); + } + + barTexture = new Texture(barPixmap); + PickerCommons pickerCommons = new PickerCommons(style.pickerStyle, sizes, true); + palette = new Palette(pickerCommons, 100, new ChangeListener() { + @Override + public void changed (ChangeEvent event, Actor actor) { + sBar.setValue(palette.getS()); + vBar.setValue(palette.getV()); + + updateHSVValuesFromFields(); + updatePixmaps(); + } + }); + + verticalBar = new VerticalChannelBar(pickerCommons, 360, new ChangeListener() { + @Override + public void changed (ChangeEvent event, Actor actor) { + hBar.setValue(verticalBar.getValue()); + updateHSVValuesFromFields(); + updatePixmaps(); + } + }); + + hBar = new ColorChannelWidget(style, sizes, "H", 360, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + verticalBar.setValue(hBar.getValue()); + updateHSVValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int h = 0; h < 360; h++) { + ColorUtils.HSVtoRGB(h, sBar.getValue(), vBar.getValue(), tmpColor); + pixmap.drawPixel(h, 0, Color.rgba8888(tmpColor)); + } + } + }); + + sBar = new ColorChannelWidget(style, sizes, "S", 100, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + palette.setValue(sBar.getValue(), vBar.getValue()); + updateHSVValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int s = 0; s < 100; s++) { + ColorUtils.HSVtoRGB(hBar.getValue(), s, vBar.getValue(), tmpColor); + pixmap.drawPixel(s, 0, Color.rgba8888(tmpColor)); + } + } + }); + + vBar = new ColorChannelWidget(style, sizes, "V", 100, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + palette.setValue(sBar.getValue(), vBar.getValue()); + updateHSVValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int v = 0; v < 100; v++) { + ColorUtils.HSVtoRGB(hBar.getValue(), sBar.getValue(), v, tmpColor); + pixmap.drawPixel(v, 0, Color.rgba8888(tmpColor)); + } + + } + }); + + rBar = new ColorChannelWidget(style, sizes, "R", 255, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + updateRGBValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int r = 0; r < 255; r++) { + tmpColor.set(r / 255.0f, color.g, color.b, 1); + pixmap.drawPixel(r, 0, Color.rgba8888(tmpColor)); + } + } + }); + + gBar = new ColorChannelWidget(style, sizes, "G", 255, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + updateRGBValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int g = 0; g < 255; g++) { + tmpColor.set(color.r, g / 255.0f, color.b, 1); + pixmap.drawPixel(g, 0, Color.rgba8888(tmpColor)); + } + } + }); + + bBar = new ColorChannelWidget(style, sizes, "B", 255, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + updateRGBValuesFromFields(); + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + for (int b = 0; b < 255; b++) { + tmpColor.set(color.r, color.g, b / 255.0f, 1); + pixmap.drawPixel(b, 0, Color.rgba8888(tmpColor)); + } + + } + }); + + aBar = new ColorChannelWidget(style, sizes, "A", 255, true, new ColorChannelWidget.ColorChannelWidgetListener() { + @Override + public void updateFields () { + if (aBar.isInputValid()) color.a = aBar.getValue() / 255.0f; + updatePixmaps(); + } + + @Override + public void draw (Pixmap pixmap) { + pixmap.fill(); + for (int i = 0; i < 255; i++) { + tmpColor.set(color.r, color.g, color.b, i / 255.0f); + pixmap.drawPixel(i, 0, Color.rgba8888(tmpColor)); + } + } + }); + } + + private void createListeners () { + restoreButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + setColor(oldColor); + } + }); + + okButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + if (listener != null) listener.finished(new Color(color)); + setColor(color); + if (closeAfterPickingFinished) fadeOut(); + } + }); + + cancelButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + setColor(oldColor); + close(); + } + }); + } + + @Override + protected void close () { + if (listener != null) listener.canceled(); + super.close(); + } + + public ColorPickerListener getListener () { + return listener; + } + + public void setListener (ColorPickerListener listener) { + this.listener = listener; + } + + private void updatePixmaps () { + palette.setPickerHue(hBar.getValue()); + newColor.setColor(color); + + hBar.redraw(); + sBar.redraw(); + vBar.redraw(); + + rBar.redraw(); + gBar.redraw(); + bBar.redraw(); + + aBar.redraw(); + + hexField.setText(color.toString().toUpperCase()); + hexField.setCursorPosition(hexField.getMaxLength()); + + if (listener != null && pickerCreated) listener.changed(new Color(color)); + } + @Override + /** Sets current selected color in picker.*/ + public void setColor (Color c) { + //this method overrides setColor in Actor, not big deal we definitely don't need it + setColor(c, true); + } + + private void setColor (Color c, boolean updateCurrentColor) { + if (updateCurrentColor) { + currentColor.setColor(new Color(c)); + oldColor = new Color(c); + } + color = new Color(c); + updateFieldsFromColor(); + updatePixmaps(); + } + + private String getText (ColorPickerText text) { + return bundle.get(text.getName()); + } + + /** + * Controls whether to fade out color picker after users finished color picking and has pressed OK button. If + * this is set to false picker won't close after pressing OK button. Default is true. + * Note that by default picker is a modal window so might also want to call {@code colorPicker.setModal(false)} to + * disable it. + */ + public void setCloseAfterPickingFinished (boolean closeAfterPickingFinished) { + this.closeAfterPickingFinished = closeAfterPickingFinished; + } + + @Override + public void dispose () { + barTexture.dispose(); + barPixmap.dispose(); + + hBar.dispose(); + sBar.dispose(); + vBar.dispose(); + + rBar.dispose(); + gBar.dispose(); + bBar.dispose(); + + aBar.dispose(); + } + + private void updateFieldsFromColor () { + int[] hsv = ColorUtils.RGBtoHSV(color); + int ch = hsv[0]; + int cs = hsv[1]; + int cv = hsv[2]; + + int cr = MathUtils.round(color.r * 255.0f); + int cg = MathUtils.round(color.g * 255.0f); + int cb = MathUtils.round(color.b * 255.0f); + int ca = MathUtils.round(color.a * 255.0f); + + hBar.setValue(ch); + sBar.setValue(cs); + vBar.setValue(cv); + + rBar.setValue(cr); + gBar.setValue(cg); + bBar.setValue(cb); + + aBar.setValue(ca); + + verticalBar.setValue(hBar.getValue()); + palette.setValue(sBar.getValue(), vBar.getValue()); + } + + private void updateHSVValuesFromFields () { + int[] hsv = ColorUtils.RGBtoHSV(color); + int h = hsv[0]; + int s = hsv[1]; + int v = hsv[2]; + + if (hBar.isInputValid()) h = hBar.getValue(); + if (sBar.isInputValid()) s = sBar.getValue(); + if (vBar.isInputValid()) v = vBar.getValue(); + + color = ColorUtils.HSVtoRGB(h, s, v, color.a); + + int cr = MathUtils.round(color.r * 255.0f); + int cg = MathUtils.round(color.g * 255.0f); + int cb = MathUtils.round(color.b * 255.0f); + + rBar.setValue(cr); + gBar.setValue(cg); + bBar.setValue(cb); + } + + private void updateRGBValuesFromFields () { + int r = MathUtils.round(color.r * 255.0f); + int g = MathUtils.round(color.g * 255.0f); + int b = MathUtils.round(color.b * 255.0f); + + if (rBar.isInputValid()) r = rBar.getValue(); + if (gBar.isInputValid()) g = gBar.getValue(); + if (bBar.isInputValid()) b = bBar.getValue(); + + color.set(r / 255.0f, g / 255.0f, b / 255.0f, color.a); + + int[] hsv = ColorUtils.RGBtoHSV(color); + int ch = hsv[0]; + int cs = hsv[1]; + int cv = hsv[2]; + + hBar.setValue(ch); + sBar.setValue(cs); + vBar.setValue(cv); + + verticalBar.setValue(hBar.getValue()); + palette.setValue(sBar.getValue(), vBar.getValue()); + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPlugin.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPlugin.java new file mode 100644 index 00000000..b4f3a5dc --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPlugin.java @@ -0,0 +1,37 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.plugins; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; + +import java.util.Set; + +/** + * Created by azakhary on 7/24/2015. + */ +public interface H2DPlugin { + + String getName(); + void initPlugin(); + + public void setAPI(PluginAPI pluginAPI); + + public void onDropDownOpen(Set selectedEntities, Array actionsSet); +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java new file mode 100644 index 00000000..35aabdc6 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java @@ -0,0 +1,59 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.plugins; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import com.puremvc.patterns.facade.Facade; +import net.mountainblade.modular.Module; + +import java.util.Set; + +/** + * Created by azakhary on 7/24/2015. + */ +public abstract class H2DPluginAdapter implements H2DPlugin, Module { + + public Facade facade; + protected PluginAPI pluginAPI; + + public String getName() { + return ""; + } + + @Override + public void setAPI(PluginAPI pluginAPI) { + this.pluginAPI = pluginAPI; + facade = pluginAPI.getFacade(); + } + + /** + * Triggered whenever a context menu is displayed + * + * @param selectedEntities list of entities that were selected when context menu was created about, if right clicked on empty space empty array is used + * @param actionsSet list of current actions (notification id's) planned for this particular context menu, it can be modified by adding or removing elements. + */ + @Override + public void onDropDownOpen(Set selectedEntities, Array actionsSet) { + + } + + public PluginAPI getAPI() { + return pluginAPI; + } +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java new file mode 100644 index 00000000..907b4591 --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java @@ -0,0 +1,178 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.plugins; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Stage; +import games.rednblack.h2d.common.IItemCommand; +import games.rednblack.h2d.common.view.tools.Tool; +import com.kotcrab.vis.ui.widget.VisImageButton; +import com.puremvc.patterns.facade.Facade; +import games.rednblack.editor.renderer.SceneLoader; +import com.vo.CursorData; + +import java.util.HashMap; +import java.util.HashSet; + +/** + * Plugin API is a main interface of communication between plugin and HyperLap2D editor + * Created by azakhary on 7/24/2015. + */ +public interface PluginAPI { + /** + * Get scene loader of the runtime to work with scene and items + * @return SceneLoader + */ + public SceneLoader getSceneLoader(); + + /** + * Returns MVC facade, to send notifications or commands, and register mediators + * @return Facade + */ + public Facade getFacade(); + + /** + * Returns Ashley engine of main scene where all entities are located + * @return Engine + */ + public Engine getEngine(); + + /** + * Get simple libGDX Stage for UI part of editor, to add dialogs or other UI elements and widgets + * @return + */ + public Stage getUIStage(); + + /** + * @return Path of plugin directory + */ + public String getPluginDir(); + + /** + * @return Path of working project + */ + public String getProjectPath(); + + /** + * @return TextureAtlas of loaded project + */ + public TextureAtlas getProjectTextureAtlas(); + + + /** + * Adds new sub menu item to the top bar + * @param menu unique identifier to global menu items provided in @Overlap2DMenuBar by three constants FILE_MENU, EDIT_MENU, WINDOWS_MENU + * @param subMenuName pretty string to name new submenu item + * @param notificationName unique notification id that will be fired when this menu item is clicked + */ + public void addMenuItem(String menu, String subMenuName, String notificationName); + + /** + * Adds new tool to the tool bar + * @param toolName pretty string to name new tool item + * @param toolBtnStyle tool button style + * @param addSeparator true, if should add menu separator + * @param tool the tool object that is going to be added + */ + public void addTool(String toolName, VisImageButton.VisImageButtonStyle toolBtnStyle, boolean addSeparator, Tool tool); + + + /** + * hot-swaps a tool + */ + public void toolHotSwap(Tool tool); + + /** + * hot-swaps a tool back + */ + public void toolHotSwapBack(); + + /** + * Creates new menu item for Contextual drop down menu, that is created when user right clicks on something in the editor. + * This only creates a menu item, but it should be specifically added later to action set, at the moment context menu is summoned + * @param action unique name of notification id that will be fired when this menu item is clicked + * @param name pretty text to be written on this menu item + */ + public void setDropDownItemName(String action, String name); + + /** + * re-loads current project entirely (used when changes were made that require to whole project to be reloaded) + */ + public void reLoadProject(); + + /** + * Saves current project + */ + public void saveProject(); + + /** + * Creates a revertable command that later can be undone or re-done by user with Ctrl+Z or similar. + * @param command Object containing your command logic + * @param body Additional data that can be send as parameters + */ + public void revertableCommand(IItemCommand command, Object body); + + /** + * Removes follower object (selection rectangle) from particular entity (usually makes sense when entity is deleted without proper action) + * @param entity + */ + public void removeFollower(Entity entity); + + /** + * Draws an image at selected position + * @param regionName name of texture region to create image from + * @param position position to draw image at + * @return image entity + */ + Entity drawImage(String regionName, Vector2 position); + + /** + * @return entities that are on scene + */ + HashSet getProjectEntities(); + + /** + * @param entity + * @return if entity is on visible layer + */ + boolean isEntityVisible(Entity entity); + + /** + * shows drop down menu with specified actions set + * @param actionsSet + * @param observable item with right click on it + */ + void showPopup(HashMap actionsSet, Object observable); + + /** + * sets cursor to new one with cursorData + * @param cursorData + * @param region for plugin unic textureRegion + */ + void setCursor(CursorData cursorData, TextureRegion region); + + /** + * returns current selected layer name + */ + String getCurrentSelectedLayerName(); +} diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/view/tools/Tool.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/view/tools/Tool.java new file mode 100644 index 00000000..76eb58fd --- /dev/null +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/view/tools/Tool.java @@ -0,0 +1,44 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.h2d.common.view.tools; + +import com.badlogic.ashley.core.Entity; +import com.puremvc.patterns.observer.Notification; + +/** + * Created by azakhary on 4/30/2015. + */ +public interface Tool { + void initTool(); + boolean stageMouseDown(float x, float y); + void stageMouseUp(float x, float y); + void stageMouseDragged(float x, float y); + void stageMouseDoubleClick(float x, float y); + void stageMouseScrolled(int amount); + boolean itemMouseDown(Entity entity, float x, float y); + void itemMouseUp(Entity entity, float x, float y); + void itemMouseDragged(Entity entity, float x, float y); + void itemMouseDoubleClick(Entity entity, float x, float y); + String getName(); + String getTitle(); + String getShortcut(); + void handleNotification(Notification notification); + void keyDown(Entity entity, int keycode); + void keyUp(Entity entity, int keycode); +} diff --git a/hyperlap2d-runtime-libgdx/build.gradle b/hyperlap2d-runtime-libgdx/build.gradle new file mode 100644 index 00000000..95781ac5 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/build.gradle @@ -0,0 +1,31 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +ext { + gdxVersion = '1.9.10' + box2dlightsVersion = '1.5' + ashleyVersion = '1.7.3' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" + implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" + implementation "com.badlogicgames.box2dlights:box2dlights:$box2dlightsVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + + testImplementation group: 'junit', name: 'junit', version: '4.12' +} + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Animation.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Animation.java new file mode 100644 index 00000000..3d9cb975 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Animation.java @@ -0,0 +1,204 @@ +package com.brashmonkey.spriter; + +import java.util.HashMap; + +import com.brashmonkey.spriter.Mainline.Key; +import com.brashmonkey.spriter.Mainline.Key.BoneRef; +import com.brashmonkey.spriter.Mainline.Key.ObjectRef; +import com.brashmonkey.spriter.Timeline.Key.Bone; +import com.brashmonkey.spriter.Timeline.Key.Object; +/** + * Represents an animation of a Spriter SCML file. + * An animation holds {@link Timeline}s and a {@link Mainline} to animate objects. + * Furthermore it holds an {@link #id}, a {@link #length}, a {@link #name} and whether it is {@link #looping} or not. + * @author Trixt0r + * + */ +public class Animation { + + public final Mainline mainline; + private final Timeline[] timelines; + private int timelinePointer = 0; + private final HashMap nameToTimeline; + public final int id, length; + public final String name; + public final boolean looping; + Key currentKey; + Timeline.Key[] tweenedKeys, unmappedTweenedKeys; + private boolean prepared; + + public Animation(Mainline mainline, int id, String name, int length, boolean looping, int timelines){ + this.mainline = mainline; + this.id = id; + this.name = name; + this.length = length; + this.looping = looping; + this.timelines = new Timeline[timelines]; + this.prepared = false; + this.nameToTimeline = new HashMap(); + //this.currentKey = mainline.getKey(0); + } + + /** + * Returns a {@link Timeline} with the given index. + * @param index the index of the timeline + * @return the timeline with the given index + * @throws IndexOutOfBoundsException if the index is out of range + */ + public Timeline getTimeline(int index){ + return this.timelines[index]; + } + + /** + * Returns a {@link Timeline} with the given name. + * @param name the name of the time line + * @return the time line with the given name or null if no time line exists with the given name. + */ + public Timeline getTimeline(String name){ + return this.nameToTimeline.get(name); + } + + void addTimeline(Timeline timeline){ + this.timelines[timelinePointer++] = timeline; + this.nameToTimeline.put(timeline.name, timeline); + } + + /** + * Returns the number of time lines this animation holds. + * @return the number of time lines + */ + public int timelines(){ + return timelines.length; + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[id: "+id+", "+name+", duration: "+length+", is looping: "+looping; + toReturn +="Mainline:\n"; + toReturn += mainline; + toReturn += "Timelines\n"; + for(Timeline timeline: this.timelines) + toReturn += timeline; + toReturn+="]"; + return toReturn; + } + + /** + * Updates the bone and object structure with the given time to the given root bone. + * @param time The time which has to be between 0 and {@link #length} to work properly. + * @param root The root bone which is not allowed to be null. The whole animation runs relative to the root bone. + */ + public void update(int time, Bone root){ + if(!this.prepared) throw new SpriterException("This animation is not ready yet to animate itself. Please call prepare()!"); + if(root == null) throw new SpriterException("The root can not be null! Set a root bone to apply this animation relative to the root bone."); + this.currentKey = mainline.getKeyBeforeTime(time); + + for(Timeline.Key timelineKey: this.unmappedTweenedKeys) + timelineKey.active = false; + for(BoneRef ref: currentKey.boneRefs) + this.update(ref, root, time); + for(ObjectRef ref: currentKey.objectRefs) + this.update(ref, root, time); + } + + protected void update(BoneRef ref, Bone root, int time){ + boolean isObject = ref instanceof ObjectRef; + //Get the timelines, the refs pointing to + Timeline timeline = getTimeline(ref.timeline); + Timeline.Key key = timeline.getKey(ref.key); + Timeline.Key nextKey = timeline.getKey((ref.key+1)%timeline.keys.length); + int currentTime = key.time; + int nextTime = nextKey.time; + if(nextTime < currentTime){ + if(!looping) nextKey = key; + else nextTime = length; + } + //Normalize the time + float t = (float)(time - currentTime)/(float)(nextTime - currentTime); + if(Float.isNaN(t) || Float.isInfinite(t)) t = 1f; + if(currentKey.time > currentTime){ + float tMid = (float)(currentKey.time - currentTime)/(float)(nextTime - currentTime); + if(Float.isNaN(tMid) || Float.isInfinite(tMid)) tMid = 0f; + t = (float)(time - currentKey.time)/(float)(nextTime - currentKey.time); + if(Float.isNaN(t) || Float.isInfinite(t)) t = 1f; + t = currentKey.curve.tween(tMid, 1f, t); + } + else + t = currentKey.curve.tween(0f, 1f, t); + //Tween bone/object + Bone bone1 = key.object(); + Bone bone2 = nextKey.object(); + Bone tweenTarget = this.tweenedKeys[ref.timeline].object(); + if(isObject) this.tweenObject((Object)bone1, (Object)bone2, (Object)tweenTarget, t, key.curve, key.spin); + else this.tweenBone(bone1, bone2, tweenTarget, t, key.curve, key.spin); + this.unmappedTweenedKeys[ref.timeline].active = true; + this.unmapTimelineObject(ref.timeline, isObject,(ref.parent != null) ? + this.unmappedTweenedKeys[ref.parent.timeline].object(): root); + } + + void unmapTimelineObject(int timeline, boolean isObject, Bone root){ + Bone tweenTarget = this.tweenedKeys[timeline].object(); + Bone mapTarget = this.unmappedTweenedKeys[timeline].object(); + if(isObject) ((Object)mapTarget).set((Object)tweenTarget); + else mapTarget.set(tweenTarget); + mapTarget.unmap(root); + } + + protected void tweenBone(Bone bone1, Bone bone2, Bone target, float t, Curve curve, int spin){ + target.angle = curve.tweenAngle(bone1.angle, bone2.angle, t, spin); + curve.tweenPoint(bone1.position, bone2.position, t, target.position); + curve.tweenPoint(bone1.scale, bone2.scale, t, target.scale); + curve.tweenPoint(bone1.pivot, bone2.pivot, t, target.pivot); + } + + protected void tweenObject(Object object1, Object object2, Object target, float t, Curve curve, int spin){ + this.tweenBone(object1, object2, target, t, curve, spin); + target.alpha = curve.tweenAngle(object1.alpha, object2.alpha, t); + target.ref.set(object1.ref); + } + + Timeline getSimilarTimeline(Timeline t){ + Timeline found = getTimeline(t.name); + if(found == null && t.id < this.timelines()) found = this.getTimeline(t.id); + return found; + } + + /*Timeline getSimilarTimeline(BoneRef ref, Collection coveredTimelines){ + if(ref.parent == null) return null; + for(BoneRef boneRef: this.currentKey.objectRefs){ + Timeline t = this.getTimeline(boneRef.timeline); + if(boneRef.parent != null && boneRef.parent.id == ref.parent.id && !coveredTimelines.contains(t)) + return t; + } + return null; + } + + Timeline getSimilarTimeline(ObjectRef ref, Collection coveredTimelines){ + if(ref.parent == null) return null; + for(ObjectRef objRef: this.currentKey.objectRefs){ + Timeline t = this.getTimeline(objRef.timeline); + if(objRef.parent != null && objRef.parent.id == ref.parent.id && !coveredTimelines.contains(t)) + return t; + } + return null; + }*/ + + /** + * Prepares this animation to set this animation in any time state. + * This method has to be called before {@link #update(int, Bone)}. + */ + public void prepare(){ + if(this.prepared) return; + this.tweenedKeys = new Timeline.Key[timelines.length]; + this.unmappedTweenedKeys = new Timeline.Key[timelines.length]; + + for(int i = 0; i < this.tweenedKeys.length; i++){ + this.tweenedKeys[i] = new Timeline.Key(i); + this.unmappedTweenedKeys[i] = new Timeline.Key(i); + this.tweenedKeys[i].setObject(new Timeline.Key.Object(new Point(0,0))); + this.unmappedTweenedKeys[i].setObject(new Timeline.Key.Object(new Point(0,0))); + } + if(mainline.keys.length > 0) currentKey = mainline.getKey(0); + this.prepared = true; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Box.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Box.java new file mode 100644 index 00000000..92fb6774 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Box.java @@ -0,0 +1,99 @@ +package com.brashmonkey.spriter; + +import com.brashmonkey.spriter.Entity.ObjectInfo; + +/** + * Represents a box, which consists of four points: top-left, top-right, bottom-left and bottom-right. + * A box is responsible for checking collisions and calculating a bounding box for a {@link Timeline.Key.Bone}. + * @author Trixt0r + * + */ +public class Box { + public final Point[] points; + private Rectangle rect; + + /** + * Creates a new box with no witdh and height. + */ + public Box(){ + this.points = new Point[4]; + //this.temp = new Point[4]; + for(int i = 0; i < 4; i++){ + this.points[i] = new Point(0,0); + //this.temp[i] = new Point(0,0); + } + this.rect = new Rectangle(0,0,0,0); + } + + /** + * Calculates its four points for the given bone or object with the given info. + * @param boneOrObject the bone or object + * @param info the info + * @throws NullPointerException if info or boneOrObject is null + */ + public void calcFor(Timeline.Key.Bone boneOrObject, ObjectInfo info){ + float width = info.size.width*boneOrObject.scale.x; + float height = info.size.height*boneOrObject.scale.y; + + float pivotX = width*boneOrObject.pivot.x; + float pivotY = height*boneOrObject.pivot.y; + + this.points[0].set(-pivotX,-pivotY); + this.points[1].set(width-pivotX, -pivotY); + this.points[2].set(-pivotX,height-pivotY); + this.points[3].set(width-pivotX,height-pivotY); + + for(int i = 0; i < 4; i++) + this.points[i].rotate(boneOrObject.angle); + for(int i = 0; i < 4; i++) + this.points[i].translate(boneOrObject.position); + } + + /** + * Returns whether the given coordinates lie inside the box of the given bone or object. + * @param boneOrObject the bone or object + * @param info the object info of the given bone or object + * @param x the x coordinate + * @param y the y coordinate + * @return true if the given point lies in the box + * @throws NullPointerException if info or boneOrObject is null + */ + public boolean collides(Timeline.Key.Bone boneOrObject, ObjectInfo info, float x, float y){ + float width = info.size.width*boneOrObject.scale.x; + float height = info.size.height*boneOrObject.scale.y; + + float pivotX = width*boneOrObject.pivot.x; + float pivotY = height*boneOrObject.pivot.y; + + Point point = new Point(x-boneOrObject.position.x,y-boneOrObject.position.y); + point.rotate(-boneOrObject.angle); + + return point.x >= -pivotX && point.x <= width-pivotX && point.y >= -pivotY && point.y <= height-pivotY; + } + + /** + * Returns whether this box is inside the given rectangle. + * @param rect the rectangle + * @return true if one of the four points is inside the rectangle + */ + public boolean isInside(Rectangle rect){ + boolean inside = false; + for(Point p: points) + inside |= rect.isInside(p); + return inside; + } + + /** + * Returns a bounding box for this box. + * @return the bounding box + */ + public Rectangle getBoundingRect(){ + this.rect.set(points[0].x,points[0].y,points[0].x,points[0].y); + this.rect.left = Math.min(Math.min(Math.min(Math.min(points[0].x, points[1].x),points[2].x),points[3].x), this.rect.left); + this.rect.right = Math.max(Math.max(Math.max(Math.max(points[0].x, points[1].x),points[2].x),points[3].x), this.rect.right); + this.rect.top = Math.max(Math.max(Math.max(Math.max(points[0].y, points[1].y),points[2].y),points[3].y), this.rect.top); + this.rect.bottom = Math.min(Math.min(Math.min(Math.min(points[0].y, points[1].y),points[2].y),points[3].y), this.rect.bottom); + return this.rect; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/CCDResolver.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/CCDResolver.java new file mode 100644 index 00000000..5e59112c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/CCDResolver.java @@ -0,0 +1,63 @@ +package com.brashmonkey.spriter; + +import com.brashmonkey.spriter.Mainline.Key.BoneRef; +import com.brashmonkey.spriter.Timeline.Key.Bone; + +/** + * An inverse kinematics resolver implementation. + * An instance of this class uses the CCD (Cyclic Coordinate Descent) algorithm to resolve the constraints. + * @see
ccd-algorithm + * and cyclic-coordinate-descent-in-2d . + * @author Trixt0r + * + */ +public class CCDResolver extends IKResolver { + + public CCDResolver(Player player) { + super(player); + } + + @Override + public void resolve(float x, float y, int chainLength, BoneRef effectorRef) { + //player.unmapObjects(null); + Timeline timeline = player.animation.getTimeline(effectorRef.timeline); + Timeline.Key key = player.tweenedKeys[effectorRef.timeline]; + Timeline.Key unmappedKey = player.unmappedTweenedKeys[effectorRef.timeline]; + Bone effector = key.object(); + Bone unmappedffector = unmappedKey.object(); + float width = (timeline.objectInfo != null) ? timeline.objectInfo.size.width: 200; + width *= unmappedffector.scale.x; + float xx = unmappedffector.position.x+(float)Math.cos(Math.toRadians(unmappedffector.angle))*width, + yy = unmappedffector.position.y+(float)Math.sin(Math.toRadians(unmappedffector.angle))*width; + if(Calculator.distanceBetween(xx, yy, x, y) <= this.tolerance) + return; + + effector.angle = Calculator.angleBetween(unmappedffector.position.x, unmappedffector.position.y, x, y); + if(Math.signum(player.root.scale.x) == -1) effector.angle += 180f; + BoneRef parentRef = effectorRef.parent; + Bone parent = null, unmappedParent = null; + if(parentRef != null){ + parent = player.tweenedKeys[parentRef.timeline].object(); + unmappedParent = player.unmappedTweenedKeys[parentRef.timeline].object(); + effector.angle -= unmappedParent.angle; + } + player.unmapObjects(null); + for(int i = 0; i < chainLength && parentRef != null; i++){ + if(Calculator.distanceBetween(xx, yy, x, y) <= this.tolerance) + return; + parent.angle += Calculator.angleDifference(Calculator.angleBetween(unmappedParent.position.x, unmappedParent.position.y, x, y), + Calculator.angleBetween(unmappedParent.position.x, unmappedParent.position.y, xx, yy)); + parentRef = parentRef.parent; + if(parentRef != null && i < chainLength-1){ + parent = player.tweenedKeys[parentRef.timeline].object(); + unmappedParent = player.unmappedTweenedKeys[parentRef.timeline].object(); + parent.angle -= unmappedParent.angle; + } + else parent = null; + player.unmapObjects(null); + xx = unmappedffector.position.x+(float)Math.cos(Math.toRadians(unmappedffector.angle))*width; + yy = unmappedffector.position.y+(float)Math.sin(Math.toRadians(unmappedffector.angle))*width; + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Calculator.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Calculator.java new file mode 100644 index 00000000..b3e99adf --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Calculator.java @@ -0,0 +1,209 @@ +package com.brashmonkey.spriter; + +import static java.lang.Math.*; + +/** + * A utility class which provides methods to calculate Spriter specific issues, + * like linear interpolation and rotation around a parent object. + * Other interpolation types are coming with the next releases of Spriter. + * + * @author Trixt0r + * + */ + +public class Calculator { + + public final static float PI = (float)Math.PI; + + /** + * Calculates the smallest difference between angle a and b. + * @param a first angle (in degrees) + * @param b second angle (in degrees) + * @return Smallest difference between a and b (between 180 and -180). + */ + public static float angleDifference(float a, float b){ + return ((((a - b) % 360) + 540) % 360) - 180; + } + + /** + * @param x1 x coordinate of first point. + * @param y1 y coordinate of first point. + * @param x2 x coordinate of second point. + * @param y2 y coordinate of second point. + * @return Angle between the two given points. + */ + public static float angleBetween(float x1, float y1, float x2, float y2){ + return (float)toDegrees(atan2(y2-y1,x2-x1)); + } + + /** + * @param x1 x coordinate of first point. + * @param y1 y coordinate of first point. + * @param x2 x coordinate of second point. + * @param y2 y coordinate of second point. + * @return Distance between the two given points. + */ + public static float distanceBetween(float x1, float y1, float x2, float y2){ + float xDiff = x2-x1; + float yDiff = y2-y1; + return (float)sqrt(xDiff*xDiff+yDiff*yDiff); + } + + /** + * Solves the equation a*x^3 + b*x^2 + c*x +d = 0. + * @param a + * @param b + * @param c + * @param d + * @return the solution of the cubic function + */ + public static Float solveCubic(float a, float b, float c, float d) { + if (a == 0) return solveQuadratic(b, c, d); + if (d == 0) return 0f; + + b /= a; + c /= a; + d /= a; + float squaredB = squared(b); + float q = (3f * c - squaredB) / 9f; + float r = (-27f * d + b * (9f * c - 2f * squaredB)) / 54f; + float disc = cubed(q) + squared(r); + float term1 = b / 3f; + + if (disc > 0) { + float s = r + sqrt(disc); + s = (s < 0) ? -cubicRoot(-s) : cubicRoot(s); + float t = r - sqrt(disc); + t = (t < 0) ? -cubicRoot(-t) : cubicRoot(t); + + float result = -term1 + s + t; + if (result >= 0 && result <= 1) return result; + } else if (disc == 0) { + float r13 = (r < 0) ? -cubicRoot(-r) : cubicRoot(r); + + float result = -term1 + 2f * r13; + if (result >= 0 && result <= 1) return result; + + result = -(r13 + term1); + if (result >= 0 && result <= 1) return result; + } else { + q = -q; + float dum1 = q * q * q; + dum1 = acos(r / sqrt(dum1)); + float r13 = 2f * sqrt(q); + + float result = -term1 + r13 * cos(dum1 / 3f); + if (result >= 0 && result <= 1) return result; + + result = -term1 + r13 * cos((dum1 + 2f * PI) / 3f); + if (result >= 0 && result <= 1) return result; + + result = -term1 + r13 * cos((dum1 + 4f * PI) / 3f); + if (result >= 0 && result <= 1) return result; + } + + return null; + } + + /** + * Solves the equation a*x^2 + b*x + c = 0 + * @param a + * @param b + * @param c + * @return the solution for the quadratic function + */ + public static Float solveQuadratic(float a, float b, float c) { + float squaredB = squared(b); + float twoA = 2 * a; + float fourAC = 4 * a * c; + float result = (-b + sqrt(squaredB - fourAC)) / twoA; + if (result >= 0 && result <= 1) return result; + + result = (-b - sqrt(squaredB - fourAC)) / twoA; + if (result >= 0 && result <= 1) return result; + + return null; + } + + /** + * Returns the square of the given value. + * @param f the value + * @return the square of the value + */ + public static float squared(float f) { return f * f; } + + /** + * Returns the cubed value of the given one. + * @param f the value + * @return the cubed value + */ + public static float cubed(float f) { return f * f * f; } + + /** + * Returns the cubic root of the given value. + * @param f the value + * @return the cubic root + */ + public static float cubicRoot(float f) { return (float) pow(f, 1f / 3f); } + + /** + * Returns the square root of the given value. + * @param x the value + * @return the square root + */ + public static float sqrt(float x){ return (float)Math.sqrt(x); } + + /** + * Returns the arc cosine at the given value. + * @param x the value + * @return the arc cosine + */ + public static float acos(float x){ return (float)Math.acos(x); } + + static private final int SIN_BITS = 14; // 16KB. Adjust for accuracy. + static private final int SIN_MASK = ~(-1 << SIN_BITS); + static private final int SIN_COUNT = SIN_MASK + 1; + + static private final float radFull = PI * 2; + static private final float degFull = 360; + static private final float radToIndex = SIN_COUNT / radFull; + static private final float degToIndex = SIN_COUNT / degFull; + + /** multiply by this to convert from radians to degrees */ + static public final float radiansToDegrees = 180f / PI; + static public final float radDeg = radiansToDegrees; + /** multiply by this to convert from degrees to radians */ + static public final float degreesToRadians = PI / 180; + static public final float degRad = degreesToRadians; + + static private class Sin { + static final float[] table = new float[SIN_COUNT]; + static { + for (int i = 0; i < SIN_COUNT; i++) + table[i] = (float)Math.sin((i + 0.5f) / SIN_COUNT * radFull); + for (int i = 0; i < 360; i += 90) + table[(int)(i * degToIndex) & SIN_MASK] = (float)Math.sin(i * degreesToRadians); + } + } + + /** Returns the sine in radians from a lookup table. */ + static public final float sin (float radians) { + return Sin.table[(int)(radians * radToIndex) & SIN_MASK]; + } + + /** Returns the cosine in radians from a lookup table. */ + static public final float cos (float radians) { + return Sin.table[(int)((radians + PI / 2) * radToIndex) & SIN_MASK]; + } + + /** Returns the sine in radians from a lookup table. */ + static public final float sinDeg (float degrees) { + return Sin.table[(int)(degrees * degToIndex) & SIN_MASK]; + } + + /** Returns the cosine in radians from a lookup table. */ + static public final float cosDeg (float degrees) { + return Sin.table[(int)((degrees + 90) * degToIndex) & SIN_MASK]; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Curve.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Curve.java new file mode 100644 index 00000000..279bb151 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Curve.java @@ -0,0 +1,207 @@ +package com.brashmonkey.spriter; + +import static com.brashmonkey.spriter.Calculator.*; +import static com.brashmonkey.spriter.Interpolator.*; + +/** + * Represents a curve in a Spriter SCML file. + * An instance of this class is responsible for tweening given data. + * The most important method of this class is {@link #tween(float, float, float)}. + * Curves can be changed with sub curves {@link Curve#subCurve}. + * @author Trixt0r + * + */ +public class Curve { + + /** + * Represents a curve type in a Spriter SCML file. + * @author Trixt0r + * + */ + public static enum Type { + Instant, Linear, Quadratic, Cubic, Quartic, Quintic, Bezier; + } + + /** + * Returns a curve type based on the given curve name. + * @param name the name of the curve + * @return the curve type. {@link Type#Linear} is returned as a default type. + */ + public static Type getType(String name){ + if(name.equals("instant")) return Type.Instant; + else if(name.equals("quadratic")) return Type.Quadratic; + else if(name.equals("cubic")) return Type.Cubic; + else if(name.equals("quartic")) return Type.Quartic; + else if(name.equals("quintic")) return Type.Quintic; + else if(name.equals("bezier")) return Type.Bezier; + else return Type.Linear; + } + + private Type type; + /** + * The sub curve of this curve, which can be null. + */ + public Curve subCurve; + /** + * The constraints of a curve which will affect a curve of the types different from {@link Type#Linear} and {@link Type#Instant}. + */ + public final Constraints constraints = new Constraints(0, 0, 0, 0); + + /** + * Creates a new linear curve. + */ + public Curve(){ + this(Type.Linear); + } + + /** + * Creates a new curve with the given type. + * @param type the curve type + */ + public Curve(Type type){ + this(type, null); + } + + /** + * Creates a new curve with the given type and sub cuve. + * @param type the curve type + * @param subCurve the sub curve. Can be null + */ + public Curve(Type type, Curve subCurve){ + this.setType(type); + this.subCurve = subCurve; + } + + /** + * Sets the type of this curve. + * @param type the curve type. + * @throws SpriterException if the type is null + */ + public void setType(Type type){ + if(type == null) throw new SpriterException("The type of a curve cannot be null!"); + this.type = type; + } + + /** + * Returns the type of this curve. + * @return the curve type + */ + public Type getType(){ + return this.type; + } + + + private float lastCubicSolution = 0f; + /** + * Returns a new value based on the given values. + * Tweens the weight with the set sub curve. + * @param a the start value + * @param b the end value + * @param t the weight which lies between 0.0 and 1.0 + * @return tweened value + */ + public float tween(float a, float b, float t){ + t = tweenSub(0f,1f,t); + switch(type){ + case Instant: return a; + case Linear: return linear(a, b, t); + case Quadratic: return quadratic(a, linear(a, b, constraints.c1), b, t); + case Cubic: return cubic(a, linear(a, b, constraints.c1), linear(a, b, constraints.c2), b, t); + case Quartic: return quartic(a, linear(a, b, constraints.c1), linear(a, b, constraints.c2), linear(a, b, constraints.c3), b, t); + case Quintic: return quintic(a, linear(a, b, constraints.c1), linear(a, b, constraints.c2), linear(a, b, constraints.c3), linear(a, b, constraints.c4), b, t); + case Bezier: Float cubicSolution = solveCubic(3f*(constraints.c1-constraints.c3) + 1f, 3f*(constraints.c3-2f*constraints.c1), 3f*constraints.c1, -t); + if(cubicSolution == null) cubicSolution = lastCubicSolution; + else lastCubicSolution = cubicSolution; + return linear(a, b, bezier(cubicSolution, 0f, constraints.c2, constraints.c4, 1f)); + default: return linear(a, b, t); + } + } + + /** + * Interpolates the given two points with the given weight and saves the result in the target point. + * @param a the start point + * @param b the end point + * @param t the weight which lies between 0.0 and 1.0 + * @param target the target point to save the result in + */ + public void tweenPoint(Point a, Point b, float t, Point target){ + target.set(this.tween(a.x, b.x, t), this.tween(a.y, b.y, t)); + } + + private float tweenSub(float a, float b, float t){ + if(this.subCurve != null) return subCurve.tween(a, b, t); + else return t; + } + + /** + * Returns a tweened angle based on the given angles, weight and the spin. + * @param a the start angle + * @param b the end angle + * @param t the weight which lies between 0.0 and 1.0 + * @param spin the spin, which is either 0, 1 or -1 + * @return tweened angle + */ + public float tweenAngle(float a, float b, float t, int spin){ + if(spin>0){ + if(b-a < 0) + b+=360; + } + else if(spin < 0){ + if(b-a > 0) + b-=360; + } + else return a; + + return tween(a, b, t); + } + + /** + * + */ + public float tweenAngle(float a, float b, float t){ + t = tweenSub(0f,1f,t); + switch(type){ + case Instant: return a; + case Linear: return linearAngle(a, b, t); + case Quadratic: return quadraticAngle(a, linearAngle(a, b, constraints.c1), b, t); + case Cubic: return cubicAngle(a, linearAngle(a, b, constraints.c1), linearAngle(a, b, constraints.c2), b, t); + case Quartic: return quarticAngle(a, linearAngle(a, b, constraints.c1), linearAngle(a, b, constraints.c2), linearAngle(a, b, constraints.c3), b, t); + case Quintic: return quinticAngle(a, linearAngle(a, b, constraints.c1), linearAngle(a, b, constraints.c2), linearAngle(a, b, constraints.c3), linearAngle(a, b, constraints.c4), b, t); + case Bezier: Float cubicSolution = solveCubic(3f*(constraints.c1-constraints.c3) + 1f, 3f*(constraints.c3-2f*constraints.c1), 3f*constraints.c1, -t); + if(cubicSolution == null) cubicSolution = lastCubicSolution; + else lastCubicSolution = cubicSolution; + return linearAngle(a, b, bezier(cubicSolution, 0f, constraints.c2, constraints.c4, 1f)); + default: return linearAngle(a, b, t); + } + } + + public String toString(){ + return getClass().getSimpleName()+"|["+type+":"+constraints+", subCurve: "+subCurve+"]"; + } + + /** + * Represents constraints for a curve. + * Constraints are important for curves which have a order higher than 1. + * @author Trixt0r + * + */ + public static class Constraints{ + public float c1, c2, c3, c4; + + public Constraints(float c1, float c2, float c3, float c4){ + this.set(c1, c2, c3, c4); + } + + public void set(float c1, float c2, float c3, float c4){ + this.c1 = c1; + this.c2 = c2; + this.c3 = c3; + this.c4 = c4; + } + + public String toString(){ + return getClass().getSimpleName()+"| [c1:"+c1+", c2:"+c2+", c3:"+c3+", c4:"+c4+"]"; + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Data.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Data.java new file mode 100644 index 00000000..ad6747ec --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Data.java @@ -0,0 +1,153 @@ +package com.brashmonkey.spriter; + + +import java.util.ArrayList; + +/** + * Represents all the data which necessary to animate a Spriter generated SCML file. + * An instance of this class holds {@link Folder}s and {@link Entity} instances. + * Specific {@link Folder} and {@link Entity} instances can be accessed via the corresponding methods, i.e. getEntity() and getFolder(). + * @author Trixt0r + * + */ +public class Data { + + final Folder[] folders; + final Entity[] entities; + private int folderPointer = 0, entityPointer = 0; + public final String scmlVersion, generator, generatorVersion; + + Data(String scmlVersion, String generator, String generatorVersion, int folders, int entities){ + this.scmlVersion = scmlVersion; + this.generator = generator; + this.generatorVersion = generatorVersion; + this.folders = new Folder[folders]; + this.entities = new Entity[entities]; + } + + /** + * Adds a folder to this data. + * @param folder the folder to add + */ + void addFolder(Folder folder){ + this.folders[folderPointer++] = folder; + } + + /** + * Adds an entity to this data. + * @param entity the entity to add + */ + void addEntity(Entity entity){ + this.entities[entityPointer++] = entity; + } + + /** + * Returns a {@link Folder} instance with the given name. + * @param name the name of the folder + * @return the folder with the given name or null if no folder with the given name exists + */ + public Folder getFolder(String name){ + int index = getFolderIndex(name); + if(index >= 0) return getFolder(index); + else return null; + } + + /** + * Returns a folder index with the given name. + * @param name name of the folder + * @return the folder index of the Folder with the given name or -1 if no folder with the given name exists + */ + int getFolderIndex(String name){ + for(Folder folder: this.folders) + if(folder.name.equals(name)) return folder.id; + return -1; + } + + /** + * Returns a {@link Folder} instance at the given index. + * @param index the index of the folder + * @return the {@link Folder} instance at the given index + */ + Folder getFolder(int index){ + return this.folders[index]; + } + + /** + * Returns an {@link Entity} instance with the given index. + * @param index index of the entity to return. + * @return the entity with the given index + */ + public Entity getEntity(int index){ + return this.entities[index]; + } + + /** + * Returns an {@link Entity} instance with the given name. + * @param name the name of the entity + * @return the entity with the given name or null if no entity with the given name exists + */ + public Entity getEntity(String name){ + int index = getEntityIndex(name); + if(index >= 0) return getEntity(index); + else return null; + } + + /** + * Returns an entity index with the given name. + * @param name name of the entity + * @return the entity index of the entity with the given name or -1 if no entity with the given name exists + */ + int getEntityIndex(String name){ + for(Entity entity: this.entities) + if(entity.name.equals(name)) return entity.id; + return -1; + } + + /** + * Returns a {@link File} instance in the given {@link Folder} instance at the given file index. + * @param folder {@link Folder} instance to search in. + * @param file index of the file + * @return the {@link File} instance in the given folder at the given file index + */ + public File getFile(Folder folder, int file){ + return folder.getFile(file); + } + + /** + * Returns a {@link File} instance in the given folder at the given file index. + * @param folder index of the folder + * @param file index of the file + * @return the {@link File} instance in the given folder at the given file index + */ + public File getFile(int folder, int file){ + return getFile(this.getFolder(folder), file); + } + + /** + * Returns a {@link File} instance for the given {@link FileReference} instance. + * @param ref reference to the file + * @return the {@link File} instance for the given reference + */ + public File getFile(FileReference ref){ + return this.getFile(ref.folder, ref.file); + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[Version: "+scmlVersion+", Generator: "+generator+" ("+generatorVersion+")]"; + for(Folder folder: folders) + toReturn += "\n"+folder; + for(Entity entity: entities) + toReturn += "\n"+entity; + toReturn+="]"; + return toReturn; + } + + public ArrayList getEntities(){ + ArrayList names = new ArrayList(this.entities.length); + for (int i = 0; i < entities.length; i++) { + names.add(entities[i].name); + } + return names; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Dimension.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Dimension.java new file mode 100644 index 00000000..f9a27d49 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Dimension.java @@ -0,0 +1,52 @@ +package com.brashmonkey.spriter; + +/** + * Represents a dimension in a 2D space. + * A dimension has a width and a height. + * @author Trixt0r + * + */ +public class Dimension { + + public float width, height; + + /** + * Creates a new dimension with the given size. + * @param width the width of the dimension + * @param height the height of the dimension + */ + public Dimension(float width, float height){ + this.set(width, height); + } + + /** + * Creates a new dimension with the given size. + * @param size the size + */ + public Dimension(Dimension size){ + this.set(size); + } + + /** + * Sets the size of this dimension to the given size. + * @param width the width of the dimension + * @param height the height of the dimension + */ + public void set(float width, float height){ + this.width = width; + this.height = height; + } + + /** + * Sets the size of this dimension to the given size. + * @param size the size + */ + public void set(Dimension size){ + this.set(size.width, size.height); + } + + public String toString(){ + return "["+width+"x"+height+"]"; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Drawer.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Drawer.java new file mode 100644 index 00000000..5c13242d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Drawer.java @@ -0,0 +1,265 @@ +package com.brashmonkey.spriter; + +import java.util.Iterator; + +import com.brashmonkey.spriter.Entity.CharacterMap; +import com.brashmonkey.spriter.Entity.ObjectInfo; +import com.brashmonkey.spriter.Entity.ObjectType; +import com.brashmonkey.spriter.Timeline.Key.Bone; +import com.brashmonkey.spriter.Timeline.Key.Object; + +/** + * A Drawer is responsible for drawing a {@link Player}. + * Since this library is meant to be as generic as possible this class has to be abstract, because it cannot be assumed how to draw a resource. + * Anyone who wants to draw a {@link Player} has to know how to draw a resource. A resource can be e.g. a sprite, a texture or a texture region. + * To draw a {@link Player} call {@link #draw(Player)}. This method relies on {@link #draw(Object)}, which has to be implemented with the chosen backend. + * To debug draw a {@link Player} call {@link #drawBones(Player)}, {@link #drawBoxes(Player)} and {@link #drawPoints(Player)}, + * which rely on {@link #rectangle(float, float, float, float)}, {@link #circle(float, float, float)}, {@link #line(float, float, float, float)} and {@link #setColor(float, float, float, float)}. + * @author Trixt0r + * + * @param The backend specific resource. In general such a resource is called "sprite", "texture" or "image". + */ +public abstract class Drawer { + + /** + * The radius of a point for debug drawing purposes. + */ + public float pointRadius = 5f; + protected Loader loader; + + /** + * Creates a new drawer based on the given loader. + * @param loader the loader containing resources + */ + public Drawer(Loader loader){ + this.loader = loader; + } + + /** + * Sets the loader of this drawer. + * @param loader the loader containing resources + * @throws SpriterException if the loader is null + */ + public void setLoader(Loader loader){ + if(loader == null) throw new SpriterException("The loader instance can not be null!"); + this.loader = loader; + } + + /** + * Draws the bones of the given player composed of lines. + * @param player the player to draw + */ + public void drawBones(Player player){ + this.setColor(1, 0, 0, 1); + Iterator it = player.boneIterator(); + while(it.hasNext()){ + Timeline.Key.Bone bone = it.next(); + Timeline.Key key = player.getKeyFor(bone); + if(!key.active) continue; + ObjectInfo info = player.getObjectInfoFor(bone); + Dimension size = info.size; + drawBone(bone, size); + } + /*for(Mainline.Key.BoneRef ref: player.getCurrentKey().boneRefs){ + Timeline.Key key = player.unmappedTweenedKeys[ref.timeline]; + Timeline.Key.Bone bone = key.object(); + if(player.animation.getTimeline(ref.timeline).objectInfo.type != ObjectType.Bone || !key.active) continue; + ObjectInfo info = player.animation.getTimeline(ref.timeline).objectInfo; + if(info == null) continue; + Dimension size = info.size; + drawBone(bone, size); + }*/ + } + + /** + * Draws the given bone composed of lines with the given size. + * @param bone the bone to draw + * @param size the size of the bone + */ + public void drawBone(Bone bone, Dimension size){ + float halfHeight = size.height/2; + float xx = bone.position.x+(float)Math.cos(Math.toRadians(bone.angle))*size.height; + float yy = bone.position.y+(float)Math.sin(Math.toRadians(bone.angle))*size.height; + float x2 = (float)Math.cos(Math.toRadians(bone.angle+90))*halfHeight*bone.scale.y; + float y2 = (float)Math.sin(Math.toRadians(bone.angle+90))*halfHeight*bone.scale.y; + + float targetX = bone.position.x+(float)Math.cos(Math.toRadians(bone.angle))*size.width*bone.scale.x, + targetY = bone.position.y+(float)Math.sin(Math.toRadians(bone.angle))*size.width*bone.scale.x; + float upperPointX = xx+x2, upperPointY = yy+y2; + this.line(bone.position.x, bone.position.y, upperPointX, upperPointY); + this.line(upperPointX, upperPointY, targetX, targetY); + + float lowerPointX = xx-x2, lowerPointY = yy-y2; + this.line(bone.position.x, bone.position.y, lowerPointX, lowerPointY); + this.line(lowerPointX, lowerPointY, targetX, targetY); + this.line(bone.position.x, bone.position.y, targetX, targetY); + } + + /** + * Draws the boxes of the player. + * @param player the player to draw the boxes from + */ + public void drawBoxes(Player player){ + this.setColor(0f, 1f, 0f, 1f); + this.drawBoneBoxes(player); + this.drawObjectBoxes(player); + this.drawPoints(player); + } + + /** + * Draws the boxes of all bones of the given player. + * @param player the player to draw the bone boxes of + */ + public void drawBoneBoxes(Player player){ + drawBoneBoxes(player, player.boneIterator()); + } + + /** + * Draws the boxes of all bones of the given player based on the given iterator. + * @param player the player to draw the bone boxes of + * @param it the iterator iterating over the bones to draw + */ + public void drawBoneBoxes(Player player, Iterator it){ + while(it.hasNext()){ + Bone bone = it.next(); + this.drawBox(player.getBox(bone)); + } + } + + /** + * Draws the boxes of the player objects, i.e. sprites and objects. + * @param player the player to draw the object boxes of + */ + public void drawObjectBoxes(Player player){ + drawObjectBoxes(player, player.objectIterator()); + } + + /** + * Draws the boxes of sprites and boxes of the given player based on the given iterator. + * @param player player the player to draw the object boxes of + * @param it the iterator iterating over the object to draw + */ + public void drawObjectBoxes(Player player, Iterator it){ + while(it.hasNext()){ + Object bone = it.next(); + this.drawBox(player.getBox(bone)); + } + } + + /** + * Draws all points of the given player. + * @param player the player to draw the points of. + */ + public void drawPoints(Player player){ + drawPoints(player, player.objectIterator()); + } + + /** + * Draws the points of the given player based on the given iterator. + * @param player player the player to draw the points of + * @param it the iterator iterating over the points to draw + */ + public void drawPoints(Player player, Iterator it){ + while(it.hasNext()){ + Object point = it.next(); + if(player.getObjectInfoFor(point).type == ObjectType.Point){ + float x = point.position.x+(float)(Math.cos(Math.toRadians(point.angle))*pointRadius); + float y = point.position.y+(float)(Math.sin(Math.toRadians(point.angle))*pointRadius); + circle(point.position.x, point.position.y, pointRadius); + line(point.position.x, point.position.y, x,y); + } + } + } + + /** + * Draws the given player with its current character map. + * @param player the player to draw + */ + public void draw(Player player){ + this.draw(player, player.characterMaps); + } + + /** + * Draws the given player with the given character map. + * @param player the player to draw + * @param maps the character map to draw + */ + public void draw(Player player, CharacterMap[] maps){ + this.draw(player.objectIterator(), maps); + } + + /** + * Draws the objects the given iterator is providing with the given character map. + * @param it the iterator iterating over the objects to draw + * @param maps the character map to draw + */ + public void draw(Iterator it, CharacterMap[] maps){ + while(it.hasNext()){ + Timeline.Key.Object object = it.next(); + if(object.ref.hasFile()){ + if(maps != null){ + for(CharacterMap map: maps) + if(map != null) + object.ref.set(map.get(object.ref)); + } + this.draw(object); + } + } + } + + /** + * Draws the given box composed of lines. + * @param box the box to draw + */ + public void drawBox(Box box){ + this.line(box.points[0].x, box.points[0].y, box.points[1].x, box.points[1].y); + this.line(box.points[1].x, box.points[1].y, box.points[3].x, box.points[3].y); + this.line(box.points[3].x, box.points[3].y, box.points[2].x, box.points[2].y); + this.line(box.points[2].x, box.points[2].y, box.points[0].x, box.points[0].y); + } + + public void drawRectangle(Rectangle rect){ + this.rectangle(rect.left, rect.bottom, rect.size.width, rect.size.height); + } + + /** + * Sets the color for drawing lines, rectangles and circles. + * @param r the red value between 0.0 - 1.0 + * @param g the green value between 0.0 - 1.0 + * @param b the blue value between 0.0 - 1.0 + * @param a the alpha value between 0.0 - 1.0 + */ + public abstract void setColor(float r, float g, float b, float a); + + /** + * Draws a line from (x1, y1) to (x2, y2). + * @param x1 + * @param y1 + * @param x2 + * @param y2 + */ + public abstract void line(float x1, float y1, float x2, float y2); + + /** + * Draws a rectangle with origin at (x, y) and the given size. + * @param x the x coordinate + * @param y the y coordinate + * @param width the width of the size + * @param height the height of the size + */ + public abstract void rectangle(float x, float y, float width, float height); + + /** + * Draws a circle at (x, y) with the given radius. + * @param x the x coordinate + * @param y the y coordinate + * @param radius the radius of the circle + */ + public abstract void circle(float x, float y, float radius); + + /** + * Draws the given object with its current resource. + * @param object the object to draw. + */ + public abstract void draw(Timeline.Key.Object object); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Entity.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Entity.java new file mode 100644 index 00000000..a630ebbd --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Entity.java @@ -0,0 +1,241 @@ +package com.brashmonkey.spriter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Represents an entity of a Spriter SCML file. + * An entity holds {@link Animation}s, an {@link #id}, a {@link #name}. + * {@link #characterMaps} and {@link #objectInfos} may be empty. + * @author Trixt0r + * + */ +public class Entity { + + public final int id; + public final String name; + private final Animation[] animations; + private int animationPointer = 0; + private final HashMap namedAnimations; + private final CharacterMap[] characterMaps; + private int charMapPointer = 0; + private final ObjectInfo[] objectInfos; + private int objInfoPointer = 0; + + Entity(int id, String name, int animations, int characterMaps, int objectInfos){ + this.id = id; + this.name = name; + this.animations = new Animation[animations]; + this.characterMaps = new CharacterMap[characterMaps]; + this.objectInfos = new ObjectInfo[objectInfos]; + this.namedAnimations = new HashMap(); + } + + void addAnimation(Animation anim){ + this.animations[animationPointer++] = anim; + this.namedAnimations.put(anim.name, anim); + } + + /** + * Returns an {@link Animation} with the given index. + * @param index the index of the animation + * @return the animation with the given index + * @throws IndexOutOfBoundsException if the index is out of range + */ + public Animation getAnimation(int index){ + return this.animations[index]; + } + + /** + * Returns an {@link Animation} with the given name. + * @param name the name of the animation + * @return the animation with the given name or null if no animation exists with the given name + */ + public Animation getAnimation(String name){ + return this.namedAnimations.get(name); + } + + /** + * Returns the number of animations this entity holds. + * @return the number of animations + */ + public int animations(){ + return this.animations.length; + } + + /** + * Returns whether this entity contains the given animation. + * @param anim the animation to check + * @return true if the given animation is in this entity, false otherwise. + */ + public boolean containsAnimation(Animation anim){ + for(Animation a: this.animations) + if(a == anim) return true; + return false; + } + + /** + * Returns the animation with the most number of time lines in this entity. + * @return animation with the maximum amount of time lines. + */ + public Animation getAnimationWithMostTimelines(){ + Animation maxAnim = getAnimation(0); + for(Animation anim: this.animations){ + if(maxAnim.timelines() < anim.timelines()) maxAnim = anim; + } + return maxAnim; + } + + /** + * Returns a {@link CharacterMap} with the given name. + * @param name name of the character map + * @return the character map or null if no character map exists with the given name + */ + public CharacterMap getCharacterMap(String name){ + for(CharacterMap map: this.characterMaps) + if(map.name.equals(name)) return map; + return null; + } + + void addCharacterMap(CharacterMap map){ + this.characterMaps[charMapPointer++] = map; + } + + void addInfo(ObjectInfo info){ + this.objectInfos[objInfoPointer++] = info; + } + + /** + * Returns an {@link ObjectInfo} with the given index. + * @param index the index of the object info + * @return the object info + * @throws IndexOutOfBoundsException if index is out of range + */ + public ObjectInfo getInfo(int index){ + return this.objectInfos[index]; + } + + /** + * Returns an {@link ObjectInfo} with the given name. + * @param name name of the object info + * @return object info or null if no object info exists with the given name + */ + public ObjectInfo getInfo(String name){ + for(ObjectInfo info: this.objectInfos) + if(info.name.equals(name)) return info; + return null; + } + + /** + * Returns an {@link ObjectInfo} with the given name and the given {@link ObjectType} type. + * @param name the name of the object info + * @param type the type if the object info + * @return the object info or null if no object info exists with the given name and type + */ + public ObjectInfo getInfo(String name, ObjectType type){ + ObjectInfo info = this.getInfo(name); + if(info != null && info.type == type) return info; + else return null; + } + + /** + * Represents the object types Spriter supports. + * @author Trixt0r + * + */ + public static enum ObjectType{ + Sprite, Bone, Box, Point, Skin; + + /** + * Returns the object type for the given name + * @param name the name of the type + * @return the object type, Sprite is the default value + */ + public static ObjectType getObjectInfoFor(String name){ + if(name.equals("bone")) return Bone; + else if(name.equals("skin")) return Skin; + else if(name.equals("box")) return Box; + else if(name.equals("point")) return Point; + else return Sprite; + } + } + + /** + * Represents the object info in a Spriter SCML file. + * An object info holds a {@link #type} and a {@link #name}. + * If the type is a Sprite it holds a list of frames. Otherwise it has a {@link #size} for debug drawing purposes. + * @author Trixt0r + * + */ + public static class ObjectInfo{ + public final ObjectType type; + public final List frames; + public final String name; + public final Dimension size; + + ObjectInfo(String name, ObjectType type, Dimension size, List frames){ + this.type = type; + this.frames = frames; + this.name = name; + this.size = size; + } + + ObjectInfo(String name, ObjectType type, Dimension size){ + this(name, type, size, new ArrayList()); + } + + ObjectInfo(String name, ObjectType type, List frames){ + this(name, type, new Dimension(0,0), frames); + } + + public String toString(){ + return name + ": "+ type + ", size: "+size+"|frames:\n"+frames; + } + } + + /** + * Represents a Spriter SCML character map. + * A character map maps {@link FileReference}s to {@link FileReference}s. + * It holds an {@link CharacterMap#id} and a {@link CharacterMap#name}. + * @author Trixt0r + * + */ + public static class CharacterMap extends HashMap{ + private static final long serialVersionUID = 6062776450159802283L; + + public final int id; + public final String name; + + public CharacterMap(int id, String name){ + this.id = id; + this.name = name; + } + + /** + * Returns the mapped reference for the given key. + * @param key the key of the reference + * @return The mapped reference if the key is in this map, otherwise the given key itself is returned. + */ + public FileReference get(FileReference key){ + if(!super.containsKey(key)) return key; + else return super.get(key); + } + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[id: "+id+", name: "+name+"]"; + toReturn +="Object infos:\n"; + for(ObjectInfo info: this.objectInfos) + toReturn += "\n"+info; + toReturn +="Character maps:\n"; + for(CharacterMap map: this.characterMaps) + toReturn += "\n"+map; + toReturn +="Animations:\n"; + for(Animation animaton: this.animations) + toReturn += "\n"+animaton; + toReturn+="]"; + return toReturn; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/File.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/File.java new file mode 100644 index 00000000..0dabec2e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/File.java @@ -0,0 +1,36 @@ +package com.brashmonkey.spriter; + +/** + * Represents a file in a Spriter SCML file. + * A file has an {@link #id}, a {@link #name}. + * A {@link #size} and a {@link #pivot} point, i.e. origin of an image do not have to be set since a file can be a sound file. + * @author Trixt0r + * + */ +public class File { + + public final int id; + public final String name; + public final Dimension size; + public final Point pivot; + + File(int id, String name, Dimension size, Point pivot){ + this.id = id; + this.name = name; + this.size = size; + this.pivot = pivot; + } + + /** + * Returns whether this file is a sprite, i.e. an image which is going to be animated, or not. + * @return whether this file is a sprite or not. + */ + public boolean isSprite(){ + return pivot != null && size != null; + } + + public String toString(){ + return getClass().getSimpleName()+"|[id: "+id+", name: "+name+", size: "+size+", pivot: "+pivot; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/FileReference.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/FileReference.java new file mode 100644 index 00000000..2015d8dc --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/FileReference.java @@ -0,0 +1,50 @@ +package com.brashmonkey.spriter; + +/** + * Represents a reference to a specific file. + * A file reference consists of a folder and file index. + * @author Trixt0r + * + */ +public class FileReference { + + public int folder, file; + + public FileReference(int folder, int file){ + this.set(folder, file); + } + + @Override + public int hashCode(){ + return folder*10000+file;//We can have 10000 files per folder + } + + @Override + public boolean equals(Object ref){ + if(ref instanceof FileReference){ + return this.file == ((FileReference)ref).file && this.folder == ((FileReference)ref).folder; + } else return false; + } + + public void set(int folder, int file){ + this.folder = folder; + this.file = file; + } + + public void set(FileReference ref){ + this.set(ref.folder, ref.file); + } + + public boolean hasFile(){ + return this.file != -1; + } + + public boolean hasFolder(){ + return this.folder != -1; + } + + public String toString(){ + return "[folder: "+folder+", file: "+file+"]"; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Folder.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Folder.java new file mode 100644 index 00000000..32257207 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Folder.java @@ -0,0 +1,70 @@ +package com.brashmonkey.spriter; + +/** + * Represents a folder in a Spriter SCML file. + * A folder has at least an {@link #id}, {@link #name} and {@link #files} may be empty. + * An instance of this class holds an array of {@link File} instances. + * Specific {@link File} instances can be accessed via the corresponding methods, i.e getFile(). + * @author Trixt0r + * + */ +public class Folder { + + final File[] files; + private int filePointer = 0; + public final int id; + public final String name; + + Folder(int id, String name, int files){ + this.id = id; + this.name = name; + this.files = new File[files]; + } + + /** + * Adds a {@link File} instance to this folder. + * @param file the file to add + */ + void addFile(File file){ + this.files[filePointer++] = file; + } + + /** + * Returns a {@link File} instance with the given index. + * @param index the index of the file + * @return the file with the given name + */ + public File getFile(int index){ + return files[index]; + } + + /** + * Returns a {@link File} instance with the given name. + * @param name the name of the file + * @return the file with the given name or null if no file with the given name exists + */ + public File getFile(String name){ + int index = getFileIndex(name); + if(index >= 0) return getFile(index); + else return null; + } + + /** + * Returns a file index with the given name. + * @param name the name of the file + * @return the file index with the given name or -1 if no file with the given name exists + */ + int getFileIndex(String name){ + for(File file: this.files) + if(file.name.equals(name)) return file.id; + return -1; + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[id: "+id+", name: "+name; + for(File file: files) + toReturn += "\n"+file; + toReturn += "]"; + return toReturn; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKObject.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKObject.java new file mode 100644 index 00000000..8d908032 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKObject.java @@ -0,0 +1,68 @@ +package com.brashmonkey.spriter; + +/** + * An inverse kinematics objects which defines a constraint for a {@link IKResolver}. + * + * @author Trixt0r + * + */ +public class IKObject extends Point { + + int chainLength, iterations; + + /** + * Creates a new IKObject with the given constraints. + * @param x x coordinate constraint + * @param y y coordinate constraint + * @param length the chain length constraint. + * @param iterations the number of iterations. + */ + public IKObject(float x, float y, int length, int iterations) { + super(x, y); + this.setLength(length); + this.setIterations(iterations); + } + + /** + * Sets the chain length of this ik object. + * The chain length indicates how many parent bones should get affected, when a {@link IKResolver} resolves the constraints. + * @param chainLength the chain length + * @return this ik object for chained operations + * @throws SpriterException if the chain length is smaller than 0 + */ + public IKObject setLength(int chainLength){ + if(chainLength < 0) throw new SpriterException("The chain has to be at least 0!"); + this.chainLength = chainLength; + return this; + } + + /** + * Sets the number of iterations. + * The more iterations a {@link IKResolver} is asked to do, the more precise the result will be. + * @param iterations number of iterations + * @return this ik object for chained operations + * @throws SpriterException if the number of iterations is smaller than 0 + */ + public IKObject setIterations(int iterations){ + if(iterations < 0) throw new SpriterException("The number of iterations has to be at least 1!"); + this.iterations = iterations; + return this; + } + + /** + * Returns the current set chain length. + * @return the chain length + */ + public int getChainLength(){ + return this.chainLength; + } + + /** + * Returns the current set number of iterations. + * @return the number of iterations + */ + public int getIterations(){ + return this.iterations; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKResolver.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKResolver.java new file mode 100644 index 00000000..17789319 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/IKResolver.java @@ -0,0 +1,113 @@ +package com.brashmonkey.spriter; + +import java.util.HashMap; +import java.util.Map.Entry; + +import com.brashmonkey.spriter.Mainline.Key.BoneRef; +import com.brashmonkey.spriter.Timeline.Key.Bone; + +/** + * A IKResolver is responsible for resolving previously set constraints. + * @see Inverse kinematics + * @author Trixt0r + * + */ +public abstract class IKResolver { + + /** + * Resolves the inverse kinematics constraint with a specific algtorithm + * @param x the target x value + * @param y the target y value + * @param chainLength number of parents which are affected + * @param effector the actual effector where the resolved information has to be stored in. + */ + protected abstract void resolve(float x, float y, int chainLength, BoneRef effector); + + protected HashMap ikMap; + protected float tolerance; + protected Player player; + + /** + * Creates a resolver with a default tolerance of 5f. + */ + public IKResolver(Player player) { + this.tolerance = 5f; + this.ikMap = new HashMap(); + this.setPlayer(player); + } + + /** + * Sets the player for this resolver. + * @param player the player which gets affected. + * @throws SpriterException if player is null + */ + public void setPlayer(Player player){ + if(player == null) throw new SpriterException("player cannot be null!"); + this.player = player; + } + + /** + * Returns the current set player. + * @return the current player. + */ + public Player getPlayer(){ + return this.player; + } + + /** + * Resolves the inverse kinematics constraints with the implemented algorithm + * + */ + public void resolve(){ + for(Entry entry: this.ikMap.entrySet()){ + for(int j = 0; j < entry.getKey().iterations; j++) + this.resolve(entry.getKey().x, entry.getKey().y, entry.getKey().chainLength, entry.getValue()); + } + } + + /** + * Adds the given object to the internal IKObject - Bone map. + * This means, the values of the given ik object affect the mapped bone. + * @param ikObject the ik object + * @param boneRef the bone reference which gets affected + */ + public void mapIKObject(IKObject ikObject, BoneRef boneRef){ + this.ikMap.put(ikObject, boneRef); + } + + /** + * Adds the given object to the internal IKObject - Bone map. + * This means, the values of the given ik object affect the mapped bone. + * @param ikObject the ik object + * @param bone the bone which gets affected + */ + public void mapIKObject(IKObject ikObject, Bone bone){ + this.ikMap.put(ikObject, player.getBoneRef(bone)); + } + + /** + * Removes the given object from the internal map. + * @param ikObject the ik object to remove + */ + public void unmapIKObject(IKObject ikObject){ + this.ikMap.remove(ikObject); + } + + /** + * Returns the tolerance of this resolver. + * @return the tolerance + */ + public float getTolerance() { + return tolerance; + } + + /** + * Sets the tolerance distance of this resolver. + * The resolver should stop the algorithm if the distance to the set ik object is less than the tolerance. + * @param tolerance the tolerance + */ + public void setTolerance(float tolerance) { + this.tolerance = tolerance; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Interpolator.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Interpolator.java new file mode 100644 index 00000000..6fdc6544 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Interpolator.java @@ -0,0 +1,75 @@ +package com.brashmonkey.spriter; + + + +/** + * Utility class for various interpolation techniques, Spriter is using. + * @author Trixt0r + * + */ +public class Interpolator { + + public static float linear(float a, float b, float t){ + return a+(b-a)*t; + } + + public static float linearAngle(float a, float b, float t){ + return a + Calculator.angleDifference(b, a)*t; + } + + public static float quadratic(float a, float b, float c, float t){ + return linear(linear(a, b, t), linear(b, c, t), t); + } + + public static float quadraticAngle(float a, float b, float c, float t){ + return linearAngle(linearAngle(a, b, t), linearAngle(b, c, t), t); + } + + public static float cubic(float a, float b, float c, float d, float t){ + return linear(quadratic(a, b, c, t), quadratic(b, c, d, t), t); + } + + public static float cubicAngle(float a, float b, float c, float d, float t){ + return linearAngle(quadraticAngle(a, b, c, t), quadraticAngle(b, c, d, t), t); + } + + public static float quartic(float a, float b, float c, float d, float e, float t){ + return linear(cubic(a, b, c, d, t), cubic(b, c, d, e, t), t); + } + + public static float quarticAngle(float a, float b, float c, float d, float e, float t){ + return linearAngle(cubicAngle(a, b, c, d, t), cubicAngle(b, c, d, e, t), t); + } + + public static float quintic(float a, float b, float c, float d, float e, float f, float t){ + return linear(quartic(a, b, c, d, e, t), quartic(b, c, d, e, f, t), t); + } + + public static float quinticAngle(float a, float b, float c, float d, float e, float f, float t){ + return linearAngle(quarticAngle(a, b, c, d, e, t), quarticAngle(b, c, d, e, f, t), t); + } + + public static float bezier(float t, float x1, float x2, float x3,float x4){ + return bezier0(t)*x1 + bezier1(t)*x2 + bezier2(t)*x3 + bezier3(t)*x4; + } + + private static float bezier0(float t){ + float temp = t*t; + return -temp*t + 3*temp - 3*t + 1; + } + + private static float bezier1(float t){ + float temp = t*t; + return 3*t*temp - 6*temp + 3*t; + } + + private static float bezier2(float t){ + float temp = t*t; + return -3*temp*t+3*temp; + } + + private static float bezier3(float t){ + return t*t*t; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Loader.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Loader.java new file mode 100644 index 00000000..5ad59635 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Loader.java @@ -0,0 +1,117 @@ +package com.brashmonkey.spriter; + +import java.util.HashMap; + +/** + * A loader is responsible for loading all resources. + * Since this library is meant to be as generic as possible, it cannot be assumed how to load a resource. Because of this this class has to be abstract. + * This class takes care of loading all resources a {@link Data} instance contains. + * To load all resources an instance relies on {@link #loadResource(FileReference)} which has to implemented with the backend specific methods. + * + * @author Trixt0r + * + * @param The backend specific resource. In general such a resource is called "sprite", "texture" or "image". + */ +public abstract class Loader { + + /** + * Contains all loaded resources if not {@link #isDisposed()}. + */ + protected final HashMap resources; + + /** + * The current set data containing {@link Folder}s and {@link File}s. + */ + protected Data data; + + /** + * The root path to the previous loaded Spriter SCML file. + */ + protected String root = ""; + + private boolean disposed; + + /** + * Creates a loader with the given Spriter data. + * @param data the generated Spriter data + */ + public Loader(Data data){ + this.data = data; + this.resources = new HashMap(100); + } + + /** + * Loads a resource. + * The path to the file can be resolved with {@link #root} and {@link #data}. + * I recommend using {@link Data#getFile(FileReference)}. Then the path to the resource is {@link File#name} relative to {@link #root}. + * @param ref the reference to load + * @return the loaded resource + */ + protected abstract R loadResource(FileReference ref); + + /** + * Called when all resources from {@link #data} have been loaded. + */ + protected void finishLoading(){} + + /** + * Called before all resources get loaded. + */ + protected void beginLoading(){} + + /** + * Loads all resources indicated by {@link #data}. + * @param root the root folder of the previously loaded Spriter SCML file + */ + public void load(String root){ + this.root = root; + this.beginLoading(); + for(Folder folder: data.folders){ + for(File file: folder.files){ + //if(new java.io.File(root+"/"+file.name).exists()){ + FileReference ref = new FileReference(folder.id, file.id); + this.resources.put(ref, this.loadResource(ref)); + //} + } + } + this.disposed = false; + this.finishLoading(); + } + + /** + * Loads all resources indicated by {@link #data}. + * @param file the previously loaded Spriter SCML file + */ + public void load(java.io.File file){ + this.load(file.getParent()); + } + + /** + * Returns a resource the given reference is pointing to. + * @param ref the reference pointing to a resource + * @return the resource or null if the resource is not loaded yet. + */ + public R get(FileReference ref){ + return this.resources.get(ref); + } + + /** + * Removes all loaded resources from the internal reference-resource map. + * Override this method and dispose all your resources. After that call {@link #dispose()} of the super class. + */ + public void dispose(){ + resources.clear(); + data = null; + root = ""; + disposed = true; + } + + /** + * Returns whether this loader has been disposed or not. + * @return true if this loader is disposed + */ + public boolean isDisposed(){ + return disposed; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Mainline.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Mainline.java new file mode 100644 index 00000000..949b6c5e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Mainline.java @@ -0,0 +1,216 @@ +package com.brashmonkey.spriter; + +/** + * Represents a mainline in a Spriter SCML file. + * A mainline holds only keys and occurs only once in an animation. + * The mainline is responsible for telling which draw order the sprites have + * and how the objects are related to each other, i.e. which bone is the root and which objects are the children. + * @author Trixt0r + * + */ +public class Mainline { + + final Key[] keys; + private int keyPointer = 0; + + public Mainline(int keys){ + this.keys = new Key[keys]; + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|"; + for(Key key: keys) + toReturn += "\n"+key; + toReturn+="]"; + return toReturn; + } + + public void addKey(Key key){ + this.keys[keyPointer++] = key; + } + + /** + * Returns a {@link Key} at the given index. + * @param index the index of the key + * @return the key with the given index + * @throws IndexOutOfBoundsException if index is out of range + */ + public Key getKey(int index){ + return this.keys[index]; + } + + /** + * Returns a {@link Key} before the given time. + * @param time the time a key has to be before + * @return a key which has a time value before the given one. + * The first key is returned if no key was found. + */ + public Key getKeyBeforeTime(int time){ + Key found = this.keys[0]; + for(Key key: this.keys){ + if(key.time <= time) found = key; + else break; + } + return found; + } + + /** + * Represents a mainline key in a Spriter SCML file. + * A mainline key holds an {@link #id}, a {@link #time}, a {@link #curve} + * and lists of bone and object references which build a tree hierarchy. + * @author Trixt0r + * + */ + public static class Key{ + + public final int id, time; + final BoneRef[] boneRefs; + final ObjectRef[] objectRefs; + private int bonePointer = 0, objectPointer = 0; + public final Curve curve; + + public Key(int id, int time, Curve curve, int boneRefs, int objectRefs){ + this.id = id; + this.time = time; + this.curve = curve; + this.boneRefs = new BoneRef[boneRefs]; + this.objectRefs = new ObjectRef[objectRefs]; + } + + /** + * Adds a bone reference to this key. + * @param ref the reference to add + */ + public void addBoneRef(BoneRef ref){ + this.boneRefs[bonePointer++] = ref; + } + + /** + * Adds a object reference to this key. + * @param ref the reference to add + */ + public void addObjectRef(ObjectRef ref){ + this.objectRefs[objectPointer++] = ref; + } + + /** + * Returns a {@link BoneRef} with the given index. + * @param index the index of the bone reference + * @return the bone reference or null if no reference exists with the given index + */ + public BoneRef getBoneRef(int index){ + if(index < 0 || index >= this.boneRefs.length) return null; + else return this.boneRefs[index]; + } + + /** + * Returns a {@link ObjectRef} with the given index. + * @param index the index of the object reference + * @return the object reference or null if no reference exists with the given index + */ + public ObjectRef getObjectRef(int index){ + if(index < 0 || index >= this.objectRefs.length) return null; + else return this.objectRefs[index]; + } + + /** + * Returns a {@link BoneRef} for the given reference. + * @param ref the reference to the reference in this key + * @return a bone reference with the same time line as the given one + */ + public BoneRef getBoneRef(BoneRef ref){ + return getBoneRefTimeline(ref.timeline); + } + + /** + * Returns a {@link BoneRef} with the given time line index. + * @param timeline the time line index + * @return the bone reference with the given time line index or null if no reference exists with the given time line index + */ + public BoneRef getBoneRefTimeline(int timeline){ + for(BoneRef boneRef: this.boneRefs) + if(boneRef.timeline == timeline) return boneRef; + return null; + } + + /** + * Returns an {@link ObjectRef} for the given reference. + * @param ref the reference to the reference in this key + * @return an object reference with the same time line as the given one + */ + public ObjectRef getObjectRef(ObjectRef ref){ + return getObjectRefTimeline(ref.timeline); + } + + /** + * Returns a {@link ObjectRef} with the given time line index. + * @param timeline the time line index + * @return the object reference with the given time line index or null if no reference exists with the given time line index + */ + public ObjectRef getObjectRefTimeline(int timeline){ + for(ObjectRef objRef: this.objectRefs) + if(objRef.timeline == timeline) return objRef; + return null; + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[id:"+id+", time: "+time+", curve: ["+curve+"]"; + for(BoneRef ref: boneRefs) + toReturn += "\n"+ref; + for(ObjectRef ref: objectRefs) + toReturn += "\n"+ref; + toReturn+="]"; + return toReturn; + } + + /** + * Represents a bone reference in a Spriter SCML file. + * A bone reference holds an {@link #id}, a {@link #timeline} and a {@link #key}. + * A bone reference may have a parent reference. + * @author Trixt0r + * + */ + public static class BoneRef{ + public final int id, key, timeline; + public final BoneRef parent; + + public BoneRef(int id, int timeline, int key, BoneRef parent){ + this.id = id; + this.timeline = timeline; + this.key = key; + this.parent = parent; + } + + public String toString(){ + int parentId = (parent != null) ? parent.id:-1; + return getClass().getSimpleName()+"|id: "+id+", parent:"+parentId+", timeline: "+timeline+", key: "+key; + } + } + + /** + * Represents an object reference in a Spriter SCML file. + * An object reference extends a {@link BoneRef} with a {@link #zIndex}, + * which indicates when the object has to be drawn. + * @author Trixt0r + * + */ + public static class ObjectRef extends BoneRef implements Comparable{ + public final int zIndex; + + public ObjectRef(int id, int timeline, int key, BoneRef parent, int zIndex){ + super(id, timeline, key, parent); + this.zIndex = zIndex; + } + + public String toString(){ + return super.toString()+", z_index: "+zIndex; + } + + @Override + public int compareTo(ObjectRef o) { + return (int)Math.signum(zIndex-o.zIndex); + } + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Player.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Player.java new file mode 100644 index 00000000..1309b2d4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Player.java @@ -0,0 +1,1132 @@ +package com.brashmonkey.spriter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import com.brashmonkey.spriter.Entity.CharacterMap; +import com.brashmonkey.spriter.Entity.ObjectInfo; +import com.brashmonkey.spriter.Mainline.Key.BoneRef; +import com.brashmonkey.spriter.Mainline.Key.ObjectRef; +import com.brashmonkey.spriter.Timeline.Key.Bone; +import com.brashmonkey.spriter.Timeline.Key.Object; + +/** + * A Player instance is responsible for updating an {@link Animation} properly. + * With the {@link #update()} method an instance of this class will increase its current time + * and update the current set animation ({@link #setAnimation(Animation)}). + * A Player can be positioned with {@link #setPivot(float, float)}, scaled with {@link #setScale(float)}, + * flipped with {@link #flip(boolean, boolean)} and rotated {@link #setAngle(float)}. + * A Player has various methods for runtime object manipulation such as {@link #setBone(String, Bone)} or . + * Events like the ending of an animation can be observed with the {@link PlayerListener} interface. + * Character maps can be changed on the fly, just by assigning a character maps to {@link #characterMaps}, setting it to null will remove the current character map. + * + * @author Trixt0r + * + */ +public class Player { + + protected Entity entity; + Animation animation; + int time; + public int speed; + Timeline.Key[] tweenedKeys, unmappedTweenedKeys; + private Timeline.Key[] tempTweenedKeys, tempUnmappedTweenedKeys; + private List listeners; + public final List attachments = new ArrayList(); + Timeline.Key.Bone root = new Timeline.Key.Bone(new Point(0,0)); + private final Point position = new Point(0,0), pivot = new Point(0,0); + private final HashMap objToTimeline = new HashMap(); + private float angle; + private boolean dirty = true; + public CharacterMap[] characterMaps; + private Rectangle rect; + public final Box prevBBox; + private BoneIterator boneIterator; + private ObjectIterator objectIterator; + private Mainline.Key currentKey, prevKey; + public boolean copyObjects = true; + + /** + * Creates a {@link Player} instance with the given entity. + * @param entity the entity this player will animate + */ + public Player(Entity entity){ + this.boneIterator = new BoneIterator(); + this.objectIterator = new ObjectIterator(); + this.speed = 15; + this.rect = new Rectangle(0,0,0,0); + this.prevBBox = new Box(); + this.listeners = new ArrayList(); + this.setEntity(entity); + } + + /** + * Updates this player. + * This means the current time gets increased by {@link #speed} and is applied to the current animation. + */ + public void update(){ + for(PlayerListener listener: listeners) + listener.preProcess(this); + if(dirty) this.updateRoot(); + this.animation.update(time, root); + this.currentKey = this.animation.currentKey; + if(prevKey != currentKey){ + for(PlayerListener listener: listeners) + listener.mainlineKeyChanged(prevKey, currentKey); + prevKey = currentKey; + } + if(copyObjects){ + tweenedKeys = tempTweenedKeys; + unmappedTweenedKeys = tempUnmappedTweenedKeys; + this.copyObjects(); + } + else{ + tweenedKeys = animation.tweenedKeys; + unmappedTweenedKeys = animation.unmappedTweenedKeys; + } + + for(Attachment attach: attachments) + attach.update(); + + for(PlayerListener listener: listeners) + listener.postProcess(this); + this.increaseTime(); + } + + private void copyObjects(){ + for(int i = 0; i < animation.tweenedKeys.length; i++){ + this.tweenedKeys[i].active = animation.tweenedKeys[i].active; + this.unmappedTweenedKeys[i].active = animation.unmappedTweenedKeys[i].active; + this.tweenedKeys[i].object().set(animation.tweenedKeys[i].object()); + this.unmappedTweenedKeys[i].object().set(animation.unmappedTweenedKeys[i].object()); + } + } + + private void increaseTime(){ + time += speed; + if(time > animation.length){ + time = time-animation.length; + for(PlayerListener listener: listeners) + listener.animationFinished(animation); + } + if(time < 0){ + for(PlayerListener listener: listeners) + listener.animationFinished(animation); + time += animation.length; + } + } + + private void updateRoot(){ + this.root.angle = angle; + this.root.position.set(pivot); + this.root.position.rotate(angle); + this.root.position.translate(position); + dirty = false; + } + + /** + * Returns a time line bone at the given index. + * @param index the index of the bone + * @return the bone with the given index. + */ + public Bone getBone(int index){ + return this.unmappedTweenedKeys[getCurrentKey().getBoneRef(index).timeline].object(); + } + + /** + * Returns a time line object at the given index. + * @param index the index of the object + * @return the object with the given index. + */ + public Object getObject(int index){ + return (Object) this.unmappedTweenedKeys[getCurrentKey().getObjectRef(index).timeline].object(); + } + + /** + * Returns the index of a time line bone with the given name. + * @param name the name of the bone + * @return the index of the bone or -1 if no bone exists with the given name + */ + public int getBoneIndex(String name){ + for(BoneRef ref: getCurrentKey().boneRefs) + if(animation.getTimeline(ref.timeline).name.equals(name)) + return ref.id; + return -1; + } + + /** + * Returns a time line bone with the given name. + * @param name the name of the bone + * @return the bone with the given name + * @throws ArrayIndexOutOfBoundsException if no bone exists with the given name + * @throws NullPointerException if no bone exists with the given name + */ + public Bone getBone(String name){ + return this.unmappedTweenedKeys[animation.getTimeline(name).id].object(); + } + + /** + * Returns a bone reference for the given time line bone. + * @param bone the time line bone + * @return the bone reference for the given bone + * @throws NullPointerException if no reference for the given bone was found + */ + public BoneRef getBoneRef(Bone bone){ + return this.getCurrentKey().getBoneRefTimeline(this.objToTimeline.get(bone).id); + } + + /** + * Returns the index of a time line object with the given name. + * @param name the name of the object + * @return the index of the object or -1 if no object exists with the given name + */ + public int getObjectIndex(String name){ + for(ObjectRef ref: getCurrentKey().objectRefs) + if(animation.getTimeline(ref.timeline).name.equals(name)) + return ref.id; + return -1; + } + + /** + * Returns a time line object with the given name. + * @param name the name of the object + * @return the object with the given name + * @throws ArrayIndexOutOfBoundsException if no object exists with the given name + * @throws NullPointerException if no object exists with the given name + */ + public Object getObject(String name){ + return (Object)this.unmappedTweenedKeys[animation.getTimeline(name).id].object(); + } + + /** + * Returns a object reference for the given time line bone. + * @param object the time line object + * @return the object reference for the given bone + * @throws NullPointerException if no reference for the given object was found + */ + public ObjectRef getObjectRef(Object object){ + return this.getCurrentKey().getObjectRefTimeline(this.objToTimeline.get(object).id); + } + + /** + * Returns the name for the given bone or object. + * @param boneOrObject the bone or object + * @return the name of the bone or object + * @throws NullPointerException if no name for the given bone or bject was found + */ + public String getNameFor(Bone boneOrObject){ + return this.animation.getTimeline(objToTimeline.get(boneOrObject).id).name; + } + + /** + * Returns the object info for the given bone or object. + * @param boneOrObject the bone or object + * @return the object info of the bone or object + * @throws NullPointerException if no object info for the given bone or bject was found + */ + public ObjectInfo getObjectInfoFor(Bone boneOrObject){ + return this.animation.getTimeline(objToTimeline.get(boneOrObject).id).objectInfo; + } + + /** + * Returns the time line key for the given bone or object + * @param boneOrObject the bone or object + * @return the time line key of the bone or object, or null if no time line key was found + */ + public Timeline.Key getKeyFor(Bone boneOrObject){ + return objToTimeline.get(boneOrObject); + } + + /** + * Calculates and returns a {@link Box} for the given bone or object. + * @param boneOrObject the bone or object to calculate the bounding box for + * @return the box for the given bone or object + * @throws NullPointerException if no object info for the given bone or object exists + */ + public Box getBox(Bone boneOrObject){ + ObjectInfo info = getObjectInfoFor(boneOrObject); + this.prevBBox.calcFor(boneOrObject, info); + return this.prevBBox; + } + + /** + * Returns whether the given point at x,y lies inside the box of the given bone or object. + * @param boneOrObject the bone or object + * @param x the x value of the point + * @param y the y value of the point + * @return true if x,y lies inside the box of the given bone or object + * @throws NullPointerException if no object info for the given bone or object exists + */ + public boolean collidesFor(Bone boneOrObject, float x, float y){ + ObjectInfo info = getObjectInfoFor(boneOrObject); + this.prevBBox.calcFor(boneOrObject, info); + return this.prevBBox.collides(boneOrObject, info, x, y); + } + + /** + * Returns whether the given point lies inside the box of the given bone or object. + * @param boneOrObject the bone or object + * @param point the point + * @return true if the point lies inside the box of the given bone or object + * @throws NullPointerException if no object info for the given bone or object exists + */ + public boolean collidesFor(Bone boneOrObject, Point point){ + return this.collidesFor(boneOrObject, point.x, point.y); + } + + /** + * Returns whether the given area collides with the box of the given bone or object. + * @param boneOrObject the bone or object + * @param area the rectangular area + * @return true if the area collides with the bone or object + */ + public boolean collidesFor(Bone boneOrObject, Rectangle area){ + ObjectInfo info = getObjectInfoFor(boneOrObject); + this.prevBBox.calcFor(boneOrObject, info); + return this.prevBBox.isInside(area); + } + + /** + * Sets the given values of the bone with the given name. + * @param name the name of the bone + * @param x the new x value of the bone + * @param y the new y value of the bone + * @param angle the new angle of the bone + * @param scaleX the new scale in x direction of the bone + * @param scaleY the new scale in y direction of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, float x, float y, float angle, float scaleX, float scaleY){ + int index = getBoneIndex(name); + if(index == -1) throw new SpriterException("No bone found of name \""+name+"\""); + BoneRef ref = getCurrentKey().getBoneRef(index); + Bone bone = getBone(index); + bone.set(x, y, angle, scaleX, scaleY, 0f, 0f); + unmapObjects(ref); + } + + /** + * Sets the given values of the bone with the given name. + * @param name the name of the bone + * @param position the new position of the bone + * @param angle the new angle of the bone + * @param scale the new scale of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, Point position, float angle, Point scale){ + this.setBone(name, position.x, position.y, angle, scale.x, scale.y); + } + + /** + * Sets the given values of the bone with the given name. + * @param name the name of the bone + * @param x the new x value of the bone + * @param y the new y value of the bone + * @param angle the new angle of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, float x, float y, float angle){ + Bone b = getBone(name); + setBone(name, x, y, angle, b.scale.x, b.scale.y); + } + + /** + * Sets the given values of the bone with the given name. + * @param name the name of the bone + * @param position the new position of the bone + * @param angle the new angle of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, Point position, float angle){ + Bone b = getBone(name); + setBone(name, position.x, position.y, angle, b.scale.x, b.scale.y); + } + + /** + * Sets the position of the bone with the given name. + * @param name the name of the bone + * @param x the new x value of the bone + * @param y the new y value of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, float x, float y){ + Bone b = getBone(name); + setBone(name, x, y, b.angle); + } + + /** + * Sets the position of the bone with the given name. + * @param name the name of the bone + * @param position the new position of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, Point position){ + setBone(name, position.x, position.y); + } + + /** + * Sets the angle of the bone with the given name + * @param name the name of the bone + * @param angle the new angle of the bone + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, float angle){ + Bone b = getBone(name); + setBone(name, b.position.x, b.position.y, angle); + } + + /** + * Sets the values of the bone with the given name to the values of the given bone + * @param name the name of the bone + * @param bone the bone with the new values + * @throws SpriterException if no bone exists of the given name + */ + public void setBone(String name, Bone bone){ + setBone(name, bone.position, bone.angle, bone.scale); + } + + /** + * Sets the given values of the object with the given name. + * @param name the name of the object + * @param x the new position in x direction of the object + * @param y the new position in y direction of the object + * @param angle the new angle of the object + * @param scaleX the new scale in x direction of the object + * @param scaleY the new scale in y direction of the object + * @param pivotX the new pivot in x direction of the object + * @param pivotY the new pivot in y direction of the object + * @param alpha the new alpha value of the object + * @param folder the new folder index of the object + * @param file the new file index of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float x, float y, float angle, float scaleX, float scaleY, float pivotX, float pivotY, float alpha, int folder, int file){ + int index = getObjectIndex(name); + if(index == -1) throw new SpriterException("No object found for name \""+name+"\""); + ObjectRef ref = getCurrentKey().getObjectRef(index); + Object object = getObject(index); + object.set(x, y, angle, scaleX, scaleY, pivotX, pivotY, alpha, folder, file); + unmapObjects(ref); + } + + /** + * Sets the given values of the object with the given name. + * @param name the name of the object + * @param position the new position of the object + * @param angle the new angle of the object + * @param scale the new scale of the object + * @param pivot the new pivot of the object + * @param alpha the new alpha value of the object + * @param ref the new file reference of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, Point position, float angle, Point scale, Point pivot, float alpha, FileReference ref){ + this.setObject(name, position.x, position.y, angle, scale.x, scale.y, pivot.x, pivot.y, alpha, ref.folder, ref.file); + } + + /** + * Sets the given values of the object with the given name. + * @param name the name of the object + * @param x the new position in x direction of the object + * @param y the new position in y direction of the object + * @param angle the new angle of the object + * @param scaleX the new scale in x direction of the object + * @param scaleY the new scale in y direction of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float x, float y, float angle, float scaleX, float scaleY){ + Object b = getObject(name); + setObject(name, x, y, angle, scaleX, scaleY, b.pivot.x, b.pivot.y, b.alpha, b.ref.folder, b.ref.file); + } + + /** + * Sets the given values of the object with the given name. + * @param name the name of the object + * @param x the new position in x direction of the object + * @param y the new position in y direction of the object + * @param angle the new angle of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float x, float y, float angle){ + Object b = getObject(name); + setObject(name, x, y, angle, b.scale.x, b.scale.y); + } + + /** + * Sets the given values of the object with the given name. + * @param name the name of the object + * @param position the new position of the object + * @param angle the new angle of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, Point position, float angle){ + Object b = getObject(name); + setObject(name, position.x, position.y, angle, b.scale.x, b.scale.y); + } + + /** + * Sets the position of the object with the given name. + * @param name the name of the object + * @param x the new position in x direction of the object + * @param y the new position in y direction of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float x, float y){ + Object b = getObject(name); + setObject(name, x, y, b.angle); + } + + /** + * Sets the position of the object with the given name. + * @param name the name of the object + * @param position the new position of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, Point position){ + setObject(name, position.x, position.y); + } + + /** + * Sets the position of the object with the given name. + * @param name the name of the object + * @param angle the new angle of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float angle){ + Object b = getObject(name); + setObject(name, b.position.x, b.position.y, angle); + } + + /** + * Sets the position of the object with the given name. + * @param name the name of the object + * @param alpha the new alpha value of the object + * @param folder the new folder index of the object + * @param file the new file index of the object + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, float alpha, int folder, int file){ + Object b = getObject(name); + setObject(name, b.position.x, b.position.y, b.angle, b.scale.x, b.scale.y, b.pivot.x, b.pivot.y, alpha, folder, file); + } + + /** + * Sets the values of the object with the given name to the values of the given object. + * @param name the name of the object + * @param object the object with the new values + * @throws SpriterException if no object exists of the given name + */ + public void setObject(String name, Object object){ + setObject(name, object.position, object.angle, object.scale, object.pivot, object.alpha, object.ref); + } + + /** + * Maps all object from the parent's coordinate system to the global coordinate system. + * @param base the root bone to start at. Set it to null to traverse the whole bone hierarchy. + */ + public void unmapObjects(BoneRef base){ + int start = base == null ? -1 : base.id-1; + for(int i = start+1; i < getCurrentKey().boneRefs.length; i++){ + BoneRef ref = getCurrentKey().getBoneRef(i); + if(ref.parent != base && base != null) continue; + Bone parent = ref.parent == null ? this.root : this.unmappedTweenedKeys[ref.parent.timeline].object(); + unmappedTweenedKeys[ref.timeline].object().set(tweenedKeys[ref.timeline].object()); + unmappedTweenedKeys[ref.timeline].object().unmap(parent); + unmapObjects(ref); + } + for(ObjectRef ref: getCurrentKey().objectRefs){ + if(ref.parent != base && base != null) continue; + Bone parent = ref.parent == null ? this.root : this.unmappedTweenedKeys[ref.parent.timeline].object(); + unmappedTweenedKeys[ref.timeline].object().set(tweenedKeys[ref.timeline].object()); + unmappedTweenedKeys[ref.timeline].object().unmap(parent); + } + } + + /** + * Sets the entity for this player instance. + * The animation will be switched to the first one of the new entity. + * @param entity the new entity + * @throws SpriterException if the entity is null + */ + public void setEntity(Entity entity){ + if(entity == null) throw new SpriterException("entity can not be null!"); + this.entity = entity; + int maxAnims = entity.getAnimationWithMostTimelines().timelines(); + tweenedKeys = new Timeline.Key[maxAnims]; + unmappedTweenedKeys = new Timeline.Key[maxAnims]; + for(int i = 0; i < maxAnims; i++){ + Timeline.Key key = new Timeline.Key(i); + Timeline.Key keyU = new Timeline.Key(i); + key.setObject(new Timeline.Key.Object(new Point(0,0))); + keyU.setObject(new Timeline.Key.Object(new Point(0,0))); + tweenedKeys[i] = key; + unmappedTweenedKeys[i] = keyU; + this.objToTimeline.put(keyU.object(), keyU); + } + this.tempTweenedKeys = tweenedKeys; + this.tempUnmappedTweenedKeys = unmappedTweenedKeys; + this.setAnimation(entity.getAnimation(0)); + } + + /** + * Returns the current set entity. + * @return the current entity + */ + public Entity getEntity(){ + return this.entity; + } + + /** + * Sets the animation of this player. + * @param animation the new animation + * @throws SpriterException if the animation is null or the current animation is not a member of the current set entity + */ + public void setAnimation(Animation animation){ + Animation prevAnim = this.animation; + if(animation == this.animation) return; + if(animation == null) throw new SpriterException("animation can not be null!"); + if(!this.entity.containsAnimation(animation) && animation.id != -1) throw new SpriterException("animation has to be in the same entity as the current set one!"); + if(animation != this.animation) time = 0; + this.animation = animation; + int tempTime = this.time; + this.time = 0; + this.update(); + this.time = tempTime; + for(PlayerListener listener: listeners) + listener.animationChanged(prevAnim, animation); + } + + /** + * Sets the animation of this player to the one with the given name. + * @param name the name of the animation + * @throws SpriterException if no animation exists with the given name + */ + public void setAnimation(String name){ + this.setAnimation(entity.getAnimation(name)); + } + + /** + * Sets the animation of this player to the one with the given index. + * @param index the index of the animation + * @throws IndexOutOfBoundsException if the index is out of range + */ + public void setAnimation(int index){ + this.setAnimation(entity.getAnimation(index)); + } + + /** + * Returns the current set animation. + * @return the current animation + */ + public Animation getAnimation(){ + return this.animation; + } + + /** + * Returns a bounding box for this player. + * The bounding box is calculated for all bones and object starting from the given root. + * @param root the starting root. Set it to null to calculate the bounding box for the whole player + * @return the bounding box + */ + public Rectangle getBoundingRectangle(BoneRef root){ + Bone boneRoot = root == null ? this.root : this.unmappedTweenedKeys[root.timeline].object(); + this.rect.set(boneRoot.position.x, boneRoot.position.y, boneRoot.position.x, boneRoot.position.y); + this.calcBoundingRectangle(root); + this.rect.calculateSize(); + return this.rect; + } + + /** + * Returns a bounding box for this player. + * The bounding box is calculated for all bones and object starting from the given root. + * @param root the starting root. Set it to null to calculate the bounding box for the whole player + * @return the bounding box + */ + public Rectangle getBoudingRectangle(Bone root){ + return this.getBoundingRectangle(root == null ? null: getBoneRef(root)); + } + + private void calcBoundingRectangle(BoneRef root){ + for(BoneRef ref: getCurrentKey().boneRefs){ + if(ref.parent != root && root != null) continue; + Bone bone = this.unmappedTweenedKeys[ref.timeline].object(); + this.prevBBox.calcFor(bone, animation.getTimeline(ref.timeline).objectInfo); + Rectangle.setBiggerRectangle(rect, this.prevBBox.getBoundingRect(), rect); + this.calcBoundingRectangle(ref); + } + for(ObjectRef ref: getCurrentKey().objectRefs){ + if(ref.parent != root) continue; + Bone bone = this.unmappedTweenedKeys[ref.timeline].object(); + this.prevBBox.calcFor(bone, animation.getTimeline(ref.timeline).objectInfo); + Rectangle.setBiggerRectangle(rect, this.prevBBox.getBoundingRect(), rect); + } + } + + /** + * Returns the current main line key based on the current {@link #time}. + * @return the current main line key + */ + public Mainline.Key getCurrentKey(){ + return this.currentKey; + } + + /** + * Returns the current time. + * The player will make sure that the current time is always between 0 and {@link Animation#length}. + * @return the current time + */ + public int getTime() { + return time; + } + + /** + * Sets the time for the current time. + * The player will make sure that the new time will not exceed the time bounds of the current animation. + * @param time the new time + * @return this player to enable chained operations + */ + public Player setTime(int time){ + this.time = time; + int prevSpeed = this.speed; + this.speed = 0; + this.increaseTime(); + this.speed = prevSpeed; + return this; + } + + /** + * Sets the scale of this player to the given one. + * Only uniform scaling is supported. + * @param scale the new scale. 1f means 100% scale. + * @return this player to enable chained operations + */ + public Player setScale(float scale){ + this.root.scale.set(scale*flippedX(), scale*flippedY()); + return this; + } + + /** + * Scales this player based on the current set scale. + * @param scale the scaling factor. 1f means no scale. + * @return this player to enable chained operations + */ + public Player scale(float scale){ + this.root.scale.scale(scale, scale); + return this; + } + + /** + * Returns the current scale. + * @return the current scale + */ + public float getScale(){ + return root.scale.x; + } + + /** + * Flips this player around the x and y axis. + * @param x whether to flip the player around the x axis + * @param y whether to flip the player around the y axis + * @return this player to enable chained operations + */ + public Player flip(boolean x, boolean y){ + if(x) this.flipX(); + if(y) this.flipY(); + return this; + } + + /** + * Flips the player around the x axis. + * @return this player to enable chained operations + */ + public Player flipX(){ + this.root.scale.x *= -1; + return this; + } + + /** + * Flips the player around the y axis. + * @return this player to enable chained operations + */ + public Player flipY(){ + this.root.scale.y *= -1; + return this; + } + + /** + * Returns whether this player is flipped around the x axis. + * @return 1 if this player is not flipped, -1 if it is flipped + */ + public int flippedX(){ + return (int) Math.signum(root.scale.x); + } + + /** + * Returns whether this player is flipped around the y axis. + * @return 1 if this player is not flipped, -1 if it is flipped + */ + public int flippedY(){ + return (int) Math.signum(root.scale.y); + } + + /** + * Sets the position of this player to the given coordinates. + * @param x the new position in x direction + * @param y the new position in y direction + * @return this player to enable chained operations + */ + public Player setPosition(float x, float y){ + this.dirty = true; + this.position.set(x,y); + return this; + } + + /** + * Sets the position of the player to the given one. + * @param position the new position + * @return this player to enable chained operations + */ + public Player setPosition(Point position){ + return this.setPosition(position.x, position.y); + } + + /** + * Adds the given coordinates to the current position of this player. + * @param x the amount in x direction + * @param y the amount in y direction + * @return this player to enable chained operations + */ + public Player translatePosition(float x, float y){ + return this.setPosition(position.x+x, position.y+y); + } + + /** + * Adds the given amount to the current position of this player. + * @param amount the amount to add + * @return this player to enable chained operations + */ + public Player translate(Point amount){ + return this.translatePosition(amount.x, amount.y); + } + + /** + * Returns the current position in x direction. + * @return the current position in x direction + */ + public float getX(){ + return position.x; + } + + /** + * Returns the current position in y direction. + * @return the current position in y direction + */ + public float getY(){ + return position.y; + } + + /** + * Sets the angle of this player to the given angle. + * @param angle the angle in degrees + * @return this player to enable chained operations + */ + public Player setAngle(float angle){ + this.dirty = true; + this.angle = angle; + return this; + } + + /** + * Rotates this player by the given angle. + * @param angle the angle in degrees + * @return this player to enable chained operations + */ + public Player rotate(float angle){ + return this.setAngle(angle+this.angle); + } + + /** + * Returns the current set angle. + * @return the current angle + */ + public float getAngle(){ + return this.angle; + } + + /** + * Sets the pivot, i.e. origin, of this player. + * A pivot at (0,0) means that the origin of the played animation will have the same one as in Spriter. + * @param x the new pivot in x direction + * @param y the new pivot in y direction + * @return this player to enable chained operations + */ + public Player setPivot(float x, float y){ + this.dirty = true; + this.pivot.set(x, y); + return this; + } + + /** + * Sets the pivot, i.e. origin, of this player. + * A pivot at (0,0) means that the origin of the played animation will have the same one as in Spriter. + * @param pivot the new pivot + * @return this player to enable chained operations + */ + public Player setPivot(Point pivot){ + return this.setPivot(pivot.x, pivot.y); + } + + /** + * Translates the current set pivot position by the given amount. + * @param x the amount in x direction + * @param y the amount in y direction + * @return this player to enable chained operations + */ + public Player translatePivot(float x, float y){ + return this.setPivot(pivot.x+x, pivot.y+y); + } + + /** + * Adds the given amount to the current set pivot position. + * @param amount the amount to add + * @return this player to enable chained operations + */ + public Player translatePivot(Point amount){ + return this.translatePivot(amount.x, amount.y); + } + + /** + * Returns the current set pivot in x direction. + * @return the pivot in x direction + */ + public float getPivotX(){ + return pivot.x; + } + + /** + * Returns the current set pivot in y direction. + * @return the pivot in y direction + */ + public float getPivotY(){ + return pivot.y; + } + + /** + * Appends a listener to the listeners list of this player. + * @param listener the listener to add + */ + public void addListener(PlayerListener listener){ + this.listeners.add(listener); + } + + /** + * Removes a listener from the listeners list of this player. + * @param listener the listener to remove + */ + public void removeListener(PlayerListener listener){ + this.listeners.remove(listener); + } + + /** + * Returns an iterator to iterate over all time line bones in the current animation. + * @return the bone iterator + */ + public Iterator boneIterator(){ + return this.boneIterator(this.getCurrentKey().boneRefs[0]); + } + + /** + * Returns an iterator to iterate over all time line bones in the current animation starting at a given root. + * @param start the bone reference to start at + * @return the bone iterator + */ + public Iterator boneIterator(BoneRef start){ + this.boneIterator.index = start.id; + return this.boneIterator; + } + + /** + * Returns an iterator to iterate over all time line objects in the current animation. + * @return the object iterator + */ + public Iterator objectIterator(){ + return this.objectIterator(this.getCurrentKey().objectRefs[0]); + } + + /** + * Returns an iterator to iterate over all time line objects in the current animation starting at a given root. + * @param start the object reference to start at + * @return the object iterator + */ + public Iterator objectIterator(ObjectRef start){ + this.objectIterator.index = start.id; + return this.objectIterator; + } + + /** + * An iterator to iterate over all time line objects in the current animation. + * @author Trixt0r + * + */ + class ObjectIterator implements Iterator{ + int index = 0; + @Override + public boolean hasNext() { + return index < getCurrentKey().objectRefs.length; + } + + @Override + public Object next() { + return unmappedTweenedKeys[getCurrentKey().objectRefs[index++].timeline].object(); + } + + @Override + public void remove() { + throw new SpriterException("remove() is not supported by this iterator!"); + } + + } + + /** + * An iterator to iterate over all time line bones in the current animation. + * @author Trixt0r + * + */ + class BoneIterator implements Iterator{ + int index = 0; + @Override + public boolean hasNext() { + return index < getCurrentKey().boneRefs.length; + } + + @Override + public Bone next() { + return unmappedTweenedKeys[getCurrentKey().boneRefs[index++].timeline].object(); + } + + @Override + public void remove() { + throw new SpriterException("remove() is not supported by this iterator!"); + } + } + + /** + * A listener to listen for specific events which can occur during the runtime of a {@link Player} instance. + * @author Trixt0r + * + */ + public static interface PlayerListener{ + + /** + * Gets called if the current animation has reached it's end or it's beginning (depends on the current set {@link Player#speed}). + * @param animation the animation which finished. + */ + public void animationFinished(Animation animation); + + /** + * Gets called if the animation of the player gets changed. + * If {@link Player#setAnimation(Animation)} gets called and the new animation is the same as the previous one, this method will not be called. + * @param oldAnim the old animation + * @param newAnim the new animation + */ + public void animationChanged(Animation oldAnim, Animation newAnim); + + /** + * Gets called before a player updates the current animation. + * @param player the player which is calling this method. + */ + public void preProcess(Player player); + + /** + * Gets called after a player updated the current animation. + * @param player the player which is calling this method. + */ + public void postProcess(Player player); + + /** + * Gets called if the mainline key gets changed. + * If {@link Player#speed} is big enough it can happen that mainline keys between the previous and the new mainline key will be ignored. + * @param prevKey the previous mainline key + * @param newKey the new mainline key + */ + public void mainlineKeyChanged(Mainline.Key prevKey, Mainline.Key newKey); + } + + /** + * An attachment is an abstract object which can be attached to a {@link Player} object. + * An attachment extends a {@link Bone} which means that {@link Bone#position}, {@link Bone#scale} and {@link Bone#angle} can be set to change the relative position to its {@link Attachment#parent} + * The {@link Player} object will make sure that the attachment will be transformed relative to its {@link Attachment#parent}. + * @author Trixt0r + * + */ + public static abstract class Attachment extends Timeline.Key.Bone{ + + private Bone parent; + private final Point positionTemp, scaleTemp; + private float angleTemp; + + /** + * Creates a new attachment + * @param parent the parent of this attachment + */ + public Attachment(Bone parent){ + this.positionTemp = new Point(); + this.scaleTemp = new Point(); + this.setParent(parent); + } + + /** + * Sets the parent of this attachment. + * @param parent the parent + * @throws SpriterException if parent is null + */ + public void setParent(Bone parent){ + if(parent == null) throw new SpriterException("The parent cannot be null!"); + this.parent = parent; + } + + /** + * Returns the current set parent. + * @return the parent + */ + public Bone getParent(){ + return this.parent; + } + + final void update(){ + //Save relative positions + this.positionTemp.set(super.position); + this.scaleTemp.set(super.scale); + this.angleTemp = super.angle; + + super.unmap(parent); + this.setPosition(super.position.x, super.position.y); + this.setScale(super.scale.x, super.scale.y); + this.setAngle(super.angle); + + //Load realtive positions + super.position.set(this.positionTemp); + super.scale.set(this.scaleTemp); + super.angle = this.angleTemp; + } + /** + * Sets the position to the given coordinates. + * @param x the x coordinate + * @param y the y coordinate + */ + protected abstract void setPosition(float x, float y); + /** + * Sets the scale to the given scale. + * @param xscale the scale in x direction + * @param yscale the scale in y direction + */ + protected abstract void setScale(float xscale, float yscale); + /** + * Sets the angle to the given one. + * @param angle the angle in degrees + */ + protected abstract void setAngle(float angle); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/PlayerTweener.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/PlayerTweener.java new file mode 100644 index 00000000..8e76840f --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/PlayerTweener.java @@ -0,0 +1,162 @@ +package com.brashmonkey.spriter; + +/** + * A player tweener is responsible for tweening to {@link Player} instances. + * Such a + * @author Trixt0r + * + */ +public class PlayerTweener extends Player{ + + private TweenedAnimation anim; + private Player player1, player2; + /** + * Indicates whether to update the {@link Player} instances this instance is holding. + * If this variable is set to false, you will have to call {@link Player#update()} on your own. + */ + public boolean updatePlayers = true; + + /** + * The name of root bone to start the tweening at. + * Set it to null to tween the whole hierarchy. + */ + public String baseBoneName = null; + + /** + * Creates a player tweener which will tween the given two players. + * @param player1 the first player + * @param player2 the second player + */ + public PlayerTweener(Player player1, Player player2){ + super(player1.getEntity()); + this.setPlayers(player1, player2); + } + + /** + * Creates a player tweener based on the entity. + * The players to tween will be created by this instance. + * @param entity the entity the players will animate + */ + public PlayerTweener(Entity entity){ + this(new Player(entity), new Player(entity)); + } + + /** + * Tweens the current set players. + * This method will update the set players if {@link #updatePlayers} is true. + * @throws SpriterException if no bone with {@link #baseBoneName} exists + */ + @Override + public void update(){ + if(updatePlayers){ + player1.update(); + player2.update(); + } + anim.setAnimations(player1.animation, player2.animation); + super.update(); + if(baseBoneName != null){ + int index = anim.onFirstMainLine()? player1.getBoneIndex(baseBoneName) : player2.getBoneIndex(baseBoneName); + if(index == -1) throw new SpriterException("A bone with name \""+baseBoneName+"\" does no exist!"); + anim.base = anim.getCurrentKey().getBoneRef(index); + super.update(); + } + } + + /** + * Sets the players for this tweener. + * Both players have to hold the same {@link Entity} + * @param player1 the first player + * @param player2 the second player + */ + public void setPlayers(Player player1, Player player2){ + if(player1.entity != player2.entity) + throw new SpriterException("player1 and player2 have to hold the same entity!"); + this.player1 = player1; + this.player2 = player2; + if(player1.entity == entity) return; + this.anim = new TweenedAnimation(player1.getEntity()); + anim.setAnimations(player1.animation, player2.animation); + super.setEntity(player1.getEntity()); + super.setAnimation(anim); + } + + /** + * Returns the first set player. + * @return the first player + */ + public Player getFirstPlayer(){ + return this.player1; + } + + /** + * Returns the second set player. + * @return the second player + */ + public Player getSecondPlayer(){ + return this.player2; + } + + /** + * Sets the interpolation weight of this tweener. + * @param weight the interpolation weight between 0.0f and 1.0f + */ + public void setWeight(float weight){ + this.anim.weight = weight; + } + + /** + * Returns the interpolation weight. + * @return the interpolation weight between 0.0f and 1.0f + */ + public float getWeight(){ + return this.anim.weight; + } + + + /** + * Sets the base animation of this tweener. + * Has only an effect if {@link #baseBoneName} is not null. + * @param anim the base animation + */ + public void setBaseAnimation(Animation anim){ + this.anim.baseAnimation = anim; + } + + /** + * Sets the base animation of this tweener by the given animation index. + * Has only an effect if {@link #baseBoneName} is not null. + * @param index the index of the base animation + */ + public void setBaseAnimation(int index){ + this.setBaseAnimation(entity.getAnimation(index)); + } + + /** + * Sets the base animation of this tweener by the given name. + * Has only an effect if {@link #baseBoneName} is not null. + * @param name the name of the base animation + */ + public void setBaseAnimation(String name){ + this.setBaseAnimation(entity.getAnimation(name)); + } + + /** + * Returns the base animation if this tweener. + * @return the base animation + */ + public Animation getBaseAnimation(){ + return this.anim.baseAnimation; + } + + /** + * Not supported by this class. + */ + @Override + public void setAnimation(Animation anim){} + + /** + * Not supported by this class. + */ + @Override + public void setEntity(Entity entity){} +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Point.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Point.java new file mode 100644 index 00000000..b8616c7d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Point.java @@ -0,0 +1,135 @@ +package com.brashmonkey.spriter; + +/** + * A utility class to keep the code short. + * A point is essentially that what you would expect if you think about a point in a 2D space. + * It holds an x and y value. You can {@link #translate(Point)}, {@link #scale(Point)}, {@link #rotate(float)} and {@link #set(Point)} a point. + * @author Trixt0r + * + */ +public class Point { + + /** + * The x coordinates of this point. + */ + public float x; + /** + * The y coordinates of this point. + */ + public float y; + + /** + * Creates a point at (0,0). + */ + public Point(){ + this(0,0); + } + + /** + * Creates a point at the position of the given point. + * @param point the point to set this point at + */ + public Point(Point point){ + this(point.x, point.y); + } + + /** + * Creates a point at (x, y). + * @param x the x coordinate + * @param y the y coordinate + */ + public Point(float x, float y){ + this.set(x, y); + } + + /** + * Sets this point to the given coordinates. + * @param x the x coordinate + * @param y the y coordinate + * @return this point for chained operations + */ + public Point set(float x, float y){ + this.x = x; + this.y = y; + return this; + } + + /** + * Adds the given amount to this point. + * @param x the amount in x direction to add + * @param y the amount in y direction to add + * @return this point for chained operations + */ + public Point translate(float x, float y){ + return this.set(this.x+x, this.y+y); + } + + /** + * Scales this point by the given amount. + * @param x the scale amount in x direction + * @param y the scale amount in y direction + * @return this point for chained operations + */ + public Point scale(float x, float y){ + return this.set(this.x*x, this.y*y); + } + + /** + * Sets this point to the given point. + * @param point the new coordinates + * @return this point for chained operations + */ + public Point set(Point point){ + return this.set(point.x, point.y); + } + + /** + * Adds the given amount to this point. + * @param amount the amount to add + * @return this point for chained operations + */ + public Point translate(Point amount){ + return this.translate(amount.x, amount.y); + } + + /** + * Scales this point by the given amount. + * @param amount the amount to scale + * @return this point for chained operations + */ + public Point scale(Point amount){ + return this.scale(amount.x, amount.y); + } + + /** + * Rotates this point around (0,0) by the given amount of degrees. + * @param degrees the angle to rotate this point + * @return this point for chained operations + */ + public Point rotate(float degrees){ + if(x != 0 || y != 0){ + float cos = Calculator.cosDeg(degrees); + float sin = Calculator.sinDeg(degrees); + + float xx = x*cos-y*sin; + float yy = x*sin+y*cos; + + this.x = xx; + this.y = yy; + } + return this; + } + + /** + * Returns a copy of this point with the current set values. + * @return a copy of this point + */ + public Point copy(){ + return new Point(x,y); + } + + public String toString(){ + return "["+x+","+y+"]"; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Rectangle.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Rectangle.java new file mode 100644 index 00000000..42c1387d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Rectangle.java @@ -0,0 +1,118 @@ +package com.brashmonkey.spriter; + +/** + * Represents a 2D rectangle with left, top, right and bottom bounds. + * A rectangle is responsible for calculating its own size and checking if a point is inside it or if it is intersecting with another rectangle. + * @author Trixt0r + * + */ +public class Rectangle { + + /** + * Belongs to the bounds of this rectangle. + */ + public float left, top, right, bottom; + /** + * The size of this rectangle. + */ + public final Dimension size; + + /** + * Creates a rectangle with the given bounds. + * @param left left bounding + * @param top top bounding + * @param right right bounding + * @param bottom bottom bounding + */ + public Rectangle(float left, float top, float right, float bottom){ + this.set(left, top, right, bottom); + this.size = new Dimension(0, 0); + this.calculateSize(); + } + + /** + * Creates a rectangle with the bounds of the given rectangle. + * @param rect rectangle containing the bounds. + */ + public Rectangle(Rectangle rect){ + this(rect.left, rect.top, rect.right, rect.bottom); + } + + /** + * Returns whether the given point (x,y) is inside this rectangle. + * @param x the x coordinate + * @param y the y coordinate + * @return true if (x,y) is inside + */ + public boolean isInside(float x, float y){ + return x >= this.left && x <= this.right && y <= this.top && y >= this.bottom; + } + + /** + * Returns whether the given point is inside this rectangle. + * @param point the point + * @return true if the point is inside + */ + public boolean isInside(Point point){ + return isInside(point.x, point.y); + } + + /** + * Calculates the size of this rectangle. + */ + public void calculateSize(){ + this.size.set(right-left, top-bottom); + } + + /** + * Sets the bounds of this rectangle to the bounds of the given rectangle. + * @param rect rectangle containing the bounds. + */ + public void set(Rectangle rect){ + if(rect == null) return; + this.bottom = rect.bottom; + this.left = rect.left; + this.right = rect.right; + this.top = rect.top; + this.calculateSize(); + } + + /** + * Sets the bounds of this rectangle to the given bounds. + * @param left left bounding + * @param top top bounding + * @param right right bounding + * @param bottom bottom bounding + */ + public void set(float left, float top, float right, float bottom){ + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + /** + * Returns whether the given two rectangles are intersecting. + * @param rect1 the first rectangle + * @param rect2 the second rectangle + * @return true if the rectangles are intersecting + */ + public static boolean areIntersecting(Rectangle rect1, Rectangle rect2){ + return rect1.isInside(rect2.left, rect2.top) || rect1.isInside(rect2.right, rect2.top) + || rect1.isInside(rect2.left, rect2.bottom) || rect1.isInside(rect2.right, rect2.bottom); + } + + /** + * Creates a bigger rectangle of the given two and saves it in the target. + * @param rect1 the first rectangle + * @param rect2 the second rectangle + * @param target the target to save the new bounds. + */ + public static void setBiggerRectangle(Rectangle rect1, Rectangle rect2, Rectangle target){ + target.left = Math.min(rect1.left, rect2.left); + target.bottom = Math.min(rect1.bottom, rect2.bottom); + target.right = Math.max(rect1.right, rect2.right); + target.top = Math.max(rect1.top, rect2.top); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SCMLReader.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SCMLReader.java new file mode 100644 index 00000000..61b1b14e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SCMLReader.java @@ -0,0 +1,298 @@ +package com.brashmonkey.spriter; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; + +import com.brashmonkey.spriter.Entity.*; +import com.brashmonkey.spriter.Mainline.Key.*; +import com.brashmonkey.spriter.XmlReader.*; + +/** + * This class parses a SCML file and creates a {@link Data} instance. + * If you want to keep track of what is going on during the build process of the objects parsed from the SCML file, + * you could extend this class and override the load*() methods for pre or post processing. + * This could be e.g. useful for a loading screen which responds to the current building or parsing state. + * @author Trixt0r + */ +public class SCMLReader { + + protected Data data; + + /** + * Creates a new SCML reader and will parse all objects in the given stream. + * @param stream the stream + */ + public SCMLReader(InputStream stream){ + this.data = this.load(stream); + } + + /** + * Creates a new SCML reader and will parse the given xml string. + * @param xml the xml string + */ + public SCMLReader(String xml){ + this.data = this.load(xml); + } + + /** + * Parses the SCML object save in the given xml string and returns the build data object. + * @param xml the xml string + * @return the built data + */ + protected Data load(String xml){ + XmlReader reader = new XmlReader(); + Element root = reader.parse(xml); + ArrayList folders = root.getChildrenByName("folder"); + ArrayList entities = root.getChildrenByName("entity"); + data = new Data(root.get("scml_version"), root.get("generator"),root.get("generator_version"), + folders.size(), entities.size()); + loadFolders(folders); + loadEntities(entities); + return data; + } + + /** + * Parses the SCML objects saved in the given stream and returns the built data object. + * @param stream the stream from the SCML file + * @return the built data + */ + protected Data load(InputStream stream){ + XmlReader reader = new XmlReader(); + try { + Element root = reader.parse(stream); + ArrayList folders = root.getChildrenByName("folder"); + ArrayList entities = root.getChildrenByName("entity"); + data = new Data(root.get("scml_version"), root.get("generator"),root.get("generator_version"), + folders.size(), entities.size()); + loadFolders(folders); + loadEntities(entities); + } catch (IOException e) { + e.printStackTrace(); + } + return data; + } + + /** + * Iterates through the given folders and adds them to the current {@link Data} object. + * @param folders a list of folders to load + */ + protected void loadFolders(ArrayList folders){ + for(int i = 0; i < folders.size(); i++){ + Element repo = folders.get(i); + ArrayList files = repo.getChildrenByName("file"); + Folder folder = new Folder(repo.getInt("id"), repo.get("name", "no_name_"+i), files.size()); + loadFiles(files, folder); + data.addFolder(folder); + } + } + + /** + * Iterates through the given files and adds them to the given {@link Folder} object. + * @param files a list of files to load + * @param folder the folder containing the files + */ + protected void loadFiles(ArrayList files, Folder folder){ + for(int j = 0; j < files.size(); j++){ + Element f = files.get(j); + File file = new File(f.getInt("id"), f.get("name"), + new Dimension(f.getInt("width", 0), f.getInt("height", 0)), + new Point(f.getFloat("pivot_x", 0f), f.getFloat("pivot_y", 1f))); + + folder.addFile(file); + } + } + + /** + * Iterates through the given entities and adds them to the current {@link Data} object. + * @param entities a list of entities to load + */ + protected void loadEntities(ArrayList entities){ + for(int i = 0; i < entities.size(); i++){ + Element e = entities.get(i); + ArrayList infos = e.getChildrenByName("obj_info"); + ArrayList charMaps = e.getChildrenByName("character_map"); + ArrayList animations = e.getChildrenByName("animation"); + Entity entity = new Entity(e.getInt("id"), e.get("name"), + animations.size(), charMaps.size(), infos.size()); + data.addEntity(entity); + loadObjectInfos(infos, entity); + loadCharacterMaps(charMaps, entity); + loadAnimations(animations, entity); + } + } + + /** + * Iterates through the given object infos and adds them to the given {@link Entity} object. + * @param infos a list of infos to load + * @param entity the entity containing the infos + */ + protected void loadObjectInfos(ArrayList infos, Entity entity){ + for(int i = 0; i< infos.size(); i++){ + Element info = infos.get(i); + Entity.ObjectInfo objInfo = new Entity.ObjectInfo(info.get("name","info"+i), + Entity.ObjectType.getObjectInfoFor(info.get("type","")), + new Dimension(info.getFloat("w", 0), info.getFloat("h", 0))); + entity.addInfo(objInfo); + Element frames = info.getChildByName("frames"); + if(frames == null) continue; + ArrayList frameIndices = frames.getChildrenByName("i"); + for(Element index: frameIndices){ + int folder = index.getInt("folder", 0); + int file = index.getInt("file", 0); + objInfo.frames.add(new FileReference(folder, file)); + } + } + } + + /** + * Iterates through the given character maps and adds them to the given {@link Entity} object. + * @param maps a list of character maps to load + * @param entity the entity containing the character maps + */ + protected void loadCharacterMaps(ArrayList maps, Entity entity){ + for(int i = 0; i< maps.size(); i++){ + Element map = maps.get(i); + Entity.CharacterMap charMap = new Entity.CharacterMap(map.getInt("id"), map.getAttribute("name", "charMap"+i)); + entity.addCharacterMap(charMap); + ArrayList mappings = map.getChildrenByName("map"); + for(Element mapping: mappings){ + int folder = mapping.getInt("folder"); + int file = mapping.getInt("file"); + charMap.put(new FileReference(folder, file), + new FileReference(mapping.getInt("target_folder", folder), mapping.getInt("target_file", file))); + } + } + } + + /** + * Iterates through the given animations and adds them to the given {@link Entity} object. + * @param animations a list of animations to load + * @param entity the entity containing the animations maps + */ + protected void loadAnimations(ArrayList animations, Entity entity){ + for(int i = 0; i < animations.size(); i++){ + Element a = animations.get(i); + ArrayList timelines = a.getChildrenByName("timeline"); + Element mainline = a.getChildByName("mainline"); + ArrayList mainlineKeys = mainline.getChildrenByName("key"); + Animation animation = new Animation(new Mainline(mainlineKeys.size()), + a.getInt("id"), a.get("name"), a.getInt("length"), + a.getBoolean("looping", true),timelines.size()); + entity.addAnimation(animation); + loadMainlineKeys(mainlineKeys, animation.mainline); + loadTimelines(timelines, animation, entity); + animation.prepare(); + } + } + + /** + * Iterates through the given mainline keys and adds them to the given {@link Mainline} object. + * @param keys a list of mainline keys + * @param main the mainline + */ + protected void loadMainlineKeys(ArrayList keys, Mainline main){ + for(int i = 0; i < main.keys.length; i++){ + Element k = keys.get(i); + ArrayList objectRefs = k.getChildrenByName("object_ref"); + ArrayList boneRefs = k.getChildrenByName("bone_ref"); + Curve curve = new Curve(); + curve.setType(Curve.getType(k.get("curve_type","linear"))); + curve.constraints.set(k.getFloat("c1", 0f),k.getFloat("c2", 0f),k.getFloat("c3", 0f),k.getFloat("c4", 0f)); + Mainline.Key key = new Mainline.Key(k.getInt("id"), k.getInt("time", 0), curve, + boneRefs.size(), objectRefs.size()); + main.addKey(key); + loadRefs(objectRefs, boneRefs, key); + } + } + + /** + * Iterates through the given bone and object references and adds them to the given {@link Mainline.Key} object. + * @param objectRefs a list of object references + * @param boneRefs a list if bone references + * @param key the mainline key + */ + protected void loadRefs(ArrayList objectRefs, ArrayList boneRefs, Mainline.Key key){ + for(Element e: boneRefs){ + BoneRef boneRef = new BoneRef(e.getInt("id"),e.getInt("timeline"), + e.getInt("key"), key.getBoneRef(e.getInt("parent", -1))); + key.addBoneRef(boneRef); + } + + for(Element o: objectRefs){ + ObjectRef objectRef = new ObjectRef(o.getInt("id"),o.getInt("timeline"), + o.getInt("key"), key.getBoneRef(o.getInt("parent", -1)), o.getInt("z_index",0)); + key.addObjectRef(objectRef); + } + Arrays.sort(key.objectRefs); + } + + /** + * Iterates through the given timelines and adds them to the given {@link Animation} object. + * @param timelines a list of timelines + * @param animation the animation containing the timelines + * @param entity entity for assigning the timeline an object info + */ + protected void loadTimelines(ArrayList timelines, Animation animation, Entity entity){ + for(int i = 0; i< timelines.size(); i++){ + Element t = timelines.get(i); + ArrayList keys = timelines.get(i).getChildrenByName("key"); + String name = t.get("name"); + ObjectType type = ObjectType.getObjectInfoFor(t.get("object_type", "sprite")); + ObjectInfo info = entity.getInfo(name); + if(info == null) info = new ObjectInfo(name, type, new Dimension(0,0)); + Timeline timeline = new Timeline(t.getInt("id"), name, info, keys.size()); + animation.addTimeline(timeline); + loadTimelineKeys(keys, timeline); + } + } + + /** + * Iterates through the given timeline keys and adds them to the given {@link Timeline} object. + * @param keys a list if timeline keys + * @param timeline the timeline containing the keys + */ + protected void loadTimelineKeys(ArrayList keys, Timeline timeline){ + for(int i = 0; i< keys.size(); i++){ + Element k = keys.get(i); + Curve curve = new Curve(); + curve.setType(Curve.getType(k.get("curve_type", "linear"))); + curve.constraints.set(k.getFloat("c1", 0f),k.getFloat("c2", 0f),k.getFloat("c3", 0f),k.getFloat("c4", 0f)); + Timeline.Key key = new Timeline.Key(k.getInt("id"), k.getInt("time", 0), k.getInt("spin", 1), curve); + Element obj = k.getChildByName("bone"); + if(obj == null) obj = k.getChildByName("object"); + + Point position = new Point(obj.getFloat("x", 0f), obj.getFloat("y", 0f)); + Point scale = new Point(obj.getFloat("scale_x", 1f), obj.getFloat("scale_y", 1f)); + Point pivot = new Point(obj.getFloat("pivot_x", 0f), obj.getFloat("pivot_y", (timeline.objectInfo.type == ObjectType.Bone)? .5f:1f)); + float angle = obj.getFloat("angle", 0f), alpha = 1f; + int folder = -1, file = -1; + if(obj.getName().equals("object")){ + if(timeline.objectInfo.type == ObjectType.Sprite){ + alpha = obj.getFloat("a", 1f); + folder = obj.getInt("folder", -1); + file = obj.getInt("file", -1); + File f = data.getFolder(folder).getFile(file); + pivot = new Point(obj.getFloat("pivot_x", f.pivot.x), obj.getFloat("pivot_y", f.pivot.y)); + timeline.objectInfo.size.set(f.size); + } + } + Timeline.Key.Object object; + if(obj.getName().equals("bone")) object = new Timeline.Key.Object(position, scale, pivot, angle, alpha, new FileReference(folder, file)); + else object = new Timeline.Key.Object(position, scale, pivot, angle, alpha, new FileReference(folder, file)); + key.setObject(object); + timeline.addKey(key); + } + } + + /** + * Returns the loaded SCML data. + * @return the SCML data. + */ + public Data getData(){ + return data; + } + +} + diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Spriter.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Spriter.java new file mode 100644 index 00000000..600f93e4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Spriter.java @@ -0,0 +1,264 @@ +package com.brashmonkey.spriter; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * A utility class for managing multiple {@link Loader} and {@link Player} instances. + * @author Trixt0r + * + */ + +@SuppressWarnings("rawtypes") +public class Spriter { + + private static Object[] loaderDependencies = new Object[1], drawerDependencies = new Object[1]; + private static Class[] loaderTypes = new Class[1], drawerTypes = new Class[1]; + static{ + loaderTypes[0] = Data.class; + drawerTypes[0] = Loader.class; + } + private static Class loaderClass; + + private static final HashMap loadedData = new HashMap(); + private static final List players = new ArrayList(); + private static final List loaders = new ArrayList(); + private static Drawer drawer; + private static final HashMap entityToLoader = new HashMap(); + private static boolean initialized = false; + + /** + * Sets the dependencies for implemented {@link Loader}. + * @param loaderDependencies the dependencies a loader has to get + */ + public static void setLoaderDependencies(Object... loaderDependencies){ + if(loaderDependencies == null) return; + Spriter.loaderDependencies = new Object[loaderDependencies.length+1]; + System.arraycopy(loaderDependencies, 0, Spriter.loaderDependencies, 1, loaderDependencies.length); + loaderTypes = new Class[loaderDependencies.length+1]; + loaderTypes[0] = Data.class; + for(int i = 0; i< loaderDependencies.length; i++) + loaderTypes[i+1] = loaderDependencies[i].getClass(); + } + + /** + * Sets the dependencies for implemented {@link Drawer}. + * @param drawerDependencies the dependencies a drawer has to get + */ + public static void setDrawerDependencies(Object... drawerDependencies){ + if(drawerDependencies == null) return; + Spriter.drawerDependencies = new Object[drawerDependencies.length+1]; + Spriter.drawerDependencies[0] = null; + System.arraycopy(drawerDependencies, 0, Spriter.drawerDependencies, 1, drawerDependencies.length); + drawerTypes = new Class[drawerDependencies.length+1]; + drawerTypes[0] = Loader.class; + for(int i = 0; i< drawerDependencies.length; i++) + if(drawerDependencies[i] != null) + drawerTypes[i+1] = drawerDependencies[i].getClass(); + } + + /** + * Initializes this class with the implemented {@link Loader} class and {@link Drawer} class. + * Before calling this method make sure that you have set all necessary dependecies with {@link #setDrawerDependencies(Object...)} and {@link #setLoaderDependencies(Object...)}. + * A drawer is created with this method. + * @param loaderClass the loader class + * @param drawerClass the drawer class + */ + public static void init(Class loaderClass, Class drawerClass){ + Spriter.loaderClass = loaderClass; + try { + drawer = drawerClass.getDeclaredConstructor(drawerTypes).newInstance(drawerDependencies); + } catch (Exception e) { + e.printStackTrace(); + } + initialized = drawer != null; + } + + /** + * Loads a SCML file with the given path. + * @param scmlFile the path to the SCML file + */ + public static void load(String scmlFile){ + load(new File(scmlFile)); + } + + /** + * Loads the given SCML file. + * @param scmlFile the scml file + */ + public static void load(File scmlFile){ + try { + load(new FileInputStream(scmlFile), scmlFile.getPath().replaceAll("\\\\", "/")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + /** + * Loads the given SCML stream pointing to a file saved at the given path. + * @param stream the SCML stream + * @param scmlFile the path to the SCML file + */ + public static void load(InputStream stream, String scmlFile){ + SCMLReader reader = new SCMLReader(stream); + Data data = reader.data; + loadedData.put(scmlFile, data); + loaderDependencies[0] = data; + try { + Loader loader = loaderClass.getDeclaredConstructor(loaderTypes).newInstance(loaderDependencies); + loader.load(new File(scmlFile)); + loaders.add(loader); + for(Entity entity: data.entities) + entityToLoader.put(entity, loader); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Creates a new {@link Player} instance based on the given SCML file with the given entity index + * @param scmlFile name of the SCML file + * @param entityIndex the index of the entity + * @return a {@link Player} instance managed by this class + * @throws SpriterException if the given SCML file was not loaded yet + */ + public static Player newPlayer(String scmlFile, int entityIndex){ + return newPlayer(scmlFile, entityIndex, Player.class); + } + + /** + * Creates a new {@link Player} instance based on the given SCML file with the given entity index and the given class extending a {@link Player} + * @param scmlFile name of the SCML file + * @param entityIndex the index of the entity + * @param playerClass the class extending a {@link Player} class, e.g. {@link PlayerTweener}. + * @return a {@link Player} instance managed by this class + * @throws SpriterException if the given SCML file was not loaded yet + */ + public static Player newPlayer(String scmlFile, int entityIndex, Class playerClass){ + if(!loadedData.containsKey(scmlFile)) throw new SpriterException("You have to load \""+scmlFile+"\" before using it!"); + try { + Player player = playerClass.getDeclaredConstructor(Entity.class).newInstance(loadedData.get(scmlFile).getEntity(entityIndex)); + players.add(player); + return player; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * Creates a new {@link Player} instance based on the given SCML file with the given entity name + * @param scmlFile name of the SCML file + * @param entityName name of the entity + * @return a {@link Player} instance managed by this class + * @throws SpriterException if the given SCML file was not loaded yet + */ + public static Player newPlayer(String scmlFile, String entityName){ + if(!loadedData.containsKey(scmlFile)) throw new SpriterException("You have to load \""+scmlFile+"\" before using it!"); + return newPlayer(scmlFile, loadedData.get(scmlFile).getEntityIndex(entityName)); + } + + /** + * Returns a loader for the given SCML filename. + * @param scmlFile the name of the SCML file + * @return the loader for the given SCML filename + * @throws NullPointerException if the SCML file was not loaded yet + */ + public static Loader getLoader(String scmlFile){ + return entityToLoader.get(getData(scmlFile).getEntity(0)); + } + + /** + * Updates each created player by this class and immediately draws it. + * This method should only be called if you want to update and render on the same thread. + * @throws SpriterException if {@link #init(Class, Class)} was not called before + */ + @SuppressWarnings("unchecked") + public static void updateAndDraw(){ + if(!initialized) throw new SpriterException("Call init() before updating!"); + for(Player player: players){ + player.update(); + drawer.loader = entityToLoader.get(player.getEntity()); + drawer.draw(player); + } + } + + /** + * Updates each created player by this class. + * @throws SpriterException if {@link #init(Class, Class)} was not called before + */ + public static void update(){ + if(!initialized) throw new SpriterException("Call init() before updating!"); + for(Player player: players) + player.update(); + } + + /** + * Draws each created player by this class. + * @throws SpriterException if {@link #init(Class, Class)} was not called before + */ + @SuppressWarnings("unchecked") + public static void draw(){ + if(!initialized) throw new SpriterException("Call init() before drawing!"); + for(Player player: players){ + drawer.loader = entityToLoader.get(player.getEntity()); + drawer.draw(player); + } + } + + /** + * Returns the drawer instance this class is using. + * @return the drawer which draws all players + */ + public static Drawer drawer(){ + return drawer; + } + + /** + * Returns the data for the given SCML filename. + * @param fileName the name of the SCML file + * @return the data for the given SCML filename or null if not loaed yet + */ + public static Data getData(String fileName){ + return loadedData.get(fileName); + } + + /** + * The number of players this class is managing. + * @return number of players + */ + public static int players(){ + return players.size(); + } + + /** + * Clears all previous created players, Spriter datas, disposes all loaders, deletes the drawer and resets all internal lists. + * After this methods was called {@link #init(Class, Class)} has to be called again so that everything works again. + */ + public static void dispose(){ + drawer = null; + drawerDependencies = new Object[1]; + drawerTypes = new Class[1]; + drawerTypes[0] = Loader.class; + + entityToLoader.clear(); + + for(Loader loader: loaders) loader.dispose(); + loaders.clear(); + loadedData.clear(); + loaderClass = null; + loaderTypes = new Class[1]; + loaderTypes[0] = Data.class; + loaderDependencies = new Object[1]; + + players.clear(); + + initialized = false; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SpriterException.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SpriterException.java new file mode 100644 index 00000000..b01a43b0 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/SpriterException.java @@ -0,0 +1,16 @@ +package com.brashmonkey.spriter; + +/** + * An Exception which will be thrown if a Spriter specific issue happens at runtime. + * @author Trixt0r + * + */ +public class SpriterException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public SpriterException(String message){ + super(message); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Timeline.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Timeline.java new file mode 100644 index 00000000..1996d0e7 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/Timeline.java @@ -0,0 +1,277 @@ +package com.brashmonkey.spriter; + +import com.brashmonkey.spriter.Entity.ObjectInfo; + +/** + * Represents a time line in a Spriter SCML file. + * A time line holds an {@link #id}, a {@link #name} and at least one {@link Key}. + * @author Trixt0r + * + */ +public class Timeline { + + public final Key[] keys; + private int keyPointer = 0; + public final int id; + public final String name; + public final ObjectInfo objectInfo; + + Timeline(int id, String name, ObjectInfo objectInfo, int keys){ + this.id = id; + this.name = name; + this.objectInfo = objectInfo; + this.keys = new Key[keys]; + } + + void addKey(Key key){ + this.keys[keyPointer++] = key; + } + + /** + * Returns a {@link Key} at the given index + * @param index the index of the key. + * @return the key with the given index. + * @throws IndexOutOfBoundsException if the index is out of range + */ + public Key getKey(int index){ + return this.keys[index]; + } + + public String toString(){ + String toReturn = getClass().getSimpleName()+"|[id:"+id+", name: "+name+", object_info: "+objectInfo; + for(Key key: keys) + toReturn += "\n"+key; + toReturn+="]"; + return toReturn; + } + + /** + * Represents a time line key in a Spriter SCML file. + * A key holds an {@link #id}, a {@link #time}, a {@link #spin}, an {@link #object()} and a {@link #curve}. + * @author Trixt0r + * + */ + public static class Key{ + + public final int id, spin; + public int time; + public final Curve curve; + public boolean active; + private Object object; + + public Key(int id, int time, int spin, Curve curve){ + this.id = id; + this.time = time; + this.spin = spin; + this.curve = curve; + } + + public Key(int id,int time, int spin){ + this(id, time, 1, new Curve()); + } + + public Key(int id, int time){ + this(id, time, 1); + } + + public Key(int id){ + this(id, 0); + } + + public void setObject(Object object){ + if(object == null) throw new IllegalArgumentException("object can not be null!"); + this.object = object; + } + + public Object object(){ + return this.object; + } + + public String toString(){ + return getClass().getSimpleName()+"|[id: "+id+", time: "+time+", spin: "+spin+"\ncurve: "+curve+"\nobject:"+object+"]"; + } + + /** + * Represents a bone in a Spriter SCML file. + * A bone holds a {@link #position}, {@link #scale}, an {@link #angle} and a {@link #pivot}. + * Bones are the only objects which can be used as a parent for other tweenable objects. + * @author Trixt0r + * + */ + public static class Bone{ + public final Point position, scale, pivot; + public float angle; + + public Bone(Point position, Point scale, Point pivot, float angle){ + this.position = new Point(position); + this.scale = new Point(scale); + this.angle = angle; + this.pivot = new Point(pivot); + } + + public Bone(Bone bone){ + this(bone.position, bone.scale, bone.pivot, bone.angle); + } + + public Bone(Point position){ + this(position, new Point(1f,1f), new Point(0f, 1f), 0f); + } + + public Bone(){ + this(new Point()); + } + + /** + * Returns whether this instance is a Spriter object or a bone. + * @return true if this instance is a Spriter bone + */ + public boolean isBone(){ + return !(this instanceof Object); + } + + /** + * Sets the values of this bone to the values of the given bone + * @param bone the bone + */ + public void set(Bone bone){ + this.set(bone.position, bone.angle, bone.scale, bone.pivot); + } + + /** + * Sets the given values for this bone. + * @param x the new position in x direction + * @param y the new position in y direction + * @param angle the new angle + * @param scaleX the new scale in x direction + * @param scaleY the new scale in y direction + * @param pivotX the new pivot in x direction + * @param pivotY the new pivot in y direction + */ + public void set(float x, float y, float angle, float scaleX, float scaleY, float pivotX, float pivotY){ + this.angle = angle; + this.position.set(x, y); + this.scale.set(scaleX, scaleY); + this.pivot.set(pivotX, pivotY); + } + + /** + * Sets the given values for this bone. + * @param position the new position + * @param angle the new angle + * @param scale the new scale + * @param pivot the new pivot + */ + public void set(Point position, float angle, Point scale, Point pivot){ + this.set(position.x, position.y, angle, scale.x, scale.y, pivot.x, pivot.y); + } + + /** + * Maps this bone from it's parent's coordinate system to a global one. + * @param parent the parent bone of this bone + */ + public void unmap(Bone parent){ + this.angle *= Math.signum(parent.scale.x)*Math.signum(parent.scale.y); + this.angle += parent.angle; + this.scale.scale(parent.scale); + this.position.scale(parent.scale); + this.position.rotate(parent.angle); + this.position.translate(parent.position); + } + + /** + * Maps this from it's global coordinate system to the parent's one. + * @param parent the parent bone of this bone + */ + public void map(Bone parent){ + this.position.translate(-parent.position.x, -parent.position.y); + this.position.rotate(-parent.angle); + this.position.scale(1f/parent.scale.x, 1f/parent.scale.y); + this.scale.scale(1f/parent.scale.x, 1f/parent.scale.y); + this.angle -=parent.angle; + this.angle *= Math.signum(parent.scale.x)*Math.signum(parent.scale.y); + } + + public String toString(){ + return getClass().getSimpleName()+"|position: "+position+", scale: "+scale+", angle: "+angle; + } + } + + + /** + * Represents an object in a Spriter SCML file. + * A file has the same properties as a bone with an alpha and file extension. + * @author Trixt0r + * + */ + public static class Object extends Bone{ + + public float alpha; + public final FileReference ref; + + public Object(Point position, Point scale, Point pivot, float angle, float alpha, FileReference ref) { + super(position, scale, pivot, angle); + this.alpha = alpha; + this.ref = ref; + } + + public Object(Point position) { + this(position, new Point(1f,1f), new Point(0f,1f), 0f, 1f, new FileReference(-1,-1)); + } + + public Object(Object object){ + this(object.position.copy(), object.scale.copy(),object.pivot.copy(),object.angle,object.alpha,object.ref); + } + + public Object(){ + this(new Point()); + } + + /** + * Sets the values of this object to the values of the given object. + * @param object the object + */ + public void set(Object object){ + this.set(object.position, object.angle, object.scale, object.pivot, object.alpha, object.ref); + } + + /** + * Sets the given values for this object. + * @param x the new position in x direction + * @param y the new position in y direction + * @param angle the new angle + * @param scaleX the new scale in x direction + * @param scaleY the new scale in y direction + * @param pivotX the new pivot in x direction + * @param pivotY the new pivot in y direction + * @param alpha the new alpha value + * @param folder the new folder index + * @param file the new file index + */ + public void set(float x, float y, float angle, float scaleX, float scaleY, float pivotX, float pivotY, float alpha, int folder, int file){ + super.set(x, y, angle, scaleX, scaleY, pivotX, pivotY); + this.alpha = alpha; + this.ref.folder = folder; + this.ref.file = file; + } + + /** + * Sets the given values for this object. + * @param position the new position + * @param angle the new angle + * @param scale the new scale + * @param pivot the new pivot + * @param alpha the new alpha value + * @param fileRef the new file reference + */ + public void set(Point position, float angle, Point scale, Point pivot, float alpha, FileReference fileRef){ + this.set(position.x, position.y, angle, scale.x, scale.y, pivot.x, pivot.y, alpha , fileRef.folder, fileRef.file); + } + + public String toString(){ + return super.toString()+", pivot: "+pivot+", alpha: "+alpha+", reference: "+ref; + } + + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/TweenedAnimation.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/TweenedAnimation.java new file mode 100644 index 00000000..190ff6af --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/TweenedAnimation.java @@ -0,0 +1,220 @@ +package com.brashmonkey.spriter; + +import com.brashmonkey.spriter.Mainline.Key.BoneRef; +import com.brashmonkey.spriter.Mainline.Key.ObjectRef; +import com.brashmonkey.spriter.Timeline.Key.Bone; +import com.brashmonkey.spriter.Timeline.Key.Object; + +/** + * A tweened animation is responsible for updating itself based on two given animations. + * The values of the two given animations will get interpolated and save in this animation. + * When tweening two animations, you have to make sure that they have the same structure. + * The best result is achieved if bones of two different animations are named in the same way. + * There are still issues with sprites, which are hard to resolve since Spriter does not save them in a useful order or naming convention. + * @author Trixt0r + * + */ +public class TweenedAnimation extends Animation{ + + /** + * The weight of the interpolation. 0.5f is the default value. + * Values closer to 0.0f mean the first animation will have more influence. + */ + public float weight = .5f; + + /** + * Indicates when a sprite should be switched form the first animation object to the second one. + * A value closer to 0.0f means that the sprites of the second animation will be drawn. + */ + public float spriteThreshold = .5f; + + /** + * The curve which will tween the animations. + * The default type of the curve is {@link Curve.Type#Linear}. + */ + public final Curve curve; + + /** + * The entity the animations have be part of. + * Animations of two different entities can not be tweened. + */ + public final Entity entity; + private Animation anim1, anim2; + + /** + * The base animation an object or bone will get if it will not be tweened. + */ + public Animation baseAnimation; + BoneRef base = null; + + /** + * Indicates whether to tween sprites or not. Default value is false. + * Tweening sprites should be only enabled if they have exactly the same structure. + * If all animations are bone based and sprites only change their references it is not recommended to tween sprites. + */ + public boolean tweenSprites = false; + + /** + * Creates a tweened animation based on the given entity. + * @param entity the entity animations have to be part of + */ + public TweenedAnimation(Entity entity) { + super(new Mainline(0), -1, "__interpolatedAnimation__", 0, true, entity.getAnimationWithMostTimelines().timelines()); + this.entity = entity; + this.curve = new Curve(); + this.setUpTimelines(); + } + + /** + * Returns the current mainline key. + * @return the mainline key + */ + public Mainline.Key getCurrentKey(){ + return this.currentKey; + } + + @Override + public void update(int time, Bone root){ + super.currentKey = onFirstMainLine() ? anim1.currentKey: anim2.currentKey; + for(Timeline.Key timelineKey: this.unmappedTweenedKeys) + timelineKey.active = false; + if(base != null){//TODO: Sprites not working properly because of different timeline naming + Animation currentAnim = onFirstMainLine() ? anim1: anim2; + Animation baseAnim = baseAnimation == null ? (onFirstMainLine() ? anim1:anim2) : baseAnimation; + for(BoneRef ref: currentKey.boneRefs){ + Timeline timeline = baseAnim.getSimilarTimeline(currentAnim.getTimeline(ref.timeline)); + if(timeline == null) continue; + Timeline.Key key, mappedKey; + key = baseAnim.tweenedKeys[timeline.id]; + mappedKey = baseAnim.unmappedTweenedKeys[timeline.id]; + this.tweenedKeys[ref.timeline].active = key.active; + this.tweenedKeys[ref.timeline].object().set(key.object()); + this.unmappedTweenedKeys[ref.timeline].active = mappedKey.active; + this.unmapTimelineObject(ref.timeline, false,(ref.parent != null) ? + this.unmappedTweenedKeys[ref.parent.timeline].object(): root); + } + /*for(ObjectRef ref: baseAnim.currentKey.objectRefs){ + Timeline timeline = baseAnim.getTimeline(ref.timeline);//getSimilarTimeline(ref, tempTimelines); + if(timeline != null){ + //tempTimelines.addLast(timeline); + Timeline.Key key = baseAnim.tweenedKeys[timeline.id]; + Timeline.Key mappedKey = baseAnim.mappedTweenedKeys[timeline.id]; + Object obj = (Object) key.object(); + + this.tweenedKeys[ref.timeline].active = key.active; + ((Object)this.tweenedKeys[ref.timeline].object()).set(obj); + this.mappedTweenedKeys[ref.timeline].active = mappedKey.active; + this.unmapTimelineObject(ref.timeline, true,(ref.parent != null) ? + this.mappedTweenedKeys[ref.parent.timeline].object(): root); + } + }*/ + //tempTimelines.clear(); + } + + this.tweenBoneRefs(base, root); + for(ObjectRef ref: super.currentKey.objectRefs){ + //if(ref.parent == base) + this.update(ref, root, 0); + } + } + + private void tweenBoneRefs(BoneRef base, Bone root){ + int startIndex = base == null ? -1 : base.id-1; + int length = super.currentKey.boneRefs.length; + for(int i = startIndex+1; i < length; i++){ + BoneRef ref = currentKey.boneRefs[i]; + if(base == ref || ref.parent == base) this.update(ref, root, 0); + if(base == ref.parent) this.tweenBoneRefs(ref, root); + } + } + + @Override + protected void update(BoneRef ref, Bone root, int time){ + boolean isObject = ref instanceof ObjectRef; + //Tween bone/object + Bone bone1 = null, bone2 = null, tweenTarget = null; + Timeline t1 = onFirstMainLine() ? anim1.getTimeline(ref.timeline) : anim1.getSimilarTimeline(anim2.getTimeline(ref.timeline)); + Timeline t2 = onFirstMainLine() ? anim2.getSimilarTimeline(t1) : anim2.getTimeline(ref.timeline); + Timeline targetTimeline = super.getTimeline(onFirstMainLine() ? t1.id:t2.id); + if(t1 != null) bone1 = anim1.tweenedKeys[t1.id].object(); + if(t2 != null) bone2 = anim2.tweenedKeys[t2.id].object(); + if(targetTimeline != null) tweenTarget = this.tweenedKeys[targetTimeline.id].object(); + if(isObject && (t2 == null || !tweenSprites)){ + if(!onFirstMainLine()) bone1 = bone2; + else bone2 = bone1; + } + if(bone2 != null && tweenTarget != null && bone1 != null){ + if(isObject) this.tweenObject((Object)bone1, (Object)bone2, (Object)tweenTarget, this.weight, this.curve); + else this.tweenBone(bone1, bone2, tweenTarget, this.weight, this.curve); + this.unmappedTweenedKeys[targetTimeline.id].active = true; + } + //Transform the bone relative to the parent bone or the root + if(this.unmappedTweenedKeys[ref.timeline].active){ + this.unmapTimelineObject(targetTimeline.id, isObject,(ref.parent != null) ? + this.unmappedTweenedKeys[ref.parent.timeline].object(): root); + } + } + + private void tweenBone(Bone bone1, Bone bone2, Bone target, float t, Curve curve){ + target.angle = curve.tweenAngle(bone1.angle, bone2.angle, t); + curve.tweenPoint(bone1.position, bone2.position, t, target.position); + curve.tweenPoint(bone1.scale, bone2.scale, t, target.scale); + curve.tweenPoint(bone1.pivot, bone2.pivot, t, target.pivot); + } + + private void tweenObject(Object object1, Object object2, Object target, float t, Curve curve){ + this.tweenBone(object1, object2, target, t, curve); + target.alpha = curve.tweenAngle(object1.alpha, object2.alpha, t); + target.ref.set(object1.ref); + } + + /** + * Returns whether the current mainline key is the one from the first animation or from the second one. + * @return true if the mainline key is the one from the first animation + */ + public boolean onFirstMainLine(){ + return this.weight < this.spriteThreshold; + } + + private void setUpTimelines(){ + Animation maxAnim = this.entity.getAnimationWithMostTimelines(); + int max = maxAnim.timelines(); + for(int i = 0; i < max; i++){ + Timeline t = new Timeline(i, maxAnim.getTimeline(i).name, maxAnim.getTimeline(i).objectInfo, 1); + addTimeline(t); + } + prepare(); + } + + /** + * Sets the animations to tween. + * @param animation1 the first animation + * @param animation2 the second animation + * @throws SpriterException if {@link #entity} does not contain one of the given animations. + */ + public void setAnimations(Animation animation1, Animation animation2){ + boolean areInterpolated = animation1 instanceof TweenedAnimation || animation2 instanceof TweenedAnimation; + if(animation1 == anim1 && animation2 == anim2) return; + if((!this.entity.containsAnimation(animation1) || !this.entity.containsAnimation(animation2)) && !areInterpolated) + throw new SpriterException("Both animations have to be part of the same entity!"); + this.anim1 = animation1; + this.anim2 = animation2; + } + + /** + * Returns the first animation. + * @return the first animation + */ + public Animation getFirstAnimation(){ + return this.anim1; + } + + /** + * Returns the second animation. + * @return the second animation + */ + public Animation getSecondAnimation(){ + return this.anim2; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/XmlReader.java b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/XmlReader.java new file mode 100644 index 00000000..4a298101 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/com/brashmonkey/spriter/XmlReader.java @@ -0,0 +1,688 @@ +package com.brashmonkey.spriter; + +import com.badlogic.gdx.utils.Array; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map.Entry; + +/** Lightweight XML parser. Supports a subset of XML features: elements, attributes, text, predefined entities, CDATA, mixed + * content. Namespaces are parsed as part of the element or attribute name. Prologs and doctypes are ignored. Only 8-bit character + * encodings are supported. Input is assumed to be well formed.
+ *
+ * The default behavior is to parse the XML into a DOM. Extends this class and override methods to perform event driven parsing. + * When this is done, the parse methods will return null. + * @author Nathan Sweet */ +public class XmlReader { + private final ArrayList elements = new ArrayList(8); + private Element root, current; + private final StringBuilder textBuffer = new StringBuilder(64); + + public Element parse (String xml) { + char[] data = xml.toCharArray(); + return parse(data, 0, data.length); + } + + public Element parse (Reader reader) throws IOException { + char[] data = new char[1024]; + int offset = 0; + while (true) { + int length = reader.read(data, offset, data.length - offset); + if (length == -1) break; + if (length == 0) { + char[] newData = new char[data.length * 2]; + System.arraycopy(data, 0, newData, 0, data.length); + data = newData; + } else + offset += length; + } + return parse(data, 0, offset); + } + + public Element parse (InputStream input) throws IOException { + return parse(new InputStreamReader(input, "ISO-8859-1")); + } + + @SuppressWarnings("unused") + public Element parse (char[] data, int offset, int length) { + int cs, p = offset, pe = length; + + int s = 0; + String attributeName = null; + boolean hasBody = false; + + // line 3 "XmlReader.java" + { + cs = xml_start; + } + + // line 7 "XmlReader.java" + { + int _klen; + int _trans = 0; + int _acts; + int _nacts; + int _keys; + int _goto_targ = 0; + + _goto: + while (true) { + switch (_goto_targ) { + case 0: + if (p == pe) { + _goto_targ = 4; + continue _goto; + } + if (cs == 0) { + _goto_targ = 5; + continue _goto; + } + case 1: + _match: + do { + _keys = _xml_key_offsets[cs]; + _trans = _xml_index_offsets[cs]; + _klen = _xml_single_lengths[cs]; + if (_klen > 0) { + int _lower = _keys; + int _mid; + int _upper = _keys + _klen - 1; + while (true) { + if (_upper < _lower) break; + + _mid = _lower + ((_upper - _lower) >> 1); + if (data[p] < _xml_trans_keys[_mid]) + _upper = _mid - 1; + else if (data[p] > _xml_trans_keys[_mid]) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + break _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _xml_range_lengths[cs]; + if (_klen > 0) { + int _lower = _keys; + int _mid; + int _upper = _keys + (_klen << 1) - 2; + while (true) { + if (_upper < _lower) break; + + _mid = _lower + (((_upper - _lower) >> 1) & ~1); + if (data[p] < _xml_trans_keys[_mid]) + _upper = _mid - 2; + else if (data[p] > _xml_trans_keys[_mid + 1]) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys) >> 1); + break _match; + } + } + _trans += _klen; + } + } while (false); + + _trans = _xml_indicies[_trans]; + cs = _xml_trans_targs[_trans]; + + if (_xml_trans_actions[_trans] != 0) { + _acts = _xml_trans_actions[_trans]; + _nacts = (int)_xml_actions[_acts++]; + while (_nacts-- > 0) { + switch (_xml_actions[_acts++]) { + case 0: + // line 80 "XmlReader.rl" + { + s = p; + } + break; + case 1: + // line 81 "XmlReader.rl" + { + char c = data[s]; + if (c == '?' || c == '!') { + if (data[s + 1] == '[' && // + data[s + 2] == 'C' && // + data[s + 3] == 'D' && // + data[s + 4] == 'A' && // + data[s + 5] == 'T' && // + data[s + 6] == 'A' && // + data[s + 7] == '[') { + s += 8; + p = s + 2; + while (data[p - 2] != ']' || data[p - 1] != ']' || data[p] != '>') + p++; + text(new String(data, s, p - s - 2)); + } else + while (data[p] != '>') + p++; + { + cs = 15; + _goto_targ = 2; + if (true) continue _goto; + } + } + hasBody = true; + open(new String(data, s, p - s)); + } + break; + case 2: + // line 105 "XmlReader.rl" + { + hasBody = false; + close(); + { + cs = 15; + _goto_targ = 2; + if (true) continue _goto; + } + } + break; + case 3: + // line 110 "XmlReader.rl" + { + close(); + { + cs = 15; + _goto_targ = 2; + if (true) continue _goto; + } + } + break; + case 4: + // line 114 "XmlReader.rl" + { + if (hasBody) { + cs = 15; + _goto_targ = 2; + if (true) continue _goto; + } + } + break; + case 5: + // line 117 "XmlReader.rl" + { + attributeName = new String(data, s, p - s); + } + break; + case 6: + // line 120 "XmlReader.rl" + { + attribute(attributeName, new String(data, s, p - s)); + } + break; + case 7: + // line 123 "XmlReader.rl" + { + int end = p; + while (end != s) { + switch (data[end - 1]) { + case ' ': + case '\t': + case '\n': + case '\r': + end--; + continue; + } + break; + } + int current = s; + boolean entityFound = false; + while (current != end) { + if (data[current++] != '&') continue; + int entityStart = current; + while (current != end) { + if (data[current++] != ';') continue; + textBuffer.append(data, s, entityStart - s - 1); + String name = new String(data, entityStart, current - entityStart - 1); + String value = entity(name); + textBuffer.append(value != null ? value : name); + s = current; + entityFound = true; + break; + } + } + if (entityFound) { + if (s < end) textBuffer.append(data, s, end - s); + text(textBuffer.toString()); + textBuffer.setLength(0); + } else + text(new String(data, s, end - s)); + } + break; + // line 190 "XmlReader.java" + } + } + } + + case 2: + if (cs == 0) { + _goto_targ = 5; + continue _goto; + } + if (++p != pe) { + _goto_targ = 1; + continue _goto; + } + case 4: + case 5: + } + break; + } + } + + // line 170 "XmlReader.rl" + + if (p < pe) { + int lineNumber = 1; + for (int i = 0; i < p; i++) + if (data[i] == '\n') lineNumber++; + throw new SpriterException("Error parsing XML on line " + lineNumber + " near: " + + new String(data, p, Math.min(32, pe - p))); + } else if (!elements.isEmpty()) { + Element element = elements.get(elements.size()-1); + elements.clear(); + throw new SpriterException("Error parsing XML, unclosed element: " + element.getName()); + } + Element root = this.root; + this.root = null; + return root; + } + + // line 210 "XmlReader.java" + private static byte[] init__xml_actions_0 () { + return new byte[] {0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 2, 0, 6, 2, 1, 4, 2, 2, 4}; + } + + private static final byte _xml_actions[] = init__xml_actions_0(); + + private static byte[] init__xml_key_offsets_0 () { + return new byte[] {0, 0, 4, 9, 14, 20, 26, 30, 35, 36, 37, 42, 46, 50, 51, 52, 56, 57, 62, 67, 73, 79, 83, 88, 89, 90, 95, + 99, 103, 104, 108, 109, 110, 111, 112, 115}; + } + + private static final byte _xml_key_offsets[] = init__xml_key_offsets_0(); + + private static char[] init__xml_trans_keys_0 () { + return new char[] {32, 60, 9, 13, 32, 47, 62, 9, 13, 32, 47, 62, 9, 13, 32, 47, 61, 62, 9, 13, 32, 47, 61, 62, 9, 13, 32, + 61, 9, 13, 32, 34, 39, 9, 13, 34, 34, 32, 47, 62, 9, 13, 32, 62, 9, 13, 32, 62, 9, 13, 39, 39, 32, 60, 9, 13, 60, 32, + 47, 62, 9, 13, 32, 47, 62, 9, 13, 32, 47, 61, 62, 9, 13, 32, 47, 61, 62, 9, 13, 32, 61, 9, 13, 32, 34, 39, 9, 13, 34, + 34, 32, 47, 62, 9, 13, 32, 62, 9, 13, 32, 62, 9, 13, 60, 32, 47, 9, 13, 62, 62, 39, 39, 32, 9, 13, 0}; + } + + private static final char _xml_trans_keys[] = init__xml_trans_keys_0(); + + private static byte[] init__xml_single_lengths_0 () { + return new byte[] {0, 2, 3, 3, 4, 4, 2, 3, 1, 1, 3, 2, 2, 1, 1, 2, 1, 3, 3, 4, 4, 2, 3, 1, 1, 3, 2, 2, 1, 2, 1, 1, 1, 1, 1, + 0}; + } + + private static final byte _xml_single_lengths[] = init__xml_single_lengths_0(); + + private static byte[] init__xml_range_lengths_0 () { + return new byte[] {0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 0}; + } + + private static final byte _xml_range_lengths[] = init__xml_range_lengths_0(); + + private static short[] init__xml_index_offsets_0 () { + return new short[] {0, 0, 4, 9, 14, 20, 26, 30, 35, 37, 39, 44, 48, 52, 54, 56, 60, 62, 67, 72, 78, 84, 88, 93, 95, 97, + 102, 106, 110, 112, 116, 118, 120, 122, 124, 127}; + } + + private static final short _xml_index_offsets[] = init__xml_index_offsets_0(); + + private static byte[] init__xml_indicies_0 () { + return new byte[] {0, 2, 0, 1, 2, 1, 1, 2, 3, 5, 6, 7, 5, 4, 9, 10, 1, 11, 9, 8, 13, 1, 14, 1, 13, 12, 15, 16, 15, 1, 16, + 17, 18, 16, 1, 20, 19, 22, 21, 9, 10, 11, 9, 1, 23, 24, 23, 1, 25, 11, 25, 1, 20, 26, 22, 27, 29, 30, 29, 28, 32, 31, + 30, 34, 1, 30, 33, 36, 37, 38, 36, 35, 40, 41, 1, 42, 40, 39, 44, 1, 45, 1, 44, 43, 46, 47, 46, 1, 47, 48, 49, 47, 1, + 51, 50, 53, 52, 40, 41, 42, 40, 1, 54, 55, 54, 1, 56, 42, 56, 1, 57, 1, 57, 34, 57, 1, 1, 58, 59, 58, 51, 60, 53, 61, + 62, 62, 1, 1, 0}; + } + + private static final byte _xml_indicies[] = init__xml_indicies_0(); + + private static byte[] init__xml_trans_targs_0 () { + return new byte[] {1, 0, 2, 3, 3, 4, 11, 34, 5, 4, 11, 34, 5, 6, 7, 6, 7, 8, 13, 9, 10, 9, 10, 12, 34, 12, 14, 14, 16, 15, + 17, 16, 17, 18, 30, 18, 19, 26, 28, 20, 19, 26, 28, 20, 21, 22, 21, 22, 23, 32, 24, 25, 24, 25, 27, 28, 27, 29, 31, 35, + 33, 33, 34}; + } + + private static final byte _xml_trans_targs[] = init__xml_trans_targs_0(); + + private static byte[] init__xml_trans_actions_0 () { + return new byte[] {0, 0, 0, 1, 0, 3, 3, 20, 1, 0, 0, 9, 0, 11, 11, 0, 0, 0, 0, 1, 17, 0, 13, 5, 23, 0, 1, 0, 1, 0, 0, 0, + 15, 1, 0, 0, 3, 3, 20, 1, 0, 0, 9, 0, 11, 11, 0, 0, 0, 0, 1, 17, 0, 13, 5, 23, 0, 0, 0, 7, 1, 0, 0}; + } + + private static final byte _xml_trans_actions[] = init__xml_trans_actions_0(); + + static final int xml_start = 1; + static final int xml_first_final = 34; + static final int xml_error = 0; + + static final int xml_en_elementBody = 15; + static final int xml_en_main = 1; + + // line 189 "XmlReader.rl" + + protected void open (String name) { + Element child = new Element(name, current); + Element parent = current; + if (parent != null) parent.addChild(child); + elements.add(child); + current = child; + } + + protected void attribute (String name, String value) { + current.setAttribute(name, value); + } + + protected String entity (String name) { + if (name.equals("lt")) return "<"; + if (name.equals("gt")) return ">"; + if (name.equals("amp")) return "&"; + if (name.equals("apos")) return "'"; + if (name.equals("quot")) return "\""; + return null; + } + + protected void text (String text) { + String existing = current.getText(); + current.setText(existing != null ? existing + text : text); + } + + protected void close () { + root = elements.get(elements.size()-1); + elements.remove(elements.size()-1); + current = !elements.isEmpty() ? elements.get(elements.size()-1) : null; + } + + static public class Element { + private final String name; + private HashMap attributes; + private ArrayList children; + private String text; + private Element parent; + + public Element (String name, Element parent) { + this.name = name; + this.parent = parent; + } + + public String getName () { + return name; + } + + public HashMap getAttributes () { + return attributes; + } + + /** @throws RuntimeException if the attribute was not found. */ + public String getAttribute (String name) { + if (attributes == null) throw new RuntimeException("Element " + name + " doesn't have attribute: " + name); + String value = attributes.get(name); + if (value == null) throw new RuntimeException("Element " + name + " doesn't have attribute: " + name); + return value; + } + + public String getAttribute (String name, String defaultValue) { + if (attributes == null) return defaultValue; + String value = attributes.get(name); + if (value == null) return defaultValue; + return value; + } + + public void setAttribute (String name, String value) { + if (attributes == null) attributes = new HashMap(8); + attributes.put(name, value); + } + + public int getChildCount () { + if (children == null) return 0; + return children.size(); + } + + /** @throws RuntimeException if the element has no children. */ + public Element getChild (int i) { + if (children == null) throw new RuntimeException("Element has no children: " + name); + return children.get(i); + } + + public void addChild (Element element) { + if (children == null) children = new ArrayList(8); + children.add(element); + } + + public String getText () { + return text; + } + + public void setText (String text) { + this.text = text; + } + + public void removeChild (int index) { + if (children != null) children.remove(index); + } + + public void removeChild (Element child) { + if (children != null) children.remove(child); + } + + public void remove () { + parent.removeChild(this); + } + + public Element getParent () { + return parent; + } + + public String toString () { + return toString(""); + } + + public String toString (String indent) { + StringBuilder buffer = new StringBuilder(128); + buffer.append(indent); + buffer.append('<'); + buffer.append(name); + if (attributes != null) { + for (Entry entry : attributes.entrySet()) { + buffer.append(' '); + buffer.append(entry.getKey()); + buffer.append("=\""); + buffer.append(entry.getKey()); + buffer.append('\"'); + } + } + if (children == null && (text == null || text.length() == 0)) + buffer.append("/>"); + else { + buffer.append(">\n"); + String childIndent = indent + '\t'; + if (text != null && text.length() > 0) { + buffer.append(childIndent); + buffer.append(text); + buffer.append('\n'); + } + if (children != null) { + for (Element child : children) { + buffer.append(child.toString(childIndent)); + buffer.append('\n'); + } + } + buffer.append(indent); + buffer.append("'); + } + return buffer.toString(); + } + + /** @param name the name of the child {@link Element} + * @return the first child having the given name or null, does not recurse */ + public Element getChildByName (String name) { + if (children == null) return null; + for (int i = 0; i < children.size(); i++) { + Element element = children.get(i); + if (element.name.equals(name)) return element; + } + return null; + } + + /** @param name the name of the child {@link Element} + * @return the first child having the given name or null, recurses */ + public Element getChildByNameRecursive (String name) { + if (children == null) return null; + for (int i = 0; i < children.size(); i++) { + Element element = children.get(i); + if (element.name.equals(name)) return element; + Element found = element.getChildByNameRecursive(name); + if (found != null) return found; + } + return null; + } + + /** @param name the name of the children + * @return the children with the given name or an empty {@link Array} */ + public ArrayList getChildrenByName (String name) { + ArrayList result = new ArrayList(); + if (children == null) return result; + for (int i = 0; i < children.size(); i++) { + Element child = children.get(i); + if (child.name.equals(name)) result.add(child); + } + return result; + } + + /** @param name the name of the children + * @return the children with the given name or an empty {@link Array} */ + public ArrayList getChildrenByNameRecursively (String name) { + ArrayList result = new ArrayList(); + getChildrenByNameRecursively(name, result); + return result; + } + + private void getChildrenByNameRecursively (String name, ArrayList result) { + if (children == null) return; + for (int i = 0; i < children.size(); i++) { + Element child = children.get(i); + if (child.name.equals(name)) result.add(child); + child.getChildrenByNameRecursively(name, result); + } + } + + /** @throws RuntimeException if the attribute was not found. */ + public float getFloatAttribute (String name) { + return Float.parseFloat(getAttribute(name)); + } + + public float getFloatAttribute (String name, float defaultValue) { + String value = getAttribute(name, null); + if (value == null) return defaultValue; + return Float.parseFloat(value); + } + + /** @throws RuntimeException if the attribute was not found. */ + public int getIntAttribute (String name) { + return Integer.parseInt(getAttribute(name)); + } + + public int getIntAttribute (String name, int defaultValue) { + String value = getAttribute(name, null); + if (value == null) return defaultValue; + return Integer.parseInt(value); + } + + /** @throws RuntimeException if the attribute was not found. */ + public boolean getBooleanAttribute (String name) { + return Boolean.parseBoolean(getAttribute(name)); + } + + public boolean getBooleanAttribute (String name, boolean defaultValue) { + String value = getAttribute(name, null); + if (value == null) return defaultValue; + return Boolean.parseBoolean(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public String get (String name) { + String value = get(name, null); + if (value == null) throw new RuntimeException("Element " + this.name + " doesn't have attribute or child: " + name); + return value; + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public String get (String name, String defaultValue) { + if (attributes != null) { + String value = attributes.get(name); + if (value != null) return value; + } + Element child = getChildByName(name); + if (child == null) return defaultValue; + String value = child.getText(); + if (value == null) return defaultValue; + return value; + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public int getInt (String name) { + String value = get(name, null); + if (value == null) throw new RuntimeException("Element " + this.name + " doesn't have attribute or child: " + name); + return Integer.parseInt(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public int getInt (String name, int defaultValue) { + String value = get(name, null); + if (value == null) return defaultValue; + return Integer.parseInt(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public float getFloat (String name) { + String value = get(name, null); + if (value == null) throw new RuntimeException("Element " + this.name + " doesn't have attribute or child: " + name); + return Float.parseFloat(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public float getFloat (String name, float defaultValue) { + String value = get(name, null); + if (value == null) return defaultValue; + return Float.parseFloat(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public boolean getBoolean (String name) { + String value = get(name, null); + if (value == null) throw new RuntimeException("Element " + this.name + " doesn't have attribute or child: " + name); + return Boolean.parseBoolean(value); + } + + /** Returns the attribute value with the specified name, or if no attribute is found, the text of a child with the name. + * @throws RuntimeException if no attribute or child was not found. */ + public boolean getBoolean (String name, boolean defaultValue) { + String value = get(name, null); + if (value == null) return defaultValue; + return Boolean.parseBoolean(value); + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/HyperLap2D.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/HyperLap2D.java new file mode 100644 index 00000000..b985a7e8 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/HyperLap2D.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer; + +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.*; + +public @Retention(RUNTIME) @interface HyperLap2D { + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/SceneLoader.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/SceneLoader.java new file mode 100644 index 00000000..d328fa2a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/SceneLoader.java @@ -0,0 +1,423 @@ +package games.rednblack.editor.renderer; + +import box2dLight.BlendFunc; +import box2dLight.DirectionalLight; +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.EntityListener; +import com.badlogic.ashley.utils.ImmutableArray; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.utils.Scaling; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import com.badlogic.gdx.utils.reflect.ReflectionException; +import com.badlogic.gdx.utils.viewport.ScalingViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import games.rednblack.editor.renderer.commons.IExternalItemType; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.resources.ResourceManager; +import games.rednblack.editor.renderer.scripts.IScript; +import games.rednblack.editor.renderer.systems.*; +import games.rednblack.editor.renderer.systems.action.ActionSystem; +import games.rednblack.editor.renderer.systems.render.HyperLap2dRenderer; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * SceneLoader is important part of runtime that utilizes provided + * IResourceRetriever (or creates default one shipped with runtime) in order to + * load entire scene data into viewable actors provides the functionality to get + * root actor of scene and load scenes. + */ +public class SceneLoader { + + private String curResolution = "orig"; + private SceneVO sceneVO; + private IResourceRetriever rm = null; + + public Engine engine = null; + public RayHandler rayHandler; + public World world; + public Entity rootEntity; + public DirectionalLight sceneDirectionalLight; + + public EntityFactory entityFactory; + + private float pixelsPerWU = 1; + + private HyperLap2dRenderer renderer; + private Entity root; + + public SceneLoader(World world, RayHandler rayHandler, boolean cullingEnabled) { + this.world = world; + this.rayHandler = rayHandler; + + ResourceManager rm = new ResourceManager(); + rm.initAllResources(); + this.rm = rm; + + this.engine = new Engine(); + initSceneLoader(cullingEnabled); + } + + public SceneLoader(IResourceRetriever rm, World world, RayHandler rayHandler, boolean cullingEnabled) { + this.world = world; + this.rayHandler = rayHandler; + this.engine = new Engine(); + this.rm = rm; + initSceneLoader(cullingEnabled); + } + + public SceneLoader() { + this(null, null, true); + } + + public SceneLoader(IResourceRetriever rm) { + this(rm, null, null, true); + } + + /** + * this method is called when rm has loaded all data + */ + private void initSceneLoader(boolean cullingEnabled) { + if (world == null) { + world = new World(new Vector2(0,-10), true); + } else { + PhysicsBodyLoader.getInstance().mul = 1; + } + + if (rayHandler == null) { + RayHandler.setGammaCorrection(true); + RayHandler.useDiffuseLight(true); + + rayHandler = new RayHandler(world); + rayHandler.setAmbientLight(1f, 1f, 1f, 1f); + rayHandler.setCulling(true); + rayHandler.setBlur(true); + rayHandler.setBlurNum(3); + rayHandler.setShadows(true); + } + + addSystems(cullingEnabled); + entityFactory = new EntityFactory(rayHandler, world, rm); + } + + public void setResolution(String resolutionName) { + ResolutionEntryVO resolution = getRm().getProjectVO().getResolution(resolutionName); + if(resolution != null) { + curResolution = resolutionName; + } + } + + + public SceneVO getSceneVO() { + return sceneVO; + } + + public SceneVO loadScene(String sceneName, Viewport viewport, boolean customLight) { + + // this has to be done differently. + engine.removeAllEntities(); + entityFactory.clean(); + + pixelsPerWU = rm.getProjectVO().pixelToWorld; + + sceneVO = rm.getSceneVO(sceneName); + world.setGravity(new Vector2(sceneVO.physicsPropertiesVO.gravityX, sceneVO.physicsPropertiesVO.gravityY)); + PhysicsSystem physicsSystem = engine.getSystem(PhysicsSystem.class); + if (physicsSystem != null) + physicsSystem.setPhysicsOn(sceneVO.physicsPropertiesVO.enabled); + + if(sceneVO.composite == null) { + sceneVO.composite = new CompositeVO(); + } + rootEntity = entityFactory.createRootEntity(sceneVO.composite, viewport); + engine.addEntity(rootEntity); + + if(sceneVO.composite != null) { + entityFactory.initAllChildren(engine, rootEntity, sceneVO.composite); + } + if (!customLight) { + setAmbientInfo(sceneVO); + } + + return sceneVO; + } + + public SceneVO loadScene(String sceneName, Viewport viewport) { + return loadScene(sceneName, viewport, false); + } + + public SceneVO loadScene(String sceneName) { + return loadScene(sceneName, false); + } + + public SceneVO loadScene(String sceneName, boolean customLight) { + ProjectInfoVO projectVO = rm.getProjectVO(); + Viewport viewport = new ScalingViewport(Scaling.stretch, (float)projectVO.originalResolution.width/ pixelsPerWU, (float)projectVO.originalResolution.height/ pixelsPerWU, new OrthographicCamera()); + return loadScene(sceneName, viewport, customLight); + } + + public void injectExternalItemType(IExternalItemType itemType) { + itemType.injectDependencies(rayHandler, world, rm); + itemType.injectMappers(); + entityFactory.addExternalFactory(itemType); + engine.addSystem(itemType.getSystem()); + renderer.addDrawableType(itemType); + } + + private void addSystems(boolean cullingEnabled) { + PhysicsBodyLoader.getInstance().setScaleFromPPWU(pixelsPerWU); + + ParticleSystem particleSystem = new ParticleSystem(); + LightSystem lightSystem = new LightSystem(); + lightSystem.setRayHandler(rayHandler); + SpriteAnimationSystem animationSystem = new SpriteAnimationSystem(); + LayerSystem layerSystem = new LayerSystem(); + PhysicsSystem physicsSystem = new PhysicsSystem(world); + CompositeSystem compositeSystem = new CompositeSystem(); + LabelSystem labelSystem = new LabelSystem(); + ScriptSystem scriptSystem = new ScriptSystem(); + ActionSystem actionSystem = new ActionSystem(); + BoundingBoxSystem boundingBoxSystem = new BoundingBoxSystem(); + CullingSystem cullingSystem = new CullingSystem(); + renderer = new HyperLap2dRenderer(new PolygonSpriteBatch(2000, createDefaultShader())); + renderer.setRayHandler(rayHandler); + //renderer.setBox2dWorld(world); + + engine.addSystem(animationSystem); + engine.addSystem(particleSystem); + engine.addSystem(layerSystem); + engine.addSystem(physicsSystem); + engine.addSystem(lightSystem); + engine.addSystem(compositeSystem); + engine.addSystem(labelSystem); + engine.addSystem(scriptSystem); + engine.addSystem(actionSystem); + + if (cullingEnabled) { + engine.addSystem(boundingBoxSystem); + engine.addSystem(cullingSystem); + } + + engine.addSystem(renderer); + + // additional + engine.addSystem(new ButtonSystem()); + + addEntityRemoveListener(); + } + + private void addEntityRemoveListener() { + engine.addEntityListener(new EntityListener() { + @Override + public void entityAdded(Entity entity) { + // TODO: Gev knows what to do. (do this for all entities) + + // mae sure we assign correct z-index here + /* + ZindexComponent zindexComponent = ComponentRetriever.get(entity, ZindexComponent.class); + ParentNodeComponent parentNodeComponent = ComponentRetriever.get(entity, ParentNodeComponent.class); + if (parentNodeComponent != null) { + NodeComponent nodeComponent = parentNodeComponent.parentEntity.getComponent(NodeComponent.class); + zindexComponent.setZIndex(nodeComponent.children.size); + zindexComponent.needReOrder = false; + }*/ + + // call init for a system + ScriptComponent scriptComponent = entity.getComponent(ScriptComponent.class); + if (scriptComponent != null) { + for (IScript script : scriptComponent.scripts) { + script.init(entity); + } + } + } + + @Override + public void entityRemoved(Entity entity) { + ParentNodeComponent parentComponent = ComponentRetriever.get(entity, ParentNodeComponent.class); + + if (parentComponent == null) { + return; + } + + Entity parentEntity = parentComponent.parentEntity; + NodeComponent parentNodeComponent = ComponentRetriever.get(parentEntity, NodeComponent.class); + parentNodeComponent.removeChild(entity); + + // check if composite and remove all children + NodeComponent nodeComponent = ComponentRetriever.get(entity, NodeComponent.class); + if (nodeComponent != null) { + // it is composite + for (Entity node : nodeComponent.children) { + engine.removeEntity(node); + } + } + + //check for physics + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + if (physicsBodyComponent != null && physicsBodyComponent.body != null) { + world.destroyBody(physicsBodyComponent.body); + } + + // check if it is light + LightObjectComponent lightObjectComponent = ComponentRetriever.get(entity, LightObjectComponent.class); + if(lightObjectComponent != null) { + lightObjectComponent.lightObject.remove(true); + } + + LightBodyComponent lightBodyComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + if(lightBodyComponent != null && lightBodyComponent.lightObject != null) { + lightBodyComponent.lightObject.remove(true); + } + } + }); + } + + public Entity loadFromLibrary(String libraryName) { + ProjectInfoVO projectInfoVO = getRm().getProjectVO(); + CompositeItemVO compositeItemVO = projectInfoVO.libraryItems.get(libraryName); + + if(compositeItemVO != null) { + return entityFactory.createEntity(null, compositeItemVO); + } + + return null; + } + + public CompositeItemVO loadVoFromLibrary(String libraryName) { + ProjectInfoVO projectInfoVO = getRm().getProjectVO(); + CompositeItemVO compositeItemVO = projectInfoVO.libraryItems.get(libraryName); + + return compositeItemVO; + } + + public void addComponentsByTagName(String tagName, Class componentClass) { + ImmutableArray entities = engine.getEntities(); + for(Entity entity: entities) { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + if(mainItemComponent.tags.contains(tagName)) { + try { + entity.add(ClassReflection.newInstance(componentClass)); + } catch (ReflectionException e) { + e.printStackTrace(); + } + } + } + } + + /** + * Sets ambient light to the one specified in scene from editor + * + * @param vo + * - Scene data file to invalidate + */ + public void setAmbientInfo(SceneVO vo) { + if (sceneDirectionalLight != null) { + sceneDirectionalLight.remove(); + sceneDirectionalLight = null; + } + if(!vo.lightsPropertiesVO.enabled) { + RayHandler.useDiffuseLight(true); + rayHandler.setAmbientLight(1f, 1f, 1f, 1f); + return; + } + RayHandler.useDiffuseLight(!vo.lightsPropertiesVO.lightType.equals("BRIGHT")); + + if (vo.lightsPropertiesVO.ambientColor != null) { + Color clr = new Color(vo.lightsPropertiesVO.ambientColor[0], vo.lightsPropertiesVO.ambientColor[1], + vo.lightsPropertiesVO.ambientColor[2], vo.lightsPropertiesVO.ambientColor[3]); + + if (vo.lightsPropertiesVO.lightType.equals("DIRECTIONAL")) { + Color lightColor = new Color(vo.lightsPropertiesVO.directionalColor[0], vo.lightsPropertiesVO.directionalColor[1], + vo.lightsPropertiesVO.directionalColor[2], vo.lightsPropertiesVO.directionalColor[3]); + sceneDirectionalLight = new DirectionalLight(rayHandler, vo.lightsPropertiesVO.directionalRays, + lightColor, vo.lightsPropertiesVO.directionalDegree); + } + rayHandler.setAmbientLight(clr); + rayHandler.setBlurNum(vo.lightsPropertiesVO.blurNum); + } + } + + + public EntityFactory getEntityFactory() { + return entityFactory; + } + + public IResourceRetriever getRm() { + return rm; + } + + public Engine getEngine() { + return engine; + } + + public Entity getRoot() { + return rootEntity; + } + + /** Returns a new instance of the default shader used by SpriteBatch for GL2 when no shader is specified. */ + static public ShaderProgram createDefaultShader () { + String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + + "uniform mat4 u_projTrans;\n" // + + "varying vec4 v_color;\n" // + + "varying vec2 v_texCoords;\n" // + + "\n" // + + "void main()\n" // + + "{\n" // + + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + + " v_color.a = v_color.a * (255.0/254.0);\n" // + + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" // + + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + + "}\n"; + String fragmentShader = "#ifdef GL_ES\n" // + + "#define LOWP lowp\n" // + + "precision mediump float;\n" // + + "#else\n" // + + "#define LOWP \n" // + + "#endif\n" // + + "varying LOWP vec4 v_color;\n" // + + "varying vec2 v_texCoords;\n" // + + "uniform sampler2D u_texture;\n" // + + "uniform vec2 atlasCoord;\n" // + + "uniform vec2 atlasSize;\n" // + + "uniform int isRepeat;\n" // + + "void main()\n"// + + "{\n" // + + "vec4 textureSample = vec4(0.0,0.0,0.0,0.0);\n"// + + "if(isRepeat == 1)\n"// + + "{\n"// + + "textureSample = v_color * texture2D(u_texture, atlasCoord+mod(v_texCoords, atlasSize));\n"// + + "}\n"// + + "else\n"// + + "{\n"// + + "textureSample = v_color * texture2D(u_texture, v_texCoords);\n"// + + "}\n"// + + " gl_FragColor = textureSample;\n" // + + "}"; + + ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader); + if (!shader.isCompiled()) throw new IllegalArgumentException("Error compiling shader: " + shader.getLog()); + return shader; + } + + public Batch getBatch() { + return renderer.getBatch(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/commons/IExternalItemType.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/commons/IExternalItemType.java new file mode 100644 index 00000000..d96b0b43 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/commons/IExternalItemType.java @@ -0,0 +1,39 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.commons; + +import box2dLight.RayHandler; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.factory.component.ComponentFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.systems.render.logic.Drawable; + +/** + * Created by azakhary on 7/20/2015. + */ +public interface IExternalItemType { + + public int getTypeId(); + public Drawable getDrawable(); + public IteratingSystem getSystem(); + public ComponentFactory getComponentFactory(); + public void injectMappers(); + public void injectDependencies(RayHandler rayHandler, World world, IResourceRetriever rm); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ActionComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ActionComponent.java new file mode 100644 index 00000000..3ff5a14e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ActionComponent.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.systems.action.data.ActionData; + +/** + * Created by ZeppLondon on 10/13/2015. + */ +public class ActionComponent implements Component { + public Array dataArray = new Array(true, 0); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/BoundingBoxComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/BoundingBoxComponent.java new file mode 100644 index 00000000..f5342105 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/BoundingBoxComponent.java @@ -0,0 +1,34 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; + +public class BoundingBoxComponent implements Component { + + public Rectangle rectangle = new Rectangle(); + + public Vector2[] points = new Vector2[4]; + public float checksum; + + { + points[0] = new Vector2(); + points[1] = new Vector2(); + points[2] = new Vector2(); + points[3] = new Vector2(); + } + + /** + * Returns a bounding box for this box. + * + * @return the bounding box + */ + public Rectangle getBoundingRect() { + + rectangle.x = Math.min(Math.min(Math.min(points[0].x, points[1].x), points[2].x), points[3].x); + rectangle.width = Math.max(Math.max(Math.max(points[0].x, points[1].x), points[2].x), points[3].x) - rectangle.x; + rectangle.y = Math.min(Math.min(Math.min(points[0].y, points[1].y), points[2].y), points[3].y); + rectangle.height = Math.max(Math.max(Math.max(points[0].y, points[1].y), points[2].y), points[3].y) - rectangle.y; + return rectangle; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CloneableComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CloneableComponent.java new file mode 100644 index 00000000..28b0baa4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CloneableComponent.java @@ -0,0 +1,28 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.components; + +/** + * Created by azakhary on 6/3/2015. + * TODO: it's either reflection or this.. we got to decide + */ +public interface CloneableComponent { + CloneableComponent get(); + void set(CloneableComponent source); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CompositeTransformComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CompositeTransformComponent.java new file mode 100644 index 00000000..03579ca6 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/CompositeTransformComponent.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.math.Affine2; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Rectangle; + +public class CompositeTransformComponent implements Component { + public boolean automaticResize = true; + public boolean scissorsEnabled = false; + public boolean transform = false; + public final Affine2 worldTransform = new Affine2(); + public final Matrix4 computedTransform = new Matrix4(); + public final Matrix4 oldTransform = new Matrix4(); + public final Rectangle scissors = new Rectangle(); + public final Rectangle clipBounds = new Rectangle(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/DimensionsComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/DimensionsComponent.java new file mode 100644 index 00000000..42c3cc53 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/DimensionsComponent.java @@ -0,0 +1,62 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.PolygonRegion; +import com.badlogic.gdx.graphics.g2d.PolygonSprite; +import com.badlogic.gdx.math.EarClippingTriangulator; +import com.badlogic.gdx.math.Polygon; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.data.ShapeVO; +import games.rednblack.editor.renderer.utils.PolygonUtils; + +public class DimensionsComponent implements Component { + public float width = 0; + public float height = 0; + + public Rectangle boundBox; + public Polygon polygon; + + public boolean hit(float x, float y){ + if(polygon != null) { + return polygon.contains(x, y); + } else if(boundBox != null) { + return (x >= boundBox.x && x < boundBox.x+boundBox.width && y >= boundBox.y && y < boundBox.y+boundBox.height); + } else { + return (x >= 0 && x < width && y >= 0 && y < height); + } + } + + public void setPolygon(PolygonComponent polygonComponent) { + Vector2[] verticesArray = PolygonUtils.mergeTouchingPolygonsToOne(polygonComponent.vertices); + float[] vertices = new float[verticesArray.length*2]; + for(int i = 0; i < verticesArray.length; i++) { + vertices[i*2] = (verticesArray[i].x); + vertices[i*2+1] = (verticesArray[i].y); + } + polygon = new Polygon(vertices); + } + + public void setFromShape(ShapeVO shape) { + Vector2 minPoint = new Vector2(); + Vector2 maxPoint = new Vector2(); + if(shape.polygons != null) { + for(int i = 0; i < shape.polygons.length; i++) { + for(int j = 0; j < shape.polygons[i].length; j++) { + if(i == 0 && j == 0) { + minPoint.x = shape.polygons[i][j].x; + minPoint.y = shape.polygons[i][j].y; + maxPoint.x = shape.polygons[i][j].x; + maxPoint.y = shape.polygons[i][j].y; + } + if(minPoint.x > shape.polygons[i][j].x) minPoint.x = shape.polygons[i][j].x; + if(minPoint.y > shape.polygons[i][j].y) minPoint.y = shape.polygons[i][j].y; + if(maxPoint.x < shape.polygons[i][j].x) maxPoint.x = shape.polygons[i][j].x; + if(maxPoint.y < shape.polygons[i][j].y) maxPoint.y = shape.polygons[i][j].y; + } + } + width = maxPoint.x - minPoint.x; + height = maxPoint.y - minPoint.y; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/LayerMapComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/LayerMapComponent.java new file mode 100644 index 00000000..ca1019a4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/LayerMapComponent.java @@ -0,0 +1,76 @@ +package games.rednblack.editor.renderer.components; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; + +import com.badlogic.ashley.core.Component; +import games.rednblack.editor.renderer.data.LayerItemVO; + +public class LayerMapComponent implements Component { + public boolean autoIndexing = true; + private ArrayList layers = new ArrayList(); + + private HashMap layerMap = new HashMap(); + + public void setLayers(ArrayList layers) { + this.layers = layers; + layerMap.clear(); + for (LayerItemVO vo : layers) { + layerMap.put(vo.layerName, vo); + } + } + + public LayerItemVO getLayer(String name) { + return layerMap.get(name); + } + + public int getIndexByName(String name) { + if(layerMap.containsKey(name)) { + return layers.indexOf(layerMap.get(name)); + } + + return 0; + } + + public boolean isVisible(String name) { + LayerItemVO vo = getLayer(name); + if (vo != null) { + return vo.isVisible; + } + + return true; + } + + public void addLayer(int index, LayerItemVO layerVo) { + layers.add(index, layerVo); + layerMap.put(layerVo.layerName, layerVo); + } + + public void addLayer(LayerItemVO layerVo) { + layers.add(layerVo); + layerMap.put(layerVo.layerName, layerVo); + } + + public ArrayList getLayers() { + return layers; + } + + public void deleteLayer(String layerName) { + layers.remove(getIndexByName(layerName)); + layerMap.remove(layerName); + } + + public void rename(String prevName, String newName) { + LayerItemVO vo = layerMap.get(prevName); + vo.layerName = newName; + layerMap.remove(prevName); + layerMap.put(newName, vo); + } + + public void swap(String source, String target) { + LayerItemVO sourceVO = getLayer(source); + LayerItemVO targetVO = getLayer(target); + Collections.swap(layers, layers.indexOf(sourceVO), layers.indexOf(targetVO)); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/MainItemComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/MainItemComponent.java new file mode 100644 index 00000000..7811a566 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/MainItemComponent.java @@ -0,0 +1,40 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.utils.CustomVariables; + +import java.util.HashSet; +import java.util.Set; + +public class MainItemComponent implements Component { + public int uniqueId = 0; + public String itemIdentifier = ""; + public String libraryLink = ""; + public Set tags = new HashSet(); + private String customVars = ""; + public CustomVariables customVariables = new CustomVariables(); + public int entityType; + public boolean visible = true; + + public void setCustomVars(String key, String value) { + customVariables.setVariable(key, value); + setCustomVarString(customVariables.saveAsString()); + } + + public void removeCustomVars(String key) { + customVariables.removeVariable(key); + setCustomVarString(customVariables.saveAsString()); + } + + public String getCustomVarString() { + return customVars; + } + + public void setCustomVarString(String vars) { + customVars = vars; + if (customVariables.getCount() == 0) { + customVariables.loadFromString(customVars); + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NinePatchComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NinePatchComponent.java new file mode 100644 index 00000000..53dfd2bf --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NinePatchComponent.java @@ -0,0 +1,9 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.NinePatch; + +public class NinePatchComponent implements Component { + public String textureRegionName; + public NinePatch ninePatch; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NodeComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NodeComponent.java new file mode 100644 index 00000000..e2bfbcce --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/NodeComponent.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.SnapshotArray; + +public class NodeComponent implements Component { + public SnapshotArray children = new SnapshotArray(true, 1, Entity.class); + + public void removeChild(Entity entity) { + children.removeValue(entity, false); + } + + public void addChild(Entity entity) { + children.add(entity); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ParentNodeComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ParentNodeComponent.java new file mode 100644 index 00000000..15cbc9a6 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ParentNodeComponent.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; + +public class ParentNodeComponent implements Component { + public Entity parentEntity = null; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/PolygonComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/PolygonComponent.java new file mode 100644 index 00000000..3eeacdcc --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/PolygonComponent.java @@ -0,0 +1,52 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.math.Vector2; + +/** + * Created by azakhary on 7/2/2015. + */ +public class PolygonComponent implements Component { + public Vector2[][] vertices; + + public void makeRectangle(float width, float height) { + Vector2[] points = new Vector2[4]; + points[0] = new Vector2(0, 0); + points[1] = new Vector2(0, height); + points[2] = new Vector2(width, height); + points[3] = new Vector2(width, 0); + + vertices = new Vector2[1][4]; + vertices[0] = points; + } + + public void makeRectangle(float x, float y, float width, float height) // Overloaded Function to enable more flexibility when setting polygon + { + Vector2[] points = new Vector2[4]; + points[0] = new Vector2(x, y); + points[1] = new Vector2(x, y+height); + points[2] = new Vector2(x + width, y + height); + points[3] = new Vector2(x + width, y); + + vertices = new Vector2[1][4]; + vertices[0] = points; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/RemovableComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/RemovableComponent.java new file mode 100644 index 00000000..bd3f0a86 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/RemovableComponent.java @@ -0,0 +1,7 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; + +public interface RemovableComponent extends Component { + void onRemove(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScissorComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScissorComponent.java new file mode 100644 index 00000000..7150b25b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScissorComponent.java @@ -0,0 +1,10 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; + +public class ScissorComponent implements Component { + public float scissorX; + public float scissorY; + public float scissorWidth; + public float scissorHeight; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScriptComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScriptComponent.java new file mode 100644 index 00000000..ab4eb4f2 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ScriptComponent.java @@ -0,0 +1,40 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import com.badlogic.gdx.utils.reflect.ReflectionException; +import games.rednblack.editor.renderer.scripts.IScript; + +import java.util.Iterator; + +/** + * Created by azakhary on 6/19/2015. + */ +public class ScriptComponent implements Component { + + public Array scripts = new Array(); + + public void addScript(IScript script) { + scripts.add(script); + } + + public void addScript(String className) { + try { + IScript script = (IScript) ClassReflection.newInstance(ClassReflection.forName(className)); + addScript(script); + } catch (ReflectionException e) { + // well, if it's not there, then we don't care + } + } + + public void removeScript(Class className) { + Iterator i = scripts.iterator(); + while (i.hasNext()) { + IScript s = i.next(); + if(s.getClass().getName().equals(className)) { + i.remove(); + } + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ShaderComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ShaderComponent.java new file mode 100644 index 00000000..ae364802 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ShaderComponent.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; + +public class ShaderComponent implements Component { + public String shaderName; + private ShaderProgram shaderProgram = null; + + public void setShader(String name, ShaderProgram program) { + shaderName = name; + shaderProgram = program; + } + + public ShaderProgram getShader() { + return shaderProgram; + } + + public void clear() { + shaderName = null; + shaderProgram = null; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/SpineDataComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/SpineDataComponent.java new file mode 100644 index 00000000..d8816aad --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/SpineDataComponent.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; + +public class SpineDataComponent implements Component { + public String animationName = ""; + public String currentAnimationName = ""; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TextureRegionComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TextureRegionComponent.java new file mode 100644 index 00000000..85b0a4d9 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TextureRegionComponent.java @@ -0,0 +1,34 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.PolygonRegion; +import com.badlogic.gdx.graphics.g2d.PolygonSprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.EarClippingTriangulator; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.utils.PolygonUtils; + +public class TextureRegionComponent implements Component { + public String regionName = ""; + public TextureRegion region = null; + public boolean isRepeat = false; + public boolean isPolygon = false; + + // optional + public PolygonSprite polygonSprite = null; + + public void setPolygonSprite(PolygonComponent polygonComponent, float pixelToWorld) { + Vector2[] verticesArray = PolygonUtils.mergeTouchingPolygonsToOne(polygonComponent.vertices); + float[] vertices = new float[verticesArray.length*2]; + for(int i = 0; i < verticesArray.length; i++) { + vertices[i*2] = verticesArray[i].x*pixelToWorld; + vertices[i*2+1] = verticesArray[i].y*pixelToWorld; + } + + EarClippingTriangulator triangulator = new EarClippingTriangulator(); + short[] triangles = triangulator.computeTriangles(vertices).toArray(); + + PolygonRegion polygonRegion = new PolygonRegion(region, vertices, triangles); + polygonSprite = new PolygonSprite(polygonRegion); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TintComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TintComponent.java new file mode 100644 index 00000000..8d1f98d9 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TintComponent.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.Color; + +public class TintComponent implements Component { + public Color color = new Color(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TransformComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TransformComponent.java new file mode 100644 index 00000000..b7e9253c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/TransformComponent.java @@ -0,0 +1,50 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; + +public class TransformComponent implements Component { + public float x; + public float y; + public float scaleX = 1f; + public float scaleY = 1f; + public float rotation; + public float originX; + public float originY; + + private TransformComponent backup = null; + + public TransformComponent() { + + } + + public TransformComponent(TransformComponent component) { + x = component.x; + y = component.y; + scaleX = component.scaleX; + scaleY = component.scaleY; + rotation = component.rotation; + originX = component.originX; + originY = component.originY; + } + + public void disableTransform() { + backup = new TransformComponent(this); + x = 0; + y = 0; + scaleX = 1f; + scaleY = 1f; + rotation = 0; + } + + public void enableTransform() { + if(backup == null) return; + x = backup.x; + y = backup.y; + scaleX = backup.scaleX; + scaleY = backup.scaleY; + rotation = backup.rotation; + originX = backup.originX; + originY = backup.originY; + backup = null; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ViewPortComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ViewPortComponent.java new file mode 100644 index 00000000..b11df750 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ViewPortComponent.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.viewport.Viewport; + +public class ViewPortComponent implements Component { + public Viewport viewPort; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ZIndexComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ZIndexComponent.java new file mode 100644 index 00000000..71ef94f3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/ZIndexComponent.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.renderer.components; + +import com.badlogic.ashley.core.Component; + +public class ZIndexComponent implements Component { + private int zIndex = 0; + public boolean needReOrder = false; + public String layerName = ""; + public int layerIndex; + + public int getZIndex() { + return zIndex; + } + + public void setZIndex(int zIndex) { + this.zIndex = zIndex; + needReOrder = true; + } + + public int getGlobalZIndex() { + return layerIndex + zIndex; + } +} \ No newline at end of file diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/additional/ButtonComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/additional/ButtonComponent.java new file mode 100644 index 00000000..7bb979e1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/additional/ButtonComponent.java @@ -0,0 +1,47 @@ +package games.rednblack.editor.renderer.components.additional; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Array; + +/** + * Created by azakhary on 8/1/2015. + */ +public class ButtonComponent implements Component { + + public boolean isTouched = false; + + private Array listeners = new Array(); + + public interface ButtonListener { + public void touchUp(); + public void touchDown(); + public void clicked(); + } + + public void addListener(ButtonListener listener) { + listeners.add(listener); + } + + public void removeListener(ButtonListener listener) { + listeners.removeValue(listener, true); + } + + public void clearListeners() { + listeners.clear(); + } + + public void setTouchState(boolean isTouched) { + if(!this.isTouched && isTouched) { + for(int i = 0; i < listeners.size; i++) { + listeners.get(i).touchDown(); + } + } + if(this.isTouched && !isTouched) { + for(int i = 0; i < listeners.size; i++) { + listeners.get(i).touchUp(); + listeners.get(i).clicked(); + } + } + this.isTouched = isTouched; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/label/LabelComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/label/LabelComponent.java new file mode 100644 index 00000000..19b6e458 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/label/LabelComponent.java @@ -0,0 +1,152 @@ +package games.rednblack.editor.renderer.components.label; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFontCache; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.StringBuilder; + +public class LabelComponent implements Component { + public LabelStyle style; + public final GlyphLayout layout = new GlyphLayout(); + public BitmapFontCache cache; + + public final StringBuilder text = new StringBuilder(); + public String fontName; + public int fontSize; + public int labelAlign = Align.center; + public int lineAlign = Align.center; + public boolean wrap; + public float fontScaleX = 1f; + public float fontScaleY = 1f; + + + public LabelComponent (CharSequence text, Skin skin) { + this(text, skin.get(LabelStyle.class)); + } + + public LabelComponent (CharSequence text, Skin skin, String styleName) { + this(text, skin.get(styleName, LabelStyle.class)); + } + + /** Creates a label, using a {@link LabelStyle} that has a BitmapFont with the specified name from the skin and the specified + * color. */ + public LabelComponent (CharSequence text, Skin skin, String fontName, Color color) { + this(text, new LabelStyle(skin.getFont(fontName), color)); + } + + /** Creates a label, using a {@link LabelStyle} that has a BitmapFont with the specified name and the specified color from the + * skin. */ + public LabelComponent (CharSequence text, Skin skin, String fontName, String colorName) { + this(text, new LabelStyle(skin.getFont(fontName), skin.getColor(colorName))); + } + + public LabelComponent (CharSequence text, LabelStyle style) { + if (text != null) this.text.append(text); + setStyle(style); + } + + public void setStyle (LabelStyle style) { + if (style == null) throw new IllegalArgumentException("style cannot be null."); + if (style.font == null) throw new IllegalArgumentException("Missing LabelStyle font."); + this.style = style; + cache = style.font.newFontCache(); + } + + public LabelStyle getStyle () { + return style; + } + + /** @param newText May be null, "" will be used. */ + public void setText (CharSequence newText) { + if (newText == null) newText = ""; + if (newText instanceof StringBuilder) { + if (text.equals(newText)) return; + text.setLength(0); + text.append((StringBuilder)newText); + } else { + if (textEquals(newText)) return; + text.setLength(0); + text.append(newText); + } + } + + public boolean textEquals (CharSequence other) { + int length = text.length; + char[] chars = text.chars; + if (length != other.length()) return false; + for (int i = 0; i < length; i++) + if (chars[i] != other.charAt(i)) return false; + return true; + } + + public StringBuilder getText () { + return text; + } + + public GlyphLayout getGlyphLayout () { + return layout; + } + + /** If false, the text will only wrap where it contains newlines (\n). The preferred size of the label will be the text bounds. + * If true, the text will word wrap using the width of the label. The preferred width of the label will be 0, it is expected + * that the something external will set the width of the label. Wrapping will not occur when ellipsis is true. Default is + * false. + *

+ * When wrap is enabled, the label's preferred height depends on the width of the label. In some cases the parent of the label + * will need to layout twice: once to set the width of the label and a second time to adjust to the label's new preferred + * height. */ + public void setWrap (boolean wrap) { + this.wrap = wrap; + } + + /** @param alignment Aligns each line of text horizontally and all the text vertically. + * @see Align */ + public void setAlignment (int alignment) { + setAlignment(alignment, alignment); + } + + /** @param labelAlign Aligns all the text with the label widget. + * @param lineAlign Aligns each line of text (left, right, or center). + * @see Align */ + public void setAlignment (int labelAlign, int lineAlign) { + this.labelAlign = labelAlign; + + if ((lineAlign & Align.left) != 0) + this.lineAlign = Align.left; + else if ((lineAlign & Align.right) != 0) + this.lineAlign = Align.right; + else + this.lineAlign = Align.center; + } + + public void setFontScale (float fontScale) { + this.fontScaleX = fontScale; + this.fontScaleY = fontScale; + } + + public void setFontScale (float fontScaleX, float fontScaleY) { + this.fontScaleX = fontScaleX; + this.fontScaleY = fontScaleY; + } + + public float getFontScaleX () { + return fontScaleX; + } + + public void setFontScaleX (float fontScaleX) { + this.fontScaleX = fontScaleX; + } + + public float getFontScaleY () { + return fontScaleY; + } + + public void setFontScaleY (float fontScaleY) { + this.fontScaleY = fontScaleY; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightBodyComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightBodyComponent.java new file mode 100644 index 00000000..fa9dcd07 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightBodyComponent.java @@ -0,0 +1,38 @@ +package games.rednblack.editor.renderer.components.light; + +import box2dLight.ChainLight; +import games.rednblack.editor.renderer.components.RemovableComponent; + +public class LightBodyComponent implements RemovableComponent { + + public float[] color; + public int rays; + public float distance; + public int rayDirection; + public float softnessLength; + public boolean isStatic; + public boolean isXRay; + public boolean isSoft; + public boolean isActive; + + public ChainLight lightObject; + public boolean needToRefreshLight = false; + + public LightBodyComponent() { + color = new float[]{1f, 1f, 1f, 1f}; + rays = 3; + distance = 30; + rayDirection = 1; + softnessLength = 1f; + isStatic = false; + isXRay = false; + isSoft = true; + isActive = true; + } + + @Override + public void onRemove() { + lightObject.remove(); + lightObject = null; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightObjectComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightObjectComponent.java new file mode 100644 index 00000000..2d793be6 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/light/LightObjectComponent.java @@ -0,0 +1,50 @@ +package games.rednblack.editor.renderer.components.light; + +import box2dLight.ConeLight; +import box2dLight.Light; + +import box2dLight.PointLight; +import box2dLight.RayHandler; +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.Color; +import games.rednblack.editor.renderer.data.LightVO; +import games.rednblack.editor.renderer.data.LightVO.LightType; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; + +public class LightObjectComponent implements Component { + private LightType type; + + public int rays = 12; + public float distance = 300; + public float directionDegree = 0; + public float coneDegree = 30; + public float softnessLength = 1f; + public boolean isStatic = true; + public boolean isXRay = true; + public Light lightObject = null; + public boolean isSoft = true; + public boolean isActive = true; + + public LightObjectComponent(LightType type) { + this.type = type; + } + + public LightType getType(){ + return type; + } + + public Light rebuildRays(RayHandler rayHandler) { + if (rayHandler == null) + return lightObject; + + lightObject.remove(); + + if (getType() == LightVO.LightType.POINT) { + lightObject = new PointLight(rayHandler, rays); + } else { + lightObject = new ConeLight(rayHandler, rays, Color.WHITE, 1, 0, 0, 0, 0); + } + + return lightObject; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/particle/ParticleComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/particle/ParticleComponent.java new file mode 100644 index 00000000..a5f50858 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/particle/ParticleComponent.java @@ -0,0 +1,26 @@ +package games.rednblack.editor.renderer.components.particle; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; + +public class ParticleComponent implements Component { + public String particleName = ""; + public ParticleEffect particleEffect; + public float worldMultiplyer = 1f; + private float scaleFactor = 1f; + + public void scaleEffect(float scale){ + scaleFactor = scale; + particleEffect.scaleEffect(scaleFactor*worldMultiplyer); + } + + public float getScaleFactor(){ + return scaleFactor; + } + + //please use this method to start effects for the scale to be applied + public void startEffect(){ + scaleEffect(scaleFactor); + particleEffect.start(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/physics/PhysicsBodyComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/physics/PhysicsBodyComponent.java new file mode 100644 index 00000000..b5044f8e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/physics/PhysicsBodyComponent.java @@ -0,0 +1,56 @@ +package games.rednblack.editor.renderer.components.physics; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.Filter; +import games.rednblack.editor.renderer.components.RemovableComponent; + +public class PhysicsBodyComponent implements RemovableComponent { + public int bodyType; + + public float mass; + public Vector2 centerOfMass; + public float rotationalInertia; + public float damping; + public float gravityScale; + + public boolean allowSleep; + public boolean awake; + public boolean bullet; + public boolean sensor; + + public float density; + public float friction; + public float restitution; + public Filter filter; + + public float centerX; + public float centerY; + + public Body body; + public boolean needToRefreshBody = false; + + public PhysicsBodyComponent() { + // putting default values + bodyType = 0; + mass = 1; + centerOfMass = new Vector2(0, 0); + rotationalInertia = 0; + damping = 0; + gravityScale = 0; + allowSleep = true; + sensor = false; + awake = true; + bullet = false; + density = 1; + friction = 1; + restitution = 0; + filter = new Filter(); + } + + @Override + public void onRemove() { + body.getWorld().destroyBody(body); + body = null; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/AnimationComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/AnimationComponent.java new file mode 100644 index 00000000..68a5fc5a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/AnimationComponent.java @@ -0,0 +1,10 @@ +package games.rednblack.editor.renderer.components.sprite; + +import java.util.HashMap; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.Animation; + +public class AnimationComponent implements Component { + public HashMap animations = new HashMap(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationComponent.java new file mode 100644 index 00000000..c890312e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationComponent.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.renderer.components.sprite; + +import java.util.HashMap; +import java.util.Map; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.Animation; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.data.FrameRange; + +public class SpriteAnimationComponent implements Component { + public String animationName = ""; + public int fps = 24; + public HashMap frameRangeMap = new HashMap(); + public String currentAnimation; + public Animation.PlayMode playMode = Animation.PlayMode.LOOP; + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationStateComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationStateComponent.java new file mode 100644 index 00000000..12d59c94 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/sprite/SpriteAnimationStateComponent.java @@ -0,0 +1,69 @@ +package games.rednblack.editor.renderer.components.sprite; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.Animation; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.data.FrameRange; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SpriteAnimationStateComponent implements Component { + public Array allRegions; + public Animation currentAnimation; + public float time = 0.0f; + + public boolean paused = false; + + public SpriteAnimationStateComponent(Array allRegions) { + this.allRegions = sortAndGetRegions(allRegions); + } + + public Animation get() { + return currentAnimation; + } + + public void set(SpriteAnimationComponent sac) { + set(sac.frameRangeMap.get(sac.currentAnimation), sac.fps, sac.playMode); + } + + public void set(FrameRange range, int fps, Animation.PlayMode playMode) { + Array textureRegions = new Array(range.endFrame - range.startFrame + 1); + for (int r = range.startFrame; r <= range.endFrame; r++) { + textureRegions.add(allRegions.get(r)); + } + currentAnimation = new Animation(1f/fps, textureRegions, playMode); + time = 0.0f; + } + + private Array sortAndGetRegions(Array regions) { + regions.sort(new SortRegionsComparator()); + + return regions; + } + + private class SortRegionsComparator implements Comparator { + @Override + public int compare(TextureAtlas.AtlasRegion o1, TextureAtlas.AtlasRegion o2) { + // int index1 = regNameToFrame(o1.name); + // int index2 = regNameToFrame(o2.name); + return o1.index < o2.index ? -1 : o1.index == o2.index ? 0 : 1; + } + } + + private int regNameToFrame(String name) { + final Pattern lastIntPattern = Pattern.compile("[^0-9]+([0-9]+)$"); + Matcher matcher = lastIntPattern.matcher(name); + if (matcher.find()) { + String someNumberStr = matcher.group(1); + return Integer.parseInt(someNumberStr); + } + throw new RuntimeException( + "Frame name should be something like this '*0001', but not " + + name + "."); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterComponent.java new file mode 100644 index 00000000..ce85f563 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterComponent.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.components.spriter; + +import java.util.ArrayList; + +import com.badlogic.ashley.core.Component; +import com.brashmonkey.spriter.Data; +import com.brashmonkey.spriter.Player; + +public class SpriterComponent implements Component { + public Player player; + public Data data; + public ArrayList animations = new ArrayList(); + public ArrayList entities = new ArrayList(); + public int currentEntityIndex = 0; + public int currentAnimationIndex; + + public int entity; + public int animation; + public String animationName = ""; + public float scale = 1f; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterDrawerComponent.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterDrawerComponent.java new file mode 100644 index 00000000..deca7a72 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/components/spriter/SpriterDrawerComponent.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.components.spriter; + +import com.badlogic.ashley.core.Component; +import games.rednblack.editor.renderer.utils.LibGdxDrawer; + +public class SpriterDrawerComponent implements Component { + public LibGdxDrawer drawer; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ColorPrimitiveVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ColorPrimitiveVO.java new file mode 100644 index 00000000..a20dd395 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ColorPrimitiveVO.java @@ -0,0 +1,33 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.data; + +/** + * Created by azakhary on 10/21/2015. + */ +public class ColorPrimitiveVO extends MainItemVO { + + public ColorPrimitiveVO() { + super(); + } + + public ColorPrimitiveVO(ColorPrimitiveVO vo) { + super(vo); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeItemVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeItemVO.java new file mode 100644 index 00000000..522b1b86 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeItemVO.java @@ -0,0 +1,78 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Rectangle; +import games.rednblack.editor.renderer.components.CompositeTransformComponent; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +import java.util.ArrayList; + +public class CompositeItemVO extends MainItemVO { + + public CompositeVO composite; + + public float width; + public float height; + public boolean automaticResize = true; + public boolean scissorsEnabled = false; + + public CompositeItemVO() { + composite = new CompositeVO(); + } + + public CompositeItemVO(CompositeVO vo) { + composite = new CompositeVO(vo); + } + + public CompositeItemVO(CompositeItemVO vo) { + super(vo); + composite = new CompositeVO(vo.composite); + } + + public void update(CompositeItemVO vo) { + composite = new CompositeVO(vo.composite); + } + + public CompositeItemVO clone() { + CompositeItemVO tmp = new CompositeItemVO(); + tmp.composite = composite; + tmp.itemName = itemName; + tmp.layerName = layerName; + tmp.rotation = rotation; + tmp.tint = tint; + tmp.x = x; + tmp.y = y; + tmp.zIndex = zIndex; + + tmp.width = width; + tmp.height = height; + + return tmp; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + composite = new CompositeVO(); + composite.loadFromEntity(entity); + + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + CompositeTransformComponent compositeTransformComponent = ComponentRetriever.get(entity, CompositeTransformComponent.class); + + width = dimensionsComponent.width; + height = dimensionsComponent.height; + automaticResize = compositeTransformComponent.automaticResize; + scissorsEnabled = compositeTransformComponent.scissorsEnabled; + } + + public void cleanIds() { + uniqueId = -1; + ArrayList items = composite.getAllItems(); + for(MainItemVO subItem: items) { + subItem.uniqueId = -1; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeVO.java new file mode 100644 index 00000000..a6975260 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CompositeVO.java @@ -0,0 +1,405 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.FontSizePair; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; + +public class CompositeVO { + + public ArrayList sImages = new ArrayList(1); + public ArrayList sImage9patchs = new ArrayList(1); + public ArrayList sTextBox = new ArrayList(1); + public ArrayList sLabels = new ArrayList(1); + public ArrayList sComposites = new ArrayList(1); + public ArrayList sSelectBoxes = new ArrayList(1); + public ArrayList sParticleEffects = new ArrayList(1); + public ArrayList sLights = new ArrayList(1); + public ArrayList sSpineAnimations = new ArrayList(1); + public ArrayList sSpriteAnimations = new ArrayList(1); + public ArrayList sSpriterAnimations = new ArrayList(1); + public ArrayList sColorPrimitives = new ArrayList(1); + + public ArrayList layers = new ArrayList(); + + public CompositeVO() { + + } + + public CompositeVO(CompositeVO vo) { + + if (vo == null) return; + + update(vo); + } + + public void update(CompositeVO vo) { + clear(); + for (int i = 0; i < vo.sImages.size(); i++) { + sImages.add(new SimpleImageVO(vo.sImages.get(i))); + } + for (int i = 0; i < vo.sImage9patchs.size(); i++) { + sImage9patchs.add(new Image9patchVO(vo.sImage9patchs.get(i))); + } + for (int i = 0; i < vo.sTextBox.size(); i++) { + sTextBox.add(new TextBoxVO(vo.sTextBox.get(i))); + } + for (int i = 0; i < vo.sLabels.size(); i++) { + sLabels.add(new LabelVO(vo.sLabels.get(i))); + } + for (int i = 0; i < vo.sComposites.size(); i++) { + sComposites.add(new CompositeItemVO(vo.sComposites.get(i))); + } + for (int i = 0; i < vo.sSelectBoxes.size(); i++) { + sSelectBoxes.add(new SelectBoxVO(vo.sSelectBoxes.get(i))); + } + + for (int i = 0; i < vo.sParticleEffects.size(); i++) { + sParticleEffects.add(new ParticleEffectVO(vo.sParticleEffects.get(i))); + } + + for (int i = 0; i < vo.sLights.size(); i++) { + sLights.add(new LightVO(vo.sLights.get(i))); + } + + for (int i = 0; i < vo.sSpineAnimations.size(); i++) { + sSpineAnimations.add(new SpineVO(vo.sSpineAnimations.get(i))); + } + + for (int i = 0; i < vo.sSpriteAnimations.size(); i++) { + sSpriteAnimations.add(new SpriteAnimationVO(vo.sSpriteAnimations.get(i))); + } + + for (int i = 0; i < vo.sSpriterAnimations.size(); i++) { + sSpriterAnimations.add(new SpriterVO(vo.sSpriterAnimations.get(i))); + } + + for (int i = 0; i < vo.sColorPrimitives.size(); i++) { + sColorPrimitives.add(new ColorPrimitiveVO(vo.sColorPrimitives.get(i))); + } + + layers.clear(); + for (int i = 0; i < vo.layers.size(); i++) { + layers.add(new LayerItemVO(vo.layers.get(i))); + } + + } + + public void addItem(MainItemVO vo) { + String className = vo.getClass().getSimpleName(); + + if (className.equals("SimpleImageVO")) { + sImages.add((SimpleImageVO) vo); + } + if (className.equals("Image9patchVO")) { + sImage9patchs.add((Image9patchVO) vo); + } + if (className.equals("TextBoxVO")) { + sTextBox.add((TextBoxVO) vo); + } + if (className.equals("LabelVO")) { + sLabels.add((LabelVO) vo); + } + if (className.equals("CompositeItemVO")) { + sComposites.add((CompositeItemVO) vo); + } + if (className.equals("SelectBoxVO")) { + sSelectBoxes.add((SelectBoxVO) vo); + } + if (className.equals("ParticleEffectVO")) { + sParticleEffects.add((ParticleEffectVO) vo); + } + if (className.equals("LightVO")) { + sLights.add((LightVO) vo); + } + if (className.equals("SpineVO")) { + sSpineAnimations.add((SpineVO) vo); + } + if (className.equals("SpriterVO")) { + sSpriterAnimations.add((SpriterVO) vo); + } + if (className.equals("SpriteAnimationVO")) { + sSpriteAnimations.add((SpriteAnimationVO) vo); + } + if(className.equals("ColorPrimitiveVO")) { + sColorPrimitives.add((ColorPrimitiveVO) vo); + } + } + + public void removeItem(MainItemVO vo) { + String className = vo.getClass().getSimpleName(); + if (className.equals("SimpleImageVO")) { + sImages.remove((SimpleImageVO) vo); + } + if (className.equals("Image9patchVO")) { + sImage9patchs.remove((Image9patchVO) vo); + } + if (className.equals("TextBoxVO")) { + sTextBox.remove((TextBoxVO) vo); + } + if (className.equals("LabelVO")) { + sLabels.remove((LabelVO) vo); + } + if (className.equals("CompositeItemVO")) { + sComposites.remove((CompositeItemVO) vo); + } + if (className.equals("SelectBoxVO")) { + sSelectBoxes.remove((SelectBoxVO) vo); + } + if (className.equals("ParticleEffectVO")) { + sParticleEffects.remove((ParticleEffectVO) vo); + } + if (className.equals("LightVO")) { + sLights.remove((LightVO) vo); + } + if (className.equals("SpineVO")) { + sSpineAnimations.remove((SpineVO) vo); + } + if (className.equals("SpriteAnimationVO")) { + sSpriteAnimations.remove((SpriteAnimationVO) vo); + } + if (className.equals("SpriterVO")) { + sSpriterAnimations.remove((SpriterVO) vo); + } + if(className.equals("ColorPrimitiveVO")) { + sColorPrimitives.remove((ColorPrimitiveVO) vo); + } + } + + public void clear() { + sImages.clear(); + sTextBox.clear(); + sLabels.clear(); + sComposites.clear(); + sSelectBoxes.clear(); + sParticleEffects.clear(); + sLights.clear(); + sSpineAnimations.clear(); + sSpriteAnimations.clear(); + sSpriterAnimations.clear(); + sColorPrimitives.clear(); + } + + public boolean isEmpty() { + return sComposites.isEmpty() && + sImage9patchs.isEmpty() && + sImages.isEmpty() && + sSpriteAnimations.isEmpty() && + sLabels.isEmpty() && + sLights.isEmpty() && + sParticleEffects.isEmpty() && + sSpriteAnimations.isEmpty() && + sSpriterAnimations.isEmpty() && + sSpineAnimations.isEmpty() && + sSelectBoxes.isEmpty() && + sTextBox.isEmpty() && + sColorPrimitives.isEmpty(); + } + + public String[] getRecursiveParticleEffectsList() { + HashSet list = new HashSet(); + for (ParticleEffectVO sParticleEffect : sParticleEffects) { + list.add(sParticleEffect.particleName); + } + for (CompositeItemVO sComposite : sComposites) { + String[] additionalList = sComposite.composite.getRecursiveParticleEffectsList(); + Collections.addAll(list, additionalList); + } + String[] finalList = new String[list.size()]; + list.toArray(finalList); + + return finalList; + } + + public String[] getRecursiveSpineAnimationList() { + HashSet list = new HashSet(); + for (SpineVO sSpineAnimation : sSpineAnimations) { + list.add(sSpineAnimation.animationName); + } + for (CompositeItemVO sComposite : sComposites) { + String[] additionalList = sComposite.composite.getRecursiveSpineAnimationList(); + Collections.addAll(list, additionalList); + } + String[] finalList = new String[list.size()]; + list.toArray(finalList); + + return finalList; + } + + public String[] getRecursiveSpriteAnimationList() { + HashSet list = new HashSet(); + for (SpriteAnimationVO sSpriteAnimation : sSpriteAnimations) { + list.add(sSpriteAnimation.animationName); + } + for (CompositeItemVO sComposite : sComposites) { + String[] additionalList = sComposite.composite.getRecursiveSpriteAnimationList(); + Collections.addAll(list, additionalList); + } + String[] finalList = new String[list.size()]; + list.toArray(finalList); + + return finalList; + } + + public String[] getRecursiveSpriterAnimationList() { + HashSet list = new HashSet(); + for (SpriterVO sSpriterAnimation : sSpriterAnimations) { + list.add(sSpriterAnimation.animationName); + } + for (CompositeItemVO sComposite : sComposites) { + String[] additionalList = sComposite.composite.getRecursiveSpriterAnimationList(); + Collections.addAll(list, additionalList); + } + String[] finalList = new String[list.size()]; + list.toArray(finalList); + + return finalList; + } + + public FontSizePair[] getRecursiveFontList() { + HashSet list = new HashSet(); + for (LabelVO sLabel : sLabels) { + list.add(new FontSizePair(sLabel.style.isEmpty() ? "arial" : sLabel.style, sLabel.size == 0 ? 12 : sLabel.size)); + } + for (CompositeItemVO sComposite : sComposites) { + FontSizePair[] additionalList = sComposite.composite.getRecursiveFontList(); + Collections.addAll(list, additionalList); + } + FontSizePair[] finalList = new FontSizePair[list.size()]; + list.toArray(finalList); + + return finalList; + } + + public String[] getRecursiveShaderList() { + HashSet list = new HashSet(); + for (MainItemVO item : getAllItems()) { + if(item.shaderName != null && !item.shaderName.isEmpty()){ + list.add(item.shaderName); + } + } + String[] finalList = new String[list.size()]; + list.toArray(finalList); + return finalList; + } + + public ArrayList getAllItems() { + ArrayList itemsList = new ArrayList(); + itemsList = getAllItemsRecursive(itemsList, this); + + return itemsList; + } + + private ArrayList getAllItemsRecursive(ArrayList itemsList, CompositeVO compositeVo) { + for(MainItemVO vo: compositeVo.sImage9patchs) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sImages) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sLabels) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sLights) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sParticleEffects) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sSelectBoxes) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sSpineAnimations) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sSpriteAnimations) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sSpriterAnimations) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sTextBox) { + itemsList.add(vo); + } + for(MainItemVO vo: compositeVo.sColorPrimitives) { + itemsList.add(vo); + } + for(CompositeItemVO vo: compositeVo.sComposites) { + itemsList = getAllItemsRecursive(itemsList,vo.composite); + itemsList.add(vo); + } + + return itemsList; + } + + public void loadFromEntity(Entity compositeEntity) { + NodeComponent nodeComponent = compositeEntity.getComponent(NodeComponent.class); + ComponentMapper mainItemComponentMapper = ComponentMapper.getFor(MainItemComponent.class); + ComponentMapper layerMainItemComponentComponentMapper = ComponentMapper.getFor(LayerMapComponent.class); + + if(nodeComponent == null) return; + for(Entity entity: nodeComponent.children) { + int entityType = mainItemComponentMapper.get(entity).entityType; + if(entityType == EntityFactory.COMPOSITE_TYPE) { + CompositeItemVO vo = new CompositeItemVO(); + vo.loadFromEntity(entity); + sComposites.add(vo); + } + if(entityType == EntityFactory.IMAGE_TYPE) { + SimpleImageVO vo = new SimpleImageVO(); + vo.loadFromEntity(entity); + sImages.add(vo); + } + if(entityType == EntityFactory.NINE_PATCH) { + Image9patchVO vo = new Image9patchVO(); + vo.loadFromEntity(entity); + sImage9patchs.add(vo); + } + if(entityType == EntityFactory.LABEL_TYPE) { + LabelVO vo = new LabelVO(); + vo.loadFromEntity(entity); + sLabels.add(vo); + } + if(entityType == EntityFactory.PARTICLE_TYPE) { + ParticleEffectVO vo = new ParticleEffectVO(); + vo.loadFromEntity(entity); + sParticleEffects.add(vo); + } + if(entityType == EntityFactory.SPRITE_TYPE) { + SpriteAnimationVO vo = new SpriteAnimationVO(); + vo.loadFromEntity(entity); + sSpriteAnimations.add(vo); + } + if(entityType == EntityFactory.SPRITER_TYPE) { + SpriterVO vo = new SpriterVO(); + vo.loadFromEntity(entity); + sSpriterAnimations.add(vo); + } + if(entityType == EntityFactory.SPINE_TYPE) { + SpineVO vo = new SpineVO(); + vo.loadFromEntity(entity); + sSpineAnimations.add(vo); + } + if(entityType == EntityFactory.LIGHT_TYPE) { + LightVO vo = new LightVO(); + vo.loadFromEntity(entity); + sLights.add(vo); + } + if(entityType == EntityFactory.COLOR_PRIMITIVE) { + ColorPrimitiveVO vo = new ColorPrimitiveVO(); + vo.loadFromEntity(entity); + sColorPrimitives.add(vo); + } + } + + LayerMapComponent layerMapComponent = layerMainItemComponentComponentMapper.get(compositeEntity); + layers = layerMapComponent.getLayers(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CoreActorData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CoreActorData.java new file mode 100644 index 00000000..f161b020 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/CoreActorData.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.data; + +import games.rednblack.editor.renderer.utils.CustomVariables; + +import java.util.Map; + +/** + * Created by Osman on 20.08.2015. + * + */ +public class CoreActorData { + public String id = null; + public String[] tags = null; + public int layerIndex = 0; + public CustomVariables customVars = null; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Essentials.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Essentials.java new file mode 100644 index 00000000..5b5c2bbc --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Essentials.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.data; + +import box2dLight.RayHandler; + +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +public class Essentials { + + public RayHandler rayHandler; + //public SkeletonRenderer skeletonRenderer; + public IResourceRetriever rm; + public World world; + public boolean physicsStopped = false; + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/FrameRange.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/FrameRange.java new file mode 100644 index 00000000..776cbc37 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/FrameRange.java @@ -0,0 +1,20 @@ +package games.rednblack.editor.renderer.data; + +/** + * Created by CyberJoe on 6/18/2015. + */ +public class FrameRange { + public String name; + public int startFrame; + public int endFrame; + + public FrameRange() { + + } + + public FrameRange(String name, int startFrame, int endFrame) { + this.name = name; + this.startFrame = startFrame; + this.endFrame = endFrame; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Image9patchVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Image9patchVO.java new file mode 100644 index 00000000..424c1c33 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/Image9patchVO.java @@ -0,0 +1,36 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.NinePatchComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; + +public class Image9patchVO extends MainItemVO { + + public String imageName = ""; + public float width = 0; + public float height = 0; + + public Image9patchVO() { + super(); + } + + public Image9patchVO(Image9patchVO vo) { + super(vo); + imageName = new String(vo.imageName); + width = vo.width; + height = vo.height; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + NinePatchComponent ninePatchComponent = entity.getComponent(NinePatchComponent.class); + DimensionsComponent dimensionsComponent = entity.getComponent(DimensionsComponent.class); + imageName = ninePatchComponent.textureRegionName; + + width = dimensionsComponent.width; + height = dimensionsComponent.height; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java new file mode 100644 index 00000000..6d6e4267 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java @@ -0,0 +1,48 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.label.LabelComponent; + +public class LabelVO extends MainItemVO { + + public String text = "Label"; + public String style = ""; + public int size; + public int align; + + public float width = 0; + public float height = 0; + + public boolean wrap = false; + + public LabelVO() { + super(); + } + + public LabelVO(LabelVO vo) { + super(vo); + text = new String(vo.text); + style = new String(vo.style); + size = vo.size; + align = vo.align; + width = vo.width; + height = vo.height; + wrap = vo.wrap; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + LabelComponent labelComponent = entity.getComponent(LabelComponent.class); + DimensionsComponent dimensionsComponent = entity.getComponent(DimensionsComponent.class); + text = labelComponent.getText().toString(); + style = labelComponent.fontName; + size = labelComponent.fontSize; + align = labelComponent.labelAlign; + wrap = labelComponent.wrap; + + width = dimensionsComponent.width; + height = dimensionsComponent.height; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LayerItemVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LayerItemVO.java new file mode 100644 index 00000000..ead67ce2 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LayerItemVO.java @@ -0,0 +1,31 @@ +package games.rednblack.editor.renderer.data; + +public class LayerItemVO { + + public String layerName = ""; + public boolean isLocked = false; + public boolean isVisible = false; + + public LayerItemVO() { + + } + + public LayerItemVO(String name) { + layerName = new String(name); + isVisible = true; + } + + public LayerItemVO(LayerItemVO vo) { + layerName = new String(vo.layerName); + isLocked = vo.isLocked; + isVisible = vo.isVisible; + } + + public static LayerItemVO createDefault() { + LayerItemVO layerItemVO = new LayerItemVO(); + layerItemVO.layerName = "Default"; + layerItemVO.isVisible = true; + return layerItemVO; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightBodyDataVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightBodyDataVO.java new file mode 100644 index 00000000..537f8914 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightBodyDataVO.java @@ -0,0 +1,43 @@ +package games.rednblack.editor.renderer.data; + +import games.rednblack.editor.renderer.components.light.LightBodyComponent; + +public class LightBodyDataVO { + public float[] color; + public int rays; + public float distance; + public int rayDirection; + public float softnessLength; + public boolean isStatic; + public boolean isXRay; + public boolean isSoft; + public boolean isActive; + + public LightBodyDataVO() { + color = new float[]{1f, 1f, 1f, 1f}; + } + + public LightBodyDataVO(LightBodyDataVO vo){ + color = vo.color.clone(); + rays = vo.rays; + distance = vo.distance; + rayDirection = vo.rayDirection; + softnessLength = vo.softnessLength; + isStatic = vo.isStatic; + isXRay = vo.isXRay; + isSoft = vo.isSoft; + isActive = vo.isActive; + } + + public void loadFromComponent(LightBodyComponent lightComponent) { + color = lightComponent.color.clone(); + rays = lightComponent.rays; + distance = lightComponent.distance; + rayDirection = lightComponent.rayDirection; + softnessLength = lightComponent.softnessLength; + isStatic = lightComponent.isStatic; + isXRay = lightComponent.isXRay; + isSoft = lightComponent.isSoft; + isActive = lightComponent.isActive; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightVO.java new file mode 100644 index 00000000..a541ed0a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightVO.java @@ -0,0 +1,59 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; + +public class LightVO extends MainItemVO { + //public int itemId = -1; + public static enum LightType {POINT, CONE} + public LightType type; + public int rays = 12; + public float distance = 300; + public float directionDegree = 0; + public float coneDegree = 30; + public float softnessLength = -1f; + public boolean isStatic = true; + public boolean isXRay = true; + public boolean isSoft = true; + public boolean isActive = true; + + public LightVO() { + tint = new float[4]; + tint[0] = 1f; + tint[1] = 1f; + tint[2] = 1f; + tint[3] = 1f; + } + + public LightVO(LightVO vo) { + super(vo); + type = vo.type; + rays = vo.rays; + distance = vo.distance; + directionDegree = vo.directionDegree; + coneDegree = vo.coneDegree; + isStatic = vo.isStatic; + isXRay = vo.isXRay; + softnessLength = vo.softnessLength; + isActive = vo.isActive; + isSoft = vo.isSoft; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + LightObjectComponent lightObjectComponent = entity.getComponent(LightObjectComponent.class); + type = lightObjectComponent.getType(); + rays = lightObjectComponent.rays; + distance = lightObjectComponent.distance; + directionDegree = lightObjectComponent.directionDegree; + coneDegree = lightObjectComponent.coneDegree; + isStatic = lightObjectComponent.isStatic; + isXRay = lightObjectComponent.isXRay; + softnessLength = lightObjectComponent.softnessLength; + isSoft = lightObjectComponent.isSoft; + isActive = lightObjectComponent.isActive; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightsPropertiesVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightsPropertiesVO.java new file mode 100644 index 00000000..2f781a17 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LightsPropertiesVO.java @@ -0,0 +1,32 @@ +package games.rednblack.editor.renderer.data; + +public class LightsPropertiesVO { + public boolean enabled; + public float[] ambientColor; + public int blurNum; + public String lightType; //DIFFUSE, DIRECTIONAL + + public int directionalRays; + public float directionalDegree; + public float[] directionalColor; + + public LightsPropertiesVO() { + blurNum = 3; + lightType = "DIFFUSE"; + enabled = false; + directionalRays = 12; + directionalDegree = 0; + ambientColor = new float[]{1f, 1f, 1f, 1f}; + directionalColor = new float[]{1f, 1f, 1f, 1f}; + } + + public LightsPropertiesVO(LightsPropertiesVO lightsPropertiesVO) { + this.enabled = lightsPropertiesVO.enabled; + this.blurNum = lightsPropertiesVO.blurNum; + this.lightType = lightsPropertiesVO.lightType; + this.directionalRays = lightsPropertiesVO.directionalRays; + this.directionalDegree = lightsPropertiesVO.directionalDegree; + this.ambientColor = lightsPropertiesVO.ambientColor.clone(); + this.directionalColor = lightsPropertiesVO.directionalColor.clone(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/MainItemVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/MainItemVO.java new file mode 100644 index 00000000..8058642a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/MainItemVO.java @@ -0,0 +1,124 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; + +import java.util.Arrays; + + +public class MainItemVO { + public int uniqueId = -1; + public String itemIdentifier = ""; + public String itemName = ""; + public String[] tags = null; + public String customVars = ""; + public float x; + public float y; + public float scaleX = 1f; + public float scaleY = 1f; + public float originX = Float.NaN; + public float originY = Float.NaN; + public float rotation; + public int zIndex = 0; + public String layerName = ""; + public float[] tint = {1, 1, 1, 1}; + + public String shaderName = ""; + + public ShapeVO shape = null; + public PhysicsBodyDataVO physics = null; + public LightBodyDataVO light = null; + + public MainItemVO() { + + } + + public MainItemVO(MainItemVO vo) { + uniqueId = vo.uniqueId; + itemIdentifier = new String(vo.itemIdentifier); + itemName = new String(vo.itemName); + if(vo.tags != null) tags = Arrays.copyOf(vo.tags, vo.tags.length); + customVars = new String(vo.customVars); + x = vo.x; + y = vo.y; + rotation = vo.rotation; + zIndex = vo.zIndex; + layerName = new String(vo.layerName); + if(vo.tint != null) tint = Arrays.copyOf(vo.tint, vo.tint.length); + scaleX = vo.scaleX; + scaleY = vo.scaleY; + originX = vo.originX; + originY = vo.originY; + + if(vo.shape != null) { + shape = vo.shape.clone(); + } + + if(vo.physics != null){ + physics = new PhysicsBodyDataVO(vo.physics); + } + + if(vo.light != null){ + light = new LightBodyDataVO(vo.light); + } + } + + public void loadFromEntity(Entity entity) { + MainItemComponent mainItemComponent = entity.getComponent(MainItemComponent.class); + TransformComponent transformComponent = entity.getComponent(TransformComponent.class); + TintComponent tintComponent = entity.getComponent(TintComponent.class); + ZIndexComponent zindexComponent = entity.getComponent(ZIndexComponent.class); + + uniqueId = mainItemComponent.uniqueId; + itemIdentifier = mainItemComponent.itemIdentifier; + itemName = mainItemComponent.libraryLink; + tags = new String[mainItemComponent.tags.size()]; + tags = mainItemComponent.tags.toArray(tags); + customVars = mainItemComponent.getCustomVarString(); + + x = transformComponent.x; + y = transformComponent.y; + scaleX = transformComponent.scaleX; + scaleY = transformComponent.scaleY; + originX = transformComponent.originX; + originY = transformComponent.originY; + rotation = transformComponent.rotation; + + layerName = zindexComponent.layerName; + + tint = new float[4]; + tint[0] = tintComponent.color.r; + tint[1] = tintComponent.color.g; + tint[2] = tintComponent.color.b; + tint[3] = tintComponent.color.a; + + zIndex = zindexComponent.getZIndex(); + + /** + * Secondary components + */ + PolygonComponent polygonComponent = entity.getComponent(PolygonComponent.class); + if(polygonComponent != null && polygonComponent.vertices != null) { + shape = new ShapeVO(); + shape.polygons = polygonComponent.vertices; + } + PhysicsBodyComponent physicsComponent = entity.getComponent(PhysicsBodyComponent.class); + if(physicsComponent != null) { + physics = new PhysicsBodyDataVO(); + physics.loadFromComponent(physicsComponent); + } + + LightBodyComponent lightBodyComponent = entity.getComponent(LightBodyComponent.class); + if (lightBodyComponent != null) { + light = new LightBodyDataVO(); + light.loadFromComponent(lightBodyComponent); + } + + ShaderComponent shaderComponent = entity.getComponent(ShaderComponent.class); + if(shaderComponent != null && shaderComponent.shaderName != null) { + shaderName = shaderComponent.shaderName; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ParticleEffectVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ParticleEffectVO.java new file mode 100644 index 00000000..af6ffeb1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ParticleEffectVO.java @@ -0,0 +1,29 @@ +package games.rednblack.editor.renderer.data; + + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; + +public class ParticleEffectVO extends MainItemVO { + public String particleName = ""; + public float particleWidth = 100; + public float particleHeight = 100; + //TODO add other ParticleEffect properties + + public ParticleEffectVO() { + super(); + } + + public ParticleEffectVO(ParticleEffectVO vo) { + super(vo); + particleName = new String(vo.particleName); + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + ParticleComponent particleComponent = entity.getComponent(ParticleComponent.class); + particleName = particleComponent.particleName; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsBodyDataVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsBodyDataVO.java new file mode 100644 index 00000000..d78213e3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsBodyDataVO.java @@ -0,0 +1,59 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; + +public class PhysicsBodyDataVO { + + public int bodyType = 0; + + public float mass; + public Vector2 centerOfMass; + public float rotationalInertia; + public float damping; + public float gravityScale; + public boolean allowSleep; + public boolean awake; + public boolean bullet; + public boolean sensor; + + public float density; + public float friction; + public float restitution; + + public PhysicsBodyDataVO(){ + centerOfMass = new Vector2(); + } + + public PhysicsBodyDataVO(PhysicsBodyDataVO vo){ + bodyType = vo.bodyType; + mass = vo.mass; + centerOfMass = vo.centerOfMass.cpy(); + rotationalInertia = vo.rotationalInertia; + damping = vo.damping; + gravityScale = vo.gravityScale; + allowSleep = vo.allowSleep; + sensor = vo.sensor; + awake = vo.awake; + bullet = vo.bullet; + density = vo.density; + friction = vo.friction; + restitution = vo.restitution; + } + + public void loadFromComponent(PhysicsBodyComponent physicsComponent) { + bodyType = physicsComponent.bodyType; + mass = physicsComponent.mass; + centerOfMass = physicsComponent.centerOfMass.cpy(); + rotationalInertia = physicsComponent.rotationalInertia; + damping = physicsComponent.damping; + gravityScale = physicsComponent.gravityScale; + allowSleep = physicsComponent.allowSleep; + sensor = physicsComponent.sensor; + awake = physicsComponent.awake; + bullet = physicsComponent.bullet; + density = physicsComponent.density; + friction = physicsComponent.friction; + restitution = physicsComponent.restitution; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsPropertiesVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsPropertiesVO.java new file mode 100644 index 00000000..aa58ba85 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/PhysicsPropertiesVO.java @@ -0,0 +1,25 @@ +package games.rednblack.editor.renderer.data; + +/** + * Created by sargis on 9/18/14. + */ +public class PhysicsPropertiesVO { + public float gravityX; + public float gravityY; + public float sleepVelocity; + public boolean enabled; + + public PhysicsPropertiesVO() { + gravityX = 0; + gravityY = 0; + sleepVelocity = 0; + enabled = false; + } + + public PhysicsPropertiesVO(PhysicsPropertiesVO physicsPropertiesVO) { + this.gravityX = physicsPropertiesVO.gravityX; + this.gravityY = physicsPropertiesVO.gravityY; + this.sleepVelocity = physicsPropertiesVO.sleepVelocity; + this.enabled = physicsPropertiesVO.enabled; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ProjectInfoVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ProjectInfoVO.java new file mode 100644 index 00000000..376df9b3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ProjectInfoVO.java @@ -0,0 +1,40 @@ +package games.rednblack.editor.renderer.data; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter.OutputType; + +public class ProjectInfoVO { + + public int pixelToWorld = 1; + + public ResolutionEntryVO originalResolution = new ResolutionEntryVO(); + + public Array resolutions = new Array(); + public ArrayList scenes = new ArrayList(); + + public HashMap libraryItems = new HashMap(); + + public String constructJsonString() { + String str = ""; + Json json = new Json(); + json.setOutputType(OutputType.json); + str = json.toJson(this); + json.prettyPrint(str); + return str; + } + + public ResolutionEntryVO getResolution(String name) { + for (ResolutionEntryVO resolution : resolutions) { + if (resolution.name.equalsIgnoreCase(name)) { + return resolution; + } + } + return null; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ResolutionEntryVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ResolutionEntryVO.java new file mode 100644 index 00000000..f24b0847 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ResolutionEntryVO.java @@ -0,0 +1,40 @@ +package games.rednblack.editor.renderer.data; + +public class ResolutionEntryVO { + + public String name = ""; + + public int width; + public int height; + public int base; + + @Override + public String toString() { + if (width == 0 && height == 0) { + return name; + } + return width + "x" + height + " (" + name + ")"; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ResolutionEntryVO other = (ResolutionEntryVO) obj; + return other.name.equals(name); + } + + public float getMultiplier(ResolutionEntryVO originalResolution) { + float mul; + if(base == 0) { + mul = (float)originalResolution.width/width; + } else { + mul = (float)originalResolution.height/height; + } + return mul; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/RuntimeProjectVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/RuntimeProjectVO.java new file mode 100644 index 00000000..80c87554 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/RuntimeProjectVO.java @@ -0,0 +1,10 @@ +package games.rednblack.editor.renderer.data; + +import java.util.ArrayList; + +public class RuntimeProjectVO { + + public ResolutionEntryVO originalResolution = new ResolutionEntryVO(); + public ArrayList resolutions = new ArrayList(); + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SceneVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SceneVO.java new file mode 100644 index 00000000..f5b923d0 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SceneVO.java @@ -0,0 +1,41 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter.OutputType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + + +public class SceneVO { + + public String sceneName = ""; + + public CompositeVO composite; + + public PhysicsPropertiesVO physicsPropertiesVO = new PhysicsPropertiesVO(); + public LightsPropertiesVO lightsPropertiesVO = new LightsPropertiesVO(); + + public ArrayList verticalGuides = new ArrayList(); + public ArrayList horizontalGuides = new ArrayList(); + + public SceneVO() { + + } + + public SceneVO(SceneVO vo) { + sceneName = new String(vo.sceneName); + composite = new CompositeVO(vo.composite); + physicsPropertiesVO = new PhysicsPropertiesVO(vo.physicsPropertiesVO); + lightsPropertiesVO = vo.lightsPropertiesVO; + } + + public String constructJsonString() { + String str = ""; + Json json = new Json(); + json.setOutputType(OutputType.json); + str = json.toJson(this); + return str; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SelectBoxVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SelectBoxVO.java new file mode 100644 index 00000000..62030702 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SelectBoxVO.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.data; + +import java.util.ArrayList; + +public class SelectBoxVO extends MainItemVO { + public ArrayList list = new ArrayList(); + public String style = ""; + public float width = 0; + public float height = 0; + + public SelectBoxVO() { + super(); + } + + public SelectBoxVO(SelectBoxVO vo) { + super(vo); + width = vo.width; + height = vo.height; + style = new String(vo.style); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ShapeVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ShapeVO.java new file mode 100644 index 00000000..50b4fd61 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/ShapeVO.java @@ -0,0 +1,37 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.gdx.math.Circle; +import com.badlogic.gdx.math.Vector2; + +public class ShapeVO { + public Vector2 [][] polygons; + public Circle[] circles; + + public ShapeVO clone() { + ShapeVO newVo = new ShapeVO(); + Vector2 [][] target = new Vector2[polygons.length][]; + + for (int i = 0; i < polygons.length; i++) { + target[i] = new Vector2[polygons[i].length]; + for(int j=0;j frameRangeMap = new ArrayList(); + public int playMode = 0; + + public SpriteAnimationVO() { + + } + + public SpriteAnimationVO(SpriteAnimationVO vo) { + super(vo); + animationName = vo.animationName; + fps = vo.fps; + frameRangeMap = vo.frameRangeMap; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + SpriteAnimationComponent spriteAnimationComponent = entity.getComponent(SpriteAnimationComponent.class); + animationName = spriteAnimationComponent.animationName; + fps = spriteAnimationComponent.fps; + frameRangeMap = new ArrayList(); + for(FrameRange fr: spriteAnimationComponent.frameRangeMap.values()) { + frameRangeMap.add(fr); + } + currentAnimation = spriteAnimationComponent.currentAnimation; + if(spriteAnimationComponent.playMode == Animation.PlayMode.NORMAL) playMode = 0; + if(spriteAnimationComponent.playMode == Animation.PlayMode.REVERSED) playMode = 1; + if(spriteAnimationComponent.playMode == Animation.PlayMode.LOOP) playMode = 2; + if(spriteAnimationComponent.playMode == Animation.PlayMode.LOOP_REVERSED) playMode = 3; + if(spriteAnimationComponent.playMode == Animation.PlayMode.LOOP_PINGPONG) playMode = 4; + if(spriteAnimationComponent.playMode == Animation.PlayMode.LOOP_RANDOM) playMode = 5; + if(spriteAnimationComponent.playMode == Animation.PlayMode.NORMAL) playMode = 6; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpriterVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpriterVO.java new file mode 100644 index 00000000..d5f9bd3b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/SpriterVO.java @@ -0,0 +1,36 @@ +package games.rednblack.editor.renderer.data; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; + +public class SpriterVO extends MainItemVO { + + public int entity; + public int animation; + public String animationName = ""; + + //wtf is this? + public float scale = 1f; + + public SpriterVO() { + + } + + public SpriterVO(SpriterVO vo) { + super(vo); + entity = vo.entity; + animation = vo.animation; + animationName = vo.animationName; + scale = vo.scale; + } + + @Override + public void loadFromEntity(Entity entity) { + super.loadFromEntity(entity); + + SpriterComponent spriterComponent = entity.getComponent(SpriterComponent.class); + animationName = spriterComponent.animationName; + animation = spriterComponent.animation; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/TextBoxVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/TextBoxVO.java new file mode 100644 index 00000000..773b2f9c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/TextBoxVO.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.data; + +public class TextBoxVO extends MainItemVO { + + public String defaultText = ""; + public float width = 0; + public float height = 0; + public String style = ""; + + public TextBoxVO() { + super(); + } + + public TextBoxVO(TextBoxVO vo) { + super(vo); + defaultText = new String(vo.defaultText); + width = vo.width; + height = vo.height; + style = new String(vo.style); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/EntityFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/EntityFactory.java new file mode 100644 index 00000000..2102188b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/EntityFactory.java @@ -0,0 +1,306 @@ +package games.rednblack.editor.renderer.factory; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.utils.viewport.Viewport; +import games.rednblack.editor.renderer.commons.IExternalItemType; +import games.rednblack.editor.renderer.components.CompositeTransformComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ViewPortComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.component.*; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +public class EntityFactory { + + public static final int IMAGE_TYPE = 1; + public static final int LABEL_TYPE = 2; + public static final int SPRITE_TYPE = 3; + public static final int SPINE_TYPE = 4; + public static final int SPRITER_TYPE = 5; + public static final int COMPOSITE_TYPE = 6; + public static final int PARTICLE_TYPE = 7; + public static final int LIGHT_TYPE = 8; + public static final int NINE_PATCH = 9; + public static final int COLOR_PRIMITIVE = 10; + + public RayHandler rayHandler; + public World world; + public IResourceRetriever rm = null; + + public EntityFactory( RayHandler rayHandler, World world, IResourceRetriever rm ) { + + this.rayHandler = rayHandler; + this.world = world; + this.rm = rm; + + compositeComponentFactory = new CompositeComponentFactory(rayHandler, world, rm); + lightComponentFactory = new LightComponentFactory(rayHandler, world, rm); + particleEffectComponentFactory = new ParticleEffectComponentFactory(rayHandler, world, rm); + simpleImageComponentFactory = new SimpleImageComponentFactory(rayHandler, world, rm); + spriteComponentFactory = new SpriteComponentFactory(rayHandler, world, rm); + spriterComponentFactory = new SpriterComponentFactory(rayHandler, world, rm); + labelComponentFactory = new LabelComponentFactory(rayHandler, world, rm); + ninePatchComponentFactory = new NinePatchComponentFactory(rayHandler, world, rm); + colorPrimitiveFactory = new ColorPrimitiveComponentFactory(rayHandler, world, rm); + + } + + protected ComponentFactory compositeComponentFactory, lightComponentFactory, particleEffectComponentFactory, + simpleImageComponentFactory, spriteComponentFactory, spriterComponentFactory, labelComponentFactory, ninePatchComponentFactory, colorPrimitiveFactory; + + private HashMap externalFactories = new HashMap(); + + private HashMap entities = new HashMap(); + + public ComponentFactory getCompositeComponentFactory() { + return compositeComponentFactory; + } + + public SpriteComponentFactory getSpriteComponentFactory() { + return (SpriteComponentFactory) spriteComponentFactory; + } + + public void addExternalFactory(IExternalItemType itemType) { + externalFactories.put(itemType.getTypeId(), itemType.getComponentFactory()); + } + + public Entity createEntity(Entity root, SimpleImageVO vo){ + + Entity entity = new Entity(); + + simpleImageComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, Image9patchVO vo){ + + Entity entity = new Entity(); + + ninePatchComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, LabelVO vo) { + + Entity entity = new Entity(); + + labelComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, ParticleEffectVO vo){ + + Entity entity = new Entity(); + + particleEffectComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, LightVO vo){ + + Entity entity = new Entity(); + + lightComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, SpineVO vo){ + + Entity entity = new Entity(); + + ComponentFactory factory = externalFactories.get(SPINE_TYPE); + if(factory != null) { + factory.createComponents(root, entity, vo); + postProcessEntity(entity); + } + + return entity; + } + + public Entity createEntity(Entity root, SpriteAnimationVO vo){ + + Entity entity = new Entity(); + + spriteComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, SpriterVO vo){ + + Entity entity = new Entity(); + + spriterComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, CompositeItemVO vo){ + + Entity entity = new Entity(); + + compositeComponentFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createEntity(Entity root, ColorPrimitiveVO vo){ + + Entity entity = new Entity(); + + colorPrimitiveFactory.createComponents(root, entity, vo); + + postProcessEntity(entity); + + return entity; + } + + public Entity createRootEntity(CompositeVO compositeVo, Viewport viewport){ + + CompositeItemVO vo = new CompositeItemVO(); + vo.composite = compositeVo; + + Entity entity = new Entity(); + + compositeComponentFactory.createComponents(null, entity, vo); +// CompositeTransformComponent compositeTransform = new CompositeTransformComponent(); + TransformComponent transform = new TransformComponent(); + + ViewPortComponent viewPortComponent = new ViewPortComponent(); + viewPortComponent.viewPort = viewport; + + viewPortComponent.viewPort.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true); + + entity.add(transform); + entity.add(viewPortComponent); + + postProcessEntity(entity); + + return entity; + } + + public Integer postProcessEntity(Entity entity) { + ComponentMapper mainItemComponentComponentMapper = ComponentMapper.getFor(MainItemComponent.class); + MainItemComponent mainItemComponent = mainItemComponentComponentMapper.get(entity); + if(mainItemComponent.uniqueId == -1) mainItemComponent.uniqueId = getFreeId(); + entities.put(mainItemComponent.uniqueId, entity); + + return mainItemComponent.uniqueId; + } + + private int getFreeId() { + if(entities == null || entities.size() == 0) return 1; + ArrayList ids = new ArrayList(entities.keySet()); + Collections.sort(ids); + for(int i = 1; i < ids.size(); i++) { + if(ids.get(i)-ids.get(i-1) > 1) { + return ids.get(i-1)+1; + } + } + return ids.get(ids.size()-1)+1; + } + + public Integer updateMap(Entity entity) { + ComponentMapper mainItemComponentComponentMapper = ComponentMapper.getFor(MainItemComponent.class); + MainItemComponent mainItemComponent = mainItemComponentComponentMapper.get(entity); + entities.put(mainItemComponent.uniqueId, entity); + + return mainItemComponent.uniqueId; + } + + public void initAllChildren(Engine engine, Entity entity, CompositeVO vo) { + for (int i = 0; i < vo.sImages.size(); i++) { + Entity child = createEntity(entity, vo.sImages.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sImage9patchs.size(); i++) { + Entity child = createEntity(entity, vo.sImage9patchs.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sLabels.size(); i++) { + Entity child = createEntity(entity, vo.sLabels.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sParticleEffects.size(); i++) { + Entity child = createEntity(entity, vo.sParticleEffects.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sLights.size(); i++) { + Entity child = createEntity(entity, vo.sLights.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sSpineAnimations.size(); i++) { + Entity child = createEntity(entity, vo.sSpineAnimations.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sSpriteAnimations.size(); i++) { + Entity child = createEntity(entity, vo.sSpriteAnimations.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sSpriterAnimations.size(); i++) { + Entity child = createEntity(entity, vo.sSpriterAnimations.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sColorPrimitives.size(); i++) { + Entity child = createEntity(entity, vo.sColorPrimitives.get(i)); + engine.addEntity(child); + } + + for (int i = 0; i < vo.sComposites.size(); i++) { + Entity child = createEntity(entity, vo.sComposites.get(i)); + engine.addEntity(child); + initAllChildren(engine, child, vo.sComposites.get(i).composite); + } + } + + public Entity getEntityByUniqueId(Integer id) { + return entities.get(id); + } + + + public void clean() { + entities.clear(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ColorPrimitiveComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ColorPrimitiveComponentFactory.java new file mode 100644 index 00000000..2d45174c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ColorPrimitiveComponentFactory.java @@ -0,0 +1,89 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.PolygonComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.SimpleImageVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 10/21/2015. + */ +public class ColorPrimitiveComponentFactory extends ComponentFactory { + + public ColorPrimitiveComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.COLOR_PRIMITIVE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + + createTextureRegionComponent(entity, vo); + + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + dimensionsComponent.setPolygon(polygonComponent); + float ppwu = dimensionsComponent.width/textureRegionComponent.region.getRegionWidth(); + textureRegionComponent.setPolygonSprite(polygonComponent, 1f/ppwu); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + component.setFromShape(vo.shape); + + entity.add(component); + + return component; + } + + protected TextureRegionComponent createTextureRegionComponent(Entity entity, MainItemVO vo) { + TextureRegionComponent component = new TextureRegionComponent(); + + Pixmap pixmap = new Pixmap(1, 1, Pixmap.Format.RGBA8888); + pixmap.setColor(Color.WHITE); + pixmap.fill(); + Texture texture = new Texture(pixmap); + texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); + TextureRegion textureRegion = new TextureRegion(texture); + component.region = textureRegion; + component.isRepeat = false; + component.isPolygon = true; + entity.add(component); + + return component; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ComponentFactory.java new file mode 100644 index 00000000..a0257304 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ComponentFactory.java @@ -0,0 +1,243 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +import java.util.Arrays; +import java.util.HashSet; + +/** + * Created by azakhary on 5/22/2015. + */ +public abstract class ComponentFactory { + + protected IResourceRetriever rm; + protected RayHandler rayHandler; + protected World world; + + protected ComponentMapper nodeComponentMapper; + + public ComponentFactory() { + nodeComponentMapper = ComponentMapper.getFor(NodeComponent.class); + } + + public ComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + this(); + injectDependencies(rayHandler, world, rm); + } + + public void injectDependencies(RayHandler rayHandler, World world, IResourceRetriever rm) { + this.rayHandler = rayHandler; + this.world = world; + this.rm = rm; + } + + public abstract void createComponents(Entity root, Entity entity, MainItemVO vo); + + protected void createCommonComponents(Entity entity, MainItemVO vo, int entityType) { + DimensionsComponent dimensionsComponent = createDimensionsComponent(entity, vo); + createBoundingBoxComponent(entity, vo); + createMainItemComponent(entity, vo, entityType); + createTransformComponent(entity, vo, dimensionsComponent); + createTintComponent(entity, vo); + createZIndexComponent(entity, vo); + createScriptComponent(entity, vo); + createMeshComponent(entity, vo); + createPhysicsComponents(entity, vo); + createLightComponents(entity, vo); + createShaderComponent(entity, vo); + } + + protected BoundingBoxComponent createBoundingBoxComponent(Entity entity, MainItemVO vo) { + BoundingBoxComponent component = new BoundingBoxComponent(); + entity.add(component); + return component; + } + + protected ShaderComponent createShaderComponent(Entity entity, MainItemVO vo) { + if(vo.shaderName == null || vo.shaderName.isEmpty()){ + return null; + } + ShaderComponent component = new ShaderComponent(); + component.setShader(vo.shaderName, rm.getShaderProgram(vo.shaderName)); + entity.add(component); + return component; + } + + protected MainItemComponent createMainItemComponent(Entity entity, MainItemVO vo, int entityType) { + MainItemComponent component = new MainItemComponent(); + component.setCustomVarString(vo.customVars); + component.uniqueId = vo.uniqueId; + component.itemIdentifier = vo.itemIdentifier; + component.libraryLink = vo.itemName; + if(vo.tags != null) { + component.tags = new HashSet(Arrays.asList(vo.tags)); + } + component.entityType = entityType; + + entity.add(component); + + return component; + } + + protected TransformComponent createTransformComponent(Entity entity, MainItemVO vo, DimensionsComponent dimensionsComponent) { + TransformComponent component = new TransformComponent(); + component.rotation = vo.rotation; + component.scaleX = vo.scaleX; + component.scaleY = vo.scaleY; + component.x = vo.x; + component.y = vo.y; + + if(Float.isNaN(vo.originX)) component.originX = dimensionsComponent.width/2f; + else component.originX = vo.originX; + + if(Float.isNaN(vo.originY)) component.originY = dimensionsComponent.height/2f; + else component.originY = vo.originY; + + entity.add(component); + + return component; + } + + protected abstract DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo); + + protected TintComponent createTintComponent(Entity entity, MainItemVO vo) { + TintComponent component = new TintComponent(); + component.color.set(vo.tint[0], vo.tint[1], vo.tint[2], vo.tint[3]); + + entity.add(component); + + return component; + } + + protected ZIndexComponent createZIndexComponent(Entity entity, MainItemVO vo) { + ZIndexComponent component = new ZIndexComponent(); + + if(vo.layerName == "" || vo.layerName == null) vo.layerName = "Default"; + + component.layerName = vo.layerName; + component.setZIndex(vo.zIndex); + component.needReOrder = false; + entity.add(component); + + return component; + } + + protected ScriptComponent createScriptComponent(Entity entity, MainItemVO vo) { + ScriptComponent component = new ScriptComponent(); + entity.add(component); + return component; + } + + protected ParentNodeComponent createParentNodeComponent(Entity root, Entity entity) { + ParentNodeComponent component = new ParentNodeComponent(); + component.parentEntity = root; + entity.add(component); + + //set visible to true depending on parent + // TODO: I do not likes this part + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + LayerMapComponent layerMapComponent = ComponentRetriever.get(root, LayerMapComponent.class); + ZIndexComponent zIndexComponent = ComponentRetriever.get(root, ZIndexComponent.class); + mainItemComponent.visible = layerMapComponent.isVisible(zIndexComponent.layerName); + + return component; + } + + protected void createNodeComponent(Entity root, Entity entity) { + NodeComponent component = nodeComponentMapper.get(root); + component.children.add(entity); + } + + protected void createPhysicsComponents(Entity entity, MainItemVO vo) { + if(vo.physics == null){ + return; + } + + createPhysicsBodyPropertiesComponent(entity, vo); + } + + protected PhysicsBodyComponent createPhysicsBodyPropertiesComponent(Entity entity, MainItemVO vo) { + PhysicsBodyComponent component = new PhysicsBodyComponent(); + component.allowSleep = vo.physics.allowSleep; + component.sensor = vo.physics.sensor; + component.awake = vo.physics.awake; + component.bodyType = vo.physics.bodyType; + component.bullet = vo.physics.bullet; + component.centerOfMass = vo.physics.centerOfMass; + component.damping = vo.physics.damping; + component.density = vo.physics.density; + component.friction = vo.physics.friction; + component.gravityScale = vo.physics.gravityScale; + component.mass = vo.physics.mass; + component.restitution = vo.physics.restitution; + component.rotationalInertia = vo.physics.rotationalInertia; + + entity.add(component); + + return component; + } + + protected LightBodyComponent createLightComponents(Entity entity, MainItemVO vo) { + if(vo.light == null){ + return null; + } + + LightBodyComponent component = new LightBodyComponent(); + component.rays = vo.light.rays; + component.color = vo.light.color; + component.distance = vo.light.distance; + component.rayDirection = vo.light.rayDirection; + component.softnessLength = vo.light.softnessLength; + component.isXRay = vo.light.isXRay; + component.isStatic = vo.light.isStatic; + component.isSoft = vo.light.isSoft; + component.isActive = vo.light.isActive; + + entity.add(component); + return component; + } + + protected PolygonComponent createMeshComponent(Entity entity, MainItemVO vo) { + PolygonComponent component = new PolygonComponent(); + if(vo.shape != null) { + component.vertices = vo.shape.polygons.clone(); + entity.add(component); + + return component; + } + return null; + } + + public void setResourceManager(IResourceRetriever rm) { + this.rm = rm; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/CompositeComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/CompositeComponentFactory.java new file mode 100644 index 00000000..111f05bc --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/CompositeComponentFactory.java @@ -0,0 +1,93 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.CompositeTransformComponent; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +/** + * Created by azakhary on 5/22/2015. + */ +public class CompositeComponentFactory extends ComponentFactory { + + public CompositeComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.COMPOSITE_TYPE); + if(root != null) { + createParentNodeComponent(root, entity); + } + createNodeComponent(root, entity); + createPhysicsComponents(entity, vo); + createLightComponents(entity, vo); + createCompositeComponents(entity, (CompositeItemVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + component.width = ((CompositeItemVO) vo).width; + component.height = ((CompositeItemVO) vo).height; + component.boundBox = new Rectangle(0,0,component.width,component.height); + entity.add(component); + return component; + } + + @Override + protected void createNodeComponent(Entity root, Entity entity) { + if(root != null) { + super.createNodeComponent(root, entity); + } + + NodeComponent node = new NodeComponent(); + entity.add(node); + } + + protected void createCompositeComponents(Entity entity, CompositeItemVO vo) { + CompositeTransformComponent compositeTransform = new CompositeTransformComponent(); + + compositeTransform.automaticResize = vo.automaticResize; + compositeTransform.scissorsEnabled = vo.scissorsEnabled; + + LayerMapComponent layerMap = new LayerMapComponent(); + if(vo.composite.layers.size() == 0) { + vo.composite.layers.add(LayerItemVO.createDefault()); + } + layerMap.setLayers(vo.composite.layers); + + entity.add(compositeTransform); + entity.add(layerMap); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java new file mode 100644 index 00000000..e6d9bf09 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java @@ -0,0 +1,67 @@ +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +public class LabelComponentFactory extends ComponentFactory{ + + private static int labelDefaultSize = 12; + + public LabelComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + // TODO Auto-generated constructor stub + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.LABEL_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + createLabelComponent(entity, (LabelVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + component.height = ((LabelVO) vo).height; + component.width = ((LabelVO) vo).width; + + entity.add(component); + return component; + } + + protected LabelComponent createLabelComponent(Entity entity, LabelVO vo) { + LabelComponent component = new LabelComponent(vo.text, generateStyle(rm, vo.style, vo.size)); + component.fontName = vo.style; + component.fontSize = vo.size; + component.setAlignment(vo.align); + component.setWrap(vo.wrap); + + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + ResolutionEntryVO resolutionEntryVO = rm.getLoadedResolution(); + float multiplier = resolutionEntryVO.getMultiplier(rm.getProjectVO().originalResolution); + + component.setFontScale(multiplier/projectInfoVO.pixelToWorld); + + entity.add(component); + return component; + } + + + public static LabelStyle generateStyle(IResourceRetriever rManager, String fontName, int size) { + + if (size == 0) { + size = labelDefaultSize; + } + return new LabelStyle(rManager.getBitmapFont(fontName, size), null); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LightComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LightComponentFactory.java new file mode 100644 index 00000000..f9b20199 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LightComponentFactory.java @@ -0,0 +1,93 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.ConeLight; +import box2dLight.PointLight; +import box2dLight.RayHandler; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.BoundingBoxComponent; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.data.LightVO; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +public class LightComponentFactory extends ComponentFactory { + + public LightComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.LIGHT_TYPE); + entity.remove(BoundingBoxComponent.class); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + createLightObjectComponent(entity, (LightVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + float boundBoxSize = 50f; + component.boundBox = new Rectangle((-boundBoxSize / 2f) / projectInfoVO.pixelToWorld, (-boundBoxSize / 2f) / projectInfoVO.pixelToWorld, boundBoxSize / projectInfoVO.pixelToWorld, boundBoxSize / projectInfoVO.pixelToWorld); + component.width = boundBoxSize / projectInfoVO.pixelToWorld; + component.height = boundBoxSize / projectInfoVO.pixelToWorld; + + entity.add(component); + return component; + } + + protected LightObjectComponent createLightObjectComponent(Entity entity, LightVO vo) { + if(vo.softnessLength == -1f) { + vo.softnessLength = vo.distance * 0.1f * PhysicsBodyLoader.getScale(); + } + LightObjectComponent component = new LightObjectComponent(vo.type); + component.coneDegree = vo.coneDegree; + component.directionDegree = vo.directionDegree; + component.distance = vo.distance; + component.softnessLength = vo.softnessLength; + component.isStatic = vo.isStatic; + component.isXRay = vo.isXRay; + component.rays = vo.rays; + component.isActive = vo.isActive; + component.isSoft = vo.isSoft; + + if (component.getType() == LightVO.LightType.POINT) { + component.lightObject = new PointLight(rayHandler, component.rays); + } else { + component.lightObject = new ConeLight(rayHandler, component.rays, Color.WHITE, 1, 0, 0, 0, 0); + } + + component.lightObject.setSoftnessLength(component.softnessLength); + + entity.add(component); + return component; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/NinePatchComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/NinePatchComponentFactory.java new file mode 100644 index 00000000..ec8aa505 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/NinePatchComponentFactory.java @@ -0,0 +1,73 @@ +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.NinePatchComponent; +import games.rednblack.editor.renderer.data.Image9patchVO; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.ResolutionEntryVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +public class NinePatchComponentFactory extends ComponentFactory { + + private NinePatchComponent ninePatchComponent; + + public NinePatchComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + ninePatchComponent = createNinePatchComponent(entity, (Image9patchVO) vo); + createCommonComponents(entity, vo, EntityFactory.NINE_PATCH); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + component.height = ((Image9patchVO) vo).height; + component.width = ((Image9patchVO) vo).width; + if(component.width == 0) { + component.width = ninePatchComponent.ninePatch.getTotalWidth(); + } + + if(component.height == 0) { + component.height = ninePatchComponent.ninePatch.getTotalHeight(); + } + + entity.add(component); + return component; + } + + private NinePatchComponent createNinePatchComponent(Entity entity, Image9patchVO vo) { + NinePatchComponent ninePatchComponent = new NinePatchComponent(); + AtlasRegion atlasRegion = (AtlasRegion) rm.getTextureRegion(vo.imageName); + ninePatchComponent.ninePatch = new NinePatch(atlasRegion, atlasRegion.splits[0], atlasRegion.splits[1], atlasRegion.splits[2], atlasRegion.splits[3]); + + ResolutionEntryVO resolutionEntryVO = rm.getLoadedResolution(); + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + float multiplier = resolutionEntryVO.getMultiplier(rm.getProjectVO().originalResolution); + + ninePatchComponent.ninePatch.scale(multiplier/projectInfoVO.pixelToWorld, multiplier/projectInfoVO.pixelToWorld); + + // This seem to be redundant as "scale" method now takes care of that o_O when did libGDX change that, should look more into this. + //ninePatchComponent.ninePatch.setMiddleWidth(ninePatchComponent.ninePatch.getMiddleWidth()*multiplier/projectInfoVO.pixelToWorld); + //ninePatchComponent.ninePatch.setMiddleHeight(ninePatchComponent.ninePatch.getMiddleHeight()*multiplier/projectInfoVO.pixelToWorld); + + ninePatchComponent.textureRegionName = vo.imageName; + entity.add(ninePatchComponent); + + return ninePatchComponent; + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ParticleEffectComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ParticleEffectComponentFactory.java new file mode 100644 index 00000000..e4a0a49d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/ParticleEffectComponentFactory.java @@ -0,0 +1,76 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ParticleEffectVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +/** + * Created by azakhary on 5/22/2015. + */ +public class ParticleEffectComponentFactory extends ComponentFactory { + + + public ParticleEffectComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.PARTICLE_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + createParticleComponent(entity, (ParticleEffectVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + float boundBoxSize = 70f; + component.boundBox = new Rectangle((-boundBoxSize / 2f) / projectInfoVO.pixelToWorld, (-boundBoxSize / 2f) / projectInfoVO.pixelToWorld, boundBoxSize / projectInfoVO.pixelToWorld, boundBoxSize / projectInfoVO.pixelToWorld); + + entity.add(component); + return component; + } + + protected ParticleComponent createParticleComponent(Entity entity, ParticleEffectVO vo) { + ParticleComponent component = new ParticleComponent(); + component.particleName = vo.particleName; + ParticleEffect particleEffect = new ParticleEffect(rm.getParticleEffect(vo.particleName)); + component.particleEffect = particleEffect; + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + component.worldMultiplyer = 1f/projectInfoVO.pixelToWorld; + component.scaleEffect(1f); + + entity.add(component); + return component; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SimpleImageComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SimpleImageComponentFactory.java new file mode 100644 index 00000000..1c11db0d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SimpleImageComponentFactory.java @@ -0,0 +1,95 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.PolygonComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.ResolutionEntryVO; +import games.rednblack.editor.renderer.data.SimpleImageVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 5/22/2015. + */ +public class SimpleImageComponentFactory extends ComponentFactory { + + private TextureRegionComponent textureRegionComponent; + + public SimpleImageComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + textureRegionComponent = createTextureRegionComponent(entity, (SimpleImageVO) vo); + createCommonComponents( entity, vo, EntityFactory.IMAGE_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + updatePolygons(entity); + } + + private void updatePolygons(Entity entity) { + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + if(textureRegionComponent.isPolygon && polygonComponent != null && polygonComponent.vertices != null) { + textureRegionComponent.setPolygonSprite(polygonComponent, projectInfoVO.pixelToWorld); + dimensionsComponent.setPolygon(polygonComponent); + } + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + + ResolutionEntryVO resolutionEntryVO = rm.getLoadedResolution(); + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + float multiplier = resolutionEntryVO.getMultiplier(rm.getProjectVO().originalResolution); + + component.width = (float) textureRegionComponent.region.getRegionWidth() * multiplier / projectInfoVO.pixelToWorld; + component.height = (float) textureRegionComponent.region.getRegionHeight() * multiplier / projectInfoVO.pixelToWorld; + entity.add(component); + + return component; + } + + protected TextureRegionComponent createTextureRegionComponent(Entity entity, SimpleImageVO vo) { + TextureRegionComponent component = new TextureRegionComponent(); + component.regionName = vo.imageName; + component.region = rm.getTextureRegion(vo.imageName); + component.isRepeat = vo.isRepeat; + component.isPolygon = vo.isPolygon; + entity.add(component); + + return component; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriteComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriteComponentFactory.java new file mode 100644 index 00000000..ab1e08d8 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriteComponentFactory.java @@ -0,0 +1,138 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.*; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.components.sprite.AnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationStateComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by azakhary on 5/22/2015. + */ +public class SpriteComponentFactory extends ComponentFactory { + + public SpriteComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createCommonComponents(entity, vo, EntityFactory.SPRITE_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + createSpriteAnimationDataComponent(entity, (SpriteAnimationVO) vo); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + SpriteAnimationVO sVo = (SpriteAnimationVO) vo; + Array regions = getRegions(sVo.animationName); + + ResolutionEntryVO resolutionEntryVO = rm.getLoadedResolution(); + ProjectInfoVO projectInfoVO = rm.getProjectVO(); + float multiplier = resolutionEntryVO.getMultiplier(rm.getProjectVO().originalResolution); + component.width = (float) regions.get(0).getRegionWidth() * multiplier / projectInfoVO.pixelToWorld; + component.height = (float) regions.get(0).getRegionHeight() * multiplier / projectInfoVO.pixelToWorld; + + entity.add(component); + return component; + } + + protected SpriteAnimationComponent createSpriteAnimationDataComponent(Entity entity, SpriteAnimationVO vo) { + SpriteAnimationComponent spriteAnimationComponent = new SpriteAnimationComponent(); + spriteAnimationComponent.animationName = vo.animationName; + + spriteAnimationComponent.frameRangeMap = new HashMap(); + for(int i = 0; i < vo.frameRangeMap.size(); i++) { + spriteAnimationComponent.frameRangeMap.put(vo.frameRangeMap.get(i).name, vo.frameRangeMap.get(i)); + } + spriteAnimationComponent.fps = vo.fps; + spriteAnimationComponent.currentAnimation = vo.currentAnimation; + + if(vo.playMode == 0) spriteAnimationComponent.playMode = Animation.PlayMode.NORMAL; + if(vo.playMode == 1) spriteAnimationComponent.playMode = Animation.PlayMode.REVERSED; + if(vo.playMode == 2) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP; + if(vo.playMode == 3) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_REVERSED; + if(vo.playMode == 4) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_PINGPONG; + if(vo.playMode == 5) spriteAnimationComponent.playMode = Animation.PlayMode.LOOP_RANDOM; + if(vo.playMode == 6) spriteAnimationComponent.playMode = Animation.PlayMode.NORMAL; + + // filtering regions by name + Array regions = getRegions(spriteAnimationComponent.animationName); + + AnimationComponent animationComponent = new AnimationComponent(); + SpriteAnimationStateComponent stateComponent = new SpriteAnimationStateComponent(regions); + + if(spriteAnimationComponent.frameRangeMap.isEmpty()) { + spriteAnimationComponent.frameRangeMap.put("Default", new FrameRange("Default", 0, regions.size-1)); + } + if(spriteAnimationComponent.currentAnimation == null) { + spriteAnimationComponent.currentAnimation = (String) spriteAnimationComponent.frameRangeMap.keySet().toArray()[0]; + } + if(spriteAnimationComponent.playMode == null) { + spriteAnimationComponent.playMode = Animation.PlayMode.LOOP; + } + + stateComponent.set(spriteAnimationComponent); + + TextureRegionComponent textureRegionComponent = new TextureRegionComponent(); + textureRegionComponent.region = regions.get(0); + + entity.add(textureRegionComponent); + entity.add(stateComponent); + entity.add(animationComponent); + entity.add(spriteAnimationComponent); + + return spriteAnimationComponent; + } + + private Array getRegions(String filter) { + // filtering regions by name + Array allRegions = rm.getSpriteAnimation(filter).getRegions(); + Array regions = new Array(); + for(TextureAtlas.AtlasRegion region: allRegions) { + if(region.name.contains(filter)) { + regions.add(region); + } + } + + return regions; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriterComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriterComponentFactory.java new file mode 100644 index 00000000..d6b2e666 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/SpriterComponentFactory.java @@ -0,0 +1,100 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.factory.component; + +import box2dLight.RayHandler; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.physics.box2d.World; +import com.brashmonkey.spriter.Player; +import com.brashmonkey.spriter.Rectangle; +import com.brashmonkey.spriter.SCMLReader; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterDrawerComponent; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.data.SpriterVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.LibGdxDrawer; +import games.rednblack.editor.renderer.utils.LibGdxLoader; + +/** + * Created by azakhary on 5/22/2015. + */ +public class SpriterComponentFactory extends ComponentFactory { + + public SpriterComponentFactory(RayHandler rayHandler, World world, IResourceRetriever rm) { + super(rayHandler, world, rm); + } + + @Override + public void createComponents(Entity root, Entity entity, MainItemVO vo) { + createSpriterDataComponent(entity, (SpriterVO) vo); + createCommonComponents(entity, vo, EntityFactory.SPRITER_TYPE); + createParentNodeComponent(root, entity); + createNodeComponent(root, entity); + } + + @Override + protected DimensionsComponent createDimensionsComponent(Entity entity, MainItemVO vo) { + DimensionsComponent component = new DimensionsComponent(); + + SpriterComponent spriterComponent = ComponentRetriever.get(entity, SpriterComponent.class); + + Rectangle rect = spriterComponent.player.getBoundingRectangle(null); + component.width = (int) rect.size.width; + component.height = (int) rect.size.height; + + entity.add(component); + return component; + } + + protected SpriterComponent createSpriterDataComponent(Entity entity, SpriterVO vo) { + SpriterComponent component = new SpriterComponent(); + component. entity = vo.entity; + component.animation = vo.animation; + component. animationName = vo.animationName; + component.scale = vo.scale; + + FileHandle handle = rm.getSCMLFile(vo.animationName); + component.data = new SCMLReader(handle.read()).getData(); + LibGdxLoader loader = new LibGdxLoader(component.data); + loader.load(handle.file()); + + component.currentAnimationIndex = vo.animation; + component.currentEntityIndex = vo.entity; + + component.player = new Player(component.data.getEntity(component.currentEntityIndex)); + + component.player.setAnimation(component.currentAnimationIndex); + component.player.setScale(component.scale); + + SpriterDrawerComponent spriterDrawer = new SpriterDrawerComponent(); + + spriterDrawer.drawer = new LibGdxDrawer(loader, null); + + entity.add(component); + entity.add(spriterDrawer); + + return component; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/physics/PhysicsBodyLoader.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/physics/PhysicsBodyLoader.java new file mode 100644 index 00000000..4813b1d6 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/physics/PhysicsBodyLoader.java @@ -0,0 +1,111 @@ +package games.rednblack.editor.renderer.physics; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.*; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.utils.TransformMathUtils; + +/** + * Created by azakhary on 9/28/2014. + */ +public class PhysicsBodyLoader { + + private static PhysicsBodyLoader instance; + + public float scale; + public float ppWU; + + public float mul; + + private PhysicsBodyLoader() { + mul = 20f; + } + + public static PhysicsBodyLoader getInstance() { + if(instance == null) { + instance = new PhysicsBodyLoader(); + } + + return instance; + } + + public void setScaleFromPPWU(float pixelPerWU) { + ppWU = 1f/pixelPerWU; + scale = 1f/(mul*pixelPerWU); + } + + public static float getScale() { + return getInstance().scale; + } + + public static float getPPWU() { + return getInstance().ppWU; + } + + public Body createBody(World world, Entity entity, PhysicsBodyComponent physicsComponent, Vector2[][] minPolygonData, TransformComponent transformComponent) { + FixtureDef fixtureDef = new FixtureDef(); + + if(physicsComponent != null) { + fixtureDef.density = physicsComponent.density; + fixtureDef.friction = physicsComponent.friction; + fixtureDef.restitution = physicsComponent.restitution; + + fixtureDef.isSensor = physicsComponent.sensor; + + fixtureDef.filter.maskBits = physicsComponent.filter.maskBits; + fixtureDef.filter.groupIndex = physicsComponent.filter.groupIndex; + fixtureDef.filter.categoryBits = physicsComponent.filter.categoryBits; + } + + BodyDef bodyDef = new BodyDef(); + Vector2 sceneCoords = TransformMathUtils.localToSceneCoordinates(entity, new Vector2(0, 0)); + bodyDef.position.set((sceneCoords.x + transformComponent.originX) * PhysicsBodyLoader.getScale() , (sceneCoords.y + transformComponent.originY)* PhysicsBodyLoader.getScale() ); + bodyDef.angle = transformComponent.rotation * MathUtils.degreesToRadians; + + bodyDef.awake = physicsComponent.awake; + bodyDef.allowSleep = physicsComponent.allowSleep; + bodyDef.bullet = physicsComponent.bullet; + + if(physicsComponent.bodyType == 0) { + bodyDef.type = BodyDef.BodyType.StaticBody; + } else if (physicsComponent.bodyType == 1){ + bodyDef.type = BodyDef.BodyType.KinematicBody; + } else { + bodyDef.type = BodyDef.BodyType.DynamicBody; + } + + Body body = world.createBody(bodyDef); + + PolygonShape polygonShape = new PolygonShape(); + + for(int i = 0; i < minPolygonData.length; i++) { + float[] verts = new float[minPolygonData[i].length * 2]; + for(int j=0;j preparedSceneNames = new ArrayList(); + protected HashMap loadedSceneVOs = new HashMap(); + + protected HashSet particleEffectNamesToLoad = new HashSet(); + protected HashSet spineAnimNamesToLoad = new HashSet(); + protected HashSet spriteAnimNamesToLoad = new HashSet(); + protected HashSet spriterAnimNamesToLoad = new HashSet(); + protected HashSet fontsToLoad = new HashSet(); + protected HashSet shaderNamesToLoad = new HashSet(); + + protected TextureAtlas mainPack; + protected HashMap particleEffects = new HashMap(); + + protected HashMap skeletonAtlases = new HashMap(); + protected HashMap skeletonJSON = new HashMap(); + + protected HashMap spriteAnimations = new HashMap(); + protected HashMap spriterAnimations = new HashMap(); + protected HashMap bitmapFonts = new HashMap(); + protected HashMap shaderPrograms = new HashMap(); + + + /** + * Constructor does nothing + */ + public ResourceManager() { + + } + + /** + * Sets working resolution, please set before doing any loading + * @param resolution String resolution name, default is "orig" later use resolution names created in editor + */ + public void setWorkingResolution(String resolution) { + ResolutionEntryVO resolutionObject = getProjectVO().getResolution(resolution); + if(resolutionObject != null) { + packResolutionName = resolution; + } + } + + /** + * Easy use loader + * Iterates through all scenes and schedules all for loading + * Prepares all the assets to be loaded that are used in scheduled scenes + * finally loads all the prepared assets + */ + public void initAllResources() { + loadProjectVO(); + for (int i = 0; i < projectVO.scenes.size(); i++) { + loadSceneVO(projectVO.scenes.get(i).sceneName); + scheduleScene(projectVO.scenes.get(i).sceneName); + } + prepareAssetsToLoad(); + loadAssets(); + } + + /** + * Initializes scene by loading it's VO data object and loading all the assets needed for this particular scene only + * @param sceneName - scene file name without ".dt" extension + */ + public void initScene(String sceneName) { + loadSceneVO(sceneName); + scheduleScene(sceneName); + prepareAssetsToLoad(); + loadAssets(); + } + + /** + * Anloads scene from the memory, and clears all the freed assets + * + * @param sceneName - scene file name without ".dt" extension + */ + public void unLoadScene(String sceneName) { + unScheduleScene(sceneName); + loadedSceneVOs.remove(sceneName); + loadAssets(); + } + + /** + * Schedules scene for later loading + * if later prepareAssetsToLoad function will be called it will only prepare assets that are used in scheduled scene + * + * @param name - scene file name without ".dt" extension + */ + public void scheduleScene(String name) { + if (loadedSceneVOs.containsKey(name)) { + preparedSceneNames.add(name); + } else { + //TODO: Throw exception that scene was not loaded to be prepared for asseting + } + + } + + + /** + * Unschedule scene from later loading + * + * @param name + */ + public void unScheduleScene(String name) { + preparedSceneNames.remove(name); + } + + + /** + * Creates the list of uniqe assets used in all of the scheduled scenes, + * removes all the duplicates, and makes list of assets that are only needed. + * + */ + public void prepareAssetsToLoad() { + particleEffectNamesToLoad.clear(); + spineAnimNamesToLoad.clear(); + spriteAnimNamesToLoad.clear(); + spriterAnimNamesToLoad.clear(); + fontsToLoad.clear(); + shaderPrograms.clear(); + + for (String preparedSceneName : preparedSceneNames) { + CompositeVO composite = loadedSceneVOs.get(preparedSceneName).composite; + if (composite == null) { + continue; + } + // + String[] particleEffects = composite.getRecursiveParticleEffectsList(); + String[] spineAnimations = composite.getRecursiveSpineAnimationList(); + String[] spriteAnimations = composite.getRecursiveSpriteAnimationList(); + String[] spriterAnimations = composite.getRecursiveSpriterAnimationList(); + String[] shaderNames = composite.getRecursiveShaderList(); + FontSizePair[] fonts = composite.getRecursiveFontList(); + for(CompositeItemVO library : projectVO.libraryItems.values()) { + FontSizePair[] libFonts = library.composite.getRecursiveFontList(); + Collections.addAll(fontsToLoad, libFonts); + + // loading particle effects used in library items + String[] libEffects = library.composite.getRecursiveParticleEffectsList(); + Collections.addAll(particleEffectNamesToLoad, libEffects); + } + + // + Collections.addAll(particleEffectNamesToLoad, particleEffects); + Collections.addAll(spineAnimNamesToLoad, spineAnimations); + Collections.addAll(spriteAnimNamesToLoad, spriteAnimations); + Collections.addAll(spriterAnimNamesToLoad, spriterAnimations); + Collections.addAll(fontsToLoad, fonts); + Collections.addAll(shaderNamesToLoad, shaderNames); + } + } + + /** + * Loads all the scheduled assets into memory including + * main atlas pack, particle effects, sprite animations, spine animations and fonts + */ + public void loadAssets() { + loadAtlasPack(); + loadParticleEffects(); + loadSpineAnimations(); + loadSpriteAnimations(); + loadSpriterAnimations(); + loadFonts(); + loadShaders(); + } + + @Override + public void loadAtlasPack() { + FileHandle packFile = Gdx.files.internal(packResolutionName + File.separator + "pack.atlas"); + if (!packFile.exists()) { + return; + } + mainPack = new TextureAtlas(packFile); + } + + @Override + public void loadParticleEffects() { + // empty existing ones that are not scheduled to load + for (String key : particleEffects.keySet()) { + if (!particleEffectNamesToLoad.contains(key)) { + particleEffects.remove(key); + } + } + + // load scheduled + for (String name : particleEffectNamesToLoad) { + ParticleEffect effect = new ParticleEffect(); + effect.load(Gdx.files.internal(particleEffectsPath + File.separator + name), mainPack, ""); + particleEffects.put(name, effect); + } + } + + @Override + public void loadSpriteAnimations() { + // empty existing ones that are not scheduled to load + for (String key : spriteAnimations.keySet()) { + if (!spriteAnimNamesToLoad.contains(key)) { + spriteAnimations.remove(key); + } + } + + for (String name : spriteAnimNamesToLoad) { + TextureAtlas animAtlas = new TextureAtlas(Gdx.files.internal(packResolutionName + File.separator + spriteAnimationsPath + File.separator + name + File.separator + name + ".atlas")); + spriteAnimations.put(name, animAtlas); + } + } + @Override + public void loadSpriterAnimations() { + // empty existing ones that are not scheduled to load + for (String key : spriterAnimations.keySet()) { + if (!spriterAnimNamesToLoad.contains(key)) { + spriterAnimations.remove(key); + } + } + for (String name : spriterAnimNamesToLoad) { + FileHandle animFile = Gdx.files.internal("orig" + File.separator + spriterAnimationsPath + File.separator + name + File.separator + name + ".scml"); + spriterAnimations.put(name, animFile); + } + } + + + public void loadSpineAnimation(String name) { + TextureAtlas animAtlas = new TextureAtlas(Gdx.files.internal(packResolutionName + File.separator + spineAnimationsPath + File.separator + name + File.separator + name + ".atlas")); + skeletonAtlases.put(name, animAtlas); + skeletonJSON.put(name, Gdx.files.internal("orig"+ File.separator + spineAnimationsPath + File.separator + name + File.separator + name + ".json")); + } + + + @Override + public void loadSpineAnimations() { + // empty existing ones that are not scheduled to load + Iterator it = skeletonAtlases.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry)it.next(); + if(spineAnimNamesToLoad.contains(pairs.getKey())) { + spineAnimNamesToLoad.remove(pairs.getKey()); + } else { + it.remove(); + skeletonJSON.remove(pairs.getKey()); + } + } + + + for (String name : spineAnimNamesToLoad) { + loadSpineAnimation(name); + } + } + + @Override + public void loadFonts() { + //resolution related stuff + ResolutionEntryVO curResolution = getProjectVO().getResolution(packResolutionName); + resMultiplier = 1; + if(!packResolutionName.equals("orig")) { + if(curResolution.base == 0) { + resMultiplier = (float) curResolution.width / (float) getProjectVO().originalResolution.width; + } else{ + resMultiplier = (float) curResolution.height / (float) getProjectVO().originalResolution.height; + } + } + + // empty existing ones that are not scheduled to load + for (FontSizePair pair : bitmapFonts.keySet()) { + if (!fontsToLoad.contains(pair)) { + bitmapFonts.remove(pair); + } + } + + for (FontSizePair pair : fontsToLoad) { + loadFont(pair); + } + } + + public void loadFont(FontSizePair pair) { + FileHandle fontFile; + fontFile = Gdx.files.internal(fontsPath + File.separator + pair.fontName + ".ttf"); + FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile); + FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); + parameter.size = Math.round(pair.fontSize * resMultiplier); + BitmapFont font = generator.generateFont(parameter); + font.getRegion().getTexture().setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); + font.setUseIntegerPositions(false); + bitmapFonts.put(pair, font); + } + + @Override + public SceneVO loadSceneVO(String sceneName) { + FileHandle file = Gdx.files.internal(scenesPath + File.separator + sceneName + ".dt"); + Json json = new Json(); + SceneVO sceneVO = json.fromJson(SceneVO.class, file.readString()); + + loadedSceneVOs.put(sceneName, sceneVO); + + return sceneVO; + } + + public void unLoadSceneVO(String sceneName) { + loadedSceneVOs.remove(sceneName); + } + + @Override + public ProjectInfoVO loadProjectVO() { + + FileHandle file = Gdx.files.internal("project.dt"); + Json json = new Json(); + projectVO = json.fromJson(ProjectInfoVO.class, file.readString()); + + return projectVO; + } + + @Override + public void loadShaders() { + // empty existing ones that are not scheduled to load + for (String key : shaderPrograms.keySet()) { + if (!shaderNamesToLoad.contains(key)) { + shaderPrograms.get(key).dispose(); + shaderPrograms.remove(key); + } + } + + for (String name : shaderNamesToLoad) { + ShaderProgram shaderProgram = new ShaderProgram(Gdx.files.internal(shadersPath + File.separator + name + ".vert"), Gdx.files.internal(shadersPath + File.separator + name + ".frag")); + shaderPrograms.put(name, shaderProgram); + } + } + + /** + * Following methods are for retriever interface, which is intended for runtime internal use + * to retrieve any already loaded into memory asset for rendering + */ + + + + + @Override + public TextureRegion getTextureRegion(String name) { + return mainPack.findRegion(name); + } + + @Override + public ParticleEffect getParticleEffect(String name) { + return new ParticleEffect(particleEffects.get(name)); + } + + @Override + public TextureAtlas getSkeletonAtlas(String name) { + return skeletonAtlases.get(name); + } + + @Override + public FileHandle getSkeletonJSON(String name) { + return skeletonJSON.get(name); + } + + @Override + public TextureAtlas getSpriteAnimation(String name) { + return spriteAnimations.get(name); + } + + @Override + public BitmapFont getBitmapFont(String name, int size) { + return bitmapFonts.get(new FontSizePair(name, size)); + } + + @Override + public MySkin getSkin() { + return null; + } + + @Override + public SceneVO getSceneVO(String sceneName) { + return loadedSceneVOs.get(sceneName); + } + + @Override + public ProjectInfoVO getProjectVO() { + return projectVO; + } + + @Override + public ResolutionEntryVO getLoadedResolution() { + if(packResolutionName.equals("orig")) { + return getProjectVO().originalResolution; + } + return getProjectVO().getResolution(packResolutionName); + } + + public void dispose() { + mainPack.dispose(); + } + + @Override + public FileHandle getSCMLFile(String name) { + return spriterAnimations.get(name); + } + + @Override + public ShaderProgram getShaderProgram(String shaderName) { + return shaderPrograms.get(shaderName); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/ResourceManagerLoader.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/ResourceManagerLoader.java new file mode 100644 index 00000000..206edb0d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/resources/ResourceManagerLoader.java @@ -0,0 +1,171 @@ +package games.rednblack.editor.renderer.resources; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.assets.AssetLoaderParameters; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import games.rednblack.editor.renderer.data.ProjectInfoVO; + +import java.io.File; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + +/** + * Created by socheat on 8/13/15. + */ +public class ResourceManagerLoader extends AsynchronousAssetLoader { + + private AsyncResourceManager asyncResourceManager; + + private ProjectInfoVO projectInfoVO; + + public ResourceManagerLoader(FileHandleResolver resolver) { + super(resolver); + this.asyncResourceManager = new AsyncResourceManager(); + } + + @Override + public void loadAsync(AssetManager manager, String fileName, FileHandle file, AsyncResourceManagerParam parameter) { + } + + @Override + public games.rednblack.editor.renderer.resources.ResourceManager loadSync(AssetManager manager, String fileName, FileHandle file, AsyncResourceManagerParam parameter) { + if (!fileName.equals("project.dt")) { + throw new GdxRuntimeException("fileName must be project.dt"); + } + + FileHandle packFile = Gdx.files.internal(this.asyncResourceManager.packResolutionName + File.separator + "pack.atlas"); + TextureAtlas textureAtlas = manager.get(packFile.path(), TextureAtlas.class); + this.asyncResourceManager.setMainPack(textureAtlas); + this.asyncResourceManager.loadParticleEffects(); + this.asyncResourceManager.loadSpineAnimations(manager); + this.asyncResourceManager.loadSpriteAnimations(manager); + this.asyncResourceManager.loadSpriterAnimations(); + this.asyncResourceManager.loadFonts(); + + return this.asyncResourceManager; + } + + @Override + public Array getDependencies(String fileName, FileHandle file, AsyncResourceManagerParam parameter) { + if (!fileName.equals("project.dt")) { + throw new GdxRuntimeException("fileName must be project.dt"); + } + this.projectInfoVO = this.asyncResourceManager.loadProjectVO(); + for (int i = 0; i < this.projectInfoVO.scenes.size(); i++) { + this.asyncResourceManager.loadSceneVO(this.projectInfoVO.scenes.get(i).sceneName); + this.asyncResourceManager.scheduleScene(this.projectInfoVO.scenes.get(i).sceneName); + } + this.asyncResourceManager.prepareAssetsToLoad(); + + Array deps = new Array(); + { + FileHandle packFile = Gdx.files.internal(this.asyncResourceManager.packResolutionName + File.separator + "pack.atlas"); + if (packFile.exists()) { + deps.add(new AssetDescriptor(packFile, TextureAtlas.class)); + } + } + + for (String name : this.asyncResourceManager.getSpineAnimNamesToLoad()) { + FileHandle packFile = Gdx.files.internal(this.asyncResourceManager + File.separator + this.asyncResourceManager.spineAnimationsPath + File.separator + name + File.separator + name + ".atlas"); + deps.add(new AssetDescriptor(packFile, TextureAtlas.class)); + } + + for (String name : this.asyncResourceManager.getSpriteAnimNamesToLoad()) { + FileHandle packFile = Gdx.files.internal(this.asyncResourceManager.packResolutionName + File.separator + this.asyncResourceManager.spriteAnimationsPath + File.separator + name + File.separator + name + ".atlas"); + deps.add(new AssetDescriptor(packFile, TextureAtlas.class)); + } + + return deps; + } + + public static class AsyncResourceManagerParam extends AssetLoaderParameters { + } + + private static class AsyncResourceManager extends games.rednblack.editor.renderer.resources.ResourceManager { + + @Override + public ProjectInfoVO getProjectVO() { + return super.getProjectVO(); + } + + public void setProjectInfoVO(ProjectInfoVO vo) { + this.projectVO = vo; + } + + public HashSet getSpineAnimNamesToLoad() { + return this.spineAnimNamesToLoad; + } + + public void setMainPack(TextureAtlas mainPack) { + this.mainPack = mainPack; + } + + @Override + public void loadSpineAnimations() { + throw new GdxRuntimeException("see loadSpineAnimations(AssetManager)"); + } + + @Override + public void loadSpineAnimation(String name) { + throw new GdxRuntimeException("see loadSpineAnimation(AssetManager, String)"); + } + + public void loadSpineAnimations(AssetManager manager) { + Iterator it = skeletonAtlases.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry) it.next(); + if (spineAnimNamesToLoad.contains(pairs.getKey())) { + spineAnimNamesToLoad.remove(pairs.getKey()); + } else { + it.remove(); + skeletonJSON.remove(pairs.getKey()); + } + } + + + for (String name : spineAnimNamesToLoad) { + loadSpineAnimation(manager, name); + } + } + + public void loadSpineAnimation(AssetManager manager, String name) { + FileHandle packFile = Gdx.files.internal(packResolutionName + File.separator + spineAnimationsPath + File.separator + name + File.separator + name + ".atlas"); + TextureAtlas animAtlas = manager.get(packFile.path(), TextureAtlas.class); + skeletonAtlases.put(name, animAtlas); + skeletonJSON.put(name, Gdx.files.internal("orig" + File.separator + spineAnimationsPath + File.separator + name + File.separator + name + ".json")); + } + + + @Override + public void loadSpriteAnimations() { + throw new GdxRuntimeException("see loadSpriteAnimations(AssetManager)"); + } + + public HashSet getSpriteAnimNamesToLoad() { + return this.spriteAnimNamesToLoad; + } + + public void loadSpriteAnimations(AssetManager manager) { + // empty existing ones that are not scheduled to load + for (String key : spriteAnimations.keySet()) { + if (!spriteAnimNamesToLoad.contains(key)) { + spriteAnimations.remove(key); + } + } + + for (String name : spriteAnimNamesToLoad) { + FileHandle packFile = Gdx.files.internal(packResolutionName + File.separator + spriteAnimationsPath + File.separator + name + File.separator + name + ".atlas"); + spriteAnimations.put(name, manager.get(packFile.path(), TextureAtlas.class)); + } + } + } +} + diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/ButtonClickListener.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/ButtonClickListener.java new file mode 100644 index 00000000..c6836048 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/ButtonClickListener.java @@ -0,0 +1,26 @@ +package games.rednblack.editor.renderer.scene2d; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; + +/** + * Created by CyberJoe on 8/1/2015. + */ +public class ButtonClickListener extends ClickListener { + + @Override + public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { + CompositeActor compositeActor = (CompositeActor) event.getListenerActor(); + compositeActor.setLayerVisibility("normal", false); + compositeActor.setLayerVisibility("pressed", true); + return true; + } + + @Override + public void touchUp (InputEvent event, float x, float y, int pointer, int button) { + CompositeActor compositeActor = (CompositeActor) event.getListenerActor(); + compositeActor.setLayerVisibility("normal", true); + compositeActor.setLayerVisibility("pressed", false); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/CompositeActor.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/CompositeActor.java new file mode 100644 index 00000000..b91cc701 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scene2d/CompositeActor.java @@ -0,0 +1,357 @@ +package games.rednblack.editor.renderer.scene2d; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.scripts.IActorScript; +import games.rednblack.editor.renderer.utils.CustomVariables; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + + +/** + * Created by azakhary on 7/26/2015. + */ +public class CompositeActor extends Group { + + protected IResourceRetriever ir; + + private float pixelsPerWU; + private float resMultiplier; + + protected CompositeItemVO vo; + private ArrayList scripts = new ArrayList(3); + private HashMap indexes = new HashMap(); + private HashMap layerMap = new HashMap(); + + public CompositeActor(CompositeItemVO vo, IResourceRetriever ir) { + this(vo, ir, BuiltItemHandler.DEFAULT); + } + + public CompositeActor(CompositeItemVO vo, IResourceRetriever ir, BuiltItemHandler itemHandler) { + this(vo, ir, itemHandler, true); + } + + private CompositeActor(CompositeItemVO vo, IResourceRetriever ir, BuiltItemHandler itemHandler, boolean isRoot) { + this.ir= ir; + this.vo = vo; + + pixelsPerWU = ir.getProjectVO().pixelToWorld; + + ResolutionEntryVO resolutionEntryVO = ir.getLoadedResolution(); + resMultiplier = resolutionEntryVO.getMultiplier(ir.getProjectVO().originalResolution); + + makeLayerMap(vo); + build(vo, itemHandler, isRoot); + } + + private void makeLayerMap(CompositeItemVO vo) { + layerMap.clear(); + for(int i = 0; i < vo.composite.layers.size(); i++) { + layerMap.put(vo.composite.layers.get(i).layerName,vo.composite.layers.get(i)); + } + } + + protected void build(CompositeItemVO vo, BuiltItemHandler itemHandler, boolean isRoot) { + buildImages(vo.composite.sImages, itemHandler); + build9PatchImages(vo.composite.sImage9patchs, itemHandler); + buildLabels(vo.composite.sLabels, itemHandler); + buildComposites(vo.composite.sComposites, itemHandler); + processZIndexes(); + recalculateSize(); + + if(isRoot) { + buildCoreData(this, vo); + itemHandler.onItemBuild(this); + } + } + + protected void buildComposites(ArrayList composites, BuiltItemHandler itemHandler) { + + for(int i = 0; i < composites.size(); i++) { + String className = getClassName(composites.get(i).customVars); + CompositeActor actor; + if(className!=null){ + try { + Class c = Class.forName(className); + actor = (CompositeActor) c.getConstructors()[0].newInstance(composites.get(i), ir, itemHandler); + }catch (Exception ex){ + actor = new CompositeActor(composites.get(i), ir, itemHandler, false); + } + }else { + actor = new CompositeActor(composites.get(i), ir, itemHandler, false); + } + processMain(actor, composites.get(i)); + addActor(actor); + + itemHandler.onItemBuild(actor); + } + } + + private String getClassName(String customVars) { + CustomVariables cv = new CustomVariables(); + cv.loadFromString(customVars); + String className = cv.getStringVariable("className"); + if(className!=null && className.equals("")){ + className = null; + } + return className; + } + + public void addScript(IActorScript iScript) { + scripts.add(iScript); + iScript.init(this); + } + + protected void buildImages(ArrayList images, BuiltItemHandler itemHandler) { + for(int i = 0; i < images.size(); i++) { + Image image = new Image(ir.getTextureRegion(images.get(i).imageName)); + processMain(image, images.get(i)); + addActor(image); + + itemHandler.onItemBuild(image); + } + } + + protected void build9PatchImages(ArrayList patches, BuiltItemHandler itemHandler) { + for(int i = 0; i < patches.size(); i++) { + TextureAtlas.AtlasRegion region = (TextureAtlas.AtlasRegion) ir.getTextureRegion(patches.get(i).imageName); + NinePatch ninePatch = new NinePatch(region, region.splits[0], region.splits[1], region.splits[2], region.splits[3]); + Image image = new Image(ninePatch); + image.setWidth(patches.get(i).width*pixelsPerWU/resMultiplier); + image.setHeight(patches.get(i).height * pixelsPerWU/resMultiplier); + processMain(image, patches.get(i)); + addActor(image); + + itemHandler.onItemBuild(image); + } + } + + protected void buildLabels(ArrayList labels, BuiltItemHandler itemHandler) { + for(int i = 0; i < labels.size(); i++) { + Label.LabelStyle style = new Label.LabelStyle(ir.getBitmapFont(labels.get(i).style, labels.get(i).size), Color.WHITE); + Label label = new Label(labels.get(i).text, style); + label.setAlignment(labels.get(i).align); + label.setWidth(labels.get(i).width * pixelsPerWU / resMultiplier); + label.setHeight(labels.get(i).height * pixelsPerWU / resMultiplier); + processMain(label, labels.get(i)); + addActor(label); + + itemHandler.onItemBuild(label); + } + } + + protected void processMain(Actor actor, MainItemVO vo) { + + actor.setName(vo.itemIdentifier); + buildCoreData(actor, vo); + + //actor properties + actor.setPosition(vo.x * pixelsPerWU/resMultiplier, vo.y * pixelsPerWU/resMultiplier); + actor.setOrigin(vo.originX * pixelsPerWU/resMultiplier, vo.originY * pixelsPerWU/resMultiplier); + actor.setScale(vo.scaleX, vo.scaleY); + actor.setRotation(vo.rotation); + actor.setColor(new Color(vo.tint[0], vo.tint[1], vo.tint[2], vo.tint[3])); + + indexes.put(getLayerIndex(vo.layerName) + vo.zIndex, actor); + + if(layerMap.get(vo.layerName).isVisible) { + actor.setVisible(true); + } else { + actor.setVisible(false); + } + } + + protected void buildCoreData(Actor actor, MainItemVO vo){ + + //custom variables + CustomVariables cv = null; + if(vo.customVars != null && !vo.customVars.isEmpty()) { + cv = new CustomVariables(); + cv.loadFromString(vo.customVars); + } + + //core data + CoreActorData data = new CoreActorData(); + data.id = vo.itemIdentifier; + data.layerIndex = getLayerIndex(vo.layerName); + data.tags = vo.tags; + data.customVars = cv; + + actor.setUserObject(data); + } + + + protected void processZIndexes() { + Object[] indexArray = indexes.keySet().toArray(); + Arrays.sort(indexArray); + + for(int i = 0; i < indexArray.length; i++) { + indexes.get(indexArray[i]).setZIndex(i); + } + } + + public int getLayerIndex(String name) { + return vo.composite.layers.indexOf(layerMap.get(name)); + } + + public Actor getItem(String id) { + for(Actor actor: getChildren()) { + Object userObject = actor.getUserObject(); + if(userObject != null && userObject instanceof CoreActorData + && (id.equals(((CoreActorData) userObject).id))) { + return actor; + } + } + return null; + } + + public void recalculateSize() { + float lowerX = 0, lowerY = 0, upperX = 0, upperY = 0; + for (int i = 0; i < getChildren().size; i++) { + Actor value = getChildren().get(i); + if (i == 0) { + if (value.getScaleX() > 0 && value.getWidth() * value.getScaleX() > 0) { + lowerX = value.getX(); + upperX = value.getX() + value.getWidth() * value.getScaleX(); + } else { + upperX = value.getX(); + lowerX = value.getX() + value.getWidth() * value.getScaleX(); + } + + if (value.getScaleY() > 0 && value.getHeight() * value.getScaleY() > 0) { + lowerY = value.getY(); + upperY = value.getY() + value.getHeight() * value.getScaleY(); + } else { + upperY = value.getY(); + lowerY = value.getY() + value.getHeight() * value.getScaleY(); + } + } + if (value.getScaleX() > 0 && value.getWidth() > 0) { + if (lowerX > value.getX()) lowerX = value.getX(); + if (upperX < value.getX() + value.getWidth() * value.getScaleX()) + upperX = value.getX() + value.getWidth() * value.getScaleX(); + } else { + if (upperX < value.getX()) upperX = value.getX(); + if (lowerX > value.getX() + value.getWidth() * value.getScaleX()) + lowerX = value.getX() + value.getWidth() * value.getScaleX(); + } + if (value.getScaleY() > 0 && value.getHeight() * value.getScaleY() > 0) { + if (lowerY > value.getY()) lowerY = value.getY(); + if (upperY < value.getY() + value.getHeight() * value.getScaleY()) + upperY = value.getY() + value.getHeight() * value.getScaleY(); + } else { + if (upperY < value.getY()) upperY = value.getY(); + if (lowerY > value.getY() + value.getHeight() * value.getScaleY()) + lowerY = value.getY() + value.getHeight() * value.getScaleY(); + } + + } + + setWidth(upperX); + setHeight(upperY); + } + + public void setLayerVisibility(String layerName, boolean isVisible) { + final int layerIndex = getLayerIndex(layerName); + layerMap.get(layerName).isVisible = isVisible; + + for(Actor actor: getChildren()) { + Object userObject = actor.getUserObject(); + if(userObject != null && userObject instanceof CoreActorData + && ((CoreActorData)userObject).layerIndex == layerIndex) { + actor.setVisible(isVisible); + } + } + } + + /** + * get's list of children that contain a specified tag. + * Does not yet go in depth. + * + * @param tag + * @return + */ + public Array getItemsByTag(String tag) { + Array items = new Array(); + for(Actor actor: getChildren()) { + Object userObject = actor.getUserObject(); + if(userObject != null && userObject instanceof CoreActorData) { + CoreActorData data = (CoreActorData) userObject; + if(data.tags != null && Arrays.asList(data.tags).contains(tag)) + items.add(actor); + } + } + + return items; + } + + /** + * returns children of this actor that are on specified layer + * @param layerName + * @return + */ + public Array getItemsByLayer(String layerName) { + final int layerIndex = getLayerIndex(layerName); + Array items = new Array(); + + for(Actor actor: getChildren()) { + Object userObject = actor.getUserObject(); + if(userObject != null && userObject instanceof CoreActorData + && ((CoreActorData)userObject).layerIndex == layerIndex) { + items.add(actor); + } + } + return items; + } + + public ArrayList getScripts() { + return scripts; + } + + public CompositeItemVO getVo() { + return vo; + } + + /** + * Enables customization of the CompositeActor during building. + * Example use cases: tag handling, custom variables handling + */ + public interface BuiltItemHandler { + + BuiltItemHandler DEFAULT = new BuiltItemHandler() { + @Override + public void onItemBuild(Actor item) { + + if(item instanceof CompositeActor) { + CoreActorData data = (CoreActorData) item.getUserObject(); + if(data != null && data.tags != null && Arrays.asList(data.tags).contains("button")) + item.addListener(new ButtonClickListener()); + } + } + }; + + /** + * @param item newly built and added to a parent (in case it's not a root actor) + */ + void onItemBuild(Actor item); + + } + + @Override + public void act(float delta) { + for (int i = 0; i < scripts.size(); i++) { + scripts.get(i).act(delta); + } + super.act(delta); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/BasicScript.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/BasicScript.java new file mode 100644 index 00000000..75622c01 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/BasicScript.java @@ -0,0 +1,20 @@ +package games.rednblack.editor.renderer.scripts; + +import com.badlogic.ashley.core.Entity; + +/** + * Created by CyberJoe on 6/19/2015. + */ +public abstract class BasicScript implements IScript { + + protected Entity entity; + + @Override + public void init(Entity item) { + entity = item; + } + + public Entity getEntity() { + return entity; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IActorScript.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IActorScript.java new file mode 100644 index 00000000..d003a867 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IActorScript.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.renderer.scripts; + +import games.rednblack.editor.renderer.scene2d.CompositeActor; + + +public interface IActorScript { + public void init(CompositeActor entity); + + public void act(float delta); + + public void dispose(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IScript.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IScript.java new file mode 100644 index 00000000..ceaddbb9 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/scripts/IScript.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.renderer.scripts; + +import com.badlogic.ashley.core.Entity; + + +public interface IScript { + public void init(Entity entity); + + public void act(float delta); + + public void dispose(); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/BoundingBoxSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/BoundingBoxSystem.java new file mode 100644 index 00000000..83b8c6d5 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/BoundingBoxSystem.java @@ -0,0 +1,149 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; + +public class BoundingBoxSystem extends IteratingSystem { + + final private ComponentMapper dimensionsMapper; + final private ComponentMapper parentNodeMapper; + final private ComponentMapper boundingBoxMapper; + final private ComponentMapper mainItemMapper; + final private ComponentMapper spriterMapper; + final private ComponentMapper transformMapper; + final private ComponentMapper nodeMapper; + + public BoundingBoxSystem() { + super(Family.all(BoundingBoxComponent.class).get()); + dimensionsMapper = ComponentMapper.getFor(DimensionsComponent.class); + parentNodeMapper = ComponentMapper.getFor(ParentNodeComponent.class); + boundingBoxMapper = ComponentMapper.getFor(BoundingBoxComponent.class); + mainItemMapper = ComponentMapper.getFor(MainItemComponent.class); + spriterMapper = ComponentMapper.getFor(SpriterComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + nodeMapper = ComponentMapper.getFor(NodeComponent.class); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + ParentNodeComponent parentNode = parentNodeMapper.get(entity); + BoundingBoxComponent b = boundingBoxMapper.get(entity); + + MainItemComponent m = null; + if (parentNode != null){ + m = mainItemMapper.get(parentNode.parentEntity); + } + + SpriterComponent s = spriterMapper.get(entity); + DimensionsComponent d = dimensionsMapper.get(entity); + TransformComponent t = transformMapper.get(entity); + + if (m != null && !m.visible) + return; + + if (calcCheckSum(entity) != b.checksum) { + + NodeComponent n = nodeMapper.get(entity); + if (s != null) { + com.brashmonkey.spriter.Rectangle r = s.player.getBoudingRectangle(null); + b.points[0].set(r.left, r.bottom); + b.points[1].set(r.right, r.bottom ); + b.points[2].set(r.right, r.top); + b.points[3].set(r.left, r.top); + } else if (t.rotation == 0) { + + float scaleOffsetX; + float scaleOffsetY; + + if (n==null) { + scaleOffsetX = (d.width*t.scaleX - d.width) /2 ; + scaleOffsetY = (d.height*t.scaleY - d.height) /2 ; + } else { + scaleOffsetX = 0; + scaleOffsetY = 0; + } + + b.points[0].set(t.x -scaleOffsetX,t.y -scaleOffsetY); + b.points[1].set(t.x -scaleOffsetX + d.width*t.scaleX,t.y -scaleOffsetY); + b.points[2].set(t.x -scaleOffsetX + d.width*t.scaleX,t.y -scaleOffsetY + d.height*t.scaleY); + b.points[3].set(t.x -scaleOffsetX ,t.y -scaleOffsetY + d.height*t.scaleY); + + } else { + float pivotX, pivotY; + if (n != null) { + pivotX = 0; + pivotY = 0; + } else { + pivotX = (d.width *t.scaleX) / 2; + pivotY = (d.height*t.scaleY) / 2; + } + calcFor (b, t, d, pivotX, pivotY); + } + + while (parentNode != null) { + TransformComponent parentTransform = transformMapper.get(parentNode.parentEntity); + if (parentTransform.rotation != 0) { + for(int i = 0; i < 4; i++) + b.points[i].rotate(parentTransform.rotation); + } + + for(int i = 0; i < 4; i++) { + b.points[i].x = b.points[i].x * parentTransform.scaleX + parentTransform.x; + b.points[i].y = b.points[i].y * parentTransform.scaleY + parentTransform.y; + } + parentNode = parentNodeMapper.get(parentNode.parentEntity); + } + b.checksum = calcCheckSum(entity); + b.getBoundingRect(); + } + } + + private float calcCheckSum(Entity entity) { + + ParentNodeComponent parentNode = parentNodeMapper.get(entity); + TransformComponent t = transformMapper.get(entity); + + float checksum = 0; + checksum = t.rotation + t.scaleX + t.scaleY + t.x + t.y; + while (parentNode != null) { + TransformComponent pt = transformMapper.get(parentNode.parentEntity); + checksum += pt.rotation + pt.scaleX + pt.scaleY + pt.x + pt.y; + parentNode = parentNodeMapper.get(parentNode.parentEntity); + } + return checksum; + } + + private void calcFor(BoundingBoxComponent box, TransformComponent transform, DimensionsComponent dimension, float pivotX, float pivotY) { + + float width = dimension.width*transform.scaleX; + float height = dimension.height*transform.scaleY; + + box.points[0].set(-pivotX,-pivotY); + box.points[1].set(width-pivotX, -pivotY); + box.points[2].set(-pivotX,height-pivotY); + box.points[3].set(width-pivotX,height-pivotY); + + float scaleOffsetX; + float scaleOffsetY; + + if (pivotX == 0 && pivotY == 0) { + scaleOffsetX = 0; + scaleOffsetY = 0; + } else { + scaleOffsetX = (width - dimension.width) /2 ; + scaleOffsetY = (height - dimension.height) /2 ; + } + + for(int i = 0; i < 4; i++) + box.points[i].rotate(transform.rotation); + + for(int i = 0; i < 4; i++) { + box.points[i].x = box.points[i].x + transform.x - scaleOffsetX + pivotX; + box.points[i].y = box.points[i].y + transform.y - scaleOffsetY + pivotY; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ButtonSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ButtonSystem.java new file mode 100644 index 00000000..c7633711 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ButtonSystem.java @@ -0,0 +1,81 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.additional.ButtonComponent;import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.TransformMathUtils; + +/** + * Created by azakhary on 8/1/2015. + */ +public class ButtonSystem extends IteratingSystem { + + + public ButtonSystem() { + super(Family.all(ButtonComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + NodeComponent nodeComponent = ComponentRetriever.get(entity, NodeComponent.class); + + if(nodeComponent == null) return; + + for (int i = 0; i < nodeComponent.children.size; i++) { + Entity childEntity = nodeComponent.children.get(i); + MainItemComponent childMainItemComponent = ComponentRetriever.get(childEntity, MainItemComponent.class); + childMainItemComponent.visible = true; + } + + ViewPortComponent camera = ComponentRetriever.get(entity, ViewPortComponent.class); + if(camera != null) { + // if camera is on this entity, then it should not be processed + return; + } + + + for (int i = 0; i < nodeComponent.children.size; i++) { + Entity childEntity = nodeComponent.children.get(i); + MainItemComponent childMainItemComponent = ComponentRetriever.get(childEntity, MainItemComponent.class); + ZIndexComponent childZComponent = ComponentRetriever.get(childEntity, ZIndexComponent.class); + if(isTouched(entity)) { + if(childZComponent.layerName.equals("normal")) { + childMainItemComponent.visible = false; + } + if(childZComponent.layerName.equals("pressed")) { + childMainItemComponent.visible = true; + } + } else { + if(childZComponent.layerName.equals("normal")) { + childMainItemComponent.visible = true; + } + if(childZComponent.layerName.equals("pressed")) { + childMainItemComponent.visible = false; + } + } + } + + } + + private boolean isTouched(Entity entity) { + ButtonComponent buttonComponent = entity.getComponent(ButtonComponent.class); + if(Gdx.input.isTouched()) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + Vector2 localCoordinates = new Vector2(Gdx.input.getX(), Gdx.input.getY()); + + TransformMathUtils.globalToLocalCoordinates(entity, localCoordinates); + + if(dimensionsComponent.hit(localCoordinates.x, localCoordinates.y)) { + buttonComponent.setTouchState(true); + return true; + } + } + buttonComponent.setTouchState(false); + return false; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CompositeSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CompositeSystem.java new file mode 100644 index 00000000..b20e1cb7 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CompositeSystem.java @@ -0,0 +1,144 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Matrix3; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.SnapshotArray; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.utils.TransformMathUtils; + +public class CompositeSystem extends IteratingSystem { + + private ComponentMapper dimensionsMapper; + private ComponentMapper transformMapper; + private ComponentMapper nodeMapper; + private ComponentMapper compositeMapper; + + private DimensionsComponent dimensionsComponent; + private NodeComponent nodeComponent; + + private final Vector2 p1 = new Vector2(); + private final Vector2 p2 = new Vector2(); + private final Vector2 p3 = new Vector2(); + private final Vector2 p4 = new Vector2(); + private final Vector2 tmpBoundPoints = new Vector2(); + + public CompositeSystem() { + super(Family.all(CompositeTransformComponent.class).get()); + dimensionsMapper = ComponentMapper.getFor(DimensionsComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + nodeMapper = ComponentMapper.getFor(NodeComponent.class); + compositeMapper = ComponentMapper.getFor(CompositeTransformComponent.class); + } + + @Override + public void processEntity(Entity entity, float deltaTime) { + dimensionsComponent = dimensionsMapper.get(entity); + nodeComponent = nodeMapper.get(entity); + TransformComponent transformComponent = transformMapper.get(entity); + + CompositeTransformComponent compositeTransformComponent = compositeMapper.get(entity); + ViewPortComponent viewPortComponent = entity.getComponent(ViewPortComponent.class); + if (compositeTransformComponent != null) { + + if (compositeTransformComponent.automaticResize && viewPortComponent == null) { + recalculateSize(); + } + + compositeTransformComponent.clipBounds.set(transformComponent.x, transformComponent.y, dimensionsComponent.width, dimensionsComponent.height); + } + } + + private void recalculateSize() { + float lowerX = Float.MAX_VALUE; + float lowerY = Float.MAX_VALUE; + float upperX = Float.MIN_VALUE; + float upperY = Float.MIN_VALUE; + SnapshotArray entities = nodeComponent.children; + for (Entity entity : entities) { + TransformComponent transformComponent = transformMapper.get(entity); + DimensionsComponent childDimCom = dimensionsMapper.get(entity); + float x = transformComponent.x; + float y = transformComponent.y; + float width = childDimCom.width; + float height = childDimCom.height; + + Matrix3 transMat = TransformMathUtils.transform(transformComponent); + + p1.set(x, y).mul(transMat); + p2.set(x + width, y).mul(transMat); + p3.set(x + width, y + height).mul(transMat); + p4.set(x, y + height).mul(transMat); + + tmpBoundPoints.set(lowerX, 0); + lowerX = getX(MinMaxOp.MIN, p1, p2, p3, p4, tmpBoundPoints); + + tmpBoundPoints.set(upperX, 0); + upperX = getX(MinMaxOp.MAX, p1, p2, p3, p4, tmpBoundPoints); + + tmpBoundPoints.set(0, lowerY); + lowerY = getY(MinMaxOp.MIN, p1, p2, p3, p4, tmpBoundPoints); + + tmpBoundPoints.set(0, upperY); + upperY = getY(MinMaxOp.MAX, p1, p2, p3, p4, tmpBoundPoints); + } + + for (Entity entity : entities) { + if (lowerX == 0 && lowerY == 0) break; + TransformComponent transformComponent = transformMapper.get(entity); + transformComponent.x -= lowerX; + transformComponent.y -= lowerY; + } + + dimensionsComponent.width = (upperX - lowerX); + dimensionsComponent.height = (upperY - lowerY); + lowerX = 0; + lowerY = 0; + dimensionsComponent.boundBox.set(lowerX, lowerY, dimensionsComponent.width, dimensionsComponent.height); + } + + private float getX(MinMaxOp op, Vector2... points) { + float pointX = points[0].x; + for (Vector2 point : points) { + pointX = op.compare(pointX, point.x); + } + return pointX; + } + + private float getY(MinMaxOp op, Vector2... points) { + float pointY = points[0].y; + for (Vector2 point : points) { + pointY = op.compare(pointY, point.y); + } + return pointY; + } + + private enum MinMaxOp { + MIN("<") { + @Override + public float compare(float a, float b) { + return (a < b) ? a : b; + } + }, + + MAX(">") { + @Override + public float compare(float a, float b) { + return (a > b) ? a : b; + } + }; + + private String minMaxOperator; + + MinMaxOp(String minMaxOperator) { + this.minMaxOperator = minMaxOperator; + } + + public abstract float compare(float a, float b); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CullingSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CullingSystem.java new file mode 100644 index 00000000..060454fd --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/CullingSystem.java @@ -0,0 +1,74 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.math.Rectangle; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; + +public class CullingSystem extends IteratingSystem { + + final private ComponentMapper viewPortMapper; + final private ComponentMapper nodeMapper; + final private ComponentMapper boundingBoxMapper; + final private ComponentMapper mainItemMapper; + final private ComponentMapper physicsBodyMapper; + + Rectangle view = new Rectangle(); + OrthographicCamera camera; + + public CullingSystem() { + super(Family.all(ViewPortComponent.class).get()); + viewPortMapper = ComponentMapper.getFor(ViewPortComponent.class); + nodeMapper = ComponentMapper.getFor(NodeComponent.class); + boundingBoxMapper = ComponentMapper.getFor(BoundingBoxComponent.class); + mainItemMapper = ComponentMapper.getFor(MainItemComponent.class); + physicsBodyMapper = ComponentMapper.getFor(PhysicsBodyComponent.class); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + ViewPortComponent viewPort = viewPortMapper.get(entity); + this.camera = (OrthographicCamera) viewPort.viewPort.getCamera(); + view.width = ( camera.viewportWidth * camera.zoom ) ; + view.height = ( camera.viewportHeight * camera.zoom ) ; + view.x = camera.position.x - ( view.width / 2 ); + view.y = camera.position.y - ( view.height / 2 ); + + NodeComponent node = nodeMapper.get(entity); + Entity[] children = node.children.begin(); + for (int i = 0, n = node.children.size; i < n; i++) { + Entity child = children[i]; + cull(child); + } + node.children.end(); + } + + void cull(Entity entity) { + BoundingBoxComponent b = boundingBoxMapper.get(entity); + if (b==null) return; + PhysicsBodyComponent p = physicsBodyMapper.get(entity); + if (p!= null) + if (p.bodyType > 1) return; + + MainItemComponent m = mainItemMapper.get(entity); + + m.visible = view.overlaps(b.rectangle); + + if (m.visible) { + NodeComponent node = nodeMapper.get(entity); + + if (node != null) { + Entity[] children = node.children.begin(); + for (int i = 0, n = node.children.size; i < n; i++) { + Entity child = children[i]; + cull(child); + } + node.children.end(); + } + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LabelSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LabelSystem.java new file mode 100644 index 00000000..2dd17d45 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LabelSystem.java @@ -0,0 +1,181 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.StringBuilder; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.label.LabelComponent; + +public class LabelSystem extends IteratingSystem { + private ComponentMapper labelComponentMapper = ComponentMapper.getFor(LabelComponent.class); + private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + private ComponentMapper dimensionComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); + private TransformComponent transformComponent; + private LabelComponent labelComponent; + private DimensionsComponent dimensionsComponent; + + public LabelSystem() { + super(Family.all(LabelComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + + transformComponent = transformComponentMapper.get(entity); + labelComponent = labelComponentMapper.get(entity); + dimensionsComponent = dimensionComponentMapper.get(entity); + + BitmapFont font = labelComponent.cache.getFont(); + + float oldScaleX = font.getScaleX(); + float oldScaleY = font.getScaleY(); + float fontScaleX = labelComponent.fontScaleX; + float fontScaleY = labelComponent.fontScaleY; + if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(fontScaleX, fontScaleY); + + //horisontal Align + + float textWidth = labelComponent.layout.width; + float textHeight = labelComponent.layout.height; + float textX = 0; + + /*if (labelComponent.wrap || labelComponent.text.indexOf("\n") != -1) { + // If the text can span multiple lines, determine the text's actual size so it can be aligned within the label. + labelComponent.layout.setText(font, labelComponent.text, 0, labelComponent.text.length, Color.WHITE, dimensionsComponent.width, labelComponent.lineAlign, labelComponent.wrap, null); + textWidth = labelComponent.layout.width; + textHeight = labelComponent.layout.height; + + if ((labelComponent.lineAlign & Align.left) == 0) { + if ((labelComponent.lineAlign & Align.right) != 0) + textX += dimensionsComponent.width - textWidth; + else + textX += (dimensionsComponent.width - textWidth) / 2; + } + }*/ + + //vertical Align + float textY = textHeight; + if ((labelComponent.labelAlign & Align.top) != 0) { + textY += labelComponent.cache.getFont().isFlipped() ? 0 : dimensionsComponent.height - textHeight; + textY += labelComponent.style.font.getDescent(); + } else if ((labelComponent.labelAlign & Align.bottom) != 0) { + textY += labelComponent.cache.getFont().isFlipped() ? dimensionsComponent.height - textHeight : 0; + textY -= labelComponent.style.font.getDescent(); + } else { + textY += (dimensionsComponent.height - textHeight) / 2; + } + + labelComponent.layout.setText(font, labelComponent.text, 0, labelComponent.text.length, Color.WHITE, dimensionsComponent.width, labelComponent.lineAlign, labelComponent.wrap, null); + labelComponent.cache.setText(labelComponent.layout, textX, textY); + + if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(oldScaleX, oldScaleY); + } + +// private void scaleAndComputePrefSize () { +// BitmapFont font = labelComponent.cache.getFont(); +// float oldScaleX = font.getScaleX(); +// float oldScaleY = font.getScaleY(); +// float fontScaleX = labelComponent.fontScaleX; +// float fontScaleY = labelComponent.fontScaleY; +// if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(fontScaleX, fontScaleY); +// +// computePrefSize(); +// +// if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(oldScaleX, oldScaleY); +// } +// +// private void computePrefSize () { +// if (labelComponent.wrap) { +// float width = dimensionsComponent.width; +// if (labelComponent.style.background != null) width -= labelComponent.style.background.getLeftWidth() + labelComponent.style.background.getRightWidth(); +// labelComponent.layout.setText(labelComponent.cache.getFont(), labelComponent.text, Color.WHITE, width, Align.left, true); +// } else +// labelComponent.layout.setText(labelComponent.cache.getFont(), labelComponent.text); +// labelComponent.prefSize.set(labelComponent.layout.width, labelComponent.layout.height); +// } +// +// public float getPrefWidth () { +// if (labelComponent.wrap) return 0; +// scaleAndComputePrefSize(); +// float width = labelComponent.prefSize.x; +// Drawable background = labelComponent.style.background; +// if (background != null) width += background.getLeftWidth() + background.getRightWidth(); +// return width; +// } +// +// public float getPrefHeight () { +// scaleAndComputePrefSize(); +// float height = labelComponent.prefSize.y - labelComponent.style.font.getDescent() * labelComponent.fontScaleY * 2; +// Drawable background = labelComponent.style.background; +// if (background != null) height += background.getTopHeight() + background.getBottomHeight(); +// return height; +// } +// +// public void layout () { +// BitmapFont font = labelComponent.cache.getFont(); +// float oldScaleX = font.getScaleX(); +// float oldScaleY = font.getScaleY(); +// float fontScaleX = labelComponent.fontScaleX; +// float fontScaleY = labelComponent.fontScaleY; +// if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(fontScaleX, fontScaleY); +// +// boolean wrap = labelComponent.wrap; +// +// float width = dimensionsComponent.width, height = dimensionsComponent.height; +// Drawable background = labelComponent.style.background; +// float x = 0, y = 0; +// if (background != null) { +// x = background.getLeftWidth(); +// y = background.getBottomHeight(); +// width -= background.getLeftWidth() + background.getRightWidth(); +// height -= background.getBottomHeight() + background.getTopHeight(); +// } +// +// GlyphLayout layout = labelComponent.layout; +// float textWidth, textHeight; +// StringBuilder text = labelComponent.text; +// int labelAlign = labelComponent.labelAlign; +// int lineAlign = labelComponent.lineAlign; +// if (wrap || text .indexOf("\n") != -1) { +// // If the text can span multiple lines, determine the text's actual size so it can be aligned within the label. +// layout.setText(font, text, 0, text.length, Color.WHITE, width, lineAlign , wrap, null); +// textWidth = layout.width; +// textHeight = layout.height; +// +// if ((labelAlign & Align.left) == 0) { +// if ((labelAlign & Align.right) != 0) +// x += width - textWidth; +// else +// x += (width - textWidth) / 2; +// } +// } else { +// textWidth = width; +// textHeight = font.getData().capHeight; +// } +// +// if ((labelAlign & Align.top) != 0) { +// y += labelComponent.cache.getFont().isFlipped() ? 0 : height - textHeight; +// y += labelComponent.style.font.getDescent(); +// } else if ((labelAlign & Align.bottom) != 0) { +// y += labelComponent.cache.getFont().isFlipped() ? height - textHeight : 0; +// y -= labelComponent.style.font.getDescent(); +// } else { +// y += (height - textHeight) / 2; +// } +// if (!labelComponent.cache.getFont().isFlipped()) y += textHeight; +// +// layout.setText(font, text, 0, text.length, Color.WHITE, textWidth, lineAlign, wrap, null); +// labelComponent.cache.setText(layout, x, y); +// +// if (fontScaleX != 1 || fontScaleY != 1) font.getData().setScale(oldScaleX, oldScaleY); +// } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LayerSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LayerSystem.java new file mode 100644 index 00000000..2df5ae2d --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LayerSystem.java @@ -0,0 +1,95 @@ +package games.rednblack.editor.renderer.systems; + +import java.util.ArrayList; +import java.util.Comparator; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.utils.SnapshotArray; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +public class LayerSystem extends IteratingSystem { + + private Comparator comparator = new ZComparator(); + + private ComponentMapper zIndexMapper; + private ComponentMapper layerMapper; + private ComponentMapper nodeMapper; + + public LayerSystem() { + super(Family.all(CompositeTransformComponent.class).get()); + zIndexMapper = ComponentMapper.getFor(ZIndexComponent.class); + layerMapper = ComponentMapper.getFor(LayerMapComponent.class); + nodeMapper = ComponentMapper.getFor(NodeComponent.class); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + NodeComponent nodeComponent = nodeMapper.get(entity); + LayerMapComponent layerMapComponent = layerMapper.get(entity); + updateLayers(nodeComponent.children, layerMapComponent); + + sort(nodeComponent.children); + + if(layerMapComponent.autoIndexing){ + updateZindexes(nodeComponent.children); + } + } + + private void updateLayers(SnapshotArray children, LayerMapComponent layerMapComponent) { + for (int i = 0; i < children.size; i++) { + Entity entity = children.get(i); + ZIndexComponent zindexComponent = zIndexMapper.get(entity); + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + zindexComponent.layerIndex = getlayerIndexByName(zindexComponent.layerName,layerMapComponent); + if(zindexComponent.needReOrder && layerMapComponent.autoIndexing){ + if (zindexComponent.getZIndex() < 0) throw new IllegalArgumentException("ZIndex cannot be < 0."); + if (children.size == 1){ + zindexComponent.setZIndex(0); + zindexComponent.needReOrder = false; + return; + } + if (!children.removeValue(entity, true)) return; + if (zindexComponent.getZIndex() >= children.size) + children.add(entity); + else + children.insert(zindexComponent.getZIndex(), entity); + } + } + } + + private void updateZindexes(SnapshotArray children) { + for (int i = 0; i < children.size; i++) { + Entity entity = children.get(i); + ZIndexComponent zindexComponent = zIndexMapper.get(entity); + zindexComponent.setZIndex(i); + zindexComponent.needReOrder = false; + } + } + + private void sort(SnapshotArray children) { + children.sort(comparator); + } + + private int getlayerIndexByName(String layerName, LayerMapComponent layerMapComponent) { + if(layerMapComponent == null){ + return 0; + } + return layerMapComponent.getIndexByName(layerName); + } + + private class ZComparator implements Comparator { + @Override + public int compare(Entity e1, Entity e2) { + ZIndexComponent zIndexComponent1 = zIndexMapper.get(e1); + ZIndexComponent zIndexComponent2 = zIndexMapper.get(e2); + return zIndexComponent1.layerIndex == zIndexComponent2.layerIndex ? Integer.signum(zIndexComponent1.getZIndex() - zIndexComponent2.getZIndex()) : Integer.signum(zIndexComponent1.layerIndex - zIndexComponent2.layerIndex); + //return (int)Math.signum(pm.get(e1).z - pm.get(e2).z); + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LightSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LightSystem.java new file mode 100644 index 00000000..4aacda13 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/LightSystem.java @@ -0,0 +1,177 @@ +package games.rednblack.editor.renderer.systems; + +import box2dLight.ChainLight; +import box2dLight.ConeLight; +import box2dLight.Light; + +import box2dLight.RayHandler; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.PolygonComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.data.LightVO; +import games.rednblack.editor.renderer.data.LightVO.LightType; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +public class LightSystem extends IteratingSystem { + final private ComponentMapper lightObjectComponentMapper = ComponentMapper.getFor(LightObjectComponent.class); + final private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + final private ComponentMapper parentNodeComponentMapper = ComponentMapper.getFor(ParentNodeComponent.class); + final private ComponentMapper lightBodyComponentMapper = ComponentMapper.getFor(LightBodyComponent.class); + + private RayHandler rayHandler; + + public LightSystem() { + super(Family.one(LightObjectComponent.class, LightBodyComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + if (lightBodyComponentMapper.get(entity) != null) { + processLightBody(entity); + return; + } + + LightObjectComponent lightObjectComponent = lightObjectComponentMapper.get(entity); + TransformComponent transformComponent = transformComponentMapper.get(entity); + + Light light = lightObjectComponent.lightObject; + if (light.getRayNum() != lightObjectComponent.rays) { + light = lightObjectComponent.rebuildRays(rayHandler); + } + + ParentNodeComponent parentNodeComponent = parentNodeComponentMapper.get(entity); + + float relativeX = transformComponent.x; + float relativeY = transformComponent.y; + float relativeRotation = 0; + + Entity parentEntity = parentNodeComponent.parentEntity; + TransformComponent parentTransformComponent; + + while (parentEntity != null) { + parentTransformComponent = transformComponentMapper.get(parentEntity); + relativeX+=parentTransformComponent.x; + relativeY+=parentTransformComponent.y; + relativeRotation+=parentTransformComponent.rotation; + parentNodeComponent = parentNodeComponentMapper.get(parentEntity); + if(parentNodeComponent == null){ + break; + } + parentEntity = parentNodeComponent.parentEntity; + } + + if(light != null){ + float yy = 0; + float xx = 0; + + if(relativeRotation != 0){ + xx = transformComponent.x*MathUtils.cosDeg(relativeRotation) - transformComponent.y*MathUtils.sinDeg(relativeRotation); + yy = transformComponent.y*MathUtils.cosDeg(relativeRotation) + transformComponent.x*MathUtils.sinDeg(relativeRotation); + yy=transformComponent.y-yy; + xx=transformComponent.x-xx; + } + + light.setPosition((relativeX-xx)*PhysicsBodyLoader.getScale(), (relativeY-yy)*PhysicsBodyLoader.getScale()); + light.setSoftnessLength(lightObjectComponent.softnessLength); + light.setActive(lightObjectComponent.isActive); + light.setSoft(lightObjectComponent.isSoft); + } + + if(light != null && lightObjectComponent.getType() == LightType.CONE){ + light.setDirection(lightObjectComponent.directionDegree+relativeRotation); + } + + if (lightObjectComponent.getType() == LightVO.LightType.POINT) { + lightObjectComponent.lightObject.setColor(Color.CLEAR); + // TODO Physics and resolution part + lightObjectComponent.lightObject.setDistance(lightObjectComponent.distance * PhysicsBodyLoader.getPPWU()); + lightObjectComponent.lightObject.setStaticLight(lightObjectComponent.isStatic); + lightObjectComponent.lightObject.setXray(lightObjectComponent.isXRay); + } else { + lightObjectComponent.lightObject.setColor(Color.CLEAR); + lightObjectComponent.lightObject.setDistance(lightObjectComponent.distance * PhysicsBodyLoader.getPPWU()); + lightObjectComponent.lightObject.setStaticLight(lightObjectComponent.isStatic); + lightObjectComponent.lightObject.setDirection(lightObjectComponent.directionDegree); + ((ConeLight) lightObjectComponent.lightObject).setConeDegree(lightObjectComponent.coneDegree); + lightObjectComponent.lightObject.setXray(lightObjectComponent.isXRay); + } + } + + Vector2 tmp = new Vector2(); + + private void processLightBody(Entity entity) { + LightBodyComponent lightBodyComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + PhysicsBodyComponent physicsComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + + if((polygonComponent == null || physicsComponent == null) && lightBodyComponent.lightObject != null) { + lightBodyComponent.lightObject.remove(); + lightBodyComponent.lightObject = null; + return; + } + + if (lightBodyComponent.lightObject != null && + (lightBodyComponent.lightObject.getRayNum() != lightBodyComponent.rays || + lightBodyComponent.needToRefreshLight)) { + lightBodyComponent.lightObject.remove(); + lightBodyComponent.lightObject = null; + lightBodyComponent.needToRefreshLight = false; + } + + if (lightBodyComponent.lightObject == null && polygonComponent != null && physicsComponent != null) { + if(polygonComponent.vertices == null) return; + + Array chainArray = new Array<>(); + + for (int i = 0; i < polygonComponent.vertices.length; i++) { + for (int j = 0; j < polygonComponent.vertices[i].length; j++) { + Vector2 point = polygonComponent.vertices[i][j]; + tmp.set(point).sub(transformComponent.originX, transformComponent.originY); + chainArray.add(tmp.x, tmp.y); + } + } + Vector2 point = polygonComponent.vertices[0][0]; + tmp.set(point).sub(transformComponent.originX, transformComponent.originY); + chainArray.add(tmp.x, tmp.y); + + int i = 0; + float[] chain = new float[chainArray.size]; + for (Float f : chainArray) { + chain[i++] = (f != null ? f*PhysicsBodyLoader.getScale() : Float.NaN); + } + + Color lightColor = new Color(lightBodyComponent.color[0], lightBodyComponent.color[1], lightBodyComponent.color[2], lightBodyComponent.color[3]); + lightBodyComponent.lightObject = new ChainLight(rayHandler, lightBodyComponent.rays, + lightColor, lightBodyComponent.distance * PhysicsBodyLoader.getPPWU(), lightBodyComponent.rayDirection, chain); + lightBodyComponent.lightObject.attachToBody(physicsComponent.body); + } + + if (lightBodyComponent.lightObject != null) { + lightBodyComponent.lightObject.setSoftnessLength(lightBodyComponent.softnessLength); + lightBodyComponent.lightObject.setDistance(lightBodyComponent.distance * PhysicsBodyLoader.getPPWU()); + lightBodyComponent.lightObject.setActive(lightBodyComponent.isActive); + lightBodyComponent.lightObject.setSoft(lightBodyComponent.isSoft); + lightBodyComponent.lightObject.setStaticLight(false);//TODO Figure out why static lights does not change position + lightBodyComponent.lightObject.setXray(lightBodyComponent.isXRay); + lightBodyComponent.lightObject.setColor(lightBodyComponent.color[0], lightBodyComponent.color[1], lightBodyComponent.color[2], lightBodyComponent.color[3]); + lightBodyComponent.lightObject.update(); + } + } + + public void setRayHandler(RayHandler rayHandler){ + this.rayHandler = rayHandler; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ParticleSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ParticleSystem.java new file mode 100644 index 00000000..2e4e7747 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ParticleSystem.java @@ -0,0 +1,39 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; + +public class ParticleSystem extends IteratingSystem { + + private ComponentMapper particleComponentMapper = ComponentMapper.getFor(ParticleComponent.class); + //private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + //private ComponentMapper parentNodeComponentMapper = ComponentMapper.getFor(ParentNodeComponent.class); + //private ComponentMapper nodeComponentMapper = ComponentMapper.getFor(NodeComponent.class); + + public ParticleSystem() { + super(Family.all(ParticleComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + //System.out.println("DELTAING " + entity.getId() +" " +deltaTime); + ParticleComponent particleComponent = particleComponentMapper.get(entity); + + //DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + ParticleEffect particleEffect = particleComponent.particleEffect; + particleEffect.update(deltaTime); + //ParentNodeComponent parentNodeComponent = parentNodeComponentMapper.get(entity); + +// Entity parentEntity = parentNodeComponent.parentEntity; +// while (parentEntity != null) { +// parentNodeComponent = nodeComponentMapper.get(parentEntity); +// parentEntity = parentNodeComponent.parentEntity; +// } + + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/PhysicsSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/PhysicsSystem.java new file mode 100644 index 00000000..3392d265 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/PhysicsSystem.java @@ -0,0 +1,173 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.ashley.utils.ImmutableArray; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.*; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.PolygonComponent; +import games.rednblack.editor.renderer.components.ScriptComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.physics.PhysicsContact; +import games.rednblack.editor.renderer.scripts.IScript; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.TransformMathUtils; + +public class PhysicsSystem extends IteratingSystem implements ContactListener { + + protected ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + + private final float TIME_STEP = 1f/60; + private World world; + private boolean isPhysicsOn = true; + private float accumulator = 0; + + public PhysicsSystem(World world) { + super(Family.all(PhysicsBodyComponent.class).get()); + this.world = world; + } + + @Override + public void update (float deltaTime) { + for (int i = 0; i < getEntities().size(); ++i) { + processEntity(getEntities().get(i), deltaTime); + } + + if (world != null && isPhysicsOn) { + doPhysicsStep(deltaTime); + } + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + TransformComponent transformComponent = transformComponentMapper.get(entity); + + processBody(entity); + + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + Body body = physicsBodyComponent.body; + transformComponent.x = 0; + transformComponent.y = 0; + transformComponent.rotation = 0; + Vector2 localCoords = TransformMathUtils.sceneToLocalCoordinates(entity, body.getPosition().cpy().scl(1 / PhysicsBodyLoader.getScale())); + transformComponent.x = localCoords.x - transformComponent.originX; + transformComponent.y = localCoords.y - transformComponent.originY; + transformComponent.rotation = body.getAngle() * MathUtils.radiansToDegrees; + } + + protected void processBody(Entity entity) { + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + + if(polygonComponent == null && physicsBodyComponent.body != null) { + world.destroyBody(physicsBodyComponent.body); + physicsBodyComponent.body = null; + } + + if((physicsBodyComponent.body == null && polygonComponent != null) || physicsBodyComponent.needToRefreshBody) { + if(polygonComponent == null || polygonComponent.vertices == null) return; + + if (physicsBodyComponent.needToRefreshBody && physicsBodyComponent.body != null) { + world.destroyBody(physicsBodyComponent.body); + physicsBodyComponent.body = null; + physicsBodyComponent.needToRefreshBody = false; + } + + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + + physicsBodyComponent.centerX = dimensionsComponent.width/2; + physicsBodyComponent.centerY = dimensionsComponent.height/2; + + PhysicsBodyComponent bodyPropertiesComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + physicsBodyComponent.body = PhysicsBodyLoader.getInstance().createBody(world, entity, bodyPropertiesComponent, polygonComponent.vertices, transformComponent); + + physicsBodyComponent.body.setUserData(entity); + } + } + + private void doPhysicsStep(float deltaTime) { + // fixed time step + // max frame time to avoid spiral of death (on slow devices) + float frameTime = Math.min(deltaTime, 0.25f); + accumulator += frameTime; + while (accumulator >= TIME_STEP) { + world.step(TIME_STEP, 6, 2); + accumulator -= TIME_STEP; + } + } + + public void setPhysicsOn(boolean isPhysicsOn) { + this.isPhysicsOn = isPhysicsOn; + } + + private void processCollision(Contact contact, boolean in) { + // Get both fixtures + Fixture f1 = contact.getFixtureA(); + Fixture f2 = contact.getFixtureB(); + // Get both bodies + Body b1 = f1.getBody(); + Body b2 = f2.getBody(); + + // Get our objects that reference these bodies + Object o1 = b1.getUserData(); + Object o2 = b2.getUserData(); + + if (!(o1 instanceof Entity) || !(o2 instanceof Entity)) + return; + + // cast to entity + Entity et1 = (Entity) o1; + Entity et2 = (Entity) o2; + // get script comp + ScriptComponent ic1 = ComponentRetriever.get(et1, ScriptComponent.class); + ScriptComponent ic2 = ComponentRetriever.get(et2, ScriptComponent.class); + + // cast script to contacts, if scripts implement contacts + for (IScript sc : ic1.scripts) { + if (sc instanceof PhysicsContact) { + PhysicsContact ct = (PhysicsContact) sc; + if (in) + ct.beginContact(et2); + else + ct.endContact(et2); + } + } + + for (IScript sc : ic2.scripts) { + if (sc instanceof PhysicsContact) { + PhysicsContact ct = (PhysicsContact) sc; + if (in) + ct.beginContact(et1); + else + ct.endContact(et1); + } + } + } + + @Override + public void beginContact(Contact contact) { + processCollision(contact, true); + } + + @Override + public void endContact(Contact contact) { + processCollision(contact, false); + } + + @Override + public void preSolve(Contact contact, Manifold oldManifold) { + + } + + @Override + public void postSolve(Contact contact, ContactImpulse impulse) { + + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ScriptSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ScriptSystem.java new file mode 100644 index 00000000..22780837 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/ScriptSystem.java @@ -0,0 +1,27 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import games.rednblack.editor.renderer.components.ScriptComponent; +import games.rednblack.editor.renderer.scripts.IScript; + +/** + * Created by azakhary on 6/19/2015. + */ +public class ScriptSystem extends IteratingSystem { + + private ComponentMapper scriptComponentComponentMapper = ComponentMapper.getFor(ScriptComponent.class); + + public ScriptSystem() { + super(Family.all(ScriptComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + for(IScript script: scriptComponentComponentMapper.get(entity).scripts) { + script.act(deltaTime); + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/SpriteAnimationSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/SpriteAnimationSystem.java new file mode 100644 index 00000000..dc196bf5 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/SpriteAnimationSystem.java @@ -0,0 +1,35 @@ +package games.rednblack.editor.renderer.systems; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationStateComponent; + +public class SpriteAnimationSystem extends IteratingSystem { + private ComponentMapper tm; + private ComponentMapper sm; + private ComponentMapper sa; + + public SpriteAnimationSystem() { + super(Family.all(SpriteAnimationStateComponent.class).get()); + + tm = ComponentMapper.getFor(TextureRegionComponent.class); + sm = ComponentMapper.getFor(SpriteAnimationStateComponent.class); + sa = ComponentMapper.getFor(SpriteAnimationComponent.class); + } + + @Override + public void processEntity(Entity entity, float deltaTime) { + TextureRegionComponent tex = tm.get(entity); + SpriteAnimationStateComponent state = sm.get(entity); + state.currentAnimation.setFrameDuration(1f/sa.get(entity).fps); + tex.region = state.currentAnimation.getKeyFrame(state.time); + + if(!state.paused) { + state.time += deltaTime; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/ActionSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/ActionSystem.java new file mode 100644 index 00000000..f1fd616b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/ActionSystem.java @@ -0,0 +1,39 @@ +package games.rednblack.editor.renderer.systems.action; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.components.ActionComponent; +import games.rednblack.editor.renderer.systems.action.data.ActionData; +import games.rednblack.editor.renderer.systems.action.logic.ActionLogic; + +/** + * Created by ZeppLondon on 10/13/2015. + */ +public class ActionSystem extends IteratingSystem { + private final ComponentMapper actionMapper; + + public ActionSystem() { + super(Family.all(ActionComponent.class).get()); + actionMapper = ComponentMapper.getFor(ActionComponent.class); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + ActionComponent actionComponent = actionMapper.get(entity); + Array dataArray = actionComponent.dataArray; + for (int i = 0; i < dataArray.size; i++) { + ActionData data = dataArray.get(i); + ActionLogic actionLogic = Actions.actionLogicMap.get(data.logicClassName); + if (actionLogic.act(deltaTime, entity, data)) { + dataArray.removeValue(data, true); + } + } + + if (dataArray.size == 0) { + entity.remove(ActionComponent.class); + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/Actions.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/Actions.java new file mode 100644 index 00000000..0d982ab2 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/Actions.java @@ -0,0 +1,280 @@ +package games.rednblack.editor.renderer.systems.action; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Interpolation; +import games.rednblack.editor.renderer.components.ActionComponent; +import games.rednblack.editor.renderer.systems.action.data.*; +import games.rednblack.editor.renderer.systems.action.logic.*; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +import java.util.HashMap; + +/** + * Created by Eduard on 10/13/2015. + */ +public class Actions { + + public static HashMap actionLogicMap = new HashMap(); + private static boolean initialized; + + private static void initialize() throws InstantiationException, IllegalAccessException { + registerActionClass(MoveToAction.class); + registerActionClass(MoveByAction.class); + registerActionClass(SizeToAction.class); + registerActionClass(SizeByAction.class); + registerActionClass(ScaleToAction.class); + registerActionClass(ScaleByAction.class); + registerActionClass(RotateToAction.class); + registerActionClass(RotateByAction.class); + registerActionClass(ColorAction.class); + registerActionClass(AlphaAction.class); + + registerActionClass(RunnableAction.class); + registerActionClass(DelayAction.class); + + registerActionClass(ParallelAction.class); + registerActionClass(SequenceAction.class); + + initialized = true; + } + + public static void registerActionClass(Class type) throws IllegalAccessException, InstantiationException { + if (!actionLogicMap.containsKey(type.getName())) { + actionLogicMap.put(type.getName(), type.newInstance()); + } + } + + private static void checkInit() { + if (!initialized) try { + initialize(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + public static ActionData moveTo(float x, float y, float duration) { + return moveTo(x, y, duration, null); + } + + public static ActionData moveTo(float x, float y, float duration, Interpolation interpolation) { + MoveToData actionData = new MoveToData( + interpolation, + duration, + x, + y + ); + actionData.logicClassName = MoveToAction.class.getName(); + return (actionData); + } + + public static ActionData moveBy(float x, float y, float duration) { + return moveBy(x, y, duration, null); + } + + public static ActionData moveBy(float x, float y, float duration, Interpolation interpolation) { + MoveByData actionData = new MoveByData( + interpolation, + duration, + x, + y + ); + actionData.logicClassName = MoveByAction.class.getName(); + return actionData; + } + + static public ActionData run(Runnable runnable) { + RunnableData actionData = new RunnableData( + runnable + ); + actionData.logicClassName = RunnableAction.class.getName(); + return actionData; + } + + static public RotateToData rotateTo(float end, float duration) { + return rotateTo(end, duration, null); + } + + static public RotateToData rotateTo(float end, float duration, Interpolation interpolation) { + RotateToData actionData = new RotateToData( + interpolation, + duration, + end + ); + actionData.logicClassName = RotateToAction.class.getName(); + return actionData; + } + + + static public RotateByData rotateBy(float amount, float duration) { + return rotateBy(amount, duration, null); + } + + static public RotateByData rotateBy(float amount, float duration, Interpolation interpolation) { + RotateByData actionData = new RotateByData( + interpolation, + duration, + amount + ); + actionData.logicClassName = RotateByAction.class.getName(); + return actionData; + } + + public static SizeToData sizeTo(float width, float height, float duration) { + return sizeTo(width, height, duration, null); + } + + public static SizeToData sizeTo(float width, float height, float duration, Interpolation interpolation) { + SizeToData actionData = new SizeToData( + interpolation, + duration, + width, + height + ); + actionData.logicClassName = SizeToAction.class.getName(); + return actionData; + } + + public static SizeByData sizeBy(float width, float height, float duration) { + return sizeBy(width, height, duration, null); + } + + public static SizeByData sizeBy(float width, float height, float duration, Interpolation interpolation) { + SizeByData actionData = new SizeByData( + interpolation, + duration, + width, + height + ); + actionData.logicClassName = SizeByAction.class.getName(); + return actionData; + } + + public static ScaleToData scaleTo(float width, float height, float duration) { + return scaleTo(width, height, duration, null); + } + + public static ScaleToData scaleTo(float width, float height, float duration, Interpolation interpolation) { + ScaleToData actionData = new ScaleToData( + interpolation, + duration, + width, + height + ); + actionData.logicClassName = ScaleToAction.class.getName(); + return actionData; + } + + public static ScaleByData scaleBy(float width, float height, float duration) { + return scaleBy(width, height, duration, null); + } + + public static ScaleByData scaleBy(float width, float height, float duration, Interpolation interpolation) { + ScaleByData actionData = new ScaleByData( + interpolation, + duration, + width, + height + ); + actionData.logicClassName = ScaleByAction.class.getName(); + return actionData; + } + + + public static ColorData color(Color color, float duration) { + return color(color, duration, null); + } + + public static ColorData color(Color color, float duration, Interpolation interpolation) { + ColorData colorData = new ColorData( + interpolation, + duration, + color + ); + colorData.logicClassName = ColorAction.class.getName(); + return colorData; + } + + public static AlphaData alpha(float alpha, float duration) { + return alpha(alpha, duration, null); + } + + public static AlphaData alpha(float alpha, float duration, Interpolation interpolation) { + AlphaData alphaData = new AlphaData( + interpolation, + duration, + alpha + ); + alphaData.logicClassName = AlphaAction.class.getName(); + return alphaData; + } + + public static AlphaData fadeIn(float duration) { + return alpha(1, duration, null); + } + + public static AlphaData fadeIn(float duration, Interpolation interpolation) { + return alpha(1, duration, interpolation); + } + + + public static AlphaData fadeOut(float duration) { + return alpha(0, duration, null); + } + + public static AlphaData fadeOut(float duration, Interpolation interpolation) { + return alpha(0, duration, interpolation); + } + + public static DelayData delay(float duration) { + DelayData delayData = new DelayData( + duration + ); + delayData.logicClassName = DelayAction.class.getName(); + return delayData; + } + + + static public ParallelData parallel(ActionData... actionDatas) { + ParallelData actionData = new ParallelData(actionDatas); + actionData.logicClassName = ParallelAction.class.getName(); + return actionData; + } + + static public SequenceData sequence(ActionData... actionDatas) { + SequenceData actionData = new SequenceData(actionDatas); + actionData.logicClassName = SequenceAction.class.getName(); + return actionData; + } + + public static void addAction(final Entity entity, ActionData data) { + checkInit(); + ActionComponent actionComponent; + actionComponent = ComponentRetriever.get(entity, ActionComponent.class); + + if (actionComponent == null) { + actionComponent = new ActionComponent(); + entity.add(actionComponent); + } + + actionComponent.dataArray.add(data); + } + + public static void removeActions(Entity entity) { + ActionComponent actionComponent = ComponentRetriever.get(entity, ActionComponent.class); + if (actionComponent != null) { + actionComponent.dataArray.clear(); // action component with empty data array will be removed later by ActionSystem + } + } + + public static void removeAction(Entity entity, ActionData data) { + ActionComponent actionComponent = ComponentRetriever.get(entity, ActionComponent.class); + if (actionComponent != null) { + if (actionComponent.dataArray.contains(data, true)) { + actionComponent.dataArray.removeValue(data, true); + } + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/PhysicsActions.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/PhysicsActions.java new file mode 100644 index 00000000..a3beda6f --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/PhysicsActions.java @@ -0,0 +1,69 @@ +package games.rednblack.editor.renderer.systems.action; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.systems.action.data.ForceData; +import games.rednblack.editor.renderer.systems.action.logic.ActionLogic; +import games.rednblack.editor.renderer.systems.action.logic.ForceAction; + +/** + * Created by aurel on 02/04/16. + */ +public class PhysicsActions { + + + private static void initialize(Class type) { + try { + Actions.registerActionClass(type); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * Apply a force to an entity with physics component. The force is applied as long as + * the corresponding entity as a physics component. + * @param force The world force vector, usually in Newtons (N) + * @return The games.rednblack.editor.renderer.systems.action.data.ForceData object + */ + public static ForceData force(Vector2 force) { + initialize(ForceAction.class); + ForceData forceData = new ForceData(force); + + forceData.logicClassName = ForceAction.class.getName(); + return forceData; + } + + /** + * Apply a force to an entity with physics component. The force is applied as long as + * the corresponding entity as a physics component. + * @param force The world force vector, usually in Newtons (N) + * @param relativePoint The point where the force is applied relative to the body origin + * @return The games.rednblack.editor.renderer.systems.action.data.ForceData object + */ + public static ForceData force(Vector2 force, Vector2 relativePoint) { + initialize(ForceAction.class); + ForceData forceData = new ForceData(force, relativePoint); + + forceData.logicClassName = ForceAction.class.getName(); + return forceData; + } + + /** + * Apply a force to an entity with physics component. + * @param force The world force vector, usually in Newtons (N) + * @param relativePoint The point where the force is applied relative to the body origin + * @param linkedComponent The force is applied as long as the corresponding entity + * has this component + * @return The games.rednblack.editor.renderer.systems.action.data.ForceData object + */ + public static ForceData force(Vector2 force, Vector2 relativePoint, Class linkedComponent) { + ForceData forceData = force(force, relativePoint); + + forceData.linkedComponentMapper = ComponentMapper.getFor(linkedComponent); + return forceData; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ActionData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ActionData.java new file mode 100644 index 00000000..6cd4e4b1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ActionData.java @@ -0,0 +1,9 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class ActionData { + public String logicClassName; + public boolean detached; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/AlphaData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/AlphaData.java new file mode 100644 index 00000000..f6068ea0 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/AlphaData.java @@ -0,0 +1,15 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/29/15. + */ +public class AlphaData extends TemporalData { + public float start, end; + + public AlphaData(Interpolation interpolation, float duration, float end) { + super(interpolation, duration); + this.end = end; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ColorData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ColorData.java new file mode 100644 index 00000000..61c44a71 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ColorData.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ColorData extends TemporalData { + public float startR, startG, startB, startA; + public Color endColor = new Color(); + + public ColorData(Interpolation interpolation, float duration, Color color) { + super(interpolation, duration); + this.endColor = color; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ComponentData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ComponentData.java new file mode 100644 index 00000000..fb30cadf --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ComponentData.java @@ -0,0 +1,10 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.ashley.core.ComponentMapper; + +/** + * Created by aurel on 19/02/16. + */ +public class ComponentData extends DelegateData { + public ComponentMapper linkedComponentMapper; +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelayData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelayData.java new file mode 100644 index 00000000..9f46aaea --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelayData.java @@ -0,0 +1,14 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class DelayData extends DelegateData { + public float duration; + public float passedTime; + + public DelayData(float duration) { + super(); + this.duration = duration; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelegateData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelegateData.java new file mode 100644 index 00000000..ab3c1794 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/DelegateData.java @@ -0,0 +1,10 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class DelegateData extends ActionData { + public DelegateData() { + super(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ForceData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ForceData.java new file mode 100644 index 00000000..5d40949c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ForceData.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Vector2; + +/** + * Created by aurel on 19/02/16. + */ +public class ForceData extends ComponentData { + public Vector2 force; + public Vector2 relativePoint; + + public ForceData(Vector2 force) { + this(force, new Vector2(0, 0)); + } + + public ForceData(Vector2 force, Vector2 relativePoint) { + super(); + this.force = force; + this.relativePoint = relativePoint; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveByData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveByData.java new file mode 100644 index 00000000..fb12cb13 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveByData.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class MoveByData extends RelativeTemporalData { + public float amountX; + public float amountY; + + + public MoveByData(Interpolation interpolation, float duration, float amountX, float amountY) { + super(interpolation, duration); + this.amountX = amountX; + this.amountY = amountY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveToData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveToData.java new file mode 100644 index 00000000..804fa555 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/MoveToData.java @@ -0,0 +1,19 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class MoveToData extends TemporalData{ + public float startX; + public float startY; + public float endX; + public float endY; + + public MoveToData(Interpolation interpolation, float duration, float endX, float endY) { + super(interpolation, duration); + this.endX = endX; + this.endY = endY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ParallelData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ParallelData.java new file mode 100644 index 00000000..c01b00d1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ParallelData.java @@ -0,0 +1,13 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/23/15. + */ +public class ParallelData extends ActionData { + public ActionData[] actionDatas; + public boolean complete; + + public ParallelData(ActionData[] actionDatas) { + this.actionDatas = actionDatas; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RelativeTemporalData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RelativeTemporalData.java new file mode 100644 index 00000000..e9f8f753 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RelativeTemporalData.java @@ -0,0 +1,14 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class RelativeTemporalData extends TemporalData { + public float lastPercent; + + public RelativeTemporalData(Interpolation interpolation, float duration) { + super(interpolation, duration); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateByData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateByData.java new file mode 100644 index 00000000..c41938a1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateByData.java @@ -0,0 +1,15 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/16/2015. + */ +public class RotateByData extends RelativeTemporalData { + public float amount; + + public RotateByData(Interpolation interpolation, float duration, float amount) { + super(interpolation, duration); + this.amount = amount; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateToData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateToData.java new file mode 100644 index 00000000..34556f48 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RotateToData.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/16/2015. + */ +public class RotateToData extends TemporalData { + public float start; + public float end; + + public RotateToData(Interpolation interpolation,float duration, float end) { + super(interpolation, duration); + this.end = end; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RunnableData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RunnableData.java new file mode 100644 index 00000000..8b04ba0c --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/RunnableData.java @@ -0,0 +1,14 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class RunnableData extends ActionData { + public Runnable runnable; + public boolean ran; + + public RunnableData(Runnable runnable) { + super(); + this.runnable = runnable; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleByData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleByData.java new file mode 100644 index 00000000..5feff6f4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleByData.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ScaleByData extends RelativeTemporalData { + public float amountX, amountY; + + public ScaleByData(Interpolation interpolation, float duration, float amountX, float amountY) { + super(interpolation, duration); + this.amountX = amountX; + this.amountY = amountY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleToData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleToData.java new file mode 100644 index 00000000..325ad1bb --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/ScaleToData.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ScaleToData extends TemporalData { + public float startX, startY; + public float endX, endY; + + public ScaleToData(Interpolation interpolation, float duration, float endX, float endY) { + super(interpolation, duration); + this.endX = endX; + this.endY = endY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SequenceData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SequenceData.java new file mode 100644 index 00000000..586332be --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SequenceData.java @@ -0,0 +1,13 @@ +package games.rednblack.editor.renderer.systems.action.data; + +/** + * Created by ZeppLondon on 10/23/15. + */ +public class SequenceData extends ParallelData { + public int index; + + + public SequenceData(ActionData[] actionDatas) { + super(actionDatas); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeByData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeByData.java new file mode 100644 index 00000000..dd87b8e7 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeByData.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class SizeByData extends RelativeTemporalData { + public float amountWidth, amountHeight; + + public SizeByData(Interpolation interpolation, float duration, float amountWidth, float amountHeight) { + super(interpolation, duration); + this.amountWidth = amountWidth; + this.amountHeight = amountHeight; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeToData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeToData.java new file mode 100644 index 00000000..419e0f4a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/SizeToData.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class SizeToData extends TemporalData{ + public float startWidth, startHeight; + public float endWidth, endHeight; + + public SizeToData(Interpolation interpolation, float duration, float endWidth, float endHeight) { + super(interpolation, duration); + this.endWidth = endWidth; + this.endHeight = endHeight; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/TemporalData.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/TemporalData.java new file mode 100644 index 00000000..948a0894 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/data/TemporalData.java @@ -0,0 +1,20 @@ +package games.rednblack.editor.renderer.systems.action.data; + +import com.badlogic.gdx.math.Interpolation; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class TemporalData extends ActionData{ + public float duration; + public float passedTime; + public boolean began; + public boolean complete; + public Interpolation interpolation; + + public TemporalData(Interpolation interpolation, float duration) { + super(); + this.interpolation = interpolation; + this.duration = duration; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ActionLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ActionLogic.java new file mode 100644 index 00000000..6c83f009 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ActionLogic.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.ActionData; + +/** + * Created by ZeppLondon on 10/14/2015. + */ +abstract public class ActionLogic { + + abstract public boolean act(float delta, Entity entity, T actionData); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/AlphaAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/AlphaAction.java new file mode 100644 index 00000000..26d722cb --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/AlphaAction.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TintComponent; +import games.rednblack.editor.renderer.systems.action.data.AlphaData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/29/15. + */ +public class AlphaAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + TintComponent tintComponent = ComponentRetriever.get(entity, TintComponent.class); + tintComponent.color.a = actionData.start + (actionData.end - actionData.start) * percent; + } + + @Override + public void begin(Entity entity, T actionData) { + TintComponent tintComponent = ComponentRetriever.get(entity, TintComponent.class); + actionData.start = tintComponent.color.a; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ColorAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ColorAction.java new file mode 100644 index 00000000..115573c1 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ColorAction.java @@ -0,0 +1,30 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TintComponent; +import games.rednblack.editor.renderer.systems.action.data.ColorData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ColorAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + TintComponent tintComponent = ComponentRetriever.get(entity, TintComponent.class); + float r = actionData.startR + (actionData.endColor.r - actionData.startR) * percent; + float g = actionData.startG + (actionData.endColor.g - actionData.startG) * percent; + float b = actionData.startB + (actionData.endColor.b - actionData.startB) * percent; + float a = actionData.startA + (actionData.endColor.a - actionData.startA) * percent; + tintComponent.color.set(r, g, b, a); + } + + @Override + public void begin(Entity entity, T actionData) { + TintComponent tintComponent = ComponentRetriever.get(entity, TintComponent.class); + actionData.startR = tintComponent.color.r; + actionData.startG = tintComponent.color.g; + actionData.startB = tintComponent.color.b; + actionData.startA = tintComponent.color.a; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ComponentAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ComponentAction.java new file mode 100644 index 00000000..ee6c1710 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ComponentAction.java @@ -0,0 +1,20 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.ComponentData; + +/** + * Created by aurel on 19/02/16. + */ +public abstract class ComponentAction extends DelegateAction { + + @Override + public boolean act(float delta, Entity entity, T actionData) { + if (actionData.linkedComponentMapper == null || actionData.linkedComponentMapper.has(entity)) { + return delegate(delta, entity, actionData); + } + else { + return true; + } + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelayAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelayAction.java new file mode 100644 index 00000000..8f5503d3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelayAction.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.ActionData; +import games.rednblack.editor.renderer.systems.action.data.DelayData; +import games.rednblack.editor.renderer.systems.action.data.DelegateData; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class DelayAction extends DelegateAction{ + + @Override + protected boolean delegate(float delta, Entity entity, T actionData) { + if (actionData.passedTime < actionData.duration) { + actionData.passedTime += delta; + if (actionData.passedTime < actionData.duration) return false; + } + return true; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelegateAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelegateAction.java new file mode 100644 index 00000000..1d9dbf2e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/DelegateAction.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.DelegateData; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public abstract class DelegateAction extends ActionLogic { + @Override + public boolean act(float delta, Entity entity, T actionData) { + return delegate(delta, entity, actionData); + } + + abstract protected boolean delegate (float delta, Entity entity, T actionData); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ForceAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ForceAction.java new file mode 100644 index 00000000..fe9bf13b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ForceAction.java @@ -0,0 +1,33 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.systems.action.data.ForceData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.ForceUtils; + +/** + * Created by aurel on 19/02/16. + */ +public class ForceAction extends ComponentAction { + + private ComponentMapper physicsBodyComponentMapper; + + public ForceAction() { + this.physicsBodyComponentMapper = ComponentMapper.getFor(PhysicsBodyComponent.class); + } + + @Override + protected boolean delegate(float delta, Entity entity, ForceData actionData) { + if (physicsBodyComponentMapper.has(entity)) { + PhysicsBodyComponent physicsBodyComponent = physicsBodyComponentMapper.get(entity); + + ForceUtils.applyForce(actionData.force, physicsBodyComponent.body, actionData.relativePoint); + return false; + } + + return true; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveByAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveByAction.java new file mode 100644 index 00000000..586b484a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveByAction.java @@ -0,0 +1,22 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.MoveByData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class MoveByAction extends RelativeTemporalAction { + @Override + protected void updateRelative(float percentDelta, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + + float amountX = actionData.amountX*percentDelta; + float amountY = actionData.amountY*percentDelta; + + transformComponent.x += amountX; + transformComponent.y += amountY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveToAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveToAction.java new file mode 100644 index 00000000..6f1a20d5 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/MoveToAction.java @@ -0,0 +1,34 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.MoveToData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/13/2015. + */ +public class MoveToAction extends TemporalAction { + @Override + public void update(float percent, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + + float x = actionData.startX + (actionData.endX - actionData.startX) * percent; + float y = actionData.startY + (actionData.endY - actionData.startY) * percent; + + transformComponent.x = x; + transformComponent.y = y; + } + + @Override + public void begin(Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + actionData.startX = transformComponent.x; + actionData.startY = transformComponent.y; + } + + @Override + public void end(Entity entity, MoveToData actionData) { + + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ParallelAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ParallelAction.java new file mode 100644 index 00000000..55ce997e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ParallelAction.java @@ -0,0 +1,27 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.Actions; +import games.rednblack.editor.renderer.systems.action.data.ActionData; +import games.rednblack.editor.renderer.systems.action.data.ParallelData; + +/** + * Created by ZeppLondon on 10/23/15. + */ +public class ParallelAction extends ActionLogic { + @Override + public boolean act(float delta, Entity entity, T actionData) { + actionData.complete = true; + for (int i = 0; i < actionData.actionDatas.length; i++) { + ActionData data = actionData.actionDatas[i]; + ActionLogic logic = Actions.actionLogicMap.get(actionData.actionDatas[i].logicClassName); + if (!data.detached) { + actionData.complete = false; + if (logic.act(delta, entity, data)) { + data.detached = true; + } + } + } + return actionData.complete; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RelativeTemporalAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RelativeTemporalAction.java new file mode 100644 index 00000000..90870ed6 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RelativeTemporalAction.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.RelativeTemporalData; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public abstract class RelativeTemporalAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + updateRelative(percent - actionData.lastPercent, entity, actionData); + actionData.lastPercent = percent; + } + + @Override + public void begin(Entity entity, T actionData) { + RelativeTemporalData data = actionData; + data.lastPercent = 0; + } + + abstract protected void updateRelative (float percentDelta, Entity entity, T actionData); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateByAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateByAction.java new file mode 100644 index 00000000..5ef87bfc --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateByAction.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.ActionData; +import games.rednblack.editor.renderer.systems.action.data.RotateByData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/16/2015. + */ +public class RotateByAction extends RelativeTemporalAction { + @Override + protected void updateRelative(float percentDelta, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.rotation += actionData.amount * percentDelta; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateToAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateToAction.java new file mode 100644 index 00000000..771ad311 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RotateToAction.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.RotateToData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/16/2015. + */ +public class RotateToAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.rotation = (actionData.start + (actionData.end - actionData.start) * percent); + } + + @Override + public void begin(Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + actionData.start = transformComponent.rotation; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RunnableAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RunnableAction.java new file mode 100644 index 00000000..2c2819b4 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/RunnableAction.java @@ -0,0 +1,22 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.RunnableData; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public class RunnableAction extends ActionLogic { + @Override + public boolean act(float delta, Entity entity, T actionData) { + if (!actionData.ran) { + actionData.ran = true; + run(entity, actionData); + } + return true; + } + + public void run(Entity entity, T actionData) { + actionData.runnable.run(); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleByAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleByAction.java new file mode 100644 index 00000000..7aff0518 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleByAction.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.ScaleByData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ScaleByAction extends RelativeTemporalAction { + @Override + protected void updateRelative(float percent, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.scaleX += actionData.amountX * percent; + transformComponent.scaleY += actionData.amountY * percent; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleToAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleToAction.java new file mode 100644 index 00000000..ac550194 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/ScaleToAction.java @@ -0,0 +1,25 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.systems.action.data.ScaleToData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class ScaleToAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.scaleX = actionData.startX + (actionData.endX - actionData.startX) * percent; + transformComponent.scaleY = actionData.startY + (actionData.endY - actionData.startY) * percent; + } + + @Override + public void begin(Entity entity, T actionData) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + actionData.startX = transformComponent.scaleX; + actionData.startY = transformComponent.scaleY; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SequenceAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SequenceAction.java new file mode 100644 index 00000000..438edf84 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SequenceAction.java @@ -0,0 +1,21 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.Actions; +import games.rednblack.editor.renderer.systems.action.data.SequenceData; + +/** + * Created by ZeppLondon on 10/23/15. + */ +public class SequenceAction extends ParallelAction { + @Override + public boolean act(float delta, Entity entity, T actionData) { + if (actionData.index >= actionData.actionDatas.length) return true; + ActionLogic logic = Actions.actionLogicMap.get(actionData.actionDatas[actionData.index].logicClassName); + if (logic.act(delta, entity, actionData.actionDatas[actionData.index])) { + actionData.index++; + if (actionData.index >= actionData.actionDatas.length) return true; + } + return false; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeByAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeByAction.java new file mode 100644 index 00000000..9497943b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeByAction.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.systems.action.data.SizeByData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class SizeByAction extends RelativeTemporalAction { + @Override + protected void updateRelative(float percentDelta, Entity entity, T actionData) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + dimensionsComponent.width += actionData.amountWidth * percentDelta; + dimensionsComponent.height += actionData.amountHeight * percentDelta; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeToAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeToAction.java new file mode 100644 index 00000000..362c08d7 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/SizeToAction.java @@ -0,0 +1,25 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.systems.action.data.SizeToData; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by ZeppLondon on 10/28/15. + */ +public class SizeToAction extends TemporalAction { + @Override + protected void update(float percent, Entity entity, T actionData) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + dimensionsComponent.width = actionData.startWidth + (actionData.endHeight - actionData.startWidth) * percent; + dimensionsComponent.height = actionData.startHeight + (actionData.endHeight - actionData.startHeight) * percent; + } + + @Override + public void begin(Entity entity, T actionData) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + actionData.startWidth = dimensionsComponent.width; + actionData.startHeight = dimensionsComponent.height; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/TemporalAction.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/TemporalAction.java new file mode 100644 index 00000000..8da0ac61 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/action/logic/TemporalAction.java @@ -0,0 +1,42 @@ +package games.rednblack.editor.renderer.systems.action.logic; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.systems.action.data.TemporalData; + +/** + * Created by ZeppLondon on 10/15/2015. + */ +public abstract class TemporalAction extends ActionLogic { + @Override + public boolean act(float delta, Entity entity, T actionData) { + if (actionData.complete) return true; + + if (!actionData.began) { + begin(entity, actionData); + actionData.began = true; + } + + actionData.passedTime += delta; + actionData.complete = actionData.passedTime >= actionData.duration; + float percent; + if (actionData.complete) { + percent = 1; + } else { + percent = actionData.passedTime / actionData.duration; + if (actionData.interpolation != null) percent = actionData.interpolation.apply(percent); + } + update(percent, entity, actionData); + if (actionData.complete) end(entity, actionData); + return actionData.complete; + } + + abstract protected void update (float percent, Entity entity, T actionData); + + public void begin(Entity entity, T actionData) { + + } + + public void end(Entity entity, T actionData) { + + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/HyperLap2dRenderer.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/HyperLap2dRenderer.java new file mode 100644 index 00000000..2a0b92e9 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/HyperLap2dRenderer.java @@ -0,0 +1,322 @@ +package games.rednblack.editor.renderer.systems.render; + +import box2dLight.RayHandler; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.*; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.g3d.utils.MeshBuilder; +import com.badlogic.gdx.graphics.glutils.FrameBuffer; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.math.Affine2; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.scenes.scene2d.utils.ScissorStack; +import com.badlogic.gdx.utils.viewport.Viewport; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.commons.IExternalItemType; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.systems.render.logic.DrawableLogicMapper; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +import java.util.Map; + + +public class HyperLap2dRenderer extends IteratingSystem { + private final float TIME_STEP = 1f/60; + + private ComponentMapper viewPortMapper = ComponentMapper.getFor(ViewPortComponent.class); + private ComponentMapper compositeTransformMapper = ComponentMapper.getFor(CompositeTransformComponent.class); + private ComponentMapper nodeMapper = ComponentMapper.getFor(NodeComponent.class); + private ComponentMapper parentNodeMapper = ComponentMapper.getFor(ParentNodeComponent.class); + private ComponentMapper transformMapper = ComponentMapper.getFor(TransformComponent.class); + private ComponentMapper mainItemComponentMapper = ComponentMapper.getFor(MainItemComponent.class); + private ComponentMapper shaderComponentMapper = ComponentMapper.getFor(ShaderComponent.class); + private ComponentMapper dimensionsComponentComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); + + private DrawableLogicMapper drawableLogicMapper; + private RayHandler rayHandler; + private Camera camera; +// private World world; + + //private Box2DDebugRenderer debugRenderer = new Box2DDebugRenderer(); + + public static float timeRunning = 0; + + public Batch batch; + //ShaderManager shaderManager = new ShaderManager(); + + public HyperLap2dRenderer(Batch batch) { + super(Family.all(ViewPortComponent.class).get()); + this.batch = batch; + drawableLogicMapper = new DrawableLogicMapper(); + //shaderManager.createFrameBuffer("main"); + } + + public void addDrawableType(IExternalItemType itemType) { + drawableLogicMapper.addDrawableToMap(itemType.getTypeId(), itemType.getDrawable()); + } + + @Override + public void processEntity(Entity entity, float deltaTime) { + timeRunning+=deltaTime; + + ViewPortComponent ViewPortComponent = viewPortMapper.get(entity); + Viewport viewport = ViewPortComponent.viewPort; + camera = viewport.getCamera(); + + camera.update(); + batch.setProjectionMatrix(camera.combined); + + //shaderManager.beginFrameBuffer("main"); + batch.begin(); + drawRecursively(entity, 1f); + batch.end(); + + /*shaderManager.endFrameBuffer(); + shaderManager.begin(SceneLoader.createDefaultShader()); + shaderManager.renderFrameBuffer("main"); + shaderManager.end();*/ + + if (rayHandler != null) { + rayHandler.setCulling(true); + OrthographicCamera orthoCamera = (OrthographicCamera) camera; + + rayHandler.setCombinedMatrix(camera.combined.scl(1f/PhysicsBodyLoader.getScale()), + camera.position.x * PhysicsBodyLoader.getScale(), + camera.position.y * PhysicsBodyLoader.getScale(), + 2 * camera.viewportWidth * orthoCamera.zoom * PhysicsBodyLoader.getScale(), + 2 * camera.viewportHeight * orthoCamera.zoom * PhysicsBodyLoader.getScale()); + rayHandler.updateAndRender(); + } + //debugRenderer.render(world, camera.combined); + } + + private void drawRecursively(Entity rootEntity, float parentAlpha) { + CompositeTransformComponent curCompositeTransformComponent = compositeTransformMapper.get(rootEntity); + TransformComponent transform = transformMapper.get(rootEntity); + + boolean scissors = false; + + if (curCompositeTransformComponent.transform || transform.rotation != 0 || transform.scaleX !=1 || transform.scaleY !=1){ + computeTransform(rootEntity); + applyTransform(rootEntity, batch); + } + + if (curCompositeTransformComponent.scissorsEnabled) { + batch.flush(); + //TODO Scissors rectangle does not rotate.. why? Uhm + ScissorStack.calculateScissors(camera, curCompositeTransformComponent.oldTransform, curCompositeTransformComponent.clipBounds, curCompositeTransformComponent.scissors); + if (ScissorStack.pushScissors(curCompositeTransformComponent.scissors)) { + scissors = true; + } + } + + applyShader(rootEntity, batch); + + TintComponent tintComponent = ComponentRetriever.get(rootEntity, TintComponent.class); + parentAlpha *= tintComponent.color.a; + + drawChildren(rootEntity, batch, curCompositeTransformComponent, parentAlpha); + + if (curCompositeTransformComponent.transform || transform.rotation != 0 || transform.scaleX !=1 || transform.scaleY !=1) + resetTransform(rootEntity, batch); + + resetShader(rootEntity, batch); + + if (scissors) { + batch.flush(); + ScissorStack.popScissors(); + } + } + + private void drawChildren(Entity rootEntity, Batch batch, CompositeTransformComponent curCompositeTransformComponent, float parentAlpha) { + NodeComponent nodeComponent = nodeMapper.get(rootEntity); + Entity[] children = nodeComponent.children.begin(); + TransformComponent transform = transformMapper.get(rootEntity); + if (curCompositeTransformComponent.transform || transform.rotation != 0 || transform.scaleX !=1 || transform.scaleY !=1) { + for (int i = 0, n = nodeComponent.children.size; i < n; i++) { + Entity child = children[i]; + + LayerMapComponent rootLayers = ComponentRetriever.get(rootEntity, LayerMapComponent.class); + ZIndexComponent childZIndexComponent = ComponentRetriever.get(child, ZIndexComponent.class); + + if(!rootLayers.isVisible(childZIndexComponent.layerName)) { + continue; + } + + MainItemComponent childMainItemComponent = mainItemComponentMapper.get(child); + if(!childMainItemComponent.visible){ + continue; + } + + int entityType = childMainItemComponent.entityType; + + NodeComponent childNodeComponent = nodeMapper.get(child); + + if(childNodeComponent ==null){ + drawEntity(entityType, batch, child, parentAlpha); + }else{ + //Step into Composite + drawRecursively(child, parentAlpha); + } + } + } else { + // No transform for this group, offset each child. + TransformComponent compositeTransform = transformMapper.get(rootEntity); + + float offsetX = compositeTransform.x, offsetY = compositeTransform.y; + + if(viewPortMapper.has(rootEntity)){ + offsetX = 0; + offsetY = 0; + } + + for (int i = 0, n = nodeComponent.children.size; i < n; i++) { + Entity child = children[i]; + + LayerMapComponent rootLayers = ComponentRetriever.get(rootEntity, LayerMapComponent.class); + ZIndexComponent childZIndexComponent = ComponentRetriever.get(child, ZIndexComponent.class); + + if(!rootLayers.isVisible(childZIndexComponent.layerName)) { + continue; + } + + MainItemComponent childMainItemComponent = mainItemComponentMapper.get(child); + if(!childMainItemComponent.visible){ + continue; + } + + TransformComponent childTransformComponent = transformMapper.get(child); + float cx = childTransformComponent.x, cy = childTransformComponent.y; + childTransformComponent.x = cx + offsetX; + childTransformComponent.y = cy + offsetY; + + NodeComponent childNodeComponent = nodeMapper.get(child); + int entityType = mainItemComponentMapper.get(child).entityType; + + if(childNodeComponent ==null){ + drawEntity(entityType, batch, child, parentAlpha); + }else{ + //Step into Composite + drawRecursively(child, parentAlpha); + } + childTransformComponent.x = cx; + childTransformComponent.y = cy; + } + } + nodeComponent.children.end(); + } + + private void drawEntity(int entityType, Batch batch, Entity child, float parentAlpha) { + applyShader(child, batch); + //Find the logic from mapper and draw it + drawableLogicMapper.getDrawable(entityType).draw(batch, child, parentAlpha); + + resetShader(child, batch); + } + + /** Returns the transform for this group's coordinate system. + * @param rootEntity */ + protected Matrix4 computeTransform(Entity rootEntity) { + CompositeTransformComponent curCompositeTransformComponent = compositeTransformMapper.get(rootEntity); + ParentNodeComponent parentNodeComponent = parentNodeMapper.get(rootEntity); + TransformComponent curTransform = transformMapper.get(rootEntity); + Affine2 worldTransform = curCompositeTransformComponent.worldTransform; + + float originX = curTransform.originX; + float originY = curTransform.originY; + float x = curTransform.x; + float y = curTransform.y; + float rotation = curTransform.rotation; + float scaleX = curTransform.scaleX; + float scaleY = curTransform.scaleY; + + worldTransform.setToTrnRotScl(x + originX, y + originY, rotation, scaleX, scaleY); + if (originX != 0 || originY != 0) worldTransform.translate(-originX, -originY); + + // Find the parent that transforms. + + CompositeTransformComponent parentTransformComponent = null; + + Entity parentEntity = null; + if(parentNodeComponent != null){ + parentEntity = parentNodeComponent.parentEntity; + } + + if (parentEntity != null){ + parentTransformComponent = compositeTransformMapper.get(parentEntity); + TransformComponent transform = transformMapper.get(parentEntity); + if(curCompositeTransformComponent.transform || transform.rotation != 0 || transform.scaleX !=1 || transform.scaleY !=1) + worldTransform.preMul(parentTransformComponent.worldTransform); + } + + curCompositeTransformComponent.computedTransform.set(worldTransform); + return curCompositeTransformComponent.computedTransform; + } + + protected void applyTransform (Entity rootEntity, Batch batch) { + CompositeTransformComponent curCompositeTransformComponent = compositeTransformMapper.get(rootEntity); + curCompositeTransformComponent.oldTransform.set(batch.getTransformMatrix()); + batch.setTransformMatrix(curCompositeTransformComponent.computedTransform); + } + + protected void resetTransform (Entity rootEntity, Batch batch) { + CompositeTransformComponent curCompositeTransformComponent = compositeTransformMapper.get(rootEntity); + batch.setTransformMatrix(curCompositeTransformComponent.oldTransform); + } + + protected void applyShader(Entity entity, Batch batch) { + if(shaderComponentMapper.has(entity)){ + ShaderComponent shaderComponent = shaderComponentMapper.get(entity); + if(shaderComponent.getShader() != null) { + batch.setShader(shaderComponent.getShader()); + + batch.getShader().setUniformf("deltaTime", Gdx.graphics.getDeltaTime()); + batch.getShader().setUniformf("time", HyperLap2dRenderer.timeRunning); + batch.getShader().setUniformf("screen_size", dimensionsComponentComponentMapper.get(entity).width, + dimensionsComponentComponentMapper.get(entity).height); + + for (Map.Entry entry : mainItemComponentMapper.get(entity).customVariables.getHashMap().entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.startsWith("_shader_")) { + batch.getShader().setUniformf(key.replace("_shader_", ""), Float.parseFloat(value)); + } + } + + GL20 gl = Gdx.gl20; + int error; + if ((error = gl.glGetError()) != GL20.GL_NO_ERROR) { + Gdx.app.log("opengl", "Error: " + error); + Gdx.app.log("opengl", shaderComponent.getShader().getLog()); + //throw new RuntimeException( ": glError " + error); + } + } + } + } + + protected void resetShader(Entity entity, Batch batch) { + if(shaderComponentMapper.has(entity)){ + batch.setShader(null); + } + } + + public void setRayHandler(RayHandler rayHandler){ + this.rayHandler = rayHandler; + } + +// public void setBox2dWorld(World world) { +// this.world = world; +// } + + public Batch getBatch() { + return batch; + } +} + diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/ShaderManager.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/ShaderManager.java new file mode 100644 index 00000000..de76caf3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/ShaderManager.java @@ -0,0 +1,254 @@ +package games.rednblack.editor.renderer.systems.render; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.*; +import com.badlogic.gdx.graphics.glutils.FrameBuffer; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.utils.ArrayMap; +import com.badlogic.gdx.utils.GdxRuntimeException; + +import java.util.Stack; + +public class ShaderManager { + private final ArrayMap shaders; + private final ArrayMap frameBuffers; + private final Stack activeFrameBuffers; + private final Camera screenCamera; + private final Mesh screenMesh; + private ShaderProgram currentShader; + private int currentTextureId; + + public ShaderManager() { + shaders = new ArrayMap<>(); + + frameBuffers = new ArrayMap<>(); + activeFrameBuffers = new Stack<>(); + + screenCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + screenMesh = new Mesh(true, 4, 6, + new VertexAttribute(VertexAttributes.Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE), + new VertexAttribute(VertexAttributes.Usage.ColorUnpacked, 4, ShaderProgram.COLOR_ATTRIBUTE), + new VertexAttribute(VertexAttributes.Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE + "0")); + + Vector3 vec0 = new Vector3(0, 0, 0); + screenCamera.unproject(vec0); + Vector3 vec1 = new Vector3(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0); + screenCamera.unproject(vec1); + screenMesh.setVertices(new float[]{ + vec0.x, vec0.y, 0, 1, 1, 1, 1, 0, 1, + vec1.x, vec0.y, 0, 1, 1, 1, 1, 1, 1, + vec1.x, vec1.y, 0, 1, 1, 1, 1, 1, 0, + vec0.x, vec1.y, 0, 1, 1, 1, 1, 0, 0}); + screenMesh.setIndices(new short[]{0, 1, 2, 2, 3, 0}); + screenCamera.translate(0f, -1f, 0f); + screenCamera.update(); + } + + public void begin(String shaderName) { + // check if we have a shader that has not been end()ed + if (currentShader != null) { + throw new IllegalArgumentException("Before calling begin() for a new shader please call end() for the current one!"); + } + // check if we have a program for that name + ShaderProgram program = shaders.get(shaderName); + + begin(program); + } + + public void begin(ShaderProgram program) { + // check if we have a shader that has not been end()ed + if (currentShader != null) { + throw new IllegalArgumentException("Before calling begin() for a new shader please call end() for the current one!"); + } + + currentTextureId = 0; + + currentShader = program; + currentShader.begin(); + } + + public void end() { + currentShader.end(); + currentShader = null; + } + + /** + * Creates a new FrameBuffer with the format RGBA8888 and Gdx.graphics.getWidth() and Gdx.graphics.getHeight() + * + * @param frameBufferName name of the new FrameBuffer + */ + public void createFrameBuffer(String frameBufferName) { + createFrameBuffer(frameBufferName, Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } + + /** + * Creates a new FrameBuffer with the format RGBA8888 and the given width and height + * + * @param frameBufferName name of the new FrameBuffer + * @param width of the FrameBuffer + * @param height of the FrameBuffer + */ + public void createFrameBuffer(String frameBufferName, int width, int height) { + createFrameBuffer(frameBufferName, Pixmap.Format.RGBA8888, width, height); + } + + /** + * Creates a new FrameBuffer with the format RGBA8888 and the given width and height + * + * @param frameBufferName name of the new FrameBuffer + * @param format of the FrameBuffer, see Pixmap.Format for valid values + * @param width of the FrameBuffer + * @param height of the FrameBuffer + */ + public void createFrameBuffer(String frameBufferName, Pixmap.Format format, int width, int height) { + if (frameBuffers.containsKey(frameBufferName)) { + throw new IllegalArgumentException("A framebuffer with the name '" + frameBufferName + "' already exists"); + } + FrameBuffer frameBuffer = new FrameBuffer(format, width, height, false, false); + frameBuffers.put(frameBufferName, frameBuffer); + } + + /** + * Start rendering into the given FrameBuffer + * + * @param frameBufferName name of the FrameBuffer + */ + public void beginFrameBuffer(String frameBufferName) { + beginFrameBuffer(frameBufferName, 0f, 0f, 0f, 0f); + } + + /** + * Start rendering into the given FrameBuffer with the specified clear color. + * + * @param frameBufferName name of the FrameBuffer + */ + public void beginFrameBuffer(String frameBufferName, float clearColorRed, float clearColorGreen, float clearColorBlue, float clearColorAlpha) { + if (!frameBuffers.containsKey(frameBufferName)) { + throw new IllegalArgumentException("A framebuffer with the name '" + frameBufferName + "' has not been created"); + } + final FrameBuffer frameBuffer = frameBuffers.get(frameBufferName); + frameBuffer.begin(); + activeFrameBuffers.push(frameBuffer); + + //Gdx.graphics.getGL20().glClearColor(clearColorRed, clearColorGreen, clearColorBlue, clearColorAlpha); + initInitialFrameBufferState(frameBuffer); + } + + /** + * Sets the initial state when a FrameBuffer starts. Override to set your own state. + * + * @param frameBuffer the FrameBuffer for which the state is initialized + */ + protected void initInitialFrameBufferState(FrameBuffer frameBuffer) { + Gdx.graphics.getGL20().glViewport(0, 0, frameBuffer.getWidth(), frameBuffer.getHeight()); + Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); + Gdx.graphics.getGL20().glEnable(GL20.GL_TEXTURE_2D); + Gdx.graphics.getGL20().glEnable(GL20.GL_BLEND); + Gdx.graphics.getGL20().glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + } + + /** + * Stops rendering to the current FrameBuffer + */ + public void endFrameBuffer() { + if (activeFrameBuffers.empty()) { + throw new GdxRuntimeException("There is no active frame buffer that can be ended"); + } + final FrameBuffer frameBuffer = activeFrameBuffers.pop(); + frameBuffer.end(); + } + + /** + * Renders the given FrameBuffer to the screen using the current ShaderProgram + * + * @param frameBufferName name of the FrameBuffer to render + */ + public void renderFrameBuffer(String frameBufferName) { + renderFrameBuffer(frameBufferName, screenMesh); + } + + /** + * Renders the given FrameBuffer onto a Mesh using the current ShaderProgram + * + * @param frameBufferName name of the FrameBuffer to render + * @param target Mesh to render onto + */ + public void renderFrameBuffer(String frameBufferName, Mesh target) { + if (currentShader == null) { + throw new GdxRuntimeException("Rendering the frame buffers needs an active shader"); + } + FrameBuffer frameBuffer = frameBuffers.get(frameBufferName); + if (frameBuffer == null) { + throw new GdxRuntimeException("A framebuffer with the name '" + frameBufferName + "' could not be found"); + } + frameBuffer.getColorBufferTexture().bind(0); + currentShader.setUniformMatrix("u_projTrans", screenCamera.combined); + currentShader.setUniformi("u_texture", 0); + target.render(currentShader, GL20.GL_TRIANGLES); + } + + /** + * Return the FrameBuffer with the given name + * + * @param frameBufferName Name of the FrameBuffer to return + * @return a FrameBuffer or null if there is no such FrameBuffer + */ + public FrameBuffer getFrameBuffer(String frameBufferName) { + return frameBuffers.get(frameBufferName); + } + + /** + * Returns the currently active shader. + * + * @return a valid ShaderProgram or null + */ + public ShaderProgram getCurrentShader() { + return currentShader; + } + + public void setUniformMatrix(String uniformName, Matrix4 matrix) { + if (currentShader == null) { + throw new GdxRuntimeException("Please call begin() before setting uniforms"); + } + currentShader.setUniformMatrix(uniformName, matrix); + } + + public void setUniformf(String uniformName, float value) { + if (currentShader == null) { + throw new GdxRuntimeException("Please call begin() before setting uniforms"); + } + currentShader.setUniformf(uniformName, value); + } + + public void setUniform2fv(String uniformName, float[] values) { + if (currentShader == null) { + throw new GdxRuntimeException("Please call begin() before setting uniforms"); + } + currentShader.setUniform2fv(uniformName, values, 0, 2); + } + + public void setUniformTexture(String uniformName, Texture texture) { + if (currentShader == null) { + throw new GdxRuntimeException("Please call begin() before setting uniforms"); + } + + int textureId = ++currentTextureId; + texture.bind(textureId); + currentShader.setUniformi(uniformName, textureId); + } + + /** + * ShaderManager needs to be disposed if not used anymore. + */ + public void dispose() { + for (ShaderProgram program : shaders.values()) { + program.dispose(); + } + shaders.clear(); + + screenMesh.dispose(); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/Drawable.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/Drawable.java new file mode 100644 index 00000000..740c2b21 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/Drawable.java @@ -0,0 +1,8 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; + +public interface Drawable { + public abstract void draw(Batch batch, Entity entity, float parentAlpha); +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/DrawableLogicMapper.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/DrawableLogicMapper.java new file mode 100644 index 00000000..c911d6ad --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/DrawableLogicMapper.java @@ -0,0 +1,32 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import java.util.HashMap; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import games.rednblack.editor.renderer.factory.EntityFactory; + +public class DrawableLogicMapper { + + private HashMap logicClassMap; + + public DrawableLogicMapper() { + logicClassMap = new HashMap<>(); + logicClassMap.put(EntityFactory.IMAGE_TYPE, new TextureRegionDrawLogic()); + logicClassMap.put(EntityFactory.LABEL_TYPE, new LabelDrawableLogic()); + logicClassMap.put(EntityFactory.NINE_PATCH, new NinePatchDrawableLogic()); + logicClassMap.put(EntityFactory.PARTICLE_TYPE, new ParticleDrawableLogic()); + logicClassMap.put(EntityFactory.SPRITE_TYPE, new SpriteDrawableLogic()); + logicClassMap.put(EntityFactory.SPRITER_TYPE, new SpriterDrawableLogic()); + logicClassMap.put(EntityFactory.COLOR_PRIMITIVE,new TextureRegionDrawLogic()); + logicClassMap.put(EntityFactory.LIGHT_TYPE, new LightDrawableLogic()); + } + + public void addDrawableToMap(int type, Drawable drawable) { + logicClassMap.put(type, drawable); + } + + public Drawable getDrawable(int type){ + return logicClassMap.get(type); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java new file mode 100644 index 00000000..8be9021a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java @@ -0,0 +1,53 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.Batch; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterDrawerComponent; + +public class LabelDrawableLogic implements Drawable { + + private ComponentMapper labelComponentMapper; + private ComponentMapper tintComponentMapper; + private ComponentMapper dimensionsComponentMapper; + private ComponentMapper transformMapper; + private ComponentMapper parentNodeComponentComponentMapper; + + private final Color tmpColor = new Color(); + + public LabelDrawableLogic() { + labelComponentMapper = ComponentMapper.getFor(LabelComponent.class); + tintComponentMapper = ComponentMapper.getFor(TintComponent.class); + dimensionsComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + parentNodeComponentComponentMapper = ComponentMapper.getFor(ParentNodeComponent.class); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + TransformComponent entityTransformComponent = transformMapper.get(entity); + LabelComponent labelComponent = labelComponentMapper.get(entity); + DimensionsComponent dimenstionsComponent = dimensionsComponentMapper.get(entity); + TintComponent tint = tintComponentMapper.get(entity); + + tmpColor.set(tint.color); + + if (labelComponent.style.background != null) { + batch.setColor(tmpColor); + labelComponent.style.background.draw(batch, entityTransformComponent.x, entityTransformComponent.y, dimenstionsComponent.width, dimenstionsComponent.height); + //System.out.println("LAbel BG"); + } + + if(labelComponent.style.fontColor != null) tmpColor.mul(labelComponent.style.fontColor); + tmpColor.a *= tintComponentMapper.get(parentNodeComponentComponentMapper.get(entity).parentEntity).color.a; + + labelComponent.cache.tint(tmpColor); + labelComponent.cache.setPosition(entityTransformComponent.x, entityTransformComponent.y); + labelComponent.cache.draw(batch); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LightDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LightDrawableLogic.java new file mode 100644 index 00000000..adbf9624 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LightDrawableLogic.java @@ -0,0 +1,37 @@ +package games.rednblack.editor.renderer.systems.render.logic; + + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.Batch; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.TintComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; + +public class LightDrawableLogic implements Drawable { + + private ComponentMapper lightComponentMapper; + private ComponentMapper tintComponentMapper; + private ComponentMapper parentNodeComponentComponentMapper; + + private final Color tmpColor = new Color(); + + public LightDrawableLogic() { + lightComponentMapper = ComponentMapper.getFor(LightObjectComponent.class); + tintComponentMapper = ComponentMapper.getFor(TintComponent.class); + parentNodeComponentComponentMapper = ComponentMapper.getFor(ParentNodeComponent.class); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + LightObjectComponent lightObjectComponent = lightComponentMapper.get(entity); + TintComponent tint = tintComponentMapper.get(entity); + + tmpColor.set(tint.color); + tmpColor.a *= tintComponentMapper.get(parentNodeComponentComponentMapper.get(entity).parentEntity).color.a; + + lightObjectComponent.lightObject.setColor(tmpColor); + } + +} \ No newline at end of file diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/NinePatchDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/NinePatchDrawableLogic.java new file mode 100644 index 00000000..1ffdc48e --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/NinePatchDrawableLogic.java @@ -0,0 +1,35 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.math.Matrix4; +import games.rednblack.editor.renderer.components.*; + +public class NinePatchDrawableLogic implements Drawable { + + private ComponentMapper tintComponentComponentMapper; + private ComponentMapper transformMapper; + private ComponentMapper dimensionsMapper; + private ComponentMapper ninePatchMapper; + + + public NinePatchDrawableLogic() { + tintComponentComponentMapper = ComponentMapper.getFor(TintComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + dimensionsMapper = ComponentMapper.getFor(DimensionsComponent.class); + ninePatchMapper = ComponentMapper.getFor(NinePatchComponent.class); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + TintComponent tintComponent = tintComponentComponentMapper.get(entity); + TransformComponent entityTransformComponent = transformMapper.get(entity); + DimensionsComponent entityDimensionsComponent = dimensionsMapper.get(entity); + NinePatchComponent entityNinePatchComponent = ninePatchMapper.get(entity); + batch.setColor(tintComponent.color); + + entityNinePatchComponent.ninePatch.draw(batch, entityTransformComponent.x, entityTransformComponent.y, entityDimensionsComponent.width, entityDimensionsComponent.height); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/ParticleDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/ParticleDrawableLogic.java new file mode 100644 index 00000000..96536a36 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/ParticleDrawableLogic.java @@ -0,0 +1,29 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; + +public class ParticleDrawableLogic implements Drawable { + + private ComponentMapper particleComponentMapper = ComponentMapper.getFor(ParticleComponent.class); + private ComponentMapper transformComponentMapper = ComponentMapper.getFor(TransformComponent.class); + + public ParticleDrawableLogic() { + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + ParticleComponent particleComponent = particleComponentMapper.get(entity); + //Matrix4 matrix = batch.getTransformMatrix().scl(particleComponent.worldMultiplyer); + //batch.setTransformMatrix(matrix); + TransformComponent transformComponent = transformComponentMapper.get(entity); + //particleEffect.setPosition(transformComponent.x/particleComponent.worldMultiplyer, transformComponent.y/particleComponent.worldMultiplyer); + particleComponent.particleEffect.setPosition(transformComponent.x, transformComponent.y); + particleComponent.particleEffect.draw(batch); + //batch.setTransformMatrix(batch.getTransformMatrix().scl(1f/particleComponent.worldMultiplyer)); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriteDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriteDrawableLogic.java new file mode 100644 index 00000000..cb55d539 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriteDrawableLogic.java @@ -0,0 +1,14 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; + +public class SpriteDrawableLogic extends TextureRegionDrawLogic { + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + super.draw(batch, entity, parentAlpha); + //TODO in case we need specific things + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriterDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriterDrawableLogic.java new file mode 100644 index 00000000..15e46ef3 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/SpriterDrawableLogic.java @@ -0,0 +1,39 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.brashmonkey.spriter.Player; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterDrawerComponent; + +public class SpriterDrawableLogic implements Drawable { + + private ComponentMapper spriterDrawerMapper; + private ComponentMapper spriterMapper; + private ComponentMapper transformMapper; + + public SpriterDrawableLogic() { + spriterDrawerMapper = ComponentMapper.getFor(SpriterDrawerComponent.class); + spriterMapper = ComponentMapper.getFor(SpriterComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + TransformComponent entityTransformComponent = transformMapper.get(entity); + SpriterDrawerComponent spriterDrawerComponent = spriterDrawerMapper.get(entity); + SpriterComponent spriter = spriterMapper.get(entity); + Player player = spriter.player; + + player.setPosition(entityTransformComponent.x, entityTransformComponent.y); + //TODO dimentions + //player.setPivot(getWidth() / 2, getHeight() / 2); + player.setScale(spriter.scale ); + player.rotate(entityTransformComponent.rotation - player.getAngle()); + player.update(); + spriterDrawerComponent.drawer.beforeDraw(player, batch); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/TextureRegionDrawLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/TextureRegionDrawLogic.java new file mode 100644 index 00000000..a5b143da --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/TextureRegionDrawLogic.java @@ -0,0 +1,93 @@ +package games.rednblack.editor.renderer.systems.render.logic; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.*; + +public class TextureRegionDrawLogic implements Drawable { + + final private ComponentMapper tintComponentComponentMapper; + final private ComponentMapper textureRegionMapper; + final private ComponentMapper transformMapper; + final private ComponentMapper dimensionsComponentComponentMapper; + + public TextureRegionDrawLogic() { + tintComponentComponentMapper = ComponentMapper.getFor(TintComponent.class); + textureRegionMapper = ComponentMapper.getFor(TextureRegionComponent.class); + transformMapper = ComponentMapper.getFor(TransformComponent.class); + dimensionsComponentComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); + } + + @Override + public void draw(Batch batch, Entity entity, float parentAlpha) { + TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); + + if(entityTextureRegionComponent.polygonSprite != null) { + drawPolygonSprite(batch, entity); + } else { + drawSprite(batch, entity, parentAlpha); + } + } + + public void drawSprite(Batch batch, Entity entity, float parentAlpha) { + TintComponent tintComponent = tintComponentComponentMapper.get(entity); + TransformComponent entityTransformComponent = transformMapper.get(entity); + TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); + DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); + batch.setColor(tintComponent.color.r, tintComponent.color.g, tintComponent.color.b, tintComponent.color.a * parentAlpha); + + batch.draw(entityTextureRegionComponent.region, + entityTransformComponent.x, entityTransformComponent.y, + entityTransformComponent.originX, entityTransformComponent.originY, + dimensionsComponent.width, dimensionsComponent.height, + entityTransformComponent.scaleX, entityTransformComponent.scaleY, + entityTransformComponent.rotation); + } + + public void drawPolygonSprite(Batch batch, Entity entity) { + TintComponent tintComponent = tintComponentComponentMapper.get(entity); + TransformComponent entityTransformComponent = transformMapper.get(entity); + TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); + + DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); + + entityTextureRegionComponent.polygonSprite.setBounds(entityTransformComponent.x, entityTransformComponent.y, dimensionsComponent.width, dimensionsComponent.height); + entityTextureRegionComponent.polygonSprite.setRotation(entityTransformComponent.rotation); + entityTextureRegionComponent.polygonSprite.setOrigin(entityTransformComponent.originX, entityTransformComponent.originY); + entityTextureRegionComponent.polygonSprite.setColor(tintComponent.color); + entityTextureRegionComponent.polygonSprite.setScale(entityTransformComponent.scaleX, entityTransformComponent.scaleY); + entityTextureRegionComponent.polygonSprite.draw((PolygonSpriteBatch) batch); + } + + public void drawTiledPolygonSprite(Batch batch, Entity entity) { + batch.flush(); + TintComponent tintComponent = tintComponentComponentMapper.get(entity); + TransformComponent entityTransformComponent = transformMapper.get(entity); + TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); + + DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); + float ppwu = dimensionsComponent.width/entityTextureRegionComponent.region.getRegionWidth(); + + Vector2 atlasCoordsVector = new Vector2(entityTextureRegionComponent.region.getU(), entityTextureRegionComponent.region.getV()); + Vector2 atlasSizeVector = new Vector2(entityTextureRegionComponent.region.getU2()-entityTextureRegionComponent.region.getU(), entityTextureRegionComponent.region.getV2()-entityTextureRegionComponent.region.getV()); + + batch.getShader().setUniformi("isRepeat", 1); + batch.getShader().setUniformf("atlasCoord", atlasCoordsVector); + batch.getShader().setUniformf("atlasSize", atlasSizeVector); + //System.out.println(entityTransformComponent.originX); + //batch.setColor(tintComponent.color); + entityTextureRegionComponent.polygonSprite.setColor(tintComponent.color); + entityTextureRegionComponent.polygonSprite.setOrigin(entityTransformComponent.originX * ppwu, entityTransformComponent.originY * ppwu); + entityTextureRegionComponent.polygonSprite.setPosition(entityTransformComponent.x, entityTransformComponent.y); + entityTextureRegionComponent.polygonSprite.setRotation(entityTransformComponent.rotation); + entityTextureRegionComponent.polygonSprite.setScale(ppwu); + entityTextureRegionComponent.polygonSprite.draw((PolygonSpriteBatch) batch); + batch.flush(); + batch.getShader().setUniformi("isRepeat", 0); + + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ComponentRetriever.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ComponentRetriever.java new file mode 100644 index 00000000..e18f7613 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ComponentRetriever.java @@ -0,0 +1,167 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.components.sprite.AnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationStateComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; +import games.rednblack.editor.renderer.components.spriter.SpriterDrawerComponent; + +/** + * Component Retriever is a singleton single instance class that initialises list of + * all component mappers on first access, and provides a retrieval methods to get {@link Component} + * with provided class from provided {@link Entity} object + * + * @author azakhary on 5/19/2015. + */ +public class ComponentRetriever { + + /** + * single static instance of this class + */ + private static ComponentRetriever instance; + + /** + * Unique map of mappers that can be accessed by component class + */ + private Map> mappers = new HashMap>(); + + /** + * Private constructor + */ + private ComponentRetriever() { + + } + + /** + * This is called only during first initialisation and populates map of mappers of all known Component mappers + * it might be a good idea to use Reflections library later to create this list from all classes in components package of runtime, all in favour? + */ + private void init() { + mappers.put(LightObjectComponent.class, ComponentMapper.getFor(LightObjectComponent.class)); + + mappers.put(ParticleComponent.class, ComponentMapper.getFor(ParticleComponent.class)); + + mappers.put(LabelComponent.class, ComponentMapper.getFor(LabelComponent.class)); + + mappers.put(PolygonComponent.class, ComponentMapper.getFor(PolygonComponent.class)); + mappers.put(PhysicsBodyComponent.class, ComponentMapper.getFor(PhysicsBodyComponent.class)); + mappers.put(LightBodyComponent.class, ComponentMapper.getFor(LightBodyComponent.class)); + + mappers.put(AnimationComponent.class, ComponentMapper.getFor(AnimationComponent.class)); + mappers.put(SpriteAnimationComponent.class, ComponentMapper.getFor(SpriteAnimationComponent.class)); + mappers.put(SpriteAnimationStateComponent.class, ComponentMapper.getFor(SpriteAnimationStateComponent.class)); + + mappers.put(SpriterDrawerComponent.class, ComponentMapper.getFor(SpriterDrawerComponent.class)); + mappers.put(SpriterComponent.class, ComponentMapper.getFor(SpriterComponent.class)); + + mappers.put(CompositeTransformComponent.class, ComponentMapper.getFor(CompositeTransformComponent.class)); + mappers.put(DimensionsComponent.class, ComponentMapper.getFor(DimensionsComponent.class)); + mappers.put(LayerMapComponent.class, ComponentMapper.getFor(LayerMapComponent.class)); + mappers.put(MainItemComponent.class, ComponentMapper.getFor(MainItemComponent.class)); + mappers.put(NinePatchComponent.class, ComponentMapper.getFor(NinePatchComponent.class)); + mappers.put(NodeComponent.class, ComponentMapper.getFor(NodeComponent.class)); + mappers.put(ParentNodeComponent.class, ComponentMapper.getFor(ParentNodeComponent.class)); + mappers.put(ScissorComponent.class, ComponentMapper.getFor(ScissorComponent.class)); + mappers.put(TextureRegionComponent.class, ComponentMapper.getFor(TextureRegionComponent.class)); + mappers.put(TintComponent.class, ComponentMapper.getFor(TintComponent.class)); + mappers.put(TransformComponent.class, ComponentMapper.getFor(TransformComponent.class)); + mappers.put(ViewPortComponent.class, ComponentMapper.getFor(ViewPortComponent.class)); + mappers.put(ZIndexComponent.class, ComponentMapper.getFor(ZIndexComponent.class)); + mappers.put(ScriptComponent.class, ComponentMapper.getFor(ScriptComponent.class)); + + mappers.put(ShaderComponent.class, ComponentMapper.getFor(ShaderComponent.class)); + + mappers.put(ActionComponent.class, ComponentMapper.getFor(ActionComponent.class)); + } + + /** + * Short version of getInstance singleton variation, but with private access, + * as there is no reason to get instance of this class, but only use it's public methods + * + * @return ComponentRetriever only instance + */ + private static synchronized ComponentRetriever self() { + if(instance == null) { + instance = new ComponentRetriever(); + + // Important to initialize during first creation, to populate mappers map + instance.init(); + } + + return instance; + } + + /** + * @return returns Map of mappers, for internal use only + */ + private Map> getMappers() { + return mappers; + } + + /** + * Retrieves Component of provided type from a provided entity + * @param entity of type Entity to retrieve component from + * @param type of the component + * @param + * + * @return Component subclass instance + */ + @SuppressWarnings("unchecked") + public static T get(Entity entity, Class type) { + return (T)self().getMappers().get(type).get(entity); + } + + + @SuppressWarnings("unchecked") + public static Collection getComponents(Entity entity) { + Collection components = new ArrayList(); + for (ComponentMapper mapper : self().getMappers().values()) { + if(mapper.get(entity) != null) components.add(mapper.get(entity)); + } + + return components; + } + + /** + * This is to add a new mapper type externally, in case of for example implementing the plugin system, + * where components might be initialized on the fly + * + * @param type + */ + @SuppressWarnings("unchecked") + public static void addMapper(Class type) { + self().getMappers().put(type, ComponentMapper.getFor(type)); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/CustomVariables.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/CustomVariables.java new file mode 100644 index 00000000..29586c29 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/CustomVariables.java @@ -0,0 +1,80 @@ +package games.rednblack.editor.renderer.utils; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by azakhary on 8/28/2014. + */ +public class CustomVariables { + + private HashMap variables = new HashMap(); + + public CustomVariables() { + + } + + public void loadFromString(String varString) { + variables.clear(); + String[] vars = varString.split(";"); + for(int i = 0; i < vars.length; i++) { + String[] tmp = vars[i].split(":"); + if(tmp.length > 1) { + setVariable(tmp[0], tmp[1]); + } + } + } + + public String saveAsString() { + String result = ""; + for (Map.Entry entry : variables.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + result += key + ":" + value + ";"; + } + if(result.length() > 0) { + result = result.substring(0, result.length()-1); + } + + return result; + } + + public void setVariable(String key, String value) { + variables.put(key, value); + } + + public void removeVariable(String key) { + variables.remove(key); + } + + public String getStringVariable(String key) { + return variables.get(key); + } + + public Integer getIntegerVariable(String key) { + Integer result = null; + try { + result = Integer.parseInt(variables.get(key)); + } catch(Exception e) {} + + return result; + } + + public Float getFloatVariable(String key) { + Float result = null; + try { + result = Float.parseFloat(variables.get(key)); + } catch(Exception e) {} + + return result; + } + + public HashMap getHashMap() { + return variables; + } + + public int getCount() { + return variables.size(); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ForceUtils.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ForceUtils.java new file mode 100644 index 00000000..dc18ba5a --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ForceUtils.java @@ -0,0 +1,39 @@ +package games.rednblack.editor.renderer.utils; + +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; + +/** + * Created by aurel on 19/02/16. + */ +public class ForceUtils { + + + + public static void applyImpulse(Vector2 impulsePosition, float strength, float influenceArea, Body body) { + Vector2 v = body.getPosition().cpy().sub(impulsePosition); + + float length = MathUtils.clamp(v.len(), 0, influenceArea); + v.nor().scl(influenceArea - length).scl(strength); + + applyForce(v, body, false, false, new Vector2(0, 0)); + } + + public static void applyForce(Vector2 force, Body body) { + applyForce(force, body, false, false, new Vector2(0, 0)); + } + + public static void applyForce(Vector2 force, Body body, Vector2 relativePoint) { + applyForce(force, body, false, false, relativePoint); + } + + public static void applyForce(Vector2 force, Body body, boolean relativeToVelocity, boolean relativeToMass, Vector2 relativePoint) { + Vector2 forceToApply = force.cpy(); + + if (relativeToVelocity) forceToApply.sub(body.getLinearVelocity()); + if (relativeToMass) forceToApply.scl(body.getMass()); + + body.applyForce(forceToApply, relativePoint.cpy().add(body.getPosition()), true); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ItemWrapper.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ItemWrapper.java new file mode 100644 index 00000000..22c9da51 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/ItemWrapper.java @@ -0,0 +1,99 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.renderer.utils; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.ScriptComponent; +import games.rednblack.editor.renderer.scripts.IScript; + +import java.util.HashMap; + +/** + * Created by azakhary on 7/8/2015. + */ +public class ItemWrapper { + + private Entity entity; + + private NodeComponent nodeComponent; + private HashMap childMap = new HashMap(); + + public ItemWrapper() { + // empty wrapper is better then null pointer + } + + public ItemWrapper(Entity entity) { + this.entity = entity; + nodeComponent = ComponentRetriever.get(entity, NodeComponent.class); + if(nodeComponent != null) { + for (Entity child : nodeComponent.children) { + MainItemComponent mainItemComponent = ComponentRetriever.get(child, MainItemComponent.class); + childMap.put(mainItemComponent.itemIdentifier, child); + } + } + } + + public ItemWrapper getChild(String id) { + Entity entity = childMap.get(id); + if(entity == null) return new ItemWrapper(); + + return new ItemWrapper(entity); + } + + public T getComponent(Class clazz) { + return ComponentRetriever.get(entity, clazz); + } + + public ItemWrapper addChild(Entity child) { + if(nodeComponent != null) { + ParentNodeComponent parentNodeComponent = child.getComponent(ParentNodeComponent.class); + parentNodeComponent.parentEntity = entity; + nodeComponent.children.add(child); + + return new ItemWrapper(child); + } + + return new ItemWrapper(); + } + + public int getType() { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + return mainItemComponent.entityType; + } + + public Entity getEntity() { + return entity; + } + + public IScript addScript(IScript script) { + ScriptComponent component = ComponentRetriever.get(entity, ScriptComponent.class); + if(component == null) { + component = new ScriptComponent(); + entity.add(component); + } + component.addScript(script); + script.init(entity); + + return script; + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxDrawer.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxDrawer.java new file mode 100644 index 00000000..75f546f2 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxDrawer.java @@ -0,0 +1,64 @@ +package games.rednblack.editor.renderer.utils; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.brashmonkey.spriter.Drawer; +import com.brashmonkey.spriter.Loader; +import com.brashmonkey.spriter.Player; +import com.brashmonkey.spriter.Timeline.Key.Object; + +public class LibGdxDrawer extends Drawer{ + + private Batch batch; + private ShapeRenderer renderer; + + public LibGdxDrawer(Loader loader, ShapeRenderer renderer){ + super(loader); + this.renderer = renderer; + } + + @Override + public void setColor(float r, float g, float b, float a) { + renderer.setColor(r, g, b, a); + } + + @Override + public void rectangle(float x, float y, float width, float height) { + renderer.rect(x, y, width, height); + } + + @Override + public void line(float x1, float y1, float x2, float y2) { + renderer.line(x1, y1, x2, y2); + } + + @Override + public void circle(float x, float y, float radius) { + renderer.circle(x, y, radius); + } + + public void beforeDraw(Player player, Batch batch) { + this.batch = batch; + draw(player); + } + @Override + public void draw(Object object) { + Sprite sprite = loader.get(object.ref); + + float newPivotX = (sprite.getWidth() * object.pivot.x); + float newX = object.position.x - newPivotX; + float newPivotY = (sprite.getHeight() * object.pivot.y); + float newY = object.position.y - newPivotY; + + sprite.setX(newX); + sprite.setY(newY); + sprite.setOrigin(newPivotX, newPivotY); + sprite.setRotation(object.angle); + + sprite.setColor(1f, 1f, 1f, object.alpha); + sprite.setScale(object.scale.x, object.scale.y); + sprite.draw(batch); + } +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxLoader.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxLoader.java new file mode 100644 index 00000000..6ec5f834 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/LibGdxLoader.java @@ -0,0 +1,138 @@ +package games.rednblack.editor.renderer.utils; + +import java.io.File; +import java.util.HashMap; +import java.util.Set; +import java.util.Map.Entry; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.Texture.TextureFilter; +import com.badlogic.gdx.graphics.g2d.PixmapPacker; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Disposable; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.brashmonkey.spriter.Data; +import com.brashmonkey.spriter.FileReference; +import com.brashmonkey.spriter.Loader; + +public class LibGdxLoader extends Loader implements Disposable{ + + public static int standardAtlasWidth = 2048, standardAtlasHeight = 2048; + + private PixmapPacker packer; + private HashMap pixmaps; + private HashMap pixmapsToDispose; + private boolean pack; + private int atlasWidth, atlasHeight; + + public LibGdxLoader(Data data){ + this(data, true); + } + + public LibGdxLoader(Data data, boolean pack){ + this(data, standardAtlasWidth, standardAtlasHeight); + this.pack = pack; + } + + public LibGdxLoader(Data data, int atlasWidth, int atlasHeight) { + super(data); + this.pack = true; + this.atlasWidth = atlasWidth; + this.atlasHeight = atlasHeight; + this.pixmaps = new HashMap(); + this.pixmapsToDispose = new HashMap(); + } + + @Override + protected Sprite loadResource(FileReference ref) { + FileHandle f; + + String filename = new File(data.getFile(ref).name).getName(); + //String path = super.root+"/"+data.getFile(ref).name; + String path = super.root+"/"+filename; + switch(Gdx.app.getType()){ + case iOS: f = Gdx.files.absolute(path); break; + default: f = Gdx.files.internal(path); break; + } + + if(!f.exists()) throw new GdxRuntimeException("Could not find file handle "+ path + "! Please check your paths."); + if(this.packer == null && this.pack) + this.packer = new PixmapPacker(this.atlasWidth, this.atlasHeight, Pixmap.Format.RGBA8888, 2, true); + final Pixmap pix = new Pixmap(f); + this.pixmaps.put(ref, pix); + return null; + } + + /** + * Packs all loaded sprites into an atlas. Has to called after loading all sprites. + */ + protected void generatePackedSprites(){ + if(this.packer == null) return; + TextureAtlas tex = this.packer.generateTextureAtlas(TextureFilter.Linear, TextureFilter.Linear, false); + Set keys = this.resources.keySet(); + this.disposeNonPackedTextures(); + for(FileReference ref: keys){ + TextureRegion texReg = tex.findRegion(data.getFile(ref).name); + texReg.setRegionWidth((int) data.getFile(ref).size.width); + texReg.setRegionHeight((int) data.getFile(ref).size.height); + super.resources.put(ref, new Sprite(texReg)); + } + } + + private void disposeNonPackedTextures(){ + for(Entry entry: super.resources.entrySet()) + entry.getValue().getTexture().dispose(); + } + + @Override + public void dispose() { + if(this.pack && this.packer != null) this.packer.dispose(); + else this.disposeNonPackedTextures(); + super.dispose(); + } + + protected void finishLoading() { + Set refs = this.resources.keySet(); + for(FileReference ref: refs){ + Pixmap pix = this.pixmaps.get(ref); + this.pixmapsToDispose.put(pix, false); + this.createSprite(ref, pix); + + if(this.packer != null) packer.pack(data.getFile(ref).name, pix); + } + if(this.pack) generatePackedSprites(); + this.disposePixmaps(); + } + + protected void createSprite(FileReference ref, Pixmap image){ + Texture tex = new Texture(image); + tex.setFilter(TextureFilter.Linear, TextureFilter.Linear); + int width = (int) data.getFile(ref.folder, ref.file).size.width; + int height = (int) data.getFile(ref.folder, ref.file).size.height; + TextureRegion texRegion = new TextureRegion(tex, width, height); + super.resources.put(ref, new Sprite(texRegion)); + pixmapsToDispose.put(image, true); + } + + protected void disposePixmaps(){ + Pixmap[] maps = new Pixmap[this.pixmapsToDispose.size()]; + this.pixmapsToDispose.keySet().toArray(maps); + for(Pixmap pix: maps){ + try{ + while(pixmapsToDispose.get(pix)){ + pix.dispose(); + pixmapsToDispose.put(pix, false); + } + } catch(GdxRuntimeException e){ + System.err.println("Pixmap was already disposed!"); + } + } + pixmapsToDispose.clear(); + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/MySkin.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/MySkin.java new file mode 100644 index 00000000..bfd30b12 --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/MySkin.java @@ -0,0 +1,514 @@ +package games.rednblack.editor.renderer.utils; + +import java.util.ArrayList; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.Texture.TextureFilter; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion; +import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasSprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; +import com.badlogic.gdx.scenes.scene2d.utils.SpriteDrawable; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.scenes.scene2d.utils.TiledDrawable; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Disposable; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.Json.ReadOnlySerializer; +import com.badlogic.gdx.utils.JsonValue; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.SerializationException; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import com.badlogic.gdx.utils.reflect.Method; +import com.badlogic.gdx.utils.reflect.ReflectionException; + +/** A skin stores resources for UI widgets to use (texture regions, ninepatches, fonts, colors, etc). Resources are named and can + * be looked up by name and type. Resources can be described in JSON. Skin provides useful conversions, such as allowing access to + * regions in the atlas as ninepatches, sprites, drawables, etc. The get* methods return an instance of the object in the skin. + * The new* methods return a copy of an instance in the skin. + *

+ * See the documentation for more. + * @author Nathan Sweet */ +public class MySkin extends Skin { + private ObjectMap> resources = new ObjectMap(); + private TextureAtlas atlas; + public ArrayList fontFiles = new ArrayList(); + /** Creates an empty skin. */ + public MySkin () { + } + + /** Creates a skin containing the resources in the specified skin JSON file. If a file in the same directory with a ".atlas" + * extension exists, it is loaded as a {@link TextureAtlas} and the texture regions added to the skin. The atlas is + * automatically disposed when the skin is disposed. */ + public MySkin (FileHandle skinFile) { + FileHandle atlasFile = skinFile.sibling(skinFile.nameWithoutExtension() + ".atlas"); + if (atlasFile.exists()) { + atlas = new TextureAtlas(atlasFile); + addRegions(atlas); + } + + load(skinFile); + } + + /** Creates a skin containing the resources in the specified skin JSON file and the texture regions from the specified atlas. + * The atlas is automatically disposed when the skin is disposed. */ + public MySkin (FileHandle skinFile, TextureAtlas atlas) { + this.atlas = atlas; + addRegions(atlas); + load(skinFile); + } + + /** Creates a skin containing the texture regions from the specified atlas. The atlas is automatically disposed when the skin is + * disposed. */ + public MySkin (TextureAtlas atlas) { + this.atlas = atlas; + addRegions(atlas); + } + + /** Adds all resources in the specified skin JSON file. */ + public void load (FileHandle skinFile) { + try { + getJsonLoader(skinFile).fromJson(Skin.class, skinFile); + } catch (SerializationException ex) { + throw new SerializationException("Error reading file: " + skinFile, ex); + } + } + + /** Adds all named texture regions from the atlas. The atlas will not be automatically disposed when the skin is disposed. */ + public void addRegions (TextureAtlas atlas) { + Array regions = atlas.getRegions(); + for (int i = 0, n = regions.size; i < n; i++) { + AtlasRegion region = regions.get(i); + add(region.name, region, TextureRegion.class); + } + } + + public void add (String name, Object resource) { + add(name, resource, resource.getClass()); + } + + public void add (String name, Object resource, Class type) { + if (name == null) throw new IllegalArgumentException("name cannot be null."); + if (resource == null) throw new IllegalArgumentException("resource cannot be null."); + ObjectMap typeResources = resources.get(type); + if (typeResources == null) { + typeResources = new ObjectMap(); + resources.put(type, typeResources); + } + typeResources.put(name, resource); + } + + public void remove (String name, Class type) { + if (name == null) throw new IllegalArgumentException("name cannot be null."); + ObjectMap typeResources = resources.get(type); + typeResources.remove(name); + } + + + public T get (Class type) { + return get("default", type); + } + + public T get (String name, Class type) { + if (name == null) throw new IllegalArgumentException("name cannot be null."); + if (type == null) throw new IllegalArgumentException("type cannot be null."); + + if (type == Drawable.class) return (T)getDrawable(name); + if (type == TextureRegion.class) return (T)getRegion(name); + if (type == NinePatch.class) return (T)getPatch(name); + if (type == Sprite.class) return (T)getSprite(name); + + ObjectMap typeResources = resources.get(type); + if (typeResources == null) throw new GdxRuntimeException("No " + type.getName() + " registered with name: " + name); + Object resource = typeResources.get(name); + if (resource == null) throw new GdxRuntimeException("No " + type.getName() + " registered with name: " + name); + return (T)resource; + } + + public T optional (String name, Class type) { + if (name == null) throw new IllegalArgumentException("name cannot be null."); + if (type == null) throw new IllegalArgumentException("type cannot be null."); + ObjectMap typeResources = resources.get(type); + if (typeResources == null) return null; + return (T)typeResources.get(name); + } + + public boolean has (String name, Class type) { + ObjectMap typeResources = resources.get(type); + if (typeResources == null) return false; + return typeResources.containsKey(name); + } + + /** Returns the name to resource mapping for the specified type, or null if no resources of that type exist. */ + public ObjectMap getAll (Class type) { + return (ObjectMap)resources.get(type); + } + + public Color getColor (String name) { + return get(name, Color.class); + } + + public BitmapFont getFont (String name) { + return get(name, BitmapFont.class); + } + + /** Returns a registered texture region. If no region is found but a texture exists with the name, a region is created from the + * texture and stored in the skin. */ + public TextureRegion getRegion (String name) { + TextureRegion region = optional(name, TextureRegion.class); + if (region != null) return region; + + Texture texture = optional(name, Texture.class); + if (texture == null) throw new GdxRuntimeException("No TextureRegion or Texture registered with name: " + name); + region = new TextureRegion(texture); + add(name, region, TextureRegion.class); + return region; + } + + /** Returns a registered tiled drawable. If no tiled drawable is found but a region exists with the name, a tiled drawable is + * created from the region and stored in the skin. */ + public TiledDrawable getTiledDrawable (String name) { + TiledDrawable tiled = optional(name, TiledDrawable.class); + if (tiled != null) return tiled; + + Drawable drawable = optional(name, Drawable.class); + if (drawable != null) { + if (!(drawable instanceof TiledDrawable)) { + throw new GdxRuntimeException("Drawable found but is not a TiledDrawable: " + name + ", " + + drawable.getClass().getName()); + } + return (TiledDrawable)drawable; + } + + tiled = new TiledDrawable(getRegion(name)); + add(name, tiled, TiledDrawable.class); + return tiled; + } + + /** Returns a registered ninepatch. If no ninepatch is found but a region exists with the name, a ninepatch is created from the + * region and stored in the skin. If the region is an {@link AtlasRegion} then the {@link AtlasRegion#splits} are used, + * otherwise the ninepatch will have the region as the center patch. */ + public NinePatch getPatch (String name) { + NinePatch patch = optional(name, NinePatch.class); + if (patch != null) return patch; + + try { + TextureRegion region = getRegion(name); + if (region instanceof AtlasRegion) { + int[] splits = ((AtlasRegion)region).splits; + if (splits != null) { + patch = new NinePatch(region, splits[0], splits[1], splits[2], splits[3]); + int[] pads = ((AtlasRegion)region).pads; + if (pads != null) patch.setPadding(pads[0], pads[1], pads[2], pads[3]); + } + } + if (patch == null) patch = new NinePatch(region); + add(name, patch, NinePatch.class); + return patch; + } catch (GdxRuntimeException ex) { + throw new GdxRuntimeException("No NinePatch, TextureRegion, or Texture registered with name: " + name); + } + } + + /** Returns a registered sprite. If no sprite is found but a region exists with the name, a sprite is created from the region + * and stored in the skin. If the region is an {@link AtlasRegion} then an {@link AtlasSprite} is used if the region has been + * whitespace stripped or packed rotated 90 degrees. */ + public Sprite getSprite (String name) { + Sprite sprite = optional(name, Sprite.class); + if (sprite != null) return sprite; + + try { + TextureRegion textureRegion = getRegion(name); + if (textureRegion instanceof AtlasRegion) { + AtlasRegion region = (AtlasRegion)textureRegion; + if (region.rotate || region.packedWidth != region.originalWidth || region.packedHeight != region.originalHeight) + sprite = new AtlasSprite(region); + } + if (sprite == null) sprite = new Sprite(textureRegion); + add(name, sprite, NinePatch.class); + return sprite; + } catch (GdxRuntimeException ex) { + throw new GdxRuntimeException("No NinePatch, TextureRegion, or Texture registered with name: " + name); + } + } + + /** Returns a registered drawable. If no drawable is found but a region, ninepatch, or sprite exists with the name, then the + * appropriate drawable is created and stored in the skin. */ + public Drawable getDrawable (String name) { + Drawable drawable = optional(name, Drawable.class); + if (drawable != null) return drawable; + + drawable = optional(name, TiledDrawable.class); + if (drawable != null) return drawable; + + // Use texture or texture region. If it has splits, use ninepatch. If it has rotation or whitespace stripping, use sprite. + try { + TextureRegion textureRegion = getRegion(name); + if (textureRegion instanceof AtlasRegion) { + AtlasRegion region = (AtlasRegion)textureRegion; + if (region.splits != null) + drawable = new NinePatchDrawable(getPatch(name)); + else if (region.rotate || region.packedWidth != region.originalWidth || region.packedHeight != region.originalHeight) + drawable = new SpriteDrawable(getSprite(name)); + } + if (drawable == null) drawable = new TextureRegionDrawable(textureRegion); + } catch (GdxRuntimeException ignored) { + } + + // Check for explicit registration of ninepatch, sprite, or tiled drawable. + if (drawable == null) { + NinePatch patch = optional(name, NinePatch.class); + if (patch != null) + drawable = new NinePatchDrawable(patch); + else { + Sprite sprite = optional(name, Sprite.class); + if (sprite != null) + drawable = new SpriteDrawable(sprite); + else + throw new GdxRuntimeException("No Drawable, NinePatch, TextureRegion, Texture, or Sprite registered with name: " + + name); + } + } + + add(name, drawable, Drawable.class); + return drawable; + } + + /** Returns the name of the specified style object, or null if it is not in the skin. This compares potentially every style + * object in the skin of the same type as the specified style, which may be a somewhat expensive operation. */ + public String find (Object resource) { + if (resource == null) throw new IllegalArgumentException("style cannot be null."); + ObjectMap typeResources = resources.get(resource.getClass()); + if (typeResources == null) return null; + return typeResources.findKey(resource, true); + } + + /** Returns a copy of a drawable found in the skin via {@link #getDrawable(String)}. */ + public Drawable newDrawable (String name) { + return newDrawable(getDrawable(name)); + } + + /** Returns a tinted copy of a drawable found in the skin via {@link #getDrawable(String)}. */ + public Drawable newDrawable (String name, float r, float g, float b, float a) { + return newDrawable(getDrawable(name), new Color(r, g, b, a)); + } + + /** Returns a tinted copy of a drawable found in the skin via {@link #getDrawable(String)}. */ + public Drawable newDrawable (String name, Color tint) { + return newDrawable(getDrawable(name), tint); + } + + /** Returns a copy of the specified drawable. */ + public Drawable newDrawable (Drawable drawable) { + if (drawable instanceof TextureRegionDrawable) return new TextureRegionDrawable((TextureRegionDrawable)drawable); + if (drawable instanceof NinePatchDrawable) return new NinePatchDrawable((NinePatchDrawable)drawable); + if (drawable instanceof SpriteDrawable) return new SpriteDrawable((SpriteDrawable)drawable); + throw new GdxRuntimeException("Unable to copy, unknown drawable type: " + drawable.getClass()); + } + + /** Returns a tinted copy of a drawable found in the skin via {@link #getDrawable(String)}. */ + public Drawable newDrawable (Drawable drawable, float r, float g, float b, float a) { + return newDrawable(drawable, new Color(r, g, b, a)); + } + + /** Returns a tinted copy of a drawable found in the skin via {@link #getDrawable(String)}. */ + public Drawable newDrawable (Drawable drawable, Color tint) { + if (drawable instanceof TextureRegionDrawable) { + TextureRegion region = ((TextureRegionDrawable)drawable).getRegion(); + Sprite sprite; + if (region instanceof AtlasRegion) + sprite = new AtlasSprite((AtlasRegion)region); + else + sprite = new Sprite(region); + sprite.setColor(tint); + return new SpriteDrawable(sprite); + } + if (drawable instanceof NinePatchDrawable) { + NinePatchDrawable patchDrawable = new NinePatchDrawable((NinePatchDrawable)drawable); + patchDrawable.setPatch(new NinePatch(patchDrawable.getPatch(), tint)); + return patchDrawable; + } + if (drawable instanceof SpriteDrawable) { + SpriteDrawable spriteDrawable = new SpriteDrawable((SpriteDrawable)drawable); + Sprite sprite = spriteDrawable.getSprite(); + if (sprite instanceof AtlasSprite) + sprite = new AtlasSprite((AtlasSprite)sprite); + else + sprite = new Sprite(sprite); + sprite.setColor(tint); + spriteDrawable.setSprite(sprite); + return spriteDrawable; + } + throw new GdxRuntimeException("Unable to copy, unknown drawable type: " + drawable.getClass()); + } + + /** Sets the style on the actor to disabled or enabled. This is done by appending "-disabled" to the style name when enabled is + * false, and removing "-disabled" from the style name when enabled is true. A method named "getStyle" is called the actor via + * reflection and the name of that style is found in the skin. If the actor doesn't have a "getStyle" method or the style was + * not found in the skin, no exception is thrown and the actor is left unchanged. */ + public void setEnabled (Actor actor, boolean enabled) { + // Get current style. + Method method = findMethod(actor.getClass(), "getStyle"); + if (method == null) return; + Object style; + try { + style = method.invoke(actor); + } catch (Exception ignored) { + return; + } + // Determine new style. + String name = find(style); + if (name == null) return; + name = name.replace("-disabled", "") + (enabled ? "" : "-disabled"); + style = get(name, style.getClass()); + // Set new style. + method = findMethod(actor.getClass(), "setStyle"); + if (method == null) return; + try { + method.invoke(actor, style); + } catch (Exception ignored) { + } + } + + /** Returns the {@link TextureAtlas} that resources in this skin reference, or null. */ + public TextureAtlas getAtlas () { + return atlas; + } + + /** Disposes the {@link TextureAtlas} and all {@link Disposable} resources in the skin. */ + public void dispose () { + if (atlas != null) atlas.dispose(); + for (ObjectMap entry : resources.values()) { + for (Object resource : entry.values()) + if (resource instanceof Disposable) ((Disposable)resource).dispose(); + } + } + + protected Json getJsonLoader (final FileHandle skinFile) { + final Skin skin = this; + + final Json json = new Json() { + public T readValue (Class type, Class elementType, JsonValue jsonData) { + // If the JSON is a string but the type is not, look up the actual value by name. + if (jsonData.isString() && !ClassReflection.isAssignableFrom(CharSequence.class, type)) + return get(jsonData.asString(), type); + return super.readValue(type, elementType, jsonData); + } + }; + json.setTypeName(null); + json.setUsePrototypes(false); + + json.setSerializer(Skin.class, new ReadOnlySerializer() { + public Skin read (Json json, JsonValue typeToValueMap, Class ignored) { + for (JsonValue valueMap = typeToValueMap.child; valueMap != null; valueMap = valueMap.next) { + try { + readNamedObjects(json, ClassReflection.forName(valueMap.name()), valueMap); + } catch (ReflectionException ex) { + throw new SerializationException(ex); + } + } + return skin; + } + + private void readNamedObjects (Json json, Class type, JsonValue valueMap) { + Class addType = type == TintedDrawable.class ? Drawable.class : type; + for (JsonValue valueEntry = valueMap.child; valueEntry != null; valueEntry = valueEntry.next) { + Object object = json.readValue(type, valueEntry); + if (object == null) continue; + try { + add(valueEntry.name(), object, addType); + } catch (Exception ex) { + throw new SerializationException("Error reading " + ClassReflection.getSimpleName(type) + ": " + + valueEntry.name(), ex); + } + } + } + }); + + json.setSerializer(BitmapFont.class, new ReadOnlySerializer() { + public BitmapFont read (Json json, JsonValue jsonData, Class type) { + String path = json.readValue("file", String.class, jsonData); + int scaledSize = json.readValue("scaledSize", int.class, -1, jsonData); + Boolean flip = json.readValue("flip", Boolean.class, false, jsonData); + + FileHandle fontFile = skinFile.parent().child(path); + if (!fontFile.exists()) fontFile = Gdx.files.internal(path); + if (!fontFile.exists()) throw new SerializationException("Font file not found: " + fontFile); + + // Use a region with the same name as the font, else use a PNG file in the same directory as the FNT file. + String regionName = fontFile.nameWithoutExtension(); + fontFiles.add(regionName); + try { + BitmapFont font; + TextureRegion region = skin.optional(regionName, TextureRegion.class); + if (region != null) + font = new BitmapFont(fontFile, region, flip); + else { + FileHandle imageFile = fontFile.parent().child(regionName + ".png"); + if (imageFile.exists()){ + Texture texture = new Texture(imageFile, true); + texture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear); + font = new BitmapFont(fontFile, new TextureRegion(texture), flip); + } + else + font = new BitmapFont(fontFile, flip); + } + // Scaled size is the desired cap height to scale the font to. + if (scaledSize != -1) font.getData().setScale(scaledSize / font.getCapHeight()); + return font; + } catch (RuntimeException ex) { + throw new SerializationException("Error loading bitmap font: " + fontFile, ex); + } + } + }); + + json.setSerializer(Color.class, new ReadOnlySerializer() { + public Color read (Json json, JsonValue jsonData, Class type) { + if (jsonData.isString()) return get(jsonData.asString(), Color.class); + String hex = json.readValue("hex", String.class, (String)null, jsonData); + if (hex != null) return Color.valueOf(hex); + float r = json.readValue("r", float.class, 0f, jsonData); + float g = json.readValue("g", float.class, 0f, jsonData); + float b = json.readValue("b", float.class, 0f, jsonData); + float a = json.readValue("a", float.class, 1f, jsonData); + return new Color(r, g, b, a); + } + }); + + json.setSerializer(TintedDrawable.class, new ReadOnlySerializer() { + public Object read (Json json, JsonValue jsonData, Class type) { + String name = json.readValue("name", String.class, jsonData); + Color color = json.readValue("color", Color.class, jsonData); + return newDrawable(name, color); + } + }); + + return json; + } + + static private Method findMethod (Class type, String name) { + Method[] methods = ClassReflection.getMethods(type); + for (int i = 0, n = methods.length; i < n; i++) { + Method method = methods[i]; + if (method.getName().equals(name)) return method; + } + return null; + } + + /** @author Nathan Sweet */ + static public class TintedDrawable { + public String name; + public Color color; + } +} \ No newline at end of file diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/PolygonUtils.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/PolygonUtils.java new file mode 100644 index 00000000..95d38fff --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/PolygonUtils.java @@ -0,0 +1,215 @@ +package games.rednblack.editor.renderer.utils; + +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by CyberJoe on 7/4/2015. + */ +public class PolygonUtils { + + public static Array mergeTouchingPolygons(Vector2[][] polys) { + + Set uniqueEdges = new HashSet(); + Set duplicateEdges = new HashSet(); + + for(int i = 0; i < polys.length; i++) { + for(int j = 0; j < polys[i].length; j++) { + Edge edge = null; + if(j < polys[i].length - 1) { + edge = new Edge(polys[i][j].x, polys[i][j].y, polys[i][j+1].x, polys[i][j+1].y); + } else if(j == polys[i].length - 1) { + edge = new Edge(polys[i][j].x, polys[i][j].y, polys[i][0].x, polys[i][0].y); + } + if(uniqueEdges.contains(edge)) { + duplicateEdges.add(edge); + } else { + uniqueEdges.add(edge); + } + } + } + + uniqueEdges.removeAll(duplicateEdges); + + Array result = new Array(); + while(!uniqueEdges.isEmpty()) { + Vector2[] mesh = extractClosedLoop(uniqueEdges); + mesh = clearUnnecessaryVertices(mesh); + result.add(mesh); + } + + return result; + } + + public static Vector2[] mergeTouchingPolygonsToOne(Vector2[][] polys) { + Array result = mergeTouchingPolygons(polys); + + return result.get(0); + } + + public static Vector2[] clearUnnecessaryVertices(Vector2[] points) { + Array result = new Array(); + if(points.length < 3) return points; + for(int i = 0; i < points.length; i++) { + Vector2 currPoint = points[i]; + Vector2 prevPoint = points[points.length-1]; + Vector2 nextPoint = points[0]; + if (i > 0) prevPoint = points[i-1]; + if( i < points.length-1) nextPoint = points[i+1]; + if(Intersector.pointLineSide(prevPoint, nextPoint, currPoint) != 0) { + result.add(currPoint); + } + } + + return result.toArray(Vector2.class); + } + + public static Vector2[] extractClosedLoop(Set edges) { + ArrayList sortedList = new ArrayList(); + Edge edge = (Edge) edges.toArray()[0]; + edges.remove(edge); + sortedList.add(edge); + while(!edges.isEmpty()) { + boolean result2 = false; + boolean result1 = appendNextEdge(sortedList, edges); + if(!edges.isEmpty()) { + result2 = appendPrevEdge(sortedList, edges); + } + if(!result1 && !result2) { + break; + } + } + + Vector2[] result = new Vector2[sortedList.size()]; + int iterator = 0; + for(Edge tmp: sortedList) { + result[iterator++] = tmp.start; + } + + return result; + } + + public static boolean appendNextEdge(ArrayList sortedList, Set edges) { + Edge lastEdge = sortedList.get(sortedList.size()-1); + Vector2 point = lastEdge.end; + for(Edge edge: edges) { + if(edge.linkedTo(point)) { + if(edge.end.equals(lastEdge.end)) { + edge.reverse(); + } + edges.remove(edge); + sortedList.add(edge); + return true; + } + } + + return false; + } + + public static boolean appendPrevEdge(ArrayList sortedList, Set edges) { + Edge prevEdge = sortedList.get(0); + Vector2 point = prevEdge.start; + for(Edge edge: edges) { + if(edge.linkedTo(point)) { + if(edge.start.equals(prevEdge.start)) { + edge.reverse(); + } + edges.remove(edge); + sortedList.add(0, edge); + return true; + } + } + + return false; + } + + @Deprecated + public static Vector2[] extractClosedLoopOld(Set edges) { + ArrayList sortedList = new ArrayList(); + Edge nextEdge = (Edge) edges.toArray()[0]; + sortedList.add(nextEdge); + sortedList = recursivelySortChainPoints(edges, nextEdge, sortedList); + edges.removeAll(sortedList); + + Vector2[] result = new Vector2[sortedList.size()]; + int iterator = 0; + for(Edge edge: sortedList) { + result[iterator++] = edge.start; + } + + return result; + } + + @Deprecated + private static ArrayList recursivelySortChainPoints(Set edges, Edge edge, ArrayList sortedList) { + Edge nextEdge = findLink(edges, edge, edge.end); + if(!edge.end.equals(nextEdge.start)) nextEdge.reverse(); + sortedList.add(nextEdge); + if(sortedList.get(0).linkedTo(sortedList.get(sortedList.size() - 1)) && sortedList.size() >= 3) { + //loop is closed + return sortedList; + } + return recursivelySortChainPoints(edges, nextEdge, sortedList); + } + + public static Edge findLink(Set edges, Edge edge, Vector2 point) { + for(Edge linkedEdge: edges) { + if(!linkedEdge.equals(edge) && linkedEdge.linkedTo(point)) { + return linkedEdge; + } + } + + return null; + } + + public static class Edge { + public Vector2 start; + public Vector2 end; + + public Edge(float startX, float startY, float endX, float endY) { + start = new Vector2(startX, startY); + end = new Vector2(endX, endY); + } + + public Edge(Vector2 start, Vector2 end) { + this.start = start; + this.end = end; + } + + public boolean linkedTo(Vector2 point) { + if(start.equals(point) || end.equals(point)) return true; + return false; + } + + public boolean linkedTo(Edge edge) { + if(!this.equals(edge) && (start.equals(edge.end) || end.equals(edge.start) || end.equals(edge.end) || start.equals(edge.start))) return true; + return false; + } + + public void reverse() { + Vector2 tmp = new Vector2(start); + start = end; + end = tmp; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Edge other = (Edge)obj; + return hashCode() == other.hashCode(); + } + + @Override + public int hashCode () { + return start.hashCode() + end.hashCode(); + } + } + +} diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/TransformMathUtils.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/TransformMathUtils.java new file mode 100644 index 00000000..7965d51b --- /dev/null +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/utils/TransformMathUtils.java @@ -0,0 +1,148 @@ +package games.rednblack.editor.renderer.utils; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Camera; +import com.badlogic.gdx.math.*; +import games.rednblack.editor.renderer.components.ParentNodeComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ViewPortComponent; + +public class TransformMathUtils { + + private static final Matrix3 tmpMat = new Matrix3(); + + /** Transforms the specified point in the scene's coordinates to the entity's local coordinate system. */ + public static Vector2 sceneToLocalCoordinates (Entity entity, Vector2 sceneCoords) { + ParentNodeComponent parentNodeComponent = entity.getComponent(ParentNodeComponent.class); + Entity parentEntity = null; + if(parentNodeComponent != null){ + parentEntity = parentNodeComponent.parentEntity; + } + if (parentEntity != null) sceneToLocalCoordinates(parentEntity, sceneCoords); + parentToLocalCoordinates(entity, sceneCoords); + return sceneCoords; + } + + public static Vector2 globalToLocalCoordinates (Entity entity, Vector2 sceneCoords) { + ParentNodeComponent parentNodeComponent = entity.getComponent(ParentNodeComponent.class); + Entity parentEntity = null; + if(parentNodeComponent != null){ + ViewPortComponent viewPortComponent = ComponentRetriever.get(parentNodeComponent.parentEntity, ViewPortComponent.class); + if(viewPortComponent == null) { + parentEntity = parentNodeComponent.parentEntity; + } else { + Vector3 worldCoordinates = viewPortComponent.viewPort.getCamera().unproject(new Vector3(sceneCoords.x, sceneCoords.y,0)); + sceneCoords.x = worldCoordinates.x; + sceneCoords.y = worldCoordinates.y; + } + } + if (parentEntity != null) { + globalToLocalCoordinates(parentEntity, sceneCoords); + } + parentToLocalCoordinates(entity, sceneCoords); + return sceneCoords; + } + + + /** Converts the coordinates given in the parent's coordinate system to this entity's coordinate system. */ + public static Vector2 parentToLocalCoordinates (Entity childEntity, Vector2 parentCoords) { + TransformComponent transform = childEntity.getComponent(TransformComponent.class); + + final float rotation = transform.rotation; + final float scaleX = transform.scaleX; + final float scaleY = transform.scaleY; + final float childX = transform.x; + final float childY = transform.y; + if (rotation == 0) { + if (scaleX == 1 && scaleY == 1) { + parentCoords.x -= childX; + parentCoords.y -= childY; + } else { + //TODO origin + final float originX = 0; + final float originY = 0; + parentCoords.x = (parentCoords.x - childX - originX) / scaleX + originX; + parentCoords.y = (parentCoords.y - childY - originY) / scaleY + originY; + } + } else { + final float cos = (float)Math.cos(rotation * MathUtils.degreesToRadians); + final float sin = (float)Math.sin(rotation * MathUtils.degreesToRadians); + //TODO origin + final float originX = 0; + final float originY = 0; + final float tox = parentCoords.x - childX - originX; + final float toy = parentCoords.y - childY - originY; + parentCoords.x = (tox * cos + toy * sin) / scaleX + originX; + parentCoords.y = (tox * -sin + toy * cos) / scaleY + originY; + } + return parentCoords; + } + + /** Transforms the specified point in the entity's coordinates to be in the scene's coordinates.*/ + public static Vector2 localToSceneCoordinates (Entity entity, Vector2 localCoords) { + return localToAscendantCoordinates(null, entity, localCoords); + } + + /** Converts coordinates for this entity to those of a parent entity. The ascendant does not need to be a direct parent. */ + public static Vector2 localToAscendantCoordinates (Entity ascendant, Entity entity, Vector2 localCoords) { + while (entity != null) { + localToParentCoordinates(entity, localCoords); + ParentNodeComponent parentNode = entity.getComponent(ParentNodeComponent.class); + if(parentNode == null){ + break; + } + entity = parentNode.parentEntity; + if (entity == ascendant) break; + } + return localCoords; + } + + /** Transforms the specified point in the actor's coordinates to be in the parent's coordinates. */ + public static Vector2 localToParentCoordinates (Entity entity, Vector2 localCoords) { + TransformComponent transform = entity.getComponent(TransformComponent.class); + + final float rotation = -transform.rotation; + final float scaleX = transform.scaleX; + final float scaleY = transform.scaleY; + final float x = transform.x; + final float y = transform.y; + if (rotation == 0) { + if (scaleX == 1 && scaleY == 1) { + localCoords.x += x; + localCoords.y += y; + } else { + final float originX = transform.originX; + final float originY = transform.originY; + localCoords.x = (localCoords.x - originX) * scaleX + originX + x; + localCoords.y = (localCoords.y - originY) * scaleY + originY + y; + } + } else { + final float cos = (float)Math.cos(rotation * MathUtils.degreesToRadians); + final float sin = (float)Math.sin(rotation * MathUtils.degreesToRadians); + final float originX = transform.originX; + final float originY = transform.originY; + final float tox = (localCoords.x - originX) * scaleX; + final float toy = (localCoords.y - originY) * scaleY; + localCoords.x = (tox * cos + toy * sin) + originX + x; + localCoords.y = (tox * -sin + toy * cos) + originY + y; + } + return localCoords; + } + + public static Matrix3 transform(TransformComponent transformComponent) { + float translationX = transformComponent.x + transformComponent.originX; + float translationY = transformComponent.y + transformComponent.originY; + float scaleX = transformComponent.scaleX; + float scaleY = transformComponent.scaleY; + float angle = transformComponent.rotation; + tmpMat.idt(); + return tmpMat + .translate(translationX, translationY) + .rotate(angle) + .scale(scaleX, scaleY) + .translate(-translationX, -translationY); + + } + +} diff --git a/plugin-9patch/build.gradle b/plugin-9patch/build.gradle new file mode 100644 index 00000000..6ab5e692 --- /dev/null +++ b/plugin-9patch/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +ext { + gdxVersion = '1.9.10' + box2DLightsVersion = '1.5' + ashleyVersion = '1.7.3' + visUIVersion = '1.4.4' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + implementation "com.kotcrab.vis:vis-ui:$visUIVersion" + + implementation 'net.mountainblade:modular:1.0' + + implementation project(":hyperlap2d-common-api") + implementation project(":hyperlap2d-runtime-libgdx") + + testCompile group: 'junit', name: 'junit', version: '4.12' +} + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) +} \ No newline at end of file diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/EditingZone.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/EditingZone.java new file mode 100644 index 00000000..40d008c3 --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/EditingZone.java @@ -0,0 +1,265 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Circle; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.utils.ScissorStack; + +/** + * Created by azakhary on 8/18/2015. + */ +public class EditingZone extends Actor { + + private ShapeRenderer shapeRenderer; + private TextureRegion texture; + + private static final Color BG = new Color(43f / 255f, 43f / 255f, 43f / 255f, 1f); + private static final Color GUIDE_COLOR = new Color(255f/255f, 94f/255f, 0f/255f, 0.5f); + private static final Color OVER_GUIDE_COLOR = new Color(255f/255f, 173f/255f, 125f/255f, 1f); + + private float currZoom = 1f; + private Vector2 shift = new Vector2(0, 0); + + private int mouseOverSplit = -1; + + private float[] splitPositions = new float[4]; + private int[] splits = new int[4]; + + public interface PatchChangeListener { + public void changed(int[] splits); + } + + private PatchChangeListener listener; + + public EditingZone() { + shapeRenderer = new ShapeRenderer(); + + addListener(new InputListener() { + private Vector2 lastPoint; + private int selectedSplit = -1; + + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + selectedSplit = splitCollision(x, y); + if(selectedSplit >= 0) { + + } else { + lastPoint = new Vector2(x, y); + } + return true; + } + + public void touchDragged(InputEvent event, float x, float y, int pointer) { + if (selectedSplit >= 0) { + if(selectedSplit == 0) { //left + splits[0] = (int) ((x-shift.x-getWidth()/2f)/currZoom+texture.getRegionWidth()/2f); + if(splits[0] > texture.getRegionWidth()-splits[1]) { + int tmp = splits[1]; splits[1] = texture.getRegionWidth()-splits[0]; splits[0] = texture.getRegionWidth() - tmp; + selectedSplit = 1; + mouseOverSplit = selectedSplit; + } + splitUpdate(); + return; + } + if(selectedSplit == 1) { + splits[1] = -(int) ((x-shift.x-getWidth()/2f)/currZoom-texture.getRegionWidth()/2f); + if(texture.getRegionWidth()-splits[1] < splits[0]) { + int tmp = splits[0]; splits[0] = texture.getRegionWidth() - splits[1]; splits[1] = texture.getRegionWidth() - tmp; + selectedSplit = 0; + mouseOverSplit = selectedSplit; + } + splitUpdate(); + return; + } + if(selectedSplit == 2) { // top + splits[2] = -(int) ((y-shift.y-getHeight()/2f)/currZoom-texture.getRegionHeight()/2f); + if(texture.getRegionHeight()-splits[2] < splits[3]) { + int tmp = splits[2]; splits[2] = texture.getRegionHeight()-splits[3]; splits[3] = texture.getRegionHeight()-tmp; + selectedSplit = 3; + mouseOverSplit = selectedSplit; + } + splitUpdate(); + return; + } + if(selectedSplit == 3) { + splits[3] = (int) ((y-shift.y-getHeight()/2f)/currZoom+texture.getRegionHeight()/2f); + if(splits[3] > texture.getRegionHeight()-splits[2]) { + int tmp = splits[3]; splits[3] = texture.getRegionHeight()-splits[2]; splits[2] = texture.getRegionHeight()-tmp; + selectedSplit = 2; + mouseOverSplit = selectedSplit; + } + splitUpdate(); + return; + } + } else { + Vector2 diff = new Vector2(x - lastPoint.x, y - lastPoint.y); + shiftBy(diff); + lastPoint = new Vector2(x, y); + } + } + + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + selectedSplit = -1; + + if(listener != null) { + listener.changed(splits.clone()); + } + } + + public boolean mouseMoved(InputEvent event, float x, float y) { + mouseOverSplit = splitCollision(x, y); + return false; + } + }); + } + + public void setListener(PatchChangeListener listener) { + this.listener = listener; + } + + public void splitUpdate() { + if(splits[0] < 0) splits[0] = 0; + if(splits[1] < 0) splits[1] = 0; + if(splits[2] < 0) splits[2] = 0; + if(splits[3] < 0) splits[3] = 0; + } + + public int[] getSplits() { + return splits.clone(); + } + + public void setTexture(TextureRegion texture) { + this.texture = texture; + + splits[0] = ((TextureAtlas.AtlasRegion)texture).splits[0]; + splits[1] = ((TextureAtlas.AtlasRegion)texture).splits[1]; + splits[2] = ((TextureAtlas.AtlasRegion)texture).splits[2]; + splits[3] = ((TextureAtlas.AtlasRegion)texture).splits[3]; + } + + @Override + public void draw (Batch batch, float parentAlpha) { + Rectangle scissors = new Rectangle(); + Rectangle clipBounds = new Rectangle(getX(),getY(),getWidth(),getHeight()); + ScissorStack.calculateScissors(getStage().getCamera(), batch.getTransformMatrix(), clipBounds, scissors); + ScissorStack.pushScissors(scissors); + + drawBg(batch, parentAlpha); + + batch.draw(texture, + getX() + getWidth() / 2 - texture.getRegionWidth() / 2 + shift.x, + getY() + getHeight() / 2 - texture.getRegionHeight() / 2 + shift.y, + texture.getRegionWidth() / 2f, + texture.getRegionHeight() / 2f, + texture.getRegionWidth(), texture.getRegionHeight(), + currZoom, currZoom, 0); + + drawSplits(batch, parentAlpha); + + batch.flush(); + ScissorStack.popScissors(); + } + + public void drawBg(Batch batch, float parentAlpha) { + batch.end(); + Gdx.gl.glLineWidth(1.0f); + Gdx.gl.glEnable(GL20.GL_BLEND); + Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + + shapeRenderer.setProjectionMatrix(getStage().getCamera().combined); + Matrix4 matrix = batch.getTransformMatrix(); + shapeRenderer.setTransformMatrix(matrix); + + shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); + BG.a = parentAlpha; + shapeRenderer.setColor(BG); + shapeRenderer.rect(getX(), getY(), getWidth(), getHeight()); + shapeRenderer.end(); + + Gdx.gl.glDisable(GL20.GL_BLEND); + batch.begin(); + batch.setColor(Color.WHITE.r, Color.WHITE.g, Color.WHITE.b, Color.WHITE.a * parentAlpha); + } + + public void drawSplits(Batch batch, float parentAlpha) { + batch.end(); + Gdx.gl.glLineWidth(1.0f); + Gdx.gl.glEnable(GL20.GL_BLEND); + Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + + shapeRenderer.setProjectionMatrix(getStage().getCamera().combined); + Matrix4 matrix = batch.getTransformMatrix(); + shapeRenderer.setTransformMatrix(matrix); + + shapeRenderer.begin(ShapeRenderer.ShapeType.Line); + + // left, right, top , bottom + Color guideColor = new Color(GUIDE_COLOR); + guideColor.a*=parentAlpha; + Color overColor = new Color(OVER_GUIDE_COLOR); + overColor.a*=parentAlpha; + + splitPositions[0] = shift.x + getWidth() / 2f + (-texture.getRegionWidth() / 2f + splits[0]) * currZoom; + splitPositions[1] = shift.x + getWidth() / 2f + (texture.getRegionWidth() / 2f - splits[1]) * currZoom; + splitPositions[2] = shift.y + getHeight()/2f + (texture.getRegionHeight()/2 - splits[2])*currZoom; + splitPositions[3] = shift.y + getHeight() / 2f + (-texture.getRegionHeight() / 2 + splits[3]) * currZoom; + + + if(mouseOverSplit == 0) shapeRenderer.setColor(overColor); else shapeRenderer.setColor(guideColor); + shapeRenderer.line(getX() + splitPositions[0], getY(), getX() + splitPositions[0], getY() + getHeight()); + + if(mouseOverSplit == 1) shapeRenderer.setColor(overColor); else shapeRenderer.setColor(guideColor); + shapeRenderer.line(getX() + splitPositions[1], getY(), getX() + splitPositions[1], getY() + getHeight()); + + if(mouseOverSplit == 2) shapeRenderer.setColor(overColor); else shapeRenderer.setColor(guideColor); + shapeRenderer.line(getX(), getY() + splitPositions[2], getX() + getWidth(), getY() + splitPositions[2]); + + if(mouseOverSplit == 3) shapeRenderer.setColor(overColor); else shapeRenderer.setColor(guideColor); + shapeRenderer.line(getX(), getY() + splitPositions[3], getX() + getWidth(), getY() + splitPositions[3]); + + shapeRenderer.end(); + Gdx.gl.glDisable(GL20.GL_BLEND); + batch.begin(); + batch.setColor(Color.WHITE.r, Color.WHITE.g, Color.WHITE.b, Color.WHITE.a * parentAlpha); + } + + public void zoomBy(int amount) { + float defaultSize = 1.0f - amount*0.12f; + currZoom*=defaultSize; + } + + public void shiftBy(Vector2 diff) { + shift.add(diff); + } + + public int splitCollision(float x, float y) { + Circle touchCircle = new Circle(); + touchCircle.radius = 5f; + touchCircle.setPosition(x, y); + + if(touchCircle.contains(splitPositions[0], touchCircle.y)) { + return 0; + } + if(touchCircle.contains(splitPositions[1], touchCircle.y)) { + return 1; + } + if(touchCircle.contains(touchCircle.x, splitPositions[2])) { + return 2; + } + if(touchCircle.contains(touchCircle.x, splitPositions[3])) { + return 3; + } + + return -1; + } +} \ No newline at end of file diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/ImageUtils.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/ImageUtils.java new file mode 100644 index 00000000..ecadb9b3 --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/ImageUtils.java @@ -0,0 +1,232 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.gdx.graphics.g2d.TextureAtlas; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +/** + * Created by various artists on 8/18/2015. + */ +public class ImageUtils { + private static final int NINEPATCH_PADDING = 1; + private static final String OUTPUT_TYPE = "png"; + + + /** Returns the pads, or null if the image had no pads or the pads match the splits. Pads are an int[4] that has left, right, + * top, bottom. */ + public int[] getPads (BufferedImage image, String name, int[] splits) { + WritableRaster raster = image.getRaster(); + + int bottom = raster.getHeight() - 1; + int right = raster.getWidth() - 1; + + int startX = getSplitPoint(raster, name, 1, bottom, true, true); + int startY = getSplitPoint(raster, name, right, 1, true, false); + + // No need to hunt for the end if a start was never found. + int endX = 0; + int endY = 0; + if (startX != 0) endX = getSplitPoint(raster, name, startX + 1, bottom, false, true); + if (startY != 0) endY = getSplitPoint(raster, name, right, startY + 1, false, false); + + // Ensure pixels after the end are not invalid. + getSplitPoint(raster, name, endX + 1, bottom, true, true); + getSplitPoint(raster, name, right, endY + 1, true, false); + + // No pads. + if (startX == 0 && endX == 0 && startY == 0 && endY == 0) { + return null; + } + + // -2 here is because the coordinates were computed before the 1px border was stripped. + if (startX == 0 && endX == 0) { + startX = -1; + endX = -1; + } else { + if (startX > 0) { + startX--; + endX = raster.getWidth() - 2 - (endX - 1); + } else { + // If no start point was ever found, we assume full stretch. + endX = raster.getWidth() - 2; + } + } + if (startY == 0 && endY == 0) { + startY = -1; + endY = -1; + } else { + if (startY > 0) { + startY--; + endY = raster.getHeight() - 2 - (endY - 1); + } else { + // If no start point was ever found, we assume full stretch. + endY = raster.getHeight() - 2; + } + } + + int[] pads = new int[] {startX, endX, startY, endY}; + + if (splits != null && Arrays.equals(pads, splits)) { + return null; + } + + return pads; + } + + /** Returns the splits, or null if the image had no splits or the splits were only a single region. Splits are an int[4] that + * has left, right, top, bottom. */ + public int[] getSplits (BufferedImage image, String name) { + WritableRaster raster = image.getRaster(); + + int startX = getSplitPoint(raster, name, 1, 0, true, true); + int endX = getSplitPoint(raster, name, startX, 0, false, true); + int startY = getSplitPoint(raster, name, 0, 1, true, false); + int endY = getSplitPoint(raster, name, 0, startY, false, false); + + // Ensure pixels after the end are not invalid. + getSplitPoint(raster, name, endX + 1, 0, true, true); + getSplitPoint(raster, name, 0, endY + 1, true, false); + + // No splits, or all splits. + if (startX == 0 && endX == 0 && startY == 0 && endY == 0) return null; + + // Subtraction here is because the coordinates were computed before the 1px border was stripped. + if (startX != 0) { + startX--; + endX = raster.getWidth() - 2 - (endX - 1); + } else { + // If no start point was ever found, we assume full stretch. + endX = raster.getWidth() - 2; + } + if (startY != 0) { + startY--; + endY = raster.getHeight() - 2 - (endY - 1); + } else { + // If no start point was ever found, we assume full stretch. + endY = raster.getHeight() - 2; + } + + return new int[] {startX, endX, startY, endY}; + } + + /** Hunts for the start or end of a sequence of split pixels. Begins searching at (startX, startY) then follows along the x or y + * axis (depending on value of xAxis) for the first non-transparent pixel if startPoint is true, or the first transparent pixel + * if startPoint is false. Returns 0 if none found, as 0 is considered an invalid split point being in the outer border which + * will be stripped. */ + static private int getSplitPoint (WritableRaster raster, String name, int startX, int startY, boolean startPoint, boolean xAxis) { + int[] rgba = new int[4]; + + int next = xAxis ? startX : startY; + int end = xAxis ? raster.getWidth() : raster.getHeight(); + int breakA = startPoint ? 255 : 0; + + int x = startX; + int y = startY; + while (next != end) { + if (xAxis) + x = next; + else + y = next; + + raster.getPixel(x, y, rgba); + if (rgba[3] == breakA) return next; + + if (!startPoint && (rgba[0] != 0 || rgba[1] != 0 || rgba[2] != 0 || rgba[3] != 255)) { + // error + } + + next++; + } + + return 0; + } + + public BufferedImage extractImage(TextureAtlas.TextureAtlasData atlas, String regionName, int[] splits) { + for (TextureAtlas.TextureAtlasData.Region region : atlas.getRegions()) { + if(region.name.equals(regionName)) { + TextureAtlas.TextureAtlasData.Page page = region.page; + BufferedImage img = null; + try { + img = ImageIO.read(page.textureFile.file()); + } catch (IOException e) { + + } + region.splits = splits; + return extractNinePatch(img, region); + } + } + return null; + } + + private BufferedImage extractImage (BufferedImage page, TextureAtlas.TextureAtlasData.Region region, int padding) { + BufferedImage splitImage = null; + + // get the needed part of the page and rotate if needed + if (region.rotate) { + BufferedImage srcImage = page.getSubimage(region.left, region.top, region.height, region.width); + splitImage = new BufferedImage(region.width, region.height, page.getType()); + + AffineTransform transform = new AffineTransform(); + transform.rotate(Math.toRadians(90.0)); + transform.translate(0, -region.width); + AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); + op.filter(srcImage, splitImage); + } else { + splitImage = page.getSubimage(region.left, region.top, region.width, region.height); + } + + // draw the image to a bigger one if padding is needed + if (padding > 0) { + BufferedImage paddedImage = new BufferedImage(splitImage.getWidth() + padding * 2, splitImage.getHeight() + padding * 2, + page.getType()); + Graphics2D g2 = paddedImage.createGraphics(); + g2.drawImage(splitImage, padding, padding, null); + g2.dispose(); + return paddedImage; + } else { + return splitImage; + } + } + + + private BufferedImage extractNinePatch (BufferedImage page, TextureAtlas.TextureAtlasData.Region region) { + BufferedImage splitImage = extractImage(page, region, NINEPATCH_PADDING); + Graphics2D g2 = splitImage.createGraphics(); + g2.setColor(Color.BLACK); + + // Draw the four lines to save the ninepatch's padding and splits + int startX = region.splits[0] + NINEPATCH_PADDING; + int endX = region.width - region.splits[1] + NINEPATCH_PADDING - 1; + int startY = region.splits[2] + NINEPATCH_PADDING; + int endY = region.height - region.splits[3] + NINEPATCH_PADDING - 1; + if (endX >= startX) g2.drawLine(startX, 0, endX, 0); + if (endY >= startY) g2.drawLine(0, startY, 0, endY); + if (region.pads != null) { + int padStartX = region.pads[0] + NINEPATCH_PADDING; + int padEndX = region.width - region.pads[1] + NINEPATCH_PADDING - 1; + int padStartY = region.pads[2] + NINEPATCH_PADDING; + int padEndY = region.height - region.pads[3] + NINEPATCH_PADDING - 1; + g2.drawLine(padStartX, splitImage.getHeight() - 1, padEndX, splitImage.getHeight() - 1); + g2.drawLine(splitImage.getWidth() - 1, padStartY, splitImage.getWidth() - 1, padEndY); + } + g2.dispose(); + + return splitImage; + } + + public void saveImage(BufferedImage image, String path) { + try { + ImageIO.write(image, OUTPUT_TYPE, new File(path)); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanel.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanel.java new file mode 100644 index 00000000..76c03b83 --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanel.java @@ -0,0 +1,113 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.kotcrab.vis.ui.widget.VisTextButton; +import com.puremvc.patterns.facade.SimpleFacade; +import games.rednblack.h2d.common.H2DDialog; + +/** + * Created by azakhary on 8/18/2015. + */ +public class MainPanel extends H2DDialog { + public static final String CLASS_NAME = "ames.rednblack.editor.plugin.ninepatch.MainPanel"; + + public static final String SAVE_CLICKED = CLASS_NAME + ".SAVE_CLICKED"; + + private SimpleFacade facade; + + private VisTable mainTable; + private TextureRegion texture; + + private VisTable editingTable; + private VisTable previewTable; + + private EditingZone editingZone; + private PreviewWidget previewWidget; + + public MainPanel() { + super("Nine Patch"); + addCloseButton(); + + facade = SimpleFacade.getInstance(); + + mainTable = new VisTable(); + add(mainTable).width(520).height(310).padBottom(7); + editingTable = new VisTable(); + previewTable = new VisTable(); + + mainTable.add(editingTable).width(310).expandY(); + mainTable.add(previewTable).expandX().expandY(); + mainTable.row(); + } + + private void initView() { + editingTable.clear(); + editingZone = new EditingZone(); + editingZone.setTexture(texture); + editingTable.add(editingZone); + + editingZone.setWidth(310); + editingZone.setHeight(310); + + editingZone.setListener(new EditingZone.PatchChangeListener() { + @Override + public void changed(int[] splits) { + previewWidget.update((TextureAtlas.AtlasRegion) texture, splits); + } + }); + } + + private void initPreView() { + previewTable.clear(); + previewWidget = new PreviewWidget(); + previewWidget.setHeight(205); + previewTable.add(previewWidget).width(200).height(205).top(); + previewTable.row(); + previewWidget.update((TextureAtlas.AtlasRegion) texture, ((TextureAtlas.AtlasRegion) texture).splits); + + VisLabel label = new VisLabel("Note: after saving, your \n scene will reload to \n apply changes."); + label.setAlignment(Align.center); + previewTable.add(label).pad(10).fillY().expandY(); + previewTable.row(); + + VisTextButton saveBtn = new VisTextButton("apply and save"); + previewTable.add(saveBtn).pad(5); + previewTable.row(); + + saveBtn.addListener(new ClickListener() { + public void clicked (InputEvent event, float x, float y) { + facade.sendNotification(SAVE_CLICKED); + } + }); + } + + public void setTexture(TextureRegion texture) { + this.texture = texture; + + initView(); + initPreView(); + } + + public void setListeners(Stage stage) { + stage.addListener(new InputListener() { + @Override + public boolean scrolled(InputEvent event, float x, float y, int amount) { + editingZone.zoomBy(amount); + return false; + } + }); + } + + public int[] getSplits() { + return editingZone.getSplits(); + } + +} \ No newline at end of file diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanelMediator.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanelMediator.java new file mode 100644 index 00000000..5d3edabc --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/MainPanelMediator.java @@ -0,0 +1,155 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.NinePatchComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +import java.awt.image.BufferedImage; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +/** + * Created by azakhary on 8/18/2015. + */ +public class MainPanelMediator extends SimpleMediator { + private static final String TAG = MainPanelMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + private NinePatchPlugin plugin; + + private ImageUtils imageUtils = new ImageUtils(); + + public MainPanelMediator(NinePatchPlugin plugin) { + super(NAME, new MainPanel()); + this.plugin = plugin; + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + NinePatchPlugin.EDIT_NINE_PATCH, + NinePatchPlugin.CONVERT_TO_NINE_PATCH, + MainPanel.SAVE_CLICKED + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + switch (notification.getName()) { + case NinePatchPlugin.EDIT_NINE_PATCH: + loadNinePatch(); + break; + case NinePatchPlugin.CONVERT_TO_NINE_PATCH: + convertImageToNinePatch(); + loadNinePatch(); + break; + case MainPanel.SAVE_CLICKED: + Entity entity = plugin.currEditingEntity; + NinePatchComponent ninePatchComponent = ComponentRetriever.get(entity, NinePatchComponent.class); + applyNewSplits(ninePatchComponent.textureRegionName, viewComponent.getSplits()); + viewComponent.hide(); + break; + } + } + + private void convertImageToNinePatch() { + Entity entity = plugin.currEditingEntity; + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.entityType = EntityFactory.NINE_PATCH; + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + String regionName = textureRegionComponent.regionName; + NinePatchComponent ninePatchComponent = new NinePatchComponent(); + ninePatchComponent.textureRegionName = regionName; + TextureAtlas.AtlasRegion newRegion = (TextureAtlas.AtlasRegion) textureRegionComponent.region; + int[] splits = {0, 0, 0, 0}; + newRegion.splits = splits; + ninePatchComponent.ninePatch = new NinePatch(textureRegionComponent.region, 0, 0, 0, 0); + entity.add(ninePatchComponent); + + //remove original image + File originalImg = new File(plugin.getAPI().getProjectPath() + "/assets/orig/images/"+regionName+".png"); + originalImg.delete(); + + //save project + plugin.getAPI().saveProject(); + + //save split data + addSplitsToImageInAtlas(regionName, splits); + applyNewSplits(regionName, splits); + } + + private void loadNinePatch() { + Entity entity = plugin.currEditingEntity; + NinePatchComponent ninePatchComponent = ComponentRetriever.get(entity, NinePatchComponent.class); + loadRegion(ninePatchComponent.textureRegionName); + viewComponent.show(plugin.getAPI().getUIStage()); + } + + private void addSplitsToImageInAtlas(String textureRegionName, int[] splits) { + FileHandle packAtlas = Gdx.files.internal(plugin.getAPI().getProjectPath() + "/assets/orig/pack/pack.atlas"); + String content = packAtlas.readString(); + int regionIndex = content.indexOf(textureRegionName); + int splitEnd = content.indexOf("orig: ", regionIndex); + String splitStr = "split: "+splits[0]+", "+splits[1]+", "+splits[2]+", "+splits[3]+"\n "; + String newContent = content.substring(0, splitEnd) + splitStr + content.substring(splitEnd, content.length()); + File test = new File(plugin.getAPI().getProjectPath() + "/assets/orig/pack/pack.atlas"); + writeFile(newContent, test); + } + + private void applyNewSplits(String textureRegionName, int[] splits) { + // first need to modify original image + FileHandle packAtlas = Gdx.files.internal(plugin.getAPI().getProjectPath() + "/assets/orig/pack/pack.atlas"); + FileHandle imagesDir = Gdx.files.internal(plugin.getAPI().getProjectPath() + "/assets/orig/pack/"); + TextureAtlas.TextureAtlasData atlas = new TextureAtlas.TextureAtlasData(packAtlas, imagesDir, false); + BufferedImage finalImage = imageUtils.extractImage(atlas, textureRegionName, splits); + imageUtils.saveImage(finalImage, plugin.getAPI().getProjectPath() + "/assets/orig/images/"+textureRegionName+".9.png"); + + // now need to modify the pack + String content = packAtlas.readString(); + int regionIndex = content.indexOf(textureRegionName); + int splitStart = content.indexOf("split: ", regionIndex) + "split: ".length(); + int splitEnd = content.indexOf("orig: ", splitStart); + String splitStr = splits[0]+", "+splits[1]+", "+splits[2]+", "+splits[3]+"\n "; + String newContent = content.substring(0, splitStart) + splitStr + content.substring(splitEnd, content.length()); + File test = new File(plugin.getAPI().getProjectPath() + "/assets/orig/pack/pack.atlas"); + writeFile(newContent, test); + + // reload + plugin.getAPI().reLoadProject(); + } + + private void writeFile(String content, File file) { + BufferedWriter output = null; + try { + output = new BufferedWriter(new FileWriter(file)); + output.write(content); + } catch ( IOException e ) { + e.printStackTrace(); + } finally { + if ( output != null ) try { + output.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void loadRegion(String name) { + TextureAtlas atlas = plugin.getAPI().getProjectTextureAtlas(); + viewComponent.setTexture(atlas.findRegion(name)); + + viewComponent.setListeners(plugin.getAPI().getUIStage()); + } +} diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java new file mode 100644 index 00000000..3e8dbca7 --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java @@ -0,0 +1,57 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.h2d.common.plugins.H2DPluginAdapter; +import net.mountainblade.modular.annotations.Implementation; + +import java.util.Set; + +/** + * Created by azakhary on 8/18/2015. + * Plugin to edit Nine Patch data on imported texture region + */ +@Implementation(authors = "azakhary", version = "0.0.1") +public class NinePatchPlugin extends H2DPluginAdapter { + public static final String CLASS_NAME = "games.rednblack.editor.plugin.ninepatch.NinePatchPlugin"; + + public static final String EDIT_NINE_PATCH = CLASS_NAME + ".EDIT_NINE_PATCH"; + public static final String CONVERT_TO_NINE_PATCH = CLASS_NAME + ".CONVERT_TO_NINE_PATCH"; + + private MainPanelMediator performancePanelMediator; + + public Entity currEditingEntity; + + public NinePatchPlugin() { + performancePanelMediator = new MainPanelMediator(this); + } + + @Override + public void initPlugin() { + facade.registerMediator(performancePanelMediator); + pluginAPI.setDropDownItemName(EDIT_NINE_PATCH, "Edit NinePatch"); + pluginAPI.setDropDownItemName(CONVERT_TO_NINE_PATCH, "Convert to NinePatch"); + } + + @Override + public void onDropDownOpen(Set selectedEntities, Array actionsSet) { + if(selectedEntities.size() == 1) { + Entity entity = selectedEntities.stream().findFirst().get(); + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + + if(mainItemComponent.entityType == EntityFactory.NINE_PATCH) { + // it's our guy + currEditingEntity = entity; + actionsSet.add(EDIT_NINE_PATCH); + } + if(mainItemComponent.entityType == EntityFactory.IMAGE_TYPE) { + // it's our guy + currEditingEntity = entity; + actionsSet.add(CONVERT_TO_NINE_PATCH); + } + } + } +} diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/PreviewWidget.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/PreviewWidget.java new file mode 100644 index 00000000..d0aeacec --- /dev/null +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/PreviewWidget.java @@ -0,0 +1,79 @@ +package games.rednblack.editor.plugin.ninepatch; + +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.Group; +import com.badlogic.gdx.scenes.scene2d.ui.Image; + +/** + * Created by azakhary on 8/19/2015. + */ +public class PreviewWidget extends Group { + + private TextureAtlas.AtlasRegion region; + + float horizontalHeight, horizontalWidth; + float verticalHeight, verticalWidth; + float squareWidth, squareHeight; + + private Image horizontal, vertical, square; + + public PreviewWidget() { + horizontalWidth = 200f; + horizontalHeight = 50f; + + verticalWidth = 50f; + verticalHeight = 150f; + + squareWidth = 145f; + squareHeight = 150f; + } + + public void update(TextureAtlas.AtlasRegion region, int[] splits) { + this.region = region; + clear(); + NinePatch horizontalPatch = new NinePatch(region, splits[0], splits[1], splits[2], splits[3]); + NinePatch verticalPatch = new NinePatch(region, splits[0], splits[1], splits[2], splits[3]); + NinePatch squarePatch = new NinePatch(region, splits[0], splits[1], splits[2], splits[3]); + + float minSclH = getMinScale(horizontalPatch, horizontalWidth, horizontalHeight); + float minSclV = getMinScale(verticalPatch, verticalWidth, verticalHeight); + float minSclS = getMinScale(squarePatch, squareWidth, squareHeight); + + float minScl = Math.min(minSclH, minSclV); + minScl = Math.min(minScl, minSclS); + + horizontal = fitNinePatch(horizontalPatch, horizontalWidth, horizontalHeight, minScl); + addActor(horizontal); + + vertical = fitNinePatch(verticalPatch, verticalWidth, verticalHeight, minScl); + addActor(vertical); + + square = fitNinePatch(squarePatch, squareWidth, squareHeight, minScl); + addActor(square); + + horizontal.setY(getHeight() - horizontalHeight); + vertical.setY(horizontal.getY() - verticalHeight - 5); + square.setX(verticalWidth + 5); + square.setY(vertical.getY()); + } + + private float getMinScale(NinePatch horizontalPatch, float width, float height) { + float scaleX = width/horizontalPatch.getTotalWidth(); + float scaleY = height/horizontalPatch.getTotalHeight(); + float scl = Math.min(scaleX, scaleY); + if(scl > 1f) scl = 1f; + + return scl; + } + + private Image fitNinePatch(NinePatch horizontalPatch, float width, float height, float scl) { + horizontalPatch.scale(scl, scl); + + Image img = new Image(horizontalPatch); + img.setScaleX(width / horizontalPatch.getTotalWidth()); + img.setScaleY(height / horizontalPatch.getTotalHeight()); + + return img; + } +} diff --git a/plugin-performance/build.gradle b/plugin-performance/build.gradle new file mode 100644 index 00000000..c00e8e0c --- /dev/null +++ b/plugin-performance/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +repositories { + mavenCentral() +} + +ext { + gdxVersion = '1.9.10' + box2DLightsVersion = '1.5' + ashleyVersion = '1.7.3' + visUIVersion = '1.4.4' +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + implementation "com.kotcrab.vis:vis-ui:$visUIVersion" + + implementation 'net.mountainblade:modular:1.0' + + implementation project(":hyperlap2d-common-api") + implementation project(":hyperlap2d-runtime-libgdx") + + testCompile group: 'junit', name: 'junit', version: '4.12' +} + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) +} \ No newline at end of file diff --git a/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanel.java b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanel.java new file mode 100644 index 00000000..d46df27e --- /dev/null +++ b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanel.java @@ -0,0 +1,67 @@ +package games.rednblack.editor.plugin.performance; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.gdx.Gdx; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.puremvc.patterns.facade.SimpleFacade; +import games.rednblack.h2d.common.UIDraggablePanel; + +public class PerformancePanel extends UIDraggablePanel { + + private SimpleFacade facade; + + private VisTable mainTable; + + private VisLabel entitiesCount; + private VisLabel fpsLbl; + + private Engine engine; + + public PerformancePanel() { + super("Performance"); + addCloseButton(); + + facade = SimpleFacade.getInstance(); + + mainTable = new VisTable(); + + add(mainTable).width(222); + } + + public void initView() { + mainTable.clear(); + + entitiesCount = new VisLabel(); + fpsLbl = new VisLabel(); + + + mainTable.add(new VisLabel("Entity count: ")).right(); + mainTable.add(entitiesCount).left().padLeft(4); + mainTable.row(); + + mainTable.add(new VisLabel("FPS: ")).right(); + mainTable.add(fpsLbl).left().padLeft(4); + mainTable.row(); + pack(); + } + + public void initLockView() { + mainTable.clear(); + + mainTable.add(new VisLabel("no scenes open")).right(); + } + + @Override + public void act(float delta) { + super.act(delta); + if(entitiesCount != null && fpsLbl != null) { + entitiesCount.setText(engine.getEntities().size() + ""); + fpsLbl.setText(Gdx.graphics.getFramesPerSecond() + ""); + } + } + + public void setEngine(Engine engine) { + this.engine = engine; + } +} \ No newline at end of file diff --git a/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanelMediator.java b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanelMediator.java new file mode 100644 index 00000000..4f29931c --- /dev/null +++ b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePanelMediator.java @@ -0,0 +1,48 @@ +package games.rednblack.editor.plugin.performance; + +import com.badlogic.ashley.core.Engine; +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; + +public class PerformancePanelMediator extends SimpleMediator { + private static final String TAG = PerformancePanelMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + public static final String SCENE_LOADED = "games.rednblack.editor.proxy.SceneDataManager.SCENE_LOADED"; + public static final String NEW_ITEM_ADDED = "games.rednblack.editor.factory.ItemFactory.NEW_ITEM_ADDED"; + public static final String ACTION_DELETE = "games.rednblack.editor.controller.commands.DeleteItemsCommandDONE"; + + private PerformancePlugin performancePlugin; + + public PerformancePanelMediator(PerformancePlugin performancePlugin) { + super(NAME, new PerformancePanel()); + this.performancePlugin = performancePlugin; + + viewComponent.initLockView(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + SCENE_LOADED, + NEW_ITEM_ADDED, + ACTION_DELETE, + PerformancePlugin.PANEL_OPEN + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + switch (notification.getName()) { + case SCENE_LOADED: + viewComponent.initView(); + Engine engine = performancePlugin.getAPI().getEngine(); + viewComponent.setEngine(engine); + break; + case PerformancePlugin.PANEL_OPEN: + viewComponent.show(performancePlugin.getAPI().getUIStage()); + break; + } + } +} diff --git a/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java new file mode 100644 index 00000000..a73561c6 --- /dev/null +++ b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java @@ -0,0 +1,24 @@ +package games.rednblack.editor.plugin.performance; + +import games.rednblack.h2d.common.plugins.H2DPluginAdapter; +import net.mountainblade.modular.annotations.Implementation; + +@Implementation(authors = "azakhary", version = "0.0.1") +public class PerformancePlugin extends H2DPluginAdapter { + public static final String CLASS_NAME = "games.rednblack.editor.plugin.performance"; + + public static final String PANEL_OPEN = CLASS_NAME + ".PANEL_OPEN"; + public static final String WINDOWS_MENU = "games.rednblack.editor.view.HyperLap2DMenuBar.WINDOW_MENU"; + + private PerformancePanelMediator performancePanelMediator; + + public PerformancePlugin() { + performancePanelMediator = new PerformancePanelMediator(this); + } + + @Override + public void initPlugin() { + facade.registerMediator(performancePanelMediator); + pluginAPI.addMenuItem(WINDOWS_MENU, "Performance", PANEL_OPEN); + } +} diff --git a/plugin-tiled/assets/pack/tiled.atlas b/plugin-tiled/assets/pack/tiled.atlas new file mode 100644 index 00000000..ef9579e6 --- /dev/null +++ b/plugin-tiled/assets/pack/tiled.atlas @@ -0,0 +1,88 @@ + +tiled.png +size: 512,128 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +image-Box-active + rotate: false + xy: 87, 22 + size: 4, 4 + split: 1, 1, 1, 1 + orig: 4, 4 + offset: 0, 0 + index: -1 +image-Box-inactive + rotate: false + xy: 436, 31 + size: 4, 4 + split: 1, 1, 1, 1 + orig: 4, 4 + offset: 0, 0 + index: -1 +plugin-tab-active + rotate: false + xy: 436, 105 + size: 73, 21 + split: 4, 4, 3, 0 + orig: 73, 21 + offset: 0, 0 + index: -1 +plugin-tab-inactive + rotate: false + xy: 2, 5 + size: 83, 21 + split: 3, 3, 2, 1 + orig: 83, 21 + offset: 0, 0 + index: -1 +tab-back-line + rotate: false + xy: 2, 2 + size: 2, 1 + split: 0, 0, 0, 0 + orig: 2, 1 + offset: 0, 0 + index: -1 +tile + rotate: false + xy: 436, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tile-eraser + rotate: false + xy: 436, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tiles-drop-here-normal + rotate: false + xy: 2, 28 + size: 215, 98 + orig: 215, 98 + offset: 0, 0 + index: -1 +tiles-drop-here-over + rotate: false + xy: 219, 28 + size: 215, 98 + orig: 215, 98 + offset: 0, 0 + index: -1 +tool-tilebrush + rotate: false + xy: 470, 80 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 +tool-tileeraser + rotate: false + xy: 470, 55 + size: 22, 23 + orig: 22, 23 + offset: 0, 0 + index: -1 diff --git a/plugin-tiled/assets/pack/tiled.png b/plugin-tiled/assets/pack/tiled.png new file mode 100644 index 0000000000000000000000000000000000000000..38cdf5ef45e757e348db55fdd56fdf78ea51b864 GIT binary patch literal 4744 zcmcInc|278_doYGQ-jhFBHP$1k0lbaUt4ApDlLleq>b>1NFg^#(n1u9B8dvgZtPDg zMA-^WmKHsft?bK~`Q7pT{;^!ICE%3h#Ba#{RsjHEJBEeno

fz0hk?d!=gzSRYO>6j$(t&RQvFb#<+|pssA= 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 literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/image-Box-active.9.png b/plugin-tiled/assets/textures/image-Box-active.9.png new file mode 100644 index 0000000000000000000000000000000000000000..798a4e5f566c74ab82e3ae99b637ac3409ec230b GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XLLJzX3_DsCkwI5hkZ=wUd&IpUvk t@(wS7<0nsY_AC_o|IzD#3D@eU44nm9e-nL$tbtk>JYD@<);T3K0RZ!k9@+o^ literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/image-Box-inactive.9.png b/plugin-tiled/assets/textures/image-Box-inactive.9.png new file mode 100644 index 0000000000000000000000000000000000000000..199d9812293407e9ddb1645d800e9d2d2b794506 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJVJY5_^DsCkwI5hkZ=wYb-{_byo u&qFQ8IhQU48MJx*Ij-G!S!2yKW`^J>^Pg{*rI-TsFnGH9xvXXsU}Ys$B>F!Z*OiCY*657O}utl zH$#&98b{CKWEaOhpH*&E|9k(=RCB+Q>!UfcOZ7FEo>AKLWX@E%w{n*ow(?(>SllLX zrTYKxu=XiI%$qkf7#&!3y4K!Qr{P%K1`(YN2bj1q2)p*udvgwM+-P;gTe~DWM4fSt&>w literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/plugin-tab-inactive.9.png b/plugin-tiled/assets/textures/plugin-tab-inactive.9.png new file mode 100644 index 0000000000000000000000000000000000000000..25b6f1c4e75dcb27e6e62c7483db79862de1b835 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^p+GFo!3HF&QkiXmRIaCsV@SoVw>J&B8Wbej64x)w zyEt{PpW}3c<0qt!EO`3!;oLiN1;3nLtk2r<{IunI&82%oO~W?dPU`V)za_`-P`u&$ zd$|K=%D=X7iE4#7wsM6AEOZhLSrNbr;{N3|of5Qa-^*O)Eq#9LR;ov=_!%Sofng)i OVg^rFKbLh*2~7YJoIqCq literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/tab-back-line.9.png b/plugin-tiled/assets/textures/tab-back-line.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b00578769b509c44fd9eb6d91a3f9e3fa9698022 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c6!3HF^d|7u4NJ)6QIEGZ*N=|5K_#eRY@Xg)b f;yr;Zi82gE>v+;b_ihjXs$uYS^>bP0l+XkK6yX-C literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/tile-eraser.png b/plugin-tiled/assets/textures/tile-eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..fa55300fcc73a6c584878b85a82319c6c5bbc11b GIT binary patch literal 1141 zcmaJ>TWAzl7@nAzgwUwP(%L@6<0zuVotd+j?9Py>?9S}!KsSbQB`X?mGIKVWCNpO; zbK+jmHY%-Yo)k(zP$-CCskZpmOF&VfRqTVd55wBxPxuD7}vhUwO}t2$jl_;$9_Z&0hPiiIfc=F=-1ABcM6P z2-1;ZRVS{YK89)CXcvm4n15F?vBMc5hO0OpWiw3Q){1ACV~BuZG-A6l`}emOSzuc- zJDA7|c~3#3_V${OcGmg}W^K$AEq3cWpsylP2M!_zs5s+pAXQ|x?pLDw(9E--4k2SQ z`&?8pKL8Z$Baq;FBPN6pBt;G;Qn6@a3y2CZ!3!b}g@^zpC`eHOG#-{l^R1GktGPxj zdXm{uLOhA*%jGgxj&ax@;h`vsyb$H1(FjFEf~rf5O2iG;H$A8*Fn!x2Hg-Yi(HO>) zL}sbd=P5W|KELSL4H|`_CF3iG$3srw9Vg7Ijt+>9UdUJy9Tch_;&l|@N#CUXD6Maj zY3*JfCVvA2#}HNvXM&;6p?u1@pgw8WCb+4$-#>fXXq(@sx4qW#_42v4 ZHO%E|ZTi(C9sh@E6)SpFM1~bb#q91RrtL0GCD~0h(ycW{8U)4d?zCBw-P!I=O&Soz zleHjt@P#7c!3U@n>I*%nD2SpSy!blUi&RAvLGY%|rcLX?xG*~pzVG`V^UZK~*T&|i zrA+{U=JX~t!)6$ad2`s`uT*}pX$ei{=r+s)?Gb;Jme|;^A$T zuB=fh7?R0t=z#5InF-jK>ac7V9bYcTxT>zq*1@sB!779nV%%g>IjtKi#KSPkw}cFY z5Nwrr6m5%yqw8Q;L{UMM1SEz;BqLD{i*V}WSTxVtc7FP~zu_3l*i>HMqLRa!gY4*Hk&0CZ`>r>W+caYK&tlyk(hkOQbcjJ|0n&WJ?sG zWHg>ct%+1LnGzKdAvIa!s>B$yu|sQIbB3$d-_|K7Gr5Oo-M!qa_m9# zez+icX@GlCyx)2H#Bg)lSmvlIsMoh&JMN*}^L?Rv0G>OtY-I8Brn8_4F1(iMcq-i* z{rq+ImfzCE`7Ahf;nTCn+s9Mm3mZ}myEhLXJ^Ay@^-e{*J@V_->?^OOi3Ir2)^TTl zA$*q3deewf$13ym!*eg+80~!sHm}+FeOK|&{CCCo2lq8xJkYapf`52n@A%q+v+~iq jML%|21uX1Ka0)bn{MOjbhLMlq;8~}WUFy}u?gM`S!U|-y literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/tiles-drop-here-normal.png b/plugin-tiled/assets/textures/tiles-drop-here-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..88dcf425f3f62c7a16245a60736364dc0573dc05 GIT binary patch literal 1682 zcmV;D25tF?P)4S7n z3K9dTXh)BubD1(}Nl*G-r>Exvj1XLaktcGKucC<>fRgCB03!q!U}R_06#zPDAklLH zW(Y382*CvyVa^5A??EcR{RzN|7#0FX2rj?~!37v$Zy{iWo(nM2rKR|hq+!luH8siYIRhSe3}b1n+51G$rs0zUTEN&lUtnFbin)P z{Z47!mJOxLyk=#~-c}Ei9{RYqaIAC@;6RIu0AXNUB#(Q$!SAdf+D+2?GEXud9|gy8 z!`n;hbs*Qv&WoQ)?S@K&B);DdrQ^D-@|smGd#m-W=aLpz3iFokrNu@Px=`An=5oP$ zA~*E(j& zab4pf?M#b{L3#7atk>NUcDeBK4vX^?JNPmyJ!bZAs%VWa4x z@Gz&`u%0tz*LyeTIF$98)m8S^>Ep0)FS=c3w?>#ZFJE|n*@m+2WPZQk@k?d*48!Pn zo#ADZWw%-%hlSxkZ?5VMx-+X<6 z#vi87+D#D$??l=5GV;c6nQ3yzdiZu6zl$QvnaalcLN*kY(Ae)#c#I zn-fjsuE$gzb{#3b=s8r{XhJhBUMS6ymv_EGUJDbY7qg{wD_2&!vW?%e>^A!NoydM7 z*=7Dh<-S~xwa$EICiga$tohnp?krujN6v5miPKDzyqnsg;Om~%z;EP&zG~oGmfcE& z)6>&U*J0a*`wW+zb;IpVK8V8nH)_|mpKx<=-F34pyA3{m;x5*+?!rS`-)cXXUEM6p zZjC;z76Ogpa|;0@^jv@u=3LDQmzn##FR?cWuI6-cRSemB`MHJL;HlDiaM_=y8>laG z5L|!}f(tOhoC~NQ--!%ZVps?mA-Dh|1Q%e0y@h}gdM>~S!37xMI@jiXCFzsk_7`iE z^-R*|!R`Mf{kcYYsAeD$Ty5~Fq+gTY>-r@){#VlXHI#{p7#42cOS#X{xUaFy`=rd5 zHI|8z2(EUxk_(19-sg2M_u)5JHI#)l5M1pslMArBHOiPLWe`}K^&sh?FP~euEw1Hy zohku#Cl^><_)yJGpyz6zYq=o#P$JKVB+s=;jZg`})lRSEg5~`RY2PPlUzyejr4d~1 z^;#}yZkMFFP13w>q(&%(y@l=eM$&i64zSzgu{Vv@2rHxKYQMLVo=f^CxbHT(@9jov zgq09n+u?V)VES7w$et(np~cw#)QrRE_Fs~IE?LGOlD-X&%lbi&_brzF+FGoJy@d_B zh;IL;^1&rl3o7qNN#8{G5nP5C76L{HF2D%GLZE(pZs7)fE%&A6P5(_ah@NXRK2!Q# z$ml5MT!0aR3oydoLcj=fu4b@k)I$sl0VDKWK>hemWWW-^1sEZ?03*z~fcmkw5U|9s z5HLb;0Y(TezzBN_0VDKWfDwWVFv4{%pnmKv1S}C;fDwWVFcQzXik9T#tx}{XJ?V3> cw-7M$KRxMyGKrtTi2wiq07*qoM6N<$g3QHCfB*mh literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/tiles-drop-here-over.png b/plugin-tiled/assets/textures/tiles-drop-here-over.png new file mode 100644 index 0000000000000000000000000000000000000000..1065d3ee4a4026dbcb5831f1cebf445d10c493c0 GIT binary patch literal 1685 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 JF6*2UngH2l?w$Yu literal 0 HcmV?d00001 diff --git a/plugin-tiled/assets/textures/tool-tileeraser.png b/plugin-tiled/assets/textures/tool-tileeraser.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf9ff70dede320e90efdb429c99476066bce6d7 GIT binary patch literal 1129 zcmaJ=OKj9e7`9r3XecS$KoL}+sTUBmS-*C@SzB?UU3(W6u~D=vN&r>Du_uX1>~ZZ0 z>qJzl3LFZ88?*?>p#=el0->QjL(2 z+j>6yOsJB;IrFPt2ST7sMX7mul1hz}q6xG-qxVq5;G3bC@mZQ)UBNu64 znF`$|7Px||!ftErfCo1Ww3Lj29z!ze<|fb>$i#sSu?_;e*YV{*p(p*y_`6?qVdOfqKhJP#Tqh8I(DL97P?$BQf{u{;;!c$w#9fdiF~Ceb{zQ!Z+` zN-T0y=x&T%nPto6GE_Sywi4L{ZQn)Sqtp(>-nqS%)hteuQ(MMijMtUyQi)(_qgfKk1LKZ zsLOE8e|%BeI{4)NyEhlYP0VO?&ayqs&ZA>j$NpVidrBz|4L`Wz{2Dp`eq`dv^ZJv) ziBFC#-S~Uo#J8(X$46f7HU2*M)~6%j#oXWiQ7&IPi^qD_?c>ix5~B}KZM$9b{dwo( z4|kn3E_ATNKOJhZGQ*M0C$={{t68poK9ZgLXKKPXuG~6&>!YXR&u%Vy6um_4Z`%8C T@eg;mgpWU;ZP89=wto2^!k~c6 literal 0 HcmV?d00001 diff --git a/plugin-tiled/build.gradle b/plugin-tiled/build.gradle new file mode 100644 index 00000000..5700c386 --- /dev/null +++ b/plugin-tiled/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'java' +} + +group 'games.rednblack' +version '0.0.1' + +ext { + gdxVersion = '1.9.10' + box2DLightsVersion = '1.5' + ashleyVersion = '1.7.3' + visUIVersion = '1.4.4' + + pack = ["assets/textures", "assets/pack/", "tiled"] +} + +repositories { + mavenCentral() +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + implementation "com.badlogicgames.ashley:ashley:$ashleyVersion" + implementation "com.kotcrab.vis:vis-ui:$visUIVersion" + + implementation 'net.mountainblade:modular:1.0' + + implementation project(":hyperlap2d-common-api") + implementation project(":hyperlap2d-runtime-libgdx") + + testCompile group: 'junit', name: 'junit', version: '4.12' +} + +import com.badlogic.gdx.tools.texturepacker.TexturePacker +task packTextures { + if (project.ext.has('pack')) { + logger.info "Calling TexturePacker: " + pack + TexturePacker.processIfModified(file(pack[0]).absolutePath, file(pack[1]).absolutePath, pack[2] as String) + } +} + +project.ext.assetsDir = new File("assets/pack"); + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) + from files(project.assetsDir); +} \ No newline at end of file diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanel.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanel.java new file mode 100644 index 00000000..62c7f9ea --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanel.java @@ -0,0 +1,233 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.plugin.tiled; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.kotcrab.vis.ui.widget.VisTextButton; +import com.kotcrab.vis.ui.widget.tabbedpane.Tab; +import com.kotcrab.vis.ui.widget.tabbedpane.TabbedPane; +import com.kotcrab.vis.ui.widget.tabbedpane.TabbedPaneListener; +import com.puremvc.patterns.facade.Facade; +import com.puremvc.patterns.facade.SimpleFacade; +import games.rednblack.editor.plugin.tiled.data.TileVO; +import games.rednblack.editor.plugin.tiled.manager.ResourcesManager; +import games.rednblack.editor.plugin.tiled.view.tabs.GridTilesTab; +import games.rednblack.editor.plugin.tiled.view.tabs.SettingsTab; +import games.rednblack.h2d.common.UIDraggablePanel; + +/** + * Created by mariam on 2/2/2016. + */ +public class TiledPanel extends UIDraggablePanel { + + public static final float GRID_WIDTH = 200f; + public static final float GRID_HEIGHT = 250f; + public static final float DROP_WIDTH = 210f; + public static final float DROP_HEIGHT = 140f; + public static final float SETTINGS_WIDTH = 200f; + public static final float SETTINGS_HEIGHT = 150f; + public static final float BOTTOM_BAR_X = 177f; + public static final float BOTTOM_BAR_DELTA_Y = 6f; + + public TiledPlugin tiledPlugin; + public Facade facade; + + protected TabbedPane tabbedPane; + protected VisTable tabTable; //table inside of each tab + protected Table paneTable; //table for 'tabs' row + + private GridTilesTab tilesTab; + private SettingsTab settingsTab; + private Image bottomBar; + private VisTable mainTable; + private Engine engine; + private ResourcesManager resourcesManager; + + public TiledPanel(TiledPlugin tiledPlugin) { + super("Tiles"); + this.tiledPlugin = tiledPlugin; + + facade = SimpleFacade.getInstance(); + + mainTable = new VisTable(); + add(mainTable) + .padLeft(-2) + .padRight(2); + + tabTable = new VisTable(); + } + + public void initView() { + if (bottomBar == null) { + this.resourcesManager = tiledPlugin.pluginRM; + bottomBar = new Image(resourcesManager.getTextureRegion("tab-back-line")); + bottomBar.setWidth(80); + addActorBefore(mainTable, bottomBar); + } + + mainTable.clear(); + + TabbedPane.TabbedPaneStyle style = new TabbedPane.TabbedPaneStyle(); + VisTextButton.VisTextButtonStyle btnStyle = new VisTextButton.VisTextButtonStyle(); + btnStyle.up = new TextureRegionDrawable(resourcesManager.getTextureRegion("plugin-tab-inactive")); + btnStyle.checked = new TextureRegionDrawable(resourcesManager.getTextureRegion("plugin-tab-active")); + btnStyle.font = VisUI.getSkin().getFont("default-font"); + btnStyle.fontColor = VisUI.getSkin().getColor("white"); + style.buttonStyle = btnStyle; + tabbedPane = new TabbedPane(style); + paneTable = tabbedPane.getTable(); + + mainTable.add(paneTable) + .left() + .top() + .expandX() + .row(); + + tabTable.clear(); + paneTable.row(); + paneTable.add(tabTable) + .left() + .top() + .row(); + + tabbedPane.addListener(new TabbedPaneListener() { + + @Override + public void switchedTab (Tab tab) { + if (tab == null) { + return; + } + + float WIDTH = 0; + float HEIGHT = 0; + if (tab instanceof SettingsTab) { + WIDTH = SETTINGS_WIDTH; + HEIGHT = SETTINGS_HEIGHT; + } else if (tab instanceof GridTilesTab) { + if (GridTilesTab.isDrop) { + WIDTH = DROP_WIDTH; + HEIGHT = DROP_HEIGHT; + } else { + WIDTH = GRID_WIDTH; + HEIGHT = GRID_HEIGHT; + } + } + + Table content = tab.getContentTable(); + + tabTable.clearChildren(); + tabTable.add(content) + .width(WIDTH) + .height(HEIGHT) + .row(); + pack(); + + setBottomBarPosition(HEIGHT); + setFixedPosition(); + } + + @Override + public void removedTab(Tab tab) { + + } + + @Override + public void removedAllTabs() { + + } + + }); + + initTabs(); + + pack(); + } + + public void setBottomBarPosition(float panelHeight) { + bottomBar.setX(BOTTOM_BAR_X); + bottomBar.setY(panelHeight + BOTTOM_BAR_DELTA_Y); + } + + public void setFixedPosition() { + setPosition(56f, 765f - getPrefHeight()); + } + + public Table getDropTable() { + return tilesTab.getContentTable(); + } + + public void reInitGridSettings() { + settingsTab.resetGridCategory(); + } + + public void addTile(String tileName) { + tilesTab.addTile(tileName); + } + + public void selectTile(TileVO tileVO) { + tilesTab.selectTile(tileVO); + } + + public void removeTile() { + tilesTab.removeTile(); + reInitTabTable(); + setFixedPosition(); + tilesTab.scrollTiles(); + } + + private void initTabs() { + tilesTab = new GridTilesTab(this, 0); + tilesTab.initView(); + tabbedPane.insert(tilesTab.getTabIndex(), tilesTab); + + settingsTab = new SettingsTab(this, "Settings", 1); + settingsTab.initView(); + tabbedPane.insert(settingsTab.getTabIndex(), settingsTab); + + reInitTabTable(); + } + + public void reInitTabTable() { + float width = GridTilesTab.isDrop ? DROP_WIDTH : GRID_WIDTH; + float height = GridTilesTab.isDrop ? DROP_HEIGHT : GRID_HEIGHT; + tabTable.clear(); + tabTable.add(tilesTab.getContentTable()) + .width(width) + .height(height); + tabTable.pack(); + setBottomBarPosition(height); + pack(); + } + + public void initLockView() { + mainTable.clear(); + + mainTable.add(new VisLabel("no scenes open")).right(); + } + + public void setEngine(Engine engine) { + this.engine = engine; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java new file mode 100644 index 00000000..87e3e1fe --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java @@ -0,0 +1,210 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.plugin.tiled; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop; +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; +import com.vo.CursorData; +import games.rednblack.editor.plugin.tiled.data.TileVO; +import games.rednblack.editor.plugin.tiled.tools.DeleteTileTool; +import games.rednblack.editor.plugin.tiled.tools.DrawTileTool; +import games.rednblack.editor.plugin.tiled.view.tabs.SettingsTab; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.common.ResourcePayloadObject; + +import java.util.HashMap; + +/** + * Created by mariam on 2/2/2016. + */ +public class TiledPanelMediator extends SimpleMediator { + private static final String TAG = TiledPanelMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + private TiledPlugin tiledPlugin; + + public TiledPanelMediator(TiledPlugin tiledPlugin) { + super(NAME, new TiledPanel(tiledPlugin)); + this.tiledPlugin = tiledPlugin; + + viewComponent.initLockView(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + MsgAPI.SCENE_LOADED, + TiledPlugin.TILE_ADDED, + TiledPlugin.TILE_SELECTED, + TiledPlugin.ACTION_DELETE_TILE, + TiledPlugin.ACTION_SET_GRID_SIZE_FROM_LIST, + TiledPlugin.ACTION_SET_OFFSET, + TiledPlugin.PANEL_OPEN, + TiledPlugin.OPEN_DROP_DOWN, + TiledPlugin.GRID_CHANGED, + SettingsTab.OK_BTN_CLICKED, + TiledPlugin.ACTION_SET_GRID_SIZE_FROM_ITEM, + MsgAPI.ACTION_DELETE_IMAGE_RESOURCE, + MsgAPI.ITEM_DATA_UPDATED, + MsgAPI.TOOL_SELECTED + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + + String tileName; + + switch (notification.getName()) { + case MsgAPI.SCENE_LOADED: + tiledPlugin.isSceneLoaded = true; + + tiledPlugin.initSaveData(); + viewComponent.initView(); + + DragAndDrop.Target target = new DragAndDrop.Target(viewComponent.getDropTable()) { + @Override + public boolean drag(DragAndDrop.Source source, DragAndDrop.Payload payload, float x, float y, int pointer) { + return true; + } + + @Override + public void drop(DragAndDrop.Source source, DragAndDrop.Payload payload, float x, float y, int pointer) { + + ResourcePayloadObject resourcePayloadObject = (ResourcePayloadObject) payload.getObject(); + if (!resourcePayloadObject.className.endsWith(".ImageResource")) return; //only image resource can become a tile! + + String tileName = resourcePayloadObject.name; + if (tiledPlugin.dataToSave.containsTile(tileName)) return; + + tiledPlugin.facade.sendNotification(TiledPlugin.TILE_ADDED, tileName); + + } + }; + tiledPlugin.facade.sendNotification(MsgAPI.ADD_TARGET, target); + Engine engine = tiledPlugin.getAPI().getEngine(); + viewComponent.setEngine(engine); + viewComponent.setFixedPosition(); + break; + case TiledPlugin.TILE_ADDED: + tileName = notification.getBody(); + viewComponent.addTile(tileName); + viewComponent.setFixedPosition(); + + tiledPlugin.dataToSave.addTile(tileName); + tiledPlugin.saveDataManager.save(); + break; + case TiledPlugin.TILE_SELECTED: + viewComponent.selectTile(notification.getBody()); + break; + case TiledPlugin.OPEN_DROP_DOWN: + tileName = notification.getBody(); + HashMap actionsSet = new HashMap<>(); + actionsSet.put(TiledPlugin.ACTION_SET_GRID_SIZE_FROM_LIST, "Set grid size"); + actionsSet.put(TiledPlugin.ACTION_DELETE_TILE, "Delete"); + actionsSet.put(TiledPlugin.ACTION_OPEN_OFFSET_PANEL, "Set offset"); + tiledPlugin.facade.sendNotification(TiledPlugin.TILE_SELECTED, tiledPlugin.dataToSave.getTile(tileName)); + tiledPlugin.getAPI().showPopup(actionsSet, tileName); + break; + case MsgAPI.ACTION_DELETE_IMAGE_RESOURCE: + tileName = notification.getBody(); + tiledPlugin.facade.sendNotification(TiledPlugin.ACTION_DELETE_TILE, tileName); + break; + case TiledPlugin.ACTION_SET_GRID_SIZE_FROM_LIST: + TextureRegion r = tiledPlugin.pluginRM.getTextureRegion(notification.getBody()); + tiledPlugin.dataToSave.setGrid(r.getRegionWidth() / tiledPlugin.getPixelToWorld(), r.getRegionHeight() / tiledPlugin.getPixelToWorld()); + tiledPlugin.facade.sendNotification(TiledPlugin.GRID_CHANGED); + break; + case TiledPlugin.ACTION_DELETE_TILE: + String tn = notification.getBody(); + if (!tiledPlugin.dataToSave.containsTile(tn)) return; + tiledPlugin.dataToSave.removeTile(tn); + tiledPlugin.saveDataManager.save(); + tiledPlugin.setSelectedTileVO(new TileVO()); + + viewComponent.removeTile(); + break; + case TiledPlugin.PANEL_OPEN: + if(viewComponent.isOpen) { + break; + } + + viewComponent.show(tiledPlugin.getAPI().getUIStage()); + + if(tiledPlugin.isSceneLoaded) { + viewComponent.setFixedPosition(); + } + break; + case MsgAPI.TOOL_SELECTED: + String body = notification.getBody(); + String cursorName = null; + switch (body.toString()) { + case DrawTileTool.NAME: + cursorName = "tile"; + tiledPlugin.facade.sendNotification(TiledPlugin.PANEL_OPEN); + tiledPlugin.facade.sendNotification(MsgAPI.HIDE_GRID); + break; + case DeleteTileTool.NAME: + cursorName = "tile-eraser"; + tiledPlugin.facade.sendNotification(MsgAPI.HIDE_GRID); + break; + default: + tiledPlugin.facade.sendNotification(MsgAPI.SHOW_GRID); + viewComponent.hide(); + break; + } + if (cursorName != null) { + CursorData cursorData = new CursorData(cursorName, 14, 14); + TextureRegion region = tiledPlugin.pluginRM.getTextureRegion(cursorName); + //tiledPlugin.getAPI().setCursor(cursorData, region); + } + break; + case SettingsTab.OK_BTN_CLICKED: + tiledPlugin.dataToSave.setParameterVO(notification.getBody()); + tiledPlugin.saveDataManager.save(); + break; + case TiledPlugin.GRID_CHANGED: + viewComponent.reInitGridSettings(); + tiledPlugin.saveDataManager.save(); + break; + case TiledPlugin.ACTION_SET_GRID_SIZE_FROM_ITEM: + Entity observable = notification.getBody(); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(observable, DimensionsComponent.class); + tiledPlugin.dataToSave.setGrid(dimensionsComponent.width, dimensionsComponent.height); + tiledPlugin.facade.sendNotification(TiledPlugin.GRID_CHANGED); + break; + case MsgAPI.ITEM_DATA_UPDATED: + Entity item = notification.getBody(); + if (tiledPlugin.isTile(item)) { + ComponentRetriever.get(item, MainItemComponent.class).tags.remove(TiledPlugin.TILE_TAG); + } + break; + } + } + + +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java new file mode 100644 index 00000000..e4059b7a --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java @@ -0,0 +1,232 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.plugin.tiled; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.widget.VisImageButton; +import games.rednblack.editor.plugin.tiled.data.TileVO; +import games.rednblack.editor.plugin.tiled.manager.ResourcesManager; +import games.rednblack.editor.plugin.tiled.offset.OffsetPanel; +import games.rednblack.editor.plugin.tiled.offset.OffsetPanelMediator; +import games.rednblack.editor.plugin.tiled.save.DataToSave; +import games.rednblack.editor.plugin.tiled.save.SaveDataManager; +import games.rednblack.editor.plugin.tiled.tools.DeleteTileTool; +import games.rednblack.editor.plugin.tiled.tools.DrawTileTool; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.CustomVariables; +import games.rednblack.h2d.common.plugins.H2DPluginAdapter; +import net.mountainblade.modular.annotations.Implementation; + +import java.util.Set; + + +/** + * Created by mariam on 2/2/2016. + */ +@Implementation(authors = "azakhary", version = "0.0.1") +public class TiledPlugin extends H2DPluginAdapter { + + //-------notifications---------// + public static final String CLASS_NAME = "games.rednblack.editor.plugin.tiled"; + public static final String TILE_ADDED = CLASS_NAME + ".TILE_ADDED"; + public static final String TILE_SELECTED = CLASS_NAME + ".TILE_SELECTED"; + public static final String PANEL_OPEN = CLASS_NAME + ".PANEL_OPEN"; + public static final String OPEN_DROP_DOWN = CLASS_NAME + ".OPEN_DROP_DOWN"; + public static final String GRID_CHANGED = CLASS_NAME + ".GRID_CHANGED"; + public static final String ACTION_DELETE_TILE = CLASS_NAME + ".ACTION_DELETE_TILE"; + public static final String ACTION_SET_OFFSET = CLASS_NAME + ".ACTION_SET_OFFSET"; + public static final String ACTION_OPEN_OFFSET_PANEL = CLASS_NAME + ".ACTION_OPEN_OFFSET_PANEL"; + public static final String TILE_GRID_OFFSET_ADDED = CLASS_NAME + ".TILE_GRID_OFFSET_ADDED"; + public static final String ACTION_SET_GRID_SIZE_FROM_ITEM = CLASS_NAME + ".ACTION_SET_GRID_SIZE_FROM_ITEM"; + public static final String ACTION_SET_GRID_SIZE_FROM_LIST = CLASS_NAME + ".ACTION_SET_GRID_SIZE_FROM_LIST"; + //-------end--------// + + public static final String TILE_TAG = "TILE"; + public static final String ROW = "ROW"; + public static final String COLUMN = "COLUMN"; + + public DataToSave dataToSave; + public SaveDataManager saveDataManager; + public boolean isSceneLoaded = false; + public DrawTileTool drawTileTool; + public DeleteTileTool deleteTileTool; + public ResourcesManager pluginRM; + public OffsetPanel offsetPanel; + + private TileVO selectedTileVO; + private CustomVariables currentEntityCustomVariables; + private MainItemComponent currentEntityMainItemComponent; + private TransformComponent currentEntityTransformComponent; + + public TiledPlugin() { + selectedTileVO = new TileVO(); + currentEntityCustomVariables = new CustomVariables(); + } + + @Override + public void initPlugin() { + facade.registerMediator(new TiledPanelMediator(this)); + + pluginRM = new ResourcesManager(this); + offsetPanel = new OffsetPanel(this); + + facade.registerMediator(new OffsetPanelMediator(this)); + + initTools(); + + Skin skin = VisUI.getSkin(); + VisImageButton.VisImageButtonStyle tileAddButtonStyle = new VisImageButton.VisImageButtonStyle(); + tileAddButtonStyle.up = skin.getDrawable("toolbar-normal"); + tileAddButtonStyle.down = skin.getDrawable("toolbar-down"); + tileAddButtonStyle.checked = skin.getDrawable("toolbar-down"); + tileAddButtonStyle.over = skin.getDrawable("toolbar-over"); + tileAddButtonStyle.imageUp = new TextureRegionDrawable(pluginRM.getTextureRegion("tool-tilebrush")); + pluginAPI.addTool(DrawTileTool.NAME, tileAddButtonStyle, true, drawTileTool); + + VisImageButton.VisImageButtonStyle tileDeleteButtonStyle = new VisImageButton.VisImageButtonStyle(); + tileDeleteButtonStyle.up = skin.getDrawable("toolbar-normal"); + tileDeleteButtonStyle.down = skin.getDrawable("toolbar-down"); + tileDeleteButtonStyle.checked = skin.getDrawable("toolbar-down"); + tileDeleteButtonStyle.over = skin.getDrawable("toolbar-over"); + tileDeleteButtonStyle.imageUp = new TextureRegionDrawable(pluginRM.getTextureRegion("tool-tileeraser")); + pluginAPI.addTool(DeleteTileTool.NAME, tileDeleteButtonStyle, false, deleteTileTool); + + pluginAPI.setDropDownItemName(ACTION_SET_GRID_SIZE_FROM_ITEM, "Set tile grid size"); + } + + @Override + public void onDropDownOpen(Set selectedEntities, Array actionsSet) { + if(selectedEntities.size() == 1) { + actionsSet.add(ACTION_SET_GRID_SIZE_FROM_ITEM); + } + } + + public void initSaveData() { + saveDataManager = new SaveDataManager(pluginAPI.getProjectPath()); + dataToSave = saveDataManager.dataToSave; + } + + private void initTools() { + drawTileTool = new DrawTileTool(this); + deleteTileTool = new DeleteTileTool(this); + } + + public Entity getPluginEntityWithParams(int row, int column) { + for (Entity entity : pluginAPI.getProjectEntities()) { + if(!isTile(entity)) continue; + boolean isEntityVisible = pluginAPI.isEntityVisible(entity); + if (!isEntityVisible || !isOnCurrentSelectedLayer(entity)) continue; + + currentEntityMainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + currentEntityCustomVariables = currentEntityMainItemComponent.customVariables; + if (currentEntityCustomVariables.getIntegerVariable(ROW) == row + && currentEntityCustomVariables.getIntegerVariable(COLUMN) == column) { + return entity; + } + } + return null; + } + + public Entity getPluginEntityWithCoords(float x, float y) { + for (Entity entity : pluginAPI.getProjectEntities()) { + if (!isTile(entity)) continue; + boolean isEntityVisible = pluginAPI.isEntityVisible(entity); + if (!isEntityVisible || !isOnCurrentSelectedLayer(entity)) continue; + + currentEntityTransformComponent = ComponentRetriever.get(entity, TransformComponent.class); + Rectangle tmp = new Rectangle( + currentEntityTransformComponent.x, + currentEntityTransformComponent.y, + dataToSave.getParameterVO().gridWidth, + dataToSave.getParameterVO().gridHeight); + + if (tmp.contains(x, y)) { + return entity; + } + } + return null; + } + + public float getPixelToWorld() { + return pluginAPI.getSceneLoader().getRm().getProjectVO().pixelToWorld; + } + + public boolean isTile(Entity entity) { + if (entity == null) + return false; + return ComponentRetriever.get(entity, MainItemComponent.class).tags.contains(TILE_TAG); + } + + public boolean isOnCurrentSelectedLayer(Entity entity) { + ZIndexComponent entityZComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + return entityZComponent.layerName.equals(pluginAPI.getCurrentSelectedLayerName()); + } + + public void setSelectedTileName (String regionName) { + selectedTileVO.regionName = regionName; + } + + public String getSelectedTileName() { + return selectedTileVO.regionName; + } + + public Vector2 getSelectedTileGridOffset() { + return selectedTileVO.gridOffset; + } + + public void setSelectedTileGridOffset (Vector2 gridOffset) { + selectedTileVO.gridOffset = gridOffset; + } + + public TileVO getSelectedTileVO() { + return selectedTileVO; + } + + public void setSelectedTileVO(TileVO selectedTileVO) { + this.selectedTileVO = selectedTileVO; + } + + public void applySelectedTileGridOffset() { + pluginAPI.getProjectEntities().forEach(entity -> { + if (!(isTile(entity))) return; + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + if (selectedTileVO.regionName.equals(textureRegionComponent.regionName)) { + transformComponent.x -= selectedTileVO.gridOffset.x; + transformComponent.y -= selectedTileVO.gridOffset.y; + } + }); + saveOffsetChanges(); + } + + private void saveOffsetChanges() { + dataToSave.setTileGridOffset(selectedTileVO); + saveDataManager.save(); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/AttributeVO.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/AttributeVO.java new file mode 100644 index 00000000..2fa36482 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/AttributeVO.java @@ -0,0 +1,34 @@ +package games.rednblack.editor.plugin.tiled.data; + +/** + * Created by mariam on 3/31/16. + */ +public class AttributeVO { + + public String title; + public float value; + public boolean acceptNegativeValues; + + public AttributeVO() { + } + + public AttributeVO(String title) { + this.title = title+": "; + } + + public AttributeVO(String title, boolean acceptNegativeValues) { + this.title = title+": "; + this.acceptNegativeValues = acceptNegativeValues; + } + + public AttributeVO(String title, float value) { + this.value = value; + this.title = title+": "; + } + + public AttributeVO(String title, float value, boolean acceptNegativeValues) { + this.title = title+": "; + this.value = value; + this.acceptNegativeValues = acceptNegativeValues; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/CategoryVO.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/CategoryVO.java new file mode 100644 index 00000000..cbe18491 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/CategoryVO.java @@ -0,0 +1,17 @@ +package games.rednblack.editor.plugin.tiled.data; + +import com.badlogic.gdx.utils.Array; + +/** + * Created by mariam on 2/5/16. + */ +public class CategoryVO { + + public String title = "size"; + public Array attributes; + + public CategoryVO(String title, Array attributes) { + this.title = title; + this.attributes = attributes; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/ParameterVO.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/ParameterVO.java new file mode 100644 index 00000000..0688bd78 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/ParameterVO.java @@ -0,0 +1,13 @@ +package games.rednblack.editor.plugin.tiled.data; + +/** + * Created by mariam on 3/31/16. + */ +public class ParameterVO { + + public float gridWidth; //in world units + public float gridHeight; //in world units + + public ParameterVO() { + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/TileVO.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/TileVO.java new file mode 100644 index 00000000..66b92a9d --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/data/TileVO.java @@ -0,0 +1,26 @@ +package games.rednblack.editor.plugin.tiled.data; + +import com.badlogic.gdx.math.Vector2; + +/** + * Created by mariam on 5/13/16. + */ +public class TileVO { + + public String regionName = ""; + public Vector2 gridOffset; + + public TileVO() { + gridOffset = new Vector2(); + } + + public TileVO(String regionName) { + this.regionName = regionName; + gridOffset = new Vector2(); + } + + public TileVO(String regionName, Vector2 offset) { + this.regionName = regionName; + this.gridOffset = offset; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java new file mode 100644 index 00000000..9abda795 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java @@ -0,0 +1,70 @@ +package games.rednblack.editor.plugin.tiled.manager; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.google.common.io.ByteStreams; +import games.rednblack.editor.plugin.tiled.TiledPlugin; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by mariam on 4/21/16. + */ +public class ResourcesManager { + + private final String RESOURCES_FILE_NAME = "tiled"; + + private TiledPlugin tiledPlugin; + private TextureAtlas textureAtlas; + + public ResourcesManager(TiledPlugin tiledPlugin) { + this.tiledPlugin = tiledPlugin; + + init(); + } + + private void init() { + File atlasTempFile = getResourceFileFromJar(".atlas"); + File pngTempFile = getResourceFileFromJar(".png"); + textureAtlas = new TextureAtlas(new FileHandle(atlasTempFile)); + atlasTempFile.deleteOnExit(); + pngTempFile.deleteOnExit(); + } + + private File getResourceFileFromJar(String extension) { + String fileName = "/"+RESOURCES_FILE_NAME+extension; + File tempFile = new File (System.getProperty("user.dir")+fileName); + try { + InputStream in = getClass().getResourceAsStream(fileName); + FileOutputStream out = new FileOutputStream(tempFile); + ByteStreams.copy(in, out); + in.close(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return tempFile; + } + + public TextureRegion getTextureRegion(String name) { + TextureRegion region = textureAtlas.findRegion(name); // try to get region from plugin assets + if (region != null) { +// System.out.println("region: "+name+", "+region.getRegionWidth()+" "+region.getRegionHeight()); + } + if (region == null) { // take the region from hyperlap assets + region = tiledPlugin.getAPI().getSceneLoader().getRm().getTextureRegion(name); + } + return region; + } + + public NinePatch getPluginNinePatch(String name) { + TextureAtlas.AtlasRegion region = textureAtlas.findRegion(name); + if(region == null) return null; + return new NinePatch(region, region.splits[0], region.splits[1], region.splits[2], region.splits[3]); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanel.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanel.java new file mode 100644 index 00000000..9736dc8a --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanel.java @@ -0,0 +1,76 @@ +package games.rednblack.editor.plugin.tiled.offset; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.VisTextButton; +import games.rednblack.editor.plugin.tiled.TiledPlugin; +import games.rednblack.editor.plugin.tiled.data.AttributeVO; +import games.rednblack.editor.plugin.tiled.data.CategoryVO; +import games.rednblack.editor.plugin.tiled.view.Category; +import games.rednblack.h2d.common.UIDraggablePanel; + +/** + * Created by mariam on 5/12/16. + */ +public class OffsetPanel extends UIDraggablePanel { + + private final String TILE_OFFSET_X = "Tile offset x"; + private final String TILE_OFFSET_Y = "Tile offset y"; + + private TiledPlugin tiledPlugin; + private Table mainTable; + private Category offsetCategory; + private AttributeVO offsetAttributeX; + private AttributeVO offsetAttributeY; + + + public OffsetPanel(TiledPlugin tiledPlugin) { + super("Offset"); + + this.tiledPlugin = tiledPlugin; + addCloseButton(); + + mainTable = new Table(); + add(mainTable).pad(3); + + initView(); + } + + private void initView() { + + offsetAttributeX = new AttributeVO(TILE_OFFSET_X, true); + offsetAttributeY = new AttributeVO(TILE_OFFSET_Y, true); + + Array attributeVOs = new Array<>(); + attributeVOs.add(offsetAttributeX); + attributeVOs.add(offsetAttributeY); + offsetCategory = new Category(new CategoryVO("", attributeVOs)); + mainTable.add(offsetCategory) + .pad(7) + .row(); + + VisTextButton addButton = new VisTextButton("Set"); + addButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + Vector2 offset = new Vector2(offsetAttributeX.value, offsetAttributeY.value); + tiledPlugin.facade.sendNotification(TiledPlugin.TILE_GRID_OFFSET_ADDED, offset); + super.clicked(event, x, y); + } + }); + mainTable.add(addButton); + } + + public void refreshOffsetValues() { + offsetAttributeX = new AttributeVO(TILE_OFFSET_X, tiledPlugin.getSelectedTileGridOffset().x, true); + offsetAttributeY = new AttributeVO(TILE_OFFSET_Y, tiledPlugin.getSelectedTileGridOffset().y, true); + + Array attributeVOs = new Array<>(); + attributeVOs.add(offsetAttributeX); + attributeVOs.add(offsetAttributeY); + offsetCategory.reInitView(attributeVOs); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanelMediator.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanelMediator.java new file mode 100644 index 00000000..a1f90a88 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/offset/OffsetPanelMediator.java @@ -0,0 +1,56 @@ +package games.rednblack.editor.plugin.tiled.offset; + +import com.badlogic.gdx.math.Vector2; +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.plugin.tiled.TiledPlugin; + +/** + * Created by mariam on 5/12/16. + */ +public class OffsetPanelMediator extends SimpleMediator { + + private static final String TAG = OffsetPanelMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + private TiledPlugin tiledPlugin; + + + public OffsetPanelMediator(TiledPlugin tiledPlugin) { + super(NAME, tiledPlugin.offsetPanel); + + this.tiledPlugin = tiledPlugin; + } + + @Override + public String[] listNotificationInterests() { + return new String[] { + TiledPlugin.ACTION_OPEN_OFFSET_PANEL, + TiledPlugin.TILE_GRID_OFFSET_ADDED, + TiledPlugin.TILE_SELECTED + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + + switch (notification.getName()) { + case TiledPlugin.ACTION_OPEN_OFFSET_PANEL: + viewComponent.refreshOffsetValues(); + viewComponent.show(tiledPlugin.getAPI().getUIStage()); + break; + case TiledPlugin.TILE_GRID_OFFSET_ADDED: + Vector2 offsetValue = notification.getBody(); + tiledPlugin.setSelectedTileGridOffset(offsetValue); + tiledPlugin.applySelectedTileGridOffset(); + break; + case TiledPlugin.TILE_SELECTED: + if (viewComponent.isOpen) { + viewComponent.refreshOffsetValues(); + } + break; + } + + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/DataToSave.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/DataToSave.java new file mode 100644 index 00000000..539f6ffc --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/DataToSave.java @@ -0,0 +1,81 @@ +package games.rednblack.editor.plugin.tiled.save; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.plugin.tiled.data.ParameterVO; +import games.rednblack.editor.plugin.tiled.data.TileVO; + +import java.util.stream.StreamSupport; + +/** + * Created by mariam on 3/23/16. + */ +public class DataToSave { + + private Array tiles; + private ParameterVO parameterVO; + + public DataToSave() { + tiles = new Array<>(); + parameterVO = new ParameterVO(); + } + + public void addTile(String tileDrawableName) { + TileVO newTile = new TileVO(tileDrawableName); + if (!tiles.contains(newTile, false)) { + tiles.add(newTile); + } + } + + public void removeTile(String tileDrawableName) { + tiles.forEach(tile -> { + if (tile.regionName.equals(tileDrawableName)) { + tiles.removeValue(tile, false); + } + }); + + } + + public void setTileGridOffset(TileVO tileVO) { + StreamSupport.stream(tiles.spliterator(), false) + .filter(tile -> tile.regionName.equals(tileVO.regionName)) + .findFirst() + .ifPresent(t -> t.gridOffset = tileVO.gridOffset); + } + + public Vector2 getTileGridOffset(String regionName) { + return StreamSupport.stream(tiles.spliterator(), false) + .filter(tile -> tile.regionName.equals(regionName)) + .findFirst() + .get() + .gridOffset; + } + + public TileVO getTile(String regionName) { + return StreamSupport.stream(tiles.spliterator(), false) + .filter(tile -> tile.regionName.equals(regionName)) + .findFirst() + .get(); + } + + public Array getTiles() { + return tiles; + } + + public boolean containsTile(String regionName) { + return StreamSupport.stream(tiles.spliterator(), false).anyMatch(tile -> tile.regionName.equals(regionName)); + } + + public ParameterVO getParameterVO() { + return parameterVO; + } + + public void setParameterVO(ParameterVO parameterVO) { + this.parameterVO = parameterVO; + } + + public void setGrid(float gridWidth, float gridHeight) { + parameterVO.gridWidth = gridWidth; + parameterVO.gridHeight = gridHeight; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java new file mode 100644 index 00000000..d1f9429e --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java @@ -0,0 +1,38 @@ +package games.rednblack.editor.plugin.tiled.save; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Json; + +/** + * Created by mariam on 3/24/16. + */ +public class SaveDataManager { + + public DataToSave dataToSave; + + private Json json; + private FileHandle fileHandle; + + + public SaveDataManager(String projectPath) { + json = new Json(); + fileHandle = Gdx.files.absolute(projectPath + "/tiled_plugin.dt"); + load(); + } + + private void load() { + if (!fileHandle.exists()) { + dataToSave = new DataToSave(); + return; + } + + String jsonString = fileHandle.readString(); + dataToSave = json.fromJson(DataToSave.class, jsonString); + } + + public void save() { + String dataString = json.toJson(dataToSave); + fileHandle.writeString(dataString, false); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DeleteTileTool.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DeleteTileTool.java new file mode 100644 index 00000000..933757d2 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DeleteTileTool.java @@ -0,0 +1,127 @@ +package games.rednblack.editor.plugin.tiled.tools; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Input; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.plugin.tiled.TiledPlugin; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.common.view.tools.Tool; + +/** + * Created by mariam on 4/5/16. + */ +public class DeleteTileTool implements Tool { + + public static final String NAME = "TILE_DELETE_TOOL"; + + private TiledPlugin tiledPlugin; + + private boolean isHotswapped = false; + + public DeleteTileTool(TiledPlugin tiledPlugin) { + this.tiledPlugin = tiledPlugin; + } + + @Override + public void initTool() { + } + + @Override + public String getShortcut() { + return null; + } + + @Override + public String getTitle() { + return "Delete Tile Tool"; + } + + @Override + public boolean stageMouseDown(float x, float y) { + return true; + } + + @Override + public void stageMouseUp(float x, float y) { + } + + @Override + public void stageMouseDragged(float x, float y) { + deleteEntityWithCoordinate(x, y); + } + + @Override + public void stageMouseDoubleClick(float x, float y) { + + } + + @Override + public void stageMouseScrolled(int amount) { + + } + + @Override + public boolean itemMouseDown(Entity entity, float x, float y) { + deleteEntityWithCoordinate(x, y); + return true; + } + + @Override + public void itemMouseUp(Entity entity, float x, float y) { + + } + + @Override + public void itemMouseDragged(Entity entity, float x, float y) { + deleteEntityWithCoordinate(x, y); + } + + @Override + public void itemMouseDoubleClick(Entity entity, float x, float y) { + + } + + @Override + public String getName() { + return NAME; + } + + @Override + public void handleNotification(Notification notification) { + + } + + @Override + public void keyDown(Entity entity, int keycode) { + + } + + @Override + public void keyUp(Entity entity, int keycode) { + if(isHotswapped) { + if(keycode == Input.Keys.SHIFT_LEFT) { + isHotswapped = false; + tiledPlugin.getAPI().toolHotSwapBack(); + } + } + } + + private void deleteEntity(Entity entity) { + if (tiledPlugin.isTile(entity) && tiledPlugin.isOnCurrentSelectedLayer(entity)) { + tiledPlugin.getAPI().removeFollower(entity); + tiledPlugin.getAPI().getEngine().removeEntity(entity); + tiledPlugin.facade.sendNotification(MsgAPI.DELETE_ITEMS_COMMAND_DONE); + } + } + + private void deleteEntityWithCoordinate (float x, float y) { + Entity entity = tiledPlugin.getPluginEntityWithCoords(x, y); + if (entity != null) { + deleteEntity(entity); + } + } + + public void setHotSwapped() { + isHotswapped = true; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java new file mode 100644 index 00000000..9a346129 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java @@ -0,0 +1,197 @@ +package games.rednblack.editor.plugin.tiled.tools; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.plugin.tiled.TiledPlugin; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.h2d.common.view.tools.Tool; + +/** + * Created by mariam on 3/29/16. + */ +public class DrawTileTool implements Tool { + + public static final String NAME = "TILE_ADD_TOOL"; + + private TiledPlugin tiledPlugin; + private float gridWidth; + private float gridHeight; + + public DrawTileTool(TiledPlugin tiledPlugin) { + this.tiledPlugin = tiledPlugin; + } + + @Override + public void initTool() { + + } + + @Override + public String getShortcut() { + return null; + } + + @Override + public String getTitle() { + return "Draw Tile Tool"; + } + + @Override + public boolean stageMouseDown(float x, float y) { + initGridThings(); + drawImage(x, y); + return true; + } + + @Override + public void stageMouseUp(float x, float y) { + } + + @Override + public void stageMouseDragged(float x, float y) { + drawImage(x, y); + } + + @Override + public void stageMouseDoubleClick(float x, float y) { + + } + + @Override + public void stageMouseScrolled(int amount) { + + } + + @Override + public boolean itemMouseDown(Entity entity, float x, float y) { + initGridThings(); + drawOnEntity(entity, x, y); + return true; + } + + @Override + public void itemMouseUp(Entity entity, float x, float y) { + } + + @Override + public void itemMouseDragged(Entity entity, float x, float y) { + drawImage(x, y); + } + + @Override + public void itemMouseDoubleClick(Entity entity, float x, float y) { + if (!tiledPlugin.isOnCurrentSelectedLayer(entity)) return; + if (entity != null) { + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + // there is already other tile under this one + if (textureRegionComponent.regionName.equals(tiledPlugin.getSelectedTileName())) { + //rotate + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + if (transformComponent.scaleX > 0 && transformComponent.scaleY > 0) { + transformComponent.scaleX *= -1f; + return; + } + if (transformComponent.scaleX < 0 && transformComponent.scaleY > 0) { + transformComponent.scaleY *= -1f; + return; + } + if (transformComponent.scaleX < 0 && transformComponent.scaleY < 0) { + transformComponent.scaleX *= -1f; + return; + } + if (transformComponent.scaleX > 0 && transformComponent.scaleY < 0) { + transformComponent.scaleY *= -1f; + return; + } + } + } + } + + @Override + public String getName() { + return NAME; + } + + @Override + public void handleNotification(Notification notification) { + + } + + @Override + public void keyDown(Entity entity, int keycode) { + if(keycode == Input.Keys.SHIFT_LEFT) { + tiledPlugin.getAPI().toolHotSwap(tiledPlugin.deleteTileTool); + tiledPlugin.deleteTileTool.setHotSwapped(); + } + } + + @Override + public void keyUp(Entity entity, int keycode) { + + } + + private void initGridThings() { + gridWidth = tiledPlugin.dataToSave.getParameterVO().gridWidth; + gridHeight = tiledPlugin.dataToSave.getParameterVO().gridHeight; + } + + private void drawImage(float x, float y) { + if (tiledPlugin.getSelectedTileName().equals("")) return; + + float newX = MathUtils.floor(x / gridWidth) * gridWidth + tiledPlugin.getSelectedTileGridOffset().x; + float newY = MathUtils.floor(y / gridHeight) * gridHeight + tiledPlugin.getSelectedTileGridOffset().y; + int row = MathUtils.floor(newY / gridHeight); + int column = MathUtils.round(newX / gridWidth); + + Entity underneathTile = tiledPlugin.getPluginEntityWithParams(row, column); + if (underneathTile != null) { + updateRegion(underneathTile, tiledPlugin.getSelectedTileName()); + return; + } + + Entity imageEntity = tiledPlugin.getAPI().drawImage(tiledPlugin.getSelectedTileName(), new Vector2(newX, newY)); + MainItemComponent mainItemComponent = ComponentRetriever.get(imageEntity, MainItemComponent.class); + mainItemComponent.tags.add(TiledPlugin.TILE_TAG); + + mainItemComponent.setCustomVars(TiledPlugin.ROW, Integer.toString(row)); + mainItemComponent.setCustomVars(TiledPlugin.COLUMN, Integer.toString(column)); + } + + private void drawOnEntity(Entity entity, float x, float y) { + if (!tiledPlugin.isOnCurrentSelectedLayer(entity)) return; + if (entity != null) { + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + if (textureRegionComponent != null && textureRegionComponent.regionName != null) { + // there is already other tile under this one + if(textureRegionComponent.regionName.equals(tiledPlugin.getSelectedTileName())) { + return; + } else { + //replace + updateRegion(entity, tiledPlugin.getSelectedTileName()); + } + } + return; + } + drawImage(x, y); + } + + private void updateRegion(Entity entity, String region) { + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + DimensionsComponent size = ComponentRetriever.get(entity, DimensionsComponent.class); + textureRegionComponent.regionName = tiledPlugin.getSelectedTileName(); + textureRegionComponent.region = tiledPlugin.getAPI().getSceneLoader().getRm().getTextureRegion(region); + ProjectInfoVO projectInfoVO = tiledPlugin.getAPI().getSceneLoader().getRm().getProjectVO(); + float ppwu = projectInfoVO.pixelToWorld; + size.width = textureRegionComponent.region.getRegionWidth() / ppwu; + size.height = textureRegionComponent.region.getRegionHeight() / ppwu; + } + +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Attribute.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Attribute.java new file mode 100644 index 00000000..bc4adc63 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Attribute.java @@ -0,0 +1,29 @@ +package games.rednblack.editor.plugin.tiled.view; + +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.kotcrab.vis.ui.util.FloatDigitsOnlyFilter; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTextField; +import games.rednblack.editor.plugin.tiled.data.AttributeVO; + +/** + * Created by mariam on 2/5/16. + */ +public class Attribute extends Table { + + public Attribute(AttributeVO attributeVO) { + add(new VisLabel(attributeVO.title)); + VisTextField visTextField = new VisTextField(); + visTextField.setTextFieldFilter(new FloatDigitsOnlyFilter(attributeVO.acceptNegativeValues)); + visTextField.setMaxLength(5); + visTextField.setText(attributeVO.value+""); + visTextField.setTextFieldListener((VisTextField textField, char c) -> { + if (!textField.getText().equals("")) { + attributeVO.value = Float.parseFloat(textField.getText()); + } + }); + add(visTextField) + .width(50) + .padLeft(5); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Category.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Category.java new file mode 100644 index 00000000..f7563b70 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/Category.java @@ -0,0 +1,62 @@ +package games.rednblack.editor.plugin.tiled.view; + +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.VisLabel; +import games.rednblack.editor.plugin.tiled.data.AttributeVO; +import games.rednblack.editor.plugin.tiled.data.CategoryVO; + +/** + * Created by mariam on 2/5/16. + */ +public class Category extends Table { + + private CategoryVO categoryVO; + private Array attributes; + private Table attrTable; + + public Category(CategoryVO categoryVO) { + this.categoryVO = categoryVO; + + attributes = categoryVO.attributes; + +// setDebug(true); + + VisLabel title = new VisLabel(categoryVO.title); + add(title) + .padTop(2) + .left() + .top(); + + attrTable = new Table(); + add(attrTable) + .padLeft(5); + + attributes.forEach(attributeVO -> addAttribute(attributeVO)); + } + + public void reInitView(Array attributes) { + attrTable.clear(); + this.attributes = attributes; + attributes.forEach(attributeVO -> addAttribute(attributeVO)); + attrTable.pack(); + } + + private void addAttribute(AttributeVO attributeVO) { + Attribute attr = new Attribute(attributeVO); + attrTable.add(attr) + .top() + .right() + .padBottom(5) + .row(); + } + + public AttributeVO getAttributeVO(String title) { + for (AttributeVO attributeVO : attributes) { + if (attributeVO.title.equals(title)) { + return attributeVO; + } + } + return new AttributeVO(); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/DefaultTab.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/DefaultTab.java new file mode 100644 index 00000000..4a9777a6 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/DefaultTab.java @@ -0,0 +1,42 @@ +package games.rednblack.editor.plugin.tiled.view.tabs; + +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.tabbedpane.Tab; +import games.rednblack.editor.plugin.tiled.TiledPanel; + +/** + * Created by mariam on 10/30/15. + */ +public class DefaultTab extends Tab { + + protected TiledPanel panel; + protected int tabIndex; + protected Table content = new Table(); + protected String tabTitle = ""; + + public DefaultTab(TiledPanel panel, String tabTitle, int tabIndex) { + super(false, false); //tab is not savable, tab is not closeable by user + this.panel = panel; + this.tabTitle = tabTitle; + this.tabIndex = tabIndex; + } + + public void initView() { + content.add(new VisLabel(tabTitle+" example")); + } + + @Override + public String getTabTitle () { + return tabTitle; + } + + @Override + public Table getContentTable () { + return content; + } + + public int getTabIndex() { + return tabIndex; + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/GridTilesTab.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/GridTilesTab.java new file mode 100644 index 00000000..514ca25e --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/GridTilesTab.java @@ -0,0 +1,202 @@ +package games.rednblack.editor.plugin.tiled.view.tabs; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; +import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.VisImageButton; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisScrollPane; +import com.kotcrab.vis.ui.widget.VisTable; +import games.rednblack.editor.plugin.tiled.TiledPanel; +import games.rednblack.editor.plugin.tiled.TiledPlugin; +import games.rednblack.editor.plugin.tiled.data.TileVO; +import games.rednblack.editor.plugin.tiled.manager.ResourcesManager; + +/** + * Created by mariam on 2/11/16. + */ +public class GridTilesTab extends DefaultTab { + + public static boolean isDrop; + + private int tilesCount = 19; + private Array tiles; + private Array savedTiles; + private int tileIndex; + private VisScrollPane pane; + private boolean isBottomEdge; + + private TiledPlugin tiledPlugin; + private ResourcesManager resourcesManager; + + public GridTilesTab(TiledPanel panel, int tabIndex) { + super(panel, "Tiles", tabIndex); + + tiledPlugin = panel.tiledPlugin; + resourcesManager = tiledPlugin.pluginRM; + tiles = new Array<>(); + savedTiles = tiledPlugin.dataToSave.getTiles(); + tileIndex = savedTiles.size; + } + + @Override + public void initView() { + if (isDrop = savedTiles.size == 0) { + VisImageButton.VisImageButtonStyle dropBoxStyle = new VisImageButton.VisImageButtonStyle(); + dropBoxStyle.up = new TextureRegionDrawable(resourcesManager.getTextureRegion("tiles-drop-here-normal")); + dropBoxStyle.imageOver = new TextureRegionDrawable(resourcesManager.getTextureRegion("tiles-drop-here-over")); + VisImageButton dropRegion = new VisImageButton(dropBoxStyle); + content.clear(); + content.add(dropRegion) + .center() + .padRight(6) + .padBottom(6) + .padTop(10) + .row(); + content.add(new VisLabel("Drop an image from resources box")) + .expandX() + .center() + .padBottom(5); + content.pack(); + } else { + if (tileIndex > tilesCount) { + tilesCount = tileIndex; + } + initTiles(); + } + } + + public void addTile(String tileName) { + if (pane != null) isBottomEdge = pane.isBottomEdge(); + if (tileIndex == 0) { + setGridSizeToFirstTileSize(tileName); + isDrop = false; + panel.reInitTabTable(); + } + initTiles(tileName); + panel.pack(); + scrollTiles(); + tiles.get(tileIndex).setChecked(true); + tiledPlugin.facade.sendNotification(TiledPlugin.TILE_SELECTED, new TileVO(tileName)); + tileIndex++; + } + + public void selectTile(TileVO tileVO) { + tiledPlugin.setSelectedTileVO(tileVO); + } + + public void removeTile() { + if (pane != null) isBottomEdge = pane.isBottomEdge(); + tileIndex = --tileIndex < 0 ? 0 : tileIndex; + tilesCount = --tilesCount < 19 ? 19 : tilesCount; + tiles.clear(); + initView(); + } + + public void scrollTiles() { + if(savedTiles.size + 1 >= tilesCount) { + pane.layout(); + pane.setSmoothScrolling(!isBottomEdge); + pane.setScrollY(100); + } + } + + private void setGridSizeToFirstTileSize(String tileName) { + float gridWidth = resourcesManager.getTextureRegion(tileName).getRegionWidth() / tiledPlugin.getPixelToWorld(); + float gridHeight = resourcesManager.getTextureRegion(tileName).getRegionHeight() / tiledPlugin.getPixelToWorld(); + tiledPlugin.dataToSave.setGrid(gridWidth, gridHeight); + tiledPlugin.facade.sendNotification(TiledPlugin.GRID_CHANGED); + } + + private void initTiles(String tileName) { + content.clear(); + tiles.clear(); + + VisTable listTable = new VisTable(); + pane = new VisScrollPane(listTable); + content.add(pane) + .padTop(10); + listTable.top(); + + if(tileIndex >= tilesCount && !tileName.equals("")) { + tilesCount = tileIndex + 1; + } + + for (int i=0; i= savedTiles.size) return true; + + for (VisImageButton tile : tiles) { + if (tile.isChecked()) { + tile.setChecked(false); + } + } + + return true; + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + super.touchUp(event, x, y, pointer, button); + + if(button == Input.Buttons.RIGHT) { + tiledPlugin.facade.sendNotification(TiledPlugin.OPEN_DROP_DOWN, savedTiles.get(index).regionName); + return; + } + + if (index >= savedTiles.size) { + tiles.get(index).setChecked(false); + return; + } + + tiledPlugin.facade.sendNotification(TiledPlugin.TILE_SELECTED, savedTiles.get(index)); + } + }); + listTable.add(ct) + .width(40) + .height(40) + .pad(3); + if((i+1) % 4 == 0) { + listTable.row(); + } + tiles.add(ct); + } + + content.pack(); + } + + private void initTiles() { + initTiles(""); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/SettingsTab.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/SettingsTab.java new file mode 100644 index 00000000..3abd4d95 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/SettingsTab.java @@ -0,0 +1,74 @@ +package games.rednblack.editor.plugin.tiled.view.tabs; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.VisTextButton; +import games.rednblack.editor.plugin.tiled.TiledPanel; +import games.rednblack.editor.plugin.tiled.data.AttributeVO; +import games.rednblack.editor.plugin.tiled.data.CategoryVO; +import games.rednblack.editor.plugin.tiled.data.ParameterVO; +import games.rednblack.editor.plugin.tiled.view.Category; + +/** + * Created by mariam on 2/4/16. + */ +public class SettingsTab extends DefaultTab { + + private static final String CLASS_NAME = "com.overlap2d.plugins.tiled.view.tabs.SettingsTab"; + public static final String OK_BTN_CLICKED = CLASS_NAME+".OK_BTN_CLICKED"; + + private ParameterVO currentParameters; + private Category grid; + + public SettingsTab(TiledPanel panel, String tabTitle, int tabIndex) { + super(panel, tabTitle, tabIndex); + + currentParameters = panel.tiledPlugin.dataToSave.getParameterVO(); + } + + @Override + public void initView() { + Array gridAttributes = new Array<>(); + gridAttributes.add(new AttributeVO("Width", currentParameters.gridWidth)); + gridAttributes.add(new AttributeVO("Height", currentParameters.gridHeight)); + CategoryVO gridVO = new CategoryVO("Grid size: ", gridAttributes); + grid = new Category(gridVO); + content.add(grid) + .expandX() + .colspan(2) + .padTop(10) + .left() + .top() + .row(); + panel.tiledPlugin.dataToSave.setParameterVO(currentParameters); + + VisTextButton okBtn = new VisTextButton("Save"); + content.add(okBtn) + .width(70) + .pad(20) + .colspan(2) + .expandX() + .center() + .bottom() + .row(); + + okBtn.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); + + currentParameters.gridWidth = grid.getAttributeVO("Width: ").value; + currentParameters.gridHeight = grid.getAttributeVO("Height: ").value; + panel.facade.sendNotification(OK_BTN_CLICKED, currentParameters); + } + }); + } + + public void resetGridCategory() { + Array gridAttributes = new Array<>(); + gridAttributes.add(new AttributeVO("Width", currentParameters.gridWidth)); + gridAttributes.add(new AttributeVO("Height", currentParameters.gridHeight)); + grid.reInitView(gridAttributes); + } +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..e9c20eac --- /dev/null +++ b/settings.gradle @@ -0,0 +1,8 @@ +rootProject.name = 'HyperLap2D' +include 'hyperlap2d-runtime-libgdx' +include 'h2d-libgdx-spine-extension' +include 'hyperlap2d-common-api' +include 'plugin-performance' +include 'plugin-9patch' +include 'plugin-tiled' + diff --git a/src/main/java/games/rednblack/editor/CustomExceptionHandler.java b/src/main/java/games/rednblack/editor/CustomExceptionHandler.java new file mode 100644 index 00000000..36d43e78 --- /dev/null +++ b/src/main/java/games/rednblack/editor/CustomExceptionHandler.java @@ -0,0 +1,126 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor; + +import java.awt.EventQueue; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.HashMap; + +import javax.swing.JOptionPane; + +import org.apache.commons.lang3.SystemUtils; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Net.HttpMethods; +import com.badlogic.gdx.Net.HttpRequest; +import com.badlogic.gdx.Net.HttpResponse; +import com.badlogic.gdx.Net.HttpResponseListener; +import com.badlogic.gdx.net.HttpParametersUtils; +import games.rednblack.editor.utils.AppConfig; + + +public class CustomExceptionHandler implements UncaughtExceptionHandler { + + //private UncaughtExceptionHandler defaultUEH; + private final static String sendURL = "https://hyperlap.rednblack.games/error_report"; + + /* + * if any of the parameters is null, the respective functionality + * will not be used + */ + public CustomExceptionHandler() { + //this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); + } + + public static void showErrorDialog() { + new Thread(new Runnable() { + public void run() { + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + JOptionPane.showMessageDialog(null, "HyperLap2D just crashed, see stacktrace in hyperlog.txt file", "Error", JOptionPane.ERROR_MESSAGE); + } + + }); + } + }).start(); + } + + public static void sendError(String stacktrace) { + HashMap parameters = new HashMap(); + parameters.put("error", stacktrace); + parameters.put("system", SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION); + parameters.put("version", AppConfig.getInstance().version); + HttpRequest httpGet = new HttpRequest(HttpMethods.GET); + httpGet.setUrl(sendURL); + httpGet.setContent(HttpParametersUtils.convertHttpParameters(parameters)); + Gdx.net.sendHttpRequest(httpGet, new HttpResponseListener() { + public void handleHttpResponse(HttpResponse httpResponse) { + //showErrorDialog(); + } + + public void failed(Throwable t) { + + } + + @Override + public void cancelled() { + + } + }); + + + } + + public void uncaughtException(Thread t, Throwable e) { + final Writer result = new StringWriter(); + final PrintWriter printWriter = new PrintWriter(result); + e.printStackTrace(printWriter); + String stacktrace = result.toString(); + String filename = "hyperlog.txt"; + writeToFile(stacktrace, filename); + printWriter.close(); + + sendError(stacktrace); + + showErrorDialog(); + //defaultUEH.uncaughtException(t, e); + } + + private void writeToFile(String stacktrace, String filename) { + try { + //String localPath = DataManager.getMyDocumentsLocation(); + String localPath = "";//DataManager.getInstance().getRootPath(); + System.out.println(localPath + File.separator + filename); + BufferedWriter bos = new BufferedWriter(new FileWriter(localPath + File.separator + filename)); + bos.write(stacktrace); + bos.flush(); + bos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/games/rednblack/editor/HyperLap2D.java b/src/main/java/games/rednblack/editor/HyperLap2D.java new file mode 100644 index 00000000..45b81dc1 --- /dev/null +++ b/src/main/java/games/rednblack/editor/HyperLap2D.java @@ -0,0 +1,188 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Graphics; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.utils.Align; +import games.rednblack.editor.proxy.CommandManager; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.editor.view.frame.FileDropListener; +import games.rednblack.editor.view.ui.dialog.ImportDialog; +import games.rednblack.h2d.common.MsgAPI; +import com.kotcrab.vis.ui.VisUI; +import com.puremvc.patterns.proxy.Proxy; +import games.rednblack.editor.proxy.EditorTextureManager; +import org.lwjgl.BufferUtils; +import org.lwjgl.PointerBuffer; +import org.lwjgl.glfw.GLFWDropCallback; + +import org.lwjgl.glfw.GLFW; +import org.lwjgl.system.MemoryUtil; + +import java.nio.IntBuffer; + +public class HyperLap2D implements Proxy, ApplicationListener { + private static final String TAG = HyperLap2D.class.getCanonicalName(); + public static final String NAME = TAG; + + public EditorTextureManager textureManager; + private HyperLap2DFacade facade; + private Object data; + private boolean isStartup = false; + private AssetManager assetManager; + + public HyperLap2DFacade getFacade() { + return facade; + } + + private final Sync sync = new Sync(); + + public HyperLap2D() { + } + + @Override + public void create() { + isStartup = false; + assetManager = new AssetManager(); + assetManager.load("style/uiskin.json", Skin.class); + + facade = HyperLap2DFacade.getInstance(); + } + + private void startup() { + isStartup = true; + VisUI.load((Skin) assetManager.get("style/uiskin.json")); + VisUI.setDefaultTitleAlign(Align.center); + + facade.startup(this); + sendNotification(MsgAPI.CREATE); + facade.sendNotification(SplashScreenAdapter.CLOSE_SPLASH, "Initializing..."); + Lwjgl3Graphics graphics = (Lwjgl3Graphics)Gdx.graphics; + GLFW.glfwSetDropCallback(graphics.getWindow().getWindowHandle(), new GLFWDropCallback() { + @Override + public void invoke (long window, int count, long names) { + PointerBuffer nameBuffer = MemoryUtil.memPointerBuffer(names, count); + String[] filesPaths = new String[count]; + for (int i = 0; i < count; i++) { + String pathToObject = MemoryUtil.memUTF8(MemoryUtil.memByteBufferNT1(nameBuffer.get(i))); + filesPaths[i] = pathToObject; + } + + ImportDialog.DropBundle bundle = new ImportDialog.DropBundle(); + bundle.pos = new Vector2(Gdx.input.getX(), Gdx.input.getY()); + bundle.paths = filesPaths; + + facade.sendNotification(FileDropListener.ACTION_DROP, bundle); + } + }); + + IntBuffer w = BufferUtils.createIntBuffer(1); + IntBuffer h = BufferUtils.createIntBuffer(1); + GLFW.glfwGetWindowSize(graphics.getWindow().getWindowHandle(), w, h); + int width = w.get(0); + int height = h.get(0); + + sendNotification(MsgAPI.RESIZE, new int[]{width, height}); + } + + @Override + public void pause() { + sendNotification(MsgAPI.PAUSE); + } + + @Override + public void resume() { + sendNotification(MsgAPI.RESUME); + } + + @Override + public void render() { + if(!isStartup && assetManager.update()) { + startup(); + } else { + sync.sync(60); + sendNotification(MsgAPI.RENDER, Gdx.graphics.getDeltaTime()); + } + } + + @Override + public void resize(int width, int height) { + sendNotification(MsgAPI.RESIZE, new int[]{width, height}); + } + + @Override + public void dispose() { + sendNotification(MsgAPI.DISPOSE); + VisUI.dispose(); + facade.sendNotification(MsgAPI.APP_EXIT); + } + + @Override + public void sendNotification(String notificationName, Object body, String type) { + System.out.println("sendNotification: " + System.currentTimeMillis() + " " + type); + facade.sendNotification(notificationName, body, type); + } + + @Override + public void sendNotification(String notificationName, Object body) { + facade.sendNotification(notificationName, body); + } + + @Override + public void sendNotification(String notificationName) { + facade.sendNotification(notificationName); + } + + @Override + public String getProxyName() { + return NAME; + } + + @Override + public Object getData() { + return data; + } + + @Override + public void setData(Object data) { + this.data = data; + } + + @Override + public void onRegister() { + + } + + @Override + public void onRemove() { + + } + + public boolean hasUnsavedStuff() { + CommandManager commandManager = facade.retrieveProxy(CommandManager.NAME); + return commandManager.isModified(); + } + +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/HyperLap2DApp.java b/src/main/java/games/rednblack/editor/HyperLap2DApp.java new file mode 100644 index 00000000..799803c2 --- /dev/null +++ b/src/main/java/games/rednblack/editor/HyperLap2DApp.java @@ -0,0 +1,117 @@ +package games.rednblack.editor; + +import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowListener; +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.editor.utils.AppConfig; +import games.rednblack.h2d.common.MsgAPI; +import org.apache.commons.lang3.SystemUtils; +import org.lwjgl.glfw.GLFW; + +public class HyperLap2DApp extends ApplicationAdapter { + private static HyperLap2DApp sInstance = null; + + public static HyperLap2DApp initInstance(double width, double height) { + if (sInstance == null) { + sInstance = new HyperLap2DApp(width, height); + } + return sInstance; + } + + public static HyperLap2DApp getInstance() { + return sInstance; + } + + public HyperLap2D hyperlap2D; + public Lwjgl3Window splashWindow, mainWindow; + final private double windowWidth, windowHeight; + + private HyperLap2DApp(double width, double height) { + windowWidth = width; + windowHeight = height; + } + + @Override + public void create() { + Lwjgl3Application app = (Lwjgl3Application) Gdx.app; + + Lwjgl3ApplicationConfiguration config2 = new Lwjgl3ApplicationConfiguration(); + config2.setWindowedMode(467, 415); + config2.setTitle("HyperLap2D"); + config2.setResizable(false); + config2.setDecorated(false); + config2.useVsync(false); + config2.setIdleFPS(60); + config2.setWindowIcon("hyperlap_icon_96.png"); + + splashWindow = app.newWindow(new SplashScreenAdapter(), config2); + + hyperlap2D = new HyperLap2D(); + + Gdx.app.postRunnable(new Runnable() { + @Override + public void run() { + hyperlap2D = new HyperLap2D(); + + Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); + config.setTitle("HyperLap2D - Public Alpha v" + AppConfig.getInstance().version); + config.setResizable(true); + config.setWindowedMode((int) (windowWidth), (int) (windowHeight)); + config.setIdleFPS(60); + config.setInitialVisible(false); + config.setMaximized(true); + config.setWindowIcon("hyperlap_icon_96.png"); + if (SystemUtils.IS_OS_WINDOWS) + config.setWindowPosition(0, (int) (windowHeight * .04)); + + mainWindow = app.newWindow(hyperlap2D, config); + mainWindow.setWindowListener(new Lwjgl3WindowListener() { + @Override + public void created(Lwjgl3Window window) { + + } + + @Override + public void iconified(boolean isIconified) { + + } + + @Override + public void maximized(boolean isMaximized) { + + } + + @Override + public void focusLost() { + + } + + @Override + public void focusGained() { + + } + + @Override + public boolean closeRequested() { + hyperlap2D.sendNotification(MsgAPI.APP_EXIT); + return false; + } + + @Override + public void filesDropped(String[] files) { + + } + + @Override + public void refreshRequested() { + + } + }); + } + }); + } +} diff --git a/src/main/java/games/rednblack/editor/HyperLap2DFacade.java b/src/main/java/games/rednblack/editor/HyperLap2DFacade.java new file mode 100644 index 00000000..b529d94b --- /dev/null +++ b/src/main/java/games/rednblack/editor/HyperLap2DFacade.java @@ -0,0 +1,77 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor; + +import com.puremvc.patterns.facade.SimpleFacade; +import com.puremvc.patterns.observer.BaseNotification; +import games.rednblack.editor.controller.StartupCommand; +import games.rednblack.editor.splash.SplashMediator; + +/** + * Created by sargis on 3/30/15. + */ +public class HyperLap2DFacade extends SimpleFacade { + public static final String STARTUP = "startup"; + private static HyperLap2DFacade instance = null; + private HyperLap2D hyperlap2D; + + protected HyperLap2DFacade() { + super(); + } + + /** + * Facade Singleton Factory method + * + * @return The Singleton instance of the Facade + */ + public synchronized static HyperLap2DFacade getInstance() { + if (instance == null) { + instance = new HyperLap2DFacade(); + instance.registerMediator(new SplashMediator()); + } + return instance; + } + + public void startup(HyperLap2D hyperlap2D) { + this.hyperlap2D = hyperlap2D; + registerProxy(this.hyperlap2D); + notifyObservers(new BaseNotification(STARTUP, null, null)); + } + + @Override + protected void initializeFacade() { + super.initializeFacade(); + } + + @Override + protected void initializeController() { + super.initializeController(); + registerCommand(STARTUP, StartupCommand.class); + } + + @Override + protected void initializeModel() { + super.initializeModel(); + } + + @Override + protected void initializeView() { + super.initializeView(); + } +} diff --git a/src/main/java/games/rednblack/editor/Main.java b/src/main/java/games/rednblack/editor/Main.java new file mode 100644 index 00000000..a76dafcb --- /dev/null +++ b/src/main/java/games/rednblack/editor/Main.java @@ -0,0 +1,42 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor; + +import com.badlogic.gdx.Graphics; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; + +public class Main { + + public static void main(String[] argv) { + Graphics.DisplayMode dm = Lwjgl3ApplicationConfiguration.getDisplayMode(); + + Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); + config.setWindowedMode(467,415); + config.setResizable(false); + config.setDecorated(false); + config.setInitialVisible(false); + config.useVsync(false); + config.setIdleFPS(60); + config.setTitle("HyperLap2D"); + config.setWindowIcon("hyperlap_icon_96.png"); + + new Lwjgl3Application(HyperLap2DApp.initInstance(dm.width, dm.height), config); + } +} diff --git a/src/main/java/games/rednblack/editor/Sync.java b/src/main/java/games/rednblack/editor/Sync.java new file mode 100644 index 00000000..ac198388 --- /dev/null +++ b/src/main/java/games/rednblack/editor/Sync.java @@ -0,0 +1,147 @@ +package games.rednblack.editor; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * A highly accurate sync method that continually adapts to the system + * it runs on to provide reliable results. + * + * @author Riven + * @author kappaOne + */ +public class Sync { + + /** number of nano seconds in a second */ + private static final long NANOS_IN_SECOND = 1000L * 1000L * 1000L; + + /** The time to sleep/yield until the next frame */ + private long nextFrame = 0; + + /** whether the initialisation code has run */ + private boolean initialised = false; + + /** for calculating the averages the previous sleep/yield times are stored */ + private RunningAvg sleepDurations = new RunningAvg(10); + private RunningAvg yieldDurations = new RunningAvg(10); + + public Sync() { + + } + + /** + * An accurate sync method that will attempt to run at a constant frame rate. + * It should be called once every frame. + * + * @param fps - the desired frame rate, in frames per second + */ + public void sync(int fps) { + if (fps <= 0) return; + if (!initialised) initialise(); + + try { + // sleep until the average sleep time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > sleepDurations.avg(); t0 = t1) { + Thread.sleep(1); + sleepDurations.add((t1 = getTime()) - t0); // update average sleep time + } + + // slowly dampen sleep average if too high to avoid yielding too much + sleepDurations.dampenForLowResTicker(); + + // yield until the average yield time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > yieldDurations.avg(); t0 = t1) { + Thread.yield(); + yieldDurations.add((t1 = getTime()) - t0); // update average yield time + } + } catch (InterruptedException e) { + + } + + // schedule next frame, drop frame(s) if already too late for next frame + nextFrame = Math.max(nextFrame + NANOS_IN_SECOND / fps, getTime()); + } + + /** + * This method will initialise the sync method by setting initial + * values for sleepDurations/yieldDurations and nextFrame. + * + * If running on windows it will start the sleep timer fix. + */ + private void initialise() { + initialised = true; + + sleepDurations.init(1000 * 1000); + yieldDurations.init((int) (-(getTime() - getTime()) * 1.333)); + + nextFrame = getTime(); + + String osName = System.getProperty("os.name"); + + if (osName.startsWith("Win")) { + // On windows the sleep functions can be highly inaccurate by + // over 10ms making in unusable. However it can be forced to + // be a bit more accurate by running a separate sleeping daemon + // thread. + Thread timerAccuracyThread = new Thread(new Runnable() { + public void run() { + try { + Thread.sleep(Long.MAX_VALUE); + } catch (Exception e) {} + } + }); + + timerAccuracyThread.setName("LWJGL3 Timer"); + timerAccuracyThread.setDaemon(true); + timerAccuracyThread.start(); + } + } + + /** + * Get the system time in nano seconds + * + * @return will return the current time in nano's + */ + private long getTime() { + return (long)(glfwGetTime() * NANOS_IN_SECOND); + } + + private class RunningAvg { + private final long[] slots; + private int offset; + + private static final long DAMPEN_THRESHOLD = 10 * 1000L * 1000L; // 10ms + private static final float DAMPEN_FACTOR = 0.9f; // don't change: 0.9f is exactly right! + + public RunningAvg(int slotCount) { + this.slots = new long[slotCount]; + this.offset = 0; + } + + public void init(long value) { + while (this.offset < this.slots.length) { + this.slots[this.offset++] = value; + } + } + + public void add(long value) { + this.slots[this.offset++ % this.slots.length] = value; + this.offset %= this.slots.length; + } + + public long avg() { + long sum = 0; + for (int i = 0; i < this.slots.length; i++) { + sum += this.slots[i]; + } + return sum / this.slots.length; + } + + public void dampenForLowResTicker() { + if (this.avg() > DAMPEN_THRESHOLD) { + for (int i = 0; i < this.slots.length; i++) { + this.slots[i] *= DAMPEN_FACTOR; + } + } + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapCommand.java b/src/main/java/games/rednblack/editor/controller/BootstrapCommand.java new file mode 100644 index 00000000..01b0dadb --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/BootstrapCommand.java @@ -0,0 +1,93 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import games.rednblack.editor.controller.commands.component.*; +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.h2d.common.MsgAPI; +import com.puremvc.patterns.command.SimpleCommand; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.*; +import games.rednblack.editor.controller.commands.resource.*; + +/** + * Created by azakhary on 4/28/2015. + */ +public class BootstrapCommand extends SimpleCommand { + + public void execute(Notification notification) { + super.execute(notification); + facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(SplashScreenAdapter.UPDATE_SPLASH, "Loading Commands..."); + + facade.registerCommand(MsgAPI.ACTION_CUT, CutItemsCommand.class); + facade.registerCommand(MsgAPI.ACTION_COPY, CopyItemsCommand.class); + facade.registerCommand(MsgAPI.ACTION_PASTE, PasteItemsCommand.class); + facade.registerCommand(MsgAPI.ACTION_DELETE, DeleteItemsCommand.class); + facade.registerCommand(MsgAPI.ACTION_CREATE_ITEM, CreateItemCommand.class); + facade.registerCommand(MsgAPI.ACTION_CAMERA_CHANGE_COMPOSITE, CompositeCameraChangeCommand.class); + facade.registerCommand(MsgAPI.ACTION_CREATE_PRIMITIVE, CreatePrimitiveCommand.class); + + facade.registerCommand(MsgAPI.ACTION_DELETE_LAYER, DeleteLayerCommand.class); + facade.registerCommand(MsgAPI.ACTION_NEW_LAYER, NewLayerCommand.class); + facade.registerCommand(MsgAPI.ACTION_SWAP_LAYERS, LayerSwapCommand.class); + facade.registerCommand(MsgAPI.ACTION_RENAME_LAYER, RenameLayerCommand.class); + + facade.registerCommand(MsgAPI.ACTION_ADD_COMPONENT, AddComponentToItemCommand.class); + facade.registerCommand(MsgAPI.ACTION_REMOVE_COMPONENT, RemoveComponentFromItemCommand.class); + facade.registerCommand(MsgAPI.CUSTOM_VARIABLE_MODIFY, CustomVariableModifyCommand.class); + + facade.registerCommand(MsgAPI.ACTION_ITEMS_MOVE_TO, ItemsMoveCommand.class); + + facade.registerCommand(MsgAPI.ACTION_ITEM_AND_CHILDREN_TO, ItemChildrenTransformCommand.class); + + facade.registerCommand(MsgAPI.ACTION_ITEM_TRANSFORM_TO, ItemTransformCommand.class); + facade.registerCommand(MsgAPI.ACTION_ADD_TO_LIBRARY, AddToLibraryCommand.class); + facade.registerCommand(MsgAPI.ACTION_CONVERT_TO_BUTTON, ConvertToButtonCommand.class); + facade.registerCommand(MsgAPI.ACTION_GROUP_ITEMS, ConvertToCompositeCommand.class); + + facade.registerCommand(MsgAPI.ACTION_SET_SELECTION, SetSelectionCommand.class); + facade.registerCommand(MsgAPI.ACTION_ADD_SELECTION, AddSelectionCommand.class); + facade.registerCommand(MsgAPI.ACTION_RELEASE_SELECTION, ReleaseSelectionCommand.class); + + facade.registerCommand(MsgAPI.ACTION_UPDATE_RULER_POSITION, ChangeRulerPositionCommand.class); + // DATA MODIFY by components + facade.registerCommand(MsgAPI.ACTION_UPDATE_ITEM_DATA, UpdateEntityComponentsCommand.class); + facade.registerCommand(MsgAPI.ACTION_UPDATE_LABEL_DATA, UpdateLabelDataCommand.class); + facade.registerCommand(MsgAPI.ACTION_UPDATE_LIGHT_DATA, UpdateLightDataCommand.class); + facade.registerCommand(MsgAPI.ACTION_UPDATE_BODY_LIGHT_DATA, UpdateLightBodyDataCommand.class); + facade.registerCommand(MsgAPI.ACTION_UPDATE_SPRITE_ANIMATION_DATA, UpdateSpriteAnimationDataCommand.class); + + facade.registerCommand(MsgAPI.ACTION_UPDATE_MESH_DATA, UpdatePolygonComponentCommand.class); + + facade.registerCommand(MsgAPI.ACTION_EXPORT_PROJECT, ExportProjectCommand.class); + facade.registerCommand(MsgAPI.SAVE_EXPORT_PATH, SaveExportPathCommand.class); + + facade.registerCommand(MsgAPI.ACTION_PLUGIN_PROXY_COMMAND, PluginItemCommand.class); + + // Resources + facade.registerCommand(MsgAPI.ACTION_DELETE_IMAGE_RESOURCE, DeleteImageResource.class); + facade.registerCommand(MsgAPI.ACTION_DELETE_LIBRARY_ITEM, DeleteLibraryItem.class); + facade.registerCommand(MsgAPI.ACTION_DELETE_PARTICLE_EFFECT, DeleteParticleEffect.class); + facade.registerCommand(MsgAPI.ACTION_DELETE_SPINE_ANIMATION_RESOURCE, DeleteSpineAnimation.class); + facade.registerCommand(MsgAPI.ACTION_DELETE_SPRITE_ANIMATION_RESOURCE, DeleteSpriteAnimation.class); + facade.registerCommand(MsgAPI.ACTION_DELETE_SPRITER_ANIMATION_RESOURCE, DeleteSpriterAnimation.class); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapPlugins.java b/src/main/java/games/rednblack/editor/controller/BootstrapPlugins.java new file mode 100644 index 00000000..f1bfa6a5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/BootstrapPlugins.java @@ -0,0 +1,68 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.h2d.common.plugins.H2DPlugin; +import com.puremvc.patterns.command.SimpleCommand; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.PluginManager; +import games.rednblack.editor.proxy.ProjectManager; +import net.mountainblade.modular.Module; +import net.mountainblade.modular.ModuleManager; +import net.mountainblade.modular.impl.DefaultModuleManager; + +import java.io.File; +import java.util.Collection; + + +/** + * Created by azakhary on 7/24/2015. + */ +public class BootstrapPlugins extends SimpleCommand { + + public void execute(Notification notification) { + super.execute(notification); + facade = HyperLap2DFacade.getInstance(); + + facade.sendNotification(SplashScreenAdapter.UPDATE_SPLASH, "Loading Plugins..."); + + PluginManager pluginManager = new PluginManager(); + facade.registerProxy(pluginManager); + + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + File pluginDir = new File(projectManager.getRootPath() + File.separator + "plugins"); + + ModuleManager manager = new DefaultModuleManager(); + Collection loadedPlugins = manager.loadModules(pluginDir); + + pluginManager.setPluginDir(pluginDir.getAbsolutePath()); + System.out.println(pluginDir.getAbsolutePath()); + System.out.println(loadedPlugins.size()); + + for(Module module: loadedPlugins) { + try { + pluginManager.initPlugin((H2DPlugin) module.getClass().newInstance()); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapProxyCommand.java b/src/main/java/games/rednblack/editor/controller/BootstrapProxyCommand.java new file mode 100644 index 00000000..389b35e1 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/BootstrapProxyCommand.java @@ -0,0 +1,53 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import com.puremvc.patterns.command.SimpleCommand; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.CommandManager; +import games.rednblack.editor.proxy.CursorManager; +import games.rednblack.editor.proxy.EditorTextureManager; +import games.rednblack.editor.proxy.FontManager; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.proxy.ResolutionManager; +import games.rednblack.editor.proxy.ResourceManager; +import games.rednblack.editor.proxy.SceneDataManager; +import games.rednblack.editor.splash.SplashScreenAdapter; + +/** + * Created by sargis on 4/1/15. + */ +public class BootstrapProxyCommand extends SimpleCommand { + @Override + public void execute(Notification notification) { + super.execute(notification); + facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(SplashScreenAdapter.UPDATE_SPLASH, "Loading Proxies..."); + + facade.registerProxy(new FontManager()); + facade.registerProxy(new CommandManager()); + facade.registerProxy(new CursorManager()); + facade.registerProxy(new ProjectManager()); + facade.registerProxy(new ResolutionManager()); + facade.registerProxy(new SceneDataManager()); + facade.registerProxy(new EditorTextureManager()); + facade.registerProxy(new ResourceManager()); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java new file mode 100644 index 00000000..5555a16c --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java @@ -0,0 +1,89 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import com.puremvc.patterns.command.SimpleCommand; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.editor.view.ui.FollowersUIMediator; +import games.rednblack.editor.view.menu.HyperLap2DMenuBarMediator; +import games.rednblack.editor.view.HyperLap2DScreenMediator; +import games.rednblack.editor.view.stage.SandboxMediator; +import games.rednblack.editor.view.stage.UIStageMediator; +import games.rednblack.editor.view.ui.RulersUIMediator; +import games.rednblack.editor.view.ui.UIDropDownMenuMediator; +import games.rednblack.editor.view.ui.box.UIAlignBoxMediator; +import games.rednblack.editor.view.ui.box.UICompositeHierarchyMediator; +import games.rednblack.editor.view.ui.box.UIGridBoxMediator; +import games.rednblack.editor.view.ui.box.UIItemsTreeBoxMediator; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; +import games.rednblack.editor.view.ui.box.UIMultiPropertyBoxMediator; +import games.rednblack.editor.view.ui.box.UIResolutionBoxMediator; +import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; +import games.rednblack.editor.view.ui.box.UIToolBoxMediator; +import games.rednblack.editor.view.ui.box.UIZoomBoxMediator; +import games.rednblack.editor.view.ui.dialog.*; +import games.rednblack.editor.view.ui.panel.CustomVariablesPanelMediator; +import games.rednblack.editor.view.ui.panel.EditSpriteAnimationPanelMediator; +import games.rednblack.editor.view.ui.panel.TagsPanelMediator; + +/** + * Created by sargis on 4/1/15. + */ +public class BootstrapViewCommand extends SimpleCommand { + @Override + public void execute(Notification notification) { + super.execute(notification); + facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(SplashScreenAdapter.UPDATE_SPLASH, "Loading Views..."); + + facade.registerMediator(new HyperLap2DScreenMediator()); + facade.registerMediator(new HyperLap2DMenuBarMediator()); + facade.registerMediator(new UICompositeHierarchyMediator()); + facade.registerMediator(new UIGridBoxMediator()); + facade.registerMediator(new UIResolutionBoxMediator()); + facade.registerMediator(new UIZoomBoxMediator()); + facade.registerMediator(new UIToolBoxMediator()); + + // Dialogs + facade.registerMediator(new NewProjectDialogMediator()); + facade.registerMediator(new ImportDialogMediator()); + facade.registerMediator(new ExportSettingsDialogMediator()); + facade.registerMediator(new CreateNewResolutionDialogMediator()); + facade.registerMediator(new CustomVariablesPanelMediator()); + facade.registerMediator(new TagsPanelMediator()); + facade.registerMediator(new EditSpriteAnimationPanelMediator()); + facade.registerMediator(new AboutDialogMediator()); + + facade.registerMediator(new RulersUIMediator()); + facade.registerMediator(new FollowersUIMediator()); + + facade.registerMediator(new UIAlignBoxMediator()); + facade.registerMediator(new UIItemsTreeBoxMediator()); + facade.registerMediator(new UIMultiPropertyBoxMediator()); + facade.registerMediator(new UILayerBoxMediator()); + facade.registerMediator(new UIResourcesBoxMediator()); + facade.registerMediator(new UIStageMediator()); + facade.registerMediator(new SandboxMediator()); + facade.registerMediator(new UIDropDownMenuMediator()); + + facade.registerMediator(new SaveDocumentDialogMediator()); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/SandboxCommand.java b/src/main/java/games/rednblack/editor/controller/SandboxCommand.java new file mode 100644 index 00000000..9c7a399a --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/SandboxCommand.java @@ -0,0 +1,36 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import com.puremvc.patterns.command.SimpleCommand; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/28/2015. + */ +public class SandboxCommand extends SimpleCommand { + + protected Sandbox sandbox; + + public SandboxCommand() { + sandbox = Sandbox.getInstance(); + facade = HyperLap2DFacade.getInstance(); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/StartupCommand.java b/src/main/java/games/rednblack/editor/controller/StartupCommand.java new file mode 100644 index 00000000..79b6647c --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/StartupCommand.java @@ -0,0 +1,36 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller; + +import com.puremvc.patterns.command.MacroCommand; + +/** + * Created by sargis on 3/30/15. + */ +public class StartupCommand extends MacroCommand { + @Override + protected void initializeMacroCommand() { + super.initializeMacroCommand(); + + addSubCommand(BootstrapProxyCommand.class); + addSubCommand(BootstrapViewCommand.class); + addSubCommand(BootstrapCommand.class); + addSubCommand(BootstrapPlugins.class); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/AddComponentToItemCommand.java b/src/main/java/games/rednblack/editor/controller/commands/AddComponentToItemCommand.java new file mode 100644 index 00000000..33326d30 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/AddComponentToItemCommand.java @@ -0,0 +1,49 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by CyberJoe on 7/2/2015. + */ +public class AddComponentToItemCommand extends EntityModifyRevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.AddComponentToItemCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Entity entity; + private Component component; + + private void collectData() { + Object[] payload = getNotification().getBody(); + entity = (Entity) payload[0]; + component = (Component) payload[1]; + } + + @Override + public void doAction() { + collectData(); + + entity.add(component); + + HyperLap2DFacade.getInstance().sendNotification(DONE, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + entity.remove(component.getClass()); + + HyperLap2DFacade.getInstance().sendNotification(DONE, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + public static Object[] payload(Entity entity, Component component) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = component; + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/AddSelectionCommand.java b/src/main/java/games/rednblack/editor/controller/commands/AddSelectionCommand.java new file mode 100644 index 00000000..35761ae5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/AddSelectionCommand.java @@ -0,0 +1,57 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import java.util.Set; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 5/14/2015. + */ +public class AddSelectionCommand extends RevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.AddSelectionCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Array entityIds; + + @Override + public void doAction() { + if(entityIds == null) { + Set items = getNotification().getBody(); + entityIds = EntityUtils.getEntityId(items); + } + + Set items = EntityUtils.getByUniqueId(entityIds); + Sandbox.getInstance().getSelector().addSelections(items); + facade.sendNotification(DONE); + } + + @Override + public void undoAction() { + Set items = EntityUtils.getByUniqueId(entityIds); + Sandbox.getInstance().getSelector().releaseSelections(items); + facade.sendNotification(DONE); + } + +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java b/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java new file mode 100644 index 00000000..6bf9a0e7 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java @@ -0,0 +1,111 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashMap; + +/** + * Created by azakhary on 4/28/2015. + */ +public class AddToLibraryCommand extends RevertableCommand { + + private String createdLibraryItemName; + private CompositeItemVO overwritten; + private String prevName; + private Integer entityId; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + + Entity item = ((Entity) payload[0]); + entityId = EntityUtils.getEntityId(item); + createdLibraryItemName = (String) payload[1]; + + MainItemComponent mainItemComponent = ComponentRetriever.get(item, MainItemComponent.class); + + if(createdLibraryItemName.length() > 0) { + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; + + if (libraryItems.containsKey(createdLibraryItemName)) { + overwritten = libraryItems.get(createdLibraryItemName); + } + + CompositeItemVO newVO = new CompositeItemVO(); + newVO.loadFromEntity(item); + newVO.cleanIds(); + libraryItems.put(createdLibraryItemName, newVO); + + //mark this entity as belonging to library + mainItemComponent.libraryLink = createdLibraryItemName; + facade.sendNotification(MsgAPI.LIBRARY_LIST_UPDATED); + } else { + prevName = mainItemComponent.libraryLink; + // unlink it + mainItemComponent.libraryLink = ""; + } + facade.sendNotification(MsgAPI.ITEM_DATA_UPDATED); + } + + @Override + public void undoAction() { + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; + + if(createdLibraryItemName.length() > 0) { + libraryItems.remove(createdLibraryItemName); + + if (overwritten != null) { + libraryItems.put(createdLibraryItemName, overwritten); + } + facade.sendNotification(MsgAPI.LIBRARY_LIST_UPDATED); + } else { + Entity entity = EntityUtils.getByUniqueId(entityId); + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.libraryLink = prevName; + facade.sendNotification(MsgAPI.ITEM_DATA_UPDATED); + } + } + + public static Object payloadUnLink(Entity entity) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = ""; + + return payload; + } + + public static Object payloadLink(Entity entity, String link) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = link; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ChangeRulerPositionCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ChangeRulerPositionCommand.java new file mode 100644 index 00000000..6ec8351b --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ChangeRulerPositionCommand.java @@ -0,0 +1,56 @@ +package games.rednblack.editor.controller.commands; + +import com.kotcrab.vis.ui.util.InputValidator; +import com.kotcrab.vis.ui.util.dialog.Dialogs; +import com.kotcrab.vis.ui.util.dialog.InputDialogListener; +import games.rednblack.editor.utils.Guide; +import games.rednblack.editor.view.ui.RulersUI; + +/** + * Created by billzo on 12/22/2015. + */ +public class ChangeRulerPositionCommand extends RevertableCommand { + + private float previousPosition; + private String direction; + + @Override + public void doAction() { + previousPosition = RulersUI.getPreviousGuide().pos; + direction = RulersUI.getPreviousGuide().isVertical ? "Y" : "X"; + + Dialogs.showInputDialog(sandbox.getUIStage(), "Manual " + direction + " Position", direction + " : ", new MyInputValidator(), new InputDialogListener() { + @Override + public void finished(String input) { + RulersUI.updateGuideManually(Float.parseFloat(input)); + } + + @Override + public void canceled() { + + } + }); + } + + @Override + public void undoAction() { + System.out.println(previousPosition); + RulersUI.updateGuideManually(previousPosition); + } + + private class MyInputValidator implements InputValidator { + @Override + public boolean validateInput(String input) { + try + { + Float.parseFloat(input); + return true; + } catch (NumberFormatException ex) + { + return false; + } + } + + } + +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CompositeCameraChangeCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CompositeCameraChangeCommand.java new file mode 100644 index 00000000..3f3a1bf3 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CompositeCameraChangeCommand.java @@ -0,0 +1,89 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ViewPortComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 4/28/2015. + */ +public class CompositeCameraChangeCommand extends RevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.CompositeCameraChangeCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Integer previousViewEntityId; + private Integer enteringInto; + + private boolean wasPrevSelected = false; + + @Override + public void doAction() { + Entity entity = getNotification().getBody(); + Entity oldEntity = sandbox.getCurrentViewingEntity(); + + // check if entity is selected + wasPrevSelected = sandbox.getSelector().isSelected(entity); + + if(enteringInto == null) enteringInto = EntityUtils.getEntityId(entity); + if(previousViewEntityId == null) previousViewEntityId = EntityUtils.getEntityId(oldEntity); + + ViewPortComponent viewPortComponent = ComponentRetriever.get(oldEntity, ViewPortComponent.class); + oldEntity.remove(ViewPortComponent.class); + entity.add(viewPortComponent); + sandbox.setCurrentViewingEntity(entity); + + sandbox.getSelector().clearSelections(); + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + TransformComponent previousTransformComponent = ComponentRetriever.get(oldEntity, TransformComponent.class); + previousTransformComponent.enableTransform(); + transformComponent.disableTransform(); + + facade.sendNotification(DONE, enteringInto); + facade.sendNotification(MsgAPI.EMPTY_SPACE_CLICKED); + } + + @Override + public void undoAction() { + Entity oldEntity = EntityUtils.getByUniqueId(previousViewEntityId); + Entity currEntity = sandbox.getCurrentViewingEntity(); + + ViewPortComponent viewPortComponent = ComponentRetriever.get(currEntity, ViewPortComponent.class); + currEntity.remove(ViewPortComponent.class); + oldEntity.add(viewPortComponent); + sandbox.setCurrentViewingEntity(oldEntity); + + facade.sendNotification(DONE, previousViewEntityId); + + TransformComponent transformComponent = ComponentRetriever.get(currEntity, TransformComponent.class); + TransformComponent previousTransformComponent = ComponentRetriever.get(oldEntity, TransformComponent.class); + previousTransformComponent.disableTransform(); + transformComponent.enableTransform(); + + if(wasPrevSelected) { + sandbox.getSelector().setSelection(EntityUtils.getByUniqueId(enteringInto), true); + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ConvertToButtonCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ConvertToButtonCommand.java new file mode 100644 index 00000000..262f2800 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ConvertToButtonCommand.java @@ -0,0 +1,67 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.additional.ButtonComponent; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashSet; + +/** + * Created by azakhary on 4/28/2015. + */ +public class ConvertToButtonCommand extends ConvertToCompositeCommand { + + + @Override + public void doAction() { + Entity entity; + + HashSet entities = (HashSet) sandbox.getSelector().getSelectedItems(); + Entity item = entities.iterator().next(); + + if(entities.size() == 1 && EntityUtils.getType(item) == EntityFactory.COMPOSITE_TYPE) { + entity = item; + } else { + super.doAction(); + entity = EntityUtils.getByUniqueId(entityId); + } + + //create layers + LayerMapComponent layerMapComponent = ComponentRetriever.get(entity, LayerMapComponent.class); + layerMapComponent.addLayer(new LayerItemVO("normal")); + layerMapComponent.addLayer(new LayerItemVO("pressed")); + + // adding button logic + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.tags.add("button"); + entity.add(new ButtonComponent()); + } + + @Override + public void undoAction() { + super.undoAction(); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java new file mode 100644 index 00000000..aa7399a6 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ConvertToCompositeCommand.java @@ -0,0 +1,142 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.factory.ItemFactory; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.ui.FollowersUIMediator; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; + +import java.util.HashMap; +import java.util.HashSet; + +/** + * Created by azakhary on 4/28/2015. + */ +public class ConvertToCompositeCommand extends EntityModifyRevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.ConvertToCompositeCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + protected Integer entityId; + protected Integer parentEntityId; + + protected HashMap layersBackup; + + @Override + public void doAction() { + // get entity list + HashSet entities = (HashSet) sandbox.getSelector().getSelectedItems(); + UILayerBoxMediator layerBoxMediator = facade.retrieveMediator(UILayerBoxMediator.NAME); + + if(layersBackup == null) { + // backup layer data + layersBackup = new HashMap<>(); + for(Entity entity: entities) { + ZIndexComponent zIndexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + int tmpId = EntityUtils.getEntityId(entity); + layersBackup.put(tmpId, zIndexComponent.layerName); + } + } + + // what will be the position of new composite? + Vector2 position = EntityUtils.getLeftBottomPoint(entities); + + //create new entity + Entity entity = ItemFactory.get().createCompositeItem(position); + entityId = EntityUtils.getEntityId(entity); + sandbox.getEngine().addEntity(entity); + + // what was the parent component of entities + parentEntityId = EntityUtils.getEntityId(sandbox.getCurrentViewingEntity()); + + // rebase children + EntityUtils.changeParent(entities, entity); + + //reposition children + for(Entity childEntity: entities) { + TransformComponent transformComponent = ComponentRetriever.get(childEntity, TransformComponent.class); + transformComponent.x -= position.x; + transformComponent.y -=position.y; + + // put it on default layer + ZIndexComponent zIndexComponent = ComponentRetriever.get(childEntity, ZIndexComponent.class); + zIndexComponent.layerName = "Default"; + + } + // recalculate composite size + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + Vector2 newSize = EntityUtils.getRightTopPoint(entities); + dimensionsComponent.width = newSize.x; + dimensionsComponent.height = newSize.y; + dimensionsComponent.boundBox.set(0, 0, newSize.x, newSize.y); + + ZIndexComponent zIndexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + zIndexComponent.layerName = layerBoxMediator.getCurrentSelectedLayerName(); + + //let everyone know + HyperLap2DFacade.getInstance().sendNotification(DONE); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.NEW_ITEM_ADDED, entity); + sandbox.getSelector().setSelection(entity, true); + + } + + @Override + public void undoAction() { + FollowersUIMediator followersUIMediator = HyperLap2DFacade.getInstance().retrieveMediator(FollowersUIMediator.NAME); + + //get the entity + Entity entity = EntityUtils.getByUniqueId(entityId); + Entity oldParentEntity = EntityUtils.getByUniqueId(parentEntityId); + HashSet children = EntityUtils.getChildren(entity); + + // what will be the position diff of children? + Vector2 positionDiff = EntityUtils.getPosition(entity); + + //rebase children back to root + EntityUtils.changeParent(children, oldParentEntity); + + //reposition children + for(Entity tmpEntity: children) { + TransformComponent transformComponent = ComponentRetriever.get(tmpEntity, TransformComponent.class); + transformComponent.x+=positionDiff.x; + transformComponent.y+=positionDiff.y; + + // put layer data back + ZIndexComponent zIndexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + zIndexComponent.layerName = layersBackup.get(EntityUtils.getEntityId(tmpEntity)); + } + + // remove composite + followersUIMediator.removeFollower(entity); + sandbox.getEngine().removeEntity(entity); + + HyperLap2DFacade.getInstance().sendNotification(DONE); + + sandbox.getSelector().setSelections(children, true); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CopyItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CopyItemsCommand.java new file mode 100644 index 00000000..67d0f549 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CopyItemsCommand.java @@ -0,0 +1,113 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import java.util.Set; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Json; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by azakhary on 4/28/2015. + */ +public class CopyItemsCommand extends RevertableCommand { + + @Override + public void doAction() { + String data = getJsonStringFromEntities(sandbox.getSelector().getSelectedItems()); + + Object[] payload = new Object[2]; + payload[0] = new Vector2(Sandbox.getInstance().getCamera().position.x,Sandbox.getInstance().getCamera().position.y); + payload[1] = data; + Sandbox.getInstance().copyToClipboard(payload); + } + + @Override + public void undoAction() { + // we do not restore clipboard at this time, as it is not a string but a reference, which honestly sucks ass + } + + public static String getJsonStringFromEntities(Set entities) { + CompositeVO holderComposite = new CompositeVO(); + for(Entity entity : entities) { + int entityType = ComponentRetriever.get(entity, MainItemComponent.class).entityType; + if(entityType == EntityFactory.COMPOSITE_TYPE) { + CompositeItemVO vo = new CompositeItemVO(); + vo.loadFromEntity(entity); + holderComposite.sComposites.add(vo); + } + if(entityType == EntityFactory.IMAGE_TYPE) { + SimpleImageVO vo = new SimpleImageVO(); + vo.loadFromEntity(entity); + holderComposite.sImages.add(vo); + } + if(entityType == EntityFactory.NINE_PATCH) { + Image9patchVO vo = new Image9patchVO(); + vo.loadFromEntity(entity); + holderComposite.sImage9patchs.add(vo); + } + if(entityType == EntityFactory.LABEL_TYPE) { + LabelVO vo = new LabelVO(); + vo.loadFromEntity(entity); + holderComposite.sLabels.add(vo); + } + if(entityType == EntityFactory.PARTICLE_TYPE) { + ParticleEffectVO vo = new ParticleEffectVO(); + vo.loadFromEntity(entity); + holderComposite.sParticleEffects.add(vo); + } + if(entityType == EntityFactory.SPRITE_TYPE) { + SpriteAnimationVO vo = new SpriteAnimationVO(); + vo.loadFromEntity(entity); + holderComposite.sSpriteAnimations.add(vo); + } + if(entityType == EntityFactory.SPRITER_TYPE) { + SpriterVO vo = new SpriterVO(); + vo.loadFromEntity(entity); + holderComposite.sSpriterAnimations.add(vo); + } + if(entityType == EntityFactory.SPINE_TYPE) { + SpineVO vo = new SpineVO(); + vo.loadFromEntity(entity); + holderComposite.sSpineAnimations.add(vo); + } + if(entityType == EntityFactory.COLOR_PRIMITIVE) { + ColorPrimitiveVO vo = new ColorPrimitiveVO(); + vo.loadFromEntity(entity); + holderComposite.sColorPrimitives.add(vo); + } + if(entityType == EntityFactory.LIGHT_TYPE) { + LightVO vo = new LightVO(); + vo.loadFromEntity(entity); + holderComposite.sLights.add(vo); + } + } + + Json json = new Json(); + String result = json.toJson(holderComposite); + + return result; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CreateItemCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CreateItemCommand.java new file mode 100644 index 00000000..2b89efdb --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CreateItemCommand.java @@ -0,0 +1,74 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.ui.FollowersUIMediator; + +import java.util.HashSet; + +/** + * Created by azakhary on 6/9/2015. + */ +public class CreateItemCommand extends EntityModifyRevertableCommand { + + private Integer entityId; + private Array previousSelectionIds; + + @Override + public void doAction() { + Entity entity = getNotification().getBody(); + + entityId = EntityUtils.getEntityId(entity); + + sandbox.getEngine().addEntity(entity); + + // z-index + NodeComponent nodeComponent = ComponentRetriever.get(Sandbox.getInstance().getCurrentViewingEntity(), NodeComponent.class); + ZIndexComponent zindexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + zindexComponent.setZIndex(nodeComponent.children.size); + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.NEW_ITEM_ADDED, entity); + + // select newly created item + // get current selection + HashSet previousSelection = new HashSet<>(Sandbox.getInstance().getSelector().getSelectedItems()); + previousSelectionIds = EntityUtils.getEntityId(previousSelection); + sandbox.getSelector().setSelection(entity, true); + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + + FollowersUIMediator followersUIMediator = HyperLap2DFacade.getInstance().retrieveMediator(FollowersUIMediator.NAME); + followersUIMediator.removeFollower(entity); + sandbox.getEngine().removeEntity(entity); + + Sandbox.getInstance().getSelector().setSelections(EntityUtils.getByUniqueId(previousSelectionIds), true); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CreatePrimitiveCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CreatePrimitiveCommand.java new file mode 100644 index 00000000..9d2d9f0f --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CreatePrimitiveCommand.java @@ -0,0 +1,43 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.factory.ItemFactory; +import games.rednblack.editor.renderer.data.ColorPrimitiveVO; +import games.rednblack.editor.renderer.data.ShapeVO; + +/** + * Created by azakhary on 10/21/2015. + */ +public class CreatePrimitiveCommand extends EntityModifyRevertableCommand { + + @Override + public void doAction() { + Vector2 position = new Vector2(0, 0); + ShapeVO shape = ShapeVO.createRect(100f / sandbox.getPixelPerWU(), 100f / sandbox.getPixelPerWU()); + + ItemFactory.get().createPrimitive(position, shape); + } + + @Override + public void undoAction() { + + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CustomVariableModifyCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CustomVariableModifyCommand.java new file mode 100644 index 00000000..9e7ea0c8 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CustomVariableModifyCommand.java @@ -0,0 +1,91 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.renderer.utils.CustomVariables; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by CyberJoe on 11/6/2015. + */ +public class CustomVariableModifyCommand extends EntityModifyRevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.CustomVariableModifyCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Integer entityId; + + private boolean isAdding; + private String key; + private String value; + + @Override + public void doAction() { + process(); + if(isAdding) { + addVariable(key, value); + } else { + removeVariable(key); + } + sendNotification(DONE); + } + + @Override + public void undoAction() { + if(isAdding) { + removeVariable(key); + } else { + addVariable(key, value); + } + sendNotification(DONE); + } + + private void addVariable(String key, String value) { + Entity entity = EntityUtils.getByUniqueId(entityId); + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.setCustomVars(key, value); + } + + private void removeVariable(String key) { + Entity entity = EntityUtils.getByUniqueId(entityId); + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + value = mainItemComponent.customVariables.getStringVariable(key); //storing the backup + mainItemComponent.removeCustomVars(key); + } + + private void process() { + if(entityId == null) { + // First time call, need to prepare the data and fetch payload + Object[] payload = getNotification().getBody(); + Entity item = (Entity) payload[0]; + entityId = EntityUtils.getEntityId(item); + key = (String) payload[2]; + isAdding = false; + if(((boolean) payload[1])) { + value = (String) payload[3]; + isAdding = true; + } + } + } + + public static Object addCustomVariable(Entity entity, String key, String value) { + Object[] payload = new Object[4]; + payload[0] = entity; + payload[1] = true; // is adding type + payload[2] = key; + payload[3] = value; + + return payload; + } + + public static Object removeCustomVariable(Entity entity, String key) { + Object[] payload = new Object[3]; + payload[0] = entity; + payload[1] = true; + payload[1] = false; // is adding type (removing) + payload[2] = key; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java new file mode 100644 index 00000000..27199842 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java @@ -0,0 +1,64 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Json; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.view.stage.Sandbox; + +import java.util.Set; + +/** + * Created by azakhary on 4/28/2015. + */ +public class CutItemsCommand extends EntityModifyRevertableCommand { + + private String backup; + + @Override + public void doAction() { + backup = CopyItemsCommand.getJsonStringFromEntities(sandbox.getSelector().getSelectedItems()); + String data = CopyItemsCommand.getJsonStringFromEntities(sandbox.getSelector().getSelectedItems()); + + Object[] payload = new Object[2]; + payload[0] = new Vector2(Sandbox.getInstance().getCamera().position.x,Sandbox.getInstance().getCamera().position.y); + payload[1] = data; + Sandbox.getInstance().copyToClipboard(payload); + sandbox.getSelector().removeCurrentSelectedItems(); + + facade.sendNotification(MsgAPI.DELETE_ITEMS_COMMAND_DONE); + } + + @Override + public void undoAction() { + Json json = new Json(); + CompositeVO compositeVO = json.fromJson(CompositeVO.class, backup); + Set newEntitiesList = PasteItemsCommand.createEntitiesFromVO(compositeVO); + + for (Entity entity : newEntitiesList) { + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.NEW_ITEM_ADDED, entity); + } + + sandbox.getSelector().setSelections(newEntitiesList, true); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java new file mode 100644 index 00000000..2f0a8035 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java @@ -0,0 +1,93 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.ui.FollowersUIMediator; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created by azakhary on 4/28/2015. + */ +public class DeleteItemsCommand extends EntityModifyRevertableCommand { + + private String backup; + private Array entityIdsToDelete; + + private void backup() { + Set entitySet = new HashSet<>(); + if(entityIdsToDelete == null) { + entityIdsToDelete = new Array<>(); + entitySet = sandbox.getSelector().getSelectedItems(); + for(Entity entity: entitySet) { + entityIdsToDelete.add(EntityUtils.getEntityId(entity)); + } + } else { + for(Integer entityId: entityIdsToDelete) { + entitySet.add(EntityUtils.getByUniqueId(entityId)); + } + } + + backup = CopyItemsCommand.getJsonStringFromEntities(entitySet); + } + + @Override + public void doAction() { + backup(); + + FollowersUIMediator followersUIMediator = HyperLap2DFacade.getInstance().retrieveMediator(FollowersUIMediator.NAME); + for (Integer entityId : entityIdsToDelete) { + Entity item = EntityUtils.getByUniqueId(entityId); + followersUIMediator.removeFollower(item); + sandbox.getEngine().removeEntity(item); + } + + sandbox.getSelector().getCurrentSelection().clear(); + + facade.sendNotification(MsgAPI.DELETE_ITEMS_COMMAND_DONE); + } + + @Override + public void undoAction() { + Json json = new Json(); + CompositeVO compositeVO = json.fromJson(CompositeVO.class, backup); + Set newEntitiesList = PasteItemsCommand.createEntitiesFromVO(compositeVO); + + for (Entity entity : newEntitiesList) { + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.NEW_ITEM_ADDED, entity); + } + + sandbox.getSelector().setSelections(newEntitiesList, true); + } + + public void setItemsToDelete(Set entities) { + entityIdsToDelete = new Array<>(); + for(Entity entity: entities) { + entityIdsToDelete.add(EntityUtils.getEntityId(entity)); + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java new file mode 100644 index 00000000..e6b613b0 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java @@ -0,0 +1,50 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by CyberJoe on 7/25/2015. + * This command marked as "atom" meaning it cannot be called outside the transaction + * TODO: make this an annotation + */ +public class DeleteLayerAtomCommand extends EntityModifyRevertableCommand { + + private String layerName; + + private LayerItemVO layerItemVO; + private int layerIndex; + + public DeleteLayerAtomCommand(String layerName) { + this.layerName = layerName; + } + + @Override + public void doAction() { + Entity viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + + + + if(layerMapComponent.getLayers().size() > 1) { + layerMapComponent.deleteLayer(layerName); + } else { + cancel(); + } + } + + @Override + public void undoAction() { + Entity viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + + layerMapComponent.addLayer(layerIndex, layerItemVO); + } + + public int getLayerIndex() { + return layerIndex; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerCommand.java b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerCommand.java new file mode 100644 index 00000000..3e7d95a7 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerCommand.java @@ -0,0 +1,58 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created by CyberJoe on 7/25/2015. + */ +public class DeleteLayerCommand extends TransactiveCommand { + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.DeleteLayerCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + public static final String UNDONE = CLASS_NAME + "UNDONE"; + + private String layerName; + private DeleteLayerAtomCommand deleteLayerAtomCommand; + + @Override + public void transaction() { + layerName = getNotification().getBody(); + deleteLayerAtomCommand = new DeleteLayerAtomCommand(layerName); + addInnerCommand(deleteLayerAtomCommand); + DeleteItemsCommand deleteItemsCommand = new DeleteItemsCommand(); + deleteItemsCommand.setItemsToDelete(getItemsByLayerName(layerName)); + addInnerCommand(deleteItemsCommand); + } + + @Override + public void onFinish() { + facade.sendNotification(DONE, deleteLayerAtomCommand.getLayerIndex()); + } + + @Override + public void onFinishUndo() { + facade.sendNotification(UNDONE, layerName); + } + + public Set getItemsByLayerName(String layerName) { + Set result = new HashSet<>(); + Entity viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); + NodeComponent nodeComponent = ComponentRetriever.get(viewingEntity, NodeComponent.class); + for(int i = 0; i < nodeComponent.children.size; i++) { + Entity child = nodeComponent.children.get(i); + ZIndexComponent zIndexComponent = ComponentRetriever.get(child, ZIndexComponent.class); + if(zIndexComponent.layerName.equals(layerName)) { + result.add(child); + } + } + + return result; + } + +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertableCommand.java b/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertableCommand.java new file mode 100644 index 00000000..56f6e239 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertableCommand.java @@ -0,0 +1,84 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashMap; + +/** + * Created by azakhary on 6/15/2015. + */ +public abstract class EntityModifyRevertableCommand extends RevertableCommand { + + @Override + public void callDoAction() { + super.callDoAction(); + postChange(); + } + @Override + public void callUndoAction() { + super.callUndoAction(); + postChange(); + } + + protected void postChange() { + Integer parentId = EntityUtils.getEntityId(sandbox.getCurrentViewingEntity()); + Entity entity = EntityUtils.getByUniqueId(parentId); + + // Update item library data if it was in library + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + String link = mainItemComponent.libraryLink; + + if(link != null && link.length() > 0) { + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; + if (libraryItems.containsKey(mainItemComponent.libraryLink)) { + CompositeItemVO itemVO = new CompositeItemVO(); + itemVO.loadFromEntity(entity); + itemVO.cleanIds(); + libraryItems.put(mainItemComponent.libraryLink, itemVO); + } + + Array linkedEntities = EntityUtils.getByLibraryLink(link); + for (Entity dependable : linkedEntities) { + if(dependable == entity) continue; + NodeComponent nodeComponent = ComponentRetriever.get(dependable, NodeComponent.class); + for(Entity child: nodeComponent.children) { + sandbox.getEngine().removeEntity(child); + } + nodeComponent.children.clear(); + + Engine engine = sandbox.getSceneControl().sceneLoader.engine; + EntityFactory factory = sandbox.getSceneControl().sceneLoader.entityFactory; + factory.initAllChildren(engine, dependable, libraryItems.get(link).composite); + } + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ExportProjectCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ExportProjectCommand.java new file mode 100644 index 00000000..80efee5f --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ExportProjectCommand.java @@ -0,0 +1,35 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.controller.SandboxCommand; +import games.rednblack.editor.proxy.ProjectManager; + +/** + * Created by azakhary on 11/3/2015. + */ +public class ExportProjectCommand extends SandboxCommand { @Override + public void execute(Notification notification) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.exportProject(); +} + + +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ItemChildrenTransformCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ItemChildrenTransformCommand.java new file mode 100644 index 00000000..3c8318bd --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ItemChildrenTransformCommand.java @@ -0,0 +1,126 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Sasun Poghosyan on 4/29/2016. + */ +public class ItemChildrenTransformCommand extends EntityModifyRevertableCommand { + + private HashMap prevPosMap = new HashMap<>(); + private HashMap parentPositionAndSizeMap = new HashMap<>(); + private Entity entity; + + private Vector2 prevLo; + + private void doActionOnParent() { + Array objects = getNotification().getBody(); + Object[] itemData = objects.get(0); + Entity entity = (Entity) itemData[0]; + Vector2 newPos = (Vector2) itemData[1]; + Vector2 newSize = (Vector2) itemData[2]; + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + Vector2 prevLocation = new Vector2(transformComponent.x, transformComponent.y); + Vector2 prevSize = new Vector2(dimensionsComponent.width, dimensionsComponent.height); + PositionSize positionSize = new PositionSize(prevLocation, prevSize); + this.parentPositionAndSizeMap.put(EntityUtils.getEntityId(entity), positionSize); + setState(transformComponent, newPos, dimensionsComponent, newSize); +// transformComponent.x = newPos.x; +// transformComponent.y = newPos.y; +// +// dimensionsComponent.width = newSize.x; +// dimensionsComponent.height = newSize.y; +// if (dimensionsComponent.boundBox != null) { +// dimensionsComponent.boundBox.width = newSize.x; +// dimensionsComponent.boundBox.height = newSize.y; +// } + } + + private void undoActionOnParent() { + Map.Entry entry = parentPositionAndSizeMap.entrySet().iterator().next(); + Integer entityUniqueId = entry.getKey(); + PositionSize positionSize = entry.getValue(); + Vector2 prevLocation = positionSize.position; + Vector2 prevSize = positionSize.size; + entity = EntityUtils.getByUniqueId(entityUniqueId); + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + setState(transformComponent, prevLocation, dimensionsComponent, prevSize); +// transformComponent.x = prevLocation.x; +// transformComponent.y = prevLocation.y; +// +// +// dimensionsComponent.width = prevSize.x; +// dimensionsComponent.height = prevSize.y; +// if (dimensionsComponent.boundBox != null) { +// dimensionsComponent.boundBox.width = prevSize.x; +// dimensionsComponent.boundBox.height = prevSize.y; +// } + } + + @Override + public void doAction() { + doActionOnParent(); + Array payload = notification.getBody(); + for (int i = 1; i < payload.size; i++) { + Object[] objectData = payload.get(i); + Entity entity = (Entity) objectData[0]; + Vector2 newPos = (Vector2) objectData[1]; + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + Vector2 prevPos = new Vector2(transformComponent.x, transformComponent.y); + prevPosMap.put(EntityUtils.getEntityId(entity), prevPos); +// EntityUtils.setPosition(entity, newPos); + transformComponent.x = newPos.x; + transformComponent.y = newPos.y; + } + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + undoActionOnParent(); + for (Map.Entry entry : prevPosMap.entrySet()) { + Integer entityUniqueId = entry.getKey(); + Vector2 oldPosition = entry.getValue(); + Entity entity = EntityUtils.getByUniqueId(entityUniqueId); + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.x = oldPosition.x; + transformComponent.y = oldPosition.y; + } + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + private void setState(TransformComponent tC, Vector2 position, DimensionsComponent dC, Vector2 size) { + tC.x = position.x; + tC.y = position.y; + dC.width = size.x; + dC.height = size.y; + if (dC.boundBox != null) { + dC.boundBox.width = size.x; + dC.boundBox.height = size.y; + } + } + + private class PositionSize { + Vector2 position; + Vector2 size; + + public PositionSize(Vector2 position, Vector2 size) { + this.position = position; + this.size = size; + } + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ItemTransformCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ItemTransformCommand.java new file mode 100644 index 00000000..647e3b9a --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ItemTransformCommand.java @@ -0,0 +1,77 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by Osman on 01.08.2015. + */ +public class ItemTransformCommand extends EntityModifyRevertableCommand { + + private Array payload; + + private Integer entityId; + + @Override + public void doAction() { + payload = getNotification().getBody(); + Entity entity = (Entity) payload.get(0); + Object[] newData = (Object[]) payload.get(2); + + entityId = EntityUtils.getEntityId(entity); + + Vector2 newPos = (Vector2) newData[0]; + Vector2 newSize = (Vector2) newData[1]; + Vector2 newScale = (Vector2) newData[2]; + Float newRotation = (Float) newData[3]; + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + + if(newPos != null) transformComponent.x = newPos.x; + if(newPos != null) transformComponent.y = newPos.y; + if(newSize != null) dimensionsComponent.width = newSize.x; + if(newSize != null) dimensionsComponent.height = newSize.y; + if(newScale != null) transformComponent.scaleX = newScale.x; + if(newScale != null) transformComponent.scaleY = newScale.y; + if(newRotation != null) transformComponent.rotation = newRotation; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + + Entity entity = EntityUtils.getByUniqueId(entityId); + Object[] prevData = (Object[]) payload.get(1); + + Vector2 prevPos = (Vector2) prevData[0]; + Vector2 prevSize = (Vector2) prevData[1]; + Vector2 prevScale = (Vector2) prevData[2]; + Float prevRotation = (Float) prevData[3]; + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + + transformComponent.x = prevPos.x; + transformComponent.y = prevPos.y; + dimensionsComponent.width = prevSize.x; + dimensionsComponent.height = prevSize.y; + if (dimensionsComponent.boundBox != null) { + dimensionsComponent.boundBox.width = dimensionsComponent.width; + dimensionsComponent.boundBox.height = dimensionsComponent.height; + } + transformComponent.scaleX = prevScale.x; + transformComponent.scaleY = prevScale.y; + transformComponent.rotation = prevRotation; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java new file mode 100644 index 00000000..fb77f76b --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ItemsMoveCommand.java @@ -0,0 +1,84 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by azakhary on 6/4/2015. + */ +public class ItemsMoveCommand extends EntityModifyRevertableCommand { + + private HashMap prevLocations = new HashMap<>(); + + @Override + public void doAction() { + + Array payload = getNotification().getBody(); + + for(int i = 0; i < payload.size; i++) { + Object[] itemData = payload.get(i); + + Entity entity = (Entity) itemData[0]; + Vector2 newLocation = (Vector2) itemData[1]; + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + + Vector2 prevLocation = new Vector2(transformComponent.x, transformComponent.y); + if(itemData.length > 2) { + prevLocation = (Vector2) itemData[2]; + } + prevLocations.put(EntityUtils.getEntityId(entity), prevLocation); + + transformComponent.x = newLocation.x; + transformComponent.y = newLocation.y; + + // pining UI to update current item properties tools + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + } + + @Override + public void undoAction() { + for (Map.Entry entry : prevLocations.entrySet()) { + Integer entityUniqueId = entry.getKey(); + Vector2 prevLocation = entry.getValue(); + + Entity entity = EntityUtils.getByUniqueId(entityUniqueId); + + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.x = prevLocation.x; + transformComponent.y = prevLocation.y; + + // pining UI to update current item properties tools + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/LayerSwapCommand.java b/src/main/java/games/rednblack/editor/controller/commands/LayerSwapCommand.java new file mode 100644 index 00000000..7f5947c1 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/LayerSwapCommand.java @@ -0,0 +1,68 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by azakhary on 8/18/2015. + */ +public class LayerSwapCommand extends EntityModifyRevertableCommand { + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.LayerSwapCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Integer entityId; + + private String sourceName; + private String targetName; + + private void backup() { + if(entityId == null) { + Object[] payload = getNotification().getBody(); + sourceName = (String) payload[0]; + targetName = (String) payload[1]; + entityId = EntityUtils.getEntityId(Sandbox.getInstance().getCurrentViewingEntity()); + } + } + + @Override + public void doAction() { + backup(); + + Entity viewingEntity = EntityUtils.getByUniqueId(entityId); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + layerMapComponent.swap(sourceName, targetName); + + facade.sendNotification(DONE); + + } + + @Override + public void undoAction() { + Entity viewingEntity = EntityUtils.getByUniqueId(entityId); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + layerMapComponent.swap(targetName, sourceName); + + facade.sendNotification(DONE); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/NewLayerCommand.java b/src/main/java/games/rednblack/editor/controller/commands/NewLayerCommand.java new file mode 100644 index 00000000..8e85abb3 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/NewLayerCommand.java @@ -0,0 +1,51 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by CyberJoe on 7/25/2015. + */ +public class NewLayerCommand extends EntityModifyRevertableCommand { + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.NewLayerCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private String layerName; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + int index = (int) payload[0]; + layerName = (String) payload[1]; + + Entity viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + + LayerItemVO vo = new LayerItemVO(layerName); + vo.isVisible = true; + layerMapComponent.addLayer(index, vo); + + facade.sendNotification(DONE, layerName); + } + + @Override + public void undoAction() { + Entity viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewingEntity, LayerMapComponent.class); + + layerMapComponent.deleteLayer(layerName); + + facade.sendNotification(DONE, layerName); + } + + public static Object[] payload(int index, String name) { + Object[] payload = new Object[2]; + payload[0] = index; + payload[1] = name; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/NonRevertibleCommand.java b/src/main/java/games/rednblack/editor/controller/commands/NonRevertibleCommand.java new file mode 100644 index 00000000..0db607dc --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/NonRevertibleCommand.java @@ -0,0 +1,45 @@ +package games.rednblack.editor.controller.commands; + +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.controller.SandboxCommand; +import games.rednblack.editor.proxy.CommandManager; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.data.CompositeItemVO; + +import java.util.HashMap; + +/** + * Created by azakhary on 11/29/2015. + */ +public abstract class NonRevertibleCommand extends SandboxCommand { + + protected CommandManager commandManager; + protected Notification notification; + + protected boolean isCancelled = false; + protected final HashMap libraryItems; + protected final ProjectManager projectManager; + + public NonRevertibleCommand() { + this.projectManager = facade.retrieveProxy(ProjectManager.NAME); + this.libraryItems = projectManager.getCurrentProjectInfoVO().libraryItems; + } + + @Override + public void execute(Notification notification) { + commandManager = facade.retrieveProxy(CommandManager.NAME); + this.notification = notification; + callDoAction(); + if (!isCancelled) commandManager.clearHistory(); + } + + public abstract void doAction(); + + public void callDoAction() { + doAction(); + } + + public void cancel() { + isCancelled = true; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java new file mode 100644 index 00000000..e05642c6 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java @@ -0,0 +1,159 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.ui.FollowersUIMediator; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by azakhary on 4/28/2015. + */ +public class PasteItemsCommand extends EntityModifyRevertableCommand { + + private Array pastedEntityIds = new Array<>(); + + @Override + public void doAction() { + Object[] payload = (Object[]) Sandbox.getInstance().retrieveFromClipboard(); + + UILayerBoxMediator layerBoxMediator = facade.retrieveMediator(UILayerBoxMediator.NAME); + if(layerBoxMediator.getCurrentSelectedLayerName() == null || payload == null) { + cancel(); + return; + } + + Vector2 cameraPrevPosition = (Vector2) payload[0]; + Vector2 cameraCurrPosition = new Vector2(Sandbox.getInstance().getCamera().position.x,Sandbox.getInstance().getCamera().position.y); + + Vector2 diff = cameraCurrPosition.sub(cameraPrevPosition); + + Json json = new Json(); + CompositeVO compositeVO = json.fromJson(CompositeVO.class, (String) payload[1]); + forceIdChange(compositeVO); + Set newEntitiesList = createEntitiesFromVO(compositeVO); + for (Entity entity : newEntitiesList) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.x += diff.x; + transformComponent.y += diff.y; + ZIndexComponent zIndexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); +// UILayerBoxMediator layerBoxMediator = facade.retrieveMediator(UILayerBoxMediator.NAME); + zIndexComponent.layerName = layerBoxMediator.getCurrentSelectedLayerName(); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.NEW_ITEM_ADDED, entity); + pastedEntityIds.add(EntityUtils.getEntityId(entity)); + } + sandbox.getSelector().setSelections(newEntitiesList, true); + } + + @Override + public void undoAction() { + FollowersUIMediator followersUIMediator = HyperLap2DFacade.getInstance().retrieveMediator(FollowersUIMediator.NAME); + for (Integer entityId : pastedEntityIds) { + Entity entity = EntityUtils.getByUniqueId(entityId); + followersUIMediator.removeFollower(entity); + sandbox.getEngine().removeEntity(entity); + } + } + + public static void forceIdChange(CompositeVO compositeVO) { + ArrayList items = compositeVO.getAllItems(); + for(MainItemVO item: items) { + item.uniqueId = -1; + } + } + + + public static Set createEntitiesFromVO(CompositeVO compositeVO) { + Set entities = new HashSet<>(); + + EntityFactory factory = Sandbox.getInstance().sceneControl.sceneLoader.entityFactory; + Entity parentEntity = Sandbox.getInstance().getCurrentViewingEntity(); + + for (int i = 0; i < compositeVO.sImages.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sImages.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sImage9patchs.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sImage9patchs.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sLabels.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sLabels.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sParticleEffects.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sParticleEffects.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sLights.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sLights.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sSpineAnimations.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sSpineAnimations.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sSpriteAnimations.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sSpriteAnimations.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sSpriterAnimations.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sSpriterAnimations.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sColorPrimitives.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sColorPrimitives.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + } + for (int i = 0; i < compositeVO.sComposites.size(); i++) { + Entity child = factory.createEntity(parentEntity, compositeVO.sComposites.get(i)); + Sandbox.getInstance().getEngine().addEntity(child); + entities.add(child); + factory.initAllChildren(Sandbox.getInstance().getEngine(), child, compositeVO.sComposites.get(i).composite); + } + + return entities; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/PluginItemCommand.java b/src/main/java/games/rednblack/editor/controller/commands/PluginItemCommand.java new file mode 100644 index 00000000..d6c04886 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/PluginItemCommand.java @@ -0,0 +1,53 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import games.rednblack.h2d.common.IItemCommand; + +/** + * Created by azakhary on 10/23/2015. + */ +public class PluginItemCommand extends EntityModifyRevertableCommand { + + private IItemCommand command; + private Object body; + + @Override + public void doAction() { + if(command == null) { + Object[] payload = notification.getBody(); + command = (IItemCommand) payload[0]; + body = payload[1]; + } + + command.doAction(body); + } + + @Override + public void undoAction() { + command.undoAction(body); + } + + public static Object build(IItemCommand command, Object body) { + Object[] payload = new Object[2]; + payload[0] = command; + payload[1] = body; + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/ReleaseSelectionCommand.java b/src/main/java/games/rednblack/editor/controller/commands/ReleaseSelectionCommand.java new file mode 100644 index 00000000..136c79c1 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/ReleaseSelectionCommand.java @@ -0,0 +1,57 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 5/14/2015. + */ +public class ReleaseSelectionCommand extends RevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.ReleaseSelectionCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Array entityIds; + + @Override + public void doAction() { + Set items = new HashSet<>(getNotification().>getBody()); + Sandbox.getInstance().getSelector().releaseSelections(items); + + entityIds = EntityUtils.getEntityId(items); + + facade.sendNotification(DONE); + } + + @Override + public void undoAction() { + Set items = EntityUtils.getByUniqueId(entityIds); + Sandbox.getInstance().getSelector().addSelections(items); + + facade.sendNotification(DONE); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/RemoveComponentFromItemCommand.java b/src/main/java/games/rednblack/editor/controller/commands/RemoveComponentFromItemCommand.java new file mode 100644 index 00000000..a5bcdb55 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/RemoveComponentFromItemCommand.java @@ -0,0 +1,55 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.RemovableComponent; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by CyberJoe on 7/2/2015. + */ +public class RemoveComponentFromItemCommand extends EntityModifyRevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.RemoveComponentFromItemCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Entity entity; + private Component component; + + private void collectData() { + Object[] payload = getNotification().getBody(); + entity = (Entity) payload[0]; + Class componentClass = (Class) payload[1]; + component = entity.getComponent(componentClass); + } + + @Override + public void doAction() { + collectData(); + if (component instanceof RemovableComponent) { + ((RemovableComponent) component).onRemove(); + } + entity.remove(component.getClass()); + + HyperLap2DFacade.getInstance().sendNotification(DONE, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + if (entity.getComponent(component.getClass()) == null) { + entity.add(component); + } + + HyperLap2DFacade.getInstance().sendNotification(DONE, entity); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + public static Object[] payload(Entity entity, Class componentClass) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = componentClass; + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/RenameLayerCommand.java b/src/main/java/games/rednblack/editor/controller/commands/RenameLayerCommand.java new file mode 100644 index 00000000..6a49e1b9 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/RenameLayerCommand.java @@ -0,0 +1,81 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.LayerMapComponent; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by azakhary on 9/7/2015. + */ +public class RenameLayerCommand extends EntityModifyRevertableCommand { + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.RenameLayerCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + @Override + public void doAction() { + String[] payload = getNotification().getBody(); + String oldName = payload[0]; + String newName = payload[1]; + + if(oldName.equals(newName)) cancel(); + + renameLayer(oldName, newName); + + facade.sendNotification(DONE); + } + + @Override + public void undoAction() { + String[] payload = getNotification().getBody(); + String oldName = payload[0]; + String newName = payload[1]; + + renameLayer(newName, oldName); + + facade.sendNotification(DONE); + } + + private void renameLayer(String fromName, String toName) { + Entity viewEntity = Sandbox.getInstance().getCurrentViewingEntity(); + NodeComponent nodeComponent = ComponentRetriever.get(viewEntity, NodeComponent.class); + LayerMapComponent layerMapComponent = ComponentRetriever.get(viewEntity, LayerMapComponent.class); + + layerMapComponent.rename(fromName, toName); + + for(Entity childEntity: nodeComponent.children) { + ZIndexComponent zIndexComponent = ComponentRetriever.get(childEntity, ZIndexComponent.class); + if(zIndexComponent.layerName.equals(fromName)) { + zIndexComponent.layerName = toName; + } + } + } + + public static String[] payload(String oldName, String newName) { + String[] payload = new String[2]; + payload[0] = oldName; + payload[1] = newName; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/RevertableCommand.java b/src/main/java/games/rednblack/editor/controller/commands/RevertableCommand.java new file mode 100644 index 00000000..7ef10d8e --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/RevertableCommand.java @@ -0,0 +1,71 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.controller.SandboxCommand; +import games.rednblack.editor.proxy.CommandManager; + +/** + * Created by azakhary on 5/14/2015. + */ +public abstract class RevertableCommand extends SandboxCommand { + + protected CommandManager commandManager; + protected Notification notification; + + protected boolean isCancelled = false; + protected boolean stateDone = false; + + @Override + public void execute(Notification notification) { + commandManager = facade.retrieveProxy(CommandManager.NAME); + this.notification = notification; + callDoAction(); + stateDone = true; + if(!isCancelled) commandManager.addCommand(this); + } + + public abstract void doAction(); + public abstract void undoAction(); + + public void callDoAction() { + doAction(); + } + + public void callUndoAction() { + undoAction(); + } + + public Notification getNotification() { + return notification; + } + + public void setStateDone(boolean state) { + stateDone = state; + } + + public boolean isStateDone() { + return stateDone; + } + + public void cancel() { + isCancelled = true; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/SaveExportPathCommand.java b/src/main/java/games/rednblack/editor/controller/commands/SaveExportPathCommand.java new file mode 100644 index 00000000..f93c6bd6 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/SaveExportPathCommand.java @@ -0,0 +1,38 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.controller.SandboxCommand; +import games.rednblack.editor.proxy.ProjectManager; + +/** + * Created by azakhary on 11/12/2015. + */ +public class SaveExportPathCommand extends SandboxCommand { + + @Override + public void execute(Notification notification) { + String path = notification.getBody(); + + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.setExportPaths(path); + projectManager.saveCurrentProject(); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/SetSelectionCommand.java b/src/main/java/games/rednblack/editor/controller/commands/SetSelectionCommand.java new file mode 100644 index 00000000..036c0bc5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/SetSelectionCommand.java @@ -0,0 +1,78 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.renderer.components.NodeComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 5/14/2015. + */ +public class SetSelectionCommand extends RevertableCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.SetSelectionCommand"; + public static final String DONE = CLASS_NAME + "DONE"; + + private Array previousSelectionIds; + + @Override + public void doAction() { + HashSet previousSelection = new HashSet<>(Sandbox.getInstance().getSelector().getSelectedItems()); + previousSelectionIds = EntityUtils.getEntityId(previousSelection); + + Set items = getNotification().getBody(); + + if(items == null) { + // deselect all + sandbox.getSelector().setSelections(items, true); + facade.sendNotification(DONE); + return; + } + + // check if items are in viewable element, if no - cancel + NodeComponent nodeComponent = ComponentRetriever.get(sandbox.getCurrentViewingEntity(), NodeComponent.class); + for (Iterator iterator = items.iterator(); iterator.hasNext();) { + Entity item = iterator.next(); + if(!nodeComponent.children.contains(item, true)) { + iterator.remove(); + } + } + + if(items.size() == 0) { + cancel(); + } else { + sandbox.getSelector().setSelections(items, true); + } + facade.sendNotification(DONE); + } + + @Override + public void undoAction() { + Sandbox.getInstance().getSelector().setSelections(EntityUtils.getByUniqueId(previousSelectionIds), true); + facade.sendNotification(DONE); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/TransactiveCommand.java b/src/main/java/games/rednblack/editor/controller/commands/TransactiveCommand.java new file mode 100644 index 00000000..71dd85ac --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/TransactiveCommand.java @@ -0,0 +1,53 @@ +package games.rednblack.editor.controller.commands; + +import com.badlogic.gdx.utils.Array; +import com.puremvc.patterns.observer.Notification; + +/** + * Created by CyberJoe on 7/25/2015. + */ +public abstract class TransactiveCommand extends RevertableCommand { + + protected Array commands = new Array(); + + @Override + public void execute(Notification notification) { + this.notification = notification; + transaction(); + super.execute(notification); + } + + @Override + public void doAction() { + for(int i = 0; i < commands.size; i++) { + commands.get(i).callDoAction(); + if(commands.get(i).isCancelled) { + // reverting + for(int j = i-1; j >= 0; j--) { + commands.get(j).callUndoAction(); + } + cancel(); + return; + } + } + + onFinish(); + } + + @Override + public void undoAction() { + for(int i = commands.size-1; i >= 0; i--) { + commands.get(i).callUndoAction(); + } + + onFinishUndo(); + } + + public abstract void transaction(); + public abstract void onFinish(); + public abstract void onFinishUndo(); + + protected void addInnerCommand(RevertableCommand command) { + commands.add(command); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/UpdateEntityComponentsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/UpdateEntityComponentsCommand.java new file mode 100644 index 00000000..9599bc39 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/UpdateEntityComponentsCommand.java @@ -0,0 +1,68 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.ComponentCloner; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 6/3/2015. + */ +public class UpdateEntityComponentsCommand extends EntityModifyRevertableCommand { + + private Array backupComponents = new Array<>(); + private Integer entityId; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + + Entity entity = (Entity) payload[0]; + entityId = EntityUtils.getEntityId(entity); + Array components = (Array) payload[1]; + + for(int i = 0; i < components.size; i++) { + //backup the original component + Component originalComponent = ComponentRetriever.get(entity, components.get(i).getClass()); + backupComponents.add(ComponentCloner.get(originalComponent)); + + //now modify the entity component from provided data + ComponentCloner.set(originalComponent, components.get(i)); + } + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + for(int i = 0; i < backupComponents.size; i++) { + Component entityComponent = ComponentRetriever.get(entity, backupComponents.get(i).getClass()); + ComponentCloner.set(entityComponent, backupComponents.get(i)); + } + + facade.sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLabelDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLabelDataCommand.java new file mode 100644 index 00000000..83a4576d --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLabelDataCommand.java @@ -0,0 +1,98 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands.component; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.factory.component.LabelComponentFactory; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by azakhary on 6/11/2015. + * + */ +public class UpdateLabelDataCommand extends EntityModifyRevertableCommand { + + Integer entityId; + + String prevFontName; + int prevFontSize; + int prevLabelAlign; + int prevLineAlign; + String prevText; + Label.LabelStyle prevStyle; + boolean prevWrap; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + Entity entity = (Entity) payload[0]; + entityId = EntityUtils.getEntityId(entity); + + LabelComponent labelComponent = ComponentRetriever.get(entity, LabelComponent.class); + + this.prevFontName = labelComponent.fontName; + this.prevFontSize = labelComponent.fontSize; + this.prevLabelAlign = labelComponent.labelAlign; + this.prevLineAlign = labelComponent.lineAlign; + this.prevStyle = labelComponent.getStyle(); + this.prevText = (String) payload[5]; + this.prevWrap = labelComponent.wrap; + + labelComponent.fontName = (String) payload[1]; + labelComponent.fontSize = (int) payload[2]; + labelComponent.setAlignment((Integer) payload[3]); + labelComponent.setText((String) payload[4]); + labelComponent.setStyle(getNewStyle(labelComponent.fontName, labelComponent.fontSize)); + labelComponent.setWrap((Boolean) payload[6]); + + facade.sendNotification(MsgAPI.ITEM_PROPERTY_DATA_FINISHED_MODIFYING, entity); + } + + private Label.LabelStyle getNewStyle(String fontName, int fontSize) { + + IResourceRetriever rm = Sandbox.getInstance().getSceneControl().sceneLoader.getRm(); + final boolean hasBitmapFont = rm.getBitmapFont(fontName, fontSize) != null; + + if(!hasBitmapFont) { + games.rednblack.editor.proxy.ResourceManager resourceManager = facade.retrieveProxy(games.rednblack.editor.proxy.ResourceManager.NAME); + resourceManager.prepareEmbeddingFont(fontName, fontSize); + } + return LabelComponentFactory.generateStyle(rm, fontName, fontSize); + } + + @Override + public void undoAction() { + final Entity entity = EntityUtils.getByUniqueId(entityId); + final LabelComponent labelComponent = ComponentRetriever.get(entity, LabelComponent.class); + + labelComponent.fontName = prevFontName; + labelComponent.fontSize = prevFontSize; + labelComponent.setAlignment(prevLabelAlign, prevLineAlign); + labelComponent.setText(prevText); + labelComponent.setStyle(prevStyle); + labelComponent.setWrap(prevWrap); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightBodyDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightBodyDataCommand.java new file mode 100644 index 00000000..722d3957 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightBodyDataCommand.java @@ -0,0 +1,73 @@ +package games.rednblack.editor.controller.commands.component; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.data.LightBodyDataVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.h2d.common.MsgAPI; + +public class UpdateLightBodyDataCommand extends EntityModifyRevertableCommand { + + private Integer entityId; + private LightBodyDataVO backup; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + Entity entity = (Entity) payload[0]; + LightBodyDataVO vo = (LightBodyDataVO) payload[1]; + entityId = EntityUtils.getEntityId(entity); + + LightBodyComponent lightComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + + backup = new LightBodyDataVO(); + backup.loadFromComponent(lightComponent); + + lightComponent.rayDirection = vo.rayDirection; + lightComponent.distance = vo.distance; + lightComponent.softnessLength = vo.softnessLength; + lightComponent.rays = vo.rays; + lightComponent.isSoft = vo.isSoft; + lightComponent.isStatic = vo.isStatic; + lightComponent.isXRay = vo.isXRay; + lightComponent.color[0] = vo.color[0]; + lightComponent.color[1] = vo.color[1]; + lightComponent.color[2] = vo.color[2]; + lightComponent.color[3] = vo.color[3]; + lightComponent.isActive = vo.isActive; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + LightBodyComponent lightComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + + lightComponent.rayDirection = backup.rayDirection; + lightComponent.distance = backup.distance; + lightComponent.softnessLength = backup.softnessLength; + lightComponent.rays = backup.rays; + lightComponent.isSoft = backup.isSoft; + lightComponent.isStatic = backup.isStatic; + lightComponent.isXRay = backup.isXRay; + lightComponent.color[0] = backup.color[0]; + lightComponent.color[1] = backup.color[1]; + lightComponent.color[2] = backup.color[2]; + lightComponent.color[3] = backup.color[3]; + lightComponent.isActive = backup.isActive; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + public static Object payload(Entity entity, LightBodyDataVO vo) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = vo; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java new file mode 100644 index 00000000..d1b34c28 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java @@ -0,0 +1,85 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands.component; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.data.LightVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.h2d.common.MsgAPI; + +public class UpdateLightDataCommand extends EntityModifyRevertableCommand { + + private Integer entityId; + private LightVO backup; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + Entity entity = (Entity) payload[0]; + LightVO vo = (LightVO) payload[1]; + entityId = EntityUtils.getEntityId(entity); + + backup = new LightVO(); + backup.loadFromEntity(entity); + + LightObjectComponent lightObjectComponent = ComponentRetriever.get(entity, LightObjectComponent.class); + + lightObjectComponent.rays = vo.rays; + lightObjectComponent.isStatic = vo.isStatic; + lightObjectComponent.isXRay = vo.isXRay; + lightObjectComponent.coneDegree = vo.coneDegree; + lightObjectComponent.distance = vo.distance; + lightObjectComponent.softnessLength = vo.softnessLength; + lightObjectComponent.directionDegree = vo.directionDegree; + lightObjectComponent.isSoft = vo.isSoft; + lightObjectComponent.isActive = vo.isActive; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + LightObjectComponent lightObjectComponent = ComponentRetriever.get(entity, LightObjectComponent.class); + + lightObjectComponent.rays = backup.rays; + lightObjectComponent.isStatic = backup.isStatic; + lightObjectComponent.isXRay = backup.isXRay; + lightObjectComponent.coneDegree = backup.coneDegree; + lightObjectComponent.distance = backup.distance; + lightObjectComponent.softnessLength = backup.softnessLength; + lightObjectComponent.directionDegree = backup.directionDegree; + lightObjectComponent.isActive = backup.isActive; + lightObjectComponent.isSoft = backup.isSoft; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + public static Object payload(Entity entity, LightVO vo) { + Object[] payload = new Object[2]; + payload[0] = entity; + payload[1] = vo; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdatePolygonComponentCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdatePolygonComponentCommand.java new file mode 100644 index 00000000..df252682 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdatePolygonComponentCommand.java @@ -0,0 +1,139 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.controller.commands.component; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.light.LightBodyComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.PolygonComponent; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by azakhary on 7/3/2015. + */ +public class UpdatePolygonComponentCommand extends EntityModifyRevertableCommand { + + private Integer entityId; + private Vector2[][] dataFrom; + private Vector2[][] dataTo; + + private void collectData() { + Object[] payload = getNotification().getBody(); + entityId = EntityUtils.getEntityId((Entity) payload[0]); + dataFrom = (Vector2[][]) payload[1]; + dataTo = (Vector2[][]) payload[2]; + dataFrom = dataFrom.clone(); + dataTo = dataTo.clone(); + } + + @Override + public void doAction() { + collectData(); + + Entity entity = EntityUtils.getByUniqueId(entityId); + + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + polygonComponent.vertices = dataTo; + + // if it's image update polygon sprite data + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + if(textureRegionComponent != null && textureRegionComponent.isPolygon) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + float ppwu = dimensionsComponent.width/textureRegionComponent.region.getRegionWidth(); + dimensionsComponent.setPolygon(polygonComponent); + textureRegionComponent.setPolygonSprite(polygonComponent,1f/ppwu); + } + + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + if (physicsBodyComponent != null) { + physicsBodyComponent.needToRefreshBody = true; + } + + LightBodyComponent lightBodyComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + if (lightBodyComponent != null) { + lightBodyComponent.needToRefreshLight = true; + } + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + polygonComponent.vertices = dataFrom; + + // if it's image update polygon sprite data + TextureRegionComponent textureRegionComponent = ComponentRetriever.get(entity, TextureRegionComponent.class); + if(textureRegionComponent != null && textureRegionComponent.isPolygon) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + float ppwu = dimensionsComponent.width/textureRegionComponent.region.getRegionWidth(); + dimensionsComponent.setPolygon(polygonComponent); + textureRegionComponent.setPolygonSprite(polygonComponent, 1f/ppwu); + } + + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + if (physicsBodyComponent != null) { + physicsBodyComponent.needToRefreshBody = true; + } + + LightBodyComponent lightBodyComponent = ComponentRetriever.get(entity, LightBodyComponent.class); + if (lightBodyComponent != null) { + lightBodyComponent.needToRefreshLight = true; + } + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); + } + + public static Object[] payloadInitialState(Entity entity) { + PolygonComponent polygonComponent = ComponentRetriever.get(entity, PolygonComponent.class); + Object[] payload = new Object[3]; + payload[0] = entity; + payload[1] = cloneData(polygonComponent.vertices); + + return payload; + } + + public static Object[] payload(Object[] payload, Vector2[][] vertices) { + payload[2] = cloneData(vertices); + + return payload; + } + + private static Vector2[][] cloneData(Vector2[][] data) { + Vector2[][] newData = new Vector2[data.length][]; + for(int i = 0; i < data.length; i++) { + newData[i] = new Vector2[data[i].length]; + for(int j = 0; j < data[i].length; j++) { + newData[i][j] = data[i][j].cpy(); + } + } + + return newData; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpriteAnimationDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpriteAnimationDataCommand.java new file mode 100644 index 00000000..2eaf5b6d --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpriteAnimationDataCommand.java @@ -0,0 +1,61 @@ +package games.rednblack.editor.controller.commands.component; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.graphics.g2d.Animation; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationComponent; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationStateComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +/** + * Created by CyberJoe on 6/18/2015. + */ +public class UpdateSpriteAnimationDataCommand extends EntityModifyRevertableCommand { + + private Integer entityId; + + private int previousFps; + private String previousAnimationName; + + @Override + public void doAction() { + Object[] payload = getNotification().getBody(); + Entity entity = (Entity) payload[0]; + entityId = EntityUtils.getEntityId(entity); + + int fps = (int) payload[1]; + String animName = (String) payload[2]; + Animation.PlayMode playMode = (Animation.PlayMode) payload[3]; + + SpriteAnimationComponent spriteAnimationComponent = ComponentRetriever.get(entity, SpriteAnimationComponent.class); + SpriteAnimationStateComponent spriteAnimationStateComponent = ComponentRetriever.get(entity, SpriteAnimationStateComponent.class); + previousFps = spriteAnimationComponent.fps; + previousAnimationName = spriteAnimationComponent.currentAnimation; + spriteAnimationComponent.fps = fps; + spriteAnimationComponent.currentAnimation = animName; + spriteAnimationComponent.playMode = playMode; + spriteAnimationStateComponent.set(spriteAnimationComponent); + } + + @Override + public void undoAction() { + Entity entity = EntityUtils.getByUniqueId(entityId); + + SpriteAnimationComponent spriteAnimationComponent = ComponentRetriever.get(entity, SpriteAnimationComponent.class); + SpriteAnimationStateComponent spriteAnimationStateComponent = ComponentRetriever.get(entity, SpriteAnimationStateComponent.class); + spriteAnimationComponent.fps = previousFps; + spriteAnimationComponent.currentAnimation = previousAnimationName; + spriteAnimationStateComponent.set(spriteAnimationComponent); + } + + public static Object payload(Entity entity, int fps, String animName, Animation.PlayMode playMode) { + Object[] payload = new Object[4]; + payload[0] = entity; + payload[1] = fps; + payload[2] = animName; + payload[3] = playMode; + + return payload; + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteImageResource.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteImageResource.java new file mode 100644 index 00000000..23d7f099 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteImageResource.java @@ -0,0 +1,79 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.proxy.ResolutionManager; +import games.rednblack.editor.renderer.components.TextureRegionComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.data.SimpleImageVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * Created by azakhary on 11/29/2015. + */ +public class DeleteImageResource extends NonRevertibleCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteImageResource"; + public static final String DONE = CLASS_NAME + "DONE"; + + private final ArrayList tmpEntityList = new ArrayList<>(); + private final ArrayList tmpImageList = new ArrayList<>(); + + @Override + public void doAction() { + String imageName = notification.getBody(); + if (projectManager.deleteSingleImage(imageName)) { + deleteEntitiesWithImages(sandbox.getRootEntity(), imageName); + deleteAllItemsImages(imageName); + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.rePackProjectImagesForAllResolutions(); + projectManager.loadProjectData(projectManager.getCurrentProjectPath()); + sendNotification(DONE, imageName); + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } else { + cancel(); + } + } + + private void deleteAllItemsImages(String imageName) { + for (CompositeItemVO compositeItemVO : libraryItems.values()) { + deleteAllImagesOfItem(compositeItemVO, imageName); + } + } + + private void deleteAllImagesOfItem(CompositeItemVO compositeItemVO, String imageName) { + Consumer action = (rootItemVo) -> deleteCurrentItemImage(rootItemVo, imageName); + EntityUtils.applyActionRecursivelyOnLibraryItems(compositeItemVO, action); + } + + private void deleteCurrentItemImage(CompositeItemVO compositeItemVO, String imageName) { + if (compositeItemVO.composite != null && compositeItemVO.composite.sImages.size() != 0) { + ArrayList simpleImageVOs = compositeItemVO.composite.sImages; + tmpImageList.addAll(simpleImageVOs + .stream() + .filter(simpleImageVO -> simpleImageVO.imageName.equals(imageName)) + .collect(Collectors.toList())); + simpleImageVOs.removeAll(tmpImageList); + tmpImageList.clear(); + } + } + + private void deleteEntitiesWithImages(Entity rootEntity, String regionName) { + tmpEntityList.clear(); + Consumer action = (root) -> { + TextureRegionComponent regionComponent = ComponentRetriever.get(root, TextureRegionComponent.class); + if (regionComponent != null && regionComponent.regionName.equals(regionName)) { + tmpEntityList.add(root); + } + }; + EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action); + EntityUtils.removeEntities(tmpEntityList); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteLibraryItem.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteLibraryItem.java new file mode 100644 index 00000000..717eda5a --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteLibraryItem.java @@ -0,0 +1,39 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.HashMap; + +/** + * Created by azakhary on 11/29/2015. + */ +public class DeleteLibraryItem extends NonRevertibleCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteLibraryItem"; + public static final String DONE = CLASS_NAME + "DONE"; + + @Override + public void doAction() { + String libraryItemName = notification.getBody(); + + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; + + libraryItems.remove(libraryItemName); + + Array linkedEntities = EntityUtils.getByLibraryLink(libraryItemName); + for (Entity entity : linkedEntities) { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.libraryLink = ""; + } + facade.sendNotification(DONE, libraryItemName); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteParticleEffect.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteParticleEffect.java new file mode 100644 index 00000000..6540e6be --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteParticleEffect.java @@ -0,0 +1,76 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.ParticleEffectVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.ArrayList; +import java.util.function.Consumer; + +/** + * Created by Sasun Poghosyan on 5/10/2016. + */ +public class DeleteParticleEffect extends NonRevertibleCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteParticleEffect"; + public static final String DONE = CLASS_NAME + "DONE"; + + private final ArrayList entityList = new ArrayList<>(); + private final ArrayList tmpParticleEffectList = new ArrayList<>(); + + @Override + public void doAction() { + String particleName = notification.getBody(); + if (projectManager.deleteParticle(particleName)) { + deleteEntitiesWithParticleEffects(sandbox.getRootEntity(), particleName); // delete entities from scene + deleteAllItemsWithParticleName(particleName); + projectManager.loadProjectData(projectManager.getCurrentProjectPath()); + sendNotification(DONE, particleName); + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } else { + cancel(); + } + } + + private void deleteAllItemsWithParticleName(String name) { + for (CompositeItemVO compositeItemVO : libraryItems.values()) { + deleteAllParticles(compositeItemVO, name); + } + } + + private void deleteAllParticles(CompositeItemVO compositeItemVO, String name) { + Consumer action = (rootItemVo) -> getParticles(rootItemVo, name); + EntityUtils.applyActionRecursivelyOnLibraryItems(compositeItemVO, action); + } + + private void getParticles(CompositeItemVO compositeItemVO, String name) { + if (compositeItemVO.composite != null && compositeItemVO.composite.sParticleEffects.size() != 0) { + ArrayList particleEffectList = compositeItemVO.composite.sParticleEffects; + for (ParticleEffectVO particleEffectVO : particleEffectList) { + if (particleEffectVO.particleName.equals(name)) { + tmpParticleEffectList.add(particleEffectVO); + } + } + particleEffectList.removeAll(tmpParticleEffectList); + tmpParticleEffectList.clear(); + } + } + + private void deleteEntitiesWithParticleEffects(Entity rootEntity, String particleName) { + entityList.clear(); + Consumer action = (root) -> { + ParticleComponent particleComponent = ComponentRetriever.get(root, ParticleComponent.class); + if (particleComponent != null && particleComponent.particleName.equals(particleName)) { + entityList.add(root); + } + }; + EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action); + EntityUtils.removeEntities(entityList); + } +} diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpineAnimation.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpineAnimation.java new file mode 100644 index 00000000..e8a2b399 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpineAnimation.java @@ -0,0 +1,78 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.renderer.components.SpineDataComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * Created by Sasun Poghosyan on 5/10/2016. + */ +public class DeleteSpineAnimation extends NonRevertibleCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteSpineAnimation"; + public static final String DONE = CLASS_NAME + "DONE"; + + private final ArrayList entityList = new ArrayList<>(); + private final ArrayList tmpSpineAnimList = new ArrayList<>(); + + @Override + public void doAction() { + String spineItemName = notification.getBody(); + if (projectManager.deleteSpineAnimation(spineItemName)) { + deleteEntitiesWithParticleEffects(sandbox.getRootEntity(), spineItemName); + deleteAllItemsSpineAnimations(spineItemName); + projectManager.loadProjectData(projectManager.getCurrentProjectPath()); + sendNotification(DONE, spineItemName); + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } else { + cancel(); + } + } + + private void deleteAllItemsSpineAnimations(String spineAnimationName) { + for (CompositeItemVO compositeItemVO : libraryItems.values()) { + deleteAllSpineAnimationsOfItem(compositeItemVO, spineAnimationName); + } + } + + private void deleteAllSpineAnimationsOfItem(CompositeItemVO compositeItemVO, String spineAnimationName) { + Consumer action = (rootItemVo) -> deleteCurrentItemSpineAnimations(rootItemVo, spineAnimationName); + EntityUtils.applyActionRecursivelyOnLibraryItems(compositeItemVO, action); + } + + private void deleteCurrentItemSpineAnimations(CompositeItemVO compositeItemVO, String spineAnimationName) { + if (compositeItemVO.composite != null && compositeItemVO.composite.sSpineAnimations.size() != 0) { + ArrayList spineAnimations = compositeItemVO.composite.sSpineAnimations; + tmpSpineAnimList.addAll(spineAnimations + .stream() + .filter(spineVO -> spineVO.animationName.equals(spineAnimationName)) + .collect(Collectors.toList())); + spineAnimations.removeAll(tmpSpineAnimList); + tmpSpineAnimList.clear(); + } + } + + private void deleteEntitiesWithParticleEffects(Entity rootEntity, String particleName) { + entityList.clear(); + Consumer action = (root) -> { + SpineDataComponent spineDataComponent = ComponentRetriever.get(root, SpineDataComponent.class); + if (spineDataComponent != null && spineDataComponent.animationName.equals(particleName)) { + entityList.add(root); + } + }; + EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action); + EntityUtils.removeEntities(entityList); + } +} + + diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriteAnimation.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriteAnimation.java new file mode 100644 index 00000000..84d54ba5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriteAnimation.java @@ -0,0 +1,80 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.renderer.components.sprite.SpriteAnimationComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.data.SpriteAnimationVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * Created by Sasun Poghosyan on 5/12/2016. + */ +public class DeleteSpriteAnimation extends NonRevertibleCommand { + + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteSpriteAnimation"; + public static final String DONE = CLASS_NAME + "DONE"; + + private final ArrayList entityList = new ArrayList<>(); + private final ArrayList tmpSpriteAnimVoList = new ArrayList<>(); + + @Override + public void doAction() { + String spriteAnimationName = notification.getBody(); + if (projectManager.deleteSpriteAnimation(spriteAnimationName)) { + deleteEntitiesWithSpriteAnimation(sandbox.getRootEntity(), spriteAnimationName); + deleteAllItemsSpriteAnimations(spriteAnimationName); + projectManager.loadProjectData(projectManager.getCurrentProjectPath()); + facade.sendNotification(DONE, spriteAnimationName); + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } else { + cancel(); + } + } + + private void deleteAllItemsSpriteAnimations(String spriteAnimationName) { + for (CompositeItemVO compositeItemVO : libraryItems.values()) { + deleteAllSpriteAnimationsOfItem(compositeItemVO, spriteAnimationName); + } + } + + private void deleteAllSpriteAnimationsOfItem(CompositeItemVO rootItemVo, String spriteAnimationName) { + Consumer action = (currentItemVo) -> deleteCurrentItemSpriteAnimations(currentItemVo, spriteAnimationName); + EntityUtils.applyActionRecursivelyOnLibraryItems(rootItemVo, action); + } + + private void deleteCurrentItemSpriteAnimations(CompositeItemVO compositeItemVO, String spriteAnimationName) { + if (compositeItemVO.composite != null && compositeItemVO.composite.sSpriteAnimations.size() != 0) { + ArrayList spriteAnimations = compositeItemVO.composite.sSpriteAnimations; + + tmpSpriteAnimVoList.addAll(spriteAnimations + .stream() + .filter(spriteVO -> spriteVO.animationName.equals(spriteAnimationName)) + .collect(Collectors.toList())); + + spriteAnimations.removeAll(tmpSpriteAnimVoList); + tmpSpriteAnimVoList.clear(); + } + } + + private void deleteEntitiesWithSpriteAnimation(Entity rootEntity, String spriteAnimationName) { + entityList.clear(); + Consumer action = (root) -> { + SpriteAnimationComponent spriteAnimationComponent = ComponentRetriever.get(root, SpriteAnimationComponent.class); + if (spriteAnimationComponent != null && spriteAnimationComponent.animationName.equals(spriteAnimationName)) { + entityList.add(root); + } + }; + EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action); + EntityUtils.removeEntities(entityList); + } +} + + diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriterAnimation.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriterAnimation.java new file mode 100644 index 00000000..1d0c97d5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DeleteSpriterAnimation.java @@ -0,0 +1,77 @@ +package games.rednblack.editor.controller.commands.resource; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.controller.commands.NonRevertibleCommand; +import games.rednblack.editor.renderer.components.spriter.SpriterComponent; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.data.SpriterVO; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.utils.runtime.EntityUtils; + +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * Created by Sasun Poghosyan on 5/12/2016. + */ +public class DeleteSpriterAnimation extends NonRevertibleCommand { + private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.DeleteSpriterAnimation"; + public static final String DONE = CLASS_NAME + "DONE"; + + private final ArrayList entityList = new ArrayList<>(); + private final ArrayList tmpSpriterAnimList = new ArrayList<>(); + + @Override + public void doAction() { + String spriterAnimName = notification.getBody(); + if (projectManager.deleteSpriterAnimation(spriterAnimName)) { + deleteEntitiesWithSpriterAnimation(sandbox.getRootEntity(), spriterAnimName); + deleteAllItemsSpriterAnimations(spriterAnimName); + projectManager.loadProjectData(projectManager.getCurrentProjectPath()); + facade.sendNotification(DONE, spriterAnimName); + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } else { + cancel(); + } + + } + + private void deleteAllItemsSpriterAnimations(String spriterAnimationName) { + for (CompositeItemVO compositeItemVO : libraryItems.values()) { + deleteAllSpriterAnimationsOfItem(compositeItemVO, spriterAnimationName); + } + } + + private void deleteAllSpriterAnimationsOfItem(CompositeItemVO rootItemVo, String spriterAnimationName) { + Consumer action = (currentItemVo) -> deleteCurrentItemSpriterAnimations(currentItemVo, spriterAnimationName); + EntityUtils.applyActionRecursivelyOnLibraryItems(rootItemVo, action); + } + + private void deleteCurrentItemSpriterAnimations(CompositeItemVO compositeItemVO, String spriterAnimationName) { + if (compositeItemVO.composite != null && compositeItemVO.composite.sSpriterAnimations.size() != 0) { + ArrayList spriterAnimations = compositeItemVO.composite.sSpriterAnimations; + tmpSpriterAnimList.addAll(spriterAnimations + .stream() + .filter(spriterVO -> spriterVO.animationName.equals(spriterAnimationName)) + .collect(Collectors.toList())); + + spriterAnimations.removeAll(tmpSpriterAnimList); + tmpSpriterAnimList.clear(); + } + } + + private void deleteEntitiesWithSpriterAnimation(Entity rootEntity, String spriterAnimationName) { + entityList.clear(); + Consumer action = (root) -> { + SpriterComponent spriterAnimationComponent = ComponentRetriever.get(root, SpriterComponent.class); + if (spriterAnimationComponent != null && spriterAnimationComponent.animationName.equals(spriterAnimationName)) { + entityList.add(root); + } + }; + EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action); + EntityUtils.removeEntities(entityList); + } +} diff --git a/src/main/java/games/rednblack/editor/data/JarUtils.java b/src/main/java/games/rednblack/editor/data/JarUtils.java new file mode 100644 index 00000000..3f4e764d --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/JarUtils.java @@ -0,0 +1,118 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data; + +//package com.google.doclava; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class JarUtils { + /** + * Returns the jar file used to load class clazz, or defaultJar if clazz was not loaded from a + * jar. + */ + public static JarFile jarForClass(Class clazz, JarFile defaultJar) { + String path = "/" + clazz.getName().replace('.', '/') + ".class"; + URL jarUrl = clazz.getResource(path); + if (jarUrl == null) { + return defaultJar; + } + + String url = jarUrl.toString(); + int bang = url.indexOf("!"); + String JAR_URI_PREFIX = "jar:file:"; + if (url.startsWith(JAR_URI_PREFIX) && bang != -1) { + try { + return new JarFile(url.substring(JAR_URI_PREFIX.length(), bang)); + } catch (IOException e) { + throw new IllegalStateException("Error loading jar file.", e); + } + } else { + return defaultJar; + } + } + + + public static JarFile getThisJar(Class clazz) { + + String path = "/" + clazz.getName().replace('.', '/') + ".class"; + URL jarUrl = clazz.getResource(path); + + String url = jarUrl.toString(); + int bang = url.indexOf("!"); + String JAR_URI_PREFIX = "jar:file:"; + if (url.startsWith(JAR_URI_PREFIX) && bang != -1) { + try { + return new JarFile(url.substring(JAR_URI_PREFIX.length(), bang)); + } catch (IOException e) { + throw new IllegalStateException("Error loading jar file.", e); + } + } + + return null; + } + + /** + * Copies a directory from a jar file to an external directory. + */ + public static void copyResourcesToDirectory(JarFile fromJar, String jarDir, String destDir) + throws IOException { + for (Enumeration entries = fromJar.entries(); entries.hasMoreElements();) { + JarEntry entry = entries.nextElement(); + if (entry.getName().startsWith(jarDir + "/") && !entry.isDirectory()) { + File dest = new File(destDir + "/" + entry.getName().substring(jarDir.length() + 1)); + File parent = dest.getParentFile(); + if (parent != null) { + parent.mkdirs(); + } + + FileOutputStream out = new FileOutputStream(dest); + InputStream in = fromJar.getInputStream(entry); + + try { + byte[] buffer = new byte[8 * 1024]; + + int s = 0; + while ((s = in.read(buffer)) > 0) { + out.write(buffer, 0, s); + } + } catch (IOException e) { + throw new IOException("Could not copy asset from jar file", e); + } finally { + try { + in.close(); + } catch (IOException ignored) {} + try { + out.close(); + } catch (IOException ignored) {} + } + } + } + + } + + private JarUtils() {} // non-instantiable +} diff --git a/src/main/java/games/rednblack/editor/data/SpineAnimData.java b/src/main/java/games/rednblack/editor/data/SpineAnimData.java new file mode 100644 index 00000000..d7299f18 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/SpineAnimData.java @@ -0,0 +1,31 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; + +/** + * Created by azakhary on 7/3/2014. + */ +public class SpineAnimData { + public TextureAtlas atlas; + public FileHandle jsonFile; + public String animName; +} diff --git a/src/main/java/games/rednblack/editor/data/manager/PreferencesManager.java b/src/main/java/games/rednblack/editor/data/manager/PreferencesManager.java new file mode 100644 index 00000000..7d3ba2d8 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/manager/PreferencesManager.java @@ -0,0 +1,159 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.manager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Preferences; +import com.badlogic.gdx.utils.Array; +import org.apache.commons.io.FilenameUtils; + +public class PreferencesManager { + private static final String TAG = PreferencesManager.class.getCanonicalName(); + private static PreferencesManager instance = null; + private final Preferences prefs; + + public PreferencesManager() { + prefs = Gdx.app.getPreferences("HyperLap2DPrefs"); + initPrefs(); + } + + private void initPrefs() { + if (!contains("recentHistory")) { + putInteger("recentHistory",10); + flush(); + } + } + + public static PreferencesManager getInstance() { + if (instance == null) + instance = new PreferencesManager(); + + return instance; + } + + // Map to Prefs + public boolean contains(String key) { return prefs.contains(key); } + public void flush() { prefs.flush(); } + public Map get() { return prefs.get(); } + public boolean getBoolean(String key) { return prefs.getBoolean(key); } + public boolean getBoolean(String key, boolean defVal) { return prefs.getBoolean(key,defVal); } + public float getFloat(String key) { return prefs.getFloat(key); } + public float getFloat(String key, float defVal) { return prefs.getFloat(key,defVal); } + public int getInteger(String key) { return prefs.getInteger(key); } + public int getInteger(String key, int defVal) { return prefs.getInteger(key,defVal); } + public long getLong(String key) { return prefs.getLong(key); } + public long getLong(String key, long defVal) { return prefs.getLong(key,defVal); } + public String getString(String key) { return prefs.getString(key); } + public String getString(String key, String defVal) { return prefs.getString(key,defVal); } + public Preferences put(Map vals) { return prefs.put(vals); } + public Preferences putBoolean(String key, boolean val) { return prefs.putBoolean(key, val); } + public Preferences putFloat(String key, float val) { return prefs.putFloat(key, val); } + public Preferences putInteger(String key, int val) { return prefs.putInteger(key, val); } + public Preferences putLong(String key, int val) { return prefs.putLong(key, val); } + public Preferences putString(String key, String val) { return prefs.putString(key, val); } + public void remove(String key) { prefs.remove(key); } + + // Custom Functions + + // Recent Project Manager + // Count: recentHistory + // Array: recent.0, recent.1, recent.2, etc, etc. + private ArrayList recentHistory; + + public void buildRecentHistory() { + recentHistory = new ArrayList(); + for (int i = 0; i < getInteger("recentHistory"); i++) { + if (!contains(String.format("recent.%d",i))) { + break; + } + String project = getString(String.format("recent.%d", i)); + java.io.File file = new java.io.File(project); + if (file.exists() && file.isFile() && file.canRead()) { + recentHistory.add(project); + } + } + } + + public ArrayList getRecentHistory() { + return recentHistory; + } + + public void storeRecentHistory() { + cleanDuplicates(recentHistory); + for (int i = 0; i < recentHistory.size(); i++) + { + if (i > getInteger("recentHistory")) + break; + prefs.remove(String.format("recent.%d",i)); + prefs.putString(String.format("recent.%d",i), recentHistory.get(i)); + } + flush(); + } + + private void cleanDuplicates(ArrayList paths) { + Array duplicates = new Array<>(); + for(int i = 0; i < paths.size()-1; i++) { + if(duplicates.contains(i, false)) continue; + for(int j = i + 1; j < paths.size(); j++) { + if(FilenameUtils.equalsNormalized(paths.get(i), paths.get(j))) { + duplicates.add(j); + } + } + } + duplicates.sort(); + duplicates.reverse(); + for(int i = 0; i < duplicates.size; i++) { + paths.remove((int)duplicates.get(i)); + } + } + + public void pushHistory(String file) { + if (recentHistory.contains(file)) + popHistory(file); + recentHistory.add(0,file); + storeRecentHistory(); + } + + public void popHistory(String file) { + if (recentHistory.contains(file)) { + recentHistory.remove(file); + storeRecentHistory(); + } + } + + public void popHistory() { + recentHistory.remove(-1); + storeRecentHistory(); + } + + public void clearHistory() { + for (int i = 0; i < recentHistory.size(); i++) + { + if (i > getInteger("recentHistory")) + break; + prefs.remove(String.format("recent.%d",i)); + } + flush(); + recentHistory.clear(); + } +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/IVersionMigrator.java b/src/main/java/games/rednblack/editor/data/migrations/IVersionMigrator.java new file mode 100644 index 00000000..aa5cd1c2 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/IVersionMigrator.java @@ -0,0 +1,29 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.migrations; + +/** + * Created by azakhary on 9/28/2014. + */ +public interface IVersionMigrator { + + public void setProject(String path); + + public boolean doMigration(); +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java b/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java new file mode 100644 index 00000000..1f3981f7 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java @@ -0,0 +1,110 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.migrations; + +import java.io.IOException; + +import games.rednblack.editor.data.migrations.migrators.VersionMigTo009; +import com.vo.ProjectVO; +import org.apache.commons.io.FileUtils; + +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import games.rednblack.editor.data.migrations.migrators.DummyMig; +import games.rednblack.editor.data.migrations.migrators.VersionMigTo005; + +/** + * Created by azakhary on 9/28/2014. + */ +public class ProjectVersionMigrator { + + private String projectPath; + private ProjectVO projectVo; + + private int safetyIterator = 0; + + /** + * this is the current supported version, change when data format is changed, and add migration script + */ + public static String dataFormatVersion = "0.0.9"; + + private Json json = new Json(); + + public ProjectVersionMigrator(String projectPath, ProjectVO projectVo) { + this.projectPath = projectPath; + this.projectVo = projectVo; + + json.setOutputType(JsonWriter.OutputType.json); + } + + public void start() { + + if (projectVo.projectVersion == null || projectVo.projectVersion.equals("")) { + projectVo.projectVersion = "0.0.4"; + } + + migrationIterator(); + } + + private void migrationIterator() { + if (projectVo.projectVersion.equals(dataFormatVersion)) return; + + if (safetyIterator > 100) { + System.out.println("Emergency exit from version migration process due to safety lock"); + return; + } + safetyIterator++; + + if (projectVo.projectVersion.equals("0.0.4")) { + VersionMigTo005 vmt = new VersionMigTo005(); + doMigartion(vmt, "0.0.5"); + } + if (projectVo.projectVersion.equals("0.0.5") || projectVo.projectVersion.equals("0.0.6") || projectVo.projectVersion.equals("0.0.7")) { + DummyMig vmt = new DummyMig(); + doMigartion(vmt, "0.0.8"); + } + if (projectVo.projectVersion.equals("0.0.8")) { + VersionMigTo009 vmt = new VersionMigTo009(); + doMigartion(vmt, "0.0.9"); + } + } + + private void doMigartion(IVersionMigrator vmt, String nextVersion) { + vmt.setProject(projectPath); + + boolean successs = vmt.doMigration(); + + if (successs) { + setVersion(nextVersion); + migrationIterator(); + } else { + return; + } + } + + private void setVersion(String version) { + projectVo.projectVersion = version; + String projectVoJson = json.toJson(projectVo, ProjectVO.class); + try { + FileUtils.writeStringToFile(new java.io.File(projectPath + "/project.pit"), projectVoJson, "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/migrators/DummyMig.java b/src/main/java/games/rednblack/editor/data/migrations/migrators/DummyMig.java new file mode 100644 index 00000000..55d10132 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/migrators/DummyMig.java @@ -0,0 +1,36 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.migrations.migrators; + +import games.rednblack.editor.data.migrations.IVersionMigrator; + +/** + * Created by azakhary on 1/29/2015. + */ +public class DummyMig implements IVersionMigrator { + @Override + public void setProject(String path) { + + } + + @Override + public boolean doMigration() { + return true; + } +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo005.java b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo005.java new file mode 100644 index 00000000..888536e2 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo005.java @@ -0,0 +1,103 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.migrations.migrators; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonReader; +import com.badlogic.gdx.utils.JsonWriter; +import games.rednblack.editor.data.migrations.IVersionMigrator; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.proxy.ResolutionManager; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.ResolutionEntryVO; + +/** + * Created by azakhary on 9/28/2014. + */ +public class VersionMigTo005 implements IVersionMigrator { + + private String projectPath; + + private Json json = new Json(); + private JsonReader jsonReader = new JsonReader(); + private HyperLap2DFacade facade; + private ProjectManager projectManager; + + @Override + public void setProject(String path) { + facade = HyperLap2DFacade.getInstance(); + projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectPath = path; + json.setOutputType(JsonWriter.OutputType.json); + } + + @Override + public boolean doMigration() { + + // Rename folder animations to spine-animations in orig (if exist); + File animationsDir = new File(projectPath + File.separator + "assets" + File.separator + "orig" + File.separator + "animations"); + if (animationsDir.exists() && animationsDir.isDirectory()) { + File spineAnimationsDir = new File(projectPath + File.separator + "assets" + File.separator + "orig" + File.separator + "spine-animations"); + animationsDir.renameTo(spineAnimationsDir); + } + + // get list of resolutions + String prjInfoFilePath = projectPath + "/project.dt"; + FileHandle projectInfoFile = Gdx.files.internal(prjInfoFilePath); + String projectInfoContents = null; + try { + projectInfoContents = FileUtils.readFileToString(projectInfoFile.file()); + ProjectInfoVO currentProjectInfoVO = json.fromJson(ProjectInfoVO.class, projectInfoContents); + projectManager.currentProjectInfoVO = currentProjectInfoVO; + + // run through all resolutions and remake animations for all + for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.createResizedAnimations(resolutionEntryVO); + } + } catch (IOException e) { + e.printStackTrace(); + } + + // change sLights to sLights + File scenesDir = new File(projectPath + File.separator + "scenes"); + for (File entry : scenesDir.listFiles()) { + if (!entry.isDirectory()) { + try { + String content = FileUtils.readFileToString(new FileHandle(entry).file()); + content = content.replaceAll("\"slights\":", "\"sLights\":"); + FileUtils.writeStringToFile(new File(entry.getAbsolutePath()), content, "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + + } + } + + return true; + } +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo009.java b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo009.java new file mode 100644 index 00000000..ce25f6ff --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo009.java @@ -0,0 +1,174 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.data.migrations.migrators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonReader; +import com.badlogic.gdx.utils.JsonValue; +import com.badlogic.gdx.utils.JsonWriter; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.data.migrations.IVersionMigrator; +import games.rednblack.editor.proxy.ProjectManager; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + +/** + * Created by azakhary on 6/29/2015. + */ +public class VersionMigTo009 implements IVersionMigrator { + + private String projectPath; + + private Json json = new Json(); + private JsonReader jsonReader = new JsonReader(); + private HyperLap2DFacade facade; + private ProjectManager projectManager; + + @Override + public void setProject(String path) { + facade = HyperLap2DFacade.getInstance(); + projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectPath = path; + json.setOutputType(JsonWriter.OutputType.json); + } + + @Override + public boolean doMigration() { + // run through scene files and modify their content to new one + + // this is list of libraryItems for later + HashMap libraryItems = new HashMap<>(); + + // fixing animations format (frameRange) and moving library items + File scenesDir = new File(projectPath + File.separator + "scenes"); + for (File entry : scenesDir.listFiles()) { + if (!entry.isDirectory()) { + try { + String content = FileUtils.readFileToString(new FileHandle(entry).file()); + JsonValue value = jsonReader.parse(content); + fixAnimations(value.get("composite")); + if(value.get("libraryItems") != null) { + JsonValue.JsonIterator libraryArr = value.get("libraryItems").iterator(); + while (libraryArr.hasNext()) { + JsonValue libItem = libraryArr.next(); + fixAnimations(libItem.get("composite")); + libraryItems.put(libItem.name, libItem); + } + value.remove("libraryItems"); + } + + content = value.prettyPrint(JsonWriter.OutputType.json, 1); + FileUtils.writeStringToFile(new File(entry.getAbsolutePath()), content, "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + + } + } + + fixLibraryItemsLocation(libraryItems); + + return true; + } + + private void fixLibraryItemsLocation(HashMap libraryItems) { + if(libraryItems.size() == 0) return; + //creating libraryArrayJsonString + String libraryArrayJsonString = "{"; + for (JsonValue entry : libraryItems.values()) { + libraryArrayJsonString += "\""+entry.name+"\": " + entry.prettyPrint(JsonWriter.OutputType.json, 1) + ", "; + } + libraryArrayJsonString = libraryArrayJsonString.substring(0,libraryArrayJsonString.length()-2) + "}"; + + //ProjectInfo data + String prjInfoFilePath = projectPath + "/project.dt"; + FileHandle projectInfoFile = Gdx.files.internal(prjInfoFilePath); + try { + String projectInfoContents = FileUtils.readFileToString(projectInfoFile.file()); + JsonValue value = jsonReader.parse(projectInfoContents); + JsonValue newVal = jsonReader.parse(libraryArrayJsonString); + newVal.name = "libraryItems"; + newVal.prev = value.get("scenes"); + newVal.next = newVal.prev.next; + newVal.prev.next = newVal; + + String content = value.prettyPrint(JsonWriter.OutputType.json, 1); + FileUtils.writeStringToFile(new File(prjInfoFilePath), content, "utf-8"); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void fixAnimations(JsonValue value) { + if(value.get("sComposites") == null) return; + + if(value.get("sComposites") != null) { + JsonValue.JsonIterator compositeArray = value.get("sComposites").iterator(); + while (compositeArray.hasNext()) { + JsonValue composite = compositeArray.next(); + if (composite != null) { + fixAnimations(composite.get("composite")); + } + } + } + + if(value.get("sSpriteAnimations") != null) { + JsonValue.JsonIterator spriteArray = value.get("sSpriteAnimations").iterator(); + while (spriteArray.hasNext()) { + JsonValue valAnim = spriteArray.next(); + if (valAnim.get("animations") != null) { + String val = valAnim.get("animations").asString(); + JsonValue animationsInnerJson = jsonReader.parse(val); + JsonValue.JsonIterator innerArray = animationsInnerJson.iterator(); + String cnt = "["; + while (innerArray.hasNext()) { + JsonValue innerVal = innerArray.next(); + int startFrame = innerVal.get("startFrame").asInt(); + int endFrame = innerVal.get("endFrame").asInt(); + String currName = innerVal.get("name").asString(); + cnt += "{\"name\":\""+currName+"\", \"startFrame\":"+startFrame+", \"endFrame\":"+endFrame+"}, "; + } + if(cnt.length() == 1) { + cnt = "[]"; + } else { + cnt = cnt.substring(0, cnt.length() - 2) + "]"; + } + JsonValue newVal = jsonReader.parse(cnt); + setNewKeyToJson(valAnim, "frameRangeMap", "animations", newVal); + } + } + } + } + + private void setNewKeyToJson(JsonValue container, String newKey, String oldKey, JsonValue newVal) { + JsonValue oldVal = container.get(oldKey); + if(oldVal.prev != null) oldVal.prev.setNext(newVal); + if(oldVal.next != null) oldVal.next.setPrev(newVal); + newVal.setPrev(oldVal.prev); + newVal.setNext(oldVal.next); + newVal.name = newKey; + } + +} diff --git a/src/main/java/games/rednblack/editor/event/ButtonToNotificationListener.java b/src/main/java/games/rednblack/editor/event/ButtonToNotificationListener.java new file mode 100644 index 00000000..44b17877 --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/ButtonToNotificationListener.java @@ -0,0 +1,22 @@ +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 7/2/2015. + */ +public class ButtonToNotificationListener extends ClickListener{ + + private String notificationName; + + public ButtonToNotificationListener(String notificationName) { + this.notificationName = notificationName; + } + + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + super.touchUp(event, x, y, pointer, button); + HyperLap2DFacade.getInstance().sendNotification(notificationName); + } +} diff --git a/src/main/java/games/rednblack/editor/event/CheckBoxChangeListener.java b/src/main/java/games/rednblack/editor/event/CheckBoxChangeListener.java new file mode 100644 index 00000000..561a5a8d --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/CheckBoxChangeListener.java @@ -0,0 +1,42 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.kotcrab.vis.ui.widget.VisCheckBox; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/16/2015. + */ +public class CheckBoxChangeListener extends ChangeListener { + + private final String eventName; + + public CheckBoxChangeListener(String eventName) { + this.eventName = eventName; + } + + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(eventName, ((VisCheckBox) actor).isChecked()); + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/event/ClickNotifier.java b/src/main/java/games/rednblack/editor/event/ClickNotifier.java new file mode 100644 index 00000000..b774bf3e --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/ClickNotifier.java @@ -0,0 +1,41 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/29/2015. + */ +public class ClickNotifier extends ClickListener { + + private final String eventName; + + public ClickNotifier(String eventName) { + this.eventName = eventName; + } + + @Override + public void clicked(InputEvent event, float x, float y) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(eventName); + } +} diff --git a/src/main/java/games/rednblack/editor/event/EditableSelectBoxChangeListener.java b/src/main/java/games/rednblack/editor/event/EditableSelectBoxChangeListener.java new file mode 100644 index 00000000..13451454 --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/EditableSelectBoxChangeListener.java @@ -0,0 +1,48 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.view.ui.widget.EditableSelectBox; + +/** + * Created by azakhary on 4/30/2015. + */ +public class EditableSelectBoxChangeListener extends ChangeListener { + + private final String eventName; + + private String lastSelected = ""; + + public EditableSelectBoxChangeListener(String eventName) { + this.eventName = eventName; + } + + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + String selected = ((EditableSelectBox) actor).getSelected(); + if(!lastSelected.equals(selected)) { + lastSelected = selected; + facade.sendNotification(eventName, selected); + } + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/event/KeyboardListener.java b/src/main/java/games/rednblack/editor/event/KeyboardListener.java new file mode 100644 index 00000000..256761a1 --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/KeyboardListener.java @@ -0,0 +1,97 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.scenes.scene2d.Event; +import com.badlogic.gdx.scenes.scene2d.EventListener; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.FocusListener; +import com.kotcrab.vis.ui.widget.VisTextField; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/15/2015. + */ +public class KeyboardListener implements EventListener { + + private final String eventName; + + private String lastValue; + + public KeyboardListener(String eventName) { + this.eventName = eventName; + } + + @Override + public boolean handle(Event event) { + if (event instanceof FocusListener.FocusEvent) { + handleFocusListener((FocusListener.FocusEvent) event); + return true; + } + if (event instanceof InputEvent) { + handleInputListener((InputEvent) event); + return true; + } + return false; + } + + private void handleInputListener(InputEvent event) { + switch (event.getType()) { + case keyUp: + if (event.getKeyCode() == Input.Keys.ENTER) { + keyboardHandler((VisTextField) event.getTarget()); + VisTextField field = (VisTextField) event.getTarget(); + lastValue = field.getText(); + } + break; + } + } + + private void handleFocusListener(FocusListener.FocusEvent event) { + VisTextField field = (VisTextField) event.getTarget(); + if(event.isFocused()) { + //it was a focus in event, which is no change + lastValue = field.getText(); + return; + } + switch (event.getType()) { + case keyboard: + keyboardHandler(field); + break; + case scroll: + break; + } + + } + + private void keyboardHandler(VisTextField target) { + if(!target.isInputValid()) { + return; + } + // check for change + if(lastValue.equals(target.getText())) { + // no change = no event; + return; + } + + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(eventName, target.getText()); + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/event/MenuItemListener.java b/src/main/java/games/rednblack/editor/event/MenuItemListener.java new file mode 100644 index 00000000..f11a0a5f --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/MenuItemListener.java @@ -0,0 +1,48 @@ +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by CyberJoe on 4/21/2015. + */ + +public class MenuItemListener extends ChangeListener { + + private final String menuCommand; + private final String menuType; + private final Object data; + + private HyperLap2DFacade facade; + + public MenuItemListener(String menuCommand) { + this(menuCommand, null, null); + } + + public MenuItemListener(String menuCommand, String data) { + this(menuCommand, data, null); + } + + public MenuItemListener(String menuCommand, Object data, String menuType) { + this.menuCommand = menuCommand; + this.data = data; + this.menuType = menuType; + + facade = HyperLap2DFacade.getInstance(); + } + + @Override + public void changed(ChangeEvent event, Actor actor) { + if(menuType == null) { + if(data == null) { + facade.sendNotification(menuCommand); + } else { + facade.sendNotification(menuCommand, data); + } + } else { + facade.sendNotification(menuCommand, data, menuType); + } + + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/event/NumberSelectorOverlapListener.java b/src/main/java/games/rednblack/editor/event/NumberSelectorOverlapListener.java new file mode 100644 index 00000000..2d1a4652 --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/NumberSelectorOverlapListener.java @@ -0,0 +1,42 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.kotcrab.vis.ui.widget.spinner.Spinner; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 6/12/2015. + */ +public class NumberSelectorOverlapListener extends ChangeListener { + + private final String eventName; + + public NumberSelectorOverlapListener(String eventName) { + this.eventName = eventName; + } + + @Override + public void changed(ChangeEvent event, Actor actor) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + facade.sendNotification(eventName, ((Spinner)actor).getTextField().getText()); + } +} diff --git a/src/main/java/games/rednblack/editor/event/SelectBoxChangeListener.java b/src/main/java/games/rednblack/editor/event/SelectBoxChangeListener.java new file mode 100644 index 00000000..94ad52e6 --- /dev/null +++ b/src/main/java/games/rednblack/editor/event/SelectBoxChangeListener.java @@ -0,0 +1,48 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.event; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.kotcrab.vis.ui.widget.VisSelectBox; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/16/2015. + */ +public class SelectBoxChangeListener extends ChangeListener { + + private final String eventName; + + private String lastSelected = ""; + + public SelectBoxChangeListener(String eventName) { + this.eventName = eventName; + } + + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + String selected = (String) ((VisSelectBox) actor).getSelected(); + if(!lastSelected.equals(selected)) { + lastSelected = selected; + facade.sendNotification(eventName, selected); + } + } +} diff --git a/src/main/java/games/rednblack/editor/factory/ItemFactory.java b/src/main/java/games/rednblack/editor/factory/ItemFactory.java new file mode 100644 index 00000000..59d55e0b --- /dev/null +++ b/src/main/java/games/rednblack/editor/factory/ItemFactory.java @@ -0,0 +1,259 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.factory; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.PasteItemsCommand; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.proxy.ResourceManager; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.MainItemComponent; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.tools.TextTool; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; + +import java.util.HashMap; + +/** + * Created by azakhary on 6/5/2015. + * + */ +public class ItemFactory { + + private EntityFactory entityFactory; + private SceneLoader sceneLoader; + private Sandbox sandbox; + private Entity imageEntity; + + private static ItemFactory instance; + + private ItemFactory(SceneLoader sceneLoader) { + this.sceneLoader = sceneLoader; + entityFactory = sceneLoader.getEntityFactory(); + sandbox = Sandbox.getInstance(); + } + + public static ItemFactory get() { + if(instance == null) { + instance = new ItemFactory(Sandbox.getInstance().sceneControl.sceneLoader); + } + + return instance; + } + + private boolean setEssentialData(MainItemVO vo, Vector2 position) { + UILayerBoxMediator layerBoxMediator = HyperLap2DFacade.getInstance().retrieveMediator(UILayerBoxMediator.NAME); + String layerName = layerBoxMediator.getCurrentSelectedLayerName(); + + if(layerName == null) return false; + + vo.layerName = layerName; + + // This is for grid + position.x = MathUtils.floor(position.x / sandbox.getWorldGridSize()) * sandbox.getWorldGridSize(); + position.y = MathUtils.floor(position.y / sandbox.getWorldGridSize()) * sandbox.getWorldGridSize(); + + vo.x = position.x; + vo.y = position.y; + + return true; + } + + public boolean createSimpleImage(String regionName, Vector2 position) { + SimpleImageVO vo = new SimpleImageVO(); + vo.imageName = regionName; + + if(!setEssentialData(vo, position)) return false; + imageEntity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, imageEntity); + + return true; + } + + public Entity getImageEntity() { + return imageEntity; + } + + public boolean create9Patch(String regionName, Vector2 position) { + Image9patchVO vo = new Image9patchVO(); + vo.imageName = regionName; + + if(!setEssentialData(vo, position)) return false; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public boolean createSpriteAnimation(String animationName, Vector2 position) { + SpriteAnimationVO vo = new SpriteAnimationVO(); + vo.animationName = animationName; + vo.playMode = 2; + + if(!setEssentialData(vo, position)) return false; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public boolean createSpineAnimation(String animationName, Vector2 position) { + SpineVO vo = new SpineVO(); + vo.animationName = animationName; + + if(!setEssentialData(vo, position)) return false; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public boolean createSpriterAnimation(String animationName, Vector2 position) { + SpriterVO vo = new SpriterVO(); + vo.animationName = animationName; + + if(!setEssentialData(vo, position)) return false; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public boolean createPrimitive(Vector2 position, ShapeVO shape) { + ColorPrimitiveVO vo = new ColorPrimitiveVO(); + vo.shape = shape.clone(); + vo.originX = 0; + vo.originY = 0; + + if(!setEssentialData(vo, position)) return false; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public boolean createItemFromLibrary(String libraryName, Vector2 position) { + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; + + CompositeItemVO itemVO = libraryItems.get(libraryName); + itemVO.uniqueId = -1; + PasteItemsCommand.forceIdChange(itemVO.composite); + Entity entity = createCompositeItem(itemVO, position); + + if (entity == null) return false; + + //adding library name + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + mainItemComponent.libraryLink = libraryName; + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return true; + } + + public Entity createCompositeItem(CompositeItemVO vo, Vector2 position) { + if(!setEssentialData(vo, position)) return null; + + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + Engine engine = sceneLoader.engine; + EntityFactory factory = sceneLoader.entityFactory; + factory.initAllChildren(engine, entity, vo.composite); + + return entity; + } + + public Entity createCompositeItem(Vector2 position) { + CompositeItemVO vo = new CompositeItemVO(); + Entity entity = createCompositeItem(vo, position); + return entity; + } + + public Entity createLightItem(LightVO vo, Vector2 position) { + if(!setEssentialData(vo, position)) return null; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); +/* + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + float boundBoxSize = 10f; + dimensionsComponent.boundBox = new Rectangle(-boundBoxSize / 2f, -boundBoxSize / 2f, boundBoxSize, boundBoxSize);*/ + + + return entity; + } + + public boolean tryCreateParticleItem(String particleName, Vector2 position) { + Entity entity = createParticleItem(particleName, position); + + /* DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + float boundBoxSize = 10f; + dimensionsComponent.boundBox = new Rectangle(-boundBoxSize / 2f, -boundBoxSize / 2f, boundBoxSize, boundBoxSize);*/ + + if(entity == null) return false; + + return true; + } + + public Entity createParticleItem(String particleName, Vector2 position) { + ParticleEffectVO vo = new ParticleEffectVO(); + vo.particleName = particleName; + + if(!setEssentialData(vo, position)) return null; + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return entity; + } + + public Entity createLabel(TextTool textSettings, Vector2 position) { + LabelVO vo = new LabelVO(); + if(!setEssentialData(vo, position)) return null; + + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); + + resourceManager.prepareEmbeddingFont(textSettings.getFontFamily(), textSettings.getFontSize()); + + // using long unique name + vo.style = textSettings.getFontFamily(); + vo.text = "LABEL"; + vo.size = textSettings.getFontSize(); + + // need to calculate minimum bounds size here + vo.width = 120f/Sandbox.getInstance().getPixelPerWU(); + vo.height = 50f/Sandbox.getInstance().getPixelPerWU(); + + Entity entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); + + return entity; + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/CommandManager.java b/src/main/java/games/rednblack/editor/proxy/CommandManager.java new file mode 100644 index 00000000..cbc85d76 --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/CommandManager.java @@ -0,0 +1,112 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import java.util.ArrayList; + +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.EntityModifyRevertableCommand; +import games.rednblack.editor.controller.commands.RevertableCommand; +import games.rednblack.editor.controller.commands.TransactiveCommand; +import games.rednblack.editor.view.stage.Sandbox; + +/** + * Created by azakhary on 5/14/2015. + */ +public class CommandManager extends BaseProxy { + private static final String TAG = CommandManager.class.getCanonicalName(); + public static final String NAME = TAG; + + private int cursor = -1; + private int modifiedCursor = 0; + + private ArrayList commands = new ArrayList<>(); + + public CommandManager() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + + public void addCommand(RevertableCommand revertableCommand) { + //remove all commands after the cursor + for(int i = commands.size()-1; i > cursor; i--) { + commands.remove(i); + } + commands.add(revertableCommand); + cursor = commands.indexOf(revertableCommand); + if (revertableCommand instanceof EntityModifyRevertableCommand + || revertableCommand instanceof TransactiveCommand) { + modifiedCursor++; + } + + updateWindowTitle(); + } + + public void undoCommand() { + updateWindowTitle(); + + if(cursor < 0) return; + RevertableCommand command = commands.get(cursor); + if(command.isStateDone()) { + command.callUndoAction(); + command.setStateDone(false); + } + cursor--; + + if (command instanceof EntityModifyRevertableCommand + || command instanceof TransactiveCommand) { + modifiedCursor--; + } + } + + public void saveEvent() { + modifiedCursor = 0; + updateWindowTitle(); + } + + public void updateWindowTitle() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.appendSaveHintTitle(modifiedCursor > 0); + } + + public boolean isModified() { + return modifiedCursor > 0; + } + + public void redoCommand() { + if(cursor + 1 >= commands.size()) return; + RevertableCommand command = commands.get(cursor+1); + if(!command.isStateDone()) { + cursor++; + command.callDoAction(); + command.setStateDone(true); + } + } + + public void clearHistory() { + cursor = -1; + commands.clear(); + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/CursorManager.java b/src/main/java/games/rednblack/editor/proxy/CursorManager.java new file mode 100644 index 00000000..d2986b0a --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/CursorManager.java @@ -0,0 +1,108 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Cursor; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.puremvc.patterns.proxy.BaseProxy; +import com.vo.CursorData; + +/** + * Created by azakhary on 5/15/2015. + */ +public class CursorManager extends BaseProxy { + private static final String TAG = CursorManager.class.getCanonicalName(); + public static final String NAME = TAG; + + public static CursorData NORMAL = new CursorData(Cursor.SystemCursor.Arrow); + public static CursorData CROSS = new CursorData("cross", 14, 14); + public static CursorData TEXT = new CursorData(Cursor.SystemCursor.Ibeam); + public static CursorData TEXT_TOOL = new CursorData("label-tool", 15, 17); + public static CursorData FINGER = new CursorData("fingerpoint", 16, 9); + public static CursorData EYEDROPPER = new CursorData("eyedropper", 10, 23); + public static CursorData HAND = new CursorData(Cursor.SystemCursor.Hand); + + public static CursorData ROTATION_LB = new CursorData("left-rotate-down", 15, 18); + public static CursorData ROTATION_LT = new CursorData("left-rotate-up", 15, 15); + public static CursorData ROTATION_RT = new CursorData("right-rotate-up", 18, 15); + public static CursorData ROTATION_RB = new CursorData("right-rotate-down", 18, 18); + + public static CursorData TRANSFORM_LEFT_RIGHT = new CursorData("left-down-up", 17, 16); + public static CursorData TRANSFORM_RIGHT_LEFT = new CursorData("right-down-up", 17, 16); + public static CursorData TRANSFORM_HORIZONTAL = new CursorData("left-right", 17, 16); + public static CursorData TRANSFORM_VERTICAL = new CursorData("up-down", 17, 16); + + private CursorData cursor; + private CursorData overrideCursor = null; + + public CursorManager() { + super(NAME); + + setCursor(NORMAL); + } + + public void setCursor(CursorData cursor, TextureRegion region) { + this.cursor = cursor; + + setCursorPixmap(region); + } + + public void setCursor(CursorData cursor) { + setCursor(cursor, null); + } + + public void setOverrideCursor(CursorData cursor) { + overrideCursor = cursor; + setCursorPixmap(null); + } + + public void removeOverrideCursor() { + setOverrideCursor(null); + } + + private void setCursorPixmap(TextureRegion region) { + CursorData currentCursor = overrideCursor; + if(currentCursor == null) { + currentCursor = cursor; + } + + if (currentCursor.systemCursor != null) { + Gdx.graphics.setSystemCursor(currentCursor.systemCursor); + return; + } + + Pixmap cursorPm; + if (region == null) { + cursorPm = new Pixmap(Gdx.files.internal("cursors/" + currentCursor.region + ".png")); + } else { + Texture texture = region.getTexture(); + if (!texture.getTextureData().isPrepared()) { + texture.getTextureData().prepare(); + } + cursorPm = texture.getTextureData().consumePixmap(); + } + + Cursor cursorObj = Gdx.graphics.newCursor(cursorPm, currentCursor.getHotspotX(), currentCursor.getHotspotY()); + Gdx.graphics.setCursor(cursorObj); + cursorPm.dispose(); + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/EditorTextureManager.java b/src/main/java/games/rednblack/editor/proxy/EditorTextureManager.java new file mode 100644 index 00000000..e3b7b08a --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/EditorTextureManager.java @@ -0,0 +1,70 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.utils.MySkin; + + +public class EditorTextureManager extends BaseProxy { + private static final String TAG = EditorTextureManager.class.getCanonicalName(); + public static final String NAME = TAG; + + private Texture pixel; + + public MySkin editorSkin; + private TextureAtlas editorAtlas; + + public EditorTextureManager() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + loadEditorAssets(); + } + + public void loadEditorAssets() { + Pixmap pixmap = new Pixmap(1, 1, Pixmap.Format.RGBA8888); + pixmap.setColor(Color.WHITE); + pixmap.fill(); + pixel = new Texture(pixmap); + } + + public Texture getEditorAsset(String name) { + return pixel; + } + + public TextureAtlas getEditorAssetsList() { + return editorAtlas; + } + + public void dispose() { + + } + + +} diff --git a/src/main/java/games/rednblack/editor/proxy/FontManager.java b/src/main/java/games/rednblack/editor/proxy/FontManager.java new file mode 100644 index 00000000..c406c41d --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/FontManager.java @@ -0,0 +1,196 @@ +package games.rednblack.editor.proxy; + +import java.awt.Font; +import java.awt.FontFormatException; +//import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.SystemUtils; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Preferences; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; + +/** + * Created by azakhary on 4/24/2015. + */ +public class FontManager extends BaseProxy { + + private static final String TAG = FontManager.class.getCanonicalName(); + public static final String NAME = TAG; + + private static final String cache_name = "hyperlap2d-fonts-cache"; + + private Preferences prefs; + + private HashMap systemFontMap = new HashMap<>(); + + public FontManager() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + prefs = Gdx.app.getPreferences(cache_name); + generateFontsMap(); + } + + /*public String[] getSystemFontNames() { + return GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); + }*/ + + public String[] getSystemFontsPaths() { + String[] result; + if (SystemUtils.IS_OS_WINDOWS) { + result = new String[1]; + String path = System.getenv("WINDIR"); + result[0] = path + "\\" + "Fonts"; + return result; + } else if (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_MAC) { + result = new String[3]; + result[0] = System.getProperty("user.home") + File.separator + "Library/Fonts"; + result[1] = "/Library/Fonts"; + result[2] = "/System/Library/Fonts"; + return result; + } else if (SystemUtils.IS_OS_LINUX) { + String[] pathsToCheck = { + System.getProperty("user.home") + File.separator + ".fonts", + "/usr/share/fonts/truetype", + "/usr/share/fonts/TTF" + }; + ArrayList resultList = new ArrayList<>(); + + for (int i = pathsToCheck.length - 1; i >= 0; i--) { + String path = pathsToCheck[i]; + File tmp = new File(path); + if (tmp.exists() && tmp.isDirectory() && tmp.canRead()) { + resultList.add(path); + } + } + + if (resultList.isEmpty()) { + // TODO: show user warning, TextTool will be crash editor, because system font directories not found + result = new String[0]; + } + else { + result = new String[resultList.size()]; + result = resultList.toArray(result); + } + + return result; + } + + return null; + } + + public List getSystemFontFiles() { + // only retrieving ttf files + String[] extensions = new String[]{"ttf", "TTF"}; + String[] paths = getSystemFontsPaths(); + + ArrayList files = new ArrayList<>(); + + for (int i = 0; i < paths.length; i++) { + File fontDirectory = new File(paths[i]); + if (!fontDirectory.exists()) break; + files.addAll(FileUtils.listFiles(fontDirectory, extensions, true)); + } + + return files; + } + + public void preCacheSystemFontsMap() { + List fontFiles = getSystemFontFiles(); + + for (File file : fontFiles) { + Font f = null; + try { + if (!systemFontMap.containsValue(file.getAbsolutePath())) { + f = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(file.getAbsolutePath())); + String name = f.getFamily(); + systemFontMap.put(name, file.getAbsolutePath()); + } + } catch (FontFormatException e) { + //e.printStackTrace(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + prefs.put(systemFontMap); + prefs.flush(); + } + + public void loadCachedSystemFontMap() { + systemFontMap = (HashMap) prefs.get(); + } + + /*public void invalidateFontMap() { + Array names = new Array<>(getSystemFontNames()); + for (Iterator> it = systemFontMap.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if (!names.contains(entry.getKey(), false)) { + it.remove(); + } + } + }*/ + + public void generateFontsMap() { + loadCachedSystemFontMap(); + preCacheSystemFontsMap(); + //invalidateFontMap(); + } + + public HashMap getFontsMap() { + return systemFontMap; + } + + public Array getFontNamesFromMap() { + AlphabeticalComparator comparator = new AlphabeticalComparator(); + Array fontNames = new Array<>(); + + for (Map.Entry entry : systemFontMap.entrySet()) { + fontNames.add(entry.getKey()); + } + fontNames.sort(comparator); + + return fontNames; + } + + public FileHandle getTTFByName(String fontName) { + return new FileHandle(systemFontMap.get(fontName)); + } + + public String getShortName(String longName) { + String path = systemFontMap.get(longName); + return FilenameUtils.getBaseName(path); + } + + public String getFontFilePath(String fontFaily) { + return systemFontMap.get(fontFaily); + } + + + public class AlphabeticalComparator implements Comparator { + + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + } + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/PluginManager.java b/src/main/java/games/rednblack/editor/proxy/PluginManager.java new file mode 100644 index 00000000..44b43126 --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/PluginManager.java @@ -0,0 +1,258 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.IItemCommand; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.common.plugins.H2DPlugin; +import games.rednblack.h2d.common.plugins.PluginAPI; +import games.rednblack.h2d.common.view.tools.Tool; +import com.kotcrab.vis.ui.widget.VisImageButton; +import com.puremvc.patterns.facade.Facade; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.PluginItemCommand; +import games.rednblack.editor.factory.ItemFactory; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.editor.view.menu.HyperLap2DMenuBarMediator; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.SandboxMediator; +import games.rednblack.editor.view.ui.FollowersUIMediator; +import games.rednblack.editor.view.ui.UIDropDownMenu; +import games.rednblack.editor.view.ui.UIDropDownMenuMediator; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; +import games.rednblack.editor.view.ui.box.UIToolBoxMediator; +import com.vo.CursorData; + +import java.util.*; + +/** + * Created by azakhary on 7/24/2015. + */ +public class PluginManager extends BaseProxy implements PluginAPI { + private static final String TAG = PluginManager.class.getCanonicalName(); + public static final String NAME = TAG; + + private ArrayList plugins = new ArrayList<>(); + private String pluginDir; + + private HashSet pluginEntities; + + public PluginManager() { + super(NAME); + facade = HyperLap2DFacade.getInstance(); + } + + public H2DPlugin registerPlugin(H2DPlugin plugin) { + plugins.add(plugin); + + return plugin; + } + + public void initPlugin(H2DPlugin plugin) { + if(plugins.contains(plugin)) return; + + registerPlugin(plugin); + plugin.setAPI(this); + plugin.initPlugin(); + } + + public void dropDownActionSets(Set selectedEntities, Array actionsSet) { + for(H2DPlugin plugin: plugins) { + plugin.onDropDownOpen(selectedEntities, actionsSet); + } + } + + public void setDropDownItemName(String action, String name) { + UIDropDownMenuMediator dropDownMenuMediator = facade.retrieveMediator(UIDropDownMenuMediator.NAME); + dropDownMenuMediator.getViewComponent().setActionName(action, name); + } + + @Override + public String getProjectPath() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.getCurrentProjectPath(); + } + + @Override + public TextureAtlas getProjectTextureAtlas() { + ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); + return resourceManager.getTextureAtlas(); + } + + @Override + public void reLoadProject() { + Sandbox sandbox = Sandbox.getInstance(); + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.openProjectAndLoadAllData(projectManager.getCurrentProjectPath()); + sandbox.loadCurrentProject(); + facade.sendNotification(ProjectManager.PROJECT_DATA_UPDATED); + } + + @Override + public void saveProject() { + Sandbox sandbox = Sandbox.getInstance(); + SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); + SceneVO vo = sandbox.sceneVoFromItems(); + sceneDataManager.saveScene(vo); + } + + @Override + public void revertableCommand(IItemCommand command, Object body) { + Object payload = PluginItemCommand.build(command, body); + facade.sendNotification(MsgAPI.ACTION_PLUGIN_PROXY_COMMAND, payload); + } + + @Override + public void removeFollower(Entity entity) { + FollowersUIMediator followersUIMediator = HyperLap2DFacade.getInstance().retrieveMediator(FollowersUIMediator.NAME); + followersUIMediator.removeFollower(entity); + } + + public void addMenuItem(String menu, String subMenuName, String notificationName) { + HyperLap2DMenuBarMediator hyperlap2DMenuBarMediator = facade.retrieveMediator(HyperLap2DMenuBarMediator.NAME); + hyperlap2DMenuBarMediator.addMenuItem(menu, subMenuName, notificationName); + } + + @Override + public void addTool(String toolName, VisImageButton.VisImageButtonStyle toolBtnStyle, boolean addSeparator, Tool tool) { + UIToolBoxMediator uiToolBoxMediator = facade.retrieveMediator(UIToolBoxMediator.NAME); + uiToolBoxMediator.addTool(toolName, toolBtnStyle, addSeparator, tool); + Map.Entry toolPair = new Map.Entry() { + @Override + public String getKey() { + return toolName; + } + + @Override + public Tool getValue() { + return tool; + } + + @Override + public Tool setValue(Tool value) { + Tool old = getValue(); + setValue(value); + return old; + } + }; + facade.sendNotification(MsgAPI.NEW_TOOL_ADDED, toolPair); + } + + @Override + public void toolHotSwap(Tool tool) { + SandboxMediator sandboxMediator = facade.retrieveMediator(SandboxMediator.NAME); + sandboxMediator.toolHotSwap(tool); + } + + @Override + public void toolHotSwapBack() { + SandboxMediator sandboxMediator = facade.retrieveMediator(SandboxMediator.NAME); + sandboxMediator.toolHotSwapBack(); + } + + public void setPluginDir(String pluginDir) { + this.pluginDir = pluginDir; + } + + + @Override + public String getPluginDir() { + return pluginDir; + } + + @Override + public SceneLoader getSceneLoader() { + return Sandbox.getInstance().getSceneControl().sceneLoader; + } + + @Override + public Facade getFacade() { + return facade; + } + + @Override + public Engine getEngine() { + return getSceneLoader().getEngine(); + } + + @Override + public Stage getUIStage() { + return Sandbox.getInstance().getUIStage(); + } + + @Override + public Entity drawImage(String regionName, Vector2 position) { + ItemFactory itemFactory = ItemFactory.get(); + itemFactory.createSimpleImage(regionName, position); + return itemFactory.getImageEntity(); + } + + public boolean isEntityVisible(Entity e) { + LayerItemVO layer = EntityUtils.getEntityLayer(e); + return layer != null && layer.isVisible; + } + + @Override + public HashSet getProjectEntities() { + Sandbox sandbox = Sandbox.getInstance(); + return sandbox.getSelector().getAllFreeItems(); + } + + @Override + public void showPopup(HashMap actionsSet, Object observable) { + UIDropDownMenu uiDropDownMenu = new UIDropDownMenu(); + actionsSet.entrySet().forEach(entry -> uiDropDownMenu.setActionName(entry.getKey(), entry.getValue())); + + Array actions = new Array<>(); + actionsSet.keySet().forEach(key -> actions.add(key)); + uiDropDownMenu.setActionList(actions); + + Vector2 coordinates = new Vector2(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY()); + uiDropDownMenu.setX(coordinates.x); + uiDropDownMenu.setY(coordinates.y - uiDropDownMenu.getHeight()); + getUIStage().addActor(uiDropDownMenu); + + UIDropDownMenuMediator dropDownMenuMediator = facade.retrieveMediator(UIDropDownMenuMediator.NAME); + dropDownMenuMediator.setCurrentObservable(observable); + } + + @Override + public void setCursor(CursorData cursorData, TextureRegion region) { + CursorManager cursorManager = HyperLap2DFacade.getInstance().retrieveProxy(CursorManager.NAME); + cursorManager.setCursor(cursorData, region); + } + + @Override + public String getCurrentSelectedLayerName() { + UILayerBoxMediator uiLayerBoxMediator = facade.retrieveMediator(UILayerBoxMediator.NAME); + return uiLayerBoxMediator.getViewComponent().getCurrentSelectedLayer().getLayerName(); + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java new file mode 100755 index 00000000..3018388d --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java @@ -0,0 +1,1323 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.tools.texturepacker.TexturePacker; +import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import com.google.common.collect.Lists; +import com.kotcrab.vis.ui.util.dialog.Dialogs; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.data.manager.PreferencesManager; +import games.rednblack.editor.data.migrations.ProjectVersionMigrator; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.utils.MySkin; +import games.rednblack.editor.utils.HyperLap2DUtils; +import games.rednblack.editor.view.menu.HyperLap2DMenuBar; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.ui.widget.ProgressHandler; +import com.vo.EditorConfigVO; +import com.vo.ProjectVO; +import com.vo.SceneConfigVO; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.imageio.ImageIO; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + + +public class ProjectManager extends BaseProxy { + private static final String TAG = ProjectManager.class.getCanonicalName(); + public static final String NAME = TAG; + private static final String EVENT_PREFIX = "games.rednblack.editor.proxy.ProjectManager"; + + public static final String PROJECT_OPENED = EVENT_PREFIX + ".PROJECT_OPENED"; + public static final String PROJECT_DATA_UPDATED = EVENT_PREFIX + ".PROJECT_DATA_UPDATED"; + + public static final String IMAGE_DIR_PATH = "assets/orig/images"; + public static final String SPINE_DIR_PATH = "assets/orig/spine-animations"; + public static final String SPRITE_DIR_PATH = "assets/orig/sprite-animations"; + public static final String SPRITER_DIR_PATH = "assets/orig/animations"; + public static final String PARTICLE_DIR_PATH = "assets/orig/particles"; + public static final String SHADER_DIR_PATH = "assets/shaders"; + + public ProjectVO currentProjectVO; + public ProjectInfoVO currentProjectInfoVO; + private String currentProjectPath; + + private String defaultWorkspacePath; + + private String DEFAULT_FOLDER = "HyperLap2D"; + private float currentPercent = 0.0f; + private ProgressHandler handler; + private EditorConfigVO editorConfigVO; + + private String currentWindowTitle = ""; + + public ProjectManager() { + super(NAME); + } + + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + initWorkspace(); + } + + @Override + public void onRemove() { + super.onRemove(); + } + + public ProjectVO getCurrentProjectVO() { + return currentProjectVO; + } + + public ProjectInfoVO getCurrentProjectInfoVO() { + return currentProjectInfoVO; + } + + private void initWorkspace() { + try { + editorConfigVO = getEditorConfig(); + String myDocPath = HyperLap2DUtils.MY_DOCUMENTS_PATH; + defaultWorkspacePath = myDocPath + File.separator + DEFAULT_FOLDER; + FileUtils.forceMkdir(new File(defaultWorkspacePath)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void changePercentBy(float value) { + currentPercent += value; + handler.progressChanged(currentPercent); + } + + public void createEmptyProject(String projectPath, int width, int height, int pixelPerWorldUnit) throws IOException { + + /* + if (workspacePath.endsWith(File.separator)) { + workspacePath = workspacePath.substring(0, workspacePath.length() - 1); + } + + String projPath = workspacePath + File.separator + projectName; + */ + String projectName = new File(projectPath).getName(); + String projPath = FilenameUtils.normalize(projectPath); + + FileUtils.forceMkdir(new File(projPath)); + FileUtils.forceMkdir(new File(projPath + File.separator + "export")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets")); + FileUtils.forceMkdir(new File(projPath + File.separator + "scenes")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets/orig")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets/orig/images")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets/orig/particles")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets/orig/animations")); + FileUtils.forceMkdir(new File(projPath + File.separator + "assets/orig/pack")); + + + // create project file + ProjectVO projVo = new ProjectVO(); + projVo.projectName = projectName; + projVo.projectVersion = ProjectVersionMigrator.dataFormatVersion; + + // create project info file + ProjectInfoVO projInfoVo = new ProjectInfoVO(); + projInfoVo.originalResolution.name = "orig"; + projInfoVo.originalResolution.width = width; + projInfoVo.originalResolution.height = height; + projInfoVo.pixelToWorld = pixelPerWorldUnit; + + //TODO: add project orig resolution setting + currentProjectVO = projVo; + currentProjectInfoVO = projInfoVo; + currentProjectPath = projPath; + SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); + sceneDataManager.createNewScene("MainScene"); + FileUtils.writeStringToFile(new File(projPath + "/project.pit"), projVo.constructJsonString(), "utf-8"); + FileUtils.writeStringToFile(new File(projPath + "/project.dt"), projInfoVo.constructJsonString(), "utf-8"); + + } + + public void setLastOpenedPath(String path) { + editorConfigVO.lastOpenedSystemPath = path; + saveEditorConfig(); + } + + public void setLastImportedPath(String path) { + editorConfigVO.lastImportedSystemPath = path; + saveEditorConfig(); + } + + private void saveEditorConfig() { + try { + String configFilePath = getRootPath() + File.separator + "configs" + File.separator + EditorConfigVO.EDITOR_CONFIG_FILE; + FileUtils.writeStringToFile(new File(configFilePath), editorConfigVO.constructJsonString(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void openProjectAndLoadAllData(String projectPath) { + openProjectAndLoadAllData(projectPath, null); + } + + public void openProjectAndLoadAllData(String projectPath, String resolution) { + String prjFilePath = projectPath + "/project.pit"; + + PreferencesManager prefs = PreferencesManager.getInstance(); + prefs.buildRecentHistory(); + prefs.pushHistory(prjFilePath); + facade.sendNotification(HyperLap2DMenuBar.RECENT_LIST_MODIFIED); + + File prjFile = new File(prjFilePath); + if (!prjFile.isDirectory()) { + if (!prjFile.exists()) { + + ProjectVO projVoEmpty = new ProjectVO(); + projVoEmpty.projectName = prjFile.getName(); + projVoEmpty.projectVersion = ProjectVersionMigrator.dataFormatVersion; + + try { + FileUtils.writeStringToFile(prjFile, projVoEmpty.constructJsonString(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } + FileHandle projectFile = Gdx.files.internal(prjFilePath); + String projectContents = null; + try { + projectContents = FileUtils.readFileToString(projectFile.file()); + Json json = new Json(); + json.setIgnoreUnknownFields(true); + ProjectVO vo = json.fromJson(ProjectVO.class, projectContents); + goThroughVersionMigrationProtocol(projectPath, vo); + currentProjectVO = vo; + String prjInfoFilePath = projectPath + "/project.dt"; + FileHandle projectInfoFile = Gdx.files.internal(prjInfoFilePath); + String projectInfoContents = FileUtils.readFileToString(projectInfoFile.file()); + ProjectInfoVO voInfo = json.fromJson(ProjectInfoVO.class, projectInfoContents); + currentProjectInfoVO = voInfo; + + } catch (IOException e) { + e.printStackTrace(); + } + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + if (resolution == null) { + resolutionManager.currentResolutionName = currentProjectVO.lastOpenResolution.isEmpty() ? "orig" : currentProjectVO.lastOpenResolution; + } else { + resolutionManager.currentResolutionName = resolution; + currentProjectVO.lastOpenResolution = resolutionManager.currentResolutionName; + saveCurrentProject(); + + } + currentProjectPath = projectPath; + checkForConsistency(projectPath); + loadProjectData(projectPath); + } + } + + private void goThroughVersionMigrationProtocol(String projectPath, ProjectVO projectVo) { + ProjectVersionMigrator pvm = new ProjectVersionMigrator(projectPath, projectVo); + pvm.start(); + } + + private void checkForConsistency(String projectPath) { + // check if current project requires cleanup + + FileHandle sourceDir = new FileHandle(projectPath + "/scenes/"); + for (FileHandle entry : sourceDir.list(HyperLap2DUtils.DT_FILTER)) { + if (!entry.file().isDirectory()) { + Json json = new Json(); + json.setIgnoreUnknownFields(true); + SceneVO sceneVO = json.fromJson(SceneVO.class, entry); + if (sceneVO.composite == null) continue; + ArrayList items = sceneVO.composite.getAllItems(); + + for (CompositeItemVO libraryItem : currentProjectInfoVO.libraryItems.values()) { + if (libraryItem.composite == null) continue; + items = libraryItem.composite.getAllItems(); + } + } + } + } + + public void reLoadProjectAssets() { + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); + resourceManager.loadCurrentProjectAssets(currentProjectPath + "/assets/" + resolutionManager.currentResolutionName + "/pack/pack.atlas"); + } + + public void loadProjectData(String projectPath) { + // All legit loading assets + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); + resourceManager.loadCurrentProjectData(projectPath, resolutionManager.currentResolutionName); + } + + public void saveCurrentProject() { + try { + FileUtils.writeStringToFile(new File(currentProjectPath + "/project.pit"), currentProjectVO.constructJsonString(), "utf-8"); + FileUtils.writeStringToFile(new File(currentProjectPath + "/project.dt"), currentProjectInfoVO.constructJsonString(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void saveCurrentProject(SceneVO vo) { + saveCurrentProject(); + SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); + sceneDataManager.saveScene(vo); + } + + + private ArrayList getScmlFileImagesList(FileHandle fileHandle) { + ArrayList images = new ArrayList(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = null; + try { + db = dbf.newDocumentBuilder(); + org.w3c.dom.Document document = db.parse(fileHandle.file()); + NodeList nodeList = document.getElementsByTagName("file"); + for (int x = 0, size = nodeList.getLength(); x < size; x++) { + String absolutePath = fileHandle.path(); + String path = absolutePath.substring(0, FilenameUtils.indexOfLastSeparator(fileHandle.path())) + File.separator + nodeList.item(x).getAttributes().getNamedItem("name").getNodeValue(); + File imgFile = new File(path); + images.add(imgFile); + } + } catch (SAXException | IOException | ParserConfigurationException e) { + e.printStackTrace(); + } + return images; + } + + + public void importSpineAnimationsIntoProject(final Array fileHandles, ProgressHandler progressHandler) { + if (fileHandles == null) { + return; + } + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + for (FileHandle handle : fileHandles) { + File copiedFile = importExternalAnimationIntoProject(handle); + if (copiedFile.getName().toLowerCase().endsWith(".atlas")) { + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.resizeSpineAnimationForAllResolutions(copiedFile, currentProjectInfoVO); + } else if (copiedFile.getName().toLowerCase().endsWith(".scml")) { + //resizeSpriterAnimationForAllResolutions(copiedFile, currentProjectInfoVO); + } + } + + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + handler.progressComplete(); + }); + executor.shutdown(); + + } + + public File importExternalAnimationIntoProject(FileHandle animationFileSource) { + try { + String fileName = animationFileSource.name(); + if (!HyperLap2DUtils.JSON_FILTER.accept(null, fileName) && + !HyperLap2DUtils.SCML_FILTER.accept(null, fileName)) { + //showError("Spine animation should be a .json file with atlas in same folder \n Spriter animation should be a .scml file with images in same folder"); + return null; + } + + String fileNameWithOutExt = FilenameUtils.removeExtension(fileName); + String sourcePath; + String animationDataPath; + String targetPath; + if (HyperLap2DUtils.JSON_FILTER.accept(null, fileName)) { + sourcePath = animationFileSource.path(); + + animationDataPath = FilenameUtils.getFullPathNoEndSeparator(sourcePath); + targetPath = currentProjectPath + "/assets/orig/spine-animations" + File.separator + fileNameWithOutExt; + FileHandle atlasFileSource = new FileHandle(animationDataPath + File.separator + fileNameWithOutExt + ".atlas"); + if (!atlasFileSource.exists()) { + //showError("the atlas file needs to have same name and location as the json file"); + return null; + } + + FileUtils.forceMkdir(new File(targetPath)); + File jsonFileTarget = new File(targetPath + File.separator + fileNameWithOutExt + ".json"); + File atlasFileTarget = new File(targetPath + File.separator + fileNameWithOutExt + ".atlas"); + Array imageFiles = getAtlasPages(atlasFileSource); + + FileUtils.copyFile(animationFileSource.file(), jsonFileTarget); + FileUtils.copyFile(atlasFileSource.file(), atlasFileTarget); + + for (File imageFile : imageFiles) { + FileHandle imgFileTarget = new FileHandle(targetPath + File.separator + imageFile.getName()); + FileUtils.copyFile(imageFile, imgFileTarget.file()); + } + + return atlasFileTarget; + + + } else if (HyperLap2DUtils.SCML_FILTER.accept(null, fileName)) { + targetPath = currentProjectPath + "/assets/orig/spriter-animations" + File.separator + fileNameWithOutExt; + File scmlFileTarget = new File(targetPath + File.separator + fileNameWithOutExt + ".scml"); + ArrayList imageFiles = getScmlFileImagesList(animationFileSource); + + FileUtils.copyFile(animationFileSource.file(), scmlFileTarget); + for (File imageFile : imageFiles) { + File imgFileTarget = new File(targetPath + File.separator + imageFile.getName()); + FileUtils.copyFile(imageFile, imgFileTarget); + } + return scmlFileTarget; + + + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + public void importSpriteAnimationsIntoProject(final Array fileHandles, ProgressHandler progressHandler) { + if (fileHandles == null) { + return; + } + handler = progressHandler; + + ExecutorService executor = Executors.newSingleThreadExecutor(); + + executor.execute(() -> { + + String newAnimName = null; + + String rawFileName = fileHandles.get(0).name(); + String fileExtension = FilenameUtils.getExtension(rawFileName); + if (fileExtension.equals("png")) { + Settings settings = new Settings(); + settings.square = true; + settings.flattenPaths = true; + settings.maxWidth = Integer.parseInt(getCurrentProjectVO().texturepackerWidth); + settings.maxHeight = Integer.parseInt(getCurrentProjectVO().texturepackerHeight); + settings.duplicatePadding = getCurrentProjectVO().texturepackerDuplicate; + TexturePacker texturePacker = new TexturePacker(settings); + + String fileNameWithoutExt = FilenameUtils.removeExtension(rawFileName); + String fileNameWithoutFrame = fileNameWithoutExt.replaceAll("\\d*$", "").replace("_", ""); + + boolean noFileNameWithoutFrame = false; + if (Objects.equals(fileNameWithoutFrame, "")) { + fileNameWithoutFrame = fileHandles.get(0).parent().name(); + noFileNameWithoutFrame = true; + } + + String targetPath = currentProjectPath + "/assets/orig/sprite-animations" + File.separator + fileNameWithoutFrame; + + for (FileHandle file : fileHandles) { + File src = file.file(); + + String destName; + if (noFileNameWithoutFrame) { + destName = targetPath + "Tmp" + File.separator + fileNameWithoutFrame + src.getName(); + } else { + destName = targetPath + "Tmp" + File.separator + src.getName(); + } + + File dest = new File(destName); + try { + FileUtils.copyFile(src, dest); + } catch (IOException e) { + e.printStackTrace(); + handler.progressFailed(); + return; + } + } + + FileHandle pngsDir = new FileHandle(targetPath + "Tmp"); + for (FileHandle entry : pngsDir.list(HyperLap2DUtils.PNG_FILTER)) { + texturePacker.addImage(entry.file()); + } + + File targetDir = new File(targetPath); + if (targetDir.exists()) { + try { + FileUtils.deleteDirectory(targetDir); + } catch (IOException e) { + e.printStackTrace(); + handler.progressFailed(); + return; + } + } + + try { + texturePacker.pack(targetDir, fileNameWithoutFrame); + } catch (Exception e) { + handler.progressFailed(); + return; + } + + //delete newly created directory and images + try { + FileUtils.deleteDirectory(pngsDir.file()); + } catch (IOException e) { + e.printStackTrace(); + handler.progressFailed(); + return; + } + + newAnimName = fileNameWithoutFrame; + } else { + for (FileHandle fileHandle : fileHandles) { + try { + Array imgs = getAtlasPages(fileHandle); + String fileNameWithoutExt = getAtlasName(fileHandle); + + String targetPath = currentProjectPath + "/assets/orig/sprite-animations" + File.separator + fileNameWithoutExt; + File targetDir = new File(targetPath); + if (targetDir.exists()) { + FileUtils.deleteDirectory(targetDir); + } + for (File img : imgs) { + FileUtils.copyFileToDirectory(img, targetDir); + } + File atlasTargetPath = new File(targetPath + File.separator + fileNameWithoutExt + ".atlas"); + FileUtils.copyFile(fileHandle.file(), atlasTargetPath); + newAnimName = fileNameWithoutExt; + } catch (IOException e) { + e.printStackTrace(); + handler.progressFailed(); + return; + } + } + } + + if (newAnimName != null) { + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.resizeSpriteAnimationForAllResolutions(newAnimName, currentProjectInfoVO); + } + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + handler.progressComplete(); + }); + executor.shutdown(); + } + + private Array getAtlasPages(FileHandle fileHandle) { + Array imgs = new Array<>(); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(fileHandle.read()), 64); + while (true) { + String line = reader.readLine(); + if (line == null) break; + if (line.trim().length() == 0) { + line = reader.readLine(); + imgs.add(new File(FilenameUtils.getFullPath(fileHandle.path()) + line)); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return imgs; + } + + private String getAtlasName(FileHandle fileHandle) { + String name = "atlas"; + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(fileHandle.read()), 64); + while (true) { + String line = reader.readLine(); + if (line == null) break; + if (line.trim().contains("repeat:")) { + line = reader.readLine(); + name = line; + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return name; + } + + private Array getAtlasPageHandles(FileHandle fileHandle) { + Array imgs = getAtlasPages(fileHandle); + + Array imgHandles = new Array<>(); + for (int i = 0; i < imgs.size; i++) { + imgHandles.add(new FileHandle(imgs.get(i))); + } + + return imgHandles; + } + + private boolean addParticleEffectImages(FileHandle fileHandle, Array imgs) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(fileHandle.read()), 64); + while (true) { + String line = reader.readLine(); + if (line == null) break; + if (line.trim().equals("- Image Paths -")) { + line = reader.readLine(); + while (line != null && !line.equals("")) { + System.out.println(line); + if (line.contains("\\") || line.contains("/")) { + // then it's a path let's see if exists. + File tmp = new File(line); + if (tmp.exists()) { + imgs.add(new FileHandle(tmp)); + } else { + line = FilenameUtils.getBaseName(line) + ".png"; + File file = new File(FilenameUtils.getFullPath(fileHandle.path()) + line); + if (file.exists()) { + imgs.add(new FileHandle(file)); + } else { + return false; + } + } + } else { + File file = new File(FilenameUtils.getFullPath(fileHandle.path()) + line); + if (file.exists()) { + imgs.add(new FileHandle(file)); + } else { + return false; + } + } + line = reader.readLine(); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + return true; + } + + public void importParticlesIntoProject(final Array fileHandles, ProgressHandler progressHandler) { + if (fileHandles == null) { + return; + } + final String targetPath = currentProjectPath + "/assets/orig/particles"; + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + Array images = new Array<>(); + for (FileHandle fileHandle : fileHandles) { + if (!fileHandle.isDirectory() && fileHandle.exists()) { + try { + //copy images + boolean allImagesFound = addParticleEffectImages(fileHandle, images); + if (allImagesFound) { + // copy the fileHandle + String newName = fileHandle.name(); + File target = new File(targetPath + "/" + newName); + FileUtils.copyFile(fileHandle.file(), target); + } + } catch (IllegalArgumentException e) { + System.out.println("Error importing particles."); + throw e; + + } catch (IOException e) { + System.out.println("Error importing particles."); + e.printStackTrace(); + } + } + } + if (images.size > 0) { + copyImageFilesForAllResolutionsIntoProject(images, false); + } + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.rePackProjectImagesForAllResolutions(); + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + handler.progressComplete(); + }); + executor.shutdown(); + } + + public void importAtlasesIntoProject(final Array files, ProgressHandler progressHandler) { + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + for (FileHandle fileHandle : files) { + // TODO: logic goes here + } + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + handler.progressComplete(); + }); + executor.shutdown(); + } + + + public void importImagesIntoProject(final Array files, ProgressHandler progressHandler) { + if (files == null) { + return; + } + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + copyImageFilesForAllResolutionsIntoProject(files, true); + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + resolutionManager.rePackProjectImagesForAllResolutions(); + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + handler.progressComplete(); + }); + executor.shutdown(); + } + + private void copyImageFilesForAllResolutionsIntoProject(Array files, Boolean performResize) { + copyImageFilesIntoProject(files, currentProjectInfoVO.originalResolution, performResize); + int totalWarnings = 0; + for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { + totalWarnings += copyImageFilesIntoProject(files, resolutionEntryVO, performResize); + } + if (totalWarnings > 0) { + Dialogs.showOKDialog(Sandbox.getInstance().getUIStage(), "Warning", totalWarnings + " images were not resized for smaller resolutions due to already small size ( < 3px )"); + } + } + + /** + * @param files + * @param resolution + * @param performResize + * @return number of images that did needed to be resized but failed + */ + private int copyImageFilesIntoProject(Array files, ResolutionEntryVO resolution, Boolean performResize) { + float ratio = ResolutionManager.getResolutionRatio(resolution, currentProjectInfoVO.originalResolution); + String targetPath = currentProjectPath + "/assets/" + resolution.name + "/images"; + float perCopyPercent = 95.0f / files.size; + + int resizeWarningsCount = 0; + + for (FileHandle handle : files) { + if (!HyperLap2DUtils.PNG_FILTER.accept(null, handle.name())) { + continue; + } + try { + BufferedImage bufferedImage; + if (performResize) { + bufferedImage = ResolutionManager.imageResize(handle.file(), ratio); + if (bufferedImage == null) { + bufferedImage = ImageIO.read(handle.file()); + resizeWarningsCount++; + } + } else { + bufferedImage = ImageIO.read(handle.file()); + } + + File target = new File(targetPath); + if (!target.exists()) { + File newFile = new File(targetPath); + newFile.mkdir(); + } + + // The filename should not be changed because the particle effects contain the name in their + // configuration. Unfortunately though, the texture packer does not support the underscore because + // any underscore in the texture packer is considered an image index. More info here: + // https://github.com/libgdx/libgdx/wiki/Texture-packer#image-indexes + // So, long story short, we MUST remove the underscore. + ImageIO.write(bufferedImage, "png", new File(targetPath + "/" + handle.name().replace("_", ""))); + } catch (IOException e) { + e.printStackTrace(); + } + changePercentBy(perCopyPercent); + } + + return resizeWarningsCount; + } + + public void importFontIntoProject(Array fileHandles, ProgressHandler progressHandler) { + if (fileHandles == null) { + return; + } + String targetPath = currentProjectPath + "/assets/orig/freetypefonts"; + handler = progressHandler; + float perCopyPercent = 95.0f / fileHandles.size; + for (FileHandle fileHandle : fileHandles) { + if (!HyperLap2DUtils.TTF_FILTER.accept(null, fileHandle.name())) { + continue; + } + try { + File target = new File(targetPath); + if (!target.exists()) { + File newFile = new File(targetPath); + newFile.mkdir(); + } + File fileTarget = new File(targetPath + "/" + fileHandle.name()); + FileUtils.copyFile(fileHandle.file(), fileTarget); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println(perCopyPercent); + changePercentBy(perCopyPercent); + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + handler.progressComplete(); + }); + executor.shutdown(); + } + } + + public void importStyleIntoProject(final FileHandle handle, ProgressHandler progressHandler) { + if (handle == null) { + return; + } + final String targetPath = currentProjectPath + "/assets/orig/styles"; + FileHandle fileHandle = Gdx.files.absolute(handle.path()); + final MySkin skin = new MySkin(fileHandle); + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + for (int i = 0; i < skin.fontFiles.size(); i++) { + File copyFontFile = new File(handle.path(), skin.fontFiles.get(i) + ".fnt"); + File copyImageFile = new File(handle.path(), skin.fontFiles.get(i) + ".png"); + if (!handle.isDirectory() && handle.exists() && copyFontFile.isFile() && copyFontFile.exists() && copyImageFile.isFile() && copyImageFile.exists()) { + File fileTarget = new File(targetPath + "/" + handle.name()); + File fontTarget = new File(targetPath + "/" + copyFontFile.getName()); + File imageTarget = new File(targetPath + "/" + copyImageFile.getName()); + try { + FileUtils.copyFile(handle.file(), fileTarget); + FileUtils.copyFile(copyFontFile, fontTarget); + FileUtils.copyFile(copyImageFile, imageTarget); + } catch (IOException e) { + // TODO Auto-generated catch block + System.err.println(e.getMessage()); + e.printStackTrace(); + } + } else { + System.err.println("SOME FILES ARE MISSING"); + } + } + }); + executor.execute(new Runnable() { + @Override + public void run() { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + handler.progressComplete(); + } + }); + executor.shutdown(); + } + + /** + * @depricated + */ + public void copyDefaultStyleIntoProject() { + /* + String targetPath = currentWorkingPath + "/" + currentProjectVO.projectName + "/assets/orig/styles"; + ResourceManager textureManager = facade.retrieveProxy(ResourceManager.NAME); + File source = new File("assets/ui"); + if (!(source.exists() && source.isDirectory())) { + try { + JarUtils.copyResourcesToDirectory(JarUtils.getThisJar(getClass()), "ui", targetPath); + textureManager.loadCurrentProjectSkin(targetPath); + return; + } catch (Exception e) { + e.printStackTrace(); + } + } + File fileTarget = new File(targetPath); + try { + FileUtils.copyDirectory(source, fileTarget); + textureManager.loadCurrentProjectSkin(targetPath); + } catch (IOException e) { + // TODO Auto-generated catch block + System.err.println(e.getMessage()); + e.printStackTrace(); + } + */ + } + + public String getFreeTypeFontPath() { + return currentProjectPath + "/assets/orig/freetypefonts"; + } + + public void exportProject() { + + String defaultBuildPath = currentProjectPath + "/export"; + exportPacks(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + exportPacks(currentProjectVO.projectMainExportPath); + } + exportAnimations(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + exportAnimations(currentProjectVO.projectMainExportPath); + } + exportParticles(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + exportParticles(currentProjectVO.projectMainExportPath); + } + exportShaders(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + exportShaders(currentProjectVO.projectMainExportPath); + } + exportFonts(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + exportFonts(currentProjectVO.projectMainExportPath); + } + exportStyles(defaultBuildPath); + SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); + sceneDataManager.buildScenes(defaultBuildPath); + if (!currentProjectVO.projectMainExportPath.isEmpty()) { + sceneDataManager.buildScenes(currentProjectVO.projectMainExportPath); + } + } + + + private void exportStyles(String targetPath) { + String srcPath = currentProjectPath + "/assets/orig"; + FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); + FileHandle stylesDirectory = origDirectoryHandle.child("styles"); + File fileTarget = new File(targetPath + "/" + stylesDirectory.name()); + try { + FileUtils.copyDirectory(stylesDirectory.file(), fileTarget); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + private void exportShaders(String targetPath) { + String srcPath = currentProjectPath + "/assets"; + FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); + FileHandle shadersDirectory = origDirectoryHandle.child("shaders"); + File fileTarget = new File(targetPath + "/" + shadersDirectory.name()); + try { + FileUtils.copyDirectory(shadersDirectory.file(), fileTarget); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void exportParticles(String targetPath) { + String srcPath = currentProjectPath + "/assets/orig"; + FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); + FileHandle particlesDirectory = origDirectoryHandle.child("particles"); + File fileTarget = new File(targetPath + "/" + particlesDirectory.name()); + try { + FileUtils.copyDirectory(particlesDirectory.file(), fileTarget); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void exportFonts(String targetPath) { + String srcPath = currentProjectPath + "/assets/orig"; + FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); + FileHandle fontsDirectory = origDirectoryHandle.child("freetypefonts"); + File fileTarget = new File(targetPath + "/" + fontsDirectory.name()); + try { + FileUtils.copyDirectory(fontsDirectory.file(), fileTarget); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + + private void exportAnimations(String targetPath) { + exportSpineAnimationForResolution("orig", targetPath); + exportSpriteAnimationForResolution("orig", targetPath); + exportSpriterAnimationForResolution("orig", targetPath); + for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { + exportSpineAnimationForResolution(resolutionEntryVO.name, targetPath); + exportSpriteAnimationForResolution(resolutionEntryVO.name, targetPath); + exportSpriterAnimationForResolution(resolutionEntryVO.name, targetPath); + } + } + + private void exportSpineAnimationForResolution(String res, String targetPath) { + String spineSrcPath = currentProjectPath + "/assets/" + res + File.separator + "spine-animations"; + try { + FileUtils.forceMkdir(new File(targetPath + File.separator + res + File.separator + "spine_animations")); + File fileSrc = new File(spineSrcPath); + String finalTarget = targetPath + File.separator + res + File.separator + "spine_animations"; + + File fileTargetSpine = new File(finalTarget); + + FileUtils.copyDirectory(fileSrc, fileTargetSpine); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + private void exportSpriteAnimationForResolution(String res, String targetPath) { + String spineSrcPath = currentProjectPath + "/assets/" + res + File.separator + "sprite-animations"; + try { + FileUtils.forceMkdir(new File(targetPath + File.separator + res + File.separator + "sprite_animations")); + File fileSrc = new File(spineSrcPath); + String finalTarget = targetPath + File.separator + res + File.separator + "sprite_animations"; + + File fileTargetSprite = new File(finalTarget); + + FileUtils.copyDirectory(fileSrc, fileTargetSprite); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + private void exportSpriterAnimationForResolution(String res, String targetPath) { + String spineSrcPath = currentProjectPath + "/assets/" + res + File.separator + "spriter-animations"; + try { + FileUtils.forceMkdir(new File(targetPath + File.separator + res + File.separator + "spriter_animations")); + File fileSrc = new File(spineSrcPath); + String finalTarget = targetPath + File.separator + res + File.separator + "spriter_animations"; + File fileTargetSpriter = new File(finalTarget); + FileUtils.copyDirectory(fileSrc, fileTargetSpriter); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + private void exportPacks(String targetPath) { + String srcPath = currentProjectPath + "/assets"; + FileHandle assetDirectoryHandle = Gdx.files.absolute(srcPath); + FileHandle[] assetDirectories = assetDirectoryHandle.list(); + for (FileHandle assetDirectory : assetDirectories) { + if (assetDirectory.isDirectory()) { + FileHandle assetDirectoryFileHandle = Gdx.files.absolute(assetDirectory.path()); + FileHandle[] packFiles = assetDirectoryFileHandle.child("pack").list(); + for (FileHandle packFile : packFiles) { + File fileTarget = new File(targetPath + "/" + assetDirectory.name() + "/" + packFile.name()); + try { + FileUtils.copyFile(packFile.file(), fileTarget); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + } + } + + public void setExportPaths(String path) { + currentProjectVO.projectMainExportPath = path; + } + + public String getExportPath() { + if (currentProjectVO == null || currentProjectVO.projectMainExportPath == null) { + return ""; + } + return currentProjectVO.projectMainExportPath; + } + + public void setTexturePackerSizes(int width, int height) { + currentProjectVO.texturepackerWidth = String.valueOf(width); + currentProjectVO.texturepackerHeight = String.valueOf(height); + } + + public void setTexturePackerDuplicate(boolean duplicate) { + currentProjectVO.texturepackerDuplicate = duplicate; + } + + public String getRootPath() { + File root = new File(new File(".").getAbsolutePath()).getParentFile(); + return root.getAbsolutePath(); + } + + private EditorConfigVO getEditorConfig() { + EditorConfigVO editorConfig = new EditorConfigVO(); + String configFilePath = getRootPath() + File.separator + "configs" + File.separator + EditorConfigVO.EDITOR_CONFIG_FILE; + File configFile = new File(configFilePath); + if (!configFile.exists()) { + try { + FileUtils.writeStringToFile(new File(configFilePath), editorConfig.constructJsonString(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Json gson = new Json(); + String editorConfigJson = null; + try { + editorConfigJson = FileUtils.readFileToString(Gdx.files.absolute(configFilePath).file()); + editorConfig = gson.fromJson(EditorConfigVO.class, editorConfigJson); + } catch (IOException e) { + e.printStackTrace(); + } + } + return editorConfig; + } + + public void createNewProject(String projectPath, int originWidth, int originHeight, int pixelPerWorldUnit) { + if (projectPath == null || projectPath.equals("")) { + return; + } + String projectName = new File(projectPath).getName(); + + if (projectName.equals("")) { + return; + } + + try { + createEmptyProject(projectPath, originWidth, originHeight, pixelPerWorldUnit); + openProjectAndLoadAllData(projectPath); + String workSpacePath = projectPath.substring(0, projectPath.lastIndexOf(projectName)); + if (workSpacePath.length() > 0) { + setLastOpenedPath(workSpacePath); + } + Sandbox.getInstance().loadCurrentProject(); + facade.sendNotification(PROJECT_OPENED); + + //Set title with opened file path + setWindowTitle(getFormattedTitle(projectPath)); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void openProjectFromPath(String path) { + File projectFile = new File(path); + File projectFolder = projectFile.getParentFile(); + String projectName = projectFolder.getName(); + editorConfigVO.lastOpenedSystemPath = projectFolder.getParentFile().getPath(); + saveEditorConfig(); + + // here we load all data + openProjectAndLoadAllData(projectFolder.getPath()); + Sandbox.getInstance().loadCurrentProject(); + + facade.sendNotification(ProjectManager.PROJECT_OPENED); + + //Set title with opened file path + setWindowTitle(getFormattedTitle(path)); + } + + + private String getFormattedTitle(String path) { + //App Name + path to opened file + return currentProjectVO.projectName + " [ " + getCurrentSceneConfigVO().sceneName + " ] - " + path; + } + + private void setWindowTitle(String title) { + currentWindowTitle = title; + Gdx.graphics.setTitle(currentWindowTitle); + } + + public void appendSaveHintTitle(boolean isModified) { + if (!isModified) { + Gdx.graphics.setTitle(currentWindowTitle); + } else { + Gdx.graphics.setTitle(currentWindowTitle + "*"); + } + } + + public void changeSceneWindowTitle() { + setWindowTitle(getFormattedTitle(currentProjectPath)); + } + + public SceneConfigVO getCurrentSceneConfigVO() { + for (int i = 0; i < currentProjectVO.sceneConfigs.size(); i++) { + if (currentProjectVO.sceneConfigs.get(i).sceneName.equals(Sandbox.getInstance().getSceneControl().getCurrentSceneVO().sceneName)) { + return currentProjectVO.sceneConfigs.get(i); + } + } + + SceneConfigVO newConfig = new SceneConfigVO(); + newConfig.sceneName = Sandbox.getInstance().getSceneControl().getCurrentSceneVO().sceneName; + currentProjectVO.sceneConfigs.add(newConfig); + + return newConfig; + } + + public void importShaderIntoProject(Array files, ProgressHandler progressHandler) { + if (files == null) { + return; + } + handler = progressHandler; + currentPercent = 0; + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + for (FileHandle handle : files) { + // check if shaders folder exists + String shadersPath = currentProjectPath + "/assets/shaders"; + File destination = new File(currentProjectPath + "/assets/shaders/" + handle.name()); + try { + FileUtils.forceMkdir(new File(shadersPath)); + FileUtils.copyFile(handle.file(), destination); + } catch (IOException e) { + e.printStackTrace(); + } + } + + }); + executor.execute(() -> { + changePercentBy(100 - currentPercent); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + handler.progressComplete(); + }); + executor.shutdown(); + } + + public String getCurrentProjectPath() { + return currentProjectPath; + } + + public FileHandle getWorkspacePath() { + if (!editorConfigVO.lastOpenedSystemPath.isEmpty()) { + return new FileHandle(editorConfigVO.lastOpenedSystemPath); + } + return new FileHandle(defaultWorkspacePath); + } + + public FileHandle getImportPath() { + if (!editorConfigVO.lastImportedSystemPath.isEmpty()) { + return new FileHandle(editorConfigVO.lastImportedSystemPath); + } + return null; + } + + public boolean deleteImage(String imageName) { + Path path = Paths.get(currentProjectPath, "/assets/orig/images/", imageName); + + ArrayList possibleFiles = Lists.newArrayList( + path.resolveSibling(path.getFileName() + ".png"), + path.resolveSibling(path.getFileName() + ".9.png")); + + for(Path p : possibleFiles) { + if (p.toFile().exists()) + return p.toFile().delete(); + } + + throw new IllegalStateException(String.format("The file %s is not found",path.toString())); + + } + + public boolean deleteSingleImage(String imageName) { + String imagesPath = currentProjectPath + File.separator + IMAGE_DIR_PATH + File.separator; + String filePath = imagesPath + imageName + ".png"; + if (!(new File(filePath)).delete()) { + filePath = imagesPath + imageName + ".9.png"; + return (new File(filePath)).delete(); + } + return true; + } + + public boolean deleteParticle(String particleName) { + String particlePath = currentProjectPath + File.separator + PARTICLE_DIR_PATH + File.separator; + String filePath = particlePath + particleName; + return (new File(filePath)).delete(); + } + + public boolean deleteSpineAnimation(String spineName) { + String spinePath = currentProjectPath + File.separator + SPINE_DIR_PATH + File.separator; + String filePath = spinePath + spineName; + return deleteDirectory(filePath); + } + + public boolean deleteSpriteAnimation(String spineName) { + String spritePath = currentProjectPath + File.separator + SPRITE_DIR_PATH + File.separator; + String filePath = spritePath + spineName; + return deleteDirectory(filePath); + } + + public boolean deleteSpriterAnimation(String spineName) { + String spriterPath = currentProjectPath + File.separator + SPRITER_DIR_PATH + File.separator; + String filePath = spriterPath + spineName; + return deleteDirectory(filePath); + } + + private boolean deleteDirectory(String path) { + File file = new File(path); + if (file.exists()) { + try { + FileUtils.deleteDirectory(file); + } catch (IOException e) { + e.printStackTrace(); + } + if (!file.exists()) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java new file mode 100644 index 00000000..2d13b58b --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java @@ -0,0 +1,509 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.imageio.ImageIO; + +import com.kotcrab.vis.ui.util.dialog.Dialogs; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.tools.texturepacker.TexturePacker; +import com.badlogic.gdx.tools.texturepacker.TextureUnpacker; +import com.badlogic.gdx.utils.Array; +import com.mortennobel.imagescaling.ResampleOp; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.ui.widget.ProgressHandler; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.ResolutionEntryVO; +import games.rednblack.editor.utils.NinePatchUtils; +import games.rednblack.editor.utils.HyperLap2DUtils; + +public class ResolutionManager extends BaseProxy { + private static final String TAG = ResolutionManager.class.getCanonicalName(); + public static final String NAME = TAG; + + public static final String RESOLUTION_LIST_CHANGED = "games.rednblack.editor.proxy.ResolutionManager" + ".RESOLUTION_LIST_CHANGED"; + + private static final String EXTENSION_9PATCH = ".9.png"; + public String currentResolutionName; + private float currentPercent = 0.0f; + + private ProgressHandler handler; + + + public ResolutionManager() { + super(NAME); + } + + public static BufferedImage imageResize(File file, float ratio) { + BufferedImage destinationBufferedImage = null; + try { + BufferedImage sourceBufferedImage = ImageIO.read(file); + if (ratio == 1.0) { + return sourceBufferedImage; + } + // When image has to be resized smaller then 3 pixels we should leave it as is, as to ResampleOP limitations + // But it should also trigger a warning dialog at the and of the import, to notify the user of non resized images. + if (sourceBufferedImage.getWidth() * ratio < 3 || sourceBufferedImage.getHeight() * ratio < 3) { + return null; + } + int newWidth = Math.max(3, Math.round(sourceBufferedImage.getWidth() * ratio)); + int newHeight = Math.max(3, Math.round(sourceBufferedImage.getHeight() * ratio)); + String name = file.getName(); + Integer[] patches = null; + if (name.endsWith(EXTENSION_9PATCH)) { + patches = NinePatchUtils.findPatches(sourceBufferedImage); + sourceBufferedImage = NinePatchUtils.removePatches(sourceBufferedImage); + + newWidth = Math.round(sourceBufferedImage.getWidth() * ratio); + newHeight = Math.round(sourceBufferedImage.getHeight() * ratio); + System.out.println(sourceBufferedImage.getWidth()); + + destinationBufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = destinationBufferedImage.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); + g2.drawImage(sourceBufferedImage, 0, 0, newWidth, newHeight, null); + g2.dispose(); + } else { + // resize with bilinear filter + ResampleOp resampleOp = new ResampleOp(newWidth, newHeight); + destinationBufferedImage = resampleOp.filter(sourceBufferedImage, null); + } + + if (patches != null) { + destinationBufferedImage = NinePatchUtils.convertTo9Patch(destinationBufferedImage, patches, ratio); + } + + } catch (IOException ignored) { + + } + + return destinationBufferedImage; + } + + public static float getResolutionRatio(ResolutionEntryVO resolution, ResolutionEntryVO originalResolution) { + float a; + float b; + switch (resolution.base) { + default: + case 0: + a = resolution.width; + b = originalResolution.width; + break; + case 1: + a = resolution.height; + b = originalResolution.height; + break; + } + return a / b; + } + + public static int getMinSquareNum(int num) { + + // if (num < 1024) return 1024; + + // if (num < 2048) return 2048; + + // if (num < 4096) return 4096; + + + return 4096; + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + +// private static BufferedImage convertTo9Patch(BufferedImage image) { + + // } + public void createNewResolution(ResolutionEntryVO resolutionEntryVO) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.getCurrentProjectInfoVO().resolutions.add(resolutionEntryVO); + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + // create new folder structure + String projPath = projectManager.getCurrentProjectPath(); + String sourcePath = projPath + "/" + "assets/orig/images"; + String targetPath = projPath + "/" + "assets/" + resolutionEntryVO.name + "/images"; + createIfNotExist(sourcePath); + createIfNotExist(projPath + "/" + "assets/" + resolutionEntryVO.name + "/pack"); + copyTexturesFromTo(sourcePath, targetPath); + int resizeWarnings = resizeTextures(targetPath, resolutionEntryVO); + rePackProjectImages(resolutionEntryVO); + createResizedAnimations(resolutionEntryVO); + changePercentBy(5); + if (resizeWarnings > 0) { + Dialogs.showOKDialog(Sandbox.getInstance().getUIStage(), "Warning", resizeWarnings + " images were not resized for smaller resolutions due to already small size ( < 3px )"); + } + HyperLap2DFacade.getInstance().sendNotification(RESOLUTION_LIST_CHANGED); + }); + executor.execute(() -> { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + projectManager.saveCurrentProject(); +// handler.progressComplete(); + }); + executor.shutdown(); + } + + + private void changePercentBy(float value) { + currentPercent += value; + //handler.progressChanged(currentPercent); + } + + public void createResizedAnimations(ResolutionEntryVO resolution) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String currProjectPath = projectManager.getCurrentProjectPath(); + + // Unpack spine orig + File spineSourceDir = new File(currProjectPath + File.separator + "assets/orig/spine-animations"); + if (spineSourceDir.exists()) { + for (File entry : spineSourceDir.listFiles()) { + if (entry.isDirectory()) { + String animName = FilenameUtils.removeExtension(entry.getName()); + createResizedSpineAnimation(animName, resolution); + } + } + } + + //Unpack sprite orig + File spriteSourceDir = new File(currProjectPath + File.separator + "assets/orig/sprite-animations"); + if (spriteSourceDir.exists()) { + for (File entry : spriteSourceDir.listFiles()) { + if (entry.isDirectory()) { + String animName = FilenameUtils.removeExtension(entry.getName()); + createResizedSpriteAnimation(animName, resolution); + } + } + } + } + + public void createResizedSpriteAnimation(String animName, ResolutionEntryVO resolution) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String currProjectPath = projectManager.getCurrentProjectPath(); + File animAtlasFile = new File(currProjectPath + File.separator + "assets/orig/sprite-animations/" + animName + "/" + animName + ".atlas"); + + String tmpPath = currProjectPath + File.separator + "assets/orig/sprite-animations/" + animName + "/tmp"; + File tmpFolder = new File(tmpPath); + try { + FileUtils.forceMkdir(new File(currProjectPath + File.separator + "assets/" + resolution.name + "/sprite-animations/")); + FileUtils.forceMkdir(new File(currProjectPath + File.separator + "assets/" + resolution.name + "/spine-animations/" + animName)); + + String targetPath = currProjectPath + File.separator + "assets/" + resolution.name + "/sprite-animations/" + animName; + File targetFolder = new File(targetPath); + + unpackAtlasIntoTmpFolder(animAtlasFile, tmpPath); + resizeImagesTmpDirToResolution(animName, tmpFolder, resolution, targetFolder); + + + FileUtils.deleteDirectory(tmpFolder); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void unpackAtlasIntoTmpFolder(File atlasFile, String tmpDir) { + FileHandle atlasFileHandle = new FileHandle(atlasFile); + TextureAtlas.TextureAtlasData atlasData = new TextureAtlas.TextureAtlasData(atlasFileHandle, atlasFileHandle.parent(), false); + TextureUnpacker unpacker = new TextureUnpacker(); + unpacker.splitAtlas(atlasData, tmpDir); + } + + public void createResizedSpineAnimation(String animName, ResolutionEntryVO resolution) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String currProjectPath = projectManager.getCurrentProjectPath(); + + File animAtlasFile = new File(currProjectPath + File.separator + "assets/orig/spine-animations/" + animName + "/" + animName + ".atlas"); + + String tmpPath = currProjectPath + File.separator + "assets/orig/spine-animations/" + animName + "/tmp"; + File tmpFolder = new File(tmpPath); + try { + FileUtils.forceMkdir(new File(currProjectPath + File.separator + "assets/" + resolution.name + "/spine-animations/")); + FileUtils.forceMkdir(new File(currProjectPath + File.separator + "assets/" + resolution.name + "/spine-animations/" + animName)); + + String targetPath = currProjectPath + File.separator + "assets/" + resolution.name + "/spine-animations/" + animName; + File targetFolder = new File(targetPath); + + unpackAtlasIntoTmpFolder(animAtlasFile, tmpPath); + resizeImagesTmpDirToResolution(animName, tmpFolder, resolution, targetFolder); + + FileUtils.deleteDirectory(tmpFolder); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void resizeSpriteAnimationForAllResolutions(String animName, ProjectInfoVO currentProjectInfoVO) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String currProjectPath = projectManager.getCurrentProjectPath(); + + File atlasFile = new File(currProjectPath + File.separator + "assets" + File.separator + "orig" + File.separator + "sprite-animations" + File.separator + animName + File.separator + animName + ".atlas"); + + String tmpDir = currProjectPath + File.separator + "assets" + File.separator + "orig" + File.separator + "sprite-animations" + File.separator + animName + File.separator + "tmp"; + File sourceFolder = new File(tmpDir); + + unpackAtlasIntoTmpFolder(atlasFile, tmpDir); + try { + for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { + String spriteAnimationsRoot = currProjectPath + File.separator + "assets" + File.separator + resolutionEntryVO.name + File.separator + "sprite-animations"; + FileUtils.forceMkdir(new File(spriteAnimationsRoot)); + String targetPath = spriteAnimationsRoot + File.separator + animName; + File targetFolder = new File(targetPath); + + resizeImagesTmpDirToResolution(animName, sourceFolder, resolutionEntryVO, targetFolder); + } + + FileUtils.deleteDirectory(sourceFolder); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void resizeSpineAnimationForAllResolutions(File atlasFile, ProjectInfoVO currentProjectInfoVO) { + + String fileNameWithOutExt = FilenameUtils.removeExtension(atlasFile.getName()); + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String tmpDir = projectManager.getCurrentProjectPath() + "/assets/orig/spine-animations" + File.separator + fileNameWithOutExt + File.separator + "tmp"; + File sourceFolder = new File(tmpDir); + + unpackAtlasIntoTmpFolder(atlasFile, tmpDir); + try { + for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { + FileUtils.forceMkdir(new File(projectManager.getCurrentProjectPath() + File.separator + + "assets" + File.separator + resolutionEntryVO.name + File.separator + "spine-animations")); + String targetPath = projectManager.getCurrentProjectPath() + File.separator + "assets" + + File.separator + resolutionEntryVO.name + File.separator + "spine-animations" + File.separator + fileNameWithOutExt; + FileUtils.forceMkdir(new File(targetPath)); + File targetFolder = new File(targetPath); + resizeImagesTmpDirToResolution(atlasFile.getName(), sourceFolder, resolutionEntryVO, targetFolder); + } + FileUtils.deleteDirectory(sourceFolder); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void rePackProjectImages(ResolutionEntryVO resEntry) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + TexturePacker.Settings settings = new TexturePacker.Settings(); + + settings.flattenPaths = true; + settings.maxHeight = Integer.parseInt(projectManager.getCurrentProjectVO().texturepackerHeight); + settings.maxWidth = Integer.parseInt(projectManager.getCurrentProjectVO().texturepackerWidth); + settings.filterMag = Texture.TextureFilter.Linear; + settings.filterMin = Texture.TextureFilter.Linear; + settings.duplicatePadding = projectManager.getCurrentProjectVO().texturepackerDuplicate; + + TexturePacker tp = new TexturePacker(settings); + + String sourcePath = projectManager.getCurrentProjectPath() + "/assets/" + resEntry.name + "/images"; + String outputPath = projectManager.getCurrentProjectPath() + "/assets/" + resEntry.name + "/pack"; + + FileHandle sourceDir = new FileHandle(sourcePath); + File outputDir = new File(outputPath); + + try { + FileUtils.forceMkdir(outputDir); + FileUtils.cleanDirectory(outputDir); + } catch (IOException e) { + e.printStackTrace(); + } + + for (FileHandle entry : sourceDir.list()) { + String filename = entry.file().getName(); + String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); + if (extension.equals("png")) { + tp.addImage(entry.file()); + } + } + + tp.pack(outputDir, "pack"); + } + + private int resizeTextures(String path, ResolutionEntryVO resolution) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + float ratio = getResolutionRatio(resolution, projectManager.getCurrentProjectInfoVO().originalResolution); + FileHandle targetDir = new FileHandle(path); + FileHandle[] entries = targetDir.list(HyperLap2DUtils.PNG_FILTER); + float perResizePercent = 95.0f / entries.length; + + int resizeWarnings = 0; + + for (FileHandle entry : entries) { + try { + File file = entry.file(); + File destinationFile = new File(path + "/" + file.getName()); + BufferedImage resizedImage = ResolutionManager.imageResize(file, ratio); + if (resizedImage == null) { + resizeWarnings++; + ImageIO.write(ImageIO.read(file), "png", destinationFile); + } else { + ImageIO.write(ResolutionManager.imageResize(file, ratio), "png", destinationFile); + } + } catch (IOException e) { + e.printStackTrace(); + } + changePercentBy(perResizePercent); + } + + return resizeWarnings; + } + + private void copyTexturesFromTo(String fromPath, String toPath) { + FileHandle sourceDir = new FileHandle(fromPath); + FileHandle[] entries = sourceDir.list(HyperLap2DUtils.PNG_FILTER); + float perCopyPercent = 10.0f / entries.length; + for (FileHandle entry : entries) { + File file = entry.file(); + String filename = file.getName(); + File target = new File(toPath + "/" + filename); + try { + FileUtils.copyFile(file, target); + } catch (IOException e) { + e.printStackTrace(); + } + } + changePercentBy(perCopyPercent); + } + + private File createIfNotExist(String dirPath) { + File theDir = new File(dirPath); + boolean result = false; + // if the directory does not exist, create it + if (!theDir.exists()) { + result = theDir.mkdir(); + } + + if (result) + return theDir; + else return null; + } + + public void resizeImagesTmpDirToResolution(String packName, File sourceFolder, ResolutionEntryVO resolution, File targetFolder) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + float ratio = ResolutionManager.getResolutionRatio(resolution, projectManager.getCurrentProjectInfoVO().originalResolution); + + if (targetFolder.exists()) { + try { + FileUtils.cleanDirectory(targetFolder); + } catch (IOException e) { + e.printStackTrace(); + } + } + // now pack + TexturePacker.Settings settings = new TexturePacker.Settings(); + + settings.flattenPaths = true; + settings.maxHeight = Integer.parseInt(projectManager.getCurrentProjectVO().texturepackerHeight); + settings.maxWidth = Integer.parseInt(projectManager.getCurrentProjectVO().texturepackerWidth); + settings.filterMag = Texture.TextureFilter.Linear; + settings.filterMin = Texture.TextureFilter.Linear; + + TexturePacker tp = new TexturePacker(settings); + for (final File fileEntry : sourceFolder.listFiles()) { + if (!fileEntry.isDirectory()) { + BufferedImage bufferedImage = ResolutionManager.imageResize(fileEntry, ratio); + tp.addImage(bufferedImage, FilenameUtils.removeExtension(fileEntry.getName())); + } + } + + tp.pack(targetFolder, packName); + } + + public float getCurrentMul() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + ResolutionEntryVO curRes = projectManager.getCurrentProjectInfoVO().getResolution(currentResolutionName); + float mul = 1f; + if (!currentResolutionName.equals("orig")) { + if (curRes.base == 0) { + mul = (float) curRes.width / (float) projectManager.getCurrentProjectInfoVO().originalResolution.width; + } else { + mul = (float) curRes.height / (float) projectManager.getCurrentProjectInfoVO().originalResolution.height; + } + } + + return mul; + } + + public void rePackProjectImagesForAllResolutions() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + rePackProjectImages(projectManager.getCurrentProjectInfoVO().originalResolution); + for (ResolutionEntryVO resolutionEntryVO : projectManager.getCurrentProjectInfoVO().resolutions) { + rePackProjectImages(resolutionEntryVO); + } + } + + public void deleteResolution(ResolutionEntryVO resolutionEntryVO) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + try { + FileUtils.deleteDirectory(new File(projectManager.getCurrentProjectPath() + "/assets/" + resolutionEntryVO.name)); + } catch (IOException ignored) { + ignored.printStackTrace(); + } + + currentResolutionName = getOriginalResolution().name; + + ProjectInfoVO projectInfo = projectManager.getCurrentProjectInfoVO(); + projectInfo.resolutions.removeValue(resolutionEntryVO, false); + HyperLap2DFacade.getInstance().sendNotification(RESOLUTION_LIST_CHANGED); + projectManager.saveCurrentProject(); + projectManager.openProjectAndLoadAllData(projectManager.getCurrentProjectPath(), "orig"); + } + + public Array getResolutions() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.getCurrentProjectInfoVO().resolutions; + } + + public ResolutionEntryVO getOriginalResolution() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.getCurrentProjectInfoVO().originalResolution; + } + + public ResolutionEntryVO getCurrentResolution() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + for (ResolutionEntryVO res : projectManager.getCurrentProjectInfoVO().resolutions) { + if (res.name.equals(currentResolutionName)) { + return res; + } + } + return getOriginalResolution(); + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java new file mode 100644 index 00000000..5b3f1e59 --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -0,0 +1,426 @@ +package games.rednblack.editor.proxy; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map.Entry; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import games.rednblack.editor.renderer.data.*; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; + +import com.badlogic.gdx.Files; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.utils.Json; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.data.SpineAnimData; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.resources.FontSizePair; +import games.rednblack.editor.renderer.resources.IResourceRetriever; +import games.rednblack.editor.renderer.utils.MySkin; + +/** + * Created by azakhary on 4/26/2015. + */ +public class ResourceManager extends BaseProxy implements IResourceRetriever { + + public String packResolutionName = "orig"; + + private static final String TAG = ResourceManager.class.getCanonicalName(); + public static final String NAME = TAG; + + private HashMap particleEffects = new HashMap(1); + private TextureAtlas currentProjectAtlas; + + private HashMap spineAnimAtlases = new HashMap(); + private HashMap spriteAnimAtlases = new HashMap(); + private HashMap spriterAnimFiles = new HashMap(); + private HashMap bitmapFonts = new HashMap<>(); + private HashMap shaderPrograms = new HashMap(1); + + private TextureRegion defaultRegion; + + private ResolutionManager resolutionManager; + + public ResourceManager() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + + // TODO: substitute this with "NO IMAGE" icon + Pixmap pixmap = new Pixmap(50, 50, Pixmap.Format.RGBA8888); + pixmap.setColor(new Color(1, 1, 1, 0.4f)); + pixmap.fill(); + defaultRegion = new TextureRegion(new Texture(pixmap)); + } + + @Override + public TextureRegion getTextureRegion(String name) { + TextureRegion reg = currentProjectAtlas.findRegion(name); + + if(reg == null) { + reg = defaultRegion; + } + + return reg; + } + + public TextureAtlas getTextureAtlas() { + return currentProjectAtlas; + } + + @Override + public ParticleEffect getParticleEffect(String name) { + return new ParticleEffect(particleEffects.get(name)); + } + + + @Override + public TextureAtlas getSkeletonAtlas(String animationName) { + SpineAnimData animData = spineAnimAtlases.get(animationName); + return animData.atlas; + } + + /** + * Sets working resolution, please set before doing any loading + * @param resolution String resolution name, default is "orig" later use resolution names created in editor + */ + public void setWorkingResolution(String resolution) { + ResolutionEntryVO resolutionObject = getProjectVO().getResolution("resolutionName"); + if(resolutionObject != null) { + packResolutionName = resolution; + } + } + + + @Override + public FileHandle getSkeletonJSON(String animationName) { + SpineAnimData animData = spineAnimAtlases.get(animationName); + return animData.jsonFile; + } + + @Override + public FileHandle getSCMLFile(String name) { + return spriterAnimFiles.get(name); + } + + + @Override + public TextureAtlas getSpriteAnimation(String animationName) { + return spriteAnimAtlases.get(animationName); + } + + + @Override + public BitmapFont getBitmapFont(String fontName, int fontSize) { + FontSizePair pair = new FontSizePair(fontName, fontSize); + return bitmapFonts.get(pair); + } + + + @Override + public MySkin getSkin() { + //return textureManager.projectSkin; + // not sure if we are going to use skins for labels + return null; + } + + @Override + public ProjectInfoVO getProjectVO() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.getCurrentProjectInfoVO(); + } + + + @Override + public SceneVO getSceneVO(String name) { + SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); + // TODO: this should be cached + FileHandle file = Gdx.files.internal(sceneDataManager.getCurrProjectScenePathByName(name)); + Json json = new Json(); + json.setIgnoreUnknownFields(true); + return json.fromJson(SceneVO.class, file.readString()); + } + + public void loadCurrentProjectData(String projectPath, String curResolution) { + packResolutionName = curResolution; + loadCurrentProjectAssets(projectPath + "/assets/" + curResolution + "/pack/pack.atlas"); + loadCurrentProjectSkin(projectPath + "/assets/orig/styles"); + loadCurrentProjectParticles(projectPath + "/assets/orig/particles"); + loadCurrentProjectSpineAnimations(projectPath + "/assets/", curResolution); + loadCurrentProjectSpriteAnimations(projectPath + "/assets/", curResolution); + loadCurrentProjectSpriterAnimations(projectPath + "/assets/", curResolution); + loadCurrentProjectBitmapFonts(projectPath, curResolution); + loadCurrentProjectShaders(projectPath + "/assets/shaders/"); + } + + private void loadCurrentProjectParticles(String path) { + particleEffects.clear(); + FileHandle sourceDir = new FileHandle(path); + for (FileHandle entry : sourceDir.list()) { + File file = entry.file(); + String filename = file.getName(); + if (file.isDirectory() || filename.endsWith(".DS_Store")) continue; + + ParticleEffect particleEffect = new ParticleEffect(); + particleEffect.load(Gdx.files.internal(file.getAbsolutePath()), currentProjectAtlas, ""); + particleEffects.put(filename, particleEffect); + } + + } + + + private void loadCurrentProjectSpineAnimations(String path, String curResolution) { + spineAnimAtlases.clear(); + FileHandle sourceDir = new FileHandle(path + "orig/spine-animations"); + for (FileHandle entry : sourceDir.list()) { + if (entry.file().isDirectory()) { + String animName = FilenameUtils.removeExtension(entry.file().getName()); + TextureAtlas atlas = new TextureAtlas(Gdx.files.internal(path + curResolution + "/spine-animations/" + File.separator + animName + File.separator + animName + ".atlas")); + FileHandle animJsonFile = Gdx.files.internal(entry.file().getAbsolutePath() + File.separator + animName + ".json"); + SpineAnimData data = new SpineAnimData(); + data.atlas = atlas; + data.jsonFile = animJsonFile; + data.animName = animName; + spineAnimAtlases.put(animName, data); + } + } + + } + + private void loadCurrentProjectSpriteAnimations(String path, String curResolution) { + spriteAnimAtlases.clear(); + FileHandle sourceDir = new FileHandle(path + curResolution + "/sprite-animations"); + for (FileHandle entry : sourceDir.list()) { + if (entry.file().isDirectory()) { + String animName = FilenameUtils.removeExtension(entry.file().getName()); + try { + TextureAtlas atlas = new TextureAtlas(Gdx.files.internal(entry.file().getAbsolutePath() + File.separator + animName + ".atlas")); + spriteAnimAtlases.put(animName, atlas); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + private void loadCurrentProjectSpriterAnimations(String path, String curResolution) { + spriterAnimFiles.clear(); + FileHandle sourceDir = new FileHandle(path + "orig" + "/spriter-animations"); + for (FileHandle entry : sourceDir.list()) { + if (entry.file().isDirectory()) { + String animName = entry.file().getName(); + FileHandle scmlFile = new FileHandle(path + "orig" + "/spriter-animations/" + animName + "/" + animName + ".scml"); + spriterAnimFiles.put(animName, scmlFile); + } + } + } + + public void loadCurrentProjectAssets(String packPath) { + try { + currentProjectAtlas = new TextureAtlas(Gdx.files.getFileHandle(packPath, Files.FileType.Internal)); + } catch (Exception e) { + currentProjectAtlas = new TextureAtlas(); + } + } + + public ArrayList getProjectRequiredFontsList() { + HashSet fontsToLoad = new HashSet<>(); + + for (int i = 0; i < getProjectVO().scenes.size(); i++) { + SceneVO scene = getSceneVO(getProjectVO().scenes.get(i).sceneName); + CompositeVO composite = scene.composite; + if (composite == null) { + continue; + } + FontSizePair[] fonts = composite.getRecursiveFontList(); + for (CompositeItemVO library : getProjectVO().libraryItems.values()) { + FontSizePair[] libFonts = library.composite.getRecursiveFontList(); + Collections.addAll(fontsToLoad, libFonts); + } + Collections.addAll(fontsToLoad, fonts); + } + + return new ArrayList<>(fontsToLoad); + } + + public void loadCurrentProjectBitmapFonts(String path, String curResolution) { + bitmapFonts.clear(); + + ArrayList requiredFonts = getProjectRequiredFontsList(); + for (int i = 0; i < requiredFonts.size(); i++) { + FontSizePair pair = requiredFonts.get(i); + FileHandle fontFile; + try { + fontFile = getTTFSafely(pair.fontName); + FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile); + FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); + parameter.size = Math.round(pair.fontSize * resolutionManager.getCurrentMul()); + BitmapFont font = generator.generateFont(parameter); + font.setUseIntegerPositions(false); + bitmapFonts.put(pair, font); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void loadCurrentProjectShaders(String path) { + Iterator> it = shaderPrograms.entrySet().iterator(); + while (it.hasNext()) { + Entry pair = it.next(); + pair.getValue().dispose(); + it.remove(); + } + shaderPrograms.clear(); + FileHandle sourceDir = new FileHandle(path); + for (FileHandle entry : sourceDir.list()) { + File file = entry.file(); + String filename = file.getName().replace(".vert", "").replace(".frag", ""); + if (file.isDirectory() || filename.endsWith(".DS_Store") || shaderPrograms.containsKey(filename)) continue; + // check if pair exists. + if(Gdx.files.internal(path + filename + ".vert").exists() && Gdx.files.internal(path + filename + ".frag").exists()) { + ShaderProgram shaderProgram = new ShaderProgram(Gdx.files.internal(path + filename + ".vert"), Gdx.files.internal(path + filename + ".frag")); + System.out.println(shaderProgram.getLog()); + shaderPrograms.put(filename, shaderProgram); + } + } + + } + + /** + * @param fontPath + * @deprecated + */ + private void loadCurrentProjectSkin(String fontPath) { + /* + File styleFile = new File(fontPath, "styles.dt"); + FileHandle f = new FileHandle(styleFile); + + if (styleFile.isFile() && styleFile.exists()) { + projectSkin = new MySkin(f); + ObjectMap map = projectSkin.getAll(BitmapFont.class); + for (ObjectMap.Entry entry : map.entries()) { + projectSkin.getFont(entry.key).getRegion().getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); + } + } + */ + } + + public FileHandle getTTFSafely(String fontName) throws IOException { + FontManager fontManager = facade.retrieveProxy(FontManager.NAME); + + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String expectedPath = projectManager.getFreeTypeFontPath() + File.separator + fontName + ".ttf"; + FileHandle expectedFile = Gdx.files.internal(expectedPath); + if (!expectedFile.exists()) { + // let's check if system fonts fot it + HashMap fonts = fontManager.getFontsMap(); + if (fonts.containsKey(fontName)) { + File source = new File(fonts.get(fontName)); + FileUtils.copyFile(source, expectedFile.file()); + expectedFile = Gdx.files.internal(expectedPath); + } else { + throw new FileNotFoundException(); + } + } + + return expectedFile; + } + + public void addBitmapFont(String name, int size, BitmapFont font) { + bitmapFonts.put(new FontSizePair(name, size), font); + } + + public void flushAllUnusedFonts() { + //List of fonts that are required to be in memory + ArrayList requiredFonts = getProjectRequiredFontsList(); + ArrayList fontsInMemory = new ArrayList<>(bitmapFonts.keySet()); + + for (FontSizePair font : fontsInMemory) { + if (!requiredFonts.contains(font)) { + bitmapFonts.remove(font); + } + } + } + + public boolean isFontLoaded(String shortName, int fontSize) { + return bitmapFonts.containsKey(new FontSizePair(shortName, fontSize)); + } + + public void prepareEmbeddingFont(String fontfamily, int fontSize) { + flushAllUnusedFonts(); + + if (isFontLoaded(fontfamily, fontSize)) { + return; + } + + FontManager fontManager = facade.retrieveProxy(FontManager.NAME); + + FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); + parameter.size = fontSize; + + FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontManager.getTTFByName(fontfamily)); + BitmapFont font = generator.generateFont(parameter); + font.setUseIntegerPositions(false); + addBitmapFont(fontfamily, parameter.size, font); + } + + public HashMap getProjectSpineAnimationsList() { + return spineAnimAtlases; + } + + public HashMap getProjectSpriteAnimationsList() { + return spriteAnimAtlases; + } + + public HashMap getProjectSpriterAnimationsList() { + return spriterAnimFiles; + } + + public TextureAtlas getProjectAssetsList() { + return currentProjectAtlas; + } + + public HashMap getProjectParticleList() { + return particleEffects; + } + + @Override + public ResolutionEntryVO getLoadedResolution() { + if(packResolutionName.equals("orig")) { + return getProjectVO().originalResolution; + } + return getProjectVO().getResolution(packResolutionName); + } + + @Override + public ShaderProgram getShaderProgram(String shaderName) { + return shaderPrograms.get(shaderName); + } + + public HashMap getShaders() { + return shaderPrograms; + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java b/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java new file mode 100644 index 00000000..959b8097 --- /dev/null +++ b/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java @@ -0,0 +1,144 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.proxy; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.puremvc.patterns.proxy.BaseProxy; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.data.SceneVO; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +/** + * Created by sargis on 3/23/15. + */ +public class SceneDataManager extends BaseProxy { + + private static final String TAG = SceneDataManager.class.getCanonicalName(); + public static final String NAME = TAG; + + public SceneDataManager() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + + public SceneVO createNewScene(String name) { + SceneVO vo = new SceneVO(); + vo.sceneName = name; + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + try { + String projPath = projectManager.getCurrentProjectPath(); + FileUtils.writeStringToFile(new File(projPath + "/project.dt"), projectManager.currentProjectInfoVO.constructJsonString(), "utf-8"); + FileUtils.writeStringToFile(new File(projPath + "/scenes/" + vo.sceneName + ".dt"), vo.constructJsonString(), "utf-8"); + projectManager.currentProjectInfoVO.scenes.add(vo); + } catch (IOException e) { + e.printStackTrace(); + } + return vo; + } + + public void loadScene(SceneVO sceneVO, String resolution) { + /* + if (sceneVO == null || sceneVO.composite == null) return; + + FontSizePair[] fonts = sceneVO.composite.getRecursiveFontList(); + TextureManager textureManager = facade.retrieveProxy(TextureManager.NAME); + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + textureManager.loadBitmapFonts(fonts, resolutionManager.getCurrentMul());*/ + + // Apparently all was loaded when project was loaded + } + + public String getCurrProjectScenePathByName(String sceneName) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.getCurrentProjectPath() + "/scenes/" + sceneName + ".dt"; + } + + public void saveScene(SceneVO vo) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + try { + FileUtils.writeStringToFile(new File(projectManager.getCurrentProjectPath() + "/scenes/" + vo.sceneName + ".dt"), + vo.constructJsonString(), "utf-8"); + CommandManager commandManager = facade.retrieveProxy(CommandManager.NAME); + commandManager.saveEvent(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + public void deleteCurrentScene() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + if (projectManager.currentProjectVO.lastOpenScene.equals("MainScene")) { + return; + } + deleteScene(projectManager.currentProjectVO.lastOpenScene); + } + + private void deleteScene(String sceneName) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + ArrayList scenes = projectManager.currentProjectInfoVO.scenes; + SceneVO sceneToDelete = null; + for (SceneVO scene : scenes) { + if (scene.sceneName.equals(sceneName)) { + sceneToDelete = scene; + break; + } + } + if (sceneToDelete != null) { + scenes.remove(sceneToDelete); + } + projectManager.currentProjectInfoVO.scenes = scenes; + String projPath = projectManager.getCurrentProjectPath(); + try { + FileUtils.writeStringToFile(new File(projPath + "/project.dt"), projectManager.currentProjectInfoVO.constructJsonString(), "utf-8"); + FileUtils.forceDelete(new File(projPath + "/scenes/" + sceneName + ".dt")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void buildScenes(String targetPath) { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + String srcPath = projectManager.getCurrentProjectPath() + "/scenes"; + FileHandle scenesDirectoryHandle = Gdx.files.absolute(srcPath); + File fileTarget = new File(targetPath + "/" + scenesDirectoryHandle.name()); + try { + FileUtils.copyDirectory(scenesDirectoryHandle.file(), fileTarget); + } catch (IOException e) { + e.printStackTrace(); + } + //copy project dt + try { + FileUtils.copyFile(new File(projectManager.getCurrentProjectPath() + "/project.dt"), new File(targetPath + "/project.dt")); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/games/rednblack/editor/splash/SplashMediator.java b/src/main/java/games/rednblack/editor/splash/SplashMediator.java new file mode 100644 index 00000000..bc8c3c36 --- /dev/null +++ b/src/main/java/games/rednblack/editor/splash/SplashMediator.java @@ -0,0 +1,47 @@ +package games.rednblack.editor.splash; + +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DApp; +import games.rednblack.editor.HyperLap2DFacade; + +public class SplashMediator extends SimpleMediator { + + private static final String TAG = SplashMediator.class.getCanonicalName(); + private static final String NAME = TAG; + + public SplashMediator() { + super(NAME, new Object()); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + SplashScreenAdapter.UPDATE_SPLASH, + SplashScreenAdapter.CLOSE_SPLASH + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + System.out.println(notification.getBody().toString()); + + if (HyperLap2DApp.getInstance().splashWindow != null && HyperLap2DApp.getInstance().mainWindow != null) { + ((SplashScreenAdapter)(HyperLap2DApp.getInstance().splashWindow.getListener())).setProgressStatus(notification.getBody().toString()); + + if (notification.getName().equals(SplashScreenAdapter.CLOSE_SPLASH)) { + ((SplashScreenAdapter)(HyperLap2DApp.getInstance().splashWindow.getListener())).loadedData(); + HyperLap2DApp.getInstance().mainWindow.setVisible(true); + } + + HyperLap2DApp.getInstance().splashWindow.focusWindow(); + } + } +} diff --git a/src/main/java/games/rednblack/editor/splash/SplashScreen.java b/src/main/java/games/rednblack/editor/splash/SplashScreen.java new file mode 100644 index 00000000..d934680b --- /dev/null +++ b/src/main/java/games/rednblack/editor/splash/SplashScreen.java @@ -0,0 +1,33 @@ +package games.rednblack.editor.splash; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.graphics.GL20; + +public class SplashScreen extends ScreenAdapter { + + private SplashStage stage; + + public SplashScreen() { + stage = new SplashStage(); + } + + @Override + public void render(float delta) { + super.render(delta); + + Gdx.gl.glClearColor(0, 0, 0, 0); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + stage.act(delta); + stage.draw(); + } + + public void loadedData() { + stage.loadedData(); + } + + public void setProgressStatus(String status) { + stage.setProgressStatus(status); + } +} diff --git a/src/main/java/games/rednblack/editor/splash/SplashScreenAdapter.java b/src/main/java/games/rednblack/editor/splash/SplashScreenAdapter.java new file mode 100644 index 00000000..89ed7b2b --- /dev/null +++ b/src/main/java/games/rednblack/editor/splash/SplashScreenAdapter.java @@ -0,0 +1,62 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.splash; + +import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Game; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import games.rednblack.editor.HyperLap2DApp; +import games.rednblack.editor.Sync; +import games.rednblack.editor.utils.AppConfig; +import org.lwjgl.glfw.GLFW; + +/** + * Created by azakhary on 5/15/2015. + */ +public class SplashScreenAdapter extends Game { + + private static final String prefix = "games.rednblack.editor.splash"; + public static final String UPDATE_SPLASH = prefix + ".UPDATE"; + public static final String CLOSE_SPLASH = prefix + ".CLOSE"; + + private SplashScreen screen; + + @Override + public void create () { + screen = new SplashScreen(); + setScreen(screen); + } + + public void loadedData() { + screen.loadedData(); + } + + public void setProgressStatus(String status) { + screen.setProgressStatus(status); + } +} diff --git a/src/main/java/games/rednblack/editor/splash/SplashStage.java b/src/main/java/games/rednblack/editor/splash/SplashStage.java new file mode 100644 index 00000000..1b53394f --- /dev/null +++ b/src/main/java/games/rednblack/editor/splash/SplashStage.java @@ -0,0 +1,79 @@ +package games.rednblack.editor.splash; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import games.rednblack.editor.HyperLap2DApp; +import games.rednblack.editor.utils.AppConfig; + +public class SplashStage extends Stage { + private TextureAtlas atlas; + private Image logoText; + private Label progress; + + public SplashStage() { + atlas = new TextureAtlas(Gdx.files.internal("splash/splash.atlas")); + BitmapFont robotFont = new BitmapFont(Gdx.files.internal("splash/myriad.fnt")); + Label.LabelStyle labelStyle = new Label.LabelStyle(robotFont, new Color(0, 0, 0, 1f)); + + Image bg = new Image(atlas.findRegion("bg_color")); + bg.setX(0); + bg.setY(0); + bg.setWidth(getWidth()); + bg.setHeight(getHeight()); + addActor(bg); + + Image imageBg = new Image(atlas.findRegion("splash_bg")); + imageBg.setX(0); + imageBg.setY(getHeight() - imageBg.getHeight()); + addActor(imageBg); + + Image logo = new Image(atlas.findRegion("splash_logo")); + logo.setX(25); + logo.setY(getHeight() - logo.getHeight() - 20); + addActor(logo); + + logoText = new Image(atlas.findRegion("splash_logo_text")); + logoText.setX(200); + logoText.setY(logo.getY() + 30); + addActor(logoText); + + progress = new Label("Loading fonts", labelStyle); + progress.setX(logoText.getX() + ((logoText.getWidth() - progress.getWidth() )/ 2)); + progress.setY(logo.getY() + 5); + addActor(progress); + + Label companyName = new Label("Red & Black Games", labelStyle); + companyName.setX(13); + companyName.setY(55 - companyName.getHeight() - 7); + addActor(companyName); + + Label copyright = new Label("Copyright (c) 2020. All rights reserved.", labelStyle); + copyright.setX(13); + copyright.setY(companyName.getY() - 20); + addActor(copyright); + + Label version = new Label(AppConfig.getInstance().version, labelStyle); + version.setX(getWidth() - 13 - version.getWidth()); + version.setY(companyName.getY()); + addActor(version); + + setProgressStatus("Initializing"); + } + + public void setProgressStatus(String status) { + progress.setText(status); + progress.setX(logoText.getX() + ((logoText.getWidth() - progress.getWidth()) / 2)); + } + + public void loadedData() { + addAction(Actions.sequence(Actions.delay(0.8f), Actions.run(() -> { + HyperLap2DApp.getInstance().splashWindow.closeWindow(); + }))); + } +} diff --git a/src/main/java/games/rednblack/editor/system/PhysicsAdjustSystem.java b/src/main/java/games/rednblack/editor/system/PhysicsAdjustSystem.java new file mode 100644 index 00000000..ca72a2ba --- /dev/null +++ b/src/main/java/games/rednblack/editor/system/PhysicsAdjustSystem.java @@ -0,0 +1,38 @@ +package games.rednblack.editor.system; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.World; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; +import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; +import games.rednblack.editor.renderer.systems.PhysicsSystem; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +public class PhysicsAdjustSystem extends PhysicsSystem { + + private Vector2 transformVec = new Vector2(); + + public PhysicsAdjustSystem(World world) { + super(world); + setPhysicsOn(false); + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + + TransformComponent transformComponent = transformComponentMapper.get(entity); + processBody(entity); + + PhysicsBodyComponent physicsBodyComponent = ComponentRetriever.get(entity, PhysicsBodyComponent.class); + + if(physicsBodyComponent.body == null) return; + + transformVec.x = (transformComponent.x + transformComponent.originX) * PhysicsBodyLoader.getScale(); + transformVec.y = (transformComponent.y + transformComponent.originY) * PhysicsBodyLoader.getScale(); + physicsBodyComponent.body.setTransform(transformVec, transformComponent.rotation * MathUtils.degreesToRadians); + + } + +} diff --git a/src/main/java/games/rednblack/editor/utils/AppConfig.java b/src/main/java/games/rednblack/editor/utils/AppConfig.java new file mode 100644 index 00000000..b23868eb --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/AppConfig.java @@ -0,0 +1,72 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import games.rednblack.editor.Main; + +import java.io.*; +import java.util.Properties; + +public class AppConfig { + + public static AppConfig instance; + + public String version; + + public Properties properties; + + private AppConfig() {} + + public static AppConfig getInstance() { + if(instance == null) { + instance = new AppConfig(); + instance.loadProperties(); + } + + return instance; + } + + private void loadProperties() { + File root = new File(new File(".").getAbsolutePath()).getParentFile(); + File configDir = new File(root.getAbsolutePath() + File.separator + "configs"); + + properties = new Properties(); + InputStream propertiesInput = null; + + File file = new File(configDir.getAbsolutePath() + File.separator + "app.properties"); + if (file.exists()) { + try { + propertiesInput = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } else { + propertiesInput = Main.class.getClassLoader().getResourceAsStream("configs/app.properties"); + } + + if (propertiesInput != null) { + try { + properties.load(propertiesInput); + version = properties.getProperty("version"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/games/rednblack/editor/utils/Constants.java b/src/main/java/games/rednblack/editor/utils/Constants.java new file mode 100644 index 00000000..c7edee66 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/Constants.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.utils; + +/** + * Created by Sasun Poghosyan on 5/6/2016. + */ +public class Constants { + + public static final float FLOAT_MIN = -1000000f; + public static final float FLOAT_MAX = 1000000f; + + +} diff --git a/src/main/java/games/rednblack/editor/utils/EntityBounds.java b/src/main/java/games/rednblack/editor/utils/EntityBounds.java new file mode 100644 index 00000000..e464069c --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/EntityBounds.java @@ -0,0 +1,193 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Matrix3; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.light.LightObjectComponent; +import games.rednblack.editor.renderer.components.particle.ParticleComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 6/5/2015. + */ +public class EntityBounds extends Rectangle { + + private float scaleX; + private float scaleY; + + /** + * points winding order is counterclockwise (p1 -> p2 -> p3 -> p4) + * * **p3 + * p4 ** * + * * * + * * * + * * **p2 + * p1 ** + */ + private final Vector2 p1 = new Vector2(); + private final Vector2 p2 = new Vector2(); + private final Vector2 p3 = new Vector2(); + private final Vector2 p4 = new Vector2(); + private final Array boundPointList = new Array<>(); + private final float[] boundPoints = new float[8]; + + public EntityBounds(Entity entity) { + setEntity(entity); + } + + public EntityBounds() { + + } + + public void setEntity(Entity entity) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + x = transformComponent.x; + y = transformComponent.y; + scaleX = transformComponent.scaleX; + scaleY = transformComponent.scaleY; + width = dimensionsComponent.width; + height = dimensionsComponent.height; + + if (entity.getComponent(LightObjectComponent.class) != null) { + x += dimensionsComponent.boundBox.x; + y += dimensionsComponent.boundBox.y; + scaleX = 1; + scaleY = 1; + width = dimensionsComponent.boundBox.width; + height = dimensionsComponent.boundBox.height; + } + + if (ComponentRetriever.get(entity, ParticleComponent.class) != null) { + width = dimensionsComponent.boundBox.width; + height = dimensionsComponent.boundBox.height; + dimensionsComponent.width = width; + dimensionsComponent.height = height; + x += dimensionsComponent.boundBox.x; + y += dimensionsComponent.boundBox.y; + } + + Matrix3 transMat = TransformUtils.identity(); + + if ((scaleX != 1 || scaleY != 1) && transformComponent.rotation != 0) { + transMat = TransformUtils.scaleRotMat(transformComponent); + } else if (scaleX != 1 || scaleY != 1) { + transMat = TransformUtils.scalingMat(transformComponent); + } else if (transformComponent.rotation != 0) { + transMat = TransformUtils.rotationMat(transformComponent); + } + + p1.set(x, y).mul(transMat); + p2.set(x + width, y).mul(transMat); + p3.set(x + width, y + height).mul(transMat); + p4.set(x, y + height).mul(transMat); + + boundPoints[0] = p1.x; + boundPoints[1] = p1.y; + boundPoints[2] = p2.x; + boundPoints[3] = p2.y; + boundPoints[4] = p3.x; + boundPoints[5] = p3.y; + boundPoints[6] = p4.x; + boundPoints[7] = p4.y; + } + + public float getVisualWidth() { + return Math.abs(getWidth() * scaleX); + } + + public float getVisualHeight() { + return Math.abs(getHeight() * scaleY); + } + + public float getVisualX() { + return Math.min(getP1x(), getP3x()); + } + + public float getVisualY() { + return Math.min(getP1y(), getP3y()); + } + + public float getVisualRightX() { + return Math.max(getP1x(), getP3x()); + } + + public float getVisualTopY() { + return Math.max(getP1y(), getP3y()); + } + + public float getP1x() { + return p1.x; + } + + public float getP1y() { + return p1.y; + } + + public float getP2x() { + return p2.x; + } + + public float getP2y() { + return p2.y; + } + + public float getP3x() { + return p3.x; + } + + public float getP3y() { + return p3.y; + } + + public float getP4x() { + return p4.x; + } + + public float getP4y() { + return p4.y; + } + + public float[] getBoundPoints() { + return boundPoints; + } + + public float[] getBoundPoints(Entity entity) { + setEntity(entity); + return boundPoints; + } + + public Array getBoundPointsList() { + boundPointList.clear(); + boundPointList.addAll(p1, p2, p3, p4); + return boundPointList; + } + + public Array getBoundPointsList(Entity entity) { + setEntity(entity); + return getBoundPointsList(); + + } +} diff --git a/src/main/java/games/rednblack/editor/utils/Guide.java b/src/main/java/games/rednblack/editor/utils/Guide.java new file mode 100644 index 00000000..17dd4ee8 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/Guide.java @@ -0,0 +1,13 @@ +package games.rednblack.editor.utils; + +/** + * Created by azakhary on 7/18/2015. + */ +public class Guide { + public boolean isVertical; + public float pos; + + public Guide(boolean isVertical) { + this.isVertical = isVertical; + } +} \ No newline at end of file diff --git a/src/main/java/games/rednblack/editor/utils/HyperLap2DUtils.java b/src/main/java/games/rednblack/editor/utils/HyperLap2DUtils.java new file mode 100644 index 00000000..b4cfe450 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/HyperLap2DUtils.java @@ -0,0 +1,70 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.InputStream; + +import org.apache.commons.io.filefilter.SuffixFileFilter; +import org.apache.commons.lang3.SystemUtils; + +/** + * Created by sargis on 4/1/15. + */ +public class HyperLap2DUtils { + public static final FilenameFilter PNG_FILTER = new SuffixFileFilter(".png"); + public static final FilenameFilter TTF_FILTER = new SuffixFileFilter(".ttf"); + public static final FilenameFilter JSON_FILTER = new SuffixFileFilter(".json"); + public static final FilenameFilter SCML_FILTER = new SuffixFileFilter(".scml"); + public static final FilenameFilter DT_FILTER = new SuffixFileFilter(".dt"); + public static final String MY_DOCUMENTS_PATH = getMyDocumentsLocation(); + + + private static String getMyDocumentsLocation() { + String myDocuments = null; + try { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX) { + myDocuments = System.getProperty("user.home") + File.separator + "Documents"; + } + if (SystemUtils.IS_OS_WINDOWS) { + Process p = Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v personal"); + p.waitFor(); + + InputStream in = p.getInputStream(); + byte[] b = new byte[in.available()]; + in.read(b); + in.close(); + + myDocuments = new String(b); + myDocuments = myDocuments.split("\\s\\s+")[4]; + } + if (SystemUtils.IS_OS_LINUX) { + myDocuments = System.getProperty("user.home") + File.separator + "Documents"; + } + + + } catch (Throwable t) { + t.printStackTrace(); + } + + return myDocuments; + } + +} diff --git a/src/main/java/games/rednblack/editor/utils/ImportUtils.java b/src/main/java/games/rednblack/editor/utils/ImportUtils.java new file mode 100644 index 00000000..afc44c5a --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/ImportUtils.java @@ -0,0 +1,288 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.file.FileTypeFilter; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Created by azakhary on 7/22/2015. + */ +public class ImportUtils { + + private static ImportUtils instance; + + public static final int TYPE_FAILED = -3; + public static final int TYPE_MIXED = -2; + public static final int TYPE_UNKNOWN = -1; + public static final int TYPE_UNSUPPORTED = 0; + public static final int TYPE_IMAGE = 1; + public static final int TYPE_ANIMATION_PNG_SEQUENCE = 2; + public static final int TYPE_SPRITE_ANIMATION_ATLAS = 3; + public static final int TYPE_SPINE_ANIMATION = 4; + public static final int TYPE_SPRITER_ANIMATION = 5; + public static final int TYPE_TTF_FONT = 6; + public static final int TYPE_BITMAP_FONT = 7; + public static final int TYPE_PARTICLE_EFFECT = 8; + public static final int TYPE_TEXTURE_ATLAS = 9; + public static final int TYPE_SHADER = 10; + + private final ArrayList supportedTypes = new ArrayList<>(); + private final FileTypeFilter fileTypeFilter; + + private ImportUtils() { + supportedTypes.add(TYPE_IMAGE); + supportedTypes.add(TYPE_ANIMATION_PNG_SEQUENCE); + supportedTypes.add(TYPE_SPRITE_ANIMATION_ATLAS); + supportedTypes.add(TYPE_SPINE_ANIMATION); + supportedTypes.add(TYPE_SPRITER_ANIMATION); + supportedTypes.add(TYPE_PARTICLE_EFFECT); + supportedTypes.add(TYPE_SHADER); + // TODO: not yet supported + //supportedTypes.add(TYPE_TEXTURE_ATLAS); + //supportedTypes.add(TYPE_TTF_FONT); + //supportedTypes.add(TYPE_BITMAP_FONT); + + fileTypeFilter = new FileTypeFilter(false); + + fileTypeFilter.addRule("All Supported (*.png, *.atlas, *.p, *.json, *.scml, *.vert, *.frag)", "png", "atlas", "p", "json", "vert", "frag"); + fileTypeFilter.addRule("PNG File (*.png)", "png"); + fileTypeFilter.addRule("Sprite Animation Atlas File (*.atlas)", "atlas"); + fileTypeFilter.addRule("Particle Effect (*.p)", "p"); + fileTypeFilter.addRule("Spine Animation (*.json)", "json"); + fileTypeFilter.addRule("Spriter Animation (*.scml)", "scml"); + fileTypeFilter.addRule("Shader (*.vert, *.frag)", "vert", "frag"); + } + + public static ImportUtils getInstance() { + if(instance == null) { + instance = new ImportUtils(); + } + + return instance; + } + + public FileTypeFilter getFileTypeFilter() { + return fileTypeFilter; + } + + public static int getImportType(String[] paths) { + int mainType = TYPE_MIXED; + String[] names = new String[paths.length]; + for(int i = 0; i < paths.length; i++) { + String path = paths[i]; + int type = getFileType(path); + if(i == 0) mainType = type; + if(mainType != type) { + return TYPE_MIXED; + } + names[i] = FilenameUtils.getBaseName(path); + } + + if(mainType == TYPE_IMAGE) { + // check they are a PNG sequence; + boolean isSequence = isAnimationSequence(names); + if(isSequence) { + mainType = TYPE_ANIMATION_PNG_SEQUENCE; + } + } + + if(mainType > 0 && !ImportUtils.getInstance().supportedTypes.contains(mainType)) { + mainType = TYPE_UNSUPPORTED; + } + + return mainType; + } + + public static int getFileType(String path) { + int type = checkFileTypeByExtension(path); + if(type == TYPE_UNKNOWN) { + // we have to check by getting into the file + type = checkFileTypeByContent(path); + } + + return type; + } + + public static int checkFileTypeByExtension(String path) { + String ext = FilenameUtils.getExtension(path).toLowerCase(); + if(ext.equals("png")) { + return TYPE_IMAGE; + } + if(ext.equals("ttf")) { + return TYPE_TTF_FONT; + } + if(ext.equals("scml")) { + return TYPE_SPRITER_ANIMATION; + } + if(ext.equals("vert") || ext.equals("frag")) { + return TYPE_SHADER; + } + + return TYPE_UNKNOWN; + } + + public static int checkFileTypeByContent(String path) { + File file = new File(path); + long fileSizeInBytes = file.length(); + // Convert the bytes to Kilobytes (1 KB = 1024 Bytes) + long fileSizeInKB = fileSizeInBytes / 1024; + + if(fileSizeInKB > 1000) { + return TYPE_UNKNOWN; + } + + int type = TYPE_UNKNOWN; + + try { + String contents = FileUtils.readFileToString(file); + + // checking for atlas file + if(contents.contains("format: ") && contents.contains("filter: ") && contents.contains("xy: ")) { + type = TYPE_TEXTURE_ATLAS; + // need to figure out if atlas is animation or just files. + TextureAtlas atlas = new TextureAtlas(new FileHandle(file)); + + boolean isSequence = isAtlasAnimationSequence(atlas.getRegions()); + if(isSequence) { + type = TYPE_SPRITE_ANIMATION_ATLAS; + } + + return type; + } + System.out.println("is spine?"); + + // checking for spine animation + if(contents.contains("\"skeleton\":{") || contents.contains("\"skeleton\": {") || contents.contains("{\"bones\":[")) { + type = TYPE_SPINE_ANIMATION; + System.out.println("is spine"); + return type; + } + + // checking for particle effect + if(contents.contains("- Options - ") && contents.contains("- Image Paths -") && contents.contains("- Duration -")) { + type = TYPE_PARTICLE_EFFECT; + return type; + } + + } catch (IOException e) { + } + + return type; + } + + public static boolean isAnimationSequence(String[] names) { + if(names.length < 2) return false; + int[] sequenceArray = new int[names.length]; + for(int i = 0; i < names.length; i++) { + String name = names[i]; + // try to remove extension if any + if(name.indexOf(".") > 0) name = name.substring(0, name.indexOf(".")); + try { + int intValue = Integer.parseInt(name.replaceAll("(.+)_", "")); + sequenceArray[i] = intValue; + } catch (Exception e) { + sequenceArray[i] = -10; + } + } + Arrays.sort(sequenceArray); + if(sequenceArray[0] == 0 && sequenceArray[sequenceArray.length-1] == sequenceArray.length-1) { + return true; + } + + return sequenceArray[0] == 1 && sequenceArray[sequenceArray.length - 1] == sequenceArray.length; + } + + public static boolean isAtlasAnimationSequence(Array regions) { + if(regions.size < 2) return false; + + //Check old .atlas format + String[] regionNames = new String[regions.size]; + for(int i = 0; i < regions.size; i++) { + regionNames[i] = regions.get(i).name; + } + + if (isAnimationSequence(regionNames)) + return true; + + //New .atlas format + String animName = regions.get(0).name; + for (int i = 1; i < regions.size; i++) { + if (!animName.equals(regions.get(i).name)) { + return false; + } + } + + return regions.get(regions.size - 1).index == regions.size - 1; + } + + public boolean checkAssetExistence(int type, Array fileHandles) { + boolean exists = false; + ProjectManager projectManager = HyperLap2DFacade.getInstance().retrieveProxy(ProjectManager.NAME); + + String dir = ProjectManager.IMAGE_DIR_PATH; + String ext = "png"; + switch (type) { + case ImportUtils.TYPE_IMAGE: + case ImportUtils.TYPE_TEXTURE_ATLAS: + dir = ProjectManager.IMAGE_DIR_PATH; + ext = "png"; + break; + case ImportUtils.TYPE_PARTICLE_EFFECT: + dir = ProjectManager.PARTICLE_DIR_PATH; + ext = "p"; + break; + case ImportUtils.TYPE_SPRITER_ANIMATION: + case ImportUtils.TYPE_SPINE_ANIMATION: + dir = ProjectManager.SPINE_DIR_PATH; + ext = "json"; + break; + case ImportUtils.TYPE_SPRITE_ANIMATION_ATLAS: + case ImportUtils.TYPE_ANIMATION_PNG_SEQUENCE: + dir = ProjectManager.SPRITE_DIR_PATH; + ext = "atlas"; + break; + case ImportUtils.TYPE_SHADER: + dir = ProjectManager.SHADER_DIR_PATH; + ext = "frag"; + break; + } + + for (FileHandle file : fileHandles) { + File f = new File(projectManager.getCurrentProjectPath() + File.separator + dir + File.separator + file.nameWithoutExtension() + "." + ext); + System.out.println(f.getAbsolutePath()); + exists = f.exists(); + if (exists) + break; + } + + return exists; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/InputFilters.java b/src/main/java/games/rednblack/editor/utils/InputFilters.java new file mode 100644 index 00000000..932e3fcd --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/InputFilters.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.utils; + +import com.kotcrab.vis.ui.widget.VisTextField; + +public class InputFilters { + public static final VisTextField.TextFieldFilter ALPHANUMERIC = new VisTextField.TextFieldFilter() { + @Override + public boolean acceptChar(VisTextField textField, char c) { + + if(Character.isAlphabetic(c) || Character.isDigit(c)) + return true; + + return false; + } + }; +} diff --git a/src/main/java/games/rednblack/editor/utils/MoveCommandBuilder.java b/src/main/java/games/rednblack/editor/utils/MoveCommandBuilder.java new file mode 100644 index 00000000..d2492d79 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/MoveCommandBuilder.java @@ -0,0 +1,65 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by azakhary on 6/5/2015. + */ +public class MoveCommandBuilder { + + Array payload; + + public MoveCommandBuilder() { + payload = new Array<>(); + } + + public void setX(Entity entity, float x) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + setXY(entity, x, transformComponent.y); + } + + public void setY(Entity entity, float y) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + setXY(entity, transformComponent.x, y); + } + + public void setXY(Entity entity, float x, float y) { + Object[] data = new Object[2]; + data[0] = entity; + data[1] = new Vector2(x, y); + payload.add(data); + } + + public void clear() { + payload = new Array<>(); + } + + public void execute() { + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_ITEMS_MOVE_TO, payload); + } + +} diff --git a/src/main/java/games/rednblack/editor/utils/NinePatchUtils.java b/src/main/java/games/rednblack/editor/utils/NinePatchUtils.java new file mode 100644 index 00000000..c33fe639 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/NinePatchUtils.java @@ -0,0 +1,191 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.Transparency; +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.util.ArrayList; + +/** + * Created by sargis on 8/29/14. + */ +public class NinePatchUtils { + + public static Integer[] findPatches(BufferedImage image) { + int width = image.getWidth(); + int height = image.getHeight(); + int[] row = new int[width]; + int[] column = new int[height]; + row = getPixels(image, 0, 0, width, 1, row); + column = getPixels(image, 0, 0, 1, height, column); + + boolean[] result = new boolean[1]; + //row = getPixels(image, 0, height - 1, width, 1, row); + //column = getPixels(image, width - 1, 0, 1, height, column); + + Pair>> top = getPatches(row, result); + Pair>> left = getPatches(column, result); + + Pair topPadding = getPadding(top.first); + Pair leftPadding = getPadding(left.first); + + return new Integer[]{topPadding.first, topPadding.second, leftPadding.first, leftPadding.second}; + } + + public static BufferedImage removePatches(BufferedImage image) { + BufferedImage buffer = createTranslucentCompatibleImage( + image.getWidth() - 2, image.getHeight() - 2); + + Graphics2D g2 = buffer.createGraphics(); + g2.drawImage(image, -1, -1, null); + g2.dispose(); + return buffer; + } + + public static BufferedImage convertTo9Patch(BufferedImage image, Integer[] patches, float ratio) { + BufferedImage buffer = createTranslucentCompatibleImage(image.getWidth() + 2, image.getHeight() + 2); + Graphics2D g2 = buffer.createGraphics(); + g2.drawImage(image, 1, 1, null); + g2.dispose(); + draw9Patch(buffer, patches, ratio); + return buffer; + } + + private static GraphicsConfiguration getGraphicsConfiguration() { + GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + return environment.getDefaultScreenDevice().getDefaultConfiguration(); + } + + private static BufferedImage createTranslucentCompatibleImage(int width, int height) { + return getGraphicsConfiguration().createCompatibleImage(width, height, + Transparency.TRANSLUCENT); + } + + private static Pair getPadding(java.util.List> pairs) { + if (pairs.size() == 0) { + return new Pair<>(0, 0); + } else if (pairs.size() == 1) { + if (pairs.get(0).first == 1) { + return new Pair<>(pairs.get(0).second - pairs.get(0).first, 0); + } else { + return new Pair<>(0, pairs.get(0).second - pairs.get(0).first); + } + } else { + int index = pairs.size() - 1; + return new Pair<>(pairs.get(0).second - pairs.get(0).first, + pairs.get(index).second - pairs.get(index).first); + } + } + + private static int[] getPixels(BufferedImage img, int x, int y, int w, int h, int[] pixels) { + if (w == 0 || h == 0) { + return new int[0]; + } + + if (pixels == null) { + pixels = new int[w * h]; + } else if (pixels.length < w * h) { + throw new IllegalArgumentException("Pixels array must have a length >= w * h"); + } + + int imageType = img.getType(); + if (imageType == BufferedImage.TYPE_INT_ARGB || imageType == BufferedImage.TYPE_INT_RGB) { + Raster raster = img.getRaster(); + return (int[]) raster.getDataElements(x, y, w, h, pixels); + } + + // Unmanages the image + return img.getRGB(x, y, w, h, pixels, 0, w); + } + + private static Pair>> getPatches(int[] pixels, boolean[] startWithPatch) { + int lastIndex = 1; + int lastPixel = pixels[1]; + boolean first = true; + + java.util.List> fixed = new ArrayList<>(); + java.util.List> patches = new ArrayList<>(); + + for (int i = 1; i < pixels.length - 1; i++) { + int pixel = pixels[i]; + if (pixel != lastPixel) { + if (lastPixel == 0xFF000000) { + if (first) startWithPatch[0] = true; + patches.add(new Pair(lastIndex, i)); + } else { + fixed.add(new Pair(lastIndex, i)); + } + first = false; + + lastIndex = i; + lastPixel = pixel; + } + } + if (lastPixel == 0xFF000000) { + if (first) startWithPatch[0] = true; + patches.add(new Pair<>(lastIndex, pixels.length - 1)); + } else { + fixed.add(new Pair<>(lastIndex, pixels.length - 1)); + } + + if (patches.size() == 0) { + patches.add(new Pair<>(1, pixels.length - 1)); + startWithPatch[0] = true; + fixed.clear(); + } + + return new Pair<>(fixed, patches); + } + + private static void draw9Patch(BufferedImage image, Integer[] patches, float ratio) { + int width = image.getWidth(); + int height = image.getHeight(); + int wStart = (int) (patches[0] * ratio) + 1; // this number should be rounded UP + int wEnd = (int) (width - patches[1] * ratio) - 1; + int hStart = (int) (patches[2] * ratio) + 1; // this number should be rounded UP + int hEnd = (int) (height - patches[3] * ratio) - 1; + for (int i = wStart; i < wEnd; i++) { + image.setRGB(i, 0, 0xFF000000); + image.setRGB(i, height - 1, 0xFF000000); + } + for (int i = hStart; i < hEnd; i++) { + image.setRGB(0, i, 0xFF000000); + image.setRGB(width - 1, i, 0xFF000000); + } + } + + static class Pair { + E first; + E second; + + Pair(E first, E second) { + this.first = first; + this.second = second; + } + + @Override + public String toString() { + return "Pair[" + first + ", " + second + "]"; + } + } +} diff --git a/src/main/java/games/rednblack/editor/utils/RoundUtils.java b/src/main/java/games/rednblack/editor/utils/RoundUtils.java new file mode 100644 index 00000000..ff424f31 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/RoundUtils.java @@ -0,0 +1,12 @@ +package games.rednblack.editor.utils; + +public class RoundUtils { + + public static float round(float number, int scale) { + int pow = 10; + for (int i = 1; i < scale; i++) + pow *= 10; + float tmp = number * pow; + return ( (float) ( (int) ((tmp - (int) tmp) >= 0.5f ? tmp + 1 : tmp) ) ) / pow; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/StandardWidgetsFactory.java b/src/main/java/games/rednblack/editor/utils/StandardWidgetsFactory.java new file mode 100644 index 00000000..80f97b1d --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/StandardWidgetsFactory.java @@ -0,0 +1,191 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.TextTooltip; +import com.badlogic.gdx.scenes.scene2d.ui.TooltipManager; +import com.badlogic.gdx.utils.Align; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.util.InputValidator; +import com.kotcrab.vis.ui.widget.*; +import com.kotcrab.vis.ui.widget.spinner.IntSpinnerModel; +import com.kotcrab.vis.ui.widget.spinner.Spinner; +import games.rednblack.editor.proxy.CursorManager; +import games.rednblack.editor.view.ui.widget.CursorListener; +import games.rednblack.editor.view.ui.widget.ScrollFocusListener; +import games.rednblack.editor.view.ui.widget.components.TintButton; + +/** + * Creates standard widgets like labels or text fields with provided standard HyperLap2D specific visual style. + * Singleton helper class + */ +public class StandardWidgetsFactory { + + private static StandardWidgetsFactory instance; + + private StandardWidgetsFactory() { + + } + + public static StandardWidgetsFactory getInstance() { + if(instance == null) { + instance = new StandardWidgetsFactory(); + } + + return instance; + } + + public static VisLabel createLabel(String text, int alignment) { + Skin skin = VisUI.getSkin(); + VisLabel visLabel = new VisLabel(text, alignment); + visLabel.setStyle(skin.get("small", Label.LabelStyle.class)); + return visLabel; + } + + public static VisLabel createLabel(String text) { + return createLabel(text, Align.right); + } + + + public static VisTextField createTextField() { + return createTextField("default"); + } + + public static VisTextField createTextField(String style) { + VisTextField visTextField = new VisTextField("", style); + visTextField.addListener(new CursorListener(CursorManager.TEXT)); + return visTextField; + } + + public static VisTextField createTextField(String style, boolean textCursor) { + VisTextField visTextField = new VisTextField(); + Skin skin = VisUI.getSkin(); + visTextField.setStyle(skin.get(style, VisTextField.VisTextFieldStyle.class)); + if(textCursor) + visTextField.addListener(new CursorListener(CursorManager.TEXT)); + return visTextField; + } + + public static VisTextField createTextField(String style, VisTextField.TextFieldFilter textFieldFilter) { + VisTextField visTextField = createTextField(style); + visTextField.setTextFieldFilter(textFieldFilter); + return visTextField; + } + + public static VisValidatableTextField createValidableTextField(InputValidator inputValidator) { + VisValidatableTextField visTextField = createValidableTextField("default", inputValidator); + return visTextField; + } + + public static VisValidatableTextField createValidableTextField(String style, InputValidator inputValidator) { + VisValidatableTextField visTextField = new VisValidatableTextField(inputValidator); + Skin skin = VisUI.getSkin(); + visTextField.setStyle(skin.get(style, VisTextField.VisTextFieldStyle.class)); + visTextField.addListener(new CursorListener(CursorManager.TEXT)); + return visTextField; + } + + public static VisValidatableTextField createValidableTextField(String style, InputValidator inputValidator, VisTextField.TextFieldFilter textFieldFilter) { + VisValidatableTextField visTextField = createValidableTextField(style, inputValidator); + visTextField.setTextFieldFilter(textFieldFilter); + visTextField.addListener(new CursorListener(CursorManager.TEXT)); + return visTextField; + } + + public static Spinner createNumberSelector(int min, int max) { + return createNumberSelector(0, min, max); + } + + public static Spinner createNumberSelector(int initialValue, int min, int max) { + return createNumberSelector("default", initialValue, min, max, 1); + } + + public static Spinner createNumberSelector(String style, int min, int max) { + return createNumberSelector(style, 0, min, max, 1); + } + + public static Spinner createNumberSelector(String style, int initialValue, int min, int max, int step) { + Spinner selector = new Spinner(style, "", new IntSpinnerModel(initialValue, min, max, step)); + selector.addListener(new CursorListener(CursorManager.TEXT)); + return selector; + } + + public static VisTextArea createTextArea() { + return createTextArea("default"); + } + + public static VisTextArea createTextArea(String style) { + VisTextArea visTextArea = new VisTextArea("", style); + visTextArea.addListener(new CursorListener(CursorManager.TEXT)); + return visTextArea; + } + + public static VisCheckBox createCheckBox() { + return createCheckBox(""); + } + + public static VisCheckBox createCheckBox(String text) { + VisCheckBox visCheckBox = new VisCheckBox(text); + visCheckBox.addListener(new CursorListener(CursorManager.FINGER)); + return visCheckBox; + } + + public static VisSelectBox createSelectBox(Class type) { + return createSelectBox("default", type); + } + + public static VisSelectBox createSelectBox(String style, Class type) { + VisSelectBox visSelectBox = new VisSelectBox(style); + visSelectBox.addListener(new CursorListener(CursorManager.FINGER)); + return visSelectBox; + } + + public static TintButton createTintButton() { + return createTintButton(29,21); + } + + public static TintButton createTintButton(int width, int height) { + TintButton visCheckBox = new TintButton(width, height); + visCheckBox.addListener(new CursorListener(CursorManager.EYEDROPPER)); + return visCheckBox; + } + + public static VisScrollPane createScrollPane(Actor actor) { + VisScrollPane scrollPane = new VisScrollPane(actor); + scrollPane.addListener(new ScrollFocusListener()); + scrollPane.setFlickScroll(false); + return scrollPane; + } + + public static void addVisTooltip(Actor actor, String text) { + new Tooltip.Builder(text).target(actor).build(); + } + + public static void addTooltip(Actor actor, String text) { + TooltipManager.getInstance().initialTime = 1; + TooltipManager.getInstance().hideAll(); + + TextTooltip tooltip = new TextTooltip(text, VisUI.getSkin()); + tooltip.getContainer().pad(5); + actor.addListener(tooltip); + } +} diff --git a/src/main/java/games/rednblack/editor/utils/TransformCommandBuilder.java b/src/main/java/games/rednblack/editor/utils/TransformCommandBuilder.java new file mode 100644 index 00000000..85d6c082 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/TransformCommandBuilder.java @@ -0,0 +1,79 @@ +package games.rednblack.editor.utils; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by Osman on 01.08.2015. + */ +public class TransformCommandBuilder { + + Array payload; + + public void begin(Entity forEntity) { + + TransformComponent transformComponent = ComponentRetriever.get(forEntity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(forEntity, DimensionsComponent.class); + Object[] prevData = new Object[4]; + + payload = new Array<>(3); + payload.add(forEntity); + payload.add(prevData); + payload.add(new Object[4]); + + setPos(1, transformComponent.x, transformComponent.y); + setSize(1, dimensionsComponent.width, dimensionsComponent.height); + setScale(1, transformComponent.scaleX, transformComponent.scaleY); + setRotation(1, transformComponent.rotation); + + } + + private void setPos(int pIndex, float x, float y) { + ((Object[])payload.get(pIndex))[0] = new Vector2(x, y); + } + + private void setSize(int pIndex, float width, float height) { + ((Object[])payload.get(pIndex))[1] = new Vector2(width, height); + } + + private void setScale(int pIndex, float x, float y) { + ((Object[])payload.get(pIndex))[2] = new Vector2(x, y); + } + + private void setRotation(int pIndex, float rotation) { + ((Object[])payload.get(pIndex))[3] = rotation; + } + + public void setPos(float x, float y) { + setPos(2, x, y); + } + + public void setSize(float width, float height) { + setSize(2, width, height); + } + + public void setScale(float x, float y) { + setScale(2, x, y); + } + + public void setRotation(float rotation) { + setRotation(2, rotation); + } + + public void execute() { + // check if payload is worth sending + Object[] newData = (Object[]) payload.get(2); + for(Object o : newData) { + if (o != null) { + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_ITEM_TRANSFORM_TO, payload); + return; + } + } + } +} diff --git a/src/main/java/games/rednblack/editor/utils/TransformUtils.java b/src/main/java/games/rednblack/editor/utils/TransformUtils.java new file mode 100644 index 00000000..b63adf84 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/TransformUtils.java @@ -0,0 +1,73 @@ +package games.rednblack.editor.utils; + +import com.badlogic.gdx.math.Matrix3; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.renderer.components.TransformComponent; + +/** + * Created by Sasun Poghosyan on 4/18/2016. + */ +public class TransformUtils { + + private static final Matrix3 tempMat = new Matrix3(); + + + public static Matrix3 scaleRotMat(TransformComponent transformComponent) { + float translationX = transformComponent.x + transformComponent.originX; + float translationY = transformComponent.y + transformComponent.originY; + float scaleX = transformComponent.scaleX; + float scaleY = transformComponent.scaleY; + float angle = transformComponent.rotation; + tempMat.idt(); + tempMat.translate(translationX, translationY).rotate(angle).scale(scaleX, scaleY).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 scaleRotMat(float translationX, float translationY, float scaleX, float scaleY, float angle) { + tempMat.idt(); + tempMat.translate(translationX, translationY).rotate(angle).scale(scaleX, scaleY).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 scalingMat(TransformComponent transformComponent) { + float translationX = transformComponent.x + transformComponent.originX; + float translationY = transformComponent.y + transformComponent.originY; + float scaleX = transformComponent.scaleX; + float scaleY = transformComponent.scaleY; + tempMat.idt(); + tempMat.translate(translationX, translationY).scale(scaleX, scaleY).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 scalingMat(float translationX, float translationY, float scaleX, float scaleY) { + tempMat.idt(); + tempMat.translate(translationX, translationY).scale(scaleX, scaleY).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 rotationMat(TransformComponent transformComponent) { + float translationX = transformComponent.x + transformComponent.originX; + float translationY = transformComponent.y + transformComponent.originY; + float angle = transformComponent.rotation; + tempMat.idt(); + tempMat.translate(translationX, translationY).rotate(angle).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 rotationMat(float translationX, float translationY, float angle) { + tempMat.idt(); + tempMat.translate(translationX, translationY).rotate(angle).translate(-translationX, -translationY); + return tempMat; + } + + public static Matrix3 identity() { + return tempMat.idt(); + } + + public static Matrix3 copy(Matrix3 matrix3) { + Matrix3 copy = new Matrix3(); + copy.set(matrix3.getValues()); + return copy; + } + +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/Clipper.java b/src/main/java/games/rednblack/editor/utils/poly/Clipper.java new file mode 100644 index 00000000..8da63b71 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/Clipper.java @@ -0,0 +1,105 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.utils.poly.earclipping.bayazit.BayazitDecomposer; +import games.rednblack.editor.utils.poly.earclipping.ewjordan.EwjordanDecomposer; + +/** + * + * @author Aurelien Ribon | http://www.aurelienribon.com/ + */ +public class Clipper { + public enum Polygonizer {EWJORDAN, BAYAZIT} + + public static Vector2[][] polygonize(Polygonizer polygonizer, Vector2[] points) { + Vector2[][] polygons = null; + + if (PolygonUtils.isPolygonCCW(points)) { + List vertices = Arrays.asList(points); + Collections.reverse(vertices); + points = vertices.toArray(new Vector2[0]); + } + + switch (polygonizer) { + case EWJORDAN: + polygons = EwjordanDecomposer.decompose(points); + break; + + case BAYAZIT: + Array tmpPoints = new Array(points.length); + tmpPoints.addAll(points); + + Array> tmpPolygons; + + try { + tmpPolygons = BayazitDecomposer.ConvexPartition(tmpPoints); + } catch (Exception ex) { + tmpPolygons = null; + } + + if (tmpPolygons != null) { + polygons = new Vector2[tmpPolygons.size][]; + for (int i = 0; i < tmpPolygons.size; i++) { + polygons[i] = new Vector2[tmpPolygons.get(i).size]; + for (int ii = 0; ii < tmpPolygons.get(i).size; ii++) + polygons[i][ii] = new Vector2(tmpPolygons.get(i).get(ii)); + } + } + break; + } + + if (polygons != null) polygons = sliceForMax8Vertices(polygons); + return polygons; + } + + private static Vector2[][] sliceForMax8Vertices(Vector2[][] polygons) { + for (int i = 0; i < polygons.length; i++) { + Vector2[] poly = polygons[i]; + if (poly.length > 8) { + int limit = poly.length < 15 ? poly.length / 2 + 1 : 8; + Vector2[] newPoly1 = new Vector2[limit]; + Vector2[] newPoly2 = new Vector2[poly.length - limit + 2]; + System.arraycopy(poly, 0, newPoly1, 0, limit); + System.arraycopy(poly, limit - 1, newPoly2, 0, poly.length - limit + 1); + newPoly2[newPoly2.length - 1] = poly[0].cpy(); + + Vector2[][] newPolys = new Vector2[polygons.length + 1][]; + if (i > 0) { + System.arraycopy(polygons, 0, newPolys, 0, i); + } + if (i < polygons.length - 1) { + System.arraycopy(polygons, i + 1, newPolys, i + 2, polygons.length - i - 1); + } + newPolys[i] = newPoly1; + newPolys[i + 1] = newPoly2; + polygons = newPolys; + + i -= 1; + } + } + return polygons; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/PolygonUtils.java b/src/main/java/games/rednblack/editor/utils/poly/PolygonUtils.java new file mode 100644 index 00000000..93b03b87 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/PolygonUtils.java @@ -0,0 +1,48 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly; + +import com.badlogic.gdx.math.Vector2; + +/** + * + * @author Aurelien Ribon | http://www.aurelienribon.com/ + */ +public class PolygonUtils { + public static float getPolygonSignedArea(Vector2[] points) { + if (points.length < 3) + return 0; + + float sum = 0; + for (int i = 0; i < points.length; i++) { + Vector2 p1 = points[i]; + Vector2 p2 = i != points.length-1 ? points[i+1] : points[0]; + sum += (p1.x * p2.y) - (p1.y * p2.x); + } + return 0.5f * sum; + } + + public static float getPolygonArea(Vector2[] points) { + return Math.abs(getPolygonSignedArea(points)); + } + + public static boolean isPolygonCCW(Vector2[] points) { + return getPolygonSignedArea(points) > 0; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/TextureUtils.java b/src/main/java/games/rednblack/editor/utils/poly/TextureUtils.java new file mode 100644 index 00000000..e2a5148f --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/TextureUtils.java @@ -0,0 +1,126 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +/** + * @author Aurelien Ribon | http://www.aurelienribon.com/ + */ +public class TextureUtils { + private static final int[] potWidths = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 5096}; + + // ------------------------------------------------------------------------- + + public static TextureRegion getPOTTexture(String path) { + if (path == null) return null; + + FileHandle file = Gdx.files.absolute(path); + if (!file.exists()) return null; + + Pixmap pixmap = new Pixmap(file); + int origW = pixmap.getWidth(); + int origH = pixmap.getHeight(); + int w = getNearestPOT(origW); + int h = getNearestPOT(origH); + int len = Math.max(w, h); + + Pixmap potPixmap = new Pixmap(len, len, pixmap.getFormat()); + potPixmap.drawPixmap(pixmap, 0, 0, 0, 0, origW, origH); + pixmap.dispose(); + + Texture texture = new Texture(potPixmap); + texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); + + return new TextureRegion(texture, 0, 0, origW, origH); + } + + public static Pixmap getPOTPixmap(String path) { + if (path == null) return null; + + FileHandle file = Gdx.files.absolute(path); + if (!file.exists()) return null; + + Pixmap pixmap = new Pixmap(file); + int origW = pixmap.getWidth(); + int origH = pixmap.getHeight(); + int w = getNearestPOT(origW); + int h = getNearestPOT(origH); + int len = Math.max(w, h); + + Pixmap potPixmap = new Pixmap(len, len, pixmap.getFormat()); + potPixmap.drawPixmap(pixmap, 0, 0, 0, 0, origW, origH); + pixmap.dispose(); + + return potPixmap; + } + + // ------------------------------------------------------------------------- + + private static int getNearestPOT(int d) { + for (int i=0; i +/// Convex decomposition algorithm created by Mark Bayazit (http://mnbayazit.com/) +/// For more information about this algorithm, see http://mnbayazit.com/406/bayazit +/// +public class BayazitDecomposer { + + public static final float Epsilon = 1.192092896e-07f; + public static int MaxPolygonVertices = 8; + + public static Vector2 Cross(Vector2 a, float s) { + return new Vector2(s * a.y, -s * a.x); + } + + private static Vector2 At(int i, Array vertices) { + int s = vertices.size; + return vertices.get(i < 0 ? s - (-i % s) : i % s); + } + + private static Array Copy(int i, int j, Array vertices) { + Array p = new Array(); + while (j < i) + j += vertices.size; + // p.reserve(j - i + 1); + for (; i <= j; ++i) { + p.add(At(i, vertices)); + } + return p; + } + + public static float GetSignedArea(Array vect) { + int i; + float area = 0; + for (i = 0; i < vect.size; i++) { + int j = (i + 1) % vect.size; + area += vect.get(i).x * vect.get(j).y; + area -= vect.get(i).y * vect.get(j).x; + } + area /= 2.0f; + return area; + } + + public static float GetSignedArea(Vector2[] vect) { + int i; + float area = 0; + for (i = 0; i < vect.length; i++) { + int j = (i + 1) % vect.length; + area += vect[i].x * vect[j].y; + area -= vect[i].y * vect[j].x; + } + area /= 2.0f; + return area; + } + + public static Boolean IsCounterClockWise(Array vect) { + // We just return true for lines + if (vect.size < 3) + return true; + return (GetSignedArea(vect) > 0.0f); + } + + public static Boolean IsCounterClockWise(Vector2[] vect) { + // We just return true for lines + if (vect.length < 3) + return true; + return (GetSignedArea(vect) > 0.0f); + } + + // / + // / Decompose the polygon into several smaller non-concave polygon. + // / If the polygon is already convex, it will return the original polygon, + // unless it is over Settings.MaxPolygonVertices. + // / Precondition: Counter Clockwise polygon + // / + // / + // / + public static Array> ConvexPartition(Array vertices) { + // We force it to CCW as it is a precondition in this algorithm. + // vertices.ForceCounterClockWise(); + if (!IsCounterClockWise(vertices)) { + // Collections.reverse(vertices); + vertices.reverse(); + // Array reversed = new Array(vertices.size); + // for (int i = vertices.size - 1; i <= 0; i--) { + // reversed.add(vertices.get(i)); + // } + // vertices = reversed; + } + Array> list = new Array>(); + float d, lowerDist, upperDist; + Vector2 p; + Vector2 lowerInt = new Vector2(); + Vector2 upperInt = new Vector2(); // intersection points + int lowerIndex = 0, upperIndex = 0; + Array lowerPoly, upperPoly; + for (int i = 0; i < vertices.size; ++i) { + if (Reflex(i, vertices)) { + lowerDist = upperDist = Float.MAX_VALUE; // std::numeric_limits::max(); + for (int j = 0; j < vertices.size; ++j) { + // if line intersects with an edge + if (Left(At(i - 1, vertices), At(i, vertices), + At(j, vertices)) + && RightOn(At(i - 1, vertices), At(i, vertices), + At(j - 1, vertices))) { + // find the point of intersection + p = LineIntersect(At(i - 1, vertices), At(i, vertices), + At(j, vertices), At(j - 1, vertices)); + if (Right(At(i + 1, vertices), At(i, vertices), p)) { + // make sure it's inside the poly + d = SquareDist(At(i, vertices), p); + if (d < lowerDist) { + // keep only the closest intersection + lowerDist = d; + lowerInt = p; + lowerIndex = j; + } + } + } + if (Left(At(i + 1, vertices), At(i, vertices), + At(j + 1, vertices)) + && RightOn(At(i + 1, vertices), At(i, vertices), + At(j, vertices))) { + p = LineIntersect(At(i + 1, vertices), At(i, vertices), + At(j, vertices), At(j + 1, vertices)); + if (Left(At(i - 1, vertices), At(i, vertices), p)) { + d = SquareDist(At(i, vertices), p); + if (d < upperDist) { + upperDist = d; + upperIndex = j; + upperInt = p; + } + } + } + } + // if there are no vertices to connect to, choose a point in the + // middle + if (lowerIndex == (upperIndex + 1) % vertices.size) { + Vector2 sp = new Vector2((lowerInt.x + upperInt.x) / 2, + (lowerInt.y + upperInt.y) / 2); + lowerPoly = Copy(i, upperIndex, vertices); + lowerPoly.add(sp); + upperPoly = Copy(lowerIndex, i, vertices); + upperPoly.add(sp); + } else { + double highestScore = 0, bestIndex = lowerIndex; + while (upperIndex < lowerIndex) + upperIndex += vertices.size; + for (int j = lowerIndex; j <= upperIndex; ++j) { + if (CanSee(i, j, vertices)) { + double score = 1 / (SquareDist(At(i, vertices), + At(j, vertices)) + 1); + if (Reflex(j, vertices)) { + if (RightOn(At(j - 1, vertices), + At(j, vertices), At(i, vertices)) + && LeftOn(At(j + 1, vertices), + At(j, vertices), + At(i, vertices))) { + score += 3; + } else { + score += 2; + } + } else { + score += 1; + } + if (score > highestScore) { + bestIndex = j; + highestScore = score; + } + } + } + lowerPoly = Copy(i, (int) bestIndex, vertices); + upperPoly = Copy((int) bestIndex, i, vertices); + } + list.addAll(ConvexPartition(lowerPoly)); + list.addAll(ConvexPartition(upperPoly)); + return list; + } + } + // polygon is already convex + if (vertices.size > MaxPolygonVertices) { + lowerPoly = Copy(0, vertices.size / 2, vertices); + upperPoly = Copy(vertices.size / 2, 0, vertices); + list.addAll(ConvexPartition(lowerPoly)); + list.addAll(ConvexPartition(upperPoly)); + } else + list.add(vertices); + // The polygons are not guaranteed to be with collinear points. We + // remove + // them to be sure. + for (int i = 0; i < list.size; i++) { + list.set(i, SimplifyTools.CollinearSimplify(list.get(i), 0)); + } + // Remove empty vertice collections + for (int i = list.size - 1; i >= 0; i--) { + if (list.get(i).size == 0) + list.removeIndex(i); + } + return list; + } + + private static Boolean CanSee(int i, int j, Array vertices) { + if (Reflex(i, vertices)) { + if (LeftOn(At(i, vertices), At(i - 1, vertices), At(j, vertices)) + && RightOn(At(i, vertices), At(i + 1, vertices), + At(j, vertices))) + return false; + } else { + if (RightOn(At(i, vertices), At(i + 1, vertices), At(j, vertices)) + || LeftOn(At(i, vertices), At(i - 1, vertices), + At(j, vertices))) + return false; + } + if (Reflex(j, vertices)) { + if (LeftOn(At(j, vertices), At(j - 1, vertices), At(i, vertices)) + && RightOn(At(j, vertices), At(j + 1, vertices), + At(i, vertices))) + return false; + } else { + if (RightOn(At(j, vertices), At(j + 1, vertices), At(i, vertices)) + || LeftOn(At(j, vertices), At(j - 1, vertices), + At(i, vertices))) + return false; + } + for (int k = 0; k < vertices.size; ++k) { + if ((k + 1) % vertices.size == i || k == i + || (k + 1) % vertices.size == j || k == j) { + continue; // ignore incident edges + } + Vector2 intersectionPoint = new Vector2(); + if (LineIntersect(At(i, vertices), At(j, vertices), + At(k, vertices), At(k + 1, vertices), true, true, + intersectionPoint)) { + return false; + } + } + return true; + } + + public static Vector2 LineIntersect(Vector2 p1, Vector2 p2, Vector2 q1, + Vector2 q2) { + Vector2 i = new Vector2(); + float a1 = p2.y - p1.y; + float b1 = p1.x - p2.x; + float c1 = a1 * p1.x + b1 * p1.y; + float a2 = q2.y - q1.y; + float b2 = q1.x - q2.x; + float c2 = a2 * q1.x + b2 * q1.y; + float det = a1 * b2 - a2 * b1; + if (!FloatEquals(det, 0)) { + // lines are not parallel + i.x = (b2 * c1 - b1 * c2) / det; + i.y = (a1 * c2 - a2 * c1) / det; + } + return i; + } + + public static Boolean FloatEquals(float value1, float value2) { + return Math.abs(value1 - value2) <= Epsilon; + } + + // / + // / This method detects if two line segments (or lines) intersect, + // / and, if so, the point of intersection. Use the + // and + // / parameters to set whether the + // intersection point + // / must be on the first and second line segments. Setting these + // / both to true means you are doing a line-segment to line-segment + // / intersection. Setting one of them to true means you are doing a + // / line to line-segment intersection test, and so on. + // / Note: If two line segments are coincident, then + // / no intersection is detected (there are actually + // / infinite intersection points). + // / Author: Jeremy Bell + // / + // / The first point of the first line segment. + // / The second point of the first line + // segment. + // / The first point of the second line + // segment. + // / The second point of the second line + // segment. + // / This is set to the intersection + // / point if an intersection is detected. + // / Set this to true to require that the + // / intersection point be on the first line segment. + // / Set this to true to require that the + // / intersection point be on the second line segment. + // / True if an intersection is detected, false + // otherwise. + public static Boolean LineIntersect(Vector2 point1, Vector2 point2, + Vector2 point3, Vector2 point4, Boolean firstIsSegment, + Boolean secondIsSegment, Vector2 point) { + point = new Vector2(); + // these are reused later. + // each lettered sub-calculation is used twice, except + // for b and d, which are used 3 times + float a = point4.y - point3.y; + float b = point2.x - point1.x; + float c = point4.x - point3.x; + float d = point2.y - point1.y; + // denominator to solution of linear system + float denom = (a * b) - (c * d); + // if denominator is 0, then lines are parallel + if (!(denom >= -Epsilon && denom <= Epsilon)) { + float e = point1.y - point3.y; + float f = point1.x - point3.x; + float oneOverDenom = 1.0f / denom; + // numerator of first equation + float ua = (c * e) - (a * f); + ua *= oneOverDenom; + // check if intersection point of the two lines is on line segment 1 + if (!firstIsSegment || ua >= 0.0f && ua <= 1.0f) { + // numerator of second equation + float ub = (b * e) - (d * f); + ub *= oneOverDenom; + // check if intersection point of the two lines is on line + // segment 2 + // means the line segments intersect, since we know it is on + // segment 1 as well. + if (!secondIsSegment || ub >= 0.0f && ub <= 1.0f) { + // check if they are coincident (no collision in this case) + if (ua != 0f || ub != 0f) { + // There is an intersection + point.x = point1.x + ua * b; + point.y = point1.y + ua * d; + return true; + } + } + } + } + return false; + } + + // precondition: ccw + private static Boolean Reflex(int i, Array vertices) { + return Right(i, vertices); + } + + private static Boolean Right(int i, Array vertices) { + return Right(At(i - 1, vertices), At(i, vertices), At(i + 1, vertices)); + } + + private static Boolean Left(Vector2 a, Vector2 b, Vector2 c) { + return Area(a, b, c) > 0; + } + + private static Boolean LeftOn(Vector2 a, Vector2 b, Vector2 c) { + return Area(a, b, c) >= 0; + } + + private static Boolean Right(Vector2 a, Vector2 b, Vector2 c) { + return Area(a, b, c) < 0; + } + + private static Boolean RightOn(Vector2 a, Vector2 b, Vector2 c) { + return Area(a, b, c) <= 0; + } + + public static float Area(Vector2 a, Vector2 b, Vector2 c) { + return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y); + } + + private static float SquareDist(Vector2 a, Vector2 b) { + float dx = b.x - a.x; + float dy = b.y - a.y; + return dx * dx + dy * dy; + } +} + +class SimplifyTools { + private static Boolean[] _usePt; + private static double _distanceTolerance; + + // / + // / Removes all collinear points on the polygon. + // / + // / The polygon that needs simplification. + // / The collinearity tolerance. + // / A simplified polygon. + public static Array CollinearSimplify(Array vertices, + float collinearityTolerance) { + // We can't simplify polygons under 3 vertices + if (vertices.size < 3) + return vertices; + Array simplified = new Array(); + for (int i = 0; i < vertices.size; i++) { + int prevId = i - 1; + if (prevId < 0) + prevId = vertices.size - 1; + int nextId = i + 1; + if (nextId >= vertices.size) + nextId = 0; + Vector2 prev = vertices.get(prevId); + Vector2 current = vertices.get(i); + Vector2 next = vertices.get(nextId); + // If they collinear, continue + if (Collinear(prev, current, next, collinearityTolerance)) + continue; + simplified.add(current); + } + return simplified; + } + + public static Boolean Collinear(Vector2 a, Vector2 b, Vector2 c, + float tolerance) { + return FloatInRange(BayazitDecomposer.Area(a, b, c), -tolerance, + tolerance); + } + + public static Boolean FloatInRange(float value, float min, float max) { + return (value >= min && value <= max); + } + + // / + // / Removes all collinear points on the polygon. + // / Has a default bias of 0 + // / + // / The polygon that needs simplification. + // / A simplified polygon. + public static Array CollinearSimplify(Array vertices) { + return CollinearSimplify(vertices, 0); + } + + // / + // / Ramer-Douglas-Peucker polygon simplification algorithm. This is the + // general recursive version that does not use the + // / speed-up technique by using the Melkman convex hull. + // / + // / If you pass in 0, it will remove all collinear points + // / + // / The simplified polygon + public static Array DouglasPeuckerSimplify( + Array vertices, float distanceTolerance) { + _distanceTolerance = distanceTolerance; + _usePt = new Boolean[vertices.size]; + for (int i = 0; i < vertices.size; i++) + _usePt[i] = true; + SimplifySection(vertices, 0, vertices.size - 1); + Array result = new Array(); + for (int i = 0; i < vertices.size; i++) + if (_usePt[i]) + result.add(vertices.get(i)); + return result; + } + + private static void SimplifySection(Array vertices, int i, int j) { + if ((i + 1) == j) + return; + Vector2 A = vertices.get(i); + Vector2 B = vertices.get(j); + double maxDistance = -1.0; + int maxIndex = i; + for (int k = i + 1; k < j; k++) { + double distance = DistancePointLine(vertices.get(k), A, B); + if (distance > maxDistance) { + maxDistance = distance; + maxIndex = k; + } + } + if (maxDistance <= _distanceTolerance) + for (int k = i + 1; k < j; k++) + _usePt[k] = false; + else { + SimplifySection(vertices, i, maxIndex); + SimplifySection(vertices, maxIndex, j); + } + } + + private static double DistancePointPoint(Vector2 p, Vector2 p2) { + double dx = p.x - p2.x; + double dy = p.y - p2.x; + return Math.sqrt(dx * dx + dy * dy); + } + + private static double DistancePointLine(Vector2 p, Vector2 A, Vector2 B) { + // if start == end, then use point-to-point distance + if (A.x == B.x && A.y == B.y) + return DistancePointPoint(p, A); + // otherwise use comp.graphics.algorithms Frequently Asked Questions + // method + /* + * (1) AC dot AB r = --------- ||AB||^2 r has the following meaning: r=0 + * Point = A r=1 Point = B r<0 Point is on the backward extension of AB + * r>1 Point is on the forward extension of AB 0= 1.0) + return DistancePointPoint(p, B); + /* + * (2) (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay) s = ----------------------------- + * Curve^2 Then the distance from C to Point = |s|*Curve. + */ + double s = ((A.y - p.y) * (B.x - A.x) - (A.x - p.x) * (B.y - A.y)) + / ((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y)); + return Math.abs(s) + * Math.sqrt(((B.x - A.x) * (B.x - A.x) + (B.y - A.y) + * (B.y - A.y))); + } + + // From physics2d.net + public static Array ReduceByArea(Array vertices, + float areaTolerance) { + if (vertices.size <= 3) + return vertices; + if (areaTolerance < 0) { + throw new InvalidParameterException( + "areaTolerance: must be equal to or greater then zero."); + } + Array result = new Array(); + Vector2 v1, v2, v3; + float old1, old2, new1; + v1 = vertices.get(vertices.size - 2); + v2 = vertices.get(vertices.size - 1); + areaTolerance *= 2; + for (int index = 0; index < vertices.size; ++index, v2 = v3) { + if (index == vertices.size - 1) { + if (result.size == 0) { + throw new InvalidParameterException( + "areaTolerance: The tolerance is too high!"); + } + v3 = result.get(0); + } else { + v3 = vertices.get(index); + } + old1 = Cross(v1, v2); + old2 = Cross(v2, v3); + new1 = Cross(v1, v3); + if (Math.abs(new1 - (old1 + old2)) > areaTolerance) { + result.add(v2); + v1 = v2; + } + } + return result; + } + + public static Float Cross(Vector2 a, Vector2 b) { + return a.x * b.y - a.y * b.x; + } + + // From Eric Jordan's convex decomposition library + // / + // / Merges all parallel edges in the list of vertices + // / + // / The vertices. + // / The tolerance. + public static void MergeParallelEdges(Array vertices, + float tolerance) { + if (vertices.size <= 3) + return; // Can't do anything useful here to a triangle + Boolean[] mergeMe = new Boolean[vertices.size]; + int newNVertices = vertices.size; + // Gather points to process + for (int i = 0; i < vertices.size; ++i) { + int lower = (i == 0) ? (vertices.size - 1) : (i - 1); + int middle = i; + int upper = (i == vertices.size - 1) ? (0) : (i + 1); + float dx0 = vertices.get(middle).x - vertices.get(lower).x; + float dy0 = vertices.get(middle).y - vertices.get(lower).y; + float dx1 = vertices.get(upper).y - vertices.get(middle).x; + float dy1 = vertices.get(upper).y - vertices.get(middle).y; + float norm0 = (float) Math.sqrt(dx0 * dx0 + dy0 * dy0); + float norm1 = (float) Math.sqrt(dx1 * dx1 + dy1 * dy1); + if (!(norm0 > 0.0f && norm1 > 0.0f) && newNVertices > 3) { + // Merge identical points + mergeMe[i] = true; + --newNVertices; + } + dx0 /= norm0; + dy0 /= norm0; + dx1 /= norm1; + dy1 /= norm1; + float cross = dx0 * dy1 - dx1 * dy0; + float dot = dx0 * dx1 + dy0 * dy1; + if (Math.abs(cross) < tolerance && dot > 0 && newNVertices > 3) { + mergeMe[i] = true; + --newNVertices; + } else + mergeMe[i] = false; + } + if (newNVertices == vertices.size || newNVertices == 0) + return; + int currIndex = 0; + // Copy the vertices to a new list and clear the old + Array oldVertices = new Array(vertices); + vertices.clear(); + for (int i = 0; i < oldVertices.size; ++i) { + if (mergeMe[i] || newNVertices == 0 || currIndex == newNVertices) + continue; + // Debug.Assert(currIndex < newNVertices); + vertices.add(oldVertices.get(i)); + ++currIndex; + } + } + + // Misc + // / + // / Merges the identical points in the polygon. + // / + // / The vertices. + // / + public static Array MergeIdenticalPoints(Array vertices) { + Array results = new Array(); + for (int i = 0; i < vertices.size; i++) { + Vector2 vOriginal = vertices.get(i); + + boolean alreadyExists = false; + for (int j = 0; j < results.size; j++) { + Vector2 v = results.get(j); + if (vOriginal.equals(v)) { + alreadyExists = true; + break; + } + } + if (!alreadyExists) + results.add(vertices.get(i)); + } + return results; + } + + // / + // / Reduces the polygon by distance. + // / + // / The vertices. + // / The distance between points. Points closer than + // this will be 'joined'. + // / + public static Array ReduceByDistance(Array vertices, + float distance) { + // We can't simplify polygons under 3 vertices + if (vertices.size < 3) + return vertices; + Array simplified = new Array(); + for (int i = 0; i < vertices.size; i++) { + Vector2 current = vertices.get(i); + int ii = i + 1; + if (ii >= vertices.size) + ii = 0; + Vector2 next = vertices.get(ii); + Vector2 diff = new Vector2(next.x - current.x, next.y - current.y); + // If they are closer than the distance, continue + if (diff.len2() <= distance) + continue; + simplified.add(current); + } + return simplified; + } + + // / + // / Reduces the polygon by removing the Nth vertex in the vertices list. + // / + // / The vertices. + // / The Nth point to remove. Example: 5. + // / + public static Array ReduceByNth(Array vertices, int nth) { + // We can't simplify polygons under 3 vertices + if (vertices.size < 3) + return vertices; + if (nth == 0) + return vertices; + Array result = new Array(vertices.size); + for (int i = 0; i < vertices.size; i++) { + if (i % nth == 0) + continue; + result.add(vertices.get(i)); + } + return result; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/EwjordanDecomposer.java b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/EwjordanDecomposer.java new file mode 100644 index 00000000..565960f9 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/EwjordanDecomposer.java @@ -0,0 +1,206 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly.earclipping.ewjordan; + +import com.badlogic.gdx.math.Vector2; + +/** + * Original code from EwJordan (http://www.ewjordan.com/earClip/) + */ +public class EwjordanDecomposer { + public static Vector2[][] decompose(Vector2[] points) { + int vNum = points.length; + float[] xv = new float[vNum]; + float[] yv = new float[vNum]; + + for (int i = 0; i < vNum; i++) { + xv[i] = points[i].x; + yv[i] = points[i].y; + } + + Triangle[] tempTriangles = triangulatePolygon(xv, yv, vNum); + Polygon[] tempPolygons = polygonizeTriangles(tempTriangles); + + if (tempPolygons == null) + return null; + + Vector2[][] polygons = new Vector2[tempPolygons.length][]; + for (int i = 0; i < tempPolygons.length; i++) { + polygons[i] = new Vector2[tempPolygons[i].nVertices]; + for (int ii = 0; ii < tempPolygons[i].nVertices; ii++) + polygons[i][ii] = new Vector2(tempPolygons[i].x[ii], tempPolygons[i].y[ii]); + } + + return polygons; + } + + // ------------------------------------------------------------------------- + + private static Triangle[] triangulatePolygon(float[] xv, float[] yv, int vNum) { + if (vNum < 3) + return null; + + Triangle[] buffer = new Triangle[vNum]; + int bufferSize = 0; + float[] xrem = new float[vNum]; + float[] yrem = new float[vNum]; + for (int i = 0; i < vNum; ++i) { + xrem[i] = xv[i]; + yrem[i] = yv[i]; + } + + while (vNum > 3) { + int earIndex = -1; + for (int i = 0; i < vNum; ++i) { + if (isEar(i, xrem, yrem)) { + earIndex = i; + break; + } + } + + if (earIndex == -1) + return null; + + --vNum; + float[] newx = new float[vNum]; + float[] newy = new float[vNum]; + int currDest = 0; + for (int i = 0; i < vNum; ++i) { + if (currDest == earIndex) { + ++currDest; + } + newx[i] = xrem[currDest]; + newy[i] = yrem[currDest]; + ++currDest; + } + + int under = (earIndex == 0) ? (xrem.length - 1) : (earIndex - 1); + int over = (earIndex == xrem.length - 1) ? 0 : (earIndex + 1); + + Triangle toAdd = new Triangle(xrem[earIndex], yrem[earIndex], xrem[over], yrem[over], xrem[under], yrem[under]); + buffer[bufferSize] = toAdd; + ++bufferSize; + + xrem = newx; + yrem = newy; + } + Triangle toAdd = new Triangle(xrem[1], yrem[1], xrem[2], yrem[2], xrem[0], yrem[0]); + buffer[bufferSize] = toAdd; + ++bufferSize; + + Triangle[] res = new Triangle[bufferSize]; + System.arraycopy(buffer, 0, res, 0, bufferSize); + return res; + } + + private static Polygon[] polygonizeTriangles(Triangle[] triangulated) { + Polygon[] polys; + int polyIndex = 0; + + if (triangulated == null) + return null; + + polys = new Polygon[triangulated.length]; + boolean[] covered = new boolean[triangulated.length]; + for (int i = 0; i < triangulated.length; i++) + covered[i] = false; + + boolean notDone = true; + + while (notDone) { + int currTri = -1; + for (int i = 0; i < triangulated.length; i++) { + if (!covered[i]) { + currTri = i; + break; + } + } + + if (currTri == -1) { + notDone = false; + } else { + Polygon poly = new Polygon(triangulated[currTri]); + covered[currTri] = true; + for (int i = 0; i < triangulated.length; i++) { + if (covered[i]) + continue; + + Polygon newP = poly.add(triangulated[i]); + if (newP == null) + continue; + + if (newP.isConvex()) { + poly = newP; + covered[i] = true; + } + } + polys[polyIndex] = poly; + polyIndex++; + } + } + + Polygon[] ret = new Polygon[polyIndex]; + System.arraycopy(polys, 0, ret, 0, polyIndex); + return ret; + } + + private static boolean isEar(int i, float[] xv, float[] yv) { + float dx0, dy0, dx1, dy1; + dx0 = dy0 = dx1 = dy1 = 0; + + if (i >= xv.length || i < 0 || xv.length < 3) + return false; + + int upper = i + 1; + int lower = i - 1; + + if (i == 0) { + dx0 = xv[0] - xv[xv.length - 1]; + dy0 = yv[0] - yv[yv.length - 1]; + dx1 = xv[1] - xv[0]; + dy1 = yv[1] - yv[0]; + lower = xv.length - 1; + } else if (i == xv.length - 1) { + dx0 = xv[i] - xv[i - 1]; + dy0 = yv[i] - yv[i - 1]; + dx1 = xv[0] - xv[i]; + dy1 = yv[0] - yv[i]; + upper = 0; + } else { + dx0 = xv[i] - xv[i - 1]; + dy0 = yv[i] - yv[i - 1]; + dx1 = xv[i + 1] - xv[i]; + dy1 = yv[i + 1] - yv[i]; + } + + float cross = dx0 * dy1 - dx1 * dy0; + if (cross > 0) + return false; + + Triangle myTri = new Triangle(xv[i], yv[i], xv[upper], yv[upper], xv[lower], yv[lower]); + for (int j = 0; j < xv.length; ++j) { + if (j == i || j == lower || j == upper) + continue; + if (myTri.isInside(xv[j], yv[j])) + return false; + } + + return true; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Polygon.java b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Polygon.java new file mode 100644 index 00000000..2bc44026 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Polygon.java @@ -0,0 +1,150 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly.earclipping.ewjordan; + +/** + * + * @author EwJordan (http://www.ewjordan.com/earClip/) + */ +public class Polygon { + public float[] x; + public float[] y; + public int nVertices; + + public Polygon(float[] _x, float[] _y) { + nVertices = _x.length; + x = new float[nVertices]; + y = new float[nVertices]; + for (int i = 0; i < nVertices; ++i) { + x[i] = _x[i]; + y[i] = _y[i]; + } + } + + public Polygon(Triangle t) { + this(t.x, t.y); + } + + public void set(Polygon p) { + nVertices = p.nVertices; + x = new float[nVertices]; + y = new float[nVertices]; + for (int i = 0; i < nVertices; ++i) { + x[i] = p.x[i]; + y[i] = p.y[i]; + } + } + + public boolean isConvex() { + boolean isPositive = false; + for (int i = 0; i < nVertices; ++i) { + int lower = (i == 0) ? (nVertices - 1) : (i - 1); + int middle = i; + int upper = (i == nVertices - 1) ? (0) : (i + 1); + float dx0 = x[middle] - x[lower]; + float dy0 = y[middle] - y[lower]; + float dx1 = x[upper] - x[middle]; + float dy1 = y[upper] - y[middle]; + float cross = dx0 * dy1 - dx1 * dy0; + //Cross product should have same sign + //for each vertex if poly is convex. + boolean newIsP = (cross > 0) ? true : false; + if (i == 0) { + isPositive = newIsP; + } else if (isPositive != newIsP) { + return false; + } + } + return true; + } + + /* + * Tries to add a triangle to the polygon. + * Returns null if it can't connect properly. + * Assumes bitwise equality of join vertices. + */ + public Polygon add(Triangle t) { + //First, find vertices that connect + int firstP = -1; + int firstT = -1; + int secondP = -1; + int secondT = -1; + for (int i = 0; i < nVertices; i++) { + if (t.x[0] == x[i] && t.y[0] == y[i]) { + if (firstP == -1) { + firstP = i; + firstT = 0; + } else { + secondP = i; + secondT = 0; + } + } else if (t.x[1] == x[i] && t.y[1] == y[i]) { + if (firstP == -1) { + firstP = i; + firstT = 1; + } else { + secondP = i; + secondT = 1; + } + } else if (t.x[2] == x[i] && t.y[2] == y[i]) { + if (firstP == -1) { + firstP = i; + firstT = 2; + } else { + secondP = i; + secondT = 2; + } + } + } + //Fix ordering if first should be last vertex of poly + if (firstP == 0 && secondP == nVertices - 1) { + firstP = nVertices - 1; + secondP = 0; + } + + //Didn't find it + if (secondP == -1) { + return null; + } + + //Find tip index on triangle + int tipT = 0; + if (tipT == firstT || tipT == secondT) { + tipT = 1; + } + if (tipT == firstT || tipT == secondT) { + tipT = 2; + } + + float[] newx = new float[nVertices + 1]; + float[] newy = new float[nVertices + 1]; + int currOut = 0; + for (int i = 0; i < nVertices; i++) { + newx[currOut] = x[i]; + newy[currOut] = y[i]; + if (i == firstP) { + ++currOut; + newx[currOut] = t.x[tipT]; + newy[currOut] = t.y[tipT]; + } + ++currOut; + } + return new Polygon(newx, newy); + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Triangle.java b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Triangle.java new file mode 100644 index 00000000..c06c822e --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/earclipping/ewjordan/Triangle.java @@ -0,0 +1,74 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly.earclipping.ewjordan; + +/** + * + * @author EwJordan (http://www.ewjordan.com/earClip/) + */ +public class Triangle { + public float[] x; + public float[] y; + + public Triangle(float x1, float y1, float x2, float y2, float x3, float y3) { + x = new float[3]; + y = new float[3]; + float dx1 = x2 - x1; + float dx2 = x3 - x1; + float dy1 = y2 - y1; + float dy2 = y3 - y1; + float cross = dx1 * dy2 - dx2 * dy1; + boolean ccw = (cross > 0); + if (ccw) { + x[0] = x1; + x[1] = x2; + x[2] = x3; + y[0] = y1; + y[1] = y2; + y[2] = y3; + } else { + x[0] = x1; + x[1] = x3; + x[2] = x2; + y[0] = y1; + y[1] = y3; + y[2] = y2; + } + } + + public boolean isInside(float _x, float _y) { + float vx2 = _x - x[0]; + float vy2 = _y - y[0]; + float vx1 = x[1] - x[0]; + float vy1 = y[1] - y[0]; + float vx0 = x[2] - x[0]; + float vy0 = y[2] - y[0]; + + float dot00 = vx0 * vx0 + vy0 * vy0; + float dot01 = vx0 * vx1 + vy0 * vy1; + float dot02 = vx0 * vx2 + vy0 * vy2; + float dot11 = vx1 * vx1 + vy1 * vy1; + float dot12 = vx1 * vx2 + vy1 * vy2; + float invDenom = 1f / (dot00 * dot11 - dot01 * dot01); + float u = (dot11 * dot02 - dot01 * dot12) * invDenom; + float v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + return ((u > 0) && (v > 0) && (u + v < 1)); + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/tracer/TextureConverter.java b/src/main/java/games/rednblack/editor/utils/poly/tracer/TextureConverter.java new file mode 100644 index 00000000..b36911aa --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/tracer/TextureConverter.java @@ -0,0 +1,964 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly.tracer; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; + +/** +* http://astroboid.x50.cc/blog/2010/06/mapping-box2d-shapes-from-textures/ A +* mostly "blind" C# conversion of the TextureConverter code from Farseer, I +* even left the original german comments in place. Seems to work. +*/ +public class TextureConverter { + // User contribution from Sickbattery + // / + // / TODO: + // / 1.) Das Array welches ich bekomme am besten in einen boolean array + // verwandeln. Wurde die Geschwindigkeit verbessern + // / + private static int[][] ClosePixels = new int[][] { { -1, -1 }, { 0, -1 }, + { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, { -1, 0 } }; + + public static Array createPolygon(int[] data, int width, int height) + throws Exception { + PolygonCreationAssistance pca = new PolygonCreationAssistance(data, + width, height); + Array> verts = createPolygon(pca); + return verts.get(0); + } + + public static Array createPolygon(int[] data, int width, + int height, boolean holeDetection) throws Exception { + PolygonCreationAssistance pca = new PolygonCreationAssistance(data, + width, height); + pca.HoleDetection = holeDetection; + Array> verts = createPolygon(pca); + return verts.get(0); + } + + public static Array> createPolygon(int[] data, int width, + int height, float hullTolerance, int alphaTolerance, + boolean multiPartDetection, boolean holeDetection) throws Exception { + PolygonCreationAssistance pca = new PolygonCreationAssistance(data, + width, height); + pca.setHullTolerance(hullTolerance); + pca.setAlphaTolerance(alphaTolerance); + pca.MultipartDetection = multiPartDetection; + pca.HoleDetection = holeDetection; + return createPolygon(pca); + } + + private static Array> createPolygon( + PolygonCreationAssistance pca) throws Exception { + Array> polygons = new Array>(); + Array polygon; + Array holePolygon; + Vector2 holeEntrance = null; + Vector2 polygonEntrance = null; + Array blackList = new Array(); + // First of all: Check the array you just got. + if (pca.IsValid()) { + boolean searchOn; + do { + if (polygons.size == 0) { + polygon = CreateSimplePolygon(pca, new Vector2(), + new Vector2()); + if (polygon != null && polygon.size > 2) { + polygonEntrance = GetTopMostVertex(polygon); + } + } else if (polygonEntrance != null) { + polygon = CreateSimplePolygon(pca, polygonEntrance, + new Vector2(polygonEntrance.x - 1f, + polygonEntrance.y)); + } else { + break; + } + searchOn = false; + if (polygon != null && polygon.size > 2) { + if (pca.HoleDetection) { + do { + holeEntrance = GetHoleHullEntrance(pca, polygon, + holeEntrance); + if (holeEntrance != null) { + if (!vectorListContains(blackList, holeEntrance)) { + blackList.add(holeEntrance); + holePolygon = CreateSimplePolygon(pca, + holeEntrance, new Vector2( + holeEntrance.x + 1, + holeEntrance.y)); + if (holePolygon != null + && holePolygon.size > 2) { + holePolygon.add(holePolygon.get(0)); + Reference vertex2IndexRef = new Reference( + 0); + Reference vertex1IndexRef = new Reference( + 0); + if (SplitPolygonEdge(polygon, + EdgeAlignment.Vertical, + holeEntrance, vertex1IndexRef, + vertex2IndexRef)) { + + polygon.ensureCapacity(holePolygon.size); + for (int i = holePolygon.size - 1; i <= 0; i--) { + polygon.insert( + vertex2IndexRef.v, + holePolygon.get(i)); + } + } + } + } else { + break; + } + } else { + break; + } + } while (true); + } + polygons.add(polygon); + if (pca.MultipartDetection) { + // 1: 95 / 151 + // 2: 232 / 252 + // + polygonEntrance = new Vector2(); + while (GetNextHullEntrance(pca, polygonEntrance, + polygonEntrance)) { + boolean inPolygon = false; + for (int i = 0; i < polygons.size; i++) { + polygon = polygons.get(i); + if (InPolygon(pca, polygon, polygonEntrance)) { + inPolygon = true; + break; + } + } + if (!inPolygon) { + searchOn = true; + break; + } + } + } + } + } while (searchOn); + } else { + throw new Exception( + "Sizes don't match: Color array must contain texture width * texture height elements."); + } + return polygons; + } + + private static Vector2 GetHoleHullEntrance(PolygonCreationAssistance pca, + Array polygon, Vector2 startVertex) throws Exception { + Array edges = new Array(); + Vector2 entrance; + int startLine; + int endLine; + int lastSolid = 0; + boolean foundSolid; + boolean foundTransparent; + if (polygon != null && polygon.size > 0) { + if (startVertex != null) { + startLine = (int) startVertex.y; + } else { + startLine = (int) GetTopMostCoord(polygon); + } + endLine = (int) GetBottomMostCoord(polygon); + if (startLine > 0 && startLine < pca.Height && endLine > 0 + && endLine < pca.Height) { + // go from top to bottom of the polygon + for (int y = startLine; y <= endLine; y += pca + .getHoleDetectionLineStepSize()) { + // get x-coord of every polygon edge which crosses y + edges = GetCrossingEdges(polygon, EdgeAlignment.Vertical, y); + // we need an even number of crossing edges + if (edges.size > 1 && edges.size % 2 == 0) { + for (int i = 0; i < edges.size; i += 2) { + foundSolid = false; + foundTransparent = false; + for (int x = (int) edges.get(i).CrossingPoint.x; x <= (int) edges + .get(i + 1).CrossingPoint.x; x++) { + if (pca.IsSolid(x, y)) { + if (!foundTransparent) { + foundSolid = true; + lastSolid = x; + } + if (foundSolid && foundTransparent) { + entrance = new Vector2(lastSolid, y); + if (DistanceToHullAcceptable(pca, + polygon, entrance, true)) { + return entrance; + } + entrance = null; + break; + } + } else { + if (foundSolid) { + foundTransparent = true; + } + } + } + } + } + } + } + } + return null; + } + + private static boolean DistanceToHullAcceptable( + PolygonCreationAssistance pca, Array polygon, + Vector2 point, boolean higherDetail) { + if (polygon != null && polygon.size > 2) { + Vector2 edgeVertex2 = polygon.get(polygon.size - 1).cpy(); + Vector2 edgeVertex1 = new Vector2(); + if (higherDetail) { + for (int i = 0; i < polygon.size; i++) { + edgeVertex1.set(polygon.get(i)); + if (LineTools.DistanceBetweenPointAndLineSegment(point, + edgeVertex1, edgeVertex2) <= pca.getHullTolerance() + || LineTools.DistanceBetweenPointAndPoint(point, + edgeVertex1) <= pca.getHullTolerance()) { + return false; + } + edgeVertex2.set(polygon.get(i)); + } + return true; + } else { + for (int i = 0; i < polygon.size; i++) { + edgeVertex1.set(polygon.get(i)); + if (LineTools.DistanceBetweenPointAndLineSegment(point, + edgeVertex1, edgeVertex2) <= pca.getHullTolerance()) { + return false; + } + edgeVertex2.set(polygon.get(i)); + } + return true; + } + } + return false; + } + + private static boolean InPolygon(PolygonCreationAssistance pca, + Array polygon, Vector2 point) throws Exception { + boolean inPolygon = !DistanceToHullAcceptable(pca, polygon, point, true); + if (!inPolygon) { + Array edges = GetCrossingEdges(polygon, + EdgeAlignment.Vertical, (int) point.y); + if (edges.size > 0 && edges.size % 2 == 0) { + for (int i = 0; i < edges.size; i += 2) { + if (edges.get(i).CrossingPoint.x <= point.x + && edges.get(i + 1).CrossingPoint.x >= point.x) { + return true; + } + } + return false; + } + return false; + } + return true; + } + + private static Vector2 GetTopMostVertex(Array vertices) { + float topMostValue = Float.MAX_VALUE; + Vector2 topMost = null; + for (int i = 0; i < vertices.size; i++) { + if (topMostValue > vertices.get(i).y) { + topMostValue = vertices.get(i).y; + topMost = vertices.get(i); + } + } + return topMost.cpy(); + } + + private static float GetTopMostCoord(Array vertices) { + float returnValue = Float.MAX_VALUE; + for (int i = 0; i < vertices.size; i++) { + if (returnValue > vertices.get(i).y) { + returnValue = vertices.get(i).y; + } + } + return returnValue; + } + + private static float GetBottomMostCoord(Array vertices) { + float returnValue = Float.MIN_VALUE; + for (int i = 0; i < vertices.size; i++) { + if (returnValue < vertices.get(i).y) { + returnValue = vertices.get(i).y; + } + } + return returnValue; + } + + public static Boolean vectorEquals(Vector2 v1, Vector2 v2) { + return v1.x == v2.x && v1.y == v2.y; + } + + public static int vectorListIndexOf(Array list, Vector2 v) { + for (int i = 0; i < list.size; i++) { + Object obj = list.get(i); + if (obj == v) + return i; + if (obj instanceof Vector2) { + Vector2 vect = (Vector2) obj; + if (vectorEquals(v, vect)) + return i; + } + } + return -1; + } + + public static Boolean vectorListContains(Array list, Vector2 v) { + int index = vectorListIndexOf(list, v); + return index != -1; + } + + public static Vector2 vectorSub(Vector2 v1, Vector2 v2) { + return new Vector2(v1.x - v2.x, v1.y - v2.y); + } + + public static Vector2 vectorAdd(Vector2 v1, Vector2 v2) { + return new Vector2(v1.x + v2.x, v1.y + v2.y); + } + + public static float vectorCross(Vector2 v1, Vector2 v2) { + return v1.x * v2.y - v1.y * v2.x; + } + + public static Vector2 vectorCross(Vector2 v1, float scalar) { + return new Vector2(scalar * v1.y, -scalar * v1.x); + } + + public static float vectorDot(Vector2 v1, Vector2 v2) { + return v1.x * v2.x + v1.y * v2.y; + } + + public static Vector2 vectorMul(Vector2 v1, float scalar) { + return new Vector2(v1.x * scalar, v1.y * scalar); + } + + private static Array GetCrossingEdges( + Array polygon, EdgeAlignment edgeAlign, int checkLine) + throws Exception { + Array edges = new Array(); + Vector2 slope = new Vector2(); + Vector2 edgeVertex1 = new Vector2(); + Vector2 edgeVertex2 = new Vector2(); + Vector2 slopePreview = new Vector2(); + Vector2 edgeVertexPreview = new Vector2(); + Vector2 crossingPoint = new Vector2(); + boolean addCrossingPoint; + if (polygon.size > 1) { + edgeVertex2.set(polygon.get(polygon.size - 1)); + switch (edgeAlign) { + case Vertical: + for (int i = 0; i < polygon.size; i++) { + edgeVertex1.set(polygon.get(i)); + if ((edgeVertex1.y >= checkLine && edgeVertex2.y <= checkLine) + || (edgeVertex1.y <= checkLine && edgeVertex2.y >= checkLine)) { + if (edgeVertex1.y != edgeVertex2.y) { + addCrossingPoint = true; + slope.set(vectorSub(edgeVertex2, edgeVertex1)); + if (edgeVertex1.y == checkLine) { + edgeVertexPreview.set(polygon.get((i + 1) + % polygon.size)); + slopePreview.set(vectorSub(edgeVertex1, + edgeVertexPreview)); + if (slope.y > 0) { + addCrossingPoint = (slopePreview.y <= 0); + } else { + addCrossingPoint = (slopePreview.y >= 0); + } + } + if (addCrossingPoint) { + crossingPoint = new Vector2( + (checkLine - edgeVertex1.y) / slope.y + * slope.x + edgeVertex1.x, + checkLine); + edges.add(new CrossingEdgeInfo(edgeVertex1, + edgeVertex2, crossingPoint, edgeAlign)); + } + } + } + edgeVertex2.set(edgeVertex1); + } + break; + case Horizontal: + throw new Exception( + "EdgeAlignment.Horizontal isn't implemented yet. Sorry."); + } + } + edges.sort(); + // Collections.sort(edges); + return edges; + } + + private static boolean SplitPolygonEdge(Array polygon, + EdgeAlignment edgeAlign, Vector2 coordInsideThePolygon, + Reference vertex1IndexRef, + Reference vertex2IndexRef) throws Exception { + Array edges; + Vector2 slope = new Vector2(); + int nearestEdgeVertex1Index = 0; + int nearestEdgeVertex2Index = 0; + boolean edgeFound = false; + float shortestDistance = Float.MAX_VALUE; + boolean edgeCoordFound = false; + Vector2 foundEdgeCoord = new Vector2(); + vertex1IndexRef.v = 0; + vertex2IndexRef.v = 0; + switch (edgeAlign) { + case Vertical: + edges = GetCrossingEdges(polygon, EdgeAlignment.Vertical, + (int) coordInsideThePolygon.y); + foundEdgeCoord.y = coordInsideThePolygon.y; + if (edges != null && edges.size > 1 && edges.size % 2 == 0) { + float distance; + for (int i = 0; i < edges.size; i++) { + if (edges.get(i).CrossingPoint.x < coordInsideThePolygon.x) { + distance = coordInsideThePolygon.x + - edges.get(i).CrossingPoint.x; + if (distance < shortestDistance) { + shortestDistance = distance; + foundEdgeCoord.x = edges.get(i).CrossingPoint.x; + edgeCoordFound = true; + } + } + } + if (edgeCoordFound) { + shortestDistance = Float.MAX_VALUE; + int edgeVertex2Index = polygon.size - 1; + int edgeVertex1Index; + for (edgeVertex1Index = 0; edgeVertex1Index < polygon.size; edgeVertex1Index++) { + Vector2 tempVector1 = polygon.get(edgeVertex1Index) + .cpy(); + Vector2 tempVector2 = polygon.get(edgeVertex2Index) + .cpy(); + distance = LineTools + .DistanceBetweenPointAndLineSegment( + foundEdgeCoord, tempVector1, + tempVector2); + if (distance < shortestDistance) { + shortestDistance = distance; + nearestEdgeVertex1Index = edgeVertex1Index; + nearestEdgeVertex2Index = edgeVertex2Index; + edgeFound = true; + } + edgeVertex2Index = edgeVertex1Index; + } + if (edgeFound) { + slope.set(vectorSub( + polygon.get(nearestEdgeVertex2Index), + polygon.get(nearestEdgeVertex1Index))); + slope.nor(); + Vector2 tempVector = polygon.get( + nearestEdgeVertex1Index).cpy(); + distance = LineTools.DistanceBetweenPointAndPoint( + tempVector, foundEdgeCoord); + vertex1IndexRef.v = nearestEdgeVertex1Index; + vertex2IndexRef.v = nearestEdgeVertex1Index + 1; + // distance * slope + polygon[vertex1Index] + polygon.insert( + nearestEdgeVertex1Index, + vectorAdd(vectorMul(slope, distance), + polygon.get(vertex1IndexRef.v))); + polygon.insert( + nearestEdgeVertex1Index, + vectorAdd(vectorMul(slope, distance), + polygon.get(vertex2IndexRef.v))); + return true; + } + } + } + break; + case Horizontal: + throw new Exception( + "EdgeAlignment.Horizontal isn't implemented yet. Sorry."); + } + return false; + } + + private static Array CreateSimplePolygon( + PolygonCreationAssistance pca, Vector2 entrance, Vector2 last) { + boolean entranceFound = false; + boolean endOfHull = false; + Array polygon = new Array(); + Array hullArea = new Array(); + Array endOfHullArea = new Array(); + Vector2 current = new Vector2(); + Vector2 zeroVec = new Vector2(); + // Get the entrance point. //todo: alle moglichkeiten testen + if (vectorEquals(entrance, zeroVec) || !pca.InBounds(entrance)) { + entranceFound = GetHullEntrance(pca, entrance); + if (entranceFound) { + current.set(entrance.x - 1f, entrance.y); + } + } else { + if (pca.IsSolid(entrance)) { + if (IsNearPixel(pca, entrance, last)) { + current.set(last); + entranceFound = true; + } else { + Vector2 temp = new Vector2(); + if (SearchNearPixels(pca, false, entrance, temp)) { + current.set(temp); + entranceFound = true; + } else { + entranceFound = false; + } + } + } + } + if (entranceFound) { + polygon.add(entrance); + hullArea.add(entrance); + Vector2 next = entrance.cpy(); + do { + // Search in the pre vision list for an outstanding point. + Vector2 outstanding = new Vector2(); + if (SearchForOutstandingVertex(hullArea, + pca.getHullTolerance(), outstanding)) { + if (endOfHull) { + // We have found the next pixel, but is it on the last + // bit of the + // hull? + if (vectorListContains(endOfHullArea, outstanding) + && !vectorListContains(polygon, outstanding)) { + // Indeed. + polygon.add(outstanding); + } + // That's enough, quit. + break; + } + // Add it and remove all vertices that don't matter anymore + // (all the vertices before the outstanding). + polygon.add(outstanding); + int index = vectorListIndexOf(hullArea, outstanding); + if (index == -1) { + int debug = 1; + } + if (index >= 0) { + // hullArea = hullArea.subList(index + 1, + // hullArea.size); + + // Array newArray = new Array + // (hullArea.size - (index + 1)); + int counter = 0; + for (int i = index + 1; i < hullArea.size; i++) { + Vector2 v = hullArea.get(index); + // newArray.add(v); + hullArea.set(counter, v); + counter++; + } + // hullArea.clear(); + // hullArea = newArray; + for (int i = 0; i < index + 1; i++) { + hullArea.pop(); + } + } + } + // Last point gets current and current gets next. Our little + // spider is + // moving forward on the hull ;). + last.set(current); + current.set(next); + // Get the next point on hull. + next = new Vector2(); + if (GetNextHullPoint(pca, last, current, next)) { + // Add the vertex to a hull pre vision list. + hullArea.add(next); + } else { + // Quit + break; + } + if (vectorEquals(next, entrance) && !endOfHull) { + // It's the last bit of the hull, search on and exit at next + // found + // vertex. + endOfHull = true; + endOfHullArea.addAll(hullArea); + } + } while (true); + } + return polygon; + } + + private static boolean SearchNearPixels(PolygonCreationAssistance pca, + boolean searchingForSolidPixel, Vector2 current, Vector2 foundPixel) { + int x; + int y; + for (int i = 0; i < 8; i++) { + x = (int) current.x + ClosePixels[i][0]; + y = (int) current.y + ClosePixels[i][1]; + if (!searchingForSolidPixel ^ pca.IsSolid(x, y)) { + foundPixel.set(x, y); + return true; + } + } + // Nothing found. + foundPixel.set(0, 0); + return false; + } + + private static boolean IsNearPixel(PolygonCreationAssistance pca, + Vector2 current, Vector2 near) { + for (int i = 0; i < 8; i++) { + int x = (int) current.x + ClosePixels[i][0]; + int y = (int) current.y + ClosePixels[i][1]; + if (x >= 0 && x <= pca.Width && y >= 0 && y <= pca.Height) { + if (x == (int) near.x && y == (int) near.y) { + return true; + } + } + } + return false; + } + + private static boolean GetHullEntrance(PolygonCreationAssistance pca, + Vector2 entrance) { + // Search for first solid pixel. + for (int y = 0; y < pca.Height; y++) { + for (int x = 0; x < pca.Width; x++) { + if (pca.IsSolid(x, y)) { + entrance.set(x, y); + return true; + } + } + } + // If there are no solid pixels. + entrance.set(0, 0); + return false; + } + + private static boolean GetNextHullEntrance(PolygonCreationAssistance pca, + Vector2 start, Vector2 entrance) { + // Search for first solid pixel. + int size = pca.Height * pca.Width; + int x; + boolean foundTransparent = false; + for (int i = (int) start.x + (int) start.y * pca.Width; i < size; i++) { + if (pca.IsSolid(i)) { + if (foundTransparent) { + x = i % pca.Width; + entrance.set(x, (i - x) / pca.Width); + return true; + } + } else { + foundTransparent = true; + } + } + // If there are no solid pixels. + entrance.set(0, 0); + return false; + } + + private static boolean GetNextHullPoint(PolygonCreationAssistance pca, + Vector2 last, Vector2 current, Vector2 next) { + int x; + int y; + int indexOfFirstPixelToCheck = GetIndexOfFirstPixelToCheck(last, + current); + int indexOfPixelToCheck; + int pixelsToCheck = 8; // _closePixels.Length; + for (int i = 0; i < pixelsToCheck; i++) { + indexOfPixelToCheck = (indexOfFirstPixelToCheck + i) + % pixelsToCheck; + x = (int) current.x + ClosePixels[indexOfPixelToCheck][0]; + y = (int) current.y + ClosePixels[indexOfPixelToCheck][1]; + if (x >= 0 && x < pca.Width && y >= 0 && y <= pca.Height) { + if (pca.IsSolid(x, y)) // todo + { + next.set(x, y); + return true; + } + } + } + next.set(0, 0); + return false; + } + + private static boolean SearchForOutstandingVertex(Array hullArea, + float hullTolerance, Vector2 outstanding) { + Vector2 outstandingResult = new Vector2(); + boolean found = false; + if (hullArea.size > 2) { + int hullAreaLastPoint = hullArea.size - 1; + Vector2 tempVector1; + Vector2 tempVector2 = hullArea.get(0); + Vector2 tempVector3 = hullArea.get(hullAreaLastPoint); + // Search between the first and last hull point. + for (int i = 1; i < hullAreaLastPoint; i++) { + tempVector1 = hullArea.get(i); + // Check if the distance is over the one that's tolerable. + if (LineTools.DistanceBetweenPointAndLineSegment(tempVector1, + tempVector2, tempVector3) >= hullTolerance) { + outstandingResult.set(hullArea.get(i)); + found = true; + break; + } + } + } + outstanding.set(outstandingResult); + return found; + } + + private static int GetIndexOfFirstPixelToCheck(Vector2 last, Vector2 current) { + // .: pixel + // l: last position + // c: current position + // f: first pixel for next search + // f . . + // l c . + // . . . + // Calculate in which direction the last move went and decide over the + // next + // first pixel. + switch ((int) (current.x - last.x)) { + case 1: + switch ((int) (current.y - last.y)) { + case 1: + return 1; + case 0: + return 0; + case -1: + return 7; + } + break; + case 0: + switch ((int) (current.y - last.y)) { + case 1: + return 2; + case -1: + return 6; + } + break; + case -1: + switch ((int) (current.y - last.y)) { + case 1: + return 3; + case 0: + return 4; + case -1: + return 5; + } + break; + } + return 0; + } +} + +enum EdgeAlignment { + Vertical, Horizontal +} + +class CrossingEdgeInfo implements Comparable { + private EdgeAlignment _alignment; + private Vector2 _crossingPoint; + @SuppressWarnings("unused") + private Vector2 _edgeVertex2; + @SuppressWarnings("unused") + private Vector2 _egdeVertex1; + public Vector2 EdgeVertex1; + public Vector2 EdgeVertex2; + public EdgeAlignment CheckLineAlignment; + public Vector2 CrossingPoint; + + public CrossingEdgeInfo(Vector2 edgeVertex1, Vector2 edgeVertex2, + Vector2 crossingPoint, EdgeAlignment checkLineAlignment) { + _egdeVertex1 = edgeVertex1.cpy(); + _edgeVertex2 = edgeVertex2.cpy(); + _alignment = checkLineAlignment; + _crossingPoint = crossingPoint; + } + + public int compareTo(CrossingEdgeInfo obj) { + CrossingEdgeInfo cei = obj; + int result = 0; + switch (_alignment) { + case Vertical: + if (_crossingPoint.x < cei.CrossingPoint.y) { + result = -1; + } else if (_crossingPoint.x > cei.CrossingPoint.y) { + result = 1; + } + break; + case Horizontal: + if (_crossingPoint.y < cei.CrossingPoint.y) { + result = -1; + } else if (_crossingPoint.y > cei.CrossingPoint.y) { + result = 1; + } + break; + } + return result; + } +} + +// / +// / Class used as a tools container and helper for the texture-to-vertices code. +// / +class PolygonCreationAssistance { + private int _alphaTolerance; + private int _holeDetectionLineStepSize; + private float _hullTolerance; + + public PolygonCreationAssistance(int[] data, int width, int height) { + Data = data; + Width = width; + Height = height; + setAlphaTolerance((byte) 20); + setHullTolerance(1.5f); + setHoleDetectionLineStepSize(1); + HoleDetection = false; + MultipartDetection = false; + } + + private int[] Data; + public int Width; + public int Height; + + public int getAlphaTolerance() { + return _alphaTolerance; + } + + public void setAlphaTolerance(int value) { + _alphaTolerance = value & 0xFF; + } + + public float getHullTolerance() { + return _hullTolerance; + } + + public void setHullTolerance(float value) { + float hullTolerance = value; + if (hullTolerance > 4f) + hullTolerance = 4f; + if (hullTolerance < 0.9f) + hullTolerance = 0.9f; + _hullTolerance = hullTolerance; + } + + public int getHoleDetectionLineStepSize() { + return _holeDetectionLineStepSize; + } + + private void setHoleDetectionLineStepSize(int value) { + if (value < 1) { + _holeDetectionLineStepSize = 1; + } else { + if (value > 10) { + _holeDetectionLineStepSize = 10; + } else { + _holeDetectionLineStepSize = value; + } + } + } + + public boolean HoleDetection; + public boolean MultipartDetection; + + public boolean IsSolid(Vector2 pixel) { + return IsSolid((int) pixel.x, (int) pixel.y); + } + + public boolean IsSolid(int x, int y) { + if (x >= 0 && x < Width && y >= 0 && y < Height) { + int data = Data[x + y * Width]; + long mask1 = (long) data & 0xFFFFFFFFL; + long mask2 = mask1 & 0x000000FF; + Boolean opaque = mask2 >= _alphaTolerance; + if (opaque || mask2 != 0) { + int debug = 1; + } + return opaque; + } + return false; + } + + public boolean IsSolid(int index) { + if (index >= 0 && index < Width * Height) { + int data = Data[index]; + long mask1 = (long) data & 0xFFFFFFFFL; + long mask2 = mask1 & 0x000000FF; + Boolean opaque = mask2 >= _alphaTolerance; + if (opaque || mask2 != 0) { + int debug = 1; + } + return opaque; + // return (mask1 >= _alphaToleranceRealValue); + } + return false; + } + + public boolean InBounds(Vector2 coord) { + return (coord.x >= 0f && coord.x < Width && coord.y >= 0f && coord.y < Height); + } + + public boolean IsValid() { + if (Data != null && Data.length > 0) + return Data.length == Width * Height; + return false; + } +} + +class Reference { + public K v; + + public Reference(K v) { + this.v = v; + } + + @Override + public String toString() { + return v.toString(); + } + + @Override + public boolean equals(Object obj) { + return v.equals(obj); + } + + @Override + public int hashCode() { + return v.hashCode(); + } +} + +class LineTools { + public static float DistanceBetweenPointAndPoint(Vector2 point1, + Vector2 point2) { + Vector2 v = TextureConverter.vectorSub(point1, point2); + return v.len(); + } + + public static float DistanceBetweenPointAndLineSegment(Vector2 point, + Vector2 lineEndPoint1, Vector2 lineEndPoint2) { + Vector2 v = TextureConverter.vectorSub(lineEndPoint2, lineEndPoint1); + Vector2 w = TextureConverter.vectorSub(point, lineEndPoint1); + float c1 = TextureConverter.vectorDot(w, v); + if (c1 <= 0) + return DistanceBetweenPointAndPoint(point, lineEndPoint1); + float c2 = TextureConverter.vectorDot(v, v); + if (c2 <= c1) + return DistanceBetweenPointAndPoint(point, lineEndPoint2); + float b = c1 / c2; + Vector2 pointOnLine = TextureConverter.vectorAdd(lineEndPoint1, + TextureConverter.vectorMul(v, b)); + return DistanceBetweenPointAndPoint(point, pointOnLine); + } +} diff --git a/src/main/java/games/rednblack/editor/utils/poly/tracer/Tracer.java b/src/main/java/games/rednblack/editor/utils/poly/tracer/Tracer.java new file mode 100644 index 00000000..60f5e25c --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/poly/tracer/Tracer.java @@ -0,0 +1,83 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.poly.tracer; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Pixmap.Blending; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.utils.poly.TextureUtils; + +/** + * @author Aurelien Ribon | http://www.aurelienribon.com/ + */ +public class Tracer { + public static Vector2[][] trace(Texture texture, float hullTolerance, int alphaTolerance, boolean multiPartDetection, boolean holeDetection) { + Pixmap pixmap = TextureUtils.getPOTPixmap(texture); + + Blending blending = pixmap.getBlending(); + pixmap.setBlending(Blending.None); + + + int w = pixmap.getWidth(); + int h = pixmap.getHeight(); + + int size = w * h; + int[] array = new int[size]; + + for (int y=0; y> outlines; + try { + outlines = TextureConverter.createPolygon(array, w, h, hullTolerance, alphaTolerance, multiPartDetection, holeDetection); + } catch (Exception e) { + return null; + } + + TextureRegion region = TextureUtils.getPOTTexture(texture); + float tw = region.getRegionWidth(); + float th = region.getRegionHeight(); + + Vector2[][] polygons = new Vector2[outlines.size][]; + + for (int i=0; i outline = outlines.get(i); + polygons[i] = new Vector2[outline.size]; + for (int ii=0; ii E get(E source) { + Class eClass = source.getClass(); + E target = null; + try { + target = (E) eClass.newInstance(); + Field[] sourceFields = source.getClass().getDeclaredFields(); + Field[] targetFields = target.getClass().getDeclaredFields(); + for(int i = 0; i < targetFields.length; i++) { + if(Modifier.isPublic(targetFields[i].getModifiers())) { + targetFields[i].set(target, sourceFields[i].get(source)); + } + } + } catch (InstantiationException e) { + //e.printStackTrace(); + } catch (IllegalAccessException e) { + //e.printStackTrace(); + } + + return target; + } + + + public static void set(E target, E source) { + try { + Field[] sourceFields = source.getClass().getDeclaredFields(); + Field[] targetFields = target.getClass().getDeclaredFields(); + for(int i = 0; i < targetFields.length; i++) { + if(Modifier.isPublic(targetFields[i].getModifiers())) { + targetFields[i].set(target, sourceFields[i].get(source)); + } + } + } catch (IllegalAccessException e) { + //e.printStackTrace(); + } + } + + public static Collection cloneAll(Collection components) { + Collection clones = new ArrayList<>(); + for(Component component: components) { + clones.add(get(component)); + } + + return clones; + } +} diff --git a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java new file mode 100644 index 00000000..529b5239 --- /dev/null +++ b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java @@ -0,0 +1,306 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.utils.runtime; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.utils.ImmutableArray; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.components.*; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.LayerItemVO; +import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.stage.Sandbox; + +import java.util.*; +import java.util.function.Consumer; + +/** + * Created by azakhary on 6/9/2015. + */ +public class EntityUtils { + + public static String getItemName(Entity entity) { + ParentNodeComponent parentNodeComponent = ComponentRetriever.get(entity, ParentNodeComponent.class); + if (parentNodeComponent == null) + return Sandbox.getInstance().sceneControl.getCurrentSceneVO().sceneName; + + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + if (mainItemComponent.itemIdentifier != null && !mainItemComponent.itemIdentifier.isEmpty()) { + return mainItemComponent.itemIdentifier; + } else { + int type = EntityUtils.getType(entity); + switch (type) { + case EntityFactory.IMAGE_TYPE: + return "Image"; + case EntityFactory.NINE_PATCH: + return "9Patch Image"; + case EntityFactory.LABEL_TYPE: + return "Label"; + case EntityFactory.COMPOSITE_TYPE: + return "Composite Item"; + case EntityFactory.PARTICLE_TYPE: + return "Particle Effect"; + case EntityFactory.LIGHT_TYPE: + return "Light"; + case EntityFactory.SPINE_TYPE: + return "Spine"; + case EntityFactory.SPRITE_TYPE: + return "Sprite Animation"; + case EntityFactory.SPRITER_TYPE: + return "Spriter Animation"; + case EntityFactory.COLOR_PRIMITIVE: + return "Primitive"; + default: + return "unknown"; + } + } + } + + public static Integer getEntityId(Entity entity) { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + return mainItemComponent.uniqueId; + } + + public static Array getEntityId(Iterable entities) { + Array entityIds = new Array<>(); + for(Entity entity: entities) { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + entityIds.add(mainItemComponent.uniqueId); + } + + return entityIds; + } + + public static Entity getByUniqueId(Integer id) { + return Sandbox.getInstance().getSceneControl().sceneLoader.entityFactory.getEntityByUniqueId(id); + } + public static HashSet getByUniqueId(Array ids) { + HashSet entities = new HashSet<>(); + for(Integer id: ids) { + Entity entity = Sandbox.getInstance().getSceneControl().sceneLoader.entityFactory.getEntityByUniqueId(id); + entities.add(entity); + } + return entities; + } + + public static HashMap> cloneEntities(Set entities) { + HashMap> data = new HashMap<>(); + + for(Entity entity: entities) { + Collection components = cloneEntityComponents(entity); + data.put(EntityUtils.getEntityId(entity), components); + } + + return data; + } + + public static Entity cloneEntity(Entity entity) { + Entity newEntity = new Entity(); + Collection components = cloneEntityComponents(entity); + for(Component component: components) { + newEntity.add(ComponentCloner.get(component)); + } + + return newEntity; + } + + public static Collection cloneEntityComponents(Entity entity) { + Collection components = ComponentCloner.cloneAll(ComponentRetriever.getComponents(entity)); + return components; + } + + public static Vector2 getPosition(Entity entity) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + return new Vector2(transformComponent.x, transformComponent.y); + } + + public static void getPosition(Entity entity, Vector2 position) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + position.set(transformComponent.x, transformComponent.y); + } + + public static TransformComponent setPosition(Entity entity, Vector2 position) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.x = position.x; + transformComponent.y = position.y; + return transformComponent; + } + + public static Vector2 getSize(Entity entity) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + return new Vector2(dimensionsComponent.width, dimensionsComponent.height); + } + + public static void getSize(Entity entity, Vector2 size) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + size.set(dimensionsComponent.width, dimensionsComponent.height); + } + + public static DimensionsComponent setSize(Entity entity, Vector2 size) { + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + dimensionsComponent.width = size.x; + dimensionsComponent.height = size.y; + if (dimensionsComponent.boundBox != null) { + dimensionsComponent.boundBox.width = size.x; + dimensionsComponent.boundBox.height = size.y; + } + return dimensionsComponent; + } + + public static Vector2 getRightTopPoint(Set entities) { + if(entities.size() == 0) return null; + + Vector2 rightTopPoint = getPosition(entities.stream().findFirst().get()); + + for(Entity entity: entities) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class); + + if(rightTopPoint.x < transformComponent.x+dimensionsComponent.width) { + rightTopPoint.x = transformComponent.x+dimensionsComponent.width; + } + if(rightTopPoint.y < transformComponent.y+dimensionsComponent.height) { + rightTopPoint.y = transformComponent.y+dimensionsComponent.height; + } + } + + return rightTopPoint; + } + + public static Vector2 getLeftBottomPoint(Set entities) { + if(entities.size() == 0) return null; + + Vector2 leftBottomPoint = getPosition(entities.stream().findFirst().get()); + + for(Entity entity: entities) { + TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + if(leftBottomPoint.x > transformComponent.x) { + leftBottomPoint.x = transformComponent.x; + } + if(leftBottomPoint.y > transformComponent.y) { + leftBottomPoint.y = transformComponent.y; + } + } + + return leftBottomPoint; + } + + public static void changeParent(HashSet entities, Entity parent) { + for(Entity entity: entities) { + ParentNodeComponent parentNodeComponent = ComponentRetriever.get(entity, ParentNodeComponent.class); + + //remove me from previous parent children list + NodeComponent nodeComponent = ComponentRetriever.get(parentNodeComponent.parentEntity, NodeComponent.class); + nodeComponent.children.removeValue(entity, true); + + //add me to new parent child list + NodeComponent rootNodeComponent = ComponentRetriever.get(parent, NodeComponent.class); + rootNodeComponent.children.add(entity); + + //change my parent + parentNodeComponent.parentEntity = parent; + } + } + + public static HashSet getChildren(Entity entity) { + HashSet entities; + NodeComponent nodeComponent = ComponentRetriever.get(entity, NodeComponent.class); + Entity[] children = nodeComponent.children.toArray(); + entities = new HashSet<>(Arrays.asList(children)); + + return entities; + } + + public static int getType(Entity entity) { + MainItemComponent mainItemComponent = ComponentRetriever.get(entity, MainItemComponent.class); + return mainItemComponent.entityType; + } + + public static Array getByLibraryLink(String link) { + Array result = new Array<>(); + ImmutableArray composites = Sandbox.getInstance().getEngine().getEntitiesFor(Family.all(NodeComponent.class).get()); + for(Entity composite: composites) { + MainItemComponent mainItemComponent = ComponentRetriever.get(composite, MainItemComponent.class); + if(mainItemComponent.libraryLink.equals(link)) { + result.add(composite); + } + } + + return result; + } + + public static void reInstantiateChildren(Entity entity) { + NodeComponent nodeComponent = ComponentRetriever.get(entity, NodeComponent.class); + if (nodeComponent != null) { + CompositeVO compositeVo = new CompositeVO(); + compositeVo.loadFromEntity(entity); + + entity.remove(NodeComponent.class); + entity.add(new NodeComponent()); + + SceneLoader sceneLoader = Sandbox.getInstance().getSceneControl().sceneLoader; + sceneLoader.entityFactory.initAllChildren(Sandbox.getInstance().getEngine(), entity, compositeVo); + } + } + + public static LayerItemVO getEntityLayer(Entity entity) { + ZIndexComponent zIndexComponent = ComponentRetriever.get(entity, ZIndexComponent.class); + LayerMapComponent layerMapComponent = ComponentRetriever.get(entity.getComponent(ParentNodeComponent.class).parentEntity, LayerMapComponent.class); + + return layerMapComponent.getLayer(zIndexComponent.layerName); + } + + /** + * iterate over children recursively and do some operations + * + * @param root + * @param action + */ + public static void applyActionRecursivelyOnEntities(Entity root, Consumer action) { + action.accept(root); + NodeComponent nodeComponent = ComponentRetriever.get(root, NodeComponent.class); + if (nodeComponent != null && nodeComponent.children != null) { + for (Entity targetEntity : nodeComponent.children) { + applyActionRecursivelyOnEntities(targetEntity, action); + } + } + } + + public static void applyActionRecursivelyOnLibraryItems(CompositeItemVO rootCompositeItemVo, Consumer action) { + action.accept(rootCompositeItemVo); + if (rootCompositeItemVo.composite != null && rootCompositeItemVo.composite.sComposites.size() != 0) { + for (CompositeItemVO currentCompositeItemVo : rootCompositeItemVo.composite.sComposites) { + applyActionRecursivelyOnLibraryItems(currentCompositeItemVo, action); + } + } + } + + public static void removeEntities(ArrayList entityList) { + for (Entity entity : entityList) { + Sandbox.getInstance().getEngine().removeEntity(entity); + } + } + +} diff --git a/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java b/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java new file mode 100644 index 00000000..7dc5e6df --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java @@ -0,0 +1,235 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.view; + +import java.io.File; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Vector2; +import games.rednblack.editor.view.menu.FileMenu; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.editor.view.ui.widget.actors.basic.SandboxBackUI; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.view.stage.UIStage; +import games.rednblack.editor.view.stage.input.SandboxInputAdapter; +import games.rednblack.editor.renderer.data.SceneVO; + +public class HyperLap2DScreen implements Screen, InputProcessor { + private static final String TAG = HyperLap2DScreen.class.getCanonicalName(); + //public SandboxStage sandboxStage; + + public UIStage uiStage; + + private Engine engine; + + private InputMultiplexer multiplexer; + private HyperLap2DFacade facade; + private ProjectManager projectManager; + private boolean paused = false; + + private Sandbox sandbox; + private SandboxBackUI sandboxBackUI; + + private Batch batch; + private Color bgColor; + private Texture bgLogo; + private Vector2 screenSize; + + + private boolean isDrawingBgLogo; + + public HyperLap2DScreen() { + facade = HyperLap2DFacade.getInstance(); + bgColor = new Color(0.15f, 0.15f, 0.15f, 1.0f); + isDrawingBgLogo = true; + batch = new SpriteBatch(); + bgLogo = new Texture(Gdx.files.internal("style/bglogo.png")); + screenSize = new Vector2(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } + + @Override + public void render(float deltaTime) { + Gdx.gl.glClearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + if(isDrawingBgLogo) { + batch.begin(); + batch.setColor(1, 1, 1, 0.3f); + batch.draw(bgLogo, screenSize.x/2 - bgLogo.getWidth()/2f, screenSize.y/2 - bgLogo.getHeight()/2f); + batch.end(); + } else { + if (sandboxBackUI != null) sandboxBackUI.render(deltaTime); + engine.update(deltaTime); + } + + uiStage.getViewport().apply(); + uiStage.act(deltaTime); + uiStage.draw(); + } + + public void disableDrawingBgLogo() { + if(!isDrawingBgLogo) return; + + this.isDrawingBgLogo = false; + bgLogo.dispose(); + batch.dispose(); + batch = null; + bgLogo = null; + } + + public void setBgColor(Color color) { + bgColor = color; + } + + @Override + public void pause() { + paused = true; + } + + @Override + public void resume() { + paused = false; + } + + @Override + public void dispose() { + + } + + @Override + public void show() { + sandbox = Sandbox.getInstance(); + uiStage = sandbox.getUIStage(); + + projectManager = facade.retrieveProxy(ProjectManager.NAME); + + multiplexer = new InputMultiplexer(); + multiplexer.addProcessor(this); + multiplexer.addProcessor(uiStage); + multiplexer.addProcessor(new SandboxInputAdapter()); + Gdx.input.setInputProcessor(multiplexer); + } + + @Override + public void hide() { + + } + + @Override + public void resize(int width, int height) { + // See https://github.com/libgdx/libgdx/issues/3673#issuecomment-177606278 + if (width == 0 && height == 0) return; + + uiStage.resize(width, height); + + if(Sandbox.getInstance().getViewport() != null) { + Sandbox.getInstance().getViewport().update(width, height, true); + } + } + + @Override + public boolean keyDown(int keycode) { + if (Gdx.input.isKeyPressed(Input.Keys.SYM) || Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT) || Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT)) { + switch (keycode) { + case Input.Keys.N: + facade.sendNotification(FileMenu.NEW_PROJECT, null, FileMenu.FILE_MENU); + break; + case Input.Keys.O: + facade.sendNotification(FileMenu.OPEN_PROJECT, null, FileMenu.FILE_MENU); + break; + case Input.Keys.I: + if (sandbox.sceneControl.getCurrentSceneVO() != null) { + facade.sendNotification(FileMenu.IMPORT_TO_LIBRARY, null, FileMenu.FILE_MENU); + } + break; + case Input.Keys.S: + if (sandbox.sceneControl.getCurrentSceneVO() != null) { + SceneVO vo = sandbox.sceneVoFromItems(); + projectManager.saveCurrentProject(vo); + } + break; + case Input.Keys.E: + if (sandbox.sceneControl.getCurrentSceneVO() != null) { + facade.sendNotification(MsgAPI.ACTION_EXPORT_PROJECT); + } + break; + } + } + + if (Gdx.input.isKeyPressed(Input.Keys.SYM) && keycode == Input.Keys.Q) { + facade.sendNotification(MsgAPI.APP_EXIT); + } + return false; + } + + @Override + public boolean keyUp(int keycode) { + return false; + } + + @Override + public boolean keyTyped(char character) { + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + return false; + } + + @Override + public boolean scrolled(int amount) { + return false; + } + + public void setEngine(Engine engine) { + this.engine = engine; + } + + public void setBackUI(SandboxBackUI sandboxBackUI) { + this.sandboxBackUI = sandboxBackUI; + } +} diff --git a/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java b/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java new file mode 100644 index 00000000..d5c94805 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java @@ -0,0 +1,94 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.view; + +import com.badlogic.ashley.core.Engine; +import games.rednblack.h2d.common.MsgAPI; +import com.puremvc.patterns.mediator.SimpleMediator; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.renderer.systems.render.HyperLap2dRenderer; +import games.rednblack.editor.view.stage.SandboxMediator; +import games.rednblack.editor.view.ui.widget.actors.basic.SandboxBackUI; + +/** + * Created by sargis on 3/30/15. + */ +public class HyperLap2DScreenMediator extends SimpleMediator { + private static final String TAG = HyperLap2DScreenMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + public HyperLap2DScreenMediator() { + super(NAME, null); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + MsgAPI.CREATE, + MsgAPI.PAUSE, + MsgAPI.RESUME, + MsgAPI.RENDER, + MsgAPI.RESIZE, + MsgAPI.DISPOSE, + MsgAPI.SCENE_LOADED + }; + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + switch (notification.getName()) { + case MsgAPI.CREATE: + setViewComponent(new HyperLap2DScreen()); + //TODO this must be changed to Command + facade = HyperLap2DFacade.getInstance(); + SandboxMediator sandboxMediator = facade.retrieveMediator(SandboxMediator.NAME); + + Engine engine = sandboxMediator.getViewComponent().getEngine(); + + getViewComponent().setEngine(engine); + viewComponent.show(); + break; + case MsgAPI.SCENE_LOADED: + facade = HyperLap2DFacade.getInstance(); + sandboxMediator = facade.retrieveMediator(SandboxMediator.NAME); + engine = sandboxMediator.getViewComponent().getEngine(); + SandboxBackUI sandboxBackUI = new SandboxBackUI(engine.getSystem(HyperLap2dRenderer.class).batch); + getViewComponent().setBackUI(sandboxBackUI); + getViewComponent().disableDrawingBgLogo(); + break; + case MsgAPI.PAUSE: + viewComponent.pause(); + break; + case MsgAPI.RESUME: + viewComponent.resume(); + break; + case MsgAPI.RENDER: + viewComponent.render(notification.getBody()); + break; + case MsgAPI.RESIZE: + int[] data = notification.getBody(); + viewComponent.resize(data[0], data[1]); + break; + case MsgAPI.DISPOSE: + break; + } + } +} diff --git a/src/main/java/games/rednblack/editor/view/ItemControlMediator.java b/src/main/java/games/rednblack/editor/view/ItemControlMediator.java new file mode 100644 index 00000000..720751d5 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ItemControlMediator.java @@ -0,0 +1,69 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.view; + +import java.util.Set; + +import com.badlogic.ashley.core.Entity; +import games.rednblack.editor.renderer.components.TransformComponent; +import games.rednblack.editor.renderer.components.ZIndexComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; + +/** + * Created by CyberJoe on 3/18/2015. + */ +public class ItemControlMediator { + + private SceneControlMediator sceneControl; + + private TransformComponent transformComponent; + private ZIndexComponent zIndexComponent; + + public ItemControlMediator(SceneControlMediator sceneControl) { + this.sceneControl = sceneControl; + } + + + public void itemZIndexChange( Set currentSelection, boolean isUp) { + for (Entity item : currentSelection) { + zIndexComponent = ComponentRetriever.get(item, ZIndexComponent.class); + + int ammount = 1; + if (!isUp) ammount = -1; + + int setting = zIndexComponent.getZIndex() + ammount; + if (setting < 0) setting = 0; + zIndexComponent.setZIndex(setting); + } + } + + public void moveItemBy(Entity entity, float x, float y) { + transformComponent = ComponentRetriever.get(entity, TransformComponent.class); + transformComponent.x+=x; + transformComponent.y+=y; + } + + public void removeItem(Entity entity) { + //TODO and uncomment +// actor.remove(); +// sceneControl.getCurrentScene().removeItem(item); +// item.dispose(); + } + +} diff --git a/src/main/java/games/rednblack/editor/view/SceneControlMediator.java b/src/main/java/games/rednblack/editor/view/SceneControlMediator.java new file mode 100644 index 00000000..46144535 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/SceneControlMediator.java @@ -0,0 +1,119 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.view; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.gdx.utils.viewport.ScreenViewport; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.proxy.ResolutionManager; +import games.rednblack.editor.proxy.ResourceManager; +import games.rednblack.editor.renderer.SceneLoader; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.data.SceneVO; + +/** + * Mediates scene communication between editor and current runtime + * + * @author azakhary + */ +public class SceneControlMediator { + + private final HyperLap2DFacade facade; + private final ProjectManager projectManager; + /** + * main holder of the scene + */ + public SceneLoader sceneLoader; + + /** + * runtime essentials + */ + // private Essentials essentials; + + /** + * current scene tools + */ + private SceneVO currentSceneVo; + + /** + * tools object of the root element of the scene + */ + private CompositeItemVO rootSceneVO; + + /** + * current scene rendering item + */ + private Entity currentScene; + + public SceneControlMediator(SceneLoader sceneLoader) { + this.sceneLoader = sceneLoader; + // this.essentials = essentials; + facade = HyperLap2DFacade.getInstance(); + projectManager = facade.retrieveProxy(ProjectManager.NAME); + } + + public ProjectInfoVO getProjectInfoVO() { + return sceneLoader.getRm().getProjectVO(); + } + + public void initScene(String sceneName) { + ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); + ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); + + ScreenViewport viewport = new ScreenViewport(); + // Yey to whoever made this method + viewport.setUnitsPerPixel(1f/resourceManager.getProjectVO().pixelToWorld); + + currentSceneVo = sceneLoader.loadScene(sceneName, viewport); + // TODO: this is now in sceneLoaader but probably will be changed + // essentials.world = new World(new + // Vector2(currentSceneVo.physicsPropertiesVO.gravityX, + // currentSceneVo.physicsPropertiesVO.gravityY), true); + // essentials.rayHandler.setWorld(essentials.world); + + rootSceneVO = new CompositeItemVO(currentSceneVo.composite); + } + + public void updateAmbientLights() { + sceneLoader.setAmbientInfo(sceneLoader.getSceneVO()); + } + + public CompositeItemVO getRootSceneVO() { + return rootSceneVO; + } + + public Entity getCurrentScene() { + return currentScene; + } + + public SceneVO getCurrentSceneVO() { + return currentSceneVo; + } + + public Entity getRootEntity() { + return sceneLoader.rootEntity; + } + +// public CompositeItem getCompositeElement(CompositeItemVO vo) { +// return sceneLoader.getCompositeElement(vo); +// } + +} diff --git a/src/main/java/games/rednblack/editor/view/frame/FileDropListener.java b/src/main/java/games/rednblack/editor/view/frame/FileDropListener.java new file mode 100644 index 00000000..0d259b25 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/frame/FileDropListener.java @@ -0,0 +1,76 @@ +/* + * ****************************************************************************** + * * Copyright 2015 See AUTHORS file. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * ***************************************************************************** + */ + +package games.rednblack.editor.view.frame; + +import games.rednblack.editor.HyperLap2DFacade; + +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; + +/** + * Created by azakhary on 7/21/2015. + */ + +//TODO remove after migrate to Drag listener in LWJGL3 +public class FileDropListener implements DropTargetListener { + + private static final String CLASS_NAME = "games.rednblack.editor.view.frame.FileDropListener"; + public static final String ACTION_DRAG_ENTER = CLASS_NAME + "ACTION_DRAG_ENTER"; + public static final String ACTION_DRAG_OVER = CLASS_NAME + "ACTION_DRAG_OVER"; + public static final String ACTION_DRAG_EXIT = CLASS_NAME + "ACTION_DRAG_EXIT"; + public static final String ACTION_DROP = CLASS_NAME + "ACTION_DROP"; + + public void sendNotification(String notification) { + sendNotification(notification, null); + } + + public void sendNotification(String notification, Object data) { + HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + if(facade != null) { + facade.sendNotification(notification, data); + } + } + + @Override + public void dragEnter(DropTargetDragEvent dtde) { + sendNotification(ACTION_DRAG_ENTER, dtde); + } + + @Override + public void dragOver(DropTargetDragEvent dtde) { + sendNotification(ACTION_DRAG_OVER, dtde); + } + + @Override + public void dropActionChanged(DropTargetDragEvent dtde) { + // Do we even need this? + } + + @Override + public void dragExit(DropTargetEvent dte) { + sendNotification(ACTION_DRAG_EXIT); + } + + @Override + public void drop(DropTargetDropEvent dtde) { + sendNotification(ACTION_DROP, dtde); + } +} diff --git a/src/main/java/games/rednblack/editor/view/menu/EditMenu.java b/src/main/java/games/rednblack/editor/view/menu/EditMenu.java new file mode 100644 index 00000000..5061f82f --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/menu/EditMenu.java @@ -0,0 +1,44 @@ +package games.rednblack.editor.view.menu; + +import com.badlogic.gdx.Input; +import com.kotcrab.vis.ui.widget.MenuItem; +import games.rednblack.editor.event.MenuItemListener; + +public class EditMenu extends H2DMenu { + + public static final String EDIT_MENU = HyperLap2DMenuBar.prefix + ".EDIT_MENU"; + public static final String CUT = HyperLap2DMenuBar.prefix + ".CUT"; + public static final String COPY = HyperLap2DMenuBar.prefix + ".COPY"; + public static final String PASTE = HyperLap2DMenuBar.prefix + ".PASTE"; + public static final String UNDO = HyperLap2DMenuBar.prefix + ".UNDO"; + public static final String REDO = HyperLap2DMenuBar.prefix + ".REDO"; + + private final MenuItem cut; + private final MenuItem copy; + private final MenuItem paste; + private final MenuItem undo; + private final MenuItem redo; + + public EditMenu() { + super("Edit"); + cut = new MenuItem("Cut", new MenuItemListener(CUT, null, EDIT_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.X); + copy = new MenuItem("Copy", new MenuItemListener(COPY, null, EDIT_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.C); + paste = new MenuItem("Paste", new MenuItemListener(PASTE, null, EDIT_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.V); + undo = new MenuItem("Undo", new MenuItemListener(UNDO, null, EDIT_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.Z); + redo = new MenuItem("Redo", new MenuItemListener(REDO, null, EDIT_MENU)).setShortcut(Input.Keys.CONTROL_LEFT,Input.Keys.SHIFT_LEFT, Input.Keys.S); + addItem(cut); + addItem(copy); + addItem(paste); + addItem(undo); + addItem(redo); + } + + public void setProjectOpen(boolean open) { + cut.setDisabled(!open); + copy.setDisabled(!open); + paste.setDisabled(!open); + undo.setDisabled(!open); + redo.setDisabled(!open); + } + +} diff --git a/src/main/java/games/rednblack/editor/view/menu/FileMenu.java b/src/main/java/games/rednblack/editor/view/menu/FileMenu.java new file mode 100644 index 00000000..48ee45cd --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/menu/FileMenu.java @@ -0,0 +1,153 @@ +package games.rednblack.editor.view.menu; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.widget.MenuItem; +import com.kotcrab.vis.ui.widget.PopupMenu; +import games.rednblack.editor.data.manager.PreferencesManager; +import games.rednblack.editor.event.MenuItemListener; +import games.rednblack.editor.renderer.data.SceneVO; + +import java.io.File; +import java.util.ArrayList; + +public class FileMenu extends H2DMenu { + + public static final String FILE_MENU = HyperLap2DMenuBar.prefix + ".FILE_MENU"; + public static final String NEW_PROJECT = HyperLap2DMenuBar.prefix + ".NEW_PROJECT"; + public static final String OPEN_PROJECT = HyperLap2DMenuBar.prefix + ".OPEN_PROJECT"; + public static final String SAVE_PROJECT = HyperLap2DMenuBar.prefix + ".SAVE_PROJECT"; + public static final String IMPORT_TO_LIBRARY = HyperLap2DMenuBar.prefix + ".IMPORT_TO_LIBRARY"; + public static final String RECENT_PROJECTS = HyperLap2DMenuBar.prefix + ".RECENT_PROJECTS"; + public static final String CLEAR_RECENTS = HyperLap2DMenuBar.prefix + ".CLEAR_RECENTS"; + public static final String EXPORT = HyperLap2DMenuBar.prefix + ".EXPORT"; + public static final String EXPORT_SETTINGS = HyperLap2DMenuBar.prefix + ".EXPORT_SETTINGS"; + public static final String EXIT = HyperLap2DMenuBar.prefix + ".EXIT"; + public static final String NEW_SCENE = HyperLap2DMenuBar.prefix + ".NEW_SCENE"; + public static final String SELECT_SCENE = HyperLap2DMenuBar.prefix + ".SELECT_SCENE"; + public static final String DELETE_CURRENT_SCENE = HyperLap2DMenuBar.prefix + ".DELETE_CURRENT_SCENE"; + + private final PopupMenu scenesPopupMenu; + private final Array sceneMenuItems; + private final MenuItem saveProject; + private final MenuItem scenesMenuItem; + private final MenuItem importToLibrary; + private final MenuItem export; + private final MenuItem exportSettings; + + private final PopupMenu recentProjectsPopupMenu; + private final Array recentProjectsMenuItems; + private final MenuItem recentProjectsMenuItem; + + public FileMenu() { + super("File"); + saveProject = new MenuItem("Save Project", new MenuItemListener(SAVE_PROJECT, null, FILE_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.S); + addItem(new MenuItem("New Project", new MenuItemListener(NEW_PROJECT, null, FILE_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.N)); + addItem(new MenuItem("Open Project", new MenuItemListener(OPEN_PROJECT, null, FILE_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.O)); + addItem(saveProject); + //saveProject.debug(); + // + scenesMenuItem = new MenuItem("Scenes"); + scenesPopupMenu = new PopupMenu(); + + scenesMenuItem.setSubMenu(scenesPopupMenu); + addItem(scenesMenuItem); + // + addSeparator(); + importToLibrary = new MenuItem("Import Resources", new MenuItemListener(IMPORT_TO_LIBRARY, null, FILE_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.I); + export = new MenuItem("Export", new MenuItemListener(EXPORT, null, FILE_MENU)).setShortcut(Input.Keys.CONTROL_LEFT, Input.Keys.E); + exportSettings = new MenuItem("Export Settings", new MenuItemListener(EXPORT_SETTINGS, null, FILE_MENU)); + addItem(importToLibrary); + addItem(export); + addItem(exportSettings); + // + addSeparator(); + recentProjectsMenuItem = new MenuItem("Recent Projects..."); + recentProjectsPopupMenu = new PopupMenu(); + recentProjectsMenuItem.setSubMenu(recentProjectsPopupMenu); + recentProjectsMenuItems = new Array<>(); + addItem(recentProjectsMenuItem); + + PreferencesManager prefs = PreferencesManager.getInstance(); + prefs.buildRecentHistory(); + reInitRecent(prefs.getRecentHistory()); + // + addSeparator(); + addItem(new MenuItem("Exit", new MenuItemListener(EXIT, null , FILE_MENU))); + sceneMenuItems = new Array<>(); + } + + public void addScenes(ArrayList scenes) { + for (SceneVO sceneVO : scenes) { + MenuItem menuItem = new MenuItem(sceneVO.sceneName, new MenuItemListener(SELECT_SCENE, sceneVO.sceneName, FILE_MENU)); + sceneMenuItems.add(menuItem); + scenesPopupMenu.addItem(menuItem); + } + } + + public void reInitScenes(ArrayList scenes) { + sceneMenuItems.clear(); + scenesPopupMenu.clear(); + scenesPopupMenu.addItem(new MenuItem("Create New Scene", new MenuItemListener(NEW_SCENE, null, FILE_MENU))); + scenesPopupMenu.addItem(new MenuItem("Delete Current Scene", new MenuItemListener(DELETE_CURRENT_SCENE, null, FILE_MENU))); + scenesPopupMenu.addSeparator(); + addScenes(scenes); + } + + public String getFolderNameAndPath(String path) { + File path1 = new File(path); + File path2 = new File(path1.getParent()); + return path2.getName() + " - [ " + path + "]"; + } + + public void addRecent(ArrayList paths) { + for (String path : paths) { + MenuItem menuItem = new MenuItem(getFolderNameAndPath(path) , new MenuItemListener(RECENT_PROJECTS, path, FILE_MENU)); + recentProjectsMenuItems.add(menuItem); + recentProjectsPopupMenu.addItem(menuItem); + } + } + + public void reInitRecent(ArrayList paths) { + if (recentProjectsMenuItems != null && recentProjectsMenuItems.size != 0) { + recentProjectsMenuItems.clear(); + } + + if (recentProjectsPopupMenu != null && recentProjectsPopupMenu.hasChildren()) { + recentProjectsPopupMenu.remove(); + recentProjectsPopupMenu.clearChildren(); + } + addRecent(paths); + if (paths.size() > 0) { + recentProjectsPopupMenu.addSeparator(); + } + + MenuItem menuItem = new MenuItem("Clear list", new MenuItemListener(CLEAR_RECENTS, null, FILE_MENU)); + recentProjectsMenuItems.add(menuItem); + recentProjectsPopupMenu.addItem(menuItem); + + remove(); + } + + public void setProjectOpen(boolean open) { + saveProject.setDisabled(!open); + scenesMenuItem.setDisabled(!open); + importToLibrary.setDisabled(!open); + export.setDisabled(!open); + exportSettings.setDisabled(!open); + } + +// private class RecentProjectListener extends ChangeListener { +// private final String path; +// +// public RecentProjectListener(String path) { +// this.path = path; +// } +// +// @Override +// public void changed(ChangeEvent event, Actor actor) { +// Gdx.app.log(TAG, "recentProject : " + path); +// mediator.recentProjectItemClicked(path); +// } +// } +} diff --git a/src/main/java/games/rednblack/editor/view/menu/H2DMenu.java b/src/main/java/games/rednblack/editor/view/menu/H2DMenu.java new file mode 100644 index 00000000..93f0774f --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/menu/H2DMenu.java @@ -0,0 +1,16 @@ +package games.rednblack.editor.view.menu; + +import com.badlogic.gdx.scenes.scene2d.ui.Cell; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import games.rednblack.editor.view.ui.widget.CustomMenu; + +public abstract class H2DMenu extends CustomMenu { + + public H2DMenu(String title) { + super(title); + Cell

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 literal 0 HcmV?d00001 diff --git a/assets/hyperlap_icon_16.png b/assets/hyperlap_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c0cf3c585a37c3100b450965b0960489c8ab58d2 GIT binary patch literal 2358 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 literal 0 HcmV?d00001 diff --git a/assets/plugins/plugin-9patch-0.0.1.jar b/assets/plugins/plugin-9patch-0.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..fcbc3c23341e0bfb2be2f2ee4b911ffb24e51781 GIT binary patch literal 21998 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 literal 0 HcmV?d00001 diff --git a/assets/plugins/plugin-performance-0.0.1.jar b/assets/plugins/plugin-performance-0.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..35aeb04bdc56fc79ffb8a2a37054c6d70b9aacdb GIT binary patch literal 4902 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 literal 0 HcmV?d00001 diff --git a/assets/plugins/plugin-tiled-0.0.1.jar b/assets/plugins/plugin-tiled-0.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..1a5f899dc888b537c1747136d928cf0dabc3b6cb GIT binary patch literal 50603 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 H@Z$dfpvw)? literal 0 HcmV?d00001 diff --git a/assets/splash/splash.atlas b/assets/splash/splash.atlas new file mode 100644 index 00000000..efc99f91 --- /dev/null +++ b/assets/splash/splash.atlas @@ -0,0 +1,34 @@ + +splash.png +size: 512,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +bg_color + rotate: false + xy: 471, 480 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +splash_bg + rotate: false + xy: 2, 122 + size: 467, 366 + orig: 467, 366 + offset: 0, 0 + index: -1 +splash_logo + rotate: false + xy: 2, 2 + size: 76, 72 + orig: 76, 72 + offset: 0, 0 + index: -1 +splash_logo_text + rotate: false + xy: 2, 76 + size: 191, 44 + orig: 191, 44 + offset: 0, 0 + index: -1 diff --git a/assets/splash/splash.png b/assets/splash/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1e5722a9794b517bf8b216fe18af7fab8125fe GIT binary patch literal 99168 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%0DRLLZ$77w`1ow1T`{( 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 YNmj&ko9uNVN`VC^$*Id$N?U~dABn@QtN;K2 literal 0 HcmV?d00001 diff --git a/assets/style/bglogo.png b/assets/style/bglogo.png new file mode 100644 index 0000000000000000000000000000000000000000..693627eafab81e3a51049deea8f1572c27682284 GIT binary patch literal 118055 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