From 933a5ef85afd8579ee1a9909ab31b681cb44d2f8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:49:54 +0000 Subject: [PATCH] Deploy to GitHub pages --- 404.html | 151 + Introduction/index.html | 463 + advanced_interactions/index.html | 4836 ++++ aep/index.html | 5978 ++++ animation/index.html | 728 + assets/index.html | 722 + breakdown/bezier/index.html | 524 + breakdown/bouncy_ball/index.html | 866 + breakdown/images/builder/adding_shapes.png | Bin 0 -> 96568 bytes breakdown/images/builder/adding_shapes.xml | 1 + breakdown/images/builder/animation.png | Bin 0 -> 68899 bytes breakdown/images/builder/animation.xml | 1 + .../images/builder/animation_out_point.png | Bin 0 -> 18771 bytes breakdown/images/builder/basic_properties.xml | 1 + breakdown/images/builder/final.xml | 1 + breakdown/images/builder/layer_out_point.png | Bin 0 -> 54518 bytes breakdown/images/builder/more_props.png | Bin 0 -> 60443 bytes breakdown/images/builder/setting_up.png | Bin 0 -> 35506 bytes breakdown/images/builder/setting_up.xml | 1 + breakdown/images/builder/shape_position.png | Bin 0 -> 39270 bytes breakdown/images/builder/star.png | Bin 0 -> 48392 bytes breakdown/images/builder/star.xml | 1 + breakdown/lottie_from_scratch/index.html | 512 + breakdown/precomps/index.html | 975 + concepts/index.html | 985 + constants/index.html | 1113 + css/base.css | 289 + css/base.min.css | 1 + css/bootstrap-custom.css | 5309 ++++ css/bootstrap-custom.min.css | 1 + css/cinder.css | 88 + css/cinder.min.css | 1 + css/highlight.css | 99 + css/highlight.min.css | 1 + effects/index.html | 3210 +++ examples/3d_layers.json | 194 + examples/3d_layers_animation.json | 273 + examples/3d_parenting.json | 909 + examples/auto_orient.json | 390 + examples/bezier.json | 135 + examples/bezier_expression.json | 682 + examples/blend_mode.json | 533 + examples/blep.png | Bin 0 -> 53877 bytes examples/bouncy_ball.json | 232 + examples/camera.json | 899 + examples/easing.json | 425 + examples/effects-blur.json | 101 + examples/effects-bulge.json | 173 + examples/effects-fill.json | 150 + examples/effects-matte3-image.json | 131 + examples/effects-matte3.json | 664 + examples/effects-prolevels.json | 361 + examples/effects-shadow.json | 119 + examples/effects-stroke.json | 169 + examples/effects-tint.json | 110 + examples/effects-tritone.json | 116 + examples/effects-wave.json | 181 + examples/ellipse.json | 142 + examples/fill.json | 194 + examples/font-css.json | 118 + examples/font-local.json | 116 + examples/font-url.json | 119 + examples/fractal.json | 1403 + examples/gradient.json | 1255 + examples/image.json | 74 + examples/image_animated.json | 94 + examples/layer_order.json | 309 + examples/layers-solid.json | 20 + examples/mask.json | 315 + examples/matte.json | 389 + examples/offset-path.json | 176 + examples/parenting.json | 575 + examples/precomp/circle.json | 204 + examples/precomp/star-circle.json | 632 + examples/precomp/star-comp.json | 310 + examples/precomp/star-nocomp.json | 291 + examples/precomp/star-splosion.json | 418 + examples/pucker_bloat.json | 180 + examples/rectangle.json | 145 + examples/remapping.json | 338 + examples/repeater.json | 227 + examples/rounded_corners.json | 188 + examples/sound.mp3 | Bin 0 -> 15120 bytes examples/star.json | 159 + examples/stroke.json | 156 + examples/text-document.json | 75 + examples/text-selector.json | 177 + examples/text.json | 118 + examples/text_shape.png | Bin 0 -> 88746 bytes examples/thumbs-up.png | Bin 0 -> 57422 bytes examples/transform.json | 273 + examples/trim_path.json | 211 + examples/zig-zag.json | 178 + expressions/index.html | 3481 +++ fonts/Karla-Bold.ttf | Bin 0 -> 38364 bytes fonts/Karla-Italic-VariableFont_wght.ttf | Bin 0 -> 76376 bytes fonts/Karla-VariableFont_wght.ttf | Bin 0 -> 78356 bytes "fonts/Type-\303\230-Tones-Arboria-Black.otf" | Bin 0 -> 63444 bytes "fonts/Type-\303\230-Tones-Arboria-Bold.otf" | Bin 0 -> 65620 bytes fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes fonts/fontawesome-webfont.svg | 414 + fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes img/LottieDocs.svg | 14 + img/chevron-left.svg | 3 + img/chevron-right.svg | 3 + img/favicon.ico | Bin 0 -> 959 bytes img/grid1.png | Bin 0 -> 251 bytes img/grid10.png | Bin 0 -> 495 bytes img/grid11.png | Bin 0 -> 253 bytes img/grid12.png | Bin 0 -> 260 bytes img/grid13.png | Bin 0 -> 266 bytes img/grid14.png | Bin 0 -> 240 bytes img/grid15.png | Bin 0 -> 442 bytes img/grid16.png | Bin 0 -> 442 bytes img/grid17.png | Bin 0 -> 442 bytes img/grid18.png | Bin 0 -> 457 bytes img/grid19.png | Bin 0 -> 427 bytes img/grid2.png | Bin 0 -> 271 bytes img/grid20.png | Bin 0 -> 493 bytes img/grid3.png | Bin 0 -> 266 bytes img/grid4.png | Bin 0 -> 244 bytes img/grid5.png | Bin 0 -> 442 bytes img/grid6.png | Bin 0 -> 460 bytes img/grid7.png | Bin 0 -> 442 bytes img/grid8.png | Bin 0 -> 457 bytes img/grid9.png | Bin 0 -> 456 bytes img/icon-right-arrow.svg | 3 + img/icon-search.svg | 3 + img/lf-logo-mini.svg | 11 + img/logo-lottie.svg | 11 + img/logo-react.svg | 4 + img/logo-svelte.svg | 4 + img/vue-logo.svg | 4 + index.html | 696 + js/base.js | 225 + js/bootstrap-3.0.3.min.js | 7 + js/highlight.pack.js | 2 + layers/index.html | 1699 ++ playground/builder/index.html | 595 + playground/explain/index.html | 15 + playground/json_editor/index.html | 1007 + rendering/index.html | 4872 ++++ .../animated-property.json | 51 + schema/animated-properties/color-value.json | 26 + .../animated-properties/gradient-colors.json | 20 + schema/animated-properties/keyframe-base.json | 52 + .../keyframe-bezier-handle.json | 53 + schema/animated-properties/keyframe.json | 61 + .../multi-dimensional.json | 36 + .../position-keyframe.json | 30 + schema/animated-properties/position.json | 63 + .../animated-properties/shape-keyframe.json | 23 + .../animated-properties/shape-property.json | 54 + schema/animated-properties/split-vector.json | 28 + schema/animated-properties/value.json | 26 + schema/animation/animation.json | 158 + schema/animation/composition.json | 26 + schema/animation/metadata.json | 46 + schema/animation/motion-blur.json | 27 + schema/animation/user-metadata.json | 17 + schema/assets/asset.json | 25 + schema/assets/data-source.json | 23 + schema/assets/file-asset.json | 37 + schema/assets/image.json | 40 + schema/assets/precomposition.json | 30 + schema/assets/sound.json | 11 + schema/constants/blend-mode.json | 81 + schema/constants/composite.json | 16 + schema/constants/fill-rule.json | 18 + schema/constants/font-path-origin.json | 24 + schema/constants/gradient-type.json | 18 + schema/constants/line-cap.json | 20 + schema/constants/line-join.json | 20 + schema/constants/mask-mode.json | 36 + schema/constants/matte-mode.json | 28 + schema/constants/merge-mode.json | 29 + schema/constants/shape-direction.json | 18 + schema/constants/star-type.json | 16 + schema/constants/stroke-dash-type.json | 20 + schema/constants/text-based.json | 24 + schema/constants/text-caps.json | 20 + schema/constants/text-grouping.json | 24 + schema/constants/text-justify.json | 36 + schema/constants/text-range-units.json | 17 + schema/constants/text-shape.json | 32 + schema/constants/trim-multiple-shapes.json | 16 + schema/docs_mapping.json | 139 + schema/effect-values/angle.json | 28 + schema/effect-values/checkbox.json | 28 + schema/effect-values/color.json | 28 + schema/effect-values/drop-down.json | 28 + schema/effect-values/effect-value.json | 34 + schema/effect-values/ignored.json | 29 + schema/effect-values/layer.json | 28 + schema/effect-values/no-value.json | 6 + schema/effect-values/point.json | 28 + schema/effect-values/slider.json | 28 + schema/effects/custom-effect.json | 24 + schema/effects/displacement-map-effect.json | 64 + schema/effects/drop-shadow-effect.json | 52 + schema/effects/effect.json | 54 + schema/effects/fill-effect.json | 60 + schema/effects/gaussian-blur-effect.json | 43 + schema/effects/matte3-effect.json | 58 + schema/effects/mesh-warp-effect.json | 47 + schema/effects/pro-levels-effect.json | 171 + schema/effects/puppet-effect.json | 47 + schema/effects/radial-wipe-effect.json | 52 + schema/effects/spherize-effect.json | 40 + schema/effects/stroke-effect.json | 75 + schema/effects/tint-effect.json | 46 + schema/effects/tritone-effect.json | 43 + schema/effects/twirl-effect.json | 44 + schema/effects/wavy-effect.json | 59 + schema/expressions.json | 630 + schema/expressions.schema.json | 86 + schema/helpers/bezier.json | 50 + schema/helpers/color.json | 13 + schema/helpers/int-boolean.json | 19 + schema/helpers/marker.json | 20 + schema/helpers/mask.json | 44 + schema/helpers/transform.json | 105 + schema/helpers/visual-object.json | 24 + schema/index.html | 6290 ++++ schema/layers/audio-layer.json | 35 + schema/layers/audio-settings.json | 22 + schema/layers/camera-layer.json | 37 + schema/layers/data-layer.json | 30 + schema/layers/image-layer.json | 32 + schema/layers/layer.json | 130 + schema/layers/null-layer.json | 25 + schema/layers/precomposition-layer.json | 46 + schema/layers/shape-layer.json | 30 + schema/layers/solid-color-layer.json | 40 + schema/layers/text-layer.json | 30 + schema/layers/visual-layer.json | 145 + schema/lottie.schema.json | 5875 ++++ schema/shapes/base-stroke.json | 52 + schema/shapes/ellipse.json | 33 + schema/shapes/fill.json | 38 + schema/shapes/gradient-fill.json | 36 + schema/shapes/gradient-stroke.json | 31 + schema/shapes/gradient.json | 47 + schema/shapes/group.json | 37 + schema/shapes/merge.json | 30 + schema/shapes/modifier.json | 11 + schema/shapes/no-style.json | 25 + schema/shapes/offset-path.json | 38 + schema/shapes/path.json | 30 + schema/shapes/polystar.json | 76 + schema/shapes/pucker-bloat.json | 30 + schema/shapes/rectangle.json | 39 + schema/shapes/repeater-transform.json | 27 + schema/shapes/repeater.json | 45 + schema/shapes/rounded-corners.json | 28 + schema/shapes/shape-element.json | 123 + schema/shapes/shape-list.json | 28 + schema/shapes/shape.json | 21 + schema/shapes/stroke-dash.json | 27 + schema/shapes/stroke.json | 33 + schema/shapes/transform.json | 27 + schema/shapes/trim.json | 44 + schema/shapes/twist.json | 32 + schema/shapes/zig-zag.json | 40 + schema/styles/bevel-emboss-style.json | 82 + schema/styles/color-overlay-style.json | 35 + schema/styles/drop-shadow-style.json | 62 + schema/styles/gradient-overlay-style.json | 64 + schema/styles/inner-glow-style.json | 58 + schema/styles/inner-shadow-style.json | 57 + schema/styles/layer-style.json | 23 + schema/styles/outer-glow-style.json | 51 + schema/styles/satin-style.json | 51 + schema/styles/stroke-style.json | 32 + schema/text/animated-text-document.json | 25 + schema/text/character-data.json | 41 + schema/text/character-precomp.json | 41 + schema/text/character-shapes.json | 14 + schema/text/font-list.json | 21 + schema/text/font.json | 55 + schema/text/text-alignment-options.json | 26 + schema/text/text-data.json | 34 + schema/text/text-document-keyframe.json | 18 + schema/text/text-document.json | 91 + schema/text/text-follow-path.json | 40 + schema/text/text-range-selector.json | 58 + schema/text/text-range.json | 21 + schema/text/text-style.json | 74 + scripts/blockly_generated.js | 10398 +++++++ scripts/editor.bundle.js | 23827 ++++++++++++++++ scripts/explain_worker.js | 50 + scripts/json_editor.js | 1419 + scripts/lottie_bezier.js | 686 + scripts/lottie_blockly.js | 2071 ++ scripts/lottie_explain.js | 1576 + scripts/lottie_matrix.js | 163 + scripts/lottie_raw_utils.js | 259 + scripts/playground_data.js | 18 + scripts/simple_shader.js | 443 + scripts/value_editors.js | 768 + search/lunr.js | 3475 +++ search/main.js | 109 + search/search_index.json | 1 + search/worker.js | 133 + shapes/index.html | 2067 ++ sitemap.xml | 108 + sitemap.xml.gz | Bin 0 -> 386 bytes style/editor.css | 133 + style/lottie-theme.css | 490 + style/style.css | 255 + text/index.html | 1778 ++ 312 files changed, 125403 insertions(+) create mode 100644 404.html create mode 100644 Introduction/index.html create mode 100644 advanced_interactions/index.html create mode 100644 aep/index.html create mode 100644 animation/index.html create mode 100644 assets/index.html create mode 100644 breakdown/bezier/index.html create mode 100644 breakdown/bouncy_ball/index.html create mode 100644 breakdown/images/builder/adding_shapes.png create mode 100644 breakdown/images/builder/adding_shapes.xml create mode 100644 breakdown/images/builder/animation.png create mode 100644 breakdown/images/builder/animation.xml create mode 100644 breakdown/images/builder/animation_out_point.png create mode 100644 breakdown/images/builder/basic_properties.xml create mode 100644 breakdown/images/builder/final.xml create mode 100644 breakdown/images/builder/layer_out_point.png create mode 100644 breakdown/images/builder/more_props.png create mode 100644 breakdown/images/builder/setting_up.png create mode 100644 breakdown/images/builder/setting_up.xml create mode 100644 breakdown/images/builder/shape_position.png create mode 100644 breakdown/images/builder/star.png create mode 100644 breakdown/images/builder/star.xml create mode 100644 breakdown/lottie_from_scratch/index.html create mode 100644 breakdown/precomps/index.html create mode 100644 concepts/index.html create mode 100644 constants/index.html create mode 100644 css/base.css create mode 100644 css/base.min.css create mode 100644 css/bootstrap-custom.css create mode 100644 css/bootstrap-custom.min.css create mode 100644 css/cinder.css create mode 100644 css/cinder.min.css create mode 100644 css/highlight.css create mode 100644 css/highlight.min.css create mode 100644 effects/index.html create mode 100644 examples/3d_layers.json create mode 100644 examples/3d_layers_animation.json create mode 100644 examples/3d_parenting.json create mode 100644 examples/auto_orient.json create mode 100644 examples/bezier.json create mode 100644 examples/bezier_expression.json create mode 100644 examples/blend_mode.json create mode 100644 examples/blep.png create mode 100644 examples/bouncy_ball.json create mode 100644 examples/camera.json create mode 100644 examples/easing.json create mode 100644 examples/effects-blur.json create mode 100644 examples/effects-bulge.json create mode 100644 examples/effects-fill.json create mode 100644 examples/effects-matte3-image.json create mode 100644 examples/effects-matte3.json create mode 100644 examples/effects-prolevels.json create mode 100644 examples/effects-shadow.json create mode 100644 examples/effects-stroke.json create mode 100644 examples/effects-tint.json create mode 100644 examples/effects-tritone.json create mode 100644 examples/effects-wave.json create mode 100644 examples/ellipse.json create mode 100644 examples/fill.json create mode 100644 examples/font-css.json create mode 100644 examples/font-local.json create mode 100644 examples/font-url.json create mode 100644 examples/fractal.json create mode 100644 examples/gradient.json create mode 100644 examples/image.json create mode 100644 examples/image_animated.json create mode 100644 examples/layer_order.json create mode 100644 examples/layers-solid.json create mode 100644 examples/mask.json create mode 100644 examples/matte.json create mode 100644 examples/offset-path.json create mode 100644 examples/parenting.json create mode 100644 examples/precomp/circle.json create mode 100644 examples/precomp/star-circle.json create mode 100644 examples/precomp/star-comp.json create mode 100644 examples/precomp/star-nocomp.json create mode 100644 examples/precomp/star-splosion.json create mode 100644 examples/pucker_bloat.json create mode 100644 examples/rectangle.json create mode 100644 examples/remapping.json create mode 100644 examples/repeater.json create mode 100644 examples/rounded_corners.json create mode 100644 examples/sound.mp3 create mode 100644 examples/star.json create mode 100644 examples/stroke.json create mode 100644 examples/text-document.json create mode 100644 examples/text-selector.json create mode 100644 examples/text.json create mode 100644 examples/text_shape.png create mode 100644 examples/thumbs-up.png create mode 100644 examples/transform.json create mode 100644 examples/trim_path.json create mode 100644 examples/zig-zag.json create mode 100644 expressions/index.html create mode 100644 fonts/Karla-Bold.ttf create mode 100644 fonts/Karla-Italic-VariableFont_wght.ttf create mode 100644 fonts/Karla-VariableFont_wght.ttf create mode 100644 "fonts/Type-\303\230-Tones-Arboria-Black.otf" create mode 100644 "fonts/Type-\303\230-Tones-Arboria-Bold.otf" create mode 100644 fonts/fontawesome-webfont.eot create mode 100644 fonts/fontawesome-webfont.svg create mode 100644 fonts/fontawesome-webfont.ttf create mode 100644 fonts/fontawesome-webfont.woff create mode 100644 img/LottieDocs.svg create mode 100644 img/chevron-left.svg create mode 100644 img/chevron-right.svg create mode 100644 img/favicon.ico create mode 100644 img/grid1.png create mode 100644 img/grid10.png create mode 100644 img/grid11.png create mode 100644 img/grid12.png create mode 100644 img/grid13.png create mode 100644 img/grid14.png create mode 100644 img/grid15.png create mode 100644 img/grid16.png create mode 100644 img/grid17.png create mode 100644 img/grid18.png create mode 100644 img/grid19.png create mode 100644 img/grid2.png create mode 100644 img/grid20.png create mode 100644 img/grid3.png create mode 100644 img/grid4.png create mode 100644 img/grid5.png create mode 100644 img/grid6.png create mode 100644 img/grid7.png create mode 100644 img/grid8.png create mode 100644 img/grid9.png create mode 100644 img/icon-right-arrow.svg create mode 100644 img/icon-search.svg create mode 100644 img/lf-logo-mini.svg create mode 100644 img/logo-lottie.svg create mode 100644 img/logo-react.svg create mode 100644 img/logo-svelte.svg create mode 100644 img/vue-logo.svg create mode 100644 index.html create mode 100644 js/base.js create mode 100644 js/bootstrap-3.0.3.min.js create mode 100644 js/highlight.pack.js create mode 100644 layers/index.html create mode 100644 playground/builder/index.html create mode 100644 playground/explain/index.html create mode 100644 playground/json_editor/index.html create mode 100644 rendering/index.html create mode 100644 schema/animated-properties/animated-property.json create mode 100644 schema/animated-properties/color-value.json create mode 100644 schema/animated-properties/gradient-colors.json create mode 100644 schema/animated-properties/keyframe-base.json create mode 100644 schema/animated-properties/keyframe-bezier-handle.json create mode 100644 schema/animated-properties/keyframe.json create mode 100644 schema/animated-properties/multi-dimensional.json create mode 100644 schema/animated-properties/position-keyframe.json create mode 100644 schema/animated-properties/position.json create mode 100644 schema/animated-properties/shape-keyframe.json create mode 100644 schema/animated-properties/shape-property.json create mode 100644 schema/animated-properties/split-vector.json create mode 100644 schema/animated-properties/value.json create mode 100644 schema/animation/animation.json create mode 100644 schema/animation/composition.json create mode 100644 schema/animation/metadata.json create mode 100644 schema/animation/motion-blur.json create mode 100644 schema/animation/user-metadata.json create mode 100644 schema/assets/asset.json create mode 100644 schema/assets/data-source.json create mode 100644 schema/assets/file-asset.json create mode 100644 schema/assets/image.json create mode 100644 schema/assets/precomposition.json create mode 100644 schema/assets/sound.json create mode 100644 schema/constants/blend-mode.json create mode 100644 schema/constants/composite.json create mode 100644 schema/constants/fill-rule.json create mode 100644 schema/constants/font-path-origin.json create mode 100644 schema/constants/gradient-type.json create mode 100644 schema/constants/line-cap.json create mode 100644 schema/constants/line-join.json create mode 100644 schema/constants/mask-mode.json create mode 100644 schema/constants/matte-mode.json create mode 100644 schema/constants/merge-mode.json create mode 100644 schema/constants/shape-direction.json create mode 100644 schema/constants/star-type.json create mode 100644 schema/constants/stroke-dash-type.json create mode 100644 schema/constants/text-based.json create mode 100644 schema/constants/text-caps.json create mode 100644 schema/constants/text-grouping.json create mode 100644 schema/constants/text-justify.json create mode 100644 schema/constants/text-range-units.json create mode 100644 schema/constants/text-shape.json create mode 100644 schema/constants/trim-multiple-shapes.json create mode 100644 schema/docs_mapping.json create mode 100644 schema/effect-values/angle.json create mode 100644 schema/effect-values/checkbox.json create mode 100644 schema/effect-values/color.json create mode 100644 schema/effect-values/drop-down.json create mode 100644 schema/effect-values/effect-value.json create mode 100644 schema/effect-values/ignored.json create mode 100644 schema/effect-values/layer.json create mode 100644 schema/effect-values/no-value.json create mode 100644 schema/effect-values/point.json create mode 100644 schema/effect-values/slider.json create mode 100644 schema/effects/custom-effect.json create mode 100644 schema/effects/displacement-map-effect.json create mode 100644 schema/effects/drop-shadow-effect.json create mode 100644 schema/effects/effect.json create mode 100644 schema/effects/fill-effect.json create mode 100644 schema/effects/gaussian-blur-effect.json create mode 100644 schema/effects/matte3-effect.json create mode 100644 schema/effects/mesh-warp-effect.json create mode 100644 schema/effects/pro-levels-effect.json create mode 100644 schema/effects/puppet-effect.json create mode 100644 schema/effects/radial-wipe-effect.json create mode 100644 schema/effects/spherize-effect.json create mode 100644 schema/effects/stroke-effect.json create mode 100644 schema/effects/tint-effect.json create mode 100644 schema/effects/tritone-effect.json create mode 100644 schema/effects/twirl-effect.json create mode 100644 schema/effects/wavy-effect.json create mode 100644 schema/expressions.json create mode 100644 schema/expressions.schema.json create mode 100644 schema/helpers/bezier.json create mode 100644 schema/helpers/color.json create mode 100644 schema/helpers/int-boolean.json create mode 100644 schema/helpers/marker.json create mode 100644 schema/helpers/mask.json create mode 100644 schema/helpers/transform.json create mode 100644 schema/helpers/visual-object.json create mode 100644 schema/index.html create mode 100644 schema/layers/audio-layer.json create mode 100644 schema/layers/audio-settings.json create mode 100644 schema/layers/camera-layer.json create mode 100644 schema/layers/data-layer.json create mode 100644 schema/layers/image-layer.json create mode 100644 schema/layers/layer.json create mode 100644 schema/layers/null-layer.json create mode 100644 schema/layers/precomposition-layer.json create mode 100644 schema/layers/shape-layer.json create mode 100644 schema/layers/solid-color-layer.json create mode 100644 schema/layers/text-layer.json create mode 100644 schema/layers/visual-layer.json create mode 100644 schema/lottie.schema.json create mode 100644 schema/shapes/base-stroke.json create mode 100644 schema/shapes/ellipse.json create mode 100644 schema/shapes/fill.json create mode 100644 schema/shapes/gradient-fill.json create mode 100644 schema/shapes/gradient-stroke.json create mode 100644 schema/shapes/gradient.json create mode 100644 schema/shapes/group.json create mode 100644 schema/shapes/merge.json create mode 100644 schema/shapes/modifier.json create mode 100644 schema/shapes/no-style.json create mode 100644 schema/shapes/offset-path.json create mode 100644 schema/shapes/path.json create mode 100644 schema/shapes/polystar.json create mode 100644 schema/shapes/pucker-bloat.json create mode 100644 schema/shapes/rectangle.json create mode 100644 schema/shapes/repeater-transform.json create mode 100644 schema/shapes/repeater.json create mode 100644 schema/shapes/rounded-corners.json create mode 100644 schema/shapes/shape-element.json create mode 100644 schema/shapes/shape-list.json create mode 100644 schema/shapes/shape.json create mode 100644 schema/shapes/stroke-dash.json create mode 100644 schema/shapes/stroke.json create mode 100644 schema/shapes/transform.json create mode 100644 schema/shapes/trim.json create mode 100644 schema/shapes/twist.json create mode 100644 schema/shapes/zig-zag.json create mode 100644 schema/styles/bevel-emboss-style.json create mode 100644 schema/styles/color-overlay-style.json create mode 100644 schema/styles/drop-shadow-style.json create mode 100644 schema/styles/gradient-overlay-style.json create mode 100644 schema/styles/inner-glow-style.json create mode 100644 schema/styles/inner-shadow-style.json create mode 100644 schema/styles/layer-style.json create mode 100644 schema/styles/outer-glow-style.json create mode 100644 schema/styles/satin-style.json create mode 100644 schema/styles/stroke-style.json create mode 100644 schema/text/animated-text-document.json create mode 100644 schema/text/character-data.json create mode 100644 schema/text/character-precomp.json create mode 100644 schema/text/character-shapes.json create mode 100644 schema/text/font-list.json create mode 100644 schema/text/font.json create mode 100644 schema/text/text-alignment-options.json create mode 100644 schema/text/text-data.json create mode 100644 schema/text/text-document-keyframe.json create mode 100644 schema/text/text-document.json create mode 100644 schema/text/text-follow-path.json create mode 100644 schema/text/text-range-selector.json create mode 100644 schema/text/text-range.json create mode 100644 schema/text/text-style.json create mode 100644 scripts/blockly_generated.js create mode 100644 scripts/editor.bundle.js create mode 100644 scripts/explain_worker.js create mode 100644 scripts/json_editor.js create mode 100644 scripts/lottie_bezier.js create mode 100644 scripts/lottie_blockly.js create mode 100644 scripts/lottie_explain.js create mode 100644 scripts/lottie_matrix.js create mode 100644 scripts/lottie_raw_utils.js create mode 100644 scripts/playground_data.js create mode 100644 scripts/simple_shader.js create mode 100644 scripts/value_editors.js create mode 100644 search/lunr.js create mode 100644 search/main.js create mode 100644 search/search_index.json create mode 100644 search/worker.js create mode 100644 shapes/index.html create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 style/editor.css create mode 100644 style/lottie-theme.css create mode 100644 style/style.css create mode 100644 text/index.html diff --git a/404.html b/404.html new file mode 100644 index 00000000..2d1faa52 --- /dev/null +++ b/404.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

404

+

Page not found

+

Home

+
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/Introduction/index.html b/Introduction/index.html new file mode 100644 index 00000000..61cf0dc8 --- /dev/null +++ b/Introduction/index.html @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + Introduction - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +

A human's guide to the Lottie format

+

Lottie is a vector animation format, using JSON to represent its data.

+

This guide aims to provide a human-readable description of the format and how +everything works within it.

+

This documentation assumes the reader is already familiar with the following concepts:

+ +

What this guide is

+

This guide aims to describe the lottie format in its entirety, while also give +in-depth descriptions of how every aspect works, which you can't get from just +looking at a list of JSON attributes.

+

It contains a section that shows a breakdown of +simple lottie animation describing what is going on as an introduction for the format.

+

It also has reference pages which go over the details of every object +you can find in a lottie file, and a description of its most notable attributes.

+

It provides a complete JSON schema, this is intended +for people who want to write tools to parse or generate lottie and need to get +every little detail.

+

Finally it has a section with details about rendering, +which gives tips and provides pseudo-code on how to draw various elements to +match with the lottie web player.

+

What this guide is not

+

You won't find here information on how to animate, or how to export a lottie +file from your editor of choice.

+

It also won't give information on how to embed lottie animations in your +application or website.

+

This is because there's already a lot of documentation for creating and using +lottie animations, while this aims at providing a description of the file format itself.

+

For the Impatient

+

The top level JSON object is the Animation.

+

Note that some lottie players require certain JSON keys to be presents before others in the file +to play properly.

+

Objects within the JSON may have a mixture of animatable and non-animatable properties.

+

If a property is not animated, the value is represented as usual within the JSON. +If it's animated, it has a special representation.

+

Interactive Explanation

+

If you have a lottie animation and you want to see an interactive description +of its contents, you can visit the JSON Editor page.

+

Anatomy of a Lottie file

+

Go to the next page for a breakdown of a simple +lottie animation.

+

JSON Schema

+

This guide provides a human-readable description of the format, but if you want +a machine-readable description, we also have a JSON schema.

+

Other Resources

+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/advanced_interactions/index.html b/advanced_interactions/index.html new file mode 100644 index 00000000..8922b8d5 --- /dev/null +++ b/advanced_interactions/index.html @@ -0,0 +1,4836 @@ + + + + + + + + + + + + + + Advanced Interactions - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Advanced Interactions

+

This page will describe how to create lotties with advanced interactivity, +specifically when used with lottie-web player.

+

This page is divided into "levels", each level adds more obscure features +which are less portable but add increased interaction capabilities.

+

There are 9 levels below Regular Lottie, which is the same as the +number of circles of hell in Dante's Inferno. Reader discretion is advised.

+

The techniques described below require knowledge on the following topics:

+ + + +

Level 0: Regular Lotties

+

Lotties can play an animation, loading an animation looks something like this:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 360,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "or": {"a": 0, "k": 200},
+                    "ir": {"a": 0, "k": 100},
+                    "r": {"a": 1, "k": [
+                        {"t": 0, "s": [0], "o": {"x": 0, "y": 0}, "i": {"x": 1, "y": 1}},
+                        {"t": 360, "s": [360]}
+                    ]},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "st",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [1, 1, 0.3]},
+                    "lc": 2,
+                    "lj": 2,
+                    "ml": 0,
+                    "w": {"a": 0, "k": 30}
+                }
+            ]
+        }
+    ]
+}
+
<div id="level0"></div>
+
var container = document.getElementById("level0");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+
+

By themselves lotties just play an animation, but luckily lottie-web provides some utility functions, +note how in the Script above we are storing the variable anim returned by bodymovin.loadAnimation.

+

Level 1: Controlling Playback

+

You can play around with the anim object like setting the current frame, pausing stopping etc.

+

There's also the LottieFiles interactivity library +that makes some of these interactions easier to create.

+

Here's an example of a lottie changing based on mouse position:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 360,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "or": {"a": 0, "k": 200},
+                    "ir": {"a": 0, "k": 100},
+                    "r": {"a": 1, "k": [
+                        {"t": 0, "s": [0], "o": {"x": 0, "y": 0}, "i": {"x": 1, "y": 1}},
+                        {"t": 360, "s": [360]}
+                    ]},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "st",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [1, 1, 0.3]},
+                    "lc": 2,
+                    "lj": 2,
+                    "ml": 0,
+                    "w": {"a": 0, "k": 30}
+                }
+            ]
+        }
+    ]
+}
+
<div id="level1"></div>
+
var container = document.getElementById("level1");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: false,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+container.addEventListener("mousemove", ev => {
+    var rect = container.getBoundingClientRect();
+    var t = (ev.clientX - rect.left) / rect.width;
+    anim.goToAndStop(t * json.op, true);
+});
+
+
+

Level 2: SVG Styling

+

When using the SVG renderer, you can make use of CSS styling by specifying +a value for cl in the lottie layers.

+

In the example below, CSS rules highlight the lottie layer showing a rectangle when the mouse is over it.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 360,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "el",
+                    "p": {"a": 0, "k": [400, 300]},
+                    "s": {"a": 0, "k": [150, 150]},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0.769, 0.851, 0.961]}
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "cl": "lottie_level_2",
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "s": {"a": 0, "k": [256, 128]},
+                    "r": {"a": 0, "k": 3},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0.196, 0.314, 0.69]}
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "el",
+                    "p": {"a": 0, "k": [100, 200]},
+                    "s": {"a": 0, "k": [150, 150]},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0.769, 0.851, 0.961]}
+                }
+            ]
+        }
+    ]
+}
+
.lottie_level_2:hover {
+    opacity: 10%;
+}
+.lottie_level_2 {
+    cursor: pointer;
+}
+
<div id="level2"></div>
+
var container = document.getElementById("level2");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: false,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+
+

Level 3: Basic Expressions

+

Lotties can have expressions, they are basically small +snippets of JavaScript code used to modify the value of animated properties.

+

Below the star rotation is animated using an expression instead of using keyframes.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 360,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "or": {"a": 0, "k": 200},
+                    "ir": {"a": 0, "k": 100},
+                    "r": {"a": 0, "k": 0, "x": "var $bm_rt = time * 60;"},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "st",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [1, 1, 0.3]},
+                    "lc": 2,
+                    "lj": 2,
+                    "ml": 0,
+                    "w": {"a": 0, "k": 30}
+                }
+            ]
+        }
+    ]
+}
+
<div id="level3"></div>
+
var container = document.getElementById("level3");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+
+

Level 4: Advanced Expressions

+

Within expressions you can access properties from other layers, and since +they are all JavaScript objects, you can add your own properties to them.

+

You can make a layer follow the position of another:

+
// Set the layer position to follow the X position of another layer
+var other_position = thisComp("layer_name").transform.position;
+var $bm_rt = [other_position[0], value[1]];
+
+

Since property values are initialized to their non-expression value, +you can't access updated value of the property you are changing from the +expression. However you can work around this by storing state in the +layer object.

+
// Get size of the rect
+var size = thisLayer.content(1).size;
+
+// Initialize everything at the start
+if ( time == 0 )
+{
+    thisLayer.my_value = size[0] / 2;
+    thisLayer.speed = 60;
+    thisLayer.direction = 1;
+    thisLayer.prev_time = 0;
+}
+
+// Handle the case when the lottie has looped and time has reset
+// as it might not be exactly 0
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+
+// Find the time delta to keep constant speed
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+// Increment x
+thisLayer.my_value += dt * thisLayer.speed * thisLayer.direction;
+var x = thisLayer.my_value;
+if ( x >= thisComp.width - size[0] / 2)
+    thisLayer.direction = -1;
+else if ( x <= size[0] / 2 )
+    thisLayer.direction = 1;
+
+// Calculate y based on x
+var y = value[1] + Math.sin((x / thisComp.width) * Math.PI * 2) * (thisComp.height - size[1]) / 2;
+
+var $bm_rt = [x, y];
+
+

Here's an example:

+

Note that the JSON uses ECMAScript's backtick string syntax for clarity, +in a real Lottie file you'd need to put it into a single line.

+

Newlines in the expression string work fine as long as the last line of +the expression doesn't end in a single line comment.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "nm": "layer_name",
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [0, 256],
+                    "x": `
+// Get size of the rect
+var size = thisLayer.content(1).size;
+
+// Initialize everything at the start
+if ( time == 0 )
+{
+    thisLayer.my_value = size[0] / 2;
+    thisLayer.speed = 120;
+    thisLayer.direction = 1;
+    thisLayer.prev_time = 0;
+}
+
+// Handle the case when the lottie has looped and time has reset
+// as it might not be exactly 0
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+
+// Find the time delta to keep constant speed
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+// Increment x
+thisLayer.my_value += dt * thisLayer.speed * thisLayer.direction;
+var x = thisLayer.my_value;
+if ( x >= thisComp.width - size[0] / 2)
+    thisLayer.direction = -1;
+else if ( x <= size[0] / 2 )
+    thisLayer.direction = 1;
+
+// Calculate y based on x
+var y = value[1] + Math.sin((x / thisComp.width) * Math.PI * 2) * (thisComp.height - size[1]) / 2;
+
+var $bm_rt = [x, y];
+`
+                }
+            },
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "s": {"a": 0, "k": [80, 80]},
+                    "r": {"a": 0, "k": 3},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0.196, 0.314, 0.69]}
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 3600,
+            "st": 0,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [0, 256],
+                    "x": `
+// Set the layer position to follow the X position of another layer
+var other_position = thisComp("layer_name").transform.position;
+var $bm_rt = [other_position[0], value[1]];
+`
+                }
+            },
+            "shapes": [
+                {
+                    "ty": "el",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "s": {"a": 0, "k": [150, 150]},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0.769, 0.851, 0.961]}
+                }
+            ]
+        }
+    ]
+}
+
<div id="level4"></div>
+
var container = document.getElementById("level4");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+
+

Level 5: Breaking Time

+

In the previous examples, we had a condition at the start of some expressions +initializing custom attributes when time is equal to 0.

+
if ( time == 0 )
+    thisLayer.my_property = "some value";
+
+

This works because the first frame is always at time 0 but it isn't a +super reliable check: when the player loops, the time can go back to 0 +which would result in your properties being initialized again.

+

If you want your interactions to carry over across loops, a better +approach is to use a condition where you check for undefined layer +properties:

+
if ( thisLayer.my_property === undefined )
+    thisLayer.my_property = "some value";
+
+

For smooth value increments, we need to properly handle the time +variable within expressions. Similarly to what we've done before the +following example shows how to initialize and update a variable over +time;

+
// Initialization
+if ( thisLayer.last_time === undefined )
+{
+    thisLayer.last_time = time;
+    thisLayer.value = 0;
+    thisLayer.speed = 600;
+}
+
+// Handle looping
+if ( time < thisLayer.last_time )
+    thisLayer.last_time = time;
+
+// `dt` is the time since the last expression evaluation in seconds
+var dt = time - thisLayer.last_time;
+
+// Update the time management variable
+thisLayer.last_time = time;
+
+// Increment
+thisLayer.value = dt * thisLayer.speed;
+
+

This approach allows you to change values regardless of playback speed +and framerate. I also allows you to continue the movement when the +lottie reaches its last frame and starts looping.

+

In the following example, the lottie is set to loop every second but +it keeps going indefinitely because of the time management setup:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "nm": "star",
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "ks": {
+                "p": {"a": 0, "k": [0, 0], "x": `
+// Initialization
+if ( thisLayer.prev_time === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+
+    thisLayer.dx = 1;
+    thisLayer.dy = 1;
+    thisLayer.prev_time = 0;
+}
+
+// Time management
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+// Animation
+thisLayer.px += thisLayer.dx * dt * 100;
+thisLayer.py += thisLayer.dy * dt * 120;
+
+var radius = thisLayer.content(1).outerRadius;
+if ( thisLayer.px < radius )
+    thisLayer.dx = 1;
+else if ( thisLayer.px > thisComp.width - radius )
+    thisLayer.dx = -1;
+if ( thisLayer.py < radius )
+    thisLayer.dy = 1;
+else if ( thisLayer.py > thisComp.height - radius )
+    thisLayer.dy = -1;
+
+// Set value
+var $bm_rt = [thisLayer.px, thisLayer.py];
+                `}},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "or": {"a": 0, "k": 70},
+                    "ir": {"a": 0, "k": 40},
+                    "r": {"a": 0, "k": 0},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 0.3],
+                    }
+                }
+            ]
+        }
+    ]
+}
+
<div id="level5"></div>
+
var options = {
+    container: document.getElementById("level5"),
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+
+

Level 6: Injecting Data

+

Remember the anim object we get from lottie-web? +It's the key for more advanced interactions.

+

Internally it stores its lottie structure and the objects being passed +to expression as thisComp and thisLayer. Being able to access these +objects allows us to pass data directly to the lottie expressions.

+

The object corresponding to thisComp can be accessed as +anim.renderer.compInterface, and from there you can get the layers +by name or index (see the Composition expression object).

+

In the example below the rotation direction and color of the star change +based on whether the mouse is over the element containing the lottie.

+
// Time management as before
+if ( time == 0 )
+{
+    thisLayer.angle = 0;
+    thisLayer.prev_time = 0;
+}
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+var direction = thisComp.counter_clockwise ? -1 : 1;
+thisLayer.angle += dt * direction * 60;
+var $bm_rt = thisLayer.angle;
+
+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 360,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 360,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "or": {"a": 0, "k": 200},
+                    "ir": {"a": 0, "k": 100},
+                    "r": {"a": 0, "k": 0, "x": `
+// Time management as before
+if ( thisLayer.prev_time === undefined )
+{
+    thisLayer.angle = 0;
+    thisLayer.prev_time = 0;
+}
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+var direction = thisComp.mouse_is_over ? -1 : 1;
+thisLayer.angle += dt * direction * 60;
+var $bm_rt = thisLayer.angle;
+                    `},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "st",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 0.3],
+                        "x": "var $bm_rt = thisComp.mouse_is_over ? [0.196, 0.314, 0.69] : value;"
+                    },
+                    "lc": 2,
+                    "lj": 2,
+                    "ml": 0,
+                    "w": {"a": 0, "k": 30}
+                }
+            ]
+        }
+    ]
+}
+
<div id="level6"></div>
+
var container = document.getElementById("level6");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+container.addEventListener("mouseenter", () => {
+    anim.renderer.compInterface.mouse_is_over = true;
+});
+container.addEventListener("mouseleave", () => {
+    anim.renderer.compInterface.mouse_is_over = false;
+});
+
+
+

Level 7: Automatic Event Handlers

+

So far the interaction logic has been done by JavaScript on the browser.

+

In this section we'll add all the logic in the JSON itself and write a +wrapper script that sets up the animation.

+

This allows you to have self-contained lotties you can embed in a web +page that will handle events on their own.

+

Lottie JSON Extension

+

First thing is to write the expressions in the Lottie itself.

+

Since Lottie is just a JSON file, it's easy to add custom values:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "click": "/*event handler code*/"
+    }
+}
+
+

Now we need to add some JavaScript so we can listen to the events +fired by the DOM and execute expressions:

+
for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", expression);
+    container.addEventListener(ev_type, expression_function);
+}
+
+

Preparing Globals

+

While the above would work, we should expose some objects for it to be +useful. The lottie player define a bunch of objects +and functions for expressions, but we don't really +need all of them since the even handlers only need to pass along the information +that an event has occurred.

+

We will define thisComp and time +to be the same as the globals of the same name you'd expect to find an expressions, +and pass them to the event handling function:

+

+function event_handler(ev, expression_function)
+{
+    var thisComp = anim.renderer.compInterface;
+    var time = anim.renderer.renderedFrame / anim.renderer.globalData.frameRate;
+
+    expression_function(ev, thisComp, time);
+}
+
+for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", "thisComp", "time", expression);
+    container.addEventListener(ev_type, ev => event_handler(ev, expression_function));
+}
+
+

After this step, you're all set to hanle DOM events automatically from a lottie. +The next couple steps add some polish to the event interface for a smoother experience.

+

Mouse Events

+

Events like click, mousemove, etc. provide the mouse coordinates, +which you might want to access from within the lottie.

+

By default these coordinates aren't in the same space as the values +inside the lottie so we need to scale them appropriately:

+
function event_handler(ev, expression_function)
+{
+    var thisComp = anim.renderer.compInterface;
+    var time = anim.renderer.renderedFrame / anim.renderer.globalData.frameRate;
+
+    if ( ev.clientX !== undefined )
+    {
+        var rect = container.getBoundingClientRect();
+        ev.lottie_x = (ev.clientX - rect.left) / rect.width * thisComp.width;
+        ev.lottie_y = (ev.clientY - rect.top) / rect.height * thisComp.height;
+    }
+
+    expression_function(ev, thisComp, time);
+}
+
+for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", "thisComp", "time", expression);
+    container.addEventListener(ev_type, ev => event_handler(ev, expression_function));
+}
+
+

Now we can reference the position in the lottie expression:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "click": `
+var star = thisComp("star");
+star.px = event.lottie_x;
+star.py = event.lottie_y;
+`
+    }
+}
+
+

In the example below you can click to move the star to a given position:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "click": `
+var star = thisComp("star");
+star.px = event.lottie_x;
+star.py = event.lottie_y;
+`
+    },
+    "layers": [
+        {
+            "ty": 4,
+            "nm": "star",
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "ks": {
+                "p": {"a": 0, "k": [0, 0], "x": `
+// Initialization
+if ( thisLayer.px === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+}
+
+// Set value
+var $bm_rt = [thisLayer.px, thisLayer.py];
+                `}},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "or": {"a": 0, "k": 70},
+                    "ir": {"a": 0, "k": 40},
+                    "r": {"a": 0, "k": 0},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 0.3],
+                    }
+                }
+            ]
+        }
+    ]
+}
+
<div id="level7_mouse"></div>
+
var container = document.getElementById("level7_mouse");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+function event_handler(ev, expression_function)
+{
+    var thisComp = anim.renderer.compInterface;
+    var time = anim.renderer.renderedFrame / anim.renderer.globalData.frameRate;
+
+    if ( ev.clientX !== undefined )
+    {
+        var rect = container.getBoundingClientRect();
+        ev.lottie_x = (ev.clientX - rect.left) / rect.width * thisComp.width;
+        ev.lottie_y = (ev.clientY - rect.top) / rect.height * thisComp.height;
+    }
+
+    expression_function(ev, thisComp, time);
+}
+
+for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", "thisComp", "time", expression);
+    container.addEventListener(ev_type, ev => event_handler(ev, expression_function));
+}
+
+
+

Keyboard Events

+

To allow keyboard events to be fired correctly, you need to ensure the +element containing the lottie is focusable.

+

You can do this by setting the tabindex attribute in HTML or with JavaScript.

+
<div id="level7_keyboard" tabindex="0"></div>
+
+

or

+
container.setAttribute("tabindex", "0");
+
+

In the example below we'll move a layer based on whether the user is +pressing the left and right arrow keys.

+

A good solution for this is to keep track of which key has been pressed +and react accordingly.

+

The event handler code is simple enough:

+

For keydown:

+
if ( event.key == "ArrowLeft" )
+    thisComp("star").left = true;
+else if ( event.key == "ArrowRight" )
+    thisComp("star").right = true;
+
+// Prevent scrolling and other browser shortcuts
+event.preventDefault();
+
+

keyup:

+
if ( event.key == "ArrowLeft" )
+    thisComp("star").left = false;
+else if ( event.key == "ArrowRight" )
+    thisComp("star").right = false;
+
+// Prevent scrolling and other browser shortcuts
+event.preventDefault();
+
+

We should also reset these when the lottie element loses focus:

+

focusout:

+
    thisComp("star").left = false;
+    thisComp("star").right = false;
+
+

We need to add some logic to the layer position property:

+
// Initialization
+if ( thisLayer.px === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+    thisLayer.left = false;
+    thisLayer.right = false;
+    thisLayer.prev_time = 0;
+}
+// Handle time wrapping around
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+
+// Time delta
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+// Figure which direction to move
+var direction = 0;
+if ( thisLayer.left && thisLayer.right )
+    direction = 0;
+else if ( thisLayer.left )
+    direction = -1;
+else if ( thisLayer.right )
+    direction = 1;
+
+// Move
+if ( direction != 0 )
+{
+    // 600 is the "speed", you need to consider that dt is the time
+    // in seconds since the previous frame so it's usally a rather small value
+    thisLayer.px += direction * dt * 600;
+    var radius = thisLayer.content(1).outerRadius;
+    thisLayer.px = clamp(thisLayer.px, radius, thisComp.width - radius);
+}
+
+// Set value
+var $bm_rt = [thisLayer.px, thisLayer.py];
+
+

The example below shows how to handle keyboard event.

+

Focusing on the element changes the star color. +When focused (blue star) left and right arrow keys move the star in the corresponding direction.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "keydown": `
+if ( event.key == "ArrowLeft" )
+    thisComp("star").left = true;
+else if ( event.key == "ArrowRight" )
+    thisComp("star").right = true;
+
+// Prevent scrolling and other browser shortcuts
+event.preventDefault();
+`,
+        "keyup": `
+if ( event.key == "ArrowLeft" )
+    thisComp("star").left = false;
+else if ( event.key == "ArrowRight" )
+    thisComp("star").right = false;
+
+// Prevent scrolling and other browser shortcuts
+event.preventDefault();
+`,
+        "focusin": "thisComp.focus = true;",
+        "focusout": `
+    thisComp("star").left = false;
+    thisComp("star").right = false;
+    thisComp.focus = false;
+`,
+    },
+    "layers": [
+        {
+            "ty": 4,
+            "nm": "star",
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "ks": {
+                "p": {"a": 0, "k": [0, 0], "x": `
+// Initialization
+if ( thisLayer.px === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+    thisLayer.left = false;
+    thisLayer.right = false;
+    thisLayer.prev_time = 0;
+}
+// Handle time wrapping around
+if ( time < thisLayer.prev_time )
+    thisLayer.prev_time = time;
+
+// Time delta
+var dt = time - thisLayer.prev_time;
+thisLayer.prev_time = time;
+
+// Figure which direction to move
+var direction = 0;
+if ( thisLayer.left && thisLayer.right )
+    direction = 0;
+else if ( thisLayer.left )
+    direction = -1;
+else if ( thisLayer.right )
+    direction = 1;
+
+// Move
+if ( direction != 0 )
+{
+    // 600 is the "speed", you need to consider that dt is the time
+    // in seconds since the previous frame so it's usally a rather small value
+    thisLayer.px += direction * dt * 600;
+    var radius = thisLayer.content(1).outerRadius;
+    thisLayer.px = clamp(thisLayer.px, radius, thisComp.width - radius);
+}
+
+// Set value
+var $bm_rt = [thisLayer.px, thisLayer.py];
+                `}},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "or": {"a": 0, "k": 70},
+                    "ir": {"a": 0, "k": 40},
+                    "r": {"a": 0, "k": 0},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 0.3],
+                        "x": "var $bm_rt = thisComp.focus ? [0.196, 0.314, 0.69] : value;"
+                    }
+                }
+            ]
+        }
+    ]
+}
+
<div id="level7_keyboard" tabindex="0"></div>
+
var container = document.getElementById("level7_keyboard");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+function event_handler(ev, expression_function)
+{
+    var thisComp = anim.renderer.compInterface;
+    var time = anim.renderer.renderedFrame / anim.renderer.globalData.frameRate;
+
+    if ( ev.clientX !== undefined )
+    {
+        var rect = container.getBoundingClientRect();
+        ev.lottie_x = (ev.clientX - rect.left) / rect.width * thisComp.width;
+        ev.lottie_y = (ev.clientY - rect.top) / rect.height * thisComp.height;
+    }
+
+    expression_function(ev, thisComp, time);
+}
+
+for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", "thisComp", "time", expression);
+    container.addEventListener(ev_type, ev => event_handler(ev, expression_function));
+}
+
+
+

Level 8: Sound Effects

+

Lottie web supports playing audio layers with the help of Howler.

+

By default the level of control you get with sound is rather limited but +we can find a way around it.

+

The issue is audio layers don't have a scriptable property that controls +playback which means we can't attach an expression to audio layers.

+

The trick is to wrap an audio layer into a precomp and to use an expression +on its time remapping property.

+

We can then control playback as follows:

+
if ( thisLayer.last_time === undefined )
+{
+    thisLayer.last_time = time;
+    // This variable wil control whether the sound is played
+    thisLayer.sound_play = 0;
+    // This should be the time in seconds you want the sound to play for
+    // To get the best results, it should be just short of the duration
+    // of the audio file
+    thisLayer.sound_duration = 1;
+
+}
+// Usual time management stuff
+if ( time < thisLayer.last_time )
+    thisLayer.last_time = time;
+var dt = time - thisLayer.last_time;
+thisLayer.last_time = time;
+
+// Default to not playing
+var $bm_rt = 0;
+
+if ( thisLayer.sound_play > 0 )
+{
+    $bm_rt = thisLayer.sound_duration - thisLayer.sound_play;
+    thisLayer.sound_play -= dt;
+}
+
+

In the example that follows you can click on the lottie to make it play a sound.

+

The precomp also has a green cicle that shows playback progress.

+
{
+    "v": "5.5.2",
+    "fr": 60,
+    "ip": 0,
+    "op": 180,
+    "w": 512,
+    "h": 512,
+    "ddd": 0,
+    "events": {
+        "click": "thisComp('sound_control').sound_play = thisComp('sound_control').sound_duration"
+    },
+    "assets": [
+        {
+            "id": "sound",
+            "u": "/lottie-docs/examples/",
+            "p": "sound.mp3",
+            "e": 0
+        },
+        {
+            "id": "precomp",
+            "layers": [
+                {
+                    "nm": "a",
+                    "ty": 4,
+                    "ip": 0,
+                    "op": 180,
+                    "st": 0,
+                    "ks": {},
+                    "shapes": [
+                        {
+                            "ty": "el",
+                            "p": {"a": 1, "k": [
+                                {
+                                    "t": 0,
+                                    "s": [0, 256],
+                                    "i": {"x": 0, "y": 0},
+                                    "o": {"x": 1, "y": 1},
+                                },
+                                {
+                                    "t": 60,
+                                    "s": [512, 256],
+                                }
+                            ]},
+                            "s": {"a": 0, "k": [100, 100]},
+                        },
+                        {
+                            "ty": "fl",
+                            "c": {"a": 0, "k": [0, 1, 0]},
+                            "o": {"a": 0, "k": 100},
+                        }
+                    ]
+                },
+                {
+                    "ty": 6,
+                    "ip": 1,
+                    "op": 60,
+                    "st": 1,
+                    "refId": "sound",
+                    "au": {
+                        "lv": {"a": 0, "k": [100, 100]}
+                    }
+                }
+            ]
+        }
+    ],
+    "markers": [],
+    "layers": [
+        {
+            "ty": 4,
+            "nm": "star",
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "ks": {},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [256, 256]},
+                    "or": {"a": 0, "k": 70},
+                    "ir": {"a": 0, "k": 40},
+                    "r": {
+                        "a": 1,
+                        "k": [
+                            {
+                                "t": 0,
+                                "s": [0],
+                                "i": {"x": 0, "y": 0},
+                                "o": {"x": 1, "y": 1}
+                            },
+                            {
+                                "t": 180,
+                                "s": [360]
+                            }
+                        ]
+                    },
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 1],
+                        "x": `
+var amount = thisComp('sound_control').sound_play ?? 0;
+var $bm_rt = [amount, 0, 0];
+`,
+                    }
+                }
+            ]
+        },
+        {
+            "nm": "sound_control",
+            "ty": 0,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "ks": {},
+            "refId": "precomp",
+            "w": 512,
+            "h": 512,
+            "tm": {
+                "a": 1,
+                "k": [{
+                        "t": 0,
+                        "s": [0],
+                        "i": {"x": 0, "y": 0},
+                        "o": {"x": 1, "y": 1}
+                    },
+                    {
+                        "t": 180,
+                        "s": [0]
+                    }
+                ],
+                "x": `
+if ( thisLayer.last_time === undefined )
+{
+    thisLayer.last_time = time;
+    // This variable wil control whether the sound is played
+    thisLayer.sound_play = 0;
+    // This should be the time in seconds you want the sound to play for
+    thisLayer.sound_duration = 1;
+
+}
+// Usual time management stuff
+if ( time < thisLayer.last_time )
+    thisLayer.last_time = time;
+var dt = time - thisLayer.last_time;
+thisLayer.last_time = time;
+
+// Default to not playing
+var $bm_rt = 100;
+
+if ( thisLayer.sound_play > 0 )
+{
+    $bm_rt = thisLayer.sound_duration - thisLayer.sound_play;
+    thisLayer.sound_play -= dt;
+}`
+            }
+        }
+    ]
+}
+
+
<div id="level8"></div>
+
var container = document.getElementById("level8");
+var options = {
+    container: container,
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+function event_handler(ev, expression_function)
+{
+    var thisComp = anim.renderer.compInterface;
+    var time = anim.renderer.renderedFrame / anim.renderer.globalData.frameRate;
+
+    if ( ev.clientX !== undefined )
+    {
+        var rect = container.getBoundingClientRect();
+        ev.lottie_x = (ev.clientX - rect.left) / rect.width * thisComp.width;
+        ev.lottie_y = (ev.clientY - rect.top) / rect.height * thisComp.height;
+    }
+
+    expression_function(ev, thisComp, time);
+}
+
+for ( let [ev_type, expression] of Object.entries(json.events) )
+{
+    let expression_function = Function("event", "thisComp", "time", expression);
+    container.addEventListener(ev_type, ev => event_handler(ev, expression_function));
+}
+
+
+

Interlude: Writing a Small Wrapper

+

Follows a JavaScript class that sets everything we've seen until now +in a self-contained object.

+
class LottieInteractionPlayer
+{
+    constructor(container, custom_options={})
+    {
+        if ( typeof container == "string" )
+            this.container = document.getElementById(container);
+        else
+            this.container = container;
+
+        this.anim = null;
+
+        this.custom_options = custom_options;
+
+        // needed by keyup/down
+        if ( !container.hasAttribute("tabindex") )
+            container.setAttribute("tabindex", "0");
+
+        this.handlers = {};
+
+        this._container_event_listener = this.container_event.bind(this);
+    }
+
+    // Deep copy lottie JSON
+    lottie_clone(json)
+    {
+        return JSON.parse(JSON.stringify(json));
+    }
+
+    load(lottie, resize = true)
+    {
+        // Options
+        var options = {
+            container: this.container,
+            renderer: 'svg',
+            loop: true,
+            autoplay: true,
+            // Clone because the player modifies the passed object
+            animationData = this.lottie_clone(lottie);
+            ...this.custom_options,
+        };
+
+        if ( resize )
+        {
+            this.container.style.width = lottie.w + "px";
+            this.container.style.height = lottie.h + "px";
+        }
+
+        // Clean up
+        this.clear();
+
+        // Setup handlers
+        this.handlers = {};
+        if ( lottie.events )
+        {
+            for ( var [name, func] of Object.entries(lottie.events) )
+            {
+                this.handlers[name] = this.expression_to_event_handler(func);
+                this.container.addEventListener(name, this._container_event_listener);
+            }
+        }
+
+        // Create lottie player
+        this.anim = bodymovin.loadAnimation(options);
+    }
+
+    // Destroy the animation
+    clear()
+    {
+        if ( this.anim != null )
+        {
+            try {
+                this.anim.destroy();
+                this.anim = null;
+            } catch ( e ) {}
+        }
+
+        for ( let name of Object.keys(this.handlers) )
+            this.container.removeEventListener(name, this._container_event_listener);
+    }
+
+    // Get the expression `thisComp` global
+    get thisComp()
+    {
+        return this.anim.renderer.compInterface;
+    }
+
+    // Get the expression `time` global
+    get time()
+    {
+        return this.anim.renderer.renderedFrame / this.anim.renderer.globalData.frameRate;
+    }
+
+    // Get an expression layer
+    layer(name)
+    {
+        return this.thisComp(name);
+    }
+
+    // Handles an event from the container element
+    container_event(ev)
+    {
+        this.prepare_lottie_event(ev);
+
+        if ( this.handlers[ev.type] )
+            this.handle_lottie_event(ev, this.handlers[ev.type]);
+    }
+
+    // Adds useful attributes to an event object
+    prepare_lottie_event(ev)
+    {
+        if ( ev.clientX !== undefined )
+        {
+            var rect = this.container.getBoundingClientRect();
+            ev.lottie_x = (ev.clientX - rect.left) / rect.width * this.thisComp.width;
+            ev.lottie_y = (ev.clientY - rect.top) / rect.height * this.thisComp.height;
+        }
+    }
+
+    // Handles an event given a handler
+    handle_lottie_event(ev, handler)
+    {
+        handler(ev, this.thisComp, this.time);
+    }
+
+    // Sets up an event handler
+    expression_to_event_handler(expr)
+    {
+        return Function("event", "thisComp", "time", expr);
+    }
+}
+
+

Level 9: Patching the Renderer

+

So far we've used the vanilla lottie-web player without modifications.

+

This is good for the interactions described until now but for more +advanced stuff we need to patch the player.

+

The code in this level assumes you have a wrapper class similar to the one +described in the interlude.

+

Why

+

Follows a description of some use cases that don't work with the current approach.

+

Initializing Values

+

So far we've initialized custom layer attributes in the expressions using them.

+

We started by checking if time is 0:

+
// Initialize everything at the start
+if ( time == 0 )
+{
+    thisLayer.my_value = size[0] / 2;
+    thisLayer.speed = 60;
+    thisLayer.direction = 1;
+    thisLayer.prev_time = 0;
+}
+
+

Since that isn't always reliable, we moved on to checking if the attributes +are undefined:

+
// Initialization
+if ( thisLayer.px === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+}
+
+

While this works, it's a bit annoying because you don't know if you can +access another layer's custom attributes on frame 0, so it would be nice +to have an event for this:

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "load": "thisComp('mylayer').value = 123;"
+    }
+}
+
+

We have the options of the DOMLoaded event from bodymovin:

+
    load(lottie, resize = true)
+    {
+        // (omitted the part of the code that's the same as before)
+
+        // Create lottie player
+        this.anim = bodymovin.loadAnimation(options);
+
+        this.anim.addEventListener("DOMLoaded", this._lottie_loaded_event.bind(this));
+    }
+
+    _lottie_loaded_event()
+    {
+        // Create a dummy event object and invoke the
+        this.container.dispatchEvent(new Event("load"), {});
+    }
+
+

The issue with this is such event can only be fired after the first +frame has been renderer (and expressions have been evaluated at least once).

+

DOM Events from Layers

+

Until now the event handling has been done on the container element. +Since all the layers result in DOM elements, it would be nice to +be able to listen to events from those elements and handle them based +on expressions defined on each layer.

+
{
+    "ty": 4,
+    "nm": "My layer",
+    "ip": 0,
+    "op": 60,
+    "st": 0,
+    "ks": {},
+    "shapes": [],
+    "events": {
+        "click": "thisLayer.clicked = true;"
+    }
+}
+
+

To do this we need a way of mapping the layer in the JSON to the +DOM element and the value for the expression thisLayer.

+

All this information is within the lottie-web SVG renderer but we need +to find a way of accessing it.

+

The first step is to allow a layer object to be passed to the events:

+
    // Handles an event from the container element
+    container_event(ev)
+    {
+        this.prepare_lottie_event(ev);
+
+        if ( this.handlers[ev.type] )
+            this.handle_lottie_event(ev, this.handlers[ev.type], null);
+    }
+
+    // Handles an event given a handler
+    handle_lottie_event(ev, handler, layer)
+    {
+        handler(ev, this.thisComp, this.time, layer);
+    }
+
+    // Sets up an event handler
+    expression_to_event_handler(expr)
+    {
+        return Function("event", "thisComp", "time", "thisLayer", expr);
+    }
+
+

How

+

The gist of it is we need to path the renderer object and inject our +code in some of its methods. Luckily we can do this on the fly:

+
    load(lottie, resize = true)
+    {
+        // (omitted the part of the code that's the same as before)
+
+        // Create lottie player
+        this.anim = bodymovin.loadAnimation(options);
+
+        this._patch_renderer();
+    }
+
+
+    _patch_renderer()
+    {
+        // We patch initItems to trigger an event before any expression is evaluated:
+        var old_init = this.anim.renderer.initItems.bind(this.anim.renderer);
+        var post_init = this._lottie_load_event.bind(this)
+        this.anim.renderer.initItems = function(){
+            old_init();
+            post_init();
+        };
+
+        // We patch createItem to add event listener.
+        // It takes the JSON layer as input and returns the renderer later object
+        this.layer_elements = [];
+        var old_create = this.anim.renderer.createItem.bind(this.anim.renderer);
+        this.anim.renderer.createItem = (function(layer){
+            var item = old_create(layer);
+            this._create_item_event(layer, item);
+            return item;
+        }).bind(this);
+    }
+
+    _lottie_load_event()
+    {
+        let ev = new Event("load", {});
+        this.container.dispatchEvent(ev);
+        for ( let layer of this.layer_elements )
+            layer.dispatchEvent(ev);
+    }
+
+    _create_item_event(lottie, item)
+    {
+        // lottie is the JSON layer
+        // item.layerElement is the DOM element for this layer
+        // item.layerInterface is the expression thisLayer object
+        if ( !lottie.events )
+            return;
+
+        // Create a dummy element for Null layers and the like,
+        // it makes it easier to listen for `load` events
+        let element = item.layerElement ?? document.createElement("div");
+
+        // Keep track of layer elements so they can have the `load` event too
+        this.layer_elements.push(element);
+
+        for ( let [name, func] of Object.entries(lottie.events) )
+        {
+            let handler = this.expression_to_event_handler(func);
+            function listener(ev)
+            {
+                this.prepare_lottie_event(ev);
+                this.handle_lottie_event(ev, handler, item.layerInterface);
+            }
+            element.addEventListener(name, listener.bind(this));
+        }
+    }
+
+

Now that the renderer has been patched can we be assured the patching is +done before the functions we are patching have been called?

+

The short answer is No, but we can have a look at how we can achieve this.

+

Abusing Font Loading

+

When a lottie has external fonts, the lottie-web player waits for every +font to be loaded before initializing the renderer. Which means when you +have text layers, the code above works perfectly.

+

This is nice but not all lotties need text so we'll need something better.

+

Deferring Animation Load

+

The trick is to not pass the lottie JSON to lottie-web until after +we've patched the renderer. This is easy enough because if you call +bodymovin.loadAnimation without path or animationData everything +will be initialized (including the renderer) and only the JSON loading +step is missing.

+

We can use this to patch the renderer before loading the animation:

+
    load(lottie, resize = true)
+    {
+        // Options
+        var options = {
+            container: this.container,
+            renderer: 'svg',
+            loop: true,
+            autoplay: true,
+            ...this.custom_options,
+            // Note that animationData is deferred
+        };
+
+        if ( resize )
+        {
+            this.container.style.width = lottie.w + "px";
+            this.container.style.height = lottie.h + "px";
+        }
+
+        // Clean up
+        this.clear();
+
+        // Setup handlers
+        this.handlers = {};
+        if ( lottie.events )
+        {
+            for ( var [name, func] of Object.entries(lottie.events) )
+            {
+                this.handlers[name] = this.expression_to_event_handler(func);
+                this.container.addEventListener(name, this._container_event_listener);
+            }
+        }
+
+        // Create lottie player
+        this.anim = bodymovin.loadAnimation(options);
+
+        this._patch_renderer();
+
+        this.anim.addEventListener("DOMLoaded", this._lottie_loaded_event.bind(this));
+
+        // Clone because the player modifies the passed object
+        var animation_data = this.lottie_clone(lottie);
+
+        // Load animation separately so we can patch the renderer
+        this.anim.setupAnimation(animation_data);
+    }
+
+

Note that anim.setupAnimation is available from lottie-web version +5.8.0. If you have earlier versions, you should call anim.configAnimation +instead.

+

Triggering new events

+

We know how to make the lottie react to DOM events, but what if we want +to make the DOM react to events triggered from the lottie?

+

We can use the patching setup just discussed to also add events on the +other direction, the only thing we need is adding a method to thisComp, +so it's invokable from the expressions and make it trigger DOM events.

+

The trick is to patch thisComp in the right place, fortunately we've +already done the bulk of the work so we just need to add some more code +when the animation has been loaded:

+
    _lottie_load_event()
+    {
+        let ev = new Event("load", {});
+        this.container.dispatchEvent(ev);
+        for ( let layer of this.layer_elements )
+            layer.dispatchEvent(ev);
+
+        // We add a method for triggering events from the lottie
+        this.thisComp.trigger_event = (function(type, detail){
+            this.container.dispatchEvent(new CustomEvent("lottie." + type, {detail}));
+        }).bind(this);
+    }
+
+

Then you can add event listeners to the element containing the lottie animation.

+

Resulting Wrapper

+

Here's the same wrapper class as described earlier, but with patching +code applied to support the load event and layer events.

+
class LottieInteractionPlayer
+{
+    constructor(container, custom_options={})
+    {
+        if ( typeof container == "string" )
+            this.container = document.getElementById(container);
+        else
+            this.container = container;
+
+        this.anim = null;
+
+        this.custom_options = custom_options;
+
+        // needed by keyup/down
+        if ( !container.hasAttribute("tabindex") )
+            container.setAttribute("tabindex", "0");
+
+        this.handlers = {};
+
+        this._container_event_listener = this.container_event.bind(this);
+    }
+
+    // Deep copy lottie JSON
+    lottie_clone(json)
+    {
+        return JSON.parse(JSON.stringify(json));
+    }
+
+    load(lottie, resize = true)
+    {
+        // Options
+        var options = {
+            container: this.container,
+            renderer: 'svg',
+            loop: true,
+            autoplay: true,
+            ...this.custom_options,
+            // Note that animationData is deferred
+        };
+
+        if ( resize )
+        {
+            this.container.style.width = lottie.w + "px";
+            this.container.style.height = lottie.h + "px";
+        }
+
+        // Clean up
+        this.clear();
+
+        // Setup handlers
+        this.handlers = {};
+        if ( lottie.events )
+        {
+            for ( var [name, func] of Object.entries(lottie.events) )
+            {
+                this.handlers[name] = this.expression_to_event_handler(func);
+                this.container.addEventListener(name, this._container_event_listener);
+            }
+        }
+
+        // Create lottie player
+        this.anim = bodymovin.loadAnimation(options);
+
+        this._patch_renderer();
+
+        // Clone because the player modifies the passed object
+        var animation_data = this.lottie_clone(lottie);
+
+        // Load animation separately so we can patch the renderer
+        this.anim.setupAnimation(animation_data);
+    }
+
+    _patch_renderer()
+    {
+        // We patch initItems to trigger an event before any expression is evaluated:
+        var old_init = this.anim.renderer.initItems.bind(this.anim.renderer);
+        var post_init = this._lottie_load_event.bind(this)
+        this.anim.renderer.initItems = function(){
+            old_init();
+            post_init();
+        };
+
+        // We patch createItem to add event listener.
+        // It takes the JSON layer as input and returns the renderer later object
+        this.layer_elements = [];
+        var old_create = this.anim.renderer.createItem.bind(this.anim.renderer);
+        this.anim.renderer.createItem = (function(layer){
+            var item = old_create(layer);
+            this._create_item_event(layer, item);
+            return item;
+        }).bind(this);
+    }
+
+    _create_item_event(lottie, item)
+    {
+        // lottie is the JSON layer
+        // item.layerElement is the DOM element for this layer
+        // item.layerInterface is the expression thisLayer object
+        if ( !lottie.events )
+            return;
+
+        // Create a dummy element for Null layers and the like,
+        // it makes it easier to listen for `load` events
+        let element = item.layerElement ?? document.createElement("div");
+
+        // Keep track of layer elements so they can have the `load` event too
+        this.layer_elements.push(element);
+
+        for ( let [name, func] of Object.entries(lottie.events) )
+        {
+            let handler = this.expression_to_event_handler(func);
+            function listener(ev)
+            {
+                this.prepare_lottie_event(ev);
+                this.handle_lottie_event(ev, handler, item.layerInterface);
+            }
+            element.addEventListener(name, listener.bind(this));
+        }
+    }
+
+    _lottie_load_event()
+    {
+        let ev = new Event("load", {});
+        this.container.dispatchEvent(ev);
+        for ( let layer of this.layer_elements )
+            layer.dispatchEvent(ev);
+
+        // We add a method for triggering events from the lottie
+        this.thisComp.trigger_event = (function(type, detail){
+            this.container.dispatchEvent(new CustomEvent("lottie." + type, {detail}));
+        }).bind(this);
+    }
+
+    // Destroy the animation
+    clear()
+    {
+        if ( this.anim != null )
+        {
+            try {
+                this.anim.destroy();
+                this.anim = null;
+            } catch ( e ) {}
+        }
+
+        for ( let name of Object.keys(this.handlers) )
+            this.container.removeEventListener(name, this._container_event_listener);
+    }
+
+    // Get the expression `thisComp` global
+    get thisComp()
+    {
+        return this.anim.renderer.compInterface;
+    }
+
+    // Get the expression `time` global
+    get time()
+    {
+        return this.anim.renderer.renderedFrame / this.anim.renderer.globalData.frameRate;
+    }
+
+    // Get an expression layer
+    layer(name)
+    {
+        return this.thisComp(name);
+    }
+
+    // Handles an event from the container element
+    container_event(ev)
+    {
+        this.prepare_lottie_event(ev);
+
+        if ( this.handlers[ev.type] )
+            this.handle_lottie_event(ev, this.handlers[ev.type], null);
+    }
+
+    // Adds useful attributes to an event object
+    prepare_lottie_event(ev)
+    {
+        if ( ev.clientX !== undefined )
+        {
+            var rect = this.container.getBoundingClientRect();
+            ev.lottie_x = (ev.clientX - rect.left) / rect.width * this.thisComp.width;
+            ev.lottie_y = (ev.clientY - rect.top) / rect.height * this.thisComp.height;
+        }
+    }
+
+    // Handles an event given a handler
+    handle_lottie_event(ev, handler, layer)
+    {
+        handler(ev, this.thisComp, this.time, layer);
+    }
+
+    // Sets up an event handler
+    expression_to_event_handler(expr)
+    {
+        return Function("event", "thisComp", "time", "thisLayer", expr);
+    }
+}
+
+

Animation or Interaction

+

It's possible to use the custom load to detect whether the lottie +is being played in an environment that supports the custom events.

+

The following example is similar to the click example from level 7 +but when a player doesn't have interaction support, the star moves +around on its own.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "events": {
+        "click": "var star = thisComp('star'); star.px = event.lottie_x; star.py = event.lottie_y;",
+        "load": "thisComp('star').interactive = true;"
+    },
+    "layers": [
+        {
+            "ty": 4,
+            "nm": "star",
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "ks": {
+                "p": {"a": 0, "k": [0, 0], "x": `
+// Initialization
+if ( thisLayer.px === undefined )
+{
+    thisLayer.px = thisComp.width / 2;
+    thisLayer.py = thisComp.height / 2;
+
+    if ( !thisLayer.interactive )
+    {
+        thisLayer.dx = 1;
+        thisLayer.dy = 1;
+        thisLayer.prev_time = 0;
+    }
+}
+
+if ( !thisLayer.interactive )
+{
+    if ( time < thisLayer.prev_time )
+        thisLayer.prev_time = time;
+    var dt = time - thisLayer.prev_time;
+    thisLayer.prev_time = time;
+
+    thisLayer.px += thisLayer.dx * dt * 100;
+    thisLayer.py += thisLayer.dy * dt * 120;
+
+    var radius = thisLayer.content(1).outerRadius;
+    if ( thisLayer.px < radius )
+        thisLayer.dx = 1;
+    else if ( thisLayer.px > thisComp.width - radius )
+        thisLayer.dx = -1;
+    if ( thisLayer.py < radius )
+        thisLayer.dy = 1;
+    else if ( thisLayer.py > thisComp.height - radius )
+        thisLayer.dy = -1;
+
+}
+
+// Set value
+var $bm_rt = [thisLayer.px, thisLayer.py];
+                `}},
+            "shapes": [
+                {
+                    "ty": "sr",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "or": {"a": 0, "k": 70},
+                    "ir": {"a": 0, "k": 40},
+                    "r": {"a": 0, "k": 0},
+                    "pt": {"a": 0, "k": 5},
+                    "sy": 1,
+                    "os": {"a": 0, "k": 0},
+                    "is": {"a": 0, "k": 0}
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 100},
+                    "c": {
+                        "a": 0,
+                        "k": [1, 1, 0.3],
+                    }
+                }
+            ]
+        }
+    ]
+}
+
<div id="level9_parent">
+    <div id="level9_not_interactive"></div>
+    <div id="level9_interactive"></div>
+</div>
+
#level9_parent {
+    display: flex;
+}
+#level9_interactive, #level9_not_interactive {
+    border: 1px solid #ccc;
+    width: 50%;
+    box-sizing: border-box;
+}
+
var options = {
+    container: document.getElementById("level9_not_interactive"),
+    renderer: "svg",
+    loop: true,
+    autoplay: true,
+    animationData: json,
+};
+var anim = bodymovin.loadAnimation(options);
+
+var player = new LottieInteractionPlayer(document.getElementById("level9_interactive"));
+player.load(json, false);
+
+
+
+
+
+

Lottie Button Example

+

This example uses everything we discussed so far.

+

A quick note: to avoid clicks going to the wrong layer we need to define +some CSS that gets rid of pointer events for layers we don't want to click.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "fonts": {"list":[
+        {
+            "ascent": 72,
+            "fFamily": "Roboto",
+            "fName": "Roboto Regular",
+            "fStyle": "Regular",
+            "fPath": "https://fonts.googleapis.com/css2?family=Roboto&display=swap",
+            "origin": 1,
+        }
+    ]},
+    "layers": [
+        {
+            "ty": 5,
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "parent": 1,
+            "cl": "no-mouse",
+            "ks": {
+                "p": {"a": 0, "k": [0, 25]},
+            },
+            "t": {
+                "a": [],
+                "d": {
+                    "x": "var $bm_rt = 'Clicks: ' + thisComp('button').clicks;",
+                    "k": [
+                        {
+                            "s": {
+                                "f": "Roboto Regular",
+                                "fc": [0, 0, 0],
+                                "s": 70,
+                                "t": "",
+                                "j": 2,
+                            },
+                            "t": 0
+                        }
+                    ]
+                },
+                "m": {
+                    "a": {"a": 0, "k": [0,0]},
+                    "g": 3
+                },
+                "p": {}
+            }
+        },
+        {
+            "ty": 4,
+            "nm": "button",
+            "ip": 0,
+            "op": 60,
+            "st": 0,
+            "ind": 1,
+            "cl": "lottie-button",
+            "events": {
+                "load": "thisLayer.clicks = 0;",
+                "click": "thisLayer.clicks += 1; thisComp.trigger_event('click', {clicks: thisLayer.clicks});",
+                "mouseenter": "thisLayer.highlighted = true;",
+                "mouseleave": "thisLayer.highlighted = false;"
+            },
+            "ks": {
+                "p": {"a": 0, "k": [256, 256]},
+                "s": {
+                    "a": 0,
+                    "k": [100, 100],
+                    "x": "var sz = thisLayer.highlighted ? 120 : 100; var $bm_rt = [sz, sz];"
+                }
+            },
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "p": {"a": 0, "k": [0, 0]},
+                    "s": {"a": 0, "k": [350, 90]},
+                    "r": {"a": 0, "k": 3},
+                },
+                {
+                    "ty": "st",
+                    "o": {"a": 0, "k": 100},
+                    "c": {"a": 0, "k": [0, 1, 0]},
+                    "w": {"a": 0, "k": 1},
+                },
+                {
+                    "ty": "fl",
+                    "o": {"a": 0, "k": 50, "x": "var $bm_rt = thisLayer.highlighted ? 70 : 30;"},
+                    "c": {"a": 0, "k": [0.4, 1, 0.4]}
+                }
+            ]
+        }
+    ]
+}
+
var container = document.getElementById("level9_button");
+var player = new LottieInteractionPlayer(container);
+player.load(json);
+container.addEventListener("lottie.click", ev =>
+    document.getElementById("level9_outer").innerText = `Lottie clicked ${ev.detail.clicks} times`
+);
+
<div id="level9_button"></div>
+<div id="level9_outer">Button not clicked</div>
+
.no-mouse {
+    pointer-events: none;
+}
+.lottie-button {
+    cursor: pointer;
+}
+
+
Button not clicked
+
+

3D

+

Everything discussed so far was for the lottie-web svg renderer +but all the patching works with the html renderer as well.

+

The html renderer supports 3D layers so we can make an interactive +3D scene with little effort.

+

The main caveat is that you need to set position: relative on the +container element.

+

On the example below you can click to capture the mouse then have +first-person controls.

+
{
+    "v": "5.9.1",
+    "ip": 0,
+    "op": 180,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "fonts": {
+        "list": []
+    },
+    "assets": [],
+    "layers": [
+        {
+            "nm": "Camera",
+            "ty": 13,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        -10
+                    ]
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 0
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ]
+                }
+            },
+            "pe": {
+                "a": 0,
+                "k": 256
+            },
+            "ddd": 1
+        },
+        {
+            "nm": "Move Parent",
+            "ty": 3,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "a": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ],
+                    "x": "var dt = thisComp.time_delta(thisLayer, time);\n\n            if ( thisComp.mouse_dx )\n            {\n                thisComp.char_angle -= dt * thisComp.mouse_dx / 8 * Math.PI;\n                thisComp.mouse_dx  = 0;\n            }\n\n            if ( thisComp.mouse_dy )\n            {\n                thisComp.look_angle += dt * thisComp.mouse_dy / 8 * Math.PI;\n                thisComp.mouse_dy  = 0;\n            }\n\n\n            var left = thisComp.keys_pressed.ArrowLeft || thisComp.keys_pressed.a;\n            var right = thisComp.keys_pressed.ArrowRight || thisComp.keys_pressed.d;\n            var dx = 0;\n            if ( left && right )\n                dx = 0;\n            else if ( left )\n                dx = -1;\n            else if ( right )\n                dx = 1;\n\n            var up = thisComp.keys_pressed.ArrowUp || thisComp.keys_pressed.w;\n            var down = thisComp.keys_pressed.ArrowDown || thisComp.keys_pressed.s;\n            var dz = 0;\n            if ( up && down )\n                dz = 0;\n            else if ( up )\n                dz = 1;\n            else if ( down )\n                dz = -1;\n\n            thisLayer.char_x += dz * dt * -200 * Math.sin(thisComp.char_angle);\n            thisLayer.char_z += dz * dt * 200 * Math.cos(thisComp.char_angle);\n\n            thisLayer.char_x += dx * dt * -200 * Math.sin(thisComp.char_angle - Math.PI / 2);\n            thisLayer.char_z += dx * dt * 200 * Math.cos(thisComp.char_angle - Math.PI / 2);\n\n            var $bm_rt = [thisLayer.char_x, thisLayer.char_y, thisLayer.char_z];\n        \n/**/"
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 0
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ],
+                    "x": "var $bm_rt = [thisComp.look_angle * 180 / Math.PI, thisComp.char_angle * 180 / Math.PI, 0];\n        \n/**/"
+                }
+            },
+            "ind": 1,
+            "ddd": 1,
+            "events": {
+                "load": "thisLayer.char_x = 0;\n            thisLayer.char_z = 0;\n            thisLayer.char_y = 0;\n        \n/**/"
+            }
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        200
+                    ]
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 0
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ]
+                }
+            },
+            "ddd": 1,
+            "parent": 1,
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "s": {
+                        "a": 0,
+                        "k": [
+                            200,
+                            200
+                        ]
+                    },
+                    "p": {
+                        "a": 0,
+                        "k": [
+                            0,
+                            0
+                        ]
+                    },
+                    "r": {
+                        "a": 0,
+                        "k": 0
+                    }
+                },
+                {
+                    "ty": "fl",
+                    "c": {
+                        "a": 0,
+                        "k": [
+                            0.5,
+                            0.5,
+                            1
+                        ]
+                    },
+                    "o": {
+                        "a": 0,
+                        "k": 100
+                    }
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        -200
+                    ]
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 0
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ]
+                }
+            },
+            "ddd": 1,
+            "parent": 1,
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "s": {
+                        "a": 0,
+                        "k": [
+                            200,
+                            200
+                        ]
+                    },
+                    "p": {
+                        "a": 0,
+                        "k": [
+                            0,
+                            0
+                        ]
+                    },
+                    "r": {
+                        "a": 0,
+                        "k": 0
+                    }
+                },
+                {
+                    "ty": "fl",
+                    "c": {
+                        "a": 0,
+                        "k": [
+                            0.5,
+                            0.5,
+                            0
+                        ]
+                    },
+                    "o": {
+                        "a": 0,
+                        "k": 100
+                    }
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [
+                        200,
+                        0,
+                        0
+                    ]
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 90
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ]
+                }
+            },
+            "ddd": 1,
+            "parent": 1,
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "s": {
+                        "a": 0,
+                        "k": [
+                            200,
+                            200
+                        ]
+                    },
+                    "p": {
+                        "a": 0,
+                        "k": [
+                            0,
+                            0
+                        ]
+                    },
+                    "r": {
+                        "a": 0,
+                        "k": 0
+                    }
+                },
+                {
+                    "ty": "fl",
+                    "c": {
+                        "a": 0,
+                        "k": [
+                            1,
+                            0.5,
+                            0.5
+                        ]
+                    },
+                    "o": {
+                        "a": 0,
+                        "k": 100
+                    }
+                }
+            ]
+        },
+        {
+            "ty": 4,
+            "ip": 0,
+            "op": 180,
+            "st": 0,
+            "sr": 1,
+            "ks": {
+                "p": {
+                    "a": 0,
+                    "k": [
+                        -200,
+                        0,
+                        0
+                    ]
+                },
+                "rx": {
+                    "a": 0,
+                    "k": 0
+                },
+                "ry": {
+                    "a": 0,
+                    "k": 90
+                },
+                "rz": {
+                    "a": 0,
+                    "k": 0
+                },
+                "or": {
+                    "a": 0,
+                    "k": [
+                        0,
+                        0,
+                        0
+                    ]
+                }
+            },
+            "ddd": 1,
+            "parent": 1,
+            "shapes": [
+                {
+                    "ty": "rc",
+                    "s": {
+                        "a": 0,
+                        "k": [
+                            200,
+                            200
+                        ]
+                    },
+                    "p": {
+                        "a": 0,
+                        "k": [
+                            0,
+                            0
+                        ]
+                    },
+                    "r": {
+                        "a": 0,
+                        "k": 0
+                    }
+                },
+                {
+                    "ty": "fl",
+                    "c": {
+                        "a": 0,
+                        "k": [
+                            0,
+                            0.5,
+                            0.5
+                        ]
+                    },
+                    "o": {
+                        "a": 0,
+                        "k": 100
+                    }
+                }
+            ]
+        }
+    ],
+    "events": {
+        "keydown": "thisComp.keys_pressed[event.key] = true;\n\n        if ( event.key != \"F5\" )\n            event.preventDefault();\n    \n/**/",
+        "keyup": "thisComp.keys_pressed[event.key] = false;\n\n        if ( event.key != \"F5\" )\n            event.preventDefault();\n    \n/**/",
+        "load": "thisComp.keys_pressed = {};\n        thisComp.mouse_dx = 0;\n        thisComp.mouse_dy = 0;\n        thisComp.char_angle = 0;\n        thisComp.look_angle = 0;\n        thisComp.time_delta = function (thisLayer, time) {\n            if ( thisLayer.last_time === undefined || time < thisLayer.last_time )\n            {\n                thisLayer.last_time = time;\n                return 0;\n            }\n\n            var dt = time - thisLayer.last_time;\n            thisLayer.last_time = time;\n            return dt;\n        };\n    \n/**/",
+        "mouseenter": "thisComp.mouse_old_x = thisComp.mouse_x = event.lottie_x;\n        thisComp.mouse_old_y = thisComp.mouse_y = event.lottie_x;\n    \n/**/",
+        "mouseleave": "thisComp.mouse_old_x = thisComp.mouse_x = event.lottie_x;\n        thisComp.mouse_old_y = thisComp.mouse_y = event.lottie_x;\n    \n/**/",
+        "mousemove": "thisComp.mouse_dx += event.movementX;\n        thisComp.mouse_dy += event.movementY;\n    \n/**/"
+    },
+    "ddd": 1
+}
+
var container = document.getElementById("level9_3d");
+var player = new LottieInteractionPlayer(container, {renderer: "html"});
+player.load(json);
+
<div id="level9_3d" onclick="this.requestPointerLock();"></div>
+
#level9_3d {
+    position: relative;
+}
+
+
+
+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aep/index.html b/aep/index.html new file mode 100644 index 00000000..e34a7bb2 --- /dev/null +++ b/aep/index.html @@ -0,0 +1,5978 @@ + + + + + + + + + + + + + + Parsing AEP Files - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Parsing AEP Files

+

AfterEffects Project files are the proprietary file format used by Adobe AfterEffects.

+

It's a binary format based on the RIFX container format.

+

The structure resembles that of a Lottie JSON exported from AE.

+

RIFF

+

A RIFF is composed of "chunks" with the following format

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FieldSizeDescription
Header4ASCII name describing the type of the chunk
Size4uint32 size of the data section
DataSizeData within the chunk
+

RIFX is an extension of the RIFF format, the difference being RIFX +uses big-endian notation for integers.

+

A RIFF file will be structured in the same way as a chunk:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldSizeDescription
Header4RIFF or RIFX
Size4uint32 size of the chunk
Format4Format Identifier
Chunks*Rest of the chunks
+

AEP-Specific Parsing

+

It should always be RIFX format (big endian). The format identifier +for AEP is Egg!.

+

When parsing the RIFF structure, keep in mind the following chunks +will contain other chunks:

+ +

And that LIST btdk contains data in a different format, and +it should not be parsed as a RIFF LIST.

+

At the end of the RIFF data, the AEP file has some XML-encoded metadata.

+

Basic Types

+

In the chunk data descriptions, the types described below will be used +to show how to interpret the raw binary data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSizeDescription
id4ASCII-encoded chunk identifier
uint162Unsigned integer
uint324Unsigned integer
sint162Twos-complement signed integer
float324IEEE float
float648IEEE float
string*Text, usually utf-8 encoded
string0*NUL terminated string, note that you might find junk data after the NUL (This can be caused by renaming something to a shorter name)
bytes*Unformatted / unknown data
+

Time

+

Time values are stored as uint16. they are scaled by a factor you can find in cdta.

+

To get the actual value in frames you need to do the following:

+
time_frames = time_value / cdta.time_scale
+
+

Additionally, layers specify a start time, which shifts all the time values by a fixed amount.

+

If you are within a layer the expression looks like this:

+
time_frames = (time_value + ldta.start_time) / (cdta.time_scale)
+
+

Flags

+

Flags is byte data, that will be specified using two integers: byte and bit index.

+

You'll get the value of the flag you'll need to do the following:

+
flag = (flags[byte] & (1 << bit)) != 0
+
+

The index of the byte here is in file order so a byte of 0 is the most significant byte.

+

AfterEffects Logic

+

This section assumes the file has already been parsed into RIFF chunks.

+

Objects described here will have a nested list showing which chunks are +used to represent them, you can click on the link pointing to the chunk +details to get the data layout within that chunk.

+

File Structure

+ +

Folder Item

+ +

idta will cointain the ID of the item (referenced by layers) +and the item type.

+

The following sections descript each type of item in detail

+

Folders

+

idta type 1. These contain additional items inside them.

+ +

Compositions

+

idta has type of 4. You need to know which composition to extract as +a lottie corresponds to a specific comp (with other compositions showing +as assets for precomps).

+

Structure:

+ +

Each layer will show as a LIST Layr in the LIST Item.

+

The composition will also have other type of layer LISTs:

+ +

If the comp uses essential graphics, it will have the appropriate LISTs as well.

+

Assets

+

idta type 7. These can have different kinds of contents.

+

Look for sspc to get the size for visual assets.

+

The type of asset is defined in the first 4 bytes of opti.

+
Solids
+

For some the Item has an Utf8 but it seems to always be empty +need to find the name from opti.

+ +
Files
+ +

The Uft8 in Item only has a value if the user has set an explicit value for the name.

+

The file path is in alas, parse it as JSON and get fullpath.

+

the first 4 bytes of opti will change based on the file format.

+

Layers

+ +

When parsing layer transforms, keep in mind the default position is the center of the comp. +For shape layers, the default anchor is [0, 0]; +for precomp layers the default anchor is the center of the comp (same as position).

+

Asset Layer

+

Layer type 0.

+

(Also known as AVLayer in AE) They have a non-zero Source ID in ldta.

+

Precomp, image, and similar layers will point to an appropriate asset.

+

Several layer types point to a solid asset, you need to check the layer +attributes to distinguish between them:

+
    +
  • Solid layers
  • +
  • Null layers
  • +
  • Adjustment layers
  • +
+

Light Layer

+

Layer type 1.

+

For light settings look for the match name ADBE Light Options Group.

+

Camera Layer

+

Layer type 2.

+

For camera settings look for the match name ADBE Camera Options Group.

+

Text Layer

+

Layer type 3.

+

For text contents look for the match name ADBE Text Properties.

+

Shape Layer

+

Layer type 4.

+

For shapes look for the match name ADBE Root Vectors Group.

+

Property Groups

+

Most objects are described as a property groups.

+

These have the following structure:

+
    +
  • LIST tdgp: Property group
      +
    • tdsb: Flags
    • +
    • tdsn > Utf8: Name
    • +
    • ... (properties)
    • +
    • tdmn: ADBE Group End (marks the end of the group)
    • +
    +
  • +
+

Then follows a list of properties, all introduced by their +match name (tdmn).

+

After a match name, you'll find the data for the property, which might +be an actual propert (see the section below), other groups, or layer effects.

+

This structure is used both for objects (that have a fixed set of properties) +and groups/collections whose contents might vary.

+

For objects with fixed properties you will not find duplicate match names +but you might find duplicates within collections.

+

Properties

+

Properties, like objects are introduced by their match name, the chunks +following that depends on the type of property.

+

The core of a property is defined in LIST tdbs with the following structure:

+
    +
  • LIST tdbs: Property definition
      +
    • tdb4: Tells you the type, number of components, whether it's animated
    • +
    • cdat: Value (if not animated)
    • +
    • tdsn:
        +
      • Utf8: Human-readable Name
      • +
      +
    • +
    • Utf8: Optional expression
    • +
    • LIST list: Keyframes (if animated)
        +
      • lhd3: Tells you the number of keyframes
      • +
      • ldat: Keyframe data and values
      • +
      +
    • +
    +
  • +
+

For simple properties, with vector or scalar values, you get the structure above.

+

For more complex properties, you get an outer object that contains that data as well +as a list of values. You'll get the value for the keyframes (or the static value) from that list.

+

Color properties are laid out as ARGB floats in [0, 255].

+

Note that the keyframe structure in ldat changes based on the info found in tdb4.

+

Shape

+ +

Gradient Colors

+ +

Orientation

+ +

Marker

+ +

Text Document

+ +

Layer

+

Follows the usual LIST tdbs, check tdb4 for the "Integer" property type.

+ +

Mask Index

+

Follows the usual LIST tdbs, check tdb4 for the "Integer" property type.

+ +

Mask

+ +

Layer Overrides

+
    +
  • LIST OvG2
      +
    • CprC: uint32?
    • +
    +
  • +
+

Layer Source Alternate

+
    +
  • blsv: uint32 Layer index?
  • +
  • blsi: uint32
  • +
+

Chunk naming

+

Most of property related chunks seem to contain the prefix td in their name:

+
    +
  • tdgp: property group
  • +
  • tdsb: property group flags
  • +
  • tdsn: property group name
  • +
  • tdmn: property match name
  • +
  • tdbs: property definition
  • +
  • tdb4: property details
  • +
+

I'm not sure what td stands for my best guess would be "Track Data".

+

For properties with external values, the naming convention generally is XXst for the parent chunk +and XXky for the values (where XX changes depending on the type and its meaning is fairly obvious).

+

I'm not sure what st stands for, ky most likely stands for "keyframes"

+

Expressions

+

Bodymovin modifies expressions +when converting into lottie, if you add expressions but fail to convert them, the animation +might not play properly.

+

Assets

+

Image

+

Defined within LIST Item, it will have idta with type 7.

+

Within that there's a LIST Pin, containing the following:

+

LIST Als2 with alas, which in turn has some JSON. +Inside the JSON you can get fullpath.

+

opti: Contains the asset name.

+

LIST CLRS, the last Utf8 here has some JSON with a base64-encoded color profile.

+

Shapes

+

Stroke Dashes

+

Look for the match name ADBE Vector Stroke Dashes.

+

Inside of it you'll find a bunch of properties with match name +ADBE Vector Stroke Dash n or ADBE Vector Stroke Gap n, where n is +an ineger starting from 1.

+

You will also find a single ADBE Vector Stroke Offset.

+

They are all animatable lengths and fairly straighforward.

+

Note that lottie-web wants a unique "name" for these, and the file doesn't provide this +but you can generate one based on the match name.

+

Transforms

+

Split Position

+

When a position is split the Position attribute is removed and you can get the data from Position_0 and Position_1.

+

For some reason Position_0 and Position_1 are present (with value 0) even when the position is not split.

+

Their tdsb seems to change from 1 (not split) to 3 (split).

+

Effects

+

The effects used in by the file are defined in the top-level chunk LIST EfdG, instanciations of these effects +are present in the layers that use them.

+
    +
  • LIST EfdG: Effect definitions
      +
    • EfDC: Effect definition count (number of definitions)
    • +
    • LIST EfDf: Effect definition (one per effect type used in the document)
        +
      • tdmn: Effect match name
      • +
      • LIST sspc
          +
        • fnam > Utf8: Effect name
        • +
        • LIST parT: Effect parameters
            +
          • parn: Number of parameters
          • +
          • tdmn: Parameter match name
          • +
          • pard: Parameter definition
          • +
          • pdnm: (optional) Parameter control strings
          • +
          • You get tdmn and pard (optionally followed by pdnm for each parameter
          • +
          +
        • +
        • LIST tdgp: Contains the values of the first instance of this effect, can be ignored
        • +
        +
      • +
      +
    • +
    +
  • +
+

Note that the first paramter in an effect should be ignored.

+

The effects in a later are listed under ADBE Effect Parade:

+
    +
  • tdmn: Effect match name, you'll need to find the matching definition
  • +
  • LIST sspc
      +
    • fnam > Utf8: Effect name
    • +
    • LIST parT: You might find this here as well but it isn't consistent. Refer to LIST EfdG for the definition
    • +
    • LIST tdgp: Parameter values, works like any other property list
    • +
    +
  • +
+

Essential Graphics

+

Definition

+

Essential graphics are defined in the following chunks inside the comp's LIST Item:

+ +

They seem to have the same structure and (almost) identical values. But only CIF3 +has data about groups:

+
    +
  • LIST CIF3
      +
    • LIST CpS2
        +
      • CsCt: seems to always have the value 0x1000000.
      • +
      • Utf8: Name (Defaults to Untitled)
      • +
      • Utf8: Locale? (en_US)
      • +
      +
    • +
    • CapS
        +
      • CsCt: seems to always have the value 0x1000000.
      • +
      • CapL: seems to always have the value 0.
      • +
      • Utf8: Name (again, same value as before)
      • +
      +
    • +
    • LIST CCtl: Item (repeated)
    • +
    +
  • +
+

Items have the following common structure

+ +
Comment
+ +
Group
+ +
Property
+
    +
  • CVal: Value
  • +
  • CDef: Default Value
  • +
  • Smin: Slider min value (only for scalar properties)
  • +
  • Smax: Slider max value (only for scalar properties)
  • +
  • CDim: Number of dimenstions (only for vector properties)
  • +
  • LIST StVc: Enum values (only for enum properties)
      +
    • StVS: Count
    • +
    • Utf8: Value name (repeated)
    • +
    +
  • +
  • CprC: 1
  • +
  • LIST CPrp
      +
    • CCId: Composition ID (same as the one in idta).
    • +
    • CLId: Layer ID (same as the one in ldta).
    • +
    • Utf8: JSON-ecoded path.
    • +
    +
  • +
+

The JSON is a dict where the key is a string containing a number and the values are dicts like this:

+
    +
  • index: Index for like shape groups and such, or the value 4294967295 (0xffffffff) is used when there is no index
  • +
  • matchName: Match name as per usual
  • +
+

To find the property, something like this might work:

+
CCId = 15
+CLId = 18
+json_data = {
+    "0": {
+        "index":4294967295,
+        "matchName":"ADBE Root Vectors Group"
+    },
+    "1": {
+        "index":0,
+        "matchName":"ADBE Vector Group"
+    },
+    "2": {
+        "index":4294967295,
+        "matchName":"ADBE Vectors Group"
+    },
+    "3": {
+        "index":2,
+        "matchName":"ADBE Vector Graphic - Fill"
+    },
+    "4": {
+        "index":4294967295,
+        "matchName":"ADBE Vector Fill Opacity"
+    }
+}
+
+property = get_layer(CCId, CLId)
+
+for item in json_data.values():
+    if item["index"] == 0xffffffff:
+        property = property.property(item["matchName"])
+    else:
+        property = property.properties[item["index"]]
+
+

The values in Smin, Smax, CVal, CDef depends on the type, refer to CTyp for their representation.

+

Overrides

+

Defined in the precomp layer under match name ADBE Layer Overrides

+
    +
  • tdmn: ADBE Layer Overrides
  • +
  • LIST OvG2
      +
    • LIST CPrp: (repeated)
        +
      • Utf8: UUID of the essential property
      • +
      +
    • +
    +
  • +
  • LIST tdgp: Property groups with the matching properties defined as usual.
  • +
+

Match Names

+

Follows a list of known match names grouped by object type.

+

For properties that specify a default value, you should assume they have the specified value if they are not present in the +AEP file.

+

Layers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Root Vectors Group shapes
ADBE Layer Styles styles
ADBE Transform Group ks
ADBE Layer Styles sy
ADBE Extrsn Options Group
ADBE Material Options Group
ADBE Audio Group
ADBE Layer Sets
ADBE Time Remapping tm
ADBE Effect Parade ef
ADBE Marker Markers
ADBE Mask Parade masksProperties
ADBE Plane Options Group
ADBE Data Group
ADBE Layer Overrides Essential graphincs values
ADBE Source Options Group
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Camera Options Group Camera LayerMarks a layer as a camera layer
ADBE Camera Aperture pe
ADBE Camera Zoom
ADBE Camera Focus Distance
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Mask Atom Mask
ADBE Mask Shape pt
ADBE Mask Offset x0
ADBE Mask Feather [0, 0]
ADBE Mask Opacity 0100
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Extrsn Options Group
ADBE Bevel Direction
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Material Options Group
ADBE Appears in Reflections
ADBE Reflection Coefficient
ADBE Glossiness Coefficient
ADBE Fresnel Coefficient
ADBE Transparency Coefficient
ADBE Transp Rolloff
ADBE Index of Refraction
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Source Options Group
ADBE Layer Source Alternate
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Layer Styles
ADBE Blend Options Group
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Blend Options Group
ADBE Adv Blend Group
+

Shapes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Group Group
ADBE Vector Blend Mode bm12
ADBE Vectors Group it
ADBE Vector Transform Group Transform
ADBE Vector Materials Group
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Shape - Rect Rectangle
ADBE Vector Shape Direction d1
ADBE Vector Rect Position p
ADBE Vector Rect Size s
ADBE Vector Rect Roundness r
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Shape - Ellipse Ellipse
ADBE Vector Shape Direction d1
ADBE Vector Ellipse Position p
ADBE Vector Ellipse Size s
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Shape - Star PolyStar
ADBE Vector Shape Direction d1
ADBE Vector Star Type sy1
ADBE Vector Star Points pt3
ADBE Vector Star Position p
ADBE Vector Star Rotation r
ADBE Vector Star Inner Radius ir
ADBE Vector Star Outer Radius or
ADBE Vector Star Inner Roundess is
ADBE Vector Star Outer Roundess os
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Shape - Group Path
ADBE Vector Shape Direction d1
ADBE Vector Shape ks4
+

Shape Styles

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Graphic - Fill Fill
ADBE Vector Blend Mode bm12
ADBE Vector Fill Color c5 [255, 255, 0, 0]
ADBE Vector Fill Opacity o100
ADBE Vector Fill Rule r1 1
ADBE Vector Composite Order if 2, it should be drawn over the previous shape 1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Graphic - Stroke Stroke
ADBE Vector Blend Mode bm12
ADBE Vector Stroke Color c5 [255, 255, 255, 255, ]
ADBE Vector Stroke Opacity o100
ADBE Vector Stroke Width w2
ADBE Vector Stroke Line Cap lc1 1
ADBE Vector Stroke Line Join lj1 1
ADBE Vector Stroke Miter Limit ml24
ADBE Vector Stroke Dashes d
ADBE Vector Stroke Taper
ADBE Vector Stroke Wave
ADBE Vector Composite Order if 2, it should be drawn over the previous shape 1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Stroke Taper All properties are percentages in [0, 100]
ADBE Vector Taper Start Length
ADBE Vector Taper End Length
ADBE Vector Taper Start Width
ADBE Vector Taper End Width
ADBE Vector Taper Start Ease
ADBE Vector Taper End Ease
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Stroke Wave
ADBE Vector Taper Wave Amount
ADBE Vector Taper Wave Units 1 for pixels, 2 for cycles
ADBE Vector Taper Wavelength
ADBE Vector Taper Wave Phase
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Stroke Dashes
ADBE Vector Stroke Offset
ADBE Vector Stroke Gap #
ADBE Vector Stroke Dash #
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Graphic - G-Fill Gradient Fill
ADBE Vector Blend Mode bm12
ADBE Vector Grad Type t1
ADBE Vector Grad Start Pt s
ADBE Vector Grad End Pt e[100, 0]
ADBE Vector Grad HiLite Length h
ADBE Vector Grad HiLite Angle a
ADBE Vector Grad Colors g6
ADBE Vector Fill Opacity o100
ADBE Vector Fill Rule r1 1
ADBE Vector Composite Order if 2, it should be drawn over the previous shape 1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Graphic - G-Stroke Gradient Stroke
ADBE Vector Blend Mode bm12
ADBE Vector Grad Typet1
ADBE Vector Grad Start Pt s
ADBE Vector Grad End Pt e
ADBE Vector Grad HiLite Length h
ADBE Vector Grad HiLite Angle a
ADBE Vector Grad Colors g6
ADBE Vector Stroke Opacity o100
ADBE Vector Stroke Width w2
ADBE Vector Stroke Line Cap lc1 1
ADBE Vector Stroke Line Join lj1 1
ADBE Vector Stroke Miter Limit ml2
ADBE Vector Stroke Dashes d
ADBE Vector Stroke Taper
ADBE Vector Stroke Wave
ADBE Vector Composite Order if 2, it should be drawn over the previous shape 1
+

Shape Modifiers

+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Merge Merge
ADBE Vector Merge Type mm
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Offset Offset Path
ADBE Vector Offset Amount a
ADBE Vector Offset Line Join lj1
ADBE Vector Offset Miter Limit ml
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - PB Pucker Bloat
ADBE Vector PuckerBloat Amount a
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Repeater Repeater
ADBE Vector Repeater Transform tr
ADBE Vector Repeater Copies c3
ADBE Vector Repeater Offset o
ADBE Vector Repeater Order m1
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - RC Rounded Corners
ADBE Vector RoundCorner Radius r10
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Trim Trim
ADBE Vector Trim Start s
ADBE Vector Trim End e
ADBE Vector Trim Offset o
ADBE Vector Trim Type m1
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Twist Twist
ADBE Vector Twist Angle a
ADBE Vector Twist Center c
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Roughen
ADBE Vector Roughen Size
ADBE Vector Roughen Detail
ADBE Vector Roughen Points
ADBE Vector Temporal Freq
ADBE Vector Correlation
ADBE Vector Temporal Phase
ADBE Vector Spatial Phase
ADBE Vector Random Seed
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Wiggler
ADBE Vector Xform Temporal Freq
ADBE Vector Correlation
ADBE Vector Temporal Phase
ADBE Vector Spatial Phase
ADBE Vector Random Seed
ADBE Vector Wiggler Transform
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Filter - Zigzag Zig Zag
ADBE Vector Zigzag Size s10
ADBE Vector Zigzag Detail r5
ADBE Vector Zigzag Points pt1
+

Transforms

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Transform Group Transform
ADBE Anchor Pointa8 [0, 0]
ADBE PositionpHalf of the comp size
ADBE Position_0Split position X
ADBE Position_1Split position Y
ADBE Position_2Split position Z
ADBE Scales7 [1, 1]
ADBE Orientationor
ADBE Rotate Xrx
ADBE Rotate Yry
ADBE Rotate Zrzor just normal rotation 0
ADBE Opacityo7 1
ADBE Envir Appear in ReflectSingle float, probably a boolean?
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Transform Group Transform Shape
ADBE Vector Anchor Pointa
ADBE Vector Anchoraprobably an outdated name
ADBE Vector Positionp
ADBE Vector Scales[100, 100]
ADBE Vector Rotate Xrx
ADBE Vector Rotate Yry
ADBE Vector Rotate Zrzor just normal rotation
ADBE Vector Rotationr
ADBE Vector Skewsk
ADBE Vector Skew Axissa
ADBE Vector Group Opacityo100
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Vector Repeater TransformRepeater Transform
ADBE Vector Repeater Anchor Pointa
ADBE Vector Repeater Positionp
ADBE Vector Repeater Scales7
ADBE Vector Repeater Rotationr
ADBE Vector Repeater Start Opacityso7 1
ADBE Vector Repeater End Opacityso7 1
+

Effects

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Tint Tint Effectty=20
ADBE Fill Fill Effectty=21
ADBE Stroke Stroke Effectty=22
ADBE Tritone Tritone Effectty=23
ADBE Pro Levels2 Pro Levels Effectty=24
ADBE Drop Shadow Drop Shadow Effectty=25
ADBE Radial Wipe Radial Wipety=26
ADBE Displacement Map Displacement Map Effectty=27
ADBE Set Matte3 Set Matte Effectty=28
ADBE Gaussian Blur 2 Gaussian Blur Effectty=29
ADBE Twirl Twirl Effectty=30
ADBE MESH WARP Mesh Warp Effectty=31
ADBE Ripple Wavy Effectty=32
ADBE Spherize Spherize Effectty=33
ADBE FreePin3 Puppet Effectty=34
+ + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Effect Built In Params Marks a LIST tdgp with built-in effect properties
ADBE Effect Mask Opacity
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Paint Group Data for the paint effect
ADBE Paint Atom Contains the following properties
ADBE Paint Duration
ADBE Paint Shape
ADBE Paint Transform Same as other transform but match names starting with ADBE Paint
ADBE Paint Properties contains the following
ADBE Paint Clone Layer
+

Text

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text Properties Text Data
ADBE Text Document d
ADBE Text Path Options p
ADBE Text More Options m
ADBE Text Animators a
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text Animator Text Range
ADBE Text Selectors s(list)
ADBE Text Animator Properties a
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text Selector Text Range Selector
ADBE Text Percent Start s0
ADBE Text Percent End e100
ADBE Text Percent Offset o0
ADBE Text Index Start s
ADBE Text Index End e
ADBE Text Index Offset o
ADBE Text Range Advanced
ADBE Text Selector Max Amount a
ADBE Text Selector Smoothness sm
ADBE Text Levels Max Ease xe
ADBE Text Levels Min Ease ne
ADBE Text Random Seed rn
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text Animator Properties Text Style
ADBE Text Anchor Point 3D a
ADBE Text Position 3D p
ADBE Text Scale 3D s
ADBE Text Skew sk
ADBE Text Skew Axis sa
ADBE Text Rotation X rx
ADBE Text Rotation Y ry
ADBE Text Rotation r
ADBE Text Opacity o
ADBE Text Fill Color fc
ADBE Text Fill Opacity fo
ADBE Text Fill Hue fh
ADBE Text Fill Saturation fs
ADBE Text Fill Brightness fb
ADBE Text Stroke Color sc
ADBE Text Stroke Opacity so
ADBE Text Stroke Hue sh
ADBE Text Stroke Saturation ss
ADBE Text Stroke Brightness sb
ADBE Text Stroke Width sw
ADBE Text Line Spacing ls
ADBE Text Line Anchor
ADBE Text Track Type
ADBE Text Tracking Amount
ADBE Text Character Replace
ADBE Text Character Offset
ADBE Text Blur
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text Path Options Text Follow Path
ADBE Text Path m
ADBE Text Reverse Path r
ADBE Text Perpendicular To Path p
ADBE Text Force Align Path a
ADBE Text First Margin f
ADBE Text Last Margin l
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Text More Options Text Alignment Options
ADBE Text Anchor Point Option g1
ADBE Text Anchor Point Align a[0, 0]
ADBE Text Render Order 1
ADBE Text Character Blend Mode 1
+

Misc

+ + + + + + + + + + + + + + + +
Match NameDescriptionDefault
ADBE Group End Indicates the end of a LIST tdgp
+ + +

Notes

+
+
+
    +
  1. +

    Enumerations needs to be converted from floats, but the values match. 

    +
  2. +
  3. +

    Blend mode has different values than Lottie, see the section below for details. 

    +
  4. +
  5. +

    Needs to be converted from float to int

    +
  6. +
  7. +

    How to parse this? 

    +
  8. +
  9. +

    Colors are defined as 4 floats (ARGB) in [0, 255]. 

    +
  10. +
  11. +

    Colors defined as XML

    +
  12. +
  13. +

    You need to multiply by 100 to get the lottie value. 

    +
  14. +
  15. +

    For asset layers, the anchor point is relative to the size of the asset (eg: (0.5, 0.5) would be the center). 

    +
  16. +
+
+

Enumerations

+

Most enumerated values are the same in Lottie and AEP, this section lists the exceptions to this and enums not in lottie

+

Blend Mode

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAEPLottie
Normal10
Darken34
Multiply41
Color Burn57
Linear Burn6
Darker Color7
Lighten95
Screen102
Color Dodge116
Linear Dodge12
Lighter Color13
Overlay153
Soft Light169
Hard Light178
Linear Light18
Vivid Light19
Pin Light20
Hard Mix2116
Difference2310
Exclusion2411
Hue2612
Saturation2713
Color2814
Luminosity2915
+ + +

Label Colors

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameDefault Color
0None(shows as grey)
1Red#b4393b
2Yellow#e2d759
3Aqua#abcbc8
4Pink#e5bcca
5Lavender#a9aac9
6Peach#e5c19f
7Sea Foam#b4c7b4
8Blue#687fdd
9Green#4ea350
10Purple#8d3299
11Orange#e79228
12Brown#7e442c
13Fuchsia#f371d5
14Cyan#43a2a4
15Sandstone#a7967a
16Dark Green#203f1f
+

Text Render Oder

+
    +
  1. Per character palette
  2. +
  3. Fills over strokes
  4. +
  5. Strokes over fills
  6. +
+

Chunk Data

+

Note that chunks might have extra data after what is described here, +always parse exactly as many bytes as specified in the chunk header.

+

LIST

+

This chunk is defined by the RIFF specs, its data has the following format:

+

Starts with an id, specifying the type of the list, then followed by sub-chunks.

+

The format of specific LIST types are described later in this document.

+

Note that the LIST btdk doesn't conform to RIFF, +so take care to not read over the chunk length.

+

Utf8

+

Contains utf-8 encoded text. Sometimes it contains the string -_0_/- which (I guess) +is used as a placeholder for objects lacking a name.

+

tdsn / fnam / pdnm

+

Contains a Utf8 chunk, used for object names

+

tdmn

+

Contains a NUL-terminated string (You'll need to strip excess \0) and defines a Match Name.

+

cmta

+

Comment, NUL-terminated string. The size seems to be variable but rounded to 4 bytes.

+

fdta

+

Folder data.

+

cdta

+

Composition data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
X Resolution2uint16
Y Resolution2uint16
1
Time Scale2uint16How much Time values are scaled by
14
Playhead2TimePlayhead time
6
In Time2TimeSame as ip in Lottie
6
Out Time2TimeSame as op in Lottie
6
Comp duration2TimeDuration setting in AE
5
Color3bytesColor as 24 bit RGB
84
Attributes1Flags
Width2uint16Same as w in Lottie
Height2uint16Same as h in Lottie
Pixel Ratio Width4uint32
Pixel Ratio Height4uint32
12
Framerate2uint16Same as fr in Lottie
16
Shutter Angle2uint16
Shutter Phase4sint16
16
Samples Limit4sint16
Samples per frame4sint16
+

Note that End Time might have a value of FFFF, if that's the case assume it to be the same as Comp Duration.

+

The X/Y resolution represent a divisor of the size in that direction used for rendering. +For example a X Resolution of 5, with a width of 500 will yield an output of 100px.

+

The pixel ratio is represented as a fraction of width/height, if both values are 1 you get square pixels.

+

Attributes:

+
    +
  • Shy: (0, 0): Hides Shy layers from the timeline
  • +
  • Motion Blur: (0, 3): Allows layers to enable motion blur
  • +
  • Frame Blending: (0, 4): Allows layers to enable frame blending
  • +
  • Preserve Framerate: (0, 5): Something about nested render queues
  • +
  • Preserve Resolution: (0, 7): Something about nested render queues
  • +
+

ldta

+

Layer data, it seems that AE23 adds 4 extra 00 bytes at the end compared to older versions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Layer ID4uint32
Quality2uint160: Wireframe, 1: Draft, 2: Best
4
Stretch Numerator2uint16
1
Start Time2sint16Time offset for times withing the layer
6
In Time2TimeSame as ip in Lottie
6
Out Time2TimeSame as op in Lottie
6
Attributes3Flags
Source ID4uint32Item id for the used asset
17
Label Color Index1uint8Label Colors
2
Layer Name32string0It's repeated in the Utf8 chunk right after
11
Matte Mode1uint8
2
Stretch Denominator2uint16
19
Layer Type1uint8
Parent ID4uint32ID of the parent layer, if any
24
Matte Layer ID4uint32Id of the layer masking the current layer, if any (only for AE >= 23)
+

With the following Attributes:

+
    +
  • Guide: (0, 1) Guide layers aren't rendered
  • +
  • Bicubic Sampling: (0, 6)
  • +
  • Auto Orient: (1, 0)
  • +
  • Adjustment: (1, 1) Whether it's an adjustment layer
  • +
  • Threedimensional: (1, 2)
  • +
  • Solo: (1, 3) (UI thing, only displays that layer)
  • +
  • Null: (1, 7) Whether it's a null layer
  • +
  • Visible: (2, 0)
  • +
  • Effects: (2, 2)
  • +
  • Motion Blur: (2, 3)
  • +
  • Locked: (2, 5)
  • +
  • Shy: (2, 6) (Used to hide some layers in the AE UI)
  • +
  • Conitnuosly Rasterize (vector) / Collapse Transform (comps): (2, 7)
  • +
+

Layer Types:

+
    +
  • 0: Asset Layer
  • +
  • 1: Light Layer
  • +
  • 2: Camera Layer
  • +
  • 3: Text Layer
  • +
  • 4: Shape Layer
  • +
+

Matte Modes:

+
    +
  1. No Matte
  2. +
  3. Alpha
  4. +
  5. Inverted Alpha
  6. +
  7. Luma
  8. +
  9. Inverted Luma
  10. +
+

Time streching is defined as a fraction of Stretch Numerator / Stretch Denominator

+

idta

+

Item data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Type2uint16
14
ID4uint32ID used to reference this item
38
Label Color1uint8Label Colors
+

The Type field above can have the following values:

+
    +
  • 1: Folder
  • +
  • 4: Composition
  • +
  • 7: Footage
  • +
+

The last 2 bytes of this field seem to change every time you make a change.

+

tdb4

+

Property metadata.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
2Always db 99?
Components2uint16Number of values in a multi-dimensional
Attributes2Flags
1
1Some sort of flag, it has value 03 for position properties
2
2
2Always 0000 ?
22nd most significant bit always on, perhaps some kind of flag
8float64Most of the time 0.0001
8float64Most of the time 1.0, sometimes 1.777
8float64Always 1.0?
8float64Always 1.0?
8float64Always 1.0?
Type?4FlagsSee below
1Seems correlated with the previous byte, it's set for 04 for enum properties
7Bunch of 00
Animated1Set to 1 when animated, kinda the reverse of the Static bit in Attributes
7Bunch of 00
4Usually 0, probs flags
4Mst likely flags, only last byte seems to contain data
8float64Always 0.0?
8float64Mostly 0.0, sometimes 0.333
8float64Always 0.0?
8float64Mostly 0.0, sometimes 0.333
4Probs some flags
4Probs some flags
+

Attributes:

+
    +
  • Position: (1, 3). When true, this is a position property, which changes how animated values are parsed.
  • +
  • Static: (1, 0). When false, the property is animated and it will have a cdat.
  • +
+

Types:

+
    +
  • No Value: (1, 0). Used for properties like shapes, gradients, etc, where the values are not in the keyframe.
  • +
  • Integer: (3, 2).
  • +
  • Vector?: (3, 3).
  • +
  • Color: (3, 0). Set for color properties (they have a different keyframe format).
  • +
+

For Integer type, you might have indexed values: +For layers, the value will be in tdpi / tdps, +for masks it will be in tdli.

+

cdat

+

Property static value.

+

For multi-dimensional properties, you look at the number of components in tdb4 +and parse that many float64, that's the value of the property.

+

shph

+

Header for bezier shape data, contained within LIST shap.

+

It's followed by a LIST list with bezier data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
3
Attributes1Flags
Top Left2float32Top-left corner of the shape area, relative to the layer position
Bottom Right2float32Bottom-right corner of the shape area, relative to the layer position
4
+

Flags:

+
    +
  • Open: (0, 3). When true, the shape is open (it's missing the segment connecting the last point to the first)
  • +
+

lhd3

+

Inside a LIST list, defines the data format, followed by ldat.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
4Seems to always be 00 d0 0b ee
6All 00
Count2uint16Number of items
4The last byte is the only one that changes, greatest variation is on shapes
2All 00
Item Size2uint16Size of an item in the list
3All 00
Type?1
400 00 00 01
2All 00
2Some kind of flags
20All 00
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Item TypeSizeType
Gide00 0102
LItm00 8001
LRdr08 c601
Color Kf00 9804
1D Kf00 3004
2D Kf00 5804
2D pos Kf00 6804
3D Kf00 8004
3D pos Kf00 8004
Marker Kf00 1004
Orientation Kf00 5004
No Value Kf00 4004
+

The corresponding ldat should have Item Size * Count bytes, and it's omitted if Count is 0.

+

ldat

+

Inside a LIST list, contains the list data, preceded by lhd3.

+

The number of element is the one defined in lhd3.

+

It has a different format based on certain conditions, follow some of the possible element formats.

+

The size of an item is found like so:

+
item_size = ldat_chunk_length / lhd3_count
+
+

Keyframe (common)

+

All keyframe items start like this:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
1
Time2TimeTime of the keyframe, seems they always start from 0.
2
Ease Mode1uint8
Label Color1uint8Label Colors
Attributes1Flags
+

Ease Mode: +1. Linear +2. Ease +3. Hold

+

Attributes:

+

Least significant 3 bits seems to always be on.

+
    +
  • Continuous Bezier (0, 3)
  • +
  • Auto Bezier (0, 4)
  • +
  • Roving across time (0, 5)
  • +
+

Keyframe - Multi-Dimensional

+

Given n as the number of dimensions found in tdb4 (eg: 3 for 3D positions):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Value8* nfloat64[n]Value
In Speed8* nfloat64[n]
In Influence8* nfloat64[n]
Out Speed8* nfloat64[n]
Out Influence8* nfloat64[n]
+

Keyframe - Position

+

If the property is an animated position, the keyframe is formatted like so:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
8
8float64
In Speed8float64
In Influence8float64
Out Speed8float64
Out Influence8float64
Value8* nfloat64[n]Value
Tan In8* nfloat64[n]Spatial tangents
Tan Out8* nfloat64[n]Spatial tangents
+

Keyframe - No Value

+

Used for shapes and gradients (Special set in tdb4)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
8
8float64
In Speed8float64
In Influence8float64
Out Speed8float64
Out Influence8float64
8
+

Keyframe - Color

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
8
8float64
In Speed8float64
In Influence8float64
Out Speed8float64
Out Influence8float64
Value8*4float64[4]ARGB 255
8*8float64[8]
+

Shape Data

+

Bezier data, positions are relative to the area defined by shph.

+

The list is a sequence of points, appearing in this order:

+
    +
  • Vertex 0
  • +
  • Out Tangent 0
  • +
  • In Tangent 1
  • +
  • Vertex 1
  • +
  • Out Tangent 1
  • +
  • ...
  • +
+

Note that all coordinates are relative to the area in shph but not to each other.

+

A coordinate of [0, 0] will correspond to the top-left corner in shph, +and [1, 1] corresponds to the bottom-right.

+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
X4float32X Coordinate
XY4float32X Coordinate
+

pprf

+

Color profile information as ICC data.

+

fiac

+

Folder item active, uint8 if it's 1 the previous List Item is the active item.

+

wsnm

+

Worspace name.

+

Utf-16 encoded string, contains the name of the "workspace" (window layout in AE)

+

It's always followed by an Utf8 with the same content.

+

tdum / tduM

+

float64 values often found inside LIST tdbs.

+

In some cases they seem to indicate minimum and maximum values for that +property but there are some cases in which they are both 0.0.

+

ppSn

+

Contains a float64, unknown meaning.

+

otda

+

Orientation data

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
X8float64X Coordinate
Y8float64Y Coordinate
Z8float64Z Coordinate
+

opti

+

Asset data, format depends on type

+ + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Type4stringAsset type
+

Solid

+

Type Soli, data for solid layers.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
6
Alpha4float32
Red4float32
Green4float32
Blue4float32
Name256string0
+

Color components are in [0, 1].

+

sspc

+

Footage / asset data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
32
Width2uint16
2
Height2uint16
+

alas

+

JSON string containing external asset info.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
ascendcount_basenumber
ascendcount_targetnumber
fullpathstringThe absolute path to the file
platformnumberOperating system (see below)
server_namestringHostname (?)
server_volume_namestring
target_is_folderbooleanWhether the file is a folder
+

platform values: 1 is Windows, other values are for Unix and MacOS, +but the values are to be discovered

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
AE Version?6
12
File Revision?2uint16Increases by 2 every time you save
+

Seems the first 6 bytes contain AE version information.

+

I haven't been able to decode it fully but here's a list of values +encountered in the wild:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersionBytes
15.05c 06 07 38 06 b4
16.05d 04 0b 00 06 eb
16.0.15d 04 0b 00 0e 30
16.1.25d 05 0b 00 96 37
16.1.35d 05 0b 00 9e 05
17.05d 09 4b 08 06 2b
17.0.45d 0b 0b 08 26 3b
18.2.15d 1b 0b 11 0e 08
18.45d 1d 0b 12 06 26
22.05d 1d 0b 70 06 6f
22.65d 2b 0b 33 06 3b
23.2.15e 03 0b 39 0e 03
+

It's possible the 3rd to the 5th bytes encode some kind of internal build +number that gets mapped to AE versions somehow...

+

EfDC

+

The first byte contains the number of LIST EfDf in a LIST EfdG

+

parn

+

Contains a uint64 with the number of parameters in a LIST parT.

+

pard

+

Effect parameter definition.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
15
Type1uint8Parameter type
Name32string0
8
+

Types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type NameAEPLottieLottie Object
Layer010Effect Value Layer
Scalar20Effect Value Slider
Angle31Effect Value Angle
Boolean44Effect Value Checkbox
Color52Effect Value Color
2D63Effect Value Point
Enum77Effect Value Drop Down
Paint Group9
Slider100Effect Value Slider
Group135Custom Effect
Unknown156Effect No Value
3D183Effect Value Point
+

After the data above, there is more data that depends on the type

+

Layer

+

Doesn't seem to have much data

+

Scalar / Angle

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last value4sint32
4
64
4
Min Value2sint16
2
Max Value2sint16
+

To get the last value, you need to divide the raw value by 0x10000.

+

Boolean

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last used value4uint32
Default1uint8
3
64
4float32
4
4float32
+

Color

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last used value4uint8[4]ARGB
Default4uint8[4]ARGB
64
Max Value4uint8[4]ARGB
+

2D

+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last value X4sint32
Last value Y4sint32
+

Last value x/y are multiplied by 0x80, so divide them to get the right value.

+

Enum

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last used value4uint32
Option count2uint16
Default2uint16
+

Slider

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last used value8float64
44
4float32
4
Max Value4float32
+

3D Point

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameSizeTypeDescription
Last value X8float64
Last value Y8float64
Last value Z8float64
+

You need to multiply the "Last value" components by 512 to get the actual values.

+

pdnm

+

Effect parameter definition name / strings.

+

This will contain strings used by the widget in the effect controls of the preceding pard.

+

For example if the type in the pard is 4 (Boolean) the name of the parameter might be +empty and it will be in pdnm as that's how AE displays it.

+

For Enum (type 7), you get the drop down strings separated by |.

+

tdpi

+

Layer index for index properties (uint32).

+

tdps

+

Layer source for index properties (sint32).

+
    +
  • 0: Layer
  • +
  • -1: Effects & Masks
  • +
  • -2: Masks
  • +
+

tdli

+

Mask index for index properties (uint32).

+

prin

+

Seems to always have the same content:

+

4 00 bytes, the string ADBE Escher, 37 00, the string Classic 3D, +41 00, and ends with 01.

+

prda

+

Seems to always have the same content: 3 00, a 01, 8 00.

+

NmHd

+

Marker attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameSizeTypeDescription
3
Attributes1Flags
Duration4uint32Duration in frames
4
Label Color1uint8Label Colors
+

Flags:

+
    +
  • Protected: (0, 1) The marker signals a protected region
  • +
  • ???: (0, 2) This flags seems to always be on
  • +
+

tdsb

+

4 bytes specifying flags for a tdgp.

+
    +
  • 0x00'00'00'01 - object is visible
  • +
  • 0x00'00'00'02 - split position
  • +
  • 0x00'00'20'00 - locked x/y ratio
  • +
+

mkif

+

Mask properties.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameSizeType
Inverted1uint8
Locked1uint8
4
Mode2uint16
+

Mask Modes:

+
    +
  • 0: None
  • +
  • 1: Add
  • +
  • 2: Subtract
  • +
  • 3: Intersect
  • +
  • 4: Darken
  • +
  • 5: Lighten
  • +
  • 6: Difference
  • +
+

CCId

+

Composition ID for essential graphics properties (uint32)

+

CLId

+

Layer ID for essential graphics properties (uint32)

+

Smin

+

Essential graphics slider minimum value.

+

Representation depends on the value of the previous CTyp.

+

Smax

+

Essential graphics slider maximum value.

+

Representation depends on the value of the previous CTyp.

+

CVal

+

Essential graphics property current value.

+

Representation depends on the value of the previous CTyp.

+

CDef

+

Essential graphics property default value.

+

Representation depends on the value of the previous CTyp.

+

CTyp

+

uint32 with the essential graphics item type

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeValue Format
Scalar2float64
Color4float32[4] RGBA
Position5float64[2]
Comment8
Vector9float64[4]
Group10
Enum13uint32
+

CprC

+

Essential graphics flags (4bytes)

+
    +
  • Is property (3, 0)
  • +
+

StVS

+

Essential graphics group item count

+ + + + + + + + + + + + + + + + + + + + +
NameSizeType
Count1uint8
3
+

CDim

+

uint32 number of dimensions for an essential vector property.

+

fips

+

Contained in LIST Fold contains preview settings. +The chunk is repeated multiple times but only the first one seems +to be relevant.

+ + + + + + + + + + + + + + + + + + + + +
NameSizeType
15
Flags1uint8
+

Flags

+
    +
  • Show alpha grid (0, 7)
  • +
+

LIST Fold

+

Top level item.

+

LIST Item

+

Item, you can check its properties with idta contained inside it.

+

LIST Layr

+

Defines a layer.

+

Layer metadata is found in a ldta, the layer name is in a Utf8.

+

Go through its LIST tdgp to get shapes and transforms.

+

You will find the following match names within it:

+
    +
  • ADBE Root Vectors Group: Contains shape data (shape layer in lottie)
  • +
  • ADBE Camera Options Group: Lottie camera layer
  • +
  • ADBE Transform Group: Layer transform
  • +
  • ADBE Layer Styles: Layer styles
  • +
+

LIST tdgp

+

Defines an object / property group.

+

Flags for the objects are in tdsb.

+

The name of the object is in tdsn > Utf8.

+

Then follows a sequence of properties / objects defined as such:

+

tdmn specifies the match name of the object, then it's followed by +chunks that describe said object (usually more LISTs).

+

Usually the last chunk here is a tdmn with value ADBE Group End.

+

LIST tdbs

+

Defines an object's property. To know which property, you need to +check the tdmn preceding this chunk.

+

It will contain a tdb4, and usually cdat (static) or a List list (animated).

+

For properties with expressions, it will have a Utf8 with the expression code.

+

LIST GCst

+

Defines a gradient.

+

Contains a LIST tdbs and a LIST GCky.

+

LIST GCky

+

Gradient color keyframes.

+

Contains a sequence of Utf8 formatted in XML with the gradient definition +for each keyframe.

+

LIST om-s

+

Contains a LIST tdbs and a LIST omks to define a shape property.

+

LIST omks

+

Bezier shape data.

+

Contains a sequence of LIST shap with the shape data for each keyframe.

+

LIST shap

+

Contains a shph and a LIST list with the shape data.

+

LIST CPPl

+

Contains a pprf.

+

LIST list

+

For animated properties it replaces cdat.

+

The list header is defined in the chunk lhd3, the list data in ldat.

+

LIST SLay / LIST DLay / LIST CLay

+

They seem to be camera layers used to store internal views, not exported to lottie.

+

SLay (Side views?) have names like "Top" and "Front", perhaps they define 3d views.

+

CLay: Custom views.

+

DLay: Default views.

+

LIST SecL

+

Composition Markers Layer.

+

Contains ldta and like other layers.

+

in LIST tbgp look for the match name ADBE Marker, the data is in +the LIST mrst.

+

LIST mrst

+

Marker property.

+

Contains a LIST tdbs that defines the property, which should always be animated +when present.

+

Marker keyframe values are available in LIST mrky.

+

LIST mrky

+

Marker keyframes.

+

contains a LIST Nmrd for each keyframe

+

LIST Nmrd

+

Marker data

+

There's a NmHd with the attributes.

+

The marker comment is in the first Utf8

+

LIST otst

+

Orientation property.

+

Contains a LIST tdbs and a LIST otky to define a shape property.

+

LIST otky

+

Contains a sequence of otda with the orientation data for each keyframe.

+

LIST Als2

+

Contains alas for external assets.

+

LIST Sfdr

+

Asset folder contents, contains several LIST Item.

+

LIST btdk

+

For some reason this doesn't conform to the RIFX specs, instead of a list +its data is encoded in Carousel Object Structure (COS).

+

The COS format is the same used in PDF but it's extremely difficult to +find detailed information on it, the best technical specs is this very old +PDF 1.7 specification.

+

Once you parse the COS, you can find the following data:

+
    +
  • 0.1.0: Array of available fonts:
      +
    • 0.99: CoolTypeFont
    • +
    • 0.0.0: Font family (seems to have bold/italic encoded in the name)
    • +
    • 0.0.2: 0 or 1?
    • +
    +
  • +
  • 1.1: Array of text documents (one for each keyframe) in this format:
      +
    • 0.0: Text
    • +
    • 0.5.0: Array of paragraph styles
        +
      • 0.0.5 Paragraph Style:
          +
        • 0: Text align (0: left, 1: right, 2: center)
        • +
        +
      • +
      • 1: Length (in characters) the style applies to
      • +
      +
    • +
    • 0.6.0: Array of character styles:
        +
      • 0.0.6: Character Style:
          +
        • 0: Index of the font from the array of available fonts
        • +
        • 1: Font size
        • +
        • 2: Faux Bold
        • +
        • 3: Faux Italic
        • +
        • 12: 0: Normal, 1: Small caps, 2: All caps
        • +
        • 13: 0: Normal, 1: Superscript, 2: Subscript
        • +
        • 53.0.1: Fill color in ARGB [0, 1]
        • +
        • 54.0.1: Stroke color in ARGB [0, 1]
        • +
        • 57: Stroke enabled
        • +
        • 58: Stroke over fill
        • +
        • 63: Stroke width
        • +
        +
      • +
      • 1: Length (in characters) the style applies to
      • +
      +
    • +
    +
  • +
+

LIST sspc

+

Effect Definiton.

+

The generic effect name is in fnam > Utf8.

+

The effect parameters are defined in LIST parT. +If the effect type has already been encountered, you might not find the +LIST parT here, you might need to match the name to an entry in LIST EfdG.

+

It finally contains a LIST tdgp where the effect properties are present +like any other animated property. You can also find the name +of the effect object in fnam > Utf8.

+

Inside there you can also find a match name with ADBE Effect Built In Params +which will contain values for built-in effect parameters.

+

LIST parT

+

Effect parameters.

+

Contains a parn with the number of parameters, then follows +a list of tdmn with the match name of the parameter followed by +pard with its definition.

+

Enum parameters have their values in a pdnm separated by | pipes.

+

The first property seems to be a dummy?

+

LIST EfdG

+

Effect definitions.

+

This is where effect types used by the project are defined.

+

Basically it repeats the first instance of any effect found in the layers.

+

it contains a EfDC with the number of effects, and that many LIST EfDf.

+

LIST EfDf

+

Effect type definition.

+

Contains a tdmn with the match name of the effect and a LIST sspc.

+

LIST ExEn

+

Contains a Utf8 with the expression language (eg: javascript-1.0).

+

LIST PRin

+

Contains a prin and a prda.

+

LIST Pin

+

Asset properties.

+

Contains:

+
    +
  • sspc with some common properties
  • +
  • Utf8 with the name (except for solids)
  • +
  • opti with asset data
  • +
+

LIST CIF0

+

See LIST CIF3.

+

LIST CIF2

+

See LIST CIF3.

+

LIST CIF3

+

Essential Graphics Definition.

+

LIST CCtl

+

Essential graphics item.

+

LIST CpS2

+

Essential graphics header.

+

LIST StVc

+

Essential graphics group items

+

LIST CPrp

+

Essential graphics property definition

+

LIST OvG2

+

Essential graphics override property identifiers

+

LIST CPrp

+

Essential graphics override property identifier

+

LIST LRdr

+

Render queue data. this is a top-level chunk. Items are stored in LIST LItm.

+

LIST LItm

+

Render Queue items, contains a sequence of LIST list and +LIST LOm, the latter having information on the render item (one per job).

+

LIST LOm

+

Render list item, contains the following chunks:

+
    +
  • Roou Output options?
  • +
  • Ropt Render options?
  • +
  • LIST Als2 Selected output file
  • +
  • Utf8 Name of the template applied to the item
  • +
  • Utf8 File name template
  • +
+

Gradient XML

+

Gradient data seems to be stored in a convoluted XML structure.

+

The easiest way to describe it is as a mapping, the elements can be parsed like so:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameLogical TypeDescription
prop.mapTop-level, just get its first child
prop.listdictMapping of key-value pairs
prop.pairItem in prop.list
keystrProperty key
arraylistArray of values, the first item is array.type which specifies the type
intint
floatfloat
stringstr
+

If you interpret the XML as a mapping, you can gather the following info:

+
{
+    "Gradient Color Data":
+    {
+        "Alpha Stops":
+        {
+            "Stops List":
+            {
+                "Stop-0":
+                {
+                    "Stops Alpha":
+                        [
+                            0.0, // offset
+                            0.5, // midpoint
+                            1.0  // alpha
+                        ]
+                },
+                // More stops defined the same way...
+            }
+            "Stops Size": 2 // Number of stops
+        },
+        "Color Stops":
+        {
+            "Stops List":
+            {
+                "Stop-0":
+                {
+                    "Stops Color":
+                    [
+                        0.0, // offset
+                        0.5, // midpoint
+                        0.0, // red
+                        0.0, // green
+                        0.5, // blue
+                        1.0  // alpha?
+                    ]
+                },
+                // More stops defined the same way...
+            }
+            "Stops Size": 2 // Number of stops
+        }
+    },
+    "Gradient Colors": "1.0" // Version?
+}
+
+

Midpoint

+

You should use the "midpoint" values to add an additional color which is halfway between the other two.

+

For example given these stops:

+
    "Stop-0":
+    {
+        "Stops Color":
+        [
+            0.0, // offset
+            0.5, // midpoint
+            0.1, // red
+            0.2, // green
+            0.3, // blue
+            1.0  // alpha?
+        ]
+    },
+    "Stop-0":
+    {
+        "Stops Color":
+        [
+            0.6, // offset
+            0.5, // midpoint
+            0.3, // red
+            0.4, // green
+            0.5, // blue
+            1.0  // alpha?
+        ]
+    },
+
+

The final gradient will look like this:

+
[
+    // stop 0
+    0.0, // offset_0
+    0.1, // red_0
+    0.2, // green_0
+    0.3, // blue_0
+    // midpoint stop
+    0.3, // offset_0 * (1 - midpoint_0) + offset_1 * midpoint_0
+    0.2, // (red_0 + red_1) / 2
+    0.3, // (green_0 + green_1) / 2
+    0.4, // (blue_0 + blue_1) / 2
+    // stop 1
+    0.6, // offset_1
+    0.5, // midpoint_1
+    0.3, // red_1
+    0.4, // green_1
+    0.5, // blue_1
+]
+
+

Opacity

+

For some reason in AE gradients alpha is independent from the color, so you have separate stops for +color and opacity.

+

You should treat the midpoint value for opacity stops in a similar way as to the color ones.

+

Once you have both the color and opacity values, the final lottie array is simply a concatenation of the two.

+

XMP Metadata

+

After the RIFX data, an AEP file also contains some XML in the +XMP format.

+

This section contains the version of AfterEffects, when the file has been +created and modified, and related info.

+

XML Project Format

+

Aftereffects allows you to save the project as XML.

+

This is basically as the RIFX but with a different container format and +binary data encoded as hex.

+

Conversion notes for elements are provided below

+

AfterEffectsProject

+

Root element, same as RIFX.

+

ProjectXMPMetadata

+

In the RIFX file this is dumped at the end without a chunk.

+

string

+

Used instead of Utf8.

+

numS / ppSn

+

For some reason they have their value in a <string> but are not string in the RIFX.

+

tdsn / fnam / pdnm

+

These elements contain children but they are not LIST in RIFX, that's the only thing of note.

+

Child elements

+

If an element has children. it's the same as the equivalent LIST in RIFX.

+

bdata

+

Elements with the bdata attribute have their binary data hex encoded in said attribute.

+

You can parse their data the same way as you'd do in RIFX.

+

Resources

+
+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/animation/index.html b/animation/index.html new file mode 100644 index 00000000..e524262c --- /dev/null +++ b/animation/index.html @@ -0,0 +1,728 @@ + + + + + + + + + + + + + + Animation - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Animation

+

This is the top-level JSON object, describing the document, layers, assets, etc.

+

The size of the canvas is determined by w and h. Duration is expressed in frames with op, and the framerate is in fr.

+

Most of the contents are in layers and assets.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
layersarray of Precomposition Layer or Solid Color Layer or Image Layer or Null Layer or Shape Layer or Text Layer or Audio Layer or Camera Layer or Data Layer +

An array of layers (See: Lists of layers and shapes)

+
nmstring +

Name, as seen from editors and the like

+
mnstring +

Match name, used in expressions

+
assetsarray of Image or Precomposition or Sound or Data source +

An array of assets

+
vstring +

Lottie version, on very old versions some things might be slightly different from what is explained here

+
ddd0-1 integer +

Whether the animation has 3D layers. Lottie doesn't actually support 3D stuff so this should always be 0

+
frnumber +

Framerate in frames per second

+
ipnumber +

"In Point", which frame the animation starts at (usually 0)

+
opnumber +

"Out Point", which frame the animation stops/loops at, which makes this the duration in frames when ip is 0

+
winteger +

Width of the animation

+
hinteger +

Height of the animation

+
compsarray of Precomposition +

List of Extra compositions not referenced by anything

+
fontsFont List +

Fonts

+
charsarray of Character Data +

Data defining text characters as lottie shapes. If present a player might only render characters defined here and nothing else.

+
metaMetadata +

Document metadata

+
metadataUser Metadata +

User Metadata

+
markersarray of Marker +

Markers defining named sections of the composition.

+
mbMotion Blur +

Motion Blur

+
slotsobject +

Available property overrides

+
+
+

Metadata

+

Some (but not all) lottie files will have a metadata object describing the +program used to create the file and other useful information:

+

Document Metadata

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
astring +

Author

+
dstring +

Description

+
tcstring +

Theme Color

+
gstring +

Software used to generate the file

+
+
+

User Metadata

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
filenamestring +

Filename

+
customPropsobject +

Custom Properties

+
+
+

Motion Blur

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
sanumber +

Angle in degrees

+
spnumber +

Angle in degrees

+
spfnumber +

Samples per Frame

+
aslnumber +

Adaptive Sample Limit

+
+
+

Marker

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cmstring +

Comment

+
tmnumber +

Time

+
drnumber +

Duration

+
+
+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/index.html b/assets/index.html new file mode 100644 index 00000000..d47939e1 --- /dev/null +++ b/assets/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + + Assets - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Assets

+

Assets are usually referenced by layers of the appropriate type.

+

Image

+

Represents a (static) image

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
idstring +

Unique identifier used by layers when referencing this asset

+
nmstring +

Human readable name

+
ustring +

Path to the directory containing a file

+
pstring +

Filename or data url

+
e0-1 integer +

Whether the file is embedded

+
wnumber +

Width of the image

+
hnumber +

Height of the image

+
tstring = 'seq' +

Marks as part of an image sequence if present

+
sidstring +

One of the ID in the file's slots

+
+
+

If the image is embedded, u is empty and p contains a base64-encoded data url:

+
{
+    "id": "my image",
+    "h": 512,
+    "w": 512,
+    "e": 1,
+    "u": "",
+    "p": "data:image/png;base64,..."
+}
+
+

If the image is not embedded, +u will contain the path to the directory containing the image +and p will have the filename.

+

So for example if you want to store the image at /path/to/images/image.png, +the asset will look something like this:

+
{
+    "id": "my image",
+    "h": 512,
+    "w": 512,
+    "e": 0,
+    "u": "/path/to/images/",
+    "p": "image.png"
+}
+
+

It works similarly for external images. +If you want to store the image at https://example.com/images/image.png, you'd have:

+
{
+    "id": "my image",
+    "h": 512,
+    "w": 512,
+    "e": 0,
+    "u": "https://example.com/images/",
+    "p": "image.png"
+}
+
+

Sound

+

Similar to Image but for audio files.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
idstring +

Unique identifier used by layers when referencing this asset

+
nmstring +

Human readable name

+
ustring +

Path to the directory containing a file

+
pstring +

Filename or data url

+
e0-1 integer +

Whether the file is embedded

+
+
+

Precomposition

+

You can think of precompositions as self-contained animation within the +main animation file that can be referenced using precomp layers.

+

Within a precomposition you can have precomp layers showing other precompositions, +as long as you don't create a dependency cycle.

+

You can find more details in the Precompositions page.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
layersarray of Precomposition Layer or Solid Color Layer or Image Layer or Null Layer or Shape Layer or Text Layer or Audio Layer or Camera Layer or Data Layer +

An array of layers (See: Lists of layers and shapes)

+
idstring +

Unique identifier used by layers when referencing this asset

+
nmstring +

Human readable name

+
frnumber +

Framerate in frames per second

+
xt0-1 integer +

Extra composition

+
+
+

Follows a rather extreme example, that uses precompositions inside precompositions to generate a fractal:

+

+

+
+
+
+
+ +
+

+

Data Source

+

Points to a JSON file for data.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
idstring +

Unique identifier used by layers when referencing this asset

+
nmstring +

Human readable name

+
ustring +

Path to the directory containing a file

+
pstring +

Filename or data url

+
e0-1 integer +

Whether the file is embedded

+
tinteger = 3 +

Type

+
+
+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/breakdown/bezier/index.html b/breakdown/bezier/index.html new file mode 100644 index 00000000..851eab39 --- /dev/null +++ b/breakdown/bezier/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + + Bezier Curves - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Bezier Curves

+

+

+
+
+
+
+ +
+

+

Introduction to Beziers

+

Bezier curves are a common way of approximating arbitrary shapes in computer graphics.

+

They represent an arc of a polynomial, and they can be of any degree, but usually you will mostly find quadratic and cubic beziers.

+

Lottie only deals in cubic beziers so we'll focus on those.

+

A bezier curve of degree n is defined by n+1 points.

+

The first and the last of such points will lay on the curve, while the others define the shape of the segment.

+

So for the case of a cubic bezier (degree 3) you have 4 points.

+

To find a point on a bezier, you usually define it as the result of an interpolation +within the polynomial curve. The interpolation factor is usually referred to as t.

+

The easiest way of calculating the poition of a point in a bezier given a t is to +perform linear interpolations between the bezier points, each step reducing the +curve to one with a degree less than the previous, until you end up with a final point.

+

For example in the cubic case, you interpolate each cubic point with the next, +resulting in 3 quadratic points.

+

You repeat the process on these 3 points, and you end up with 2 other points.

+

Finally you perform linear interpolation between the two to get the result.

+

In the example below you can control the t value to see how this algorithm works. +The black dots are the ones that define the bezier, and the red dot is the position +along the bezier at the given t.

+
+ + + + + +
0.5
+
+
+
+
+ +
+

Poly Beziers

+

Usually shapes are defined as a polybezier, which is the a concept equivalent to +polygons, but with bezier segments as their edges.

+

Each bezier segment has its last point in the same position as the first point in the following segment.

+

This results in a sequence of points, some of which are along the line and some of which +are not.

+

For polybeziers with cubic segments, there are two points outside the path between each pair of points along the path.

+

For this reason instead of viewing the polybezier as a sequence of bezier segments, +they are often seen as a sequence of vertices and tangents.

+

The vertices are the points along the path, which correspond to the end points of the segments.

+

Each point has two tangents associated with them, one "in" thangent, and one "out" tangent.

+

The "out" tangent is the second point defining the bezier segment following the vertex +and the "in" tangent is the third point defining the bezier segment coming into the vertex.

+

Beziers in Lottie

+

An shape in Lotttie is represented as a cubic polybezier and it's represented in the JSON +as an object with the following attributes:

+

v is an array of vertices.

+

i is an array of "in" tangent points, relative to v.

+

o is an array of "out" tangent points, relative to v.

+

c is a boolean determining whether the polybezier is closed. +If it is, there's an additional bezier segment between the last point in v and the first.

+
+
+ + +
+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/breakdown/bouncy_ball/index.html b/breakdown/bouncy_ball/index.html new file mode 100644 index 00000000..13b429b0 --- /dev/null +++ b/breakdown/bouncy_ball/index.html @@ -0,0 +1,866 @@ + + + + + + + + + + + + + + Bouncy Ball - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Bouncy Ball

+

This page will show the basics of Lottie by inspecting this simple animation:

+

+

+
+
+
+
+ +
+

+

Note that Lottie files usually have their JSON minified, but the example files +here have been expanded for ease of inspection.

+

This dissection is not meant to be a complete description, so certain attributes +will not be described but each section will have links to the relevant reference +pages where you can find a description for those.

+

Top level

+

The top level object, describes the animation as a whole.

+
{
+    "nm": "Bouncy Ball",
+    "v": "5.5.2",
+    "ip": 0,
+    "op": 120,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "layers": [
+        ...
+    ]
+}
+
+

Here we see the basic properties:

+

nm is the name of the document, it's not actually used by players.

+

v shows the Lottie format version, some older files might have a slightly different structure.

+

fr is the framerate in frames per second. +Note that most timing information is described in frames within Lottie, +so changing the framerate means the duration of the animation will also change.

+

op is the last frame of the animation, after which the animation will loop or stop, +depending on how the player is set up. +In this case 120 frames at 60 fps will result in 2 seconds of animation.

+

ip marks the first frame of the animation, usually it's set to 0.

+

w and h describe the width and height of the animation, +any content outside the box starting at (0, 0) and ending at (w, h) will not be visible.

+

Note that a lottie file is a vector format and can be scaled up and down. +So you shouldn't think of these values as a size in pixels.

+

Layers

+

Now we look at the layers.

+

Most file will be more complex than this and have multiple layers but here we only have one:

+
 {
+    "ddd": 0,
+    "ty": 4,
+    "ind": 0,
+    "st": 0,
+    "ip": 0,
+    "op": 120,
+    "nm": "Layer",
+    "ks": {
+        ...
+    },
+    "shapes": [...]
+}
+
+

We see the layer can also have a name (nm).

+

You might note that ip and op have the same values as in the animation. +This means the layer will always be visible. +You can decide to show a layer only for a small amount of time, in which case +you would set ip to the first frame the layer should be visible at and +op to the last frame, and the layer will only be visible between those frames.

+

ddd is a boolean value that indicates whether this layer contains 3D elements.

+

ty is the layer type. In this case it's a shape layer.

+

Finally ind is a unique number used to reference this layer. +Here it's not being used since there is only one layer.

+

Layer transform

+

Here we'll have a look at the ks attribute of the layer that represents its transform:

+
{
+    "a": {
+        "a": 0,
+        "k": [
+            0,
+            0
+        ]
+    },
+    "p": {
+        "a": 0,
+        "k": [
+            0,
+            0
+        ]
+    },
+    "s": {
+        "a": 0,
+        "k": [
+            100,
+            100
+        ]
+    },
+    "r": {
+        "a": 0,
+        "k": 0
+    },
+    "o": {
+        "a": 0,
+        "k": 100
+    }
+}
+
+

This layer does not have any transform so everything is at its default value. +(If you see a transform missing some attributes, you can assume they have the values above)

+

You might have noticed that all the attributes of the transform are objects with the same structure.

+

This is because they are animatable properties. +In this case they don't have any animations applied to them so a is 0 and k is the actual value.

+

If they were animated, a would be 1 and k would have a list of keyframes (more on this later).

+

The animated properties of a transform are as follows:

+

a is the anchor point along which other transformations are applied (you can think of it as the center of rotation).

+

p is the position (translation). Both a and p have arrays as values representing 2D coordinates.

+

s is the scale and, similar to a and p, its value has 2 components. +Note that values are expressed as percentages (100 meaning 100% or no scaling).

+

r is the rotation angle in degrees.

+

o is opacity, similar to s, it also is expressed as a percentage.

+

You might also find sk and sa in a transform object, determining the skew.

+

Shapes

+

Since this is a shape layer, it contains a list of shapes.

+

In this case there is only one shape:

+
{
+    "ty": "gr",
+    "nm": "Ellipse Group",
+    "it": [ ... ]
+}
+
+

ty represents the type of the shape, in this case it's a group, +which is simply a shape that contains other shapes.

+

Groups add another layer of organization: you have layers at the top, +shape layers can contain group shapes, and groups can contain other groups.

+

nm is the name, same as before.

+

it is the list of shapes within the group, we will inspect them one by one

+

Ellipse

+
{
+    "ty": "el",
+    "nm": "Ellipse",
+    "p": {
+        "a": 0,
+        "k": [
+            204,
+            169
+        ]
+    },
+    "s": {
+        "a": 0,
+        "k": [
+            153,
+            153
+        ]
+    }
+}
+
+

The first shape in the group is an ellipse (denoted by "ty": "el").

+

It has two properties: position (p) and size (s).

+

The position determines the center of the ellipse and size its two axes. +In this case we can tell it's a circle since both values in s are the same.

+

Fill

+
{
+    "ty": "fl",
+    "nm": "Fill",
+    "o": {
+        "a": 0,
+        "k": 100
+    },
+    "c": {
+        "a": 0,
+        "k": [
+            0.710,
+            0.192,
+            0.278
+        ]
+    },
+    "r": 1
+}
+
+

An ellipse by itself doesn't actually draw anything. it just defines the shape.

+

So we need to apply some style to it. Here we have a fill shape +that determines the fill color for the ellipse.

+

r is not animated and it determines the fill rule.

+

o is the opacity, as a percentage.

+

c is a color. Colors are RGB triplets with components in [0, 1].
+In this case it represents this color: [0.71, 0.192, 0.278].

+

Transform

+
{
+    "ty": "tr",
+    "a": {
+        "a": 0,
+        "k": [
+            204,
+            169
+        ]
+    },
+    "p": { ... },
+    "s": { ... },
+    "r": {
+        "a": 0,
+        "k": 0
+    },
+    "o": {
+        "a": 0,
+        "k": 100
+    }
+}
+
+

Unlike layers, that have the transform as an attribute, groups have them as a shape.

+

Note that this might give you a false sense of flexibility, because players +expect to have a transform shape at the end of their shape list.

+

The attributes are the same as the layer transform, with the addition of ty +to represent the shape type.

+

Here position (p) and scale (s) are animated and we'll look into them separately:

+

Animated Position

+
{
+    "a": 1,
+    "k": [
+        {
+            "t": 0,
+            "s": [
+                235,
+                106
+            ],
+            "h": 0,
+            "o": {
+                "x": [
+                    0.333
+                ],
+                "y": [
+                    0
+                ]
+            },
+            "i": {
+                "x": [
+                    1
+                ],
+                "y": [
+                    1
+                ]
+            }
+        },
+        {
+            "t": 60,
+            "s": [
+                235,
+                441
+            ],
+            "h": 0,
+            "o": {
+                "x": [
+                    0
+                ],
+                "y": [
+                    0
+                ]
+            },
+            "i": {
+                "x": [
+                    0.667
+                ],
+                "y": [
+                    1
+                ]
+            }
+        },
+        {
+            "t": 120,
+            "s": [
+                235,
+                106
+            ]
+        }
+    ]
+}
+
+

a is 1, denoting the property is animated. k contains a list of keyframes.

+

First Keyframe

+
{
+    "t": 0,
+    "s": [
+        235,
+        106
+    ],
+    "h": 0,
+    "o": {
+        "x": [
+            0.333
+        ],
+        "y": [
+            0
+        ]
+    },
+    "i": {
+        "x": [
+            1
+        ],
+        "y": [
+            1
+        ]
+    }
+}
+
+

The first keyframe specifies the time at which the property starts being animated.

+

In this case t is 0, meaning the animation starts right away.

+

s shows the value the property will have at t.

+

o and i specify the easing function.

+

o affects the movement at the beginning of the keyframe and i at the end.

+

In this case, it uses an "ease in" kind of curve, where the animation starts +slowly and it picks up speed at the end.

+

Second Keyframe

+
{
+    "t": 60,
+    "s": [
+        235,
+        441
+    ],
+    "h": 0,
+    "o": {
+        "x": [
+            0
+        ],
+        "y": [
+            0
+        ]
+    },
+    "i": {
+        "x": [
+            0.667
+        ],
+        "y": [
+            1
+        ]
+    }
+}
+
+

Here is the second keyframe, t is 60 which is the half way point of the animation.

+

You can compare s with the previous keyframe to see how the position is affected.

+

In this case it went from [235, 106] to [235, 441], meaning the ball has moved down.

+

i and o are set up for an "ease out" curve, meaning the animation starts quick +but eventually it slows down.

+

Last Keyframe

+
{
+    "t": 120,
+    "s": [
+        235,
+        106
+    ]
+}
+
+

The last keyframe is at the end of the animation (t is 100).

+

It doesn't have easing information because there are no more keyframes after this.

+

The value of s is the same as in the first keyframe, this allows for a seamless loop.

+

Animated scale

+
{
+    "a": 1,
+    "k": [
+        {
+            "t": 55,
+            "s": [
+                100,
+                100
+            ],
+            "h": 0,
+            "o": {
+                "x": [
+                    0
+                ],
+                "y": [
+                    0
+                ]
+            },
+            "i": {
+                "x": [
+                    1
+                ],
+                "y": [
+                    1
+                ]
+            }
+        },
+        {
+            "t": 60,
+            "s": [
+                136,
+                59
+            ],
+            "h": 0,
+            "o": {
+                "x": [
+                    0
+                ],
+                "y": [
+                    0
+                ]
+            },
+            "i": {
+                "x": [
+                    1
+                ],
+                "y": [
+                    1
+                ]
+            }
+        },
+        {
+            "t": 65,
+            "s": [
+                100,
+                100
+            ]
+        }
+    ]
+}
+
+

This provides the "squishing" effect. The works the same as the animated position described above.

+

One thing to note is the first and last keyframe have t that doesn't match with the ip and op of the animation.

+

This mean the property will maintain its value on the time before the first keyframe and after the last one.

+
+
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/breakdown/images/builder/adding_shapes.png b/breakdown/images/builder/adding_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..dfae92f11a391b0a2f639ac27b2bee6b1acece2f GIT binary patch literal 96568 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˃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 J*XltZ{|kAht!e-O literal 0 HcmV?d00001 diff --git a/breakdown/images/builder/adding_shapes.xml b/breakdown/images/builder/adding_shapes.xml new file mode 100644 index 00000000..74bed89e --- /dev/null +++ b/breakdown/images/builder/adding_shapes.xml @@ -0,0 +1 @@ +60060512512FALSE4FALSEFALSEFALSE0600FALSEFALSEFALSEsr00100005FALSEfl100#000000000FALSEst1001#000000000 diff --git a/breakdown/images/builder/animation.png b/breakdown/images/builder/animation.png new file mode 100644 index 0000000000000000000000000000000000000000..30459b18f810f0051f2289ad0e5ccc6aea0613e2 GIT binary patch literal 68899 zcmbrm1z40(yDmH;2nx~yf`ASpNH+o!BAo)#4Fb~LX#hiuN|%z-&Cno?bjJ)J-9vZG zS$yBO_x{hn_x`Va{^Ny=7tE}8z3W}i^W4vU-^-9UO49f5QQm_mZ};41wUc-Tb{3!;DV_fjoxDO1ygOVX!sh>7!;=i@m%0&Nj(q z?&N{odW))D7}j@5F-%el6(VdiWYG&Y=g#}dL@70kTux(~Z1-SzJ->PxwW5iBV#&!r z4-~gtmm(kLv;AtWT%LL%&5?)&vU?Ai6Yi)ol+ZKyZbIM zT$lPK3!j=!5#MwD{5PYH-VzdR94`&$99EC}_|fjVh@slr8Hso0+Tl`W#XoPe3tvU9 zt*JbD(%N*k!db38U`t@BW2-FQ@?E<;)*0N)peBaht#g7N!HQ|O)v8uw?j+ZK{b(7d z0pZQ#9rWMcgw}pLo2}E!%Vk6rYud}R+>xBHPoKUK6Ym#jI9pq5OSYTW%`7}3Bl(sR zQ#m-nKm7jfTXkD|8y2T=_UD3LE~>+spRh$!IZYqHu_2JZ0+=xCW)se20q3WjoO2Hz zFDxERPe*FActQX48>niZjS+~}KaB}mT^4TPs4pvXl^~@N;S%-tlDy3v77UoS%o3m!Fm=VU(3Mi%VP5Y5(1cv%!})Yr>xU z+-7E*yp#`#T5ZALhj+~%7ez!y%9U%=lE)ziOBkM+7ql7+IcK*_spjkIw~~fR1EYu;DJ#_H z{xnwh@v)PaPiQrEt)f^#RuHDKyWlfGgN&`L+yvu{1#9rncyHY*RZ+>Hqbn~fBdZO? zCG*kJJUN(e-5iJj)7vG)XyYB3)Oz8x^eC5yg^SC2XSS(s1AL}v`^OKD;8r^hMwm>Y z2nhv+Jy)*YjQp?_q6vMCHBnS-f4bB?aCtalcyz7=R{?vT=5;`|xl1j6R+(LIymzm8 zgPy@+UhwD4a0<@+tSklS-TvNWL&K)d`4S=(*Q3biY6cX%8>o?-lTsEc3JSzX#`@Mv zS5)|_GFz*%l?wvs^q<##KaUZM{R9f?O0n& zfwwB9Q`$RgznEBjnCVQfVMN^2_;ni0%RN+mol5-IkNA(0T1XARU zLpT9xWP@% zZS!)w&2j7+btv?FJqJA>3s$R0wEFX{f36z%4vBgq2EGS$5%I~KiZZMbeHt`V)kvA$KNmET60}ir}CdMrcHiaDS z{I^oUpJLvvd}#~TqDmVe-}f@ZqO#sB(e|y}Ffyfza-W}KN$UIgb|XS6>77fFMw^TT zF$$KS9_p2MPt!U7b>x(}0jDh%SO*RW;p4v;Jc%?he;8$H^Y@6Vbi*ktkw$zac7~Jl zErj1llQZMOacuLWLu($2=WMFvDqu8;&HoDTr?HjS#I=ANvd2ye_$QT{w&R0X`_Tk$ zQ&TxgF^fx%%X!qG*HS%W#&|W-p_Lf%!v<&nE-`)NP`+SG_;!CT4w&H^3WaC+?-WwU zIxi~9R4m3F3GP4wUg6$a_@noi`|QWWjP3WfY?rXyS1JSBSNCF6viNdIJ`pPp^B61> z1y3nRK+$6JYrQvf(PcdW3rn#?`1l8T{@Cn@>7ukWW2G%}R#HGK*qI5+!Q7*~B`qOX zt~5In9)b-Ccybq91+S)#BU~z9^Zn-p8Cz9n@3>cHZ*#+$>>fZML61;*{JXth>OLF8 zg-%OD_-$|)JxYHVN#45IKC7<+0t~cbU16Uwt|MOXj=dQjoEe^(LC(AxZQi~G5wpi3 zY&N4CH-|gs^9L->JyK5m{+;Lf`f1f7k_IG=Ac$ihi$Ogn7gv~W15HUmpJOW)EGYfX zrvo%|25%Z5v}k80H!#acFQTe;P0cLJYWTyOn2eS8ut1Eq9C;6PP*^WD&{ z?nZh>Hf{wMV5^D+P-xA}^s)3jd#d2jnBx4-tWVVEwCC&Bfsda^4i3`RPUb|5#msdpEn*o7WdH8*=?lp?OMtBEPUWy{ZvW$ol? zjuH@1i?F#RbBistt@I8g(=L-|ac>@{&7xhGCz6AW(Pra@R&`cQEa>5y&DG_T>&ufl zHZO0j-4ZD?(^q{{b&Se?l!;Xe{I~w-YVK3a&aGaj!1x}`?yAiwo2Ga6J``XW7mcN_ zk~65Raw(imXGo73(L@y?sG)Zggq-Z;-Fwhm*J15@6Y8&{LeR)>(I5{)AA!P z9)9$bCHP9%eHfR$c#Z{uV3Vofv!p2b?f&gF?PN<3IEYzVN;>l?^@cb4DO+174E?gP z6-Ev@LQmrcrk<&}o0|SKVBc9+;pf@fI|!TKJME8E)izWsSIhYZhihtR_{Ds6!i{2h znqE;c1%N_dAGYE%S9$qd1&!$BmkF@X;ZV|8XWD9uYLK8xG0x`~O|c%37gn=wTUdsh!02F>qb;s>WV!^DTWIDA5$O5|7* z;J|Qk<-?)|oU1@wa5Fy=uJv4K%R$v2qyz<}PfzQ2T>FWCZ;C^Ye$Q3$Q%Q^Uk&`%( z>SwlQb?%3{tO<_C75X2?TEJ-#8`pY03o8p3Wjj6LT`$M|!eP(a6d5hqO3ROZBQ8uZ zObi;f$4tviy(y0$SqrTQe$J@cjAMTFjLDj{2iE0K`PpY4y^R))Z9p=BsikjSl>48j zr6u<;=x6>^4IAP*yY7}DfI!GULmYW0w^uqkTELe|2C9F+e<8{KI?QYv;9Y&AS6Nyt zDI&gRYHE8?qD5so5yr*2&&DoOY>et{)NwZ5as&NjEupRv=NsM!!N-kGjB z$O371bTq+vwMfKcHzPLobrGlLLSQaC2VSeG2Up=%iti2&6IBS~w5XTnHrqtJpd@uG zN9nCn)UB5HoU!oORfZK>Yf-Yl)EqBuPFFILLSXc6BhiXjV_4t5J`?6Z-TF3mc-#oD zJJc__t=}OP)!=$sXxwOwA@!H_(9KZKGkvjbIR~4;vr>;3>S!ml`Xt#{oERFd+0!Z= zR0j$rgaH$lFUM9ar<}%2>ZQxl@T_+R3yVHfV))OW;zA8NBH5?LsF{EOXYR{aulDeR zXN=wuM(g-KWOB6mRfCgQNEJJ&_h-!&FF#Ea@4?y zc?hiEpGDo+bbjPpD%nAMjbly9dA}FD`08!aC?da#{4IGs$5CL`l>8i%PtW!XX!_yq zVa_wrBkgsIcExtLU|+wE%Ti8Lef|8I4ZhJk5Ijy$kC>l5L-a6-h2$5NDK*w;U!2_6+5Om^S`A$ z?|J3>ZjDPzA=Wdd zqg3}9v#8_39P(Aey36+RGL^G4Ez~4jO44$DbtI?Q#nsx%?G9#}xf$y_?W(NhH=wn$ zXvoOOE7>g!4?hDa)#b&OPGLd44+)W{C)PW&ndR+m`$|d#Liu}~y-SMKICc_&op5c8 z5DW$jr3}>=(A6(4h}-N}GTnW6{jmV+)$A*YQOmW<<2JaE^7d0`d0+kfZjcZ+Dw*GD zmOQu#%uVjDtf%dBN=#2n(du@Eqp;^P$?Y zKnCV_$c?|or3u4Mm9pzPf$5P5Dhlv$-ZE}PUH{Q_YI?(TKf5BC?{!YgkH5#~h+tfi z%ZU*GtDIv|tgfkwrVeP4XFSTCsFW1O4bH3|aK=Pw-0r=hO zVx-@BpdA3HSNE*{*T@toBFYg&&^m`P*!mGUpVKZhV%?;$)x?{>QtF z?qC?bDMM_nm#!Dhgja{VMimLocnWf|4B3)Gn#F$OVS;It2&7|VypYVqhE!V-K5jNu zEp=I3i14pHQcgbaXr~Ge#$P2heq6#LFJXLbjJyMB9{UKn<@=p5p2K(2#qL4Ty&z)` zyz708=E~2!goDzCntr|~@pVyMk-q@uk9yzVC2)5445VPGFh}(Im2Q-s>o`B#>?wT4 zKPiniM1QIl-&VT9|B%-H%rv8{ zw4kzg%8O@bh#lYGG5fGLeDoo~sxZq$H$UwRGTSnV)2AbYgr;!g7nc@Zqsd%cc2h-; z-#`w1+MP2@)&WB$3EfD$^&?7v3AT;MNY7=O$qQKZlZX?!02+Zyza3UpMX2ZVTIUPp zQ^iE=eb_4+AGj|{8%@1F>h7m@77@TOIZ?gyYwLYZ<3ZBm9PDg?v566yn9QR+l5w_L z>Yo>$=OuYXz$>btl9H8gcm4OjjY&w@PV=4U+yCSzYR75=c*h6y8Wv##tKPWv zXD>yHOsa7(F#?r{7N{2T9@z>B3R+bl2q6Ktz&dJXR@b~>U|YT3x)2pSjXoHMKy|*< z7+L)pg@?`Bz2PZoD~hjbxgrefTWGX)o`Qe+H^NerFQ2+ILYe_E4`8l59-QW1sgHh;upEk!K$Jk=M}HLRwQBe4X@%_A z5~aU@4sYQ@qK95#vnD$+e9e+94`^*g5(%SsXF_(SU2M4`3J{~V@aZ$D>wWE>nv7eJ zb1Do>z2_;~aMWP!Tm(90voS#FwS~CR#{hvdVV( z$ZYP-7N1s(dJKFX>c5e7ANB$-^)1|}RUhpWd%3O&CQAklJhFT-{Etv!_sZfpC`9cCdv{V=A8v1T(kf#>Bs7tluD4SHUteMVqDHK=f+`g|P zm-YL5?1=f=TMAMnjoyit39n)zHM5%opboF@bN^pvpZ`J9!h3>mcMD<^fK!bHp}>2D zA6%u_BdEom8|VH7p3g{%<4u4Gp#Y^8^69I#_3?sd!^y6eG;xN?wNSw*!%n6 zF`a@jAb1eH7Ldhko*^!gXVD*`uSKq-6n$-$zsHED4F2L-$y{>y$GdvPAb4_aNy5T> zGnGk1aiyps*Bl{bh9LUd2n+}XWBiAJ%~8;f=bINTXv~x2C($u+gsMq+K?3sc+`@SI z?1B7ECTSNoJoP+t)M3skMpk<)vUbBAHXebEgmxYAcg*+Y5^=i(d2EN$HO`xpmBqHT zfeOj|8n35Jf^>zp0~889RveJG?q!%b4Zk~)%d~%|>YxhGMKpN4n&O;74nN>P^g0i( zv|+V5QoSZ`<#>6=-}BaAofb-*wT!RXU!QlYxg{g#^AxE0Dl2Mu=%B6Y4@rd0LE0<5 zE@dfI-_NVevOXfaYONtqR!UWnAX#8o>#bcz#FD7EDIBLfbniIrjJL_2ajk30y$phF zxm|1#m0Lu_(-X<+jItU&x=shdAy^}y(^xJ$cIYtM>VLgA&>yves>d`4>tySPb>ST1 zzomG9V1iTIh{#A-8e0-93s-=Q;X8E_DEHdTYASJ>juDb+S=%9-r>_8Ii z%fS{sB08IV#AhMQ`9j6=?X~Z~94mg$*HU@EH1q{}_Ij@9TOABD{r)o5Z1q(HLJFzz zM!$Lec+yK}tWb39den9!l~8nk=x&roPyU#&74+V>puV2?lkVTj3K}D2dp)U1`^kFj z=#tY`8tZ{ii?o+Br*nnVm7y@HpeVi6CLhJ_#Et%q(ZSJ9doMlH;YZe@9iC4BJ#x?d z)z7G24QET|_3z)G_s;<2RTnV>GE*voHgCFU`kuBVJhx6CVKA;kMoY0{Ra3{hU9~^H zzmwN!JywyrAvpHK#$jAL_NxByKtnNKj{!Zg=O1_xBroxGHkg>`uBZ67v5IV$zLtVO z<6&GD+*9RkfAC}l%Tc1P=y}fi_vrT)DNoEdhYIii3F5QWeWmyTG=d%b5fOhn_-qlN zEVN;#Tv=M=^s!kn3QqdGu~m($`mWK%l+4XIK}Kg(O%K8WhnsNF-FxGtAihzY>FWmT zd2Va=wH}(=qIq(y6pr7-+sm)ej8h*t>(r3U-TZu9)Xkz#$u8!X+MH!oQVQZu*asN+ zWq*VL1vGteyE9Cg9L;v(UcBws*RalfoRTEMPX~Ps{aV7(W9oq#u=@UwYSS(uv7P8P zQS^m@bpNwPFfZFx8O8o>YnjJ{j4q*sbA+19?-4^oDy!N45Xc=; z49r9Qlys${Z^{bE9`#oq;%{0u8uDlA*5}ui75z2t zPkTp)tl*x*C_1#q)$xSAQe(|)#5|LT@VaH}B&boSVRxdTxD!856a;!xq&92479x$~ zQ+S2kC$`Ue#3z3%r=BL|6z{r7FvbczO+w zSj&ySU=~kx@R;0n51Vz(4mOhIX!Uq`;4kI-OoYS0Ox2NU;=2};$g~g76X<*$$z0|7 z^gEz5;=t38dSk0ODF7x_w)+OTWR)qEm!M-$)! zohgm=dhghIZfVNMf6Lg-4~BFPK~V%vIS3M^{9ivA>7OoFP8Cl*ssb)jbzd^pW@=F&G%mRTqpy593%zqx9SK`xeLneaR$5Vb)$Jio z24CL5_H76r#meQyN^zoVKCZGxvVIF6g|Z6lkO>tw=UD_H|cd^U+`lf}7p>$J=0Uz+12Dmq%zuRRG0g(~d!;@hLIqvbw1A@*zm zt%1S@L#qcsZr!#XT9Y(2>8OXJg=-8%*vygo87M0ae#5d#4rgOOlWS~jkv9~iBf*OP zb{ozEcK+iD94(o~?oo{wJ^So2Qpm$g|g2sa9<|ma*GNbCL9QMX?8XyCUWsI z@U7<5romuO%$?g;Hu|lg=jW3X<*F9+n9m-IfeV=3T)?lsT~IY&RIXLxY@Xkj`_@OgOq&ISNOX$7FW4bPPkP0gAxJ+gwbW7D4R@VPo0g1uiv zgo#6;mBh?PBHxsD>dpRP;%Dq@Dt!BRL7NSFU4TO#vUY$de;I%9qua{r4c{Xx0T)yz z*sX<}EZ%lcuGFjST<5#*J%kH-X#Lj_iobC|*&z`HHhPe5!LnS;p9+3)vkJ1PoF5} zWqYn4NMH=*_N#67j59~bt(I)XZv|@O()rRokZM29+m?)w>_3;3k@z|nd10&ZE>`O? zip#~GQ6r%GWRk{H}PhmS$DaYXs3Y?Nz7l_2e%b7QoEY97$Z0 z7{>Zf=}adQMeiXTo5oJoMs|2Q0(rn?u5;E zCD4H_`2;0 z_bl?&CM+v;QxHxKfRPEl2-57%U%*%ZyKR5rAepsPY)kGodFk2OO3pKpqyCf~QeM*S zyqPSnJiWp{RdVnTVE=*2dl)^PIcrea@T2xGP(WDv49+#?b^B}E&DVv$z}|xboBLc1 zh=FylhMI}%Os4Ohutf>*lRR6(4WWlF5Di$tix}5}0Q?ngpZ@Tu zQBsm9Ow=GUT-w<#z9}&P1Ud)nzXjq3Y>>!!xTK(qW#S0;rdbO)Gg)=}Z2vi~x#!Hu zV$=dqeKUsg7UMOMwbh_8b3bl4c-=<;x>RRxusone@UR(&X@hq8DHcQfX{Ulh@(bI^ ziVTZLC+wqf%QXcY1;SlSyw+aDG^(d}opzL{`CM%dCm}llAt5Bri%$LpSJAMI2S>aq zyiu#7sSgq!K<~=pE2XCJA+COfZ4SDQKHo$=bdH)WD2|?}-oTLBZ9c_@`qF{45*J}O zo@ZGITHc|^4eE?^sTtu76l2pbnYk{|9ICad4y2$o!F=M0lc7YiAALWX-Zm*UAcojI z0wscGk^2%$8~0=VC)lr%!L#iUd-v4oZt79QcxYjig2z(B*^ahNEZFRDO`;R14K=EdrPbhmls*(j)9o$66l>*OA^lETFIX=U1W2$G?X;g$o%3|-I^gcd zQR6Z2qVKS$IfBX!YNwIqx??IwVE-I&uM9lm96^=zRFo+$C-tXnYGQg|A!A(Qn&3@C zRxgMAOia(DP{0TAB-D7y8C_*y_76U)`tW1*W^B8;T+i6EEb9lMf_Ce#>*w!y7Hy#Wl@-9wA^~zk7vi!DEpegOz|=1})dv))})#61EWMTMln&m3~4% zAZzwuO(tj->)X?t6lLNa09P49(@*&&4g*p>|5&W~O)E!uTAZPjL`N?XH&~L@s#}mB zqDJ>I@px6E4`+mCd8ZVF^4uO-3D+e9rv028P=2OY*L?|~fBs!a;FK>RQL%kmW!ni% zAvXpjz&n9I|1V?E|7msJWwZ`xq#_Z1#>T;R0}OVP`wP?_s%Q0Od4;7SZbPcC0qQ#( zsxTe_o497IasR=^d8jYgIcVR7xh_J8!&NIiUO*#kH)5^x@Gq1Y1|qUX9l&h@3`{XY ziE~LO`Kza03@}}=2scCN8Tzz00<_Y61loY}sXyz?J2bxh@M+C|gX^vky-ISxh*6fn zh;L{wQG?S`XM_!RzV~P+BFbKV0F z?KRwh4`@VOaDla}+dC7?8|^-h-~C6grcQ!SKi8|DlDQ9xecfCJr3pYgU1|+Y$BmL) zrxZO#!rJ@5Pj(#)sP;@wOVT@7MBNo-Z9m$Qs~@3optL^+0MTUD`R>5;5-8{j{oPl0JsmwITvYv>wtrR%mPf)Qe1^akS38#XJ?e*7R28FwoR#9#QgXPU z+#Q_}qJu8Y+R>p|izXcakt@h0E>XskByo#6`+Yb3-d}+5_d-v^7$T_MYDaPV>mwUWT{Zd74cybA45! z;{9PdC#UHw0-dVIPD{>>DpGOh%}?@9IV8tx-LjtKr#A~_7DFbxI4fEx!b=gn<{oRi z49`SLD@`_urlJXDy8uT8XlIe5#c{dGR~T0O9sb@9e8uTIdAOP_a2}g6qV@>OIpi=xhbGB<}hiBEPSS7#^OHpZJt|&2E@(cQy(hKd=x}eKQOz zAxb0lA1<JQZosW1M_J1n&s82M${OLd03%`J1*1DXNJ z41s*YFb9O<`1c~qH#|6}A3-ja%pebx6Q2{^ZM+Eh_u6~%5Ssot?eXfW{fQ@5gX9j~ z;gfWuG@~bmlYnKbOdRWLeH~oqCO~?p{q9+auBzRXUa5fa%NhAK*QMTQ%hv3gI}#Vt zJ9#t9(}ilIoOmQugv^8Y{I&x>(*G8LrU4sC1&c*O`7+&pO|k_yQh3iUMqE;2WK~g_ zHt8Cb=bm!J?&eGMfP9&fjO~8Zewfurm4JJ2ApW<|tRglbDSiM!09XkCge0Dhba~kb zvn%+{&oNy4N;!A%21vimpQ%kZYOgVcRjib|TgBU&pVSIrZ#vi_w%y?USX;Ss2V(uV z(Jzk&06#~@OIkxKFX1DS=4$BJOiVPj#kV?(W!NR~Vb6Fkn01D=sHoe@$rhc6zUo9z z+qyx&p31cuEEFWOSO~Ll6->Oi*^kpoRngApPl!hdARLTO#Kc7Za{Fvt`6>K+RlZS& z8vKZuGX89obYQo`e+@KxN}r`&Z27%fw)jKa<$0s<0AQ1bxPFv_D6mqxE9!@3n<>kd&SCh94h z$wq;+)s%OcH_?s(h3fq0^84a;KfK0-yY%oPr0Im%gW5`<0w~|$0RkXW1^3(8wuGYr z)e3**lD9dE2()K^RJl7_dP2$CaZ}}KW;Sf}mjbKQ?YMQqou&FcIaXhN8yo#$^J3I# z4Jmu^y4wCUGgH>XiWh=sfY;-M9%`~0FJybEJ+$dp^}F4KJ8RkM+i>MQNoqL%`{yxt z)O3`RevX`lW1sQ@|5tbjO>5!tx60sgC;7NwdX16HsZtYcz$gvQ0Y>ZZc{=}Q4d93W zS$G`Cd=BZdRJvJjLG=8AXZAe(^@IvPB(8|XP2SS^Ij~?lT>Xa11&B;fR4dz$cVcy5 z0jA13btLIXE~5-EJNCcn@gNkKHyCX0R?145r-Y7FzVr{|JEfu`4kIpqu3*~{K#bml zc~v_ucdQoW|2t`m|6P8nOG|jN5*aQ8qHXWwIBs(pivjl@6>f?s0w9L4q)?KN#QO{T zu(iy~rRmq!uI4G_-huBZ6NY~*k%Gqr2)AS?paQ{iUImy#?> z-gXOowKqNsKO_?-5_Ue|CaYVH(Jy|X)d{50w3@SoIDel6nBTXvB#^OfU)2B1t$VIO zIi7AO;IsnMdR$fRHbIZ)elWb+CzDbNRAYd3M@vSt1mvlgfRa8irT?{I3GnBI=Z-PO zlP9G~G`c)qL#tV7CnB$C@1A}HL_(dW2i^|POwC&r+TKDNdr}awD0F5nqA?dy*WS-eS>1AW>=*&qZz#gcFOg(q+p$oN|s6^|X94LnH*U);?w`9!^`3-Ru_NqT5 z#mLR1h zsXEcW-jYUnxMZUeP^a`~aJ-+(zDs9`i#r-lf?qaN7+1 z_`uG0II;5gS0kv?a=1M4E~Z4=F+PjiI7;vnAQ%-b- z^h)i~d{Rz3^3IN528UN9lbUfNiH~wuz>QEPU14vuSh( z02sdTK69t41I&oLgpjpcHfGMH?eQGXvp(9!i%%DxjfLmqCh$wX3;1u5-$3?Je2@gR zu^DWEdOFw_W6x!St1^CM2k26J{BL}!+lTxf2tQ84Sy{HixtQgWh~+(q5eyjf zsWj_Q7$@O}xc^F>Et^{h&DtH+qfe{NS_V(WlNQw2DCv22nR{qlT3P*UGtzh^M% z2*?=LW#@o$Wop%@aClul$y$_S2ng%tRy@G7{x=pXV@bo6;@~S61wI%pu_z`fwaDf7nWA6$nC%j-vxE$7D#>aCQC5IT+3dnYL~Hhe_?}n`>Xx-%`Z* zqEYbX(^FV9=<(=kBACs`*TESkAkQRap_@wXoMU0!IH??7^xk{M;*~mXV?yze(^Y~m zxb+F?g=27w*l_o|uxUg>e}ClQVB(=mMic>&wzrp-v}mS4>DxrV)s!n5>SRo)ijkh4 zksdO{zG+)G2qvQ()zi1EaS<{(!T(ZthM%h}`v>IV!ue-;ihmd|A|o27CUjeNCEA{r zMdsr34O>;5pV2!6w*-_@L}XM<6N-vLL)SJEtKIGYi0DDvu+<`X2Lijj|x zwE6=u?yY}$JyKwthkjuTxIQo$GoD&<Ru$9!kM?YF+sJiDvwr4xX9y`ySb{!zv^kib6?4@?ai z3sL>{x3GK4d{V!dO*Q(yz>StcJ>-5y2NiEyb*G9@cRD*SCyDRV(oJ@)rsJs#TF zh~l>uR8`L!*(9IwyI@upUKS~%eXuoiu^!8M)Ys>yy8gYsewEgDRGEoBouKh@Kjmms zzcq;dDXGtOjkWs)YR2&TV$QX%&%FFBVl^#I$Tcq?Yl0i(&5RR*`nexAyC?f;U%8fZ zWtAIhH^;opgxv?TM%~87-Nppr<)&r+g;1j`c;)p&SAVQM*6eJdv?JN!B< zPgE^4i;F**g)j;|3lcgPzig;i{rG8y8U50&*Z1V>tf<3}SGk8L`-xw_?vG~57Ne%s z=W^;GMT2KeUqng}+xVO6aOyxuJ-ekM%Z&{X} zKRjjZe;VI!*!>4wqv`kc05mohM8W%~;Rl2Vt$gz7w<}KIs{s zV3g`i7FY8~WOsMB1kV!@0}DR(xvD<-$67DlY@{S4e!$@^?~xkXo+UK`<8%JYh46if zl^y3*;-R3{VE?>)M776WlK1i3DmY1Wl#I*H+Rzjyr-ArSy_}1=mKL_wshCtY%5S;y z#XG~Bn-4|tmQ-7ZRxv;+ zFyL}=Uo|xJ=<3pTb>BTa_A{F(BF|QIz7nr``xeRTb%=d&LVIl{_|C^>3tSkSj$LQ3 zCHp$Cdhl61IM}$qXAXTlVOV^Aj7Uro3SngAbnM7e7j3%svT)^f|3wx3rh2=TK)-H4 zc)!cGC$_SplD@sejVZ=4I=YpFWG0A&sFdYmziy}Kv>2_!;ruMemB^HgJ+ilpQLD5? zz2@p@0>R82Wi!3R7s@Qah6=8<)~_RA(>uM6GZcgi#rzq~%slX~A3r|k)rI?^r!4k{ zhLXwj&;Sq6PExzkL`h2k(n6GTFQo8+F7U;EmJtV<6xrVgyRzL35{FBf3GvR@EymNjr3rc~Ck8CNI8iP!_s0eZYDH+XhX7F(b8#^cV$4&Q#%*DdOj=f{ZB!;^NnP%>#dbp(58D8=6n{aL`fHVIsrX zV%erq| zXY<=v;?=+OQ&WcO8jXjo1oNuvbe^6sgS0g@q$F^;xerK4L|-_F8FMJm@@>`Rs-?{| z>W_@P21YjHy<4{oABhyKuUl@QRxZWAz82pnA<@4DWf!^D(nYk7+$Iuugr6!VMso*7 z6Ony*FmOQYujjTE|Fhh=g)VCJ`gE~SZ1cE$fbj-4a^i|#5*)^9t#)JS%`e){aon=u`Q^0J#m36*L)JG*yTu@o?Bm2ke2}f{B z<-F{OgoFX;dxX(ZgPo`nK=nGM)c-2&GOB622(1%XcW%tRTyfYmt}!qe)vDMWE%KyW zt*QOboZr;;;FB;S4)df4bdPSa^z3scx%>C8<~$EjUBEhcyizrDnNw9ISva21htADk zGCeUl znW=g-X>%YI$zpBG`YU&Ra9zp8rGT9|DL$TJw}(Kl_${g+H+s`0W_ug#f!VKLp-X$G zc--8)u02B;mHPTj8GHGrosaOP``LHm<{KN)aDQ}ZRaLg(iazoIFHd-6)0v(=^|=m4pLT{t30JMy z`+qwdt_)@9m&6vV_w#gr4(<1T2)c^e91ywa zmuI)tYdEhIy;iZ{Kpu>$=`%eb0@-GahfiaCwEkqjr&#m^2@1Mst$yH#%||zcs6qTW z2Jn;yF^v3~ojOs&yw$(MzuVKj}ariq=T{Yx0?D{-dbcs#tjn7h7cnFEV zz*HbF=>s#QW9Ja7E{u_leaA(G$i1yt&Ba~x^zs1LqQBnv52*z`y~u1$GzC=>uSr{` zH|orBu94my`E&UF*TsdK5nt4?vl{yCj3`^X2wE_G+(gn}3qVeJffZ=fb!?qQFk>0n z)OEw~rm0zkz--*8h^XyFua}zAdL#N8fR7aTWa>*V?k8xt*)0{5fTnwNvqAzi-L+Wr z`{iA4T22-&LMb!@99}%S6WC(K@%eM0z*Az>+Chm#=RZ#1n@LHDh?@P`J3by+^=0(; z8h#qPww<2N1|Vr;{fR+;z`-7jZFT$$Z&sG8zP?~syT>dR#wPnF#o87v13x&^QDt~% zm!e~gX#Y&2jhGYfwFE60Io!p)t~T3nHi?y7U$m=i>$;;OiJ0Vshi9pyGp@2ii(N1k zhG|k7+O-oGu;B2b*4wK>SeTeLjf1^-)|6drX_0P!&sck$fpKkLbWWEgHV1vK8DW5) zvM%<#`Xd-`eD|(&ULLGVo`vjgU_bE3n?y4*J{EJF-8ni-B%tXvD0|An+GoOXDk+iN z81C(yJS`*?CvvehdY2^C|4_v)3I?lhs84TgMF+d4kM9J^ zTf7UvRi*sy)PNKgCRDjOg7&n%5}em)DYHpB-m;LZYc)XXUFM|ttFAp52~u{x@9b29 zPviVS^vk_ZEk>NxX>Q>BExvwmitve&^KD}Jb`#yCAuHDxkAx}v(Bv)a?B<9z_r}Jli`<+PV)Ee&B-M%ZytI5_|C^v+nxVEN2 zg%I=0WEx*{26d*;bn!rO$m8dK{MF65DRPaC>nJIGramb!9_lCg8gm?;Z%GGFjI})n5qNWvvP{3dgKYJfNRG zy0`&4(J#m>wpFyNv8u|Y=B2{Z#Pm1eX4fC-2;YXa+vSizY}ho5yE9L`)JJmQEC!Df zzqSarj?LJw+$K0od7*MPBprA%(|Nx-GBvQzuF3w&D{A6mhun}f+4DU2XC+L; znp%Xpv+e6o#WN|=*!XM8tb6BIInM)h#8 z%R!^AA-{M4eVn(kS?E?*oL`wA_S;Az%3qWDFrQ-ngjamkM*1ppeQ1O{o9+AEcb5AV zbvbhlaNFV`W6Xff;o`7+p$p|_rNfg(uS$k9Gley6)pNQ>TH5D-U;b@&V_#+!&@N-L z7#sbS`{eSAwqrS2HtQvj0Y7kRK7N*@J$=zIaZsLH*J}R8S;ERv0ay23(dI8>&V<7? zhzfD{enCOO?(VN2KSl=!=lT=PPCO_tE^dk0R%UlE&zm@Mr0qPD&6q*e`5jDcjd^-r zhsuANK|SkEKlOMLO!ufZ!BNfMKgR$qT5g{8zeqdFsJPlLO&w$3=)TeKxn39!TBi4e>=Qm|rTNUg5S*>)o^ZRI;mpBNaOPFg#U42bWW; z?i3qK2!_rw3McG%TweU&5)AJO^jvj5IbDvU@|#i9O}n~aRp`h>Rb7=4QA-U4RZeKd*QSBqqCNa8J+8T+c#QxLwwJ(x5j`fP{_o%gQ(0XzRI8 zi(_Lm%TKp7RXtRgVumfDVwM^jMm9E6_2x&fP$wS5C&p%67Q0dP*u3wTa9O-gj@%6M zR?Jv6Xh&Pme#NGxDM@eDV0@V2dvdB4t=&ws1oXx1nc}-{FG7$r`S_-_nXMntqqA-BzOBJs(_bQsky#aqq<`}~R1 zd~xoT=ccP^G?E^F#$kVR*~nXj-xl?5FMAl-a$ZjKO_n85(wa^$V^4Pd<}B#!z|wLx z@uRE80}&z6IsyO74@u_tyk6jl#0;~yXv;l4`7YP>Z92hrR)&Nar5*-T$b55o$Xjf* zre)~xyuWPv`c)P3(9stiArIAb_24B|Q(cM4Y~y9Q$Qu}Fs|ehp#_SB4nBX}-C(7iA z9yGd6k*zvhJ~$z)5^uO~@P1I;+FnUYHg#-5adxpOsl2{9wlE8el~$8W6;_;zt*jg^ zEA=|kvb40OpPd*Q@Dv~ev{^~^6Dgq91w_lW^Bv4-H_#e)Nh?5|wIM_24Ru7nj# zcEN*oLW+t_9IIZZ!yMj=`f64SPERrn6nc(wGUn8Ltb$u-8{pRr*iD}Jp4hh9ul?+R z-i?ywoc6k|s+hA1^9y{SJ1T>$49F7U)O$WbpHEIs+920oKS+juOkv&%OxDF~Na~f) zPpsIbrs)7Ih=NpeaCRxh##N?a( zcm>2eFCZpNG`sbFe|5#j^X};;LM*q}ap(DL#q-r@7`<(eIwdVb9ID>3njTxB#_3@E zpy4PLD}_laYnqA2YEZ$n<`M48wi%yD6_FE>WIjYH$7E;u@oqMlg0T3B`}K9K29H5b zj%vIJs;`?TGRgeyjyome(n6y@mu7Eb`trfFJue z9Ul-3paM{-697#@)QDC?*tQKpR@zuZP~5<^h3o9h_4(-phIDtgIi1Q+WIGJl#uB2m(h95m z6S*^b!OuwX4A?WLhyHYEr-6ZQj+^=>R#zQEz7VC$?+{iXT?gPi++#X@jWnl3A`PPC zcpG~0EBu{Hw5f#7a_q5<$4yoK!RZ$%Q8-7lg8i4XT;)BaJ0bX=tJ+i-SK6VG9A0In zp%*{2GvB@Y>bO0|Lr;}1Uu2%e>(~>IM2QC8{mvb+Z$3vRaowc*Xp(=x>R{-k0oU0P zq()2(`+ekTvo>WxZBePkE&8w?yDk5NHG>!H@UU(&4H=D$*IO)IZaOT`AFrU2xD)ry z@w=nnYdB#9o%ReYnTz0&Bzh8W(+~1Y+BKjYOB#eGyb<#E&!j=WkTDQ~DBp$WYQsR{ z1v{|f$VZiZ!p1iJ*w7H-0iQly%BHGU}-MKDl9m9Zh~=0J}uM@Z^IiU;}vc7P$X)5m-7bZpSKDik@QQ; zdfh7ZNd8GxgNuc?YD>AJo9jGMkO4Pc1C@So-`H`F5FryZYJh_jH1^{QtUsDCLXLem z+`r%X-&-RiZ-dd{=d_xspDLcSD^c$(xXFa@S2VTj%$H0}@}M=Ffn#hYOeQr^Li#f| zDLum_U>7DAw^JmJJe?*dG&iDuY7)OYoFh#;!H@hWPA5EI$3tL)%9pOi%)%#1_MJ_a z3Nclk6hm#wb-H2Pw&LrUSO7T1CQW(f_2uRSW9QdWEm)Ieq=nAM}*pY)K zZ%ib&(3t=dJ)_T;_2WPNo&u~9O`_Tcv5tBDoqS(>1Ya~>Kz1v7uO({O5qj40|VujF2e)l8@pMHJPTN4XF#t3rm? z?8i1j`lEhl#dGdtp1bZ6Zji2r|1G1P)Jz^6GF=|>Hr3^p8JJC}yGxFCMFl=3`FQkg zh38UH2FfY!+*YtFQ?)uT)E|Z+pv0Fz=J%CLp#*%=pOsxidop@@Tn7gC6mYipg5Rvt zFsNzJ0)I&R0|^PAu-@>Qk(1HiEUT1xMIR9x=m_~wzdTxdmI&+>;p|jcPD-to;}iCEe7X1t_qo4>t<>-zF$ zXoU3rj-e>P%jDbMzvp$(36nnf?jt&Nk3n26KqA1MM#L9KLd2j!`Nj&Y9#Nj!DcchA z&XrEXpSjJFe-L0b9nrf!G#|Iv6T)6SMRh=FCEwyNf?Hp;?LdS(o4Tk99_aR^x;vil zBl0?_J6VtaT%Y#*;knx7tX9R>W4j<~W*d2wkBA&uqt)vjVC8X<*ybrsL3e8M~U+aenAWs)7%6(>wTPST5}iz_MYImbvY$H47u?4*?zxW%5tZ$Lsr3J9F*W z)R+h6Z8APR7PP4LJm~Xlz?wU=>Z$$b&n77;fRTlMdu{p8NU^y!}negq~p&d)B z#)^i9P;MT>fPfi2Pr5)7UEM|`fWNZ*v8L&6a?y76lcwh4>?;5kWv8)3=^`)B-KufG z>bbAo+oH_*bPERPG=r4UVKwwlnoEWT(4^*>M&J!O?;R_Fc2S18I^L@23m zG3sot51q9jnju(eV~n_P>HT(5zVv&(**@b?x8W0_`MaZ}jp@WQDQZubM-EB6$3NN6 zsK7dU+@cm<$Nk}IL~_-+2QLq_W$PxIkFRa_Bj9$}gj^Q>W^m9a3!+~Gz)y`pVfWg z#N=tjjAQ0<8W0R4F%^ zZDHLBIW#yJ#uW{uy2+9n%{PXI2MN-voq?l;;fVARTLn~5%#iMlJ$4))D~pN6BbJSI zq7<%+eCcUxR(^=-=%7sUGw3vVEAb5Fv?Yq}^?3Lr6xjWiCeb3q7?o8w&WI5{yha!< zz`4#8IyEt2%}6CzsND3}RaUw1S>;MbL818550hU=)X_I9Yu)XCrtj|brf2xCo^IC2 z#-GH*kOFQ`cNGEk#CR4S(zT<&S8S@5V8UW}u>&=KaLMb20dT*3vH!d$k(ekRnkQ0K zPrZ0Hp0lE2OIaIZ0Dx zJc##gvu;qoPi%8ZpI+_Vc{5Sxcwp%Ro<~obAV?djl|m(JI1UH)tJq_^8VF*h?8-4f(#b`7rjl`D? z1jpP<`8Ld4avvTP8qF8i12(|Shn0<<(*`W^(~HbfZ(J?WY-xxj ztoS>LN6#lIW{ouM_L|mK`GS2WJXB|wEQ*fT>u0JarV`)*&cowPr;TN)X1MX(*ocxj zvUWy0I>fuMtTQq8oi$y7DiO-%aakG!x3|Z!lsgS351&$p8@#>2@zKr97&2i@fvcgS zJBrxfr)9zV}E}c7#YiC&tfw25(pH+#w1uji3g@6yHv@dtk+mbs60 z`vnup3(iM?AX?9QeQ&UR@aHT{Aizzi{n}3I$FkuG%hg@h!FjVXrAlYNxY~?n5~YHt z@g9vtbM&Fj9AD*l#G9yIgBn~U($I|uo1={@x0Ld6sFLgMRrJvu69uz_jlnw2V6w04 zdQW3Bw+EVE%AihCVj|&N(oH+6a04_r&-!=?nF5sPqCT^HSEQ@k$2&M7MuglxBM)!r zbE6+@*ush~bOY1__~Zh`=!Wr-h0vHjmvq^@^6NaJUtq= zHfEWx7eWw=5w@I;n?i{1BG|?~XhjGBQ{RK4?d(T78;8^S?mjM9>(aTYQfs za{_(#h9i*|@jD%=*P5VD3U1mmtnu&W76( z%k2A-yP{E_J1eu>g6>VGUV@+5f-&Ug(_l@~(o7wPn!wv87#5sJ6?;d+id4^D!)$#I z_Y0xk)V^*b1c-kcYMC3r&O6ylF8Fl%oWI6smQt-si_KKahUt^7=ivMwoCse4jHyGU zJGoTAX$FcuTHxx#yeuW~34jvX}a;Z>_lj<}$VNwP&*#pgv+ubLq&E4&^tH4=R5dunV zDpH{B3db)ra%6k1OhBJ?_oeXo9=)}JLz)13jto+r8mmp8JfR_AsJNfoDGsB>$Y8&+ zHsXJ0-qJT>jGS~!9f0}VM=r)3*5&I~gj57>5Kb~2hUM?%jxUX`*xnQ%!zVs ztsgV9DHySiKQ8Pd3VS)Q$gl^zkDj)DU?k8!B3%(Ozc%^7xpc!B(|x4>mKG}dO}PA2 zC;lmX0k_aZWgqzm9Dn%j5~pTVgGBKP7Ip zO&vZLR2MI&71FIa!PX9wp40cOs`&R$2YGTd{ zUp*j(HdzUC+LHMW#W4S~ubQ@GSTZ@AYT1lMgC}pSkPvsvGSu+qTLv`>l;mMyVPfl? zG1e?xm?`P*4Y=IjU&$xq1KKX>Qp*Q+nsEKKVX}(SPE@Y-It9?H85#<(cK@rRJ?yK( zC5MT8s!MD0gs)p`DKk626cu`J4@DS-P=ktu_Yr+jUCpzbhfC!@!|*rc(@b}f8BR)f zux&OUko#KOBPj*$U0q7O3VTQQwhCSc5$2Qi?|QH#f1tyLX^YwTO#PXVYf#CgRCt3O z`syMOMjwn6n_`B(Q=W^H%^Eimd600*yq9O#%FJda2H*&~tS8|+ zTujA`wmv!(@Ro$pNGBGhWl)wmCLnf2g!Y>xUHhC|JzDJ_SL03*#A@PA{=`Z>;I>d7 zs!Plfl_DPm`w{=_&I<_mEF$8|W0|zPVSae>3TT*4qf8Es=5GL@VXOw@h{fy>AkCBVOn;XY_Tc>>G_FAD&2(qMYGKdP8fG) zLNP_#)=Sxbh~D#Y^g$%Nx8c*-ulo&ax=5h<^d5hRa$~XTxuUMkcvYc=-S_qwnWG9G zpp0mEgf5?T{qiL!C8>G!T|htf$D9o3sJ^OkRS8zl}B zoU0B!jg7DWUZXW1(l=FiH}_*!{5s78GGn8Y*>N9q-jh^HcQe`w9Zs}u=B*UT3~ijX zzESwz+I%y;iut(RBsSXATA6vpGq^Aqk_8X;uAS|0-EG4!TKZuz@Ucw?YB(94liMW} zp><({j1e45K3{3+TX30phUKMgX9Cg1F^#2TgoITltEqryLR3rxvZoE zTIG42k|7VwO^?OU#;okmztHt+1XG`mf;VsRyRCfg-|K%f_X^Utl=ez88W<98% zXBL_ptL;3!pXQ(z%eqziX#p;8!aLv5cXJ&!TI<=u`(2@~p4cL(iCV9;gW>o2x&ZWP zhQ@dKd3a~yPt4+RyKnDsnKz8S4*2nJKq>%oZ4 zZnc|fwW~3$4=BlfS&C-TL(Jx^!tpFhmncE>AHdJcN*YVPr`$42?}3M4Ha??#b?od; zKrR&``ExgC*MJO=WD$#j>&-=gd4Vu6Yg5A&3NLK+BcbohB%VaiMzuSs6@6$ykEdha zAddVO@M2tYBTKg$+9=tB+ooce%j{Ra@xnzvtdFOP2|TEp&8UC@5j1ibASe{Tcr6c0 z6^_G>iAlR1&E$C+AAYON?$ald%mB7791Gg4@ifWTITA2pR=+^Er44IU?ZiNZ&jDK) zqA|{~+aa@aQrV#i!imEGVJ~+aUdh+^9k8w+HH{l1N`OLUOe+yX^!t1^gKN7zcb#r= ze4yCh9Vv*C1sps)V)(Ax%WH)qszOk?r333h$$e1001}hlKAAf&kG@3zVS)lO^qhXg zBE~VUfrtUEgmx-byg|b=R`%iX%Dlz>MlN0yk0r+WxATtZJFQC3C~bzkqT1svWh+;F zE*_bDAz7IpTveS^kRsFSi!UBR1`TWCL_|d3VBv*0`H0$-+s|lP8dAk8=u{wl;TgP)35Ws zlPs1LjUad%+MjUh=1*6lY5ixdct1fpue<9@O)hyHLGU^#(NXqML9OUR)`&MhFVvN7 z_V+#C{tQuj6Jc^RcYW06y4qfJDd-^mkq;$j@Es+Z*^-g){BRS8ugcRj*n8NEZaL&w z)A-18P_G4)+ZjsR0l(zrcI_F}#x|c827Qg~+Eja%?8oQ+2gH-~bXIJ@;BJ1TVh*x=wUeKLr3nAq5-8gU0YE5nl#MDJA?h*$2{ zv|fQVyM1+W^ye_Ugm1!^I1m=mgPgt$Trz#~vBv zC5DH?QS|DUuA8f|#F?W;jL|oQ(A(WU_)r)C(eRD!?{-pQf-kO%S`8Jp#9oVQ_TT1q zc}BxV?sUhkDC0*>I7+9vTL^)n5&!8BFxf}^3J3h`HGs@|es9Z^LZfzYXUrZot|1^& zXi+VzRSzPN_i38d+>|?mb-+R%8e-A0q}f0RbUqj|uazylI{I#-Kd9urQ}= z;ev%+{9qHU>Q;%8yQ1PVDyV{y_ZvA&7u;Xkg=v!yM1{?*&bTlgTfhLs-nUiww#{2n zJiadgROnevZCe5H^TX4Qo<}fI=-3wG-|!WbW65J$(p_G$FK9P9`9Tz2KHzO}g$2?WPn5*8rn)3e{m!3B=3c5Tinl zhrxX1g%~PpNjj@)WCDY?(@LJPwXtnN8|n7flcA3Ix1YT13Qb`;-(L{fyX%Y|xku&y z25aq4zgs1;=AXXFl6cx(2ig+3)#Y>u4J1?kMkgTZ3yTaqISg>{Y(t6uAWJ^6XyuPV z`r+XL7YSZW@tGQlK};iKLNpcdV;VN8Qrffu=8u~nxI;)4WO2b+74 zWU^$4d4oiA%bk^ri5n-(Sh4C0L19VBAayU{5+^s_aUmh4_wP|%U7A~U0R$`raB9SB z9-Vv8$$vNsggbM4i~d!>9|8Moz3PG301@!Luz4Svbyo&GEp57R@zp~giyqrLUXlCK&5>9f{X`;iq$^5i|Z~oJJAvq#=yCucs2*A-)-yu zMf}r;2f8P{S+65fzO$|~0L(VCrj4J9&)@%D{N{Iu$)k_ht#!OKOyo>_v`=m4H}|sM zplotcIvQ^zr5Hy=lrDi5v~0-1B?lTxz*z?9_x!4RuMQXO9Hj?D-CRlCJ*J+Wopp6B z)y)7|%y@M4$%_Yk#;mYH2wVi9{)A4?5!P3xRN_?y=x;hEBDarl=^2mt_C zzt(Ed%q9eWZpxbCvc^VrtV z*6`fd&BqV5N0(#|tY9wF{pekyGm8Q!3Mn2nyFd{-rj3tSu6m_5P+W>OX;_^ZwN(3BVqY3vMxF zXw|q#h<<=RoRR!{bcZJ0@Y?3b2eNNgn#z~}8URM+ZhG0&e;g_s<{zVj3FIMNe*{>$ z2>_CH2X9A;BtO$s0u)%kJ_AL77XCdSEiIjuzJxqh;M!s2Hr|&-!(Yapd z9`0HMH4+`?Y0M?fSlFlm(0$}ApmA=bpVw~=>vwduD5E94LowXqdA}SniPh11V_ek7 zWnlQn(L9BhGKSsHUqBtvj|Aa66?@fbi&yWEWytEkI&N@H=__Hd~`eSrax62U-@>ts5n7 z&MX$z+eWFBqF&yp4!b%OMg=hI!-c|1boToZy6!-!i zLFbuqO>DyjtjWMLVinLMT47edyg=W%>)2Z4bD_7iJKz(G`3X(Q|K0fx?q5Y8f`cD5 zGo|1x1A7$l6lgRx+ErB5D9xsl$eeZr`Mv)niOKhi2(bG>NE@(~ZKN3X&L2C6MNvc9 zeu5MF#psif;0~@cehZhZJemO2Y2IBtYQ$je#pZ~>$)jTcZC6J@Pgtbs&v*9eo~5r1 z{>;3A^P4n;=B!;{&f>Z~25L?5|IIfeq)EetODD%bD4&2z0*k`Ay{u3&aR`|61#Qan%TXvj5?w`Mir^ zjiAH-cY+l*m_w$lny7CI(+igpsARq+h+_3%@~S*0tW-k5URUiY>~dN{R{lXWq<+6u zHn$~^pG}mtra{Kb&fbkt00#iukjCPtddeKr#l}ent24cK5!X~t6L6!Y`o1FY=+j8% zsk_b#P+8KvM=%)v#aKSt=643)mc-!ml$?>9N#|2Xerkk@zM;6dnI+O0R;x?;|$G4B;b#GT;R{q+qB z%Jv1gkkO)(-w_>?N(F+Y50_|(fsM0yEBbh;&tSZIRpDU7j6?0v1Z8RAC5p=hqa<)e zm*JeUa1vk@v4FU4Sl>q7yhF~Z*R{s})WMeU7pG5X$-Ri{XA_&}y7B#LD6au92^If% zgBN*a5rPWv_#;~l0`A$Rl|anG>}K4Fwm>d?{E{pT{py(5=b zt1pnkf$!>=q?CRyu##my;u)J(uvrq{UZ+>F``#;B%3R=AwK>@N&S$zVi=YbcGKVPP z>}n@u&?=@SL`-1QNosT&+c&Tu#a6!e$CvWuLv*4m~-Nf1A_ zm`kLU@%hpZLK-D@#B`DPM@PPs1$aX#qgUHsh z6}*Ar#LnwhT%1j&il+z-@sRv%%>K%TbKIISj5DKW zP93om@@;ZiBy`0J75&UDV_ePj z7MISYD81bTCui{0zX43iS#PxYx2`=vA#6g6p_o3AlvR=n%Wl3rRxS9JOWP)|H-{tI z92Y^j1M9EMviq4ts#MQ*Z&vSi4LQi?o%)Oai}d*y(SkC)X6Xu1$BOzaC-2yV&*uG# zA6$;!Yb-@F)+V%awVUH$rX_MD9c2}4kIXOy6-U&Jz7fa;*lJcRYR|?FArg%LLC)zP z_$b2hN*H5#WnduLrk#t1GGxVn>~;+k{=e5p{t7puk|YR^3Xy2dn5VAD!WigMaV~5K z8WEBXFfYxY#Ze?US%?D|sTJ)aSXxMo(Zg(RKPGGfznIa2%$6G`tUst_T)9!}tLs#Dic_i~ z0^I3z)o)3I=-~x;&`-4=@dp`2$;p;f^wij~r}-i^FQg{d47xtUtt2Fo9m1ou9Jk04IZn>h9;?-u^1XqS(b%Q&!q}q38Z`nl5vc9 zy#&9kU-NQ>3dJG~9DH$n>Ca?S6sdpxRE+K9xaEK3&nsUfmPe{n>8!zPyj8TYfqhR& zm>fR4k>=ZtajAMq1D1?4^CGwKwb&{QD&15c%U_ua6hjWur{pfb146CejpkEq&J&0; ziQVS%ZMYv&s|4YM?B-zWCZ$dU|>6h`5R-$wQk-5AI= zi?i%69p^p;=~O}Rk?JrX=X0#;Y9One((t}qj!nGjx)00V(N_7c-}PQlqU{pwS$iak z71S1M*3)T(m$w%4t{U@;<2ib+9F?3aSIugbl|Nn16~VWVQc{^bH5}l=ZEP7cyy)yp zB!%djN>g6sVxI9;;OUwqrSUc02`wz`zx1Og&9h4bdR5a;DcE)Myx8Rv(` zrZ9ehf!KApWnAU!^;addrE&Lh-qsIZC#K$K_vcaPw=uW5b7TO>z4+Q~zNnk@x_^>q zr-#T5ZB1y68?7;>YGVyT^O>4->%^ypPlyH%>`Oi5rSro*1BT;!HjKo zOEbB5C$8~%#ii<1yu4Evxb*1(hCO2@4S+=dO_utpsGP!ZT}zfRb1KKyO1)3l{Rf$> zLv|Md$W9X|raTrM`JO9$QP-IvyyD?@BIIR1xlwz1{zc8zeJ~KW19DAJL6YtGnnK`C=M97_n>V z(}2}s>evg^-E&X|=4Q~wa@C#S4OXw&JEa7EaNk)l>@6$Te9e~x=G^Qy(rH$QqWcAw z+*6)q{kp!s<{>!ZPa}-w%l9OgsY~)vyb?2Zr2vX)KL(4|@H#dL`0tLnc&XhG0+*=| zJ~q$psz1v+cjTGjBJ6%F%ffdDIw!d>h) zuqgyqM6W)WHiEgG?ParecTwkf(1r`AjU?I+0=z2I-^|NQ%((YM;uJ}9xe*}i=@iAT zVr4Pii1iDLUS6x5mD)R!7T)qU=041ls`h6cQQE^;$H!-t6-AJjp{Y~b7TXyQ3^8C* z2LzG5VHmcqpt(-EQhIe@%8(7hA_13fv`UPn2!bkFOy2q~Q4unZB6 zQTX9YZ?E}lhDQ8f)z$rS}A^(Gbi7pmh^9u0lMt`mZRWKsM z(dWh|-HA7V!}uRW);O}KFaDrXGHon}La03uOD3b3mZ-Zgtvx&P&YsICdwGkjO}D7u z=5NiJcz|Ns2$lAzq67#QGtPl0fYc` z7DKrooV*{Y_8~03WsRlLF2o>8vHXW}S?o+qIO@~yx7S(^A}@13w_^ge?`utaMozPp z{*SLg-}gP>Ms3^QAE&}qRwyoqycRkXp5DM{z2^F%{mr)~2gdoKK=0L-CFAWClyu$R zw`Kvki*sHQN;mdc@lw&^7>F+cOt&^Q1Cwu*Xc<2Rcgkj`S{hsqz-96w;X^(9(W=kw z;(qJ&sNN0lOJyCs<&X*F_L^5keRuX-eH=!s)x3^(5{bl#4M`NClpQ}d#ZdRm$Lm{t zZ=Z})2faQl{b$~u2-&ORWWU|fUB`86l>+1UlUpq|aQCtW~Ug7vAOXcN# zcV1;_*-=)OcM~Z(ut6uS0IhAl4|p8-!<@>X>-z-K{Np_0EC#To>kg|r4FflG$7fFX zNIVAz(V2J$u)p6N|8D^FGOC8@`id`ObNmX@r1OG9rlmNA_IPOh;av?EP;J{+_S6=6 z88#R)xMhz)`XhGA7`BKJtyy?jL4Ibz>LNbAk8{?>j|U{vECVe>qgaX>^C#`NrsB0Z>s zgBM%-P-fZzHE0u`7C#Z+MY2PDkwfz~o}^M1L(5>s ztCEqyICER}cmiRpBW^-afDW!;pl{!aU|1sGd!v*#95FcwYHK=rtA*j=6u7t-=olKZ z+pi1G^+Hh>mu!HrI7yoaiT;}foZY}axFY4BFjI%rWz(I(ea`V>QiW#Zf-vwyH`T8YHCaAXl7W?fTn##-WV zcbSrcRl)wA)@t}0F21zP>~Iz#F?wxIeZ6kM$FQ#&sqq-pu_>7&FF^BYwoe6E00e)@ z>npQ{qF3wW5&y#S6WHPT;F5-ZbU-sEj%>|==kk6uiqLZ00>;nf88w=qiH;#!2#tY3 z3m*8NNy8PXD=)^BLw6bIZf!d1vCjbkd}3fg-juf-<&E27=YiR!Z%ZKy8shBexz{_hIHM!w#a$^&hn`B~A7!usD z=LBPGWb_Z=C$8@O;jyHkU{U{5nk@KL2de2b6qN2KXJviLu>-&E&qOC}-7mBf%ST3` zrH$7mCmpERUym6+8ld%rN<_nUmS$vt$et}RZ*h%ggwkiCbOETsBIIFaY+__Jf4sHT zX)n9c_D1dtd2q;xyyWQzG%xw_J+Rr=|QwD7{SF4A{XyOvC$E$Ca$0|KrjWZ|lA-~}J;aBR& zIX_a7H@B^IMr%Q5rXBM0Y922jC#ARU@l~!P&Zw!#1H|ojmNGijfcj8co~OX$b)E#u z@q7xm@fX?8{tQS!I2P~Nr>Cc=(PyvHC-w1w2NT@~0q4Zk!C=dw zuMxIh(u=E&Pm=9W#Hcs_nIB|7`V)|_ z;8!~FZ~WkmtM!Z-LI9|bBfIbb;1Tm&$sQRZg_a|nlbj1jFtUKlGJ}bv&GV8#K1|=P zY_juWa_VCuR#6=zdt-eA8w2-(NSq3GWpmx1{nehLk%fz4J>KIkohjx*I&(ganRzb+ zpjq?d`e##0;~~E41G$P)Hd1RB=R0fwEnCxQ>S~uQFdYIvaRr%G_1X|Pv>?LC+B;z~ ze^?9<*=W{^zSq<|@HsYzz6302+NB0{mS(Cuit_M)DB?Rx?|lO)yL|Eaj1;EXFDx?z z_vnBXmX65P&HPJ_+ZA{a&h{7F4X-1icnM_b)cw5-v%}+Mb_fq0?IAQgVowMF2~g2IO)wdZ5o>Bc*Wd?#@#5e50`Lan zd2GMc`)#TuCRV3u?a~xd#N(fcAxr5fnF@%(`0Y3W@4q9&4jaJ&FaMOuE~)FT6c8^F zP8<_08C=mO;)0}$nPqxn%%_C~O&o03`m#aq?Px|_FaP?gxrXh`lvpmJ(giESpUwUc@x^7 z5g&63ZXyyb&0cf{^fzB$zA5bMQO>Yw`UI9DMF~b`8yeaJ2CDtOqQ~XJGE6Uv8@h-F z^=_T3(cWLC55uB-P^OwvuK+s9!|ZBqjiA3FDHEC%h8kS+C6l10bdMUpgRkGdlyQ1@{aMHpKEiJXuQgJEK(He=mfF%+`_?4c$b2-(~~sT5%@`m^!N~hYXr0!b#L~WZ9#>t1@Ne7)Z4@ zbeMUpjhkg1Pz5ZykONgPfj_t&5R?fX;cF?hpk_$TW9SVmK9gq(oOsGNQ3N>ymW>U6 z5^4D?USrmKANlJWwJdIxj5uLbK3lwqU|7l5$S?iuVt4O{WPOttERfgF954}?k_Szg zZyFk5g&x0*Wc0+KHGN8X_m+u=p9sL4-lq>-Tlx7@@+-MEc{7VZb|3d@6(7(3L6L+6 zgRETQYdCX0a$?ynk`|ZrTBY=Ik7n4G{Ts6MJra<-8?U zn+&StNzLmg{Bfz5)Lbv}c;Jsp{)}<9sO&)Pxrcy1F7xsYM3FMo;ZhkZtBYoJ-^@pA z!csCuw!86+BWy!ubByd}@0ge^S^|xj=!+;$>Ba-c;GEi_@7@Yy$bc~YN)pxruULP7 z{3yM4af~D^{-|E|{NrAYq2-%5uYt(n>yz;CtD+*t{e*#REzOzXtYP4G5LEy?MWD^5 zqt=s!eC_%$5nW^I6{{Sqw`6+DEjJu5UyjmgZk~I%&deq^phjh9r~g+^D!h$MLs<@~ z_(vT!V?;4UiRNbhs?zfY+lq>YCT$rOmJ@2K>XzjS&7)Wrq&YBZiKd~k{XL?am3pUW zytOi;3M%#1I$G*K+S+}VB53;rtB#A8Zn6W)PR2_$ou7_A_|Dr8hxa*}u1u^{XXh6G z8N&%3-d!Xry)x2Rdu)(zX=*w)z1JA&wAe>Y>SMv74L>*8rh6AIy!$rKyka$(|Eig5 z_9>^)pltFBmdsB#VRMNMArFEyGrJE1j-fn?xr4($TyjOb!5G&@vCR9;Cx-I>;|ZnC zi(TOuQg_MyCY8pt(=1@+W7*JAVE4Qbwp)GzDR`(% zQ-)8Wy7a`YM{>8lday*Fe)6>rn@=)!<(zosjBw@oPf@`l`(-A5AX=CaOTuc*Z#XThWL5mqyW#1F6RVLjZ7+c0KK{QC1s`J*> zfgl1b+a7T*tJj7y?c4C7r|Iqrx-c~mRO~rErK1NGZ zjq#@1zW!r#YY2ZmoU~*pJCW~b4vE0-2hH!7moJZH!iL{g&nz>Gp~-?!~Of+4wQBa+qQ;{mt}h**p?EIeO7t#+(wDfo}MgW)phU+vICv3lO> zH1VJj-hr_MKO_PvtIc1S4Ncf=>F>qI>_vm zIUX3$@_HI*Fn$#^)-s;>*R2Y^K6l+Qb*RhO2_-$}ehdrvNU~{gS5p5t-_d5jnx@t0 z{q!6scJaJ}ssL$p26u>eK(akq&=_2N3X|(Ewi{-gp~V?*B!D7YpleGeT&)tip6MxB z#bf#_5>_#6{<~~;bIS1Ajq|L^V?DLuLR`;~yDX*5y!ZO40@R_!s$I!=i$S4ZqjO8< zazD!OL13~}Go*DwlK;VA@w}iH^4M_zqrYr>!t1s>SCsAhFmx|4wlQWD3PxL`tX=h) zv}Lppb2ii7&(}KH9p1@`vm$T86f!AZt3KYYV*5VZh?u#pUqL#4uYL7dx`(ta>c!H0 zX1Ped`{`g(EioC)9A_ruYGmCk=%qC1b!F%CzS>?JY+r7i#?F3=m{YF>i_}9qjmY!!}Rb zoF<|dOO6|_EGRJhiChZr+xDNBE?yDJc#DR6KQyO;&c8HcniVZ&!|cH|pG%9Cs*-?| z$5W^k3Na8wh8s$gVn4hPP&Rwp%&F}!h`H|Rg@q~haz>LeRW`tXRjf+%pIKnEafPH2 zB@~y{DMB1T0(|!x6>l@ChMPF5MHT-R)TIyi>eb$rxNn4b8R}~y@AVgQ{3-0<0QQI| zk_%hFf{ua>A_{-N&%7yBB5L{`l_r{Sbhsa3S3)iP;{GNStY@fw zVJmSDAQ7`dN&aBMJb!u2L?Wdia#fjuOB2t$^OfA8gqD(`D1`y3un*aB=ZFS!@_09B zE4{GL!qE<$Uwf|tS!qom3aSLa1`8mC8eQ8`xz#gThh6z1;H;a&H^((v&bn7Mc`_*# zQvYY)bBVr1b$Vf%`M&a#+VB8$5XyHsQaC(X@{CK2{j@ER)i2wpWvcTPA-owAKlhDsmgD&NbC{S)IlvG1TeH>xqZ4 zo-c<7o}B%82eyta<(KU;HitLoC`J=B_@y$t6+6RQ=Rdy2JP^%Go(OipgE|%hsgpQ; zXzB_pJbOgaN)RRCzb*9G{xOMvS)6Fx?;~q_^VKG_MhEiMEE4i;zeZAWgDfie@9fCa z6pCk)0V0Mk4RG6RsnRvdW}U8_l*f6-jQ)Xsa}+O~l)q^DnStucfAO;a`=$iVZhJt9 zF5|v<^}NF4SR^$`9_dlHrCV)mXozoRXot{N0HBb=C9w)iCeaSU!nk1kd{)PRohQc^ z7Jf|uhd_#^6u^{JQ?q0pW2{`hVj@2I(B^n@63w(R-j&1}ry~CBL-fRS<2{ONkP&*f zzvMUywptZjsQzE9y#-WNU$-`nih|OOw1@7L4$(uGgmiazr-C#bq#Km30|L@5oku{r zq#LCB@ZX2u`;Bkh`@Y{8ciizGLuG*Mv)A5hu4g`L&S%XT4)n?53K_Mvvi8n~{tQnU z&gY$DsrBA5eEJv($?(OoC!n@|27FKT=Hd5&Qr`flwtHxx@r4)Br>YMfpB=XnGm&8MlVOY&WrzKk-D_@6)rN*khj#~tdn=Cc1ih-OcEQ3)Okg>>@d4CVqndBP z%irhh#c*RH!Cg+e`im^Nl^?^+B3J92Ju3?@Gm>V6(J{78I+;d@X$*nQ!t*r~l=SxY-aB1n+ z9#Ry|_spW<>`|9urHDZZ!Yr&-PFnTy;(qaBqo!^OSJ`O!r{S;BIi21Urj|uegpoU4 z>@e@(y7m6nbgs(tr%z9uT}t=Pslf^H+#*7AlXE)s5#RRqeADgRc}NWDm9WbIlR~nw zKkFVoduKhGrLi#^ECh$f(GAoAkUB6AJzdRKx-NWD z-h&w@9CYQYCuw4oV_%sdn5ppXy%ag(jZ zcin&B;`BOI6X|Jkp0H$gyafYAz0Dk6Wm zYtEQOfD9K_uagvJ>%!&HhN%Q368yvQYJz(sTcdhg*}{Q4))}7YLEq@aSbLXgK*}0i zO;~>abK-*6zshSV6h;roxs4N8aYow{9R=8MqL+VqJ}wLk{6Y}pgPRN*Kz z!ICDRKfMyc7G_UKVgoE*NbtO`DsNm%RxX)F``ee&e6yy}6o<+L9Vo%V!i@>1`~7E@ zY^o15dGNuP9rnXR!7hk##uT=Vr)l6|HpYpKhGmDn7$mHHec*b|ODnosEnoXv%U|hm z(GF&J*PH7?XplEyR#^LN`QlXjWFQ=Jx8v{wpVlCTJYJdf^g5j3XnV*>w{PiwbPo1Z zSloP#W7}0SOXK2#GSMtN3|XA-d&T9QA31pwEu%4SGNx^20*wT|#N>8Ve}tro^tO@{ z0+mw>{g=|a2_gxh%{`{9yxI{17A!FKECsN5_JVckn%C=Ir;}v;q(r|x{(_%lR}ut~ zuFoRXlkJ$(2rzDPVwe4K`6w4lxKm0s^m1WUX)c2!x-NJ8WpB1>elD`MIf&_&_Nnl! z9a_)c_n)_gkG_}MHFDnyFH#GnB90RS(?sBa#>JTulc z=O=?$L4UoQoSh4{UCk3^O?U{+%%X2EBUJ6>J>KKm1Kz_lXK|zv>R_+?eXm3yvXx=b zDZ9z$Fcd&UI5|61_a0hmf1OCvGfN^?GItXq3w;HGXs~Lz+0_adB$*|*m<^JWhEhHT zy@E{!2sfT)U{nLO#!dw=eNR=yw|(7zO>fy%?Alex=^v8?2leuiq5rgHQ_z#Pw1>aJ zf2U|+BHlp;QpBfrzln{DGpXZn6|A1n?myW9*5Jj3cS|qU7h;uw0B%@mL?n?D841$b)&rn6>`e49|2I268NHDj}&VHxfa@ndb8=UeRN5HDUv{NB%bptqQH8xC1d1Yqi z>9co=8dHzlf8hrsA+C!xlX2jHw*KXXE)rwh+%)ds^%_3G>0Zs5&}KyShOB})e@}Vv zlet$06)+&k0I|Gogq_c>Q|${d7$0@|$tRf$w}RCtKEOixudD${n)ETE*n1uZ;9P-` z1AQZaFIMk90{?#e@#+om<;?>Q{NKyS%rKCUIG6&z!UhIZOWlMkjC~kQ1=u3K8UA9F zQLeoZAnUa-Teqs2VM+|y$DoObmF^2fn;@8t_XwLD)GEhx;rrMZZm ze_ONakjp(#AZlQ)IvjK|zR2b;*LR2p)M!)dkc7kzlT>!Vfkyz;$%(Rta-G~GrB6+O z()7Sj{&`Z>2z>`eMlF>OZU?8^HiLu7IxJ@4-u4Hs@x`8hrk9ym^_Wn-YrS#x^cH|B zmumW=bvee1c6E3B#ORgOl55+A*%jrY^kMEIjMV=7+XP8Cf9R^JL~J+%?h)M% z0fEKyz*k}civIAuH|?WyH_v;EZEI7#TRuQ1WmWRp+Gw%2s6ha(XNwh2&d1Qtv?cXpXdMi0x&0ea)8)KbCRH?c zQCeBgjsb(hVU!gn!8kqjou6%7Slwn}NJ$p1l7UVV60!le7ZkccetZsrh=hAsTF-KM z0DMxhkCw1gLZO+YK^IEI}u0-v9s zU(1)xALy@~-G?N+vWf?Kr<|{?lLzRev%>5>3eZ!L9#*hw#L^NGDt}bZpqZ0OKuzl^(T1Ipo$qOob`$y zGPTV@p(F(oDVhk%Ce2LYFI&1yX4RP;9i3QQOs$`Z%ue;g+Jo|_asK)x$SOBb3 z?Oq*y)4uFnL#GY63V(RUz(DmKT(qgBwXSZ&Jl%|opucL(x#sV!3|78+LVf4xmw4`B zYp5eXiEpdDd)FJ7@JW-gICj?X%{#K{Wb!}Q569c1`o5$Pskj_l#&N_(2`TCeiyU5vbhWhjBkC88_v#_cA&@9Ne5kY*ZTbB3O5|xdiBU1{jZX z4zYWKwsGYb7Az<8e3sr^<+i~It~L6WoIVOAABHuOk>d~s$y<2qoAwdj9%5c)U_PTF zXe30k+-n5|BS0vR&yQlBc7_rFulRrA2@swJxJ)qz7%MS>_%8tVizfuLG%8#0tH_AD z-*aq{9W&T~R`^AknUzY1)r)y-9jKI}z@SCP>0w|z|2*UKz(s4QVJZF36DH_n(FDoD z0k1N8^*%mXuMW$4;8zn;dJw9h_^)EMpZwWA(K^JyJ*h2tldJN-rN~RzT2W<=2oIfp zG38h*n$WHlOhUi_l4RKCM9@+#|EomVPNyJ0xOI(WEe|?1P%Sv<4&mSov6&LvlR_*q zG|+k;KMdm+z&1BF)GH^(ABH9GB+NdP;-tT$WVM~T_f@r|ZRsqr!ndW~lWvYUb4uSQ zx6F2AHRhgjE(O)|1>o})(fs^Esc{TeYI6FXq!*5z?+ZCJtlv~yz>G4{cc&1ZqzxT}W#>-mm})sU z&4p$Q@Y;EAZi)rGDIA}eJTUj6o|u{0Kl5G+xF2S&Xol4?xrXF)0kj&MQQan3(L#~U5dEM7<&ZuH=*19Y7xi-}^@Ea_2;+e+ z&4Zm=eap+!R!-=$scRZux0Y!>_ilRfNfd)!NdON+MJ3C(T301F_Hb=JUdFQkY0&ISp{&Qp>&3DW)XA5?bRG*p}@mnSu-55 zkO7B~!AkC8+psd-ZBa_}#pl0LS7>9)1aUlsq1#uT3{!ffAr) zwy8N?3kUAm6`|x#-UvGKkx?6Y{|5>`YPSU91*mCbld#C@AXJ2$v?k9A7PYSN=t~=f80M3&o7y@I$E@}ZvFB& zUSHWXrceam8NxfB}`E1*r*oIs@=-BqicHEDT*hfOcY{CkIp` z*?Atavb*h6S93-#3TIv9kbiJ>+g)9r-<2x8qAK5qv2PS5gh|H{WXdW$X>xfG#6Mu<-o>BsogKZAuO=&g9 zP<{F7=hX=Yu&xN61tWkg#Wjah*=Fd)XK&nOCM}83{yrPp@}+FQ+ftSfB+E?t)% zXf+>`)Cy|J#M!EmPH3|NP*C35nhvb(pAP;fSyB|?=uvbWj~|}4fgvyDhq_kWbkE;Y zL9(Tm!&cg4gVxgs=7Yt0PJB%Ios0Wp;0Iedb=lqnU#ISu*OO5c10N`NdtR=(jqx{Z z9rCQhMUQMTY)|*q9(oF2M+3cuCoy7KMU+Vw7jPw0QV=&{*m_-H&~|eC zA5?NyOA{m~b>WUAn)`n&>>1D_~8n`HLp$BHCN}G+H#4DWpG5LlT_qzrWmNw$e`b z&V2-oj4FzMj@r0w4dp$P87ZQ%3e`?}FY2*Uqn*DZaDK^1-0})e2lzHz>pNGUvl1H@ zv=U_T!qJ^M5}WX%udeX4Nc#%E`~Jxg@+vX|U}ryOB{!X#ovQ*gw#Ol(Ozu)(U(B3U zD3gp5Q^fHS$3_nUe+-k2V?pgtv@+WKKIiSqjxP}2)HE;mY)-cDL$YG2sJ20T5wf3q5T{bM*{htN zRZrKsldw|WfWc0TJ8o{nDRoJkAA~FPzwgQVB?*i=pYzT%#bo$(Ttp1O`nWdM3Dt(7 z6j#Y=(Q*3BJU?#rQrTURn?)IoQ@=6m*-fsap0`eR@M(->3%G0tKJ^f}b<{IiZEb99 zqV!seEY;ZD+^AYL{Qd042JkL2rKM(vTD$gfd6ov7l@&SmxMOCLyuf6(RXe2wqjR~*l|6clCi2R*4A@#p}7cE(B-yLz&dhh3sobdu-axZ0) zRx5GH-R1uwQBhvT~nx5&g z&9%)9_(q%JEy`zA)H)7e-Ku8(JcLDE-ytv&;rvpWC?X}EJb}!TRjQ^)DB>Y*_N4;@Vk`L9-vK#Y7b=z6u} z1tXPvG0uYHm6e^(QS$3SgD=Sxj?r8;GVb#?4;mxw+UpTcKgIR>yiHR}ANbS7D=HNg z;#s2|7o0WO68P144h+s?h?pWezsx<^%#O`W%%9wv!FdT{>mF%377N?TQb?bsh!O($ z%SRchSOOo1Tw=7UXguZO8n56F1l-AWyp*_?#MSt*nx1{UX&Pm^6n_P-8--MwQfUd} z{qMIffJy=m)6e9Q5uY$bn4II68LE(!Qx&1*B(X5w$Xe4-#;jhx!C-zU8hDCSNQek97of^S(IkON zm-0p7^Jg?gsJ&yj$R zM8!4CQvsz#zOQiX{7!IuE(-ThKjMi47xW36eHhd*I1M6#UtD+PYyZj&m{@ofa3AU* zmUVzRFcZnv$DDCBGKkgZ#EF0U-R@&N;x>J@&9a(4+vJts18#)w)9t;fK-D!}qvL;E zJgPB1iX-@=DFEM<)%J&^QoA-Ku*LUkwT9!_ zhl+~Lrkw#7KLRoU@1f2UxmthxaxiAnq15mGg0%I1eit_1>N!!9Kb}Okco75SYupy& zODZ-1il@5+mRu0(KB@HdfUAmxTmdoKBV~B6_>Q z#s4`IV<+0|2IMg|=D8dKP;gSqXg4y($PeM}K)5{nuKSSL*|%3LAl-L-f@ooJ!ToP` z1)PWM7zidF&fj&YiYiqI6t2z71M?nw}p@!u1+6&|)j zh+4`Iv@CSLJKxp$2<;e;epLrlA!jWLZaVJv{y)EDx|~0)!yWxZ9-s(crF!>ZVe&P5 z^Q6oc(Ak@1v^dY(?>h|>M0`_IKVJLeV|ve~TQ_N6XbkJEx_F#jyjDv0b2pY>FC);` zNS>QX%19hAa}ZFwDH$9k!E6jKYH=#eEqq0CKGU>wvo8hpBIu7Dc02T_*+aYB3$->_ z_c{aKU86P@vhR6}M@xx{jl!fcC{5Hufo4tQa@64MqvYzk?Y>WSB^%{3txrtZ5Xm1? zrk0Mead*dVFTS?BhTAwEJ;&n`)!Fqq<2zXJ-N_)x3EMLLDowyaOu90}n7)HaG z#Xs1hlSrHb?rf@h;8#F%V8)3lnXN=2KZm(7AJ+UQI0Z^^>J z)czn`lW!v%3k2L62?}E4i+5HGzr_AzD&~B*HPTsCv~a+SeGAs2BNZ}cScGG`*lV$n zNZ)05VFsdq24MTk%sgZgz+6hLE3jJI;qXd?M5MaDNfjX}s|4UKH;G`1QMTn3 zjOChYDq0K2+vkrQoSgq#>LRlfLM(f-3?&=giS+*xFD5c*%FL2!a5bZj-e-vbm@h|Z zSPsL?84cGzDVxv6L|QW4be87p4QD>M5c&ZLLQ#*YMJxkp^xgd;>J^rT{Qc;fCrf|w z&JR7U)~_A(+{P{A8xGTd7#z0ed4ERK|MF9d3V?GciwD4yor0u)Q4l6G4B#+ zo~%Ca|D81Su^ESh5)7-9Ci$)i0P_}Qq0OIj{E)fx$yHlwJfMhn-}?Mz zYrXyU*H$DmAth97`-BLoGxT9|ko}dj=&9Y=%+yog^YY0cTT&`NgfmoK`ne9U%gbPY zpTXKX3OQk=M;x;M{6{O6!Suz9y6i{Q$N&F@<=-(Bm(^}0l14Synt0N1Zd{!Hcs
AIpp?a~} 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 zMM)cIkFPT$*j+)W?`Ehsu==DVDwdW?W60060512512FALSE4FALSEFALSEFALSE0600FALSEFALSEFALSEsr1002562561002000000011060001172551000FALSEfl100#ffcc0010.80#ffcc0010.80FALSEst1001#000000000 diff --git a/breakdown/images/builder/animation_out_point.png b/breakdown/images/builder/animation_out_point.png new file mode 100644 index 0000000000000000000000000000000000000000..f217f52fdebb0c2216d86d72222632beaa9dc9d4 GIT binary patch literal 18771 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 qD%Arb7vB)*({@GVIY$^U1relF{r5}E*QH)AFM literal 0 HcmV?d00001 diff --git a/breakdown/images/builder/basic_properties.xml b/breakdown/images/builder/basic_properties.xml new file mode 100644 index 00000000..d71ac786 --- /dev/null +++ b/breakdown/images/builder/basic_properties.xml @@ -0,0 +1 @@ +60060512512FALSE4FALSEFALSEFALSE0600FALSEFALSEFALSEsr00256256100200005FALSEfl100#ffcc0010.80#ffcc0010.80FALSEst1001#000000000 diff --git a/breakdown/images/builder/final.xml b/breakdown/images/builder/final.xml new file mode 100644 index 00000000..a4f1f0ea --- /dev/null +++ b/breakdown/images/builder/final.xml @@ -0,0 +1 @@ +600120512512FALSE4FALSEFALSEFALSE01200FALSEFALSEFALSEsr10025625610020000000110120001172551000FALSEfl100#ffcc0010.80#ffcc0010.80FALSEst1001#000000000 diff --git a/breakdown/images/builder/layer_out_point.png b/breakdown/images/builder/layer_out_point.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7e7c7954229173d41d17d205599b61602d12d4 GIT binary patch literal 54518 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 LUOq39H4XU>Cjd@z literal 0 HcmV?d00001 diff --git a/breakdown/images/builder/setting_up.png b/breakdown/images/builder/setting_up.png new file mode 100644 index 0000000000000000000000000000000000000000..22df1ec51a735f4261fd4353704114415ed9a47e GIT binary patch literal 35506 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 literal 0 HcmV?d00001 diff --git a/breakdown/images/builder/setting_up.xml b/breakdown/images/builder/setting_up.xml new file mode 100644 index 00000000..d07bbb0f --- /dev/null +++ b/breakdown/images/builder/setting_up.xml @@ -0,0 +1 @@ +60060512512FALSE4FALSEFALSEFALSE0600FALSEFALSE diff --git a/breakdown/images/builder/shape_position.png b/breakdown/images/builder/shape_position.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a4d05b6a4aa4b0f2b302abb2e3899a0e326e36 GIT binary patch literal 39270 zcmb@t1yCK)wk_I(1PBl$AwX~o5Iksbhv0$0#@*fBJ-7u67Tnz(g1fuByKeM%&bjwh zz4Ok!_3o=*wRf|t+0v`mTw{(o##}+)q($E#;vfP5@J8&bkQ@NOOn}d0gcsl$2`B3y z@Xu?jugbOnfYSN*2@^|=f(rmdfS3@!ypzV^lCzrp)gAol&R{e@nY5hpL|uUnC))lfRweW$D4%P}|Gq*^w@i$g_C849r1g0t z&C_GqXmY$~X>4+TxVQK9L=J5_8=Amw_vhVL93&KmV(yQx%Wr9#eZg}%WxM_*T-+T# zzTbU)S?174lE)0~zOBIQ*QrTZni3~;NAewee7UGY zyk%3YVTqn)kk9VtMfy8}Z&~LP@ z@1#8{7@;Z|X7~gT+E@WPZa0=+(*A$i&QCMmM*mFNC)a;x4%l!AH1DK8QIHTX+OuyoKaryTquZP}k42TeXEuE{!@ zyKJ|_CN(~=dbkDyJ{kfD>`50f@fnoS9R{CMc#{YoOfF0~e{pc&aDp%PnipQa!Vt5! z-DVN!4N6XH0<>WIb*e`T9lgiXBr7Bg&@zZ(t7IWjtAI2epZ z6uX=?N>4)rGI~VPR6GlKN>gdIT!o!pyZfhqNXLT-^g!?%RX5g(R_uN6!F^-8pzGT; zT4eTg^v6;-KDZ&g;X{lL#S*Tkhlmp;6&2d(EZ6J2qLhuhRKY@ z0)DypDmB{e>lbfd2rvm`_6RSie26e~5_U?wBp36~IyOp?&Kb~1#%H3-Ien=6up@}Br%pL7 z?Y0S`L2dI+>PO1y`E2|O@2N*vQ)yb$E<{>>_|Kp}XRxDumE!4a6XgkIiZVPv!X{fJ zL*sr)i!^}Hi0vUuF`>_ux`w}YG`o)QMeqa{5eOFPYDYzJ@ptvt_hU!lLs%M8+S`kG zkLdvqz`%6a*u*7sRHrvL{~4k8xZK4;hEp&-sIRILb>Q$OSR4yVyyFFi1m7Ygf$1YYr*mf{JET;Z|d%jf%C1%&*!6|3lI7L z516s0WwdF1+rL6AudB<<^mahVEsKUMY~cjlzJVSjv=WqZwj9>#AIOx9Ada{gY%*1~ zi<(A+2V?7dB6;ZDer*=>Y}s;4$)KBLVwRlLcbF?O@i=L71x~w{*-~epI>7{Sg^R>CA2Oqhr0HF{x(W|pEmy27K|Q5& zNaEMfMTC&Uw~7R$rml^R>Fx|a&R=U0MvsWkKq01A|A%P-UV;+u3XkT#l zGq!@DkkcV=d-VRM`MG~qF#sObanV0VTt$I~?wG-@sz4Pf35m3cQ<^4+h?oX{R71_yKj<{HOYN`MFQGOU&c3KbUALo%&FazgOixSggcq{ed41*@qYs!pnVaoYI5>2nZ3w7og1c z$PW~}_CdHnwtb+fSk9t1q3aLoXPOn2Z(Qdq%TGAO~03Utf^J3s#QcLC%h1Xkxq^zn*0@4)+4Cusq3f;84Ncdum_iTm1ELYKkI(|;FFJE&B5 zw`&sk2mo(k-)a)voVOx9rL06+ek`txF~|+fS!gsUoYOW-vtxEZczCIjUt_0etge9% z2t|ZQr^e8nzO!TIFjvMSw(HTFn#3a)LjvUG50efQEqi>X zG6_{#${DMwP_jr()i$xm{kwikVl-WUDQ0GTp1#?4Mkx0v#}KYovz@D~m}X27i^q&+ zB{387aOWvT0wCimAB!u53ywC*uI<;d+Q`bq-HMJA%qL`a9rbgQvSRin;URK?5n4j;DAW%>F$?Up2nonk|P}n6bya2Qf z4KaP(A|{a0V?9t+9S9Dtv19kDJZdaEDHgMo`oNgID;HJT=D7C5Uvxh_k3*qK8{=Eg zeuTcL0qPm<`H7F`LhwX@^!E?)Z;LziJ`1~uN(U#|)!i`wlyAhDjEBPqd92O=pz2`W z9omx0C6mpch>^g|=%z;)Z&%ur#RlWG@uBhah7OplLOdwfPpzV`h=qD8RKl*q;^J&+ zX?O4%0O0-mdn&5yvEav@jLY@;Ow%2dw0onwOqZA^y^X$#o~_`H>XK zI6rF2&2~R2vBQ9a04l;=2PTNuL`dPqVZCQWtG)-cMwVy`4T_>c&M-tJ&Ip-9;%!iQPZmw0bU=^}h ze@tLO5TVcIkhT3|dUopq34xgTb}6o}(eBSUQN-`c^-3_OjJkqncfqswwU3^e@gSeL zw#F?5dEKZvVhk3spW2)M`O#i@9Q>`^gZKkh1_Y2d_@atM?_;tE%UKAprLv7^=vB_D z!-LGLNHZF12{Y6r6Sw22(vWw<7P=r~&O7h+v(Mnyl>xmsmOG_DZ@yLa+Ohs;B?H4D zlyk(lXTl>gZXR8J@6Fz*($5%n8;l2n--Ni+}U};FNHf-&ftXgr2Sjf~&pfu8ZnTf7R)KY`L&XN#S^oQaw!;*7{1CW45IkOO8%5S*_!poGO)SNrc4uf8IVED0NFU4qwR zJ*+ya6p0pDMrk{?pINxa4J1OY)z=)&_iNB(dk=1!G$=}`&FHGCF%9XTo(6B?5$U9Y z($3AUE8m9cx%ORSDh&K2{*D=;qP7evVcG-Z#8SrN-fC#gQrdlE=td*D@+IK#a}}Qn zT>#dSNYk<+p(yMXuI{6bsBmb;4Is^uQVpLac~d^YD`em}C~ zY4BO8XFojlhs1pK5pVp{puP>5oM5!nF25+`?(^GUx(YC3AVW@lxSv3!}* zMi9u;MAkc>-(=f13^3$LJ-bz;Xsu{oLji1~cO*ko>R2t!i;Lo3m_W0(!W$E4$a|!a zjI9@|h!NI7M7Vpn3I}6IRFcggB%>>?$$Y*>Dwi#>D5vRHQ+#)`5FuCy6nM*M0JBam z8wDQ<<$UB0Km5W=a4R^I4=d`f*`qi${l+}ob0b_?!2XFr%yj%$k-84foVEXAba!-b zTQ9f1s|qu%PHbJrs5XmgqRV!)vBYjBy1?)RecwWlE$$(+$dF@htE@>2ZVTN%%BDv*oTkeVDuP3{)K_vwLM}Wn$<;sN?lrT_bkP5SP_n zoAI16Ta9W`&Jctwp>uA&@*nHbjA%vMR(@8^N!B51V11s|5%Z+#Til3&=k;EZ%qz3@ z<@09sz#HkM{HJ^G))=ySv+)WACI~HFd1S}>C_FKspF2*_2=Fl=WNYk=iXyNRmfIib zUd|Us4cG_x4PvS{N>XIrjQ$pd$u{|Rq}mbzf))FSR^nf#=Iz%c){-Ag9SihhqFVZrdb*blJVvXU! zAl{V!veWFUOgr6KCUkEg=QQpZ(pqR)8gU+BgYA!I)57UI%t_%q+@DXqr(pN$e@CO* znZ_2R`aiT6wQkS7Hy~R^U4x!}{D2Hf;1mlwfs2s-H1p3m(Q}!r+qDjlCA#@-l(vf^7^qvW`XT+p_kNi0WR~1Fd{N2bVq%Bl6}j_S6F7j9i$-bI z)R$f_pZyFg(&p6apyi=G4}Kmx*-juA`zE`4xH-4%c9IjGV=3dgP-IqvPe#hDYtg?* zbVHP=QB&(?siCeBzk`iH=D%}H!ps0x*Y{s`XpQI+;uvU&iP8n+U;r~XSF_96DN#sn zK-PTEu4IEd)-?+y&f=^EeYmr=bbs=YA*&_jY@5Dy@z1Nmhf=eS=oc{>IQQcq(mic& zvbmwG2&kA{QKnJWYdno~JTph-yxK$37<4}Kym=~pTy?<1G_)PtR=6o`0M}&w`}!)2 z-0Vu_xd+3kH2i>YS@g`mKunzf&4CK0O>>u*+Iadd=HQJ%M@CdgoU{_vn0U+JbH&6W zbh0-$l>mC#4@(WBrPNmTkzIl{dH&m&2Kous^PgQTdAOj_!yoED%QkkJf82$KgkAe@m{0ac}T;@T1Lf9@_D(cY-x>|3=3%U`3=I!facMq z-=1@|GX<^;m<@e$d~~eK&4+o)5Flw!d|*B=(cErwcdXk!J?|Uv$4j5iO2KA3`!+;8 z?{yh@=^D6raB@6CqQu22lMy=#H|rPl=UVYNR}luxI3k5(*Gh)tFhImmCHJlm08pCK z4wa60avbbMpm=P~+U+!qNG5~CkZcu!GFS%7+G7T@XJ|u@DYvDTH^2B=JY$aY1S23g*l17zs#M2T*dpWoC9{#X=K~#0b z;_>z=qNgX+@_X%ENNK3M{|giIWtDtThv4P9>zKj^Br#()a@^B9(D~8ssc#62c#KLD z#3}_nwHTHXXoE3T&ufeqSW}kuDt?`toNM6Ry!{7hg8SkOv-))?>UH@$aKXF^d*xEO zTpkOK8WI#SgFt>W2atRe@7x`um9z zpb{A&g1|1*T66)DC%B}Is~)fxqv(-pamY_spE(}5x!QDo!3UyR?`hO^oIFL?O$e$L z>gl>OOq+KBtn!-jM4&XP4QlXpH~|6kBG0*q!dEJ3=H#-pWmEDYDqpH;HcY_DY}x1X z6`QqqTT8Hehi@P+*Tb4t#43n)QEQ|dj~jcwYT=P|E=c74hNP27y*m^Jr3P`WxAQm)ceY=rAR3dlN8rC;omw-fzz*_tx< z`^HODW8ogE(a2&`KO7l3mth*er*}z!b4mGI{!M}VKxwL87@AE3C^qsT5KqENYJdtX z%l}WuYVTH_6RkMxNbCcwgN~bYHb7;ncq{rmC!E{`me|k5x6f4_oSh)=pv(RD`~>{q z14I)Y>(9-BXad}SrUH(gFPdF{s5e$cG869vSju{%H4JEMcP3Pjpkl@NJ!OW-qV7mA0pyIF_{`u>Od0sR`L9B3B!4Iv06nT6zC5DUQ;}`uc zLTVVVj!mxAGbe}>rf)l?5zROIg2N6MBbc_LPUV<&a%U@U91ffsO!MNX8Gz5n^AFS9 zh@0bGBh>i9SBT#x#Z7Uq*`?V0KAHB^k|4SRTFj6RYIh;lJMq>Je5 zmKN9d+1h59Pxn32PZ~3rk-~xF7fFBK1Ce1(1%l%a&>tpM|;I^GxOjVWiVQ2B! zZn@iBTgo{c3uqXY6j4Ew%1h zkKbD{zHwBB_pHsSg0Z#&$LO4`viEW7u~!H$jF9dvXts2R-RxkxX_G=sTq!)`p_)b;i5VS-87)%ku!GY0 zjqIQ0Hk1ck0h?UD?kSF^6WA>Oh+Tx3TGufAc;2Y7LRNd+X1~8{VDl(dpp?>*I#;n& zmWFQnSJfpI80EXHPJ!mXF__;Qh0Px<1r|#!LC8OK+?Ro7$qRBznf{MkThYsgEeOPR zf}lA5-xJ&ahyR*eeY6CF8(c=S$gIuYphg`D)5vp@H7j=0y@I<-kjHkQDo@)u;1FLE zI}U%<%2GM~5&?Es!Rr-h=}3UC0U2ye6T2)s5);-j<+ALUM!W7sMpLGp0ls^rgqz#0 zE~f7*0F|73m;Um3dy?%E9sGzH_z`O!Yy0zt#eTJgZE(_hj?28XBeJ;P?h;T=4E$vk zU|xizeKr%3)(dZKY+cUc)$nvP?2}e?A9$cW!FRG;K6U=w@)@yN=eg_A6Y^+mdN%ja z!$>fIFr>wp0H#{7PNe3Ht%(Z*Wk2rGq)YOUe1#=M;6?aqqiDOxwnXJAm^-nYiO;M9CC!k_TD1;V5>$Oq{g=2x8dsH`z|Y*w_Gpw&&{p~ z5We_Oh;T){{rN}VI-6rJwSt=hN1E)Gf(EC4H>M+vrce3p9zL{hO~&Xs1Wll}+FNXy zLwG4+_p^3JnSlaRu`mn^r}H&ft;OJO-UzK!esQ&qtrE|Pf$@^0zArg#WVKiQLAiP5 zs!Gi+C+HfxjUB-yBI`@|}Ok3fGCX2EZcuOL(di_Z;TR5Jk z9G{(L&h{Fznf8V?I6!krS7!O}$Du9lju~6yU~n%9g3eUBf+YFHS!mBn!fCf^YcqH` zG+MLK$scj0&GU>(f82z4YF{Ez`R=P7)YApFbY~hzxSVsXJZ`8X83&yP?~Xdo?t}Ci zWSS_`cxDjRjiWI1h7ROGPBXB+$1h;Nd~!c&WxS4EYwy5UeTl{??jYY+u*m@($>vr4 zDv{-wRcv3dCl8L;TwbwCakB4#1k{pU@k_Yfw#PpNL2SylSM$5SgAs@Xj4h7|J_eSI zXs#4k#2S$;gw*!jcKSK_&ED+uYnW@8e5Fbof(Phgl5nD3n%3%yg=HtZCvcM#hTa4R zSW0`mqe8^TWIzUTC?rP;hd>=n&iET9^Lvbtke;qkTP}mzTQi<-znLlDy9k4Fe|ly+ zWT&F;p8l8@;#kB#Hfp?gSb-|A%gV-JtAUtjZdkho*$fXOxZnIi0TS_fUDG4_hoo3V zia&p`a2o~$=>J2IK($@WhG-;V|3m<^HMD`#zEBxDHUt0waa4)62DK&i!hEM%#2n%@ zy*A&mm%fKNF6Wj%J8d#kl~io7pc@3qU@?YWgav_MEp_en)9X3(xf;y)uIe5m)S7rR zPv^mbG@e^y4fAD?AAxAP%&}s#tW6}aJN%iU&oq;n@+R(NsJK_1)q3tvsDEKZNzIfL z=Jy$I;NOWF>Tuwy95$%%egS9!9cC=_BS(yK=JK2t8mPjuJqO_t;W+Mf*H#cAi1zpN z#HQq$m%dhbeL7{7zX30zA0Qh-g%DQN9yVU`6~wkQKOceRS^nAgnL)LSslHNawv?Lc zLufeK-$*g>C8ahlj)p)H+;_uDqG4k|kD?%IYF1}hW_4%w%>{BLZ}@3=q!Ae~T4b`# zz)q6-Rr}lQb7f>)VdK@V(b8DDhv1|C(~IK((Gyh7YiZ5lU13hRix`ENPo|s&J}k#G{!NiH#F2+>zaErk3@Q@98hKH*CB9?xi^GXT z9sM*LM0fI#X3p5Ny=A-imvjC_>VSuI@B0GIDZ?(qqsB{NFpQX#M-H3IW?08+>M5IN z7sr~`m*0c1sdL{Y6X9WU5LX*p%G2QDFn*XXn5!aIs6@LAsXE#(FX;ewfo*U*yH#u$e%wd54v3F29-QBHYaFKz|UQ3l_G*$B~=% zpk%?d$ORVRIVdR&wQlsyVIcGxXiYoAvlENf9edlug=lL+TPB9$<3qtN1m$BtdyP$@ zy5W#Wq*W7Gkdok#)BnF5HEOlJvi-9_H}(G1wf>{1rco%4zlQ9nl2)TAqkz%qpH2L) zAfseo=7(a|+b%8DAA@t>8uu8y7BZ?8Q1}Lxe3W}MsNA$i+q#0J0;H;=T0VW8T0UGp zyB{gewjJxm@CA&@+BchF!B6jf1pm#59pl)w`5rZwN3wLeC{T_-h28#R^E|5BwGcx3 z!ctpP2l*yqYwCUVQTdpTyaSbls)S?gv7BQ;Bg&yDk|<4+V{bD&9l@+x)m%AP%9iPz zBl`27jnmV!Pyf9!AhkB<;XQK>D+(CcgbVQ@9C2EVKWPMws=MD$WMkqs88$UomTWNw zuGTt>LO~*b49fB0Nci`*xaG|8$f$a3Xhq38W2q(rlE6jv|x$D$lDl z)LT_ne18p4lb7~d_C{QW52B2~c_Bq3;mTM}VzU5k+BO6uPF&PnA?;ci%$R?@9^H9$ zv(^NRpP*s085HoYCODEB51oUgmeJAdQt7^Iuxt=yf1r}gA~FQ3>bxn>ec~$VwG_W% zznID`lA)G}3W|12XB2~`OwX|tQ_MD^*sE{q!N_o=pBc*2EZRcBn#o&IgOk@=)5OX| z`#W(n%<2BEq7-Dp6@HoYlMQG(m4E%7c_S7YkY%zm#i1j`3-7DpmHJT&&3ERkAX zd4X$bTwsES^C?k?`U5)0diokF3l(l7-X)?BQTP-=5-7K%Hf?0~DAp)C>~bFJ{)d@- zOtb6^ahq0LZ8X{>kzpIT%AFRBkYQ$Xwg9btEQ*%MJ-wI>a{83I%dlq4%Tu=BC$q>7 zg#`*ln4Fj!kL#Zu&>O;#H#yC~BI(g#xpsy3{PCBv>2P)G{n=tf70iE`JR9De2P|zh zs4T5pMN1}L1s zE(EKxZ6ba(sq+8IQl9I0_xbhq>+rV#LSpdBq`@0bI1+S1PVB^hVmtl0dan^h<4`# z=@j1-%)LQ%(J!JO3?mG2zwDbS&e3mA*&hr=cq%Dvql&wBPVa5Pk2-V-AiWp>gY)!e z=Vhlo^~~J<3gIo!7p_?z8a`~aL-fTAi*oaBXxHm{0aq;0I0K^|oKrHD*8nJWNK5Qg z1Pyr5-d{!UN4o>C*an5p&d2A4_ds4){D>zgv4-1=k_pcfsun{6rP)ws@H`kV`ks^T zM>^|*K;0|+{sj=zmxZUO@Cg7yrgRqeuY=6KZ-dH#*}hSQ;~N9t$Fr-4mFee7l_G%1 z3d?G#?o;BYng-8E&v6MFxH;4B?TBcD|dU z-p4=S2D^tqA!`kPEUPKmr9GptvdiMVI+Y7}DM966s+)*ERu?~DrNYs5*F8%5r!AbP z3MzS5sbBx2M6(i;2y*XfK?tgAiqs*!tUH!u1@8_SqKQIvH+0<(D}7;vujHbkvEKEf z>G7opn5jVlm(78>25c07|1WZ)Q8V zX3^*Uloz*`Q*m7JcL$4X$q$TOfhX@yuv)D;|B%{?%BK_%r1lD^fTCYo3YV+fpc8Mp zW`g1DW?i2KS7`}+i^5*}9Tv&wuRZ^7C>7rX~ZlQn=OhbuaJ~Q^jN0u z85AO2U|0XWKWtu1kZJ_lE-o>D1tJ-J9(@K}ldbC9Bxz0VJf@d*@S$M@A%qwryADGC zQh8c%Dq^Y2sC-pX`HIuLPX;1oR{UMS3-PJn^R;e-VAW=m>aAwZ_b6oA8FE3woTq(` zf<2#6^RDm822@p;6SU4z5?G~F!O+)e)+aB_|6T5-A&l^b92Sa#%K>qeG@ax);4xFl zgp|Z@xX+^DJTN%JD}i)aNlg-LgF7~=oA*K!C<*8TOPT-4F-^Ns0gs%5nu~grbo5hv zf9%0l7=GBtb==0pSD=~f)8{JjMRK@l?cxg!O0#vP+bs`|TNpD#y0HJ;Fe$=k7v|5p>p zz-d$XT45T$U#>)f>P!UOHa;t{;_cO9sd>Z@q*9HZ-uTm;YK!7je#QF(410rdH~Tvi@zp5`mCzA_@u-gWgDJ5Z=X;=Zd9lEx;FBRUob+ zyt0-9IvZasIL>;(8r>EYLKNU)B`IR|^uPk-A>g5wyyZ&m+Lju%=%p8XpRJtFcgR!u zTL2=dVO@6j8|-P=E=!ccmwNtki^`MqtkkUw)|--Wl~vVtwrd9Zxo-gkpM)rejnrA! zCg?JiuL+0f! zCX!ZS-f>PwPA*)4?kk-cSF^0{y&@75Fp_7TS5=9L8`)l9D>YmRcRzrXRB}H(wcRA~EZKdzVE}Gl-I;S% z3|Z@$7!}<9+1k|qXS!?zOP2*A@#U{4UjZY9+HqXK;9#l}9lMP|b!fmgp7WC5T>c)x z4QL}6ZPxj$1n}8Qxlrp@6Sf;3OKqo_LAZz7p}A!n2FRQt_+*x*y9%<92Njm3AL9 zDv5HLm#3CwM)Ft0Bpy_vUvpB#-d40SqD|CtnvD`Ci(_v#uN>wW1{8ZhkDNC=wqhHy zIV_b*Ju{GmAqC0^(qOa0k?~Gb;4~KaHvSAE)NpudC-jB|(Dr{~*(n9Is&E!qjtuEj z9-G%47xIysRc!T!KteL2&r7k1IF+&ww#L-l)vTMR#0`V(7+Cc|9GCbY9>4VZS1TaA zXHLCkL63zy>dX&yMYJHsf_gb_CGzCU@7C7_55Xg!?9lB%jlS@ z`~@3o+r6o$|IHPbVMF?zcT&~OBQ)mIPp=hbBE2_I9BPoKgNB~M>GLempBh$ih&`l;uzKQdO>P62F91(8X;J0k8yfu8g;kw% z5)L1tuU@w6g;*A%CGn2ig9DJlqK5hLIkA&;Rb7Upq!qV|Gljz4H&}nB;QrOAP}>n! zkGg!(uw?E3=k(C*ri~9XQ1E04C!{aS*z_G1*1;B=r#D6Ej~{K?9gDs`yJ4yZlSV(K zq(I9dqz{UvST78k_sDK+*A9HqS+XLxfrE0mZ(b6^W#F_4M3W^Q@Dm2##fZ?P&diHf z)z(6x3gqPbP&a_V(LpZj-4n8n|DR5HLOYl3`LZu~rKeV7N5jh1w7u#qq2MkT`B`b$=oUT*~ptc z>Qs&n)?ff{xxEBZQ5|}XD(o-~X^w1SF3!d@of+BA-l$7C!m=;Pt5wV{Q**b=%PrQ{ zm-~DN@$B>sv`WaBgd;y#!-i|b7?fUSl|#=AFk6-L4>>TeutLTX$j}l>C9#zOK@-!= z{e1-T@3d%-hJAjc)0kF3LYo5Rvw1^Kd+$Bx5bzM4ViOB zdV2Fg(}|0p+VPC-&O8AwO`JjYc`XuFFrE57N54H@YgAH)7Q@#Ne~lxyt*NQ!o1z$pIzx& z55J5D*+k$$4SK?Vb&H^;TM0N^Cxu|SBKQNRU8uZn4aPCWs`Uw2{CvR95wyWhk+Jo>|+%To3G;|6%4YK7?vY+*FT6@F5@+0asgM`QO(1FhqZ-bv*7KjM9vP zGdiixZv0o+?3n+dBPCayN5qa8aC6cb-~pk**x8>=;to}GEMWkcPFOKi$sdVC>p>t7 zIQC!6v==qk>;{`_&T-F4n@KA>Dq&WAHvfQPGN>!W(qDw@Gaf9}tGQI8`l(rXHQwhi z8TQZ51HYxy%cjzX`f;${!2+2iB+Mck(dvzhN=4AUJuz=@4X#wl(iQushraG^hA5-1 z<{L(Y^)x2K7j4^2hEGK$%Z#2+6oIH|mgcVjp1=zu6B7}mJlrJOF{7uGUD^EO^93&l zDqsGBDe>xgoJ6x9X)8a<%5dtr+E+ZsdZW_tc$&y4D8?7=V>$xqzmg?tYgfj^_;PcB zS8;ZCmo}VMOIucyz{TF$!ZY7P!O1vo#EQkrW=T)Ss$5*NF(NLRjDfY&zQt;1XGTj^ z(RG)+sfQk+IJx+sXOM#xakK0VJ3uZ~;YrFF96~5A^|*d}#-vETO4{)!ZgZ1nu3BPY z16Lp1TGMV2!*;7UDn-`tyb&?rcv7<1N(eM%X5XReFdm^9(!VgF9|~+W{|7CwSu6E(KN6)c0vu?{DdF>U$@K{&qJ2r{lBn!^~;W z{Z2(SR<>n&je-~s0&T%|xc{EV9yy*VN0w{J%%#S97J)q^yu5c%Pz`FKt-BN0me&6` z^pYQq?di$4+vw+>o$}h+mbrPjr#>47hLti6weXxGE(h&jXc{RfK=IX<7wTM>&7>mx zyP>KX7XFD{w;R{>#^Iji(X%JQQMbJ1i?zVq+=t`6PmSab#zkbt_dT${vfER1ajgJ;>!?`@Jl;eRnPsO=BGZPp@bu8p7%E^uzr7bDk?v` zJX6;u1_q_1hl7Ie);nJ(O0%)kS?qNNSspGG?jM2;R-VrYG9xD=$+GqiV3druL}6>L zBVK@ptc#hEr6}j~g)ySvXm)JkvbpAN$SRM{#Z)XaDauNW2Ez zSivTp*c9;~k!Z#ET&AmYq&*{%_0Y7DXSW<^s1S8u;Q*)AS=--AVhPT<Kf1;AfuCD2>bI2$AGFcx>xZPp5wB0bOwAe zE+`Pr#ykqI-eFSxmhI|$o!z$NM*jCqOnPbPfTkCbxW_{jPlhOF;njpx()N;PYwr?1 zkebM5xwP_BV?9+szv9VDOuoHWyUZag{}Pa*r3F36fnwDamnY~OLJ!K-i!`T4dvi;} z*1RqqXLECT>2Pxjl;6BIxeb3=78+ zDSa!A0wwS}KRdgkyY z>AnMiNC?B`_r90A{Yk`EeUaZ<@&(O&uz zb(&n|_JmKd)10ST8kh5;pa-GItE(TB#`Ph9dtff*agc#kr+J$c$!;)wHQe&fy{_H9%a#okpru)_4@8EHaU(NNX}Dqyk2iNy0X}c0#!bS+GTGE0a|iVpKlQ}7VgO!UCNN&0 zk{9pc{)w9ApvCXr06D3Af0e4dL1rcr+%5o&Zj}L$eiKjK))Qh63hjo^OYDB!&SKG% zeR>8d!!s*s7zn$WrTj1;ys^)WN8@2!Zu`B?E-t>Bk%ZO!z!~>KDJh;}$^>RLP?RwH zO&uoeZ+Z$fGfK+5IB^#8n5SPe=iAh#)mG577}($!z(6ca_<)WX`8$9T@F4pm02AY~yl8_)K{Tk#BhX*j@3xU(R=tD9w2RnxXPR>_u zEv-qaGv!OGr%*hev<%9YTE`W`pX4!nv8X)XjH{oYc1ddwimrNuMN(<$;Q=Y!3t8!vHt)`as*xapguZ0@rq9-sd2CqpIX3{{ zwX==+7HxEX83nLVD~a!!8fgrC`4Rwe8+)^F;hu2niFBs#qe_tO;S0XM`-a%2TRt3M zNyy5F+?~^Oi>rW2%X7`MC1bJKc%<01HtRpsffmw4=^Um#JXGABcQZN0m2!%n!Y2Z1 z#PO!aV@X5cAPeLRwhb!zX-|#CQCTS9UXF@tYWfQa$o?$l13-acZX0 zM4iyP4b!AX+bZP-R)radAPIkRp)^b_H^!)XrkhSGQvlsnKOGIwd3>M@HjynfPts0J zy@vSJ*2a?QbEK%{GAYrtlSKW|Dtk7p8&=kw@gNmF*blgaLXrGG@$2F+&)FA3b)$H+EjTi@uYRccJ_?o`-_Rp)7b}iE>R+i7$p`*CZN`WEvG2d%T zB6e8qO#dqloC>G|JBq<}TY@C4;}6GOHzwa}$F5`dv(7xuK;1)wi@vAfKeZ9CZ(@Jw zf&l-si}=IOCH+SHo<;uzv+cFGmEt(T{cX5rxqftU?hcb#0V(GWcFY(t!Xu*24qb?j zjt(E+kFU&~GdIw&%r}?=UDpmk5@F-Ut8$rRvxX>Xm(u6-`;?s<{3+qKC1 z4tu}C1d{IFLB|TNue-y;pFeQB{7BRM-FW|_j3HuqJQx0+P7NC!heN*?jgW_TdBk$< z2fFC~{$U|?c}vSg0Lsh7}u2dpDp7XnmERyp1A__c-rMwtFo4&t3p%e}BXFwtk^v;Hy{q zH%Bf=)y~fC9f5&a*;8p>_)qL}!Mru5sPTbGr?W1K)Lc__uPX$fDpsY?-Epa5VrN+0 z#FUzfTJ?OGQ-gqDf=70q z7tCC%Y21|mI|XZWW`@U+HLSjaX?=gd1Q8*-B|d~T;VUCCk=FcZ`U_T7T}FlK+ULhM znCdYE;GUXV*WHaLnMYlpp{d4jBpzI3qM_JW_{B^~o}XynYe3x@RA`b$lAReo8BdpK zucWctW?k>U<$876x7HDno!iRl!4=~jj4p*_9=lrt&t!Yz z_;@rD7TAf3rCEiwBbivSKg8z$qFq$elQydFC6|Vc+e1W}ClAf_`9P=4^L4Gl!3^)k zv?`gfeomIz!|jH~%z-&5zIYRH2?{15BJMUHKe()VspUV&SR8xW*dBF7#M3oDr@At8 zESVB|%%;mh?{7n;Wi%_@>b*dkkD7iO$YRQKyB?xE!o5R>A&tv+4AR-VeROzgorCF~ z-D*|R_ygqEiL?z4iP9n`>HHBd#3!vp-N8EC`yZ6e3bQ8H<7;liqHO>(Vo!q5MI>8Mkaj)hs|B(vC@R%9anjb*lzG1D{H!1AHNJwyc z7k_gUD_f|*%DOBJjvnC+fk<)9{G6vja$aV+HChSWB^xMVA`mNr^Hti z4IQBJf=(QkIMVBUOF6$mSJut*D`R*``AA3kGPdSmi#H{#M9kRlL%QOYOBnWWu4ser z;+9Ka2U#HepB*hN9RUqE7!o0Qu99$T)Nc`-@K_6TC1zIee8(2kKO0>-Zlsi}m1;)U zE;Kg%ZVw<6%ba`|oOJZ^!hzPW$B~jtP>4k@6Fgm}=kcNgSpg(peRO1BronV>**aCv z_-QG5VZ|Rk3|6mM&vDVI7EFGcoN4Z&u)zeqJl79X-D^>q^>_sFLlVe?9?Vx)*ee*7 z%Uon+i98rrxQJdAXfMS8K%1CP$|nj4CMj_~TRUn$X`QXUI9p}<@WpoD5v1|LwXeYa zR*X*s_n`2AL�RbgR*#O7EB^BrOD-elX*nrOy%Oqj;6lS*>`1d9G${`5Df4)kf)V z7`M)wtKs!OH)BEAP#%wuu^USaS=5+nBho{R|cCl^BbPN}Z{1J;9Gy+DJ(q!_U`*;JUOJ7O1;?y_-z` z-of3mq-4R^TvV2CB?C>BmN>b&m-t`m=581+@&D@3F~OkjYE^iEj0&|@c@Qdp9RQnL zj^-U)bjvdCu9+GL*f6Q5XJ(Q{4AK0?boLmq>1t}f1It_*zXN;xc@~ejNSQBvgmf5^ zV7xLYgG6*)7pYl&KeKYoU(bq1tHk7&XA0&_*yC?;gs=2^%{Jc0XO}iVoSRy5wQlYo z`Tc*Ky=7cg-@7k52>}7=Zeh{gEueHtgLDW;cQ*o3iw5Zi>FyMS1tQ(uA}!r;=kLGc z?EBgK-h1wO=L?)`tvTm-p66R*s1Rm8-2d#>)MvOpJ2SjE+_mfQ}1YL_QQ0U zSh?1x#?7AxXJst?_%FY_jH-BzRY%XAHgtHOmDc|7^ws?9@@K_B+n!qykvA@5g4fD) z%3asXCxX}6n5&qf?_73A0&GW&q9VNm(gt-%k_Uw|TVJiEU1gD4uC=t9oZlm_#&U9& z|GZm?Jki?G6g?ZF(G79XG)%7fdu$%CKIRx#Q2P8d@Ns-TA!If3of*&;HcdHsJK@&+nC@D`HIla%{Cy z>mP8!#4a7`G_$O!uB1*gH29k)Bk?dIdz7@ftJdNmJ!A#B9IY&%V;v^uxr@A4rtRQ= z=^*^n)NI3!H2;&BITepxRZdevNN3LQdbaD3xi}gJN(t!{Aj6Z8W!(Qdyc5$8P~n|q zJ@AZ}*L~9f;tDkAblqian1f7;qzkl|@Dm{;9F-KY++-{kbENJ}Xzvk#guIb(XRuR+VhwFDtyn?d+;5`EuSziS*^;A#cCVzK#8Z zKvMij)Os%;g<%HKpzrnvs7UanVz+0rq*Ws<0S=E#LY>E$v5zkR`I01ZJAt#asDSpp zlqI4tFP9aY0AJsc$*2^#9`3PD0T=Hf%bbUMVeJ5Z7Y}pvX!-4t#ofxE<(q-`g{O(X zdabD2D!ugF{N0$&vVSeMHJYmZIyXwr$K6m};))QfE7xqBt86$ia z8T~TM)_()D4{U01_%uQX26?rarUj%fyB>GE$AA&f4{W)=8x1}#j-wp z-#$4MahORmKgdKoaM!Eigqfah2(^BJ0Od1ogcWsOiYybT=QJc6NqvlE_NTdgZOg=t ze2uLD1)(oiqok=;>0~^=Ox|Bf>H<7>IAdqIy(k+a{1kYy`EKxK&cFDb->;DEWv#@3 z*Wl(RMZMvgtjLz5uG?toK_1y*c5+e8KlWM9#5sH=jeG#lXS^!);N{^o5?NKcyQY%M z2>;RAjoA~pwUA$vU#T)D@I~%4#Z0fM+1BB_=~es>ti;XXVYX%lR-iYmSZw1ZB(Xw;vJ@fvFGJO65yRZ>9#`_-Gf-H1b-gcf3GE~I4`4~V7%+wDvqh;f z?%xN6@T{bjMM`IgX6rYSz&Oy26QrjOPZ6zzMma_(Ffok}hx5Uu9oM%JAw4DfsJQYy z*N~3Ji41T==N{aFc2U~0c!^SUO608a5Jdy)?yVgZm;g%IGMlzHE-`n>Z8*QYS|ZV{ zdZuV%^-zvQx|YHFtVO)UO+F*NwyWGn2kjEKIMn5(qSz$N#AP zi~VbLycHnMs#@~XMMIF2ZkGH|`6$B}chvYQuTYV9g!kh>9lf?lYq`rDy^NS((bL%% z8o7i)XD4U1JkO4%P6PHtU5zsE)`2^NwU5!;B8p>625FTi4l$7J!qu4QV-EG3rtH!z z5JY8}HNpc(SV|BKHxFd)&0Ko#O#+ry+3CIO5`F}pR{(0QK=Le#7IYq?g0JS)n{+?BBaP%#1+G+#mxv$q!F>mFNs&l9Oz5V zuET_|ZrM~wD{eUXeEn!clf7MiiI@M=1M|-+*%BJ9QJvNb^Mxs175?@NuXW0f?eDHW z*#{n4M9MjYeH=IkkD~PRKhBNB9JJEevz+((Qbiy7PuW)=u120lU>L7o2S&kPJehg{ z=zW2^jASYpC-4inG2Z#AS&DqZ{By!O{ElJ$@FF?N(`?L)*gQliA>ViFPqEp4GC3@6m z7QV_JKJ8bVf$TYTBK7a3hf)aGEA6V4>;}Gm{VL)#1(mXs>;CP@=Az#eXQhs$i0*;@_z?9$Co}G%3;H7-1r%ocAbcoLDH}*@hCY`Y_ zdw@;F!}x5)*j}x)fOXj-* zV!9MX4D@#RJWu^B&TFbmp+!P9eBx5fBAs6dh0;el(8MT7r!cu^GnF%G1hFroMANcG zYLSz}=6!O!#(-RO{1@3j!ndaY)r(TLVFzOrO~PMGn$6sut>sr436qTSMb^%8rP2kZ zB)K z-q^rYxBIZn>Th`j#Tli-(b7|G~>a3lGk43|PI9e1?8ZG>b$ zTDvA;;nfzIox{S7jOQgYiw?3HPbfT#SJrBFZ`e$xp3JFL!3CZyze64Wftqn_$V6aN zWeUJDBZ`rvE@I%6a1_ZgUYIUqhKDJ{3|!1nf9D_@+hs@w*Kl3_C;xN|*w)mDMdLqz zTcGbx$4}C5?NdAwLp^0HxGFmvSjeS&4OL{iY2`aG5Z`GXa)F^aU*8R(K^|HbVi+ zo-REn0oxmEWDX)tpZa9RM9=3=p8whdRB~rNVl4;kv5!voP1PjO>F0-4pKa9s9c_Ku zWlCbdtwcL8ssAd2Tmp7hI?T@4DXADKsybE$HAwSN>+tx~shOZ@qg4@6f6C{uboY3W zigyjouoG-6k~BJ-*NlB(8gwt#)xE0vyxl}!UEX4UJH5jKTMTY$zREt+VD%Y)`u-i$ zzPjzPX6x^r-$6jby3CltwSKUi@6^)>IEwD+!_Ft2<*4 zk6J?`Qw|QYUGz{cdJK=dN7VRl0%AGHvLj3i$<3afa!}@R>k^U}bl8in)9gg_i&u9N zZ6V)F>85fcPVyKy{~W!!_NT48`lBLUGS~fd< z<$1vJGyZNSIDCpvm3Sk=90w)y_a7eGpwNn~&+pVB{b@7~w}K?4Hy7$yeY-CuSAwDy zI4L5XC#b*D*lN_hLUDe>&5W1l`GDScY>cE79ou2$`y;?v5=F`ok(iS@cwDY1kte-L zU5OX{od8{?5EqF6G?u<@Y+hn?yk*A=dz%NV=W=U2o(Qk9f?sm*OiYCq@+cRc;A$$sGQl_GHEU;G?+*MY)?eN?}o zeBb)&omHcc-Vr?oRYWx5e_j?Pn9A%G_~RwwYQv=Gn@x4xw#h}X?t z6{k-K;y6N!`3sP9sr`fB40f>6Pz0b+?Fk;N&*aAA+k!P?PnyAbg3zf_Z*70c0VJfJ zP|xT-a2=ZqT(FHH27ly)qY{&$!G3js-HC%uJE3Zdz4zDLC?18_hhfR_DH3_B9+fas zN{y42m0x>}>%N^{YV zTKbhFc@^I|Z2UR-oDkRScd|j!D#X$G)9KIF*3=ulf>mD5}4gAypj9nq6Xh<%Ls6x+rEE%Tm=LK68Uh(W1!@t-kwbzDix6 zlUfRnSIFDB=O`%NhPIkIoo*6(bTL#2;G@=Vp3FUqUJ8v4*!eFNhbg&{yFKb<)!%G9 ziU|?FluIE(7fM5i)d=+6nAVz!ii!j(Gx3&d$Yd&SU?6Dh?2tPNnGHdJzal5-p=#Cj z`HsF$PEPy0!%iEL`766FGF)1=WO`|o=7*iPcio1*$GYt+S{fp^8!}Ihr?jc4dQ`ZR z-y~Nze%alOHk>RA+z)_7@}I3Xqa(mZcB19m%v8M}uR<|I;#+=J_F1arAT*1er#&Ot zbf>pB^qQ@0j_{nfjU+T?ROv0?Y%J&EB3IF)$HHqCL_0pXCiFANt`^G(KuF~df<@hw$*;W zwlZJCsX4iKBJxMz=7LwnNO)_}hT^47L%39&B~n0Cc0O-TkE7gYky%6z{e%o3 zTiMZaR7_h<%NLm@6cQKDY&nJXImdrvV#h@I#>M~yN~aDJps+AAE;uy%6sQ7JP8~mt zIRB6cJ!wtc0v z#;|ZI0;Lx}B8fQ0G+}vaM)Ol+v6yV)lBjNVwTFPdAGu?}TU8T22Zv9@G4vcjk4^QH z+0HBe6?fP*-1_eGWqEpaQ`g;C>hr}-Vz2w)4{oM-ew!TdRgOeBP8?9-LMw>))AZYJ z=60rZ(1*+BU^Y^YbGUxbw(lZyubi;bP_MlyuO#o6&Q)Tl*vlXA$ZeQFpmMQZr`08) zk`YKzkxR&QBfRQyW|4~ns0z%xTetaeosG@G! znuxW4J0IxoamV_o5zAvgO^!%@>fVWg>xqkSw(z2h2F(oKUX)cBMZ@18Dt!3~;M0hf z%lj);khVJ?mQ6th^U7ASB-P2rgl!r42V{P9!He7z6ztMrNsv9Y5skNDIRJvGcd=OVM$$+(H;p$oQXh`kY#Jn`=pAov6d^-D*Ql7$dm3$6&+ zy1Ww@GcSprNVY*%mRe+bc47z|nM*5>D_g?NoE%P$k#2G}y}!`f+IV#IGUWwOsaT8` z1x_7^!(m%a-;q@nAQs6?ruz(`1MfutL zT=6R&oyUBZd1!#!RjvX19PWJSD*=7pqq6kh=?;tCr?3aGVBXu_t7Vx2AfLbrYqE7% zSp98BN{tgCce?X2RWB)}TCW=^FiM`yRM6dSWpPy8GNbt@wAyHV_);^mu0(*NXLa@3 z{hi7?aMg7poN$tceZIBp(Im4mu&_*9 z_rJrya(e;4AxS+{XAlG!f7OTJH2qPbB`Bv&@GjxTFUWeww#iKWgWChBQg)l=Ze$%&MY6VbvwAF zp59e*m0*Y*^>F`?Tp~t5Si@;(y@z(?;lO!9_oxwaY zaI&%q$W%_gWkVVk`<*LT|~q(^Ta|GAuR^1 zmjNKcL=D`%{S~hk4B_zgy;B=3CCM3F!rkXgB4G%|arIG;7?n7WrQR&`qebs)B3n5F z>4iz!v`;}nq6dm#CF1i*-`ySS&OeNF6$<__6r^f1u7MC{0+~JWAhJZ-LzQ?gWa@kQ z?25dChAc8fN4fl9Y+=Gdff)EohR@b+vCZ{tQkcEvJhF~C`({5v0GG0X!^H^h?OTBG z#h=IiGk_=zZcJSun{4$(9X-jVWPwnct-F1dM~(eDdejTgH(B4vN7V?4&~4akLZ*mw z_aMU<9VugE7DPOrMWp72UWLjp_e2lKp^nlQD&1)O>qlU2C0Dn!0Xc-OXc8a8lKgxf zt|i(Ai2~>Ywt}cQQXXT%E&sy{KyGbB26OZ7)JaXQMZ1EnOB%fUTfznNERQktL0c z$o<9J(-tAKV~KsY2KGWGE;UN|+ONp6F^jci^n?+c=!s9T?ClsNe=Hx4Z}IX)ctxp0 zVTsl~KmrjBcKo=<*%q8Qs+vK{8USb*a8x%nd2kQ_`_>+#r9ZQA-_ZrDMs(s`YW_8nQ;t*4(PN=&p{c9lTl9ZG zPk?F)QCMYqGm}i3nWo-}u463o=Hf~#DX{2w#4^UlY=8uC#UG{!HltwheoOyN0=BpF z%#2HCzo4e|rk_h;+*wUSE3OT@e^dw_&5J)4OW1#{$nl+NC}y#<`5Y-N3%5VK7yI{f@=#?x~3oP?!_8Srh%M*xqe2c52XD{5T|;4_~RpocvRY zx=~UsJF(9(Gp87iYJh_zLQ-DUG^c9HW3iPu}w4&tHSmVLTvF(mLNr^)G8h7%>oD?v2>9dd-uLU84 zf;>BRqN&PseYu(T?<~9%a&L!Z^OED>l~KK$5|hDt)UDy&@1kUGZ9}nhZ;;;d+S)~ux;hYc_;nAG%?{-qM`w(w zKGfNBR~^NP7&fdGC0*Y80}K35-|l2kYpG?CyBqz`0J1UGjE=)mwBtg@pV-bF8ux19 z-F;O2=qz{?_8e7T&M!M-i}*Ro&Sg{}(#ZWznOaOEb5^p!vUL?=1WQXZ$>zGipNsn$ zoS}z@2Z27{sa3-hM@3E&Rwn#Dr%FTi8A5a2YzNoYNY^&_%BG2(I^>Wv*qTFgDhYbM zvx^gY6a)wP@aos1I!^9h$jVB;w_n8f9>+{>yq}o@%X`<%lKGntz7$lv}Af0wDQdG=yn;&)l=aY0pwr(hlT44NV-KE!+6{!(xy7!pFXZQ&Tx=KknmlYhOoRHm?bOcT^!FnyVvYZ z=k7-mN{438Ct35%{``r%H278A&k!-~%hiIdZq5=1wW)vi(UL=G(ICTr`y4DpVjGa> z*mGb}iyHjY>!@$f@dY21dg*OGLT!X3HOZ^%i@#ng!CL}G z{vRM5AGBIDtuIA@TlZ2`YuPN*C>K4d$&i+VaFKhn+})5SzhQUQGB*9yQ5Q9tfvC*J zYADEm&6OtUm5?tO+)UE4vxS=bx zGExP>IMKT%L^g%gmf!~EOO8?t_}y(c+P#zK6fno-A2;yEL`^j{?`g>Qgg=hqSk|?i zJ-drU|%JG56;n(3hBQJdLn+;!+``)Pl{59oe6DV=lTvp-+rn zjn&=$;K6?6J48HMm+keR?mk16N^sL_wtu>qy7#{wj-9P0JPwO) z20LM2=F;EZQNr|<5&2qYlZ{>7 zbXa`a+k$ymZF%mH{NrjHZl_e9556Pkcpuh=p6>>YtUCYEEC zRd0G1DYq{t^7nG|PJ7?*C4H~QShvs6HZ4$-Yb?P)@!|3NeloY#=&!8XKlHJnS~u^( z+~sq+9W|rY$bGo%YkuC8Vpp28o2NjzxX@JpURx*2=oJ7uBS4K+o`GWj-fN7PEFfJy ziXk{oZJIN6m=v6P7*^W{HhB_<^3~wPp=xR73*?oRh+)YjF&|1b6cc#*8oWhD9d+1n zGcAYAMNZFZ^&Nq4G|_7{GA|{{_?1z;RAVI zoILfADuYh;$;L$OX7Tb7^>W5wl>RN)%CUwH*r+8DHzFl}MoV+b9q;XzHGG(& zEF3z@u9yQ!@v1J27S+6O92w2c4bhXhL{F!SHvEZ>57 zXxq+1<`mi3Ttv^e$h$~)zF)#fcNYwFZ$q3?+xdyDSwaa_freNj&FEAkBgO85}tS85u}C5I7y6A}xv4YTc*^kw;dC?*la%%eBew|A6ms zR4IxSF0B^3zxhDIi-QEj?_FgUv6f{+uFFTiz5ElTT^dS2{0@x&3(`x6_7b1~fl2x9 zVAV~0m;^NzVgj^?Ep*rhkwx5ac;eX`Q8L)=gMWx&4jU&4x~M%rFjzRbo9%lhsSdKH zV}tiSb;tti44KYhnXwLj9WzU)fL3GU%u;$678F9g^8FZI>3eQ`^W+Dwg`{CcdEAJ2 zHTiV6Z6)?81-Vc4_dnokVJooeY=7Q}M06M+-rg;0fUo@d<8-UYc|1gJGl^Z<`~L?T zrxaR;?;$J42RH()sGYvG3(u#52bHJ{Kv-L4lOih_OO4C0qSQadI1U&}qz?cP$PhxD zz?&I!Chp7CVVTXA&xel+5fB`Dw02-ULOPMmQjOv8d#)HRp0vr*^OW)$qn~0})j;Foc5!|_EZ9SoMd!AotO5B+T zr|9xu!)Jk(IP`FVC(lSMW5wNFPQQQTYzoH4Vf9GCdFKE<2*yN6A}Sl6&YpyW*;doI zG5h9qAnmnk#gp|{DZ``|7%RbT?9<(c59w;*E<`Hf7N3$!A@^j>5&XqrMJCTLyUUP! zk`%XEzq)~9DfxWS?uf9e+=Gpto-FUfVWq}ou;Dn%iAh1FtV+BjVoYRAB#rejR1E;M-m|5$;7z_8oJ@|H`kMhv)l4iY>3L`IXrg zZs{uJhy?~8sA{5^T=D@!$ngZ)LIaLF8$Z?pO1q}9oogQ68=bl&|GRpx!^CF{IMH1# zOf+Ni`_Wkm@))ro0pMv_(Milu6OxF+sS}mZ71w6$JNV^X6V88O;bC;?ki7p{zaPs| zjqDc@x1NUX2(-%LS$@3`yMj3I{0*58k%-Y?Dq`qV{EhOFGP@sur^ZgZd+kNh$AQu3 z`=PSro9w)6pqHkmu#Jj7+HpmBIT*Y8hb=^Usba}?;PnO<^I^D=U0a6RI5yh5R5a`XOQw4iEZ62%q|F(+M9gu1)WRJAp4MJH%f^pWxF^3aJoTA z#D{IU=M8Qth@AcDn*UI+OJTl23>@}zXRM3VT4f7UWPiFi6G6|Xcz_>7(lqh1jPi~oN0B!xwpt1hwMed?JC@D`676G_ zNyF#U)|_%>v;@Cze!pB;rNSEG@ghY59aitl*g#x^-GXdebTXY(AG}) z2$wr`qOAZqKR@3>KUebc>Fnd|w`%yNfeuRQof<}QAHBLJc0gQ@+OP=99jju)t!wt| zyhIi|zc-1%{)jPul-5`R5uZYCZ;!gX!wCu65U^xO5_D<-FZ)HZ|MnJqeYJGUI{FWk zob`jWglDYG1=xsUuPk-5)?NSGzkP{Ok+YyB z`PZ4V361&N-c{doK9hyCQ%~yJPcBFC6dr}wKGB&{p6dv9LH7>6(mGC~r41htc>Kyd z9MQuSA!VauDk@_Fc8QNqzvB6o{JX3m6z+*%q#qw07^S0(p`D-#Ni}%;tK$9V%~Njl z_QBSF#NGd@Y%B7j%lHy)x%I`9{k7sTKUDex!n;fahF~2Xok3@Pa3mL!GrUp!;rk}y zgI^e?jLM`dj~O)ymm!GwM%C9AZF}>%6U`T@(^ZxWxk(<#$(=(aDl~8wELL9qpi4Y` z&#>uUP!vc9|8L5+i+)Q9{qht|h4?5R0|-+84LSaU=>AjRj+a2+o!}d^Qcq5`>3uQbI_XlkwDtvyKm_E~$>NHIE1 z+g;T=v1h2LpLzGUAzdPa3eQ_U&Kvu0e4&a&X5%#upPFGc+tEENYGJU7Tk$M6oF=*nSDhHH*BNLmsH41AR`hBz* z$}3U>j=nD!NPB4D`K_pNn3>D8C$vZ@;CJD>VRo!sZBJeLe{PjA74FfgV{+GG#V z^wI?F5ujx6cz7Y);ZiY+I81STtn8ebly8ogjJk~!`gYv;J$3N=OQV_J8goFEhX6be zE45s?Ja3=r!qN=rXf!F9;Qt#ET|`kbWjf?%_ISUC!|UBUs%!d>TkMU4JQaass6kat z`Opeazraqg9AP2#3FsHA&TulQV&cccJhECjUHyKo1AP(rUjSOqyVN%g^>&tdRW(B0 zBmh((wxjMK`Mrqif3vx>jT0!Uwh)lI2oXCKlz5bxJ3`CCm3iN@Xz$NNrJiw5ywR%9h|_e`dx3tz-R=){^q_No%EmIJ#z^Izyuq z$Cf*xb?MOjUfb2xNiGrum^qOl2Qm&YUK@Iz zfL<(+k+g{;1t)-_cq_v)Ke-l!p8qEVRaL3SOxF+2dG)Wv^d9O(vwRF6?xZ+r*|<|$ zsjHsCC6sj&K7I=0WW?*T;yEW<8lMW;5*Rz*vqcy_-|*}hK8dZjg}&t!rH2tlN#R6@ zW@UjO7*s$*3=7A8j(~#u>V|Ah#ajpos0?^!!|uAAO%p0OGVFrH1>(QZ;ef{EUeizR z?FR8*k|4v1bl7ry7muDr(q>Vx`to{pc~#Ij&Jk$FMhM{Txq^FV)bvSkD`tNX73Obl z>J(mh7P9aWt;JxQH%+sQL4{zC>; zRH$x3X|mH(&D26cCRzRg9t?PqFx_nS={@}o$M7{u1-j1Kd61jP*ND9HU#C*?C@#yN z0A)|@$^lMvgs+7YJU$|D=}>OPdRQL<(S02QxH7gKJ@Y4ARm9XiIKHJ0$&w)hWPRw) zt!AH7tSP4hs=7}48>_o6yD1-BR`ho8x$V1e?~az5Q2(LmKRs>4d;!(YxSxEW^UtzL zY-;lp98kV^_i3wSj}L@Loah;aY1^^4Du*ut;OOb<;=qxbrNEpxnZ5(e=lBpTtMiub zM{OC|+N=^-BHe}vihR4`n`zZ(rQ)e5DU{xaBr_xb@R$DE+2d@O1?OF60kWQ z^cDhM@_h6S@JN5^yC(%~#urL-jso@Ky~@4N0PA0G-P!=Myi zW-HwU?42zE%;wZ2|H4s6PIIU4sqvIDZ`5C-1fM)^!ik@F#F-%9R$+37QS86DsK*T8 z3z&RhE-`2Y*{W{eQ$jt*&#Cus6tHpNTNuP0=#!9pIM6+_dr!Cjvc-u`e4{4;e=L|* z=nQc~u+(AcIp32!a!hIKG1hU>CCwZKl<0Nc*BgC*bM)nYXI`PoDhTXSf9pL4(iWN6 zk5ebTuRMj}WH_v}n2x^Z%9Xl?_UXbzJOQ??^dRtqdOWF6qCeIjGIJE!F0QV)^{Sb_ zB^k2~q2F{0%Sr<+2#cLZv|+dbIkW>f*}F#)KGKOS0@=9Hi}hsf^?th!%@4EW?nYcM zXnVaQ@He-b9*Jh}zk*uw=#MwTcUK$5V~DKbzoYtr+-B{s@y`96iZt=AcaNnt8EFed z`6`4;5EQahRbBhUqW>8W{U7_8b7?Naqau;VT3_RifKIN8-P_k7xpW%bfyS2O+-g|N z&YiO2^*zg|(HB1#q1T;$H?rkt^hd#;WR)6dfVOhyWLc9uz< zSP>Q0mqX4A2x77Kf8}V5>erGlTJUD7e zrP)%!71{WtO00(3}t9$Ca8iy$X{ofBBfAD&nI`E+v=cJ^%6KPV+5w1_5r>jtA_ zEjNYvqp3B~K}~2ugg>#NIkf~RXpNGP!LDz5MZ4lp-qV<&gAU(+bKCw`TP!s@*Ov{E zMI>UoqR_Akeyp523Cfh9XhELdFm#L;YZ2ml7Wf3OcM+#|{|E39+3~MS#ni+^``YbnPF#0)a z&nJ6hD@o!i<_pii0-WO?K%b?bKkVG6?W)jvS1G;Odtx6%K1lzTI!hV8bIjMBbTr z!I=kO@~FvEkBz0vF~M8SGMC%nf0NfYDBBmF>e_;~diK8jnf-M%>IM86+S4FFG7g_a5Xd!4ce)bH_&{GD#jC(=h<&{8r}kJRisfx~KB}{EGb%x(!5;K`aLEK_l6?}; z`lc`h8nWT(3FfvcNA#G_nTVkabB*kpGr0S5b)8XW!hNHT)R_gpNUj2v?;CEil(gz=?)L<9YdFOrv$Q@L&$ZSb3G~9$UCjsDog7Ln`jP-&1-O zFU5@1Af`0#=P4PmuH%4F*sE`XHV=j;RqROc2fDJ9r$7mhxwx8xQIVUKI|p=oxwgug z;NWfwkRk*1lPs@kN8@mTwg-b3i|`JI(-hgptbdxJ;!oQTzeW@VBgvu`C&~Y?@#bQH zMMY+Se$1zTnwbEPg<+O(xAdHirR{IRq{5ZQ5i$_)D`z`lCUnL*UY{-DTGAVxD@3{s z?jM-n@!-{qkVP#s=(Oze@LP~Sd~2g%v|!H}ho)QX}pRAwwhL5~=foYbB#pb2HaPzd-F zapCKFQvmup0nmn3y;Oe;R+j2C{}IrcS^lYtku&MxwoHthY--!yyY*_Pyu^rAWR|h) zQ&p?YlL0BzR(1zh4cZEIyAz@Wb<|c_|BBst?xk$GnOWieoaL)+H~cx)oVLsz9li0Z z+0|xcG8@P?g9`z;!`zHs95!N_6}ar}t>+s`O%iMH0HBEvbdWaicD6RT+eyi31N{(-<6oK7`PbE;NW{4; zf_|TYiQwKBpi#0)T)TUc`>P~rWcX((8W^@SN)&h-?z7nA!AN4Vq^3!g&KtK|Fh$h6 z&%KTU)p8{3q@h9K>KdS5;<&=2?yq0-;~V(FH|wxGvyf3ogbljca_rWuM94au3bb@S zQw<7k_(pW(dHz8@2%utl0iJe;;rI7@9wyjbOmpmV==VzpONru33hC!1J+LbK!l-uZ z&S}q}O`u&fy!xF^B*@f#J*WK_W9O9npO%mRPOklXfBW|Y$-i}*|K;GgfW1Tm|Bq9F z^EC%F>$^H(d~L6j{y4?9pkaQTtlOmPYbmuyQfd^gUXaeAwhZ;;VEaxxw(^*%2#W4k zM|N3DD3P+#i62_E=J6!rutV!!?XuGi=<`1dMa|}?l%D9ikG&%llMMa#jb5nPysCyV zn2HAV(re6!r7uN=NyR~HTf5_KOIy$9LzJQvaV7Xwyg*7!$o{KWU%@b?Qs>icLXMHT zzf$*pJtEApbx~j9HCRx&kfe*ohEM5JF3G1I*dLGZrtsGDz`k^o8jDsgv#_=1C8Cmr z46wl3sH>`%x}N@yho>oE=OlooR&;~HWbZTVTm<+!O=ki&3K%WxA`^pioV{5Qz}qD>O4r%z~s{JFy5JrNkV^=~ zjko0^vs?9NToV8bJ72i$_-l?BCG52Astq8QrQ8R71J=&`m22IGtg2$&XSbjl-7qwj zRCYJh-(81%1ZF@H0B}0#Zrc0+P8kXV>7pZJ0goah<9i{|Xiym!4{USae~a^z4;FH) z@Z1;AU3VQvc&8{E-fitu^0$$!U|(Zt%GaK4C{V60HeBv3rn+&hfT@1C^{mH}LJZHf z&3lY_%!iG7F+@}P{Ow#FXwlzQ;)-}l^R4(8yH&oIw6}YqVg`aPJ8hx|z&dDB8y(6x zUxw~xn(V&tB3$M;2y+kc=`KK*W1m`U|FgR5F5=O!`%Suxags2`XI=`+oJ=X{KncC3 z`MPsud}D$y;wt?8ZN% zd4%x12<-(*CIf#eJKKkjMlYMP!ikxdv8FM?bI>{N;c*NSc>oY*lA5G{7J&SG61VkU zrN#1mVgzi|{>VS2-^y{IM{(8~i_CAFe5HDc8ZEMe3jyD0Q_!qaLf;t-`8OlA_eq(M zu4WhAS_RMZ<6U=28A@C?7*yZPmp7Wa6{!?we9sO|aoTk2Zns(YMEjRPey3P|W z9_-ih-K&n~eY3@t3iRxq=fT3&4DFi{)!9TB?_&P1*3L7ksq9_jfy+Q-1cHKKXd=B= zK_GyJE)dPoq&EX9%^+PV1B7Y>fdQlnp(O;AA}ta{1{J9?5NRQTNS8p68VL8yf35rN zuKVep5Btm6XYF;~_3n4Cv(J8>p9~y6*}Z4K7@jP4I=%anqqy!K;czOa{7f-WKPqK! zw9RXWaq7$AHLk5dka)DvzDx&HPCS!q0OtUyW!L3R3%U=Z9|IdF={8o^?upPD= z8IogtVTF5)v`oPKBM?ZexiRc{$9nYvU04!J-1Yu)y(>X^__>);>}D&&KS zif6LCUXtyx~zlm|7?oT+aZs z)PQ0aIe*z37dQu~txD44>4|ivuXy*-VY&dv#ruEPU3n^_FQPwXZVhtom+DHO2HtlBtNpi(K!c` zu71sE=Of}TVXG%;N-o+#NVid3R@`oLXJEq-CGV4fY!YAt>Nw~o`Hj0yHN9L~1BTp? zTWaq7vT*l8&wY9@-8kl~`qbbUSGDtU^L_g(;ROBr*Gs(4=?dzuR)Z^$S9I!mrp7je z(N9EXS)!*&D6Unile|Ig0(7^1rSQE_L2t zfl4m2nIgZq#LRf&z7#4qZ7bSwy_P#`=sNq2qO|MZGCXDgf#W_()$@QQlT#A@g~ZJL z2Nm=G(;oHae&c7rvL0(4*_9kUeUl|^mGt?WER`Hbc0-OtNNW^c|YWq4v=Rfzq?`JRb8dy+y zbm6CWWXllr;p027ZUISc!h>Pv{*TbE1-Q7_4?V50rDsDHn~}481H@B3#s9YuCnbnk;EfjTU*kA)se^mVlC-dc7%FNGpzT=pLxu4!#tZ*-a z7vRfi=~Ro~Au!hXc8xo{3%?$hph;BFC4S2lF|g#wjwOSa)GoQ~GyHT>%(3>$OU8h@Cka;=Hxl~CKm|E66z!`$kyG~?l(Ij8~1B6YP8h15p&bgc1umpfz{^G%}a}h zyM`dh0XJ`V+}%^mNhr3YtGCgNWY6hPL4<&~wYZJR2WS^J7os#JP}dXbp%=X_?I62% zJ|vB%?ygB)R2Mu&ZamPd+pDl(d&lVbfk)z5qVcGLW=ls?!;nICWnT~TzpKFQGgLx| zVa!Qgv$dX=FFiKpS{ItG3is`m>NnUZ*+-uTX)r8K+@ z{K4EZRy&=&t1D|JjjHzhsW64ptUJmQenw&Ba;@QLuxe05MVHaI zgq|!BM%&cl&x1GvO~F|I?>|mt+5S#Nk!?+?z*}WU9ZNsUhDzB;l!`mP^LGzVc&evNQN;@Ls zJOIUYrYNL1%+|U_t%6U)@_8kZfF}S$xbB3!Z9g#z8q)@)@uu;fPl?@~aT@Ac;yU8; z^khz3>8FbINf%oCWmD7F|JlJ4db;3pDV(<8&o@VEy9#Y&3;Ix+h2x1P zrG(8>9M>zKrHs}N?F&h$$m!ov7<&eS-=^uRO00he0}*}a+9J+7X+0JL&{;&H1I0lc zM_eu?`Kc+X_9QAQM7MQ6zvmK8c3W=yag>PXbcbZze@*o5%%?|P27PK6q~^Rr#eF)q z-dFug>2nZb#tSRec#@s9E^D-p&^jznCEFn>IlQzKSDGBQ6kBh7tisljp z_Paofj!Sz(sLWn=&@SJ)R{SS7;pPYTHpWm|`C@OvUQLYZ19|*TQa$#$VnfD_IUU~_ z-LK>((uN=-V{p+XMge};9$PSxQaf51a)v)y_@{Y;*$mS}4Qkrnz^s_}ZXmQRBKm6z zbdkBXsDhkqgQ8zg!m^}bvJxCk=ts#ExMledgdErF(mzjJQz z-I+g6tT|t3+*3wazq-^xr=!p=bsj>igh0aVqqvvTbqFj%tP*`&)EHrFhwbr`&l40U zp@|N(>CvfM;cwSQ4^944M;Vq3qt&^TTDwMhE_TgaO(|1;AM#Zo1Gh1zF<%}azLvG= z1+5Daxj@y9&NRoj3f^`d@~{MnY?e<@eb0Qg?iCHhSTt++@UIrf8XIeVX1a-NiY2ZJ-UtEZBRuuZ)G-4~DTuRzjO3t{ zwjQWOV!vO$k^GQ;fdh_!x0^uzzQB>&f$y+VGXrA@P0m4|^8G%h`ObdZTRxCbHn60N zUrd_FwkvA!+bp8uNzP~Ur>j&u?ci$Ar%7P~_Cgzv!fCtt>&;xvYKr9BhLO9&W(J*s z!MSa#EuO~f>Jhhq&xz>u?_Zb6WdW@s0S>QGjAm9ObTXdBEZ6-`JHFd*5m9h5E3vG& z=`^au8CtXXWGdK0$9KwgJH%P^0>&KOa0msNa+=okRc}wiy3OLvqJI=TdV7{~HB`Tz zmzbq`hO%&sz-qzdY=v;x5Fs5A0$7@&5Uxi6#dGYRGF;%(R z5m0v>q3|a>3{hA;J0Rz@WH<`b*;Ah%ectkhBhF64F#Ww$qlX`zE)M0AcnPV zc+YQVcFqGiYGPqR^Y|syz1JVm_b6kv0W8S}3~R)%+aU(7)2|%v^e^I!DPPoPaUEdjZ>7?*%EquZrM>?98_XKK&O@u z)(m#gsw}?$6bk5|YBDRzjhZR+a z72Aq8#;Ysg$kw*HwFeHTipdbD?}!5O8#De6WIuJ z>Q@@d=QhE(+qwfUQ_ttr5*@fIj#sx&o6m$moyzJLcjuXwE!D>$GX5V9kb=Pg!iyzebd9Q^#cwdF?BSnPw9Es&tT9D2yhlAJM0g zq6WWvEL_~p6DRui_}4L6B^3J@SftxsLUzk`nF4jM-F31`o2ASm+$a;{G6t&FlR4Kg z^u8=L9Y<~UYwwphjx3WQjLIe}j~j6gWH|1H_>6l5NZu)Lzdq{Rv~1AGba0!!fNYMR zHR>bkF?yr`cCZzjL%YdBGqbRQSdG&s{FwBkEOW3V{ZQf|NgsnCT1A3@%gPL4+6ebb F{BI0jKCS=& literal 0 HcmV?d00001 diff --git a/breakdown/images/builder/star.png b/breakdown/images/builder/star.png new file mode 100644 index 0000000000000000000000000000000000000000..7daffe8fd5b442defee1bf12637eaa43db42c131 GIT binary patch literal 48392 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 zYGRZ?S0X4c+M&HZ+zG=60060512512FALSE4FALSEFALSEFALSE0600FALSEFALSEFALSEsr100256256100200000551000FALSEfl100#ffcc0010.80#ffcc0010.80FALSEst1001#000000000 diff --git a/breakdown/lottie_from_scratch/index.html b/breakdown/lottie_from_scratch/index.html new file mode 100644 index 00000000..253ebcf3 --- /dev/null +++ b/breakdown/lottie_from_scratch/index.html @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + Lottie from Scratch - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Lottie from Scratch

+

In this example, we'll build a simple Lottie animation from scratch.

+

Introducing the builder tool

+

The builder tool allows you to build lottie animations +from its JSON components using a more convenient interface than manually +editing the cryptic lottie JSON attributes.

+

You can click on the categories on the toolbar to the left of the builder interface +then drag and drop blocks into the workspace and see the effects.

+

To the right you have a preview of the animation and the corresponding JSON.

+

The rest of this guide will assume you are following along using the builder.

+

Most block can be right-clicked to bring up a context menu, and you can select +"Help" from that menu to go on the page that describes the object represented by that block.

+

Setting up

+

Ensure your workspace is empty, if it isn't click on the "Clear" button near the top-right.

+

Start by selecting the Animation block in the Animation category and dragging it to the workspace.

+

Then select a Shape Layer (from Layers) and drop it into the Layers slot of the Animation block.

+

Your workspace should look something like this:

+

Screenshot of the workspace

+

You might have noticed the block attached to the layer. +For simplicity all the common layer properties are in a separate block in the builder, +this allows you to duplicate those blocks to copy the settings across layers and +the block is collapsed by default to avoid cluttering the workspace.

+

View workspace at the end of this step

+

Adding Shapes

+

In order to show something, we need to add some shapes to the layer.

+

So let's add a Polystar, a Fill and a Stroke from the Shapes category.

+

Note that the order is important:

+

Screenshot of the workspace

+

This should result in a black pentagon showing in the corner.

+

View workspace at the end of this step

+

Basic Properties

+

We start by moving our shape in a more sensible position.

+

To do so, select Static Property and connect it to the "Position" of the Polystar, then connect a "x y" block to it. +Both these blocks are under "Properties".

+

You can now edit the values of x and y to move the pentagon.

+

For example, setting them both to 256 should move the shape to the center of the screen:

+

Screenshot of the workspace

+

You can do something similar to modify the size of the pentagon and the fill color, +of course you need to select the right block types from the properties toolbox.

+

Screenshot of the workspace

+

The color can be changed by manually updating the RGB components or by selecting +a color from the palette shown after clicking the color preview on the block.

+

View workspace at the end of this step

+

Making a Star

+

We can turn the pentagon into a star by changing the star type and filling in +some more properties:

+

Screenshot of the workspace

+

Note that while you can use just a number block for "Rotation", +using the angle block allows you to edit the angle in a more intuitive way. +You can tell these block apart because they are a different color and the +angle block shows the ° symbol.

+

View workspace at the end of this step

+

Animating the Star

+

Until now, we've only seen static properties, but now we can have a look at some +animated ones.

+

To animate the star rotation, we need to first disconnect the static property from it +and connect an animated property in its place.

+

Thne attach two keyframe blocks to the animated property.

+

Once the keyframes are added, attach angle blocks to their value slots and change the second keyframe to have a time of 60 and a value of 72°.

+

Screenshot of the workspace

+

You should now see the star spinning in the preview.

+

View workspace at the end of this step

+

Making the Animation longer

+

Currently, the animation lasts for 1 second (60 frames).

+

If you want it to last for longer, you need to first change the Out Point in the animation block. +Let's change it to 120 to make the animation last for 2 seconds.

+

Screenshot of the workspace

+

You'll see the star starts blinking, disappearing after a second and reappearing +after another second.

+

This is because we also need to update the layer Out Point.

+

By default, the layer properties are collapsed, so right-click on the Layer Properties +and select "Expand Block" from the context menu, then change its "Out Point" +to match with the Animation block.

+

Screenshot of the workspace

+

Now the star remains visible the whole time, but it stops rotating at the second mark. +To fix that you can update the second keyframe in the star rotation to have a time of 120. +Alternatively you can add a third keyframe with that time and an appropriate value.

+

View the final workspace

+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/breakdown/precomps/index.html b/breakdown/precomps/index.html new file mode 100644 index 00000000..9d3bdd37 --- /dev/null +++ b/breakdown/precomps/index.html @@ -0,0 +1,975 @@ + + + + + + + + + + + + + + Precompositions - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Precompositions

+

This page will explain Precompositions (or precomps for short), +which are a defining feature of the Lottie format which allows for great +flexibility in effects and organization of animation files.

+

What are Precompositions?

+

In short, a precomposition is an animation embedded inside another +animation, of which you can control playback.

+

Once you have a precomposition, you can use layers to reference it +in various parts of the animation to avoid repeating elements.

+

How do Precompositions work in a Lottie?

+

The main object is the Precomposition Asset. +Its structure is very simple, just an asset identifier and a list of layers.

+

By itself a precomposition asset doesn't do much, it needs to be +referenced by a Precomposition Layer.

+

You can think of the precomp asset to be similar to a video asset, +and the layer plays back the animation defined by that asset.

+

Follows a simple example:

+

First we start with a file without precomps:

+

+

+
+
+
+
+ +
+

+

And the same animation but using a precomp:

+

+

+
+
+
+
+ +
+

+

Now let's have a look at how the JSON changed:

+

This is the original animation, nothing special about it:

+
{
+    "nm": "Animation",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "assets": [],
+    "layers": [
+        {
+            "nm": "Shape Layer",
+            "ty": 4,
+            "ind": 0,
+            "st": 0,
+            "ip": 0,
+            "op": 60,
+            "ks": {},
+            "shapes": [/* ... */]
+        }
+    ]
+}
+
+

And this is the version using a precomposition:

+
{
+    "nm": "Animation",
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "assets": [
+        {
+            "id": "Star",
+            "layers": [
+                {
+                    "nm": "Shape Layer",
+                    "ty": 4,
+                    "ind": 0,
+                    "st": 0,
+                    "ip": 0,
+                    "op": 60,
+                    "shapes": [/* ... */]
+                }
+            ]
+        }
+    ],
+    "layers": [
+        {
+            "nm": "Precomp Layer",
+            "refId": "Star"
+            "ty": 0,
+            "ind": 0,
+            "st": 0,
+            "ip": 0,
+            "op": 60,
+            "w": 512,
+            "h": 512,
+            "ks": {}
+        }
+    ],
+}
+
+

As you can see, the layers in the original animation have been moved to +an asset (in this example there was only one layer but it works the same +when you have multiple layer).

+

And in layers of the outer animation there is a single layer +referencing the new asset.

+

The structure of the asset is fairly +straightforward: a unique identifier (Star in the example) and the +list of layers in the precomposition.

+

The layer has the usual attributes +you can find on visual layers and a couple others: +refId is the identifier of the precomp the layer is referencing, +w and h define the clipping rectangle for the composition, in this +case they match the value in the outer animation.

+

Important things to note

+

A precomp doesn't contain assets, but it can reference assets defined in +the main animation object. It can also reference other precomps.

+

Layer indexes are unique in each composition: you can have a layer with +index 0 in multiple precomps and in the main animation, references +to these (such as when parenting layers) are relative to the composition.

+

You need to always specify w and h in the precomp layer or nothing +will be displayed.

+

What can you do with Precompositions?

+

In this section we'll describe some example use case including the +initial animations and the result to compare how a file needs to be +changed to obtain certain effects.

+

Resizing

+

If you need to resize an animation, the best way of doing it is by +precomposing all its layers and then scale the precomp layer.

+

While for simple examples you'd might be able to get away with scaling +all the layers in the original animation, it gets complicated if you +have parented layers or transforms applied to some of the layers.

+

Note that in the example below w and h keep their initial value +and only the scale is changed.

+
+ + + + + +
50
+
+
+
+
+ + +
+

Speeding up and Slowing down

+

Similarly, you can use time stretch to speed up and slow down an animation:

+
+ + + + + +
50
+
+
+
+
+ + +
+

You can also change the start time to delay the start of the precomp playback:

+
+ + + + + + + + + +
30
50
+
+
+
+
+ + +
+

Reversing Playback

+

While sr only allows you to speed up and slow down time, with +time remapping You can have more +interesting effects, such as reversing playback:

+
+
+
+
+
+
+ + +
+

Repeated Elements

+

Another important use for precomps is that they allow to have multiple +layers showing the same precomp.

+

In the following example the star is animated once but there are 8 +precomp layers with different rotations:

+

+

+
+
+
+
+ +
+

+

Overlaying Animations

+

Precomps also make it easier to combine multiple files into ones.

+

One thing to keep in mind is if the two files already have assets, +you need to ensure their asset identifier are unique, this can be done +by overwriting asset id and layer refId properties to some kind of +incremental values.

+

In the following example we will overlay the animation from the last +example with a different animation.

+

First Animation: +

+
+
+
+
+ +
+

+

Second Animation: +

+
+
+
+
+ +
+

+

Overlaid:

+
+
+
+
+
+
+ + +
+

If you look at the JSON you'll notice that this is how the structure changed:

+
// First Animation:
+{
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "assets": [
+        {
+            "id": "Star",
+            "layers": [ /* Star Precomp Layers */ ]
+        }
+    ],
+    "layers": [ /* First Animation Layers */ ]
+}
+
+// Second Animation
+{
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "assets": [],
+    "layers": [ /* Second Animation Layers */ ]
+}
+
+// Overlaid
+{
+    "ip": 0,
+    "op": 60,
+    "fr": 60,
+    "w": 512,
+    "h": 512,
+    "assets": [
+        {
+            "id": "Star",
+            "layers": [ /* Star Precomp Layers */ ]
+        },
+        {
+            "id": "Expanding Stars",
+            "layers": [ /* First Animation Layers */ ]
+        },
+        {
+            "id": "Circle",
+            "layers": [ /* Second Animation Layers */ ]
+        }
+    ],
+    "layers": [
+        {
+            "nm": "Expanding Stars Layer",
+            "refId": "Expanding Stars",
+            "ty": 0,
+            "st": 0,
+            "ip": 0,
+            "op": 60,
+            "w": 512,
+            "h": 512,
+            "ks": {}
+        },
+        {
+            "nm": "Circle Layer",
+            "refId": "Circle",
+            "ty": 0,
+            "st": 0,
+            "ip": 0,
+            "op": 60,
+            "w": 512,
+            "h": 512,
+            "ks": {}
+        }
+    ]
+}
+
+

In this example the two animations had the same duration and size, +you can use the techniques described earlier to resize or retime the +animations if you want to overlay animations with different sizes or +durations.

+

Concatenating Animations

+

This works basically the same as overlaying them, just by changing +some timing properties in the precomp layers.

+
+
+
+
+
+
+ + +
+

Masking Animations

+

Just like any other visual layer, precomp layers can be used for mattes.

+
+
+
+
+
+
+ + +
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/concepts/index.html b/concepts/index.html new file mode 100644 index 00000000..314f3cfb --- /dev/null +++ b/concepts/index.html @@ -0,0 +1,985 @@ + + + + + + + + + + + + + + General concepts - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

General concepts

+

This page describes values and other objects used throughout the lottie format

+

Booleans

+

In some places boolean values are shown as booleans in the JSON (true/false). +In other places they are shown as integers with 0 or 1 as values.

+

Colors

+

Colors are represented as arrays with values between 0 and 1 for the RGB components.

+

for example:

+
    +
  • [1, 0, 0]
  • +
  • [1, 0.5, 0]
  • +
+

Note sometimes you might find color values with 4 components (the 4th being alpha) +but most player ignore the last component.

+

Gradients

+

Gradients are represented as a flat array, showing offsets and RGB components.

+

There are two possible representations, with alpha, and without.

+

Gradients without transparency

+

The array is a sequence of offset, red, green, blue components for each +color. all values are between 0 and 1

+

So let's say you want these colors:

+
    +
  • [0.161, 0.184, 0.459]
  • +
  • [0.196, 0.314, 0.69]
  • +
  • [0.769, 0.851, 0.961]
  • +
+

the array will look like the following:

+

[0, 0.161, 0.184, 0.459, 0.5, 0.196, 0.314, 0.69, 1, 0.769, 0.851, 0.961]

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
0Offset of the 1st color (0 means at the start)
0.161Red component for the 1st color
0.184Green component for the 1st color
0.459Blue component for the 1st color
0.5Offset of the 2nd color (0.5 means half way)
0.196Red component for the 2nd color
0.314Green component for the 2nd color
0.69Blue component for the 2nd color
1Offset of the 3rd color (1 means at the end)
0.769Red component for the 3rd color
0.851Green component for the 3rd color
0.961Blue component for the 3rd color
+

Gradients with transparency

+

Alpha is added at the end, repeating offsets and followed by alpha for each colors

+

So assume the same colors as before, but opacity of 80% for the first color and 100% for the other two.

+

The array will look like this:

+

[0, 0.161, 0.184, 0.459, 0.5, 0.196, 0.314, 0.69, 1, 0.769, 0.851, 0.961, 0, 0.8, 0.5, 1, 1, 1]

+

It's the same array as the case without transparency but with the following values added at the end:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDescription
0Offset of the 1st color (0 means at the start)
0.8Alpha component for the 1st color
0.5Offset of the 2nd color (0.5 means half way)
1Alpha component for the 2nd color
1Offset of the 3rd color (1 means at the end)
1Alpha component for the 3rd color
+

Gradient Example

+
+
+ + +
+

Lists of layers and shapes

+

Such lists appear Precomposition, Animation, ShapeLayer, and Grop.

+

In such lists, items coming first will be rendered on top

+

So if you have for example: [Ellipse, Rectangle]

+

The ellipse will show on top of the rectangle:

+

+

+
+
+
+
+ +
+

+

This means the render order goes from the last element to the first.

+

Animated Property

+

Animated properties have two attributes

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription View Schema
a0-1 intWhether the property is animated. Note some old animations might not have this
kValue or keyframes, this changes based on the value of a
+

If a is 0, then k just has the value of the property.

+

If a is 1, k will be an array of keyframes.

+

Keyframe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription View Schema
tnumberKeyframe time (in frames)
sDepends on the propertyValue, note that scalar values have the value is wrapped in an array
i,oEasing Handle
h0-1 intWhether it's a hold frame
+

If h is present and it's 1, you don't need i and o, as the property will keep the same value +until the next keyframe.

+

Easing Handles

+

They are objects with x and y attributes, which are numbers within 0 and 1.

+

For multi-dimensional animated properties, these are arrays, with one element +per dimension so you can have different easing curves per dimension.

+

They represent a cubic bezier, starting at [0,0] and ending at [1,1] where +the value determines the easing function.

+

The x axis represents time, a value of 0 is the time of the current keyframe, +a value of 1 is the time of the next keyframe.

+

The y axis represents the value interpolation factor, a value of 0 +represents the value at the current keyframe, a value of 1 represents the +value at the next keyframe.

+

When you use easing you have two easing handles for the keyframe:

+

o is the "out" handle, and is the first one in the bezier, determines the curve +as it exits the current keyframe.

+

i is the "in" handle, and it's the second one in the bezier, determines the curve +as it enters the next keyframe.

+

For linear interpolation you'd have

+
{
+    "o": {"x": [0, 0], "y": [0, 0]},
+    "i": {"x": [1, 1], "y": [1, 1]}
+}
+
+

For easing in and out, you move the x towards the center, this makes the animation more fluid:

+
{
+    "o": {"x": [0.333, 0.333], "y": [0, 0]},
+    "i": {"x": [0.667, 0.667], "y": [1, 1]}
+}
+
+

Old Lottie Keyframes

+

Old lotties have an additional attribute for keyframes, e which works +similarly to s but represents the value at the end of the keyframe.

+

They also have a final keyframe with only the t attribute and you +need to determine its value based on the s value of the previous keyframe.

+

Easing example

+

In the following example, the ball moves left and right, on the background +you can see a representation of its easing function.

+
+
+ + +
+

Animated Position

+

Position properties have additional attributes in their keyframes to represent bezier tangents in the path followed by the animation

+
+

Also has the attributes from Keyframe.

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tiarray of number +

Tangent for values (eg: moving position around a curved path)

+
toarray of number +

Tangent for values (eg: moving position around a curved path)

+
+
+

Transform

+

This represents a layer or shape transform.

+

It has the properties from Visual Object and its own properties are all animated:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeNameDescription View Schema
a2D VectorAnchor pointPosition (relative to its parent) around which transformations are applied (ie: center for rotation / scale)
p2D VectorPositionPosition / Translation
s2D VectorScaleScale factor, 100 for no scaling
rnumberRotationRotation in degrees, clockwise
sknumberSkewSkew amount as an angle in degrees
sanumberSkew AxisDirection at which skew is applied, in degrees (0 skews along the X axis, 90 along the Y axis)
onumberOpacityOpacity, 100 for fully opaque
+

To make the anchor point properly line up with the center of location, p and a should have the same value.

+

This example allows you to tweak transform attributes and see how the shape changes.

+

The anchor point is highlighted with an orange dot.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
256
256
256
256
100
100
0
0
0
100
+
+
+
+
+ + +
+

Split vector

+

Sometimes p might be split into separate components animated independently and have the following structure

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
sboolean = True +

Split

+
xAnimated number +

X

+
yAnimated number +

Y

+
zAnimated number +

Z

+
+
+

Bezier

+

This represents a cubic bezier path.

+

Note that for interpolation to work correctly all bezier values in a property's keyframe must have the same number of points.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeNameDescription View Schema
c0-1 intClosedWhether the bezier forms a closed loop
varray of 2D VectorVerticesPoints along the curve
iarray of 2D VectorIn TangentsCubic control points, incoming tangent
oarray of 2D VectorOut TangentsCubic control points, outgoing tangent
+

i and o are relative to v.

+

The nth bezier segment is defined as:

+
v[n], v[n]+o[n], v[n+1]+i[n+1], v[n+1]
+
+

If the bezier is closed, you need an extra segment going from the last point to the first, still following i and o appropriately.

+

If you want linear bezier, you can have i and o for a segment to be [0, 0]. +If you want it quadratic, set them to 2/3rd of what the quadratic control point would be.

+

If you want a point to be smooth you need to make sure that i = -o.

+
+
+ + +
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/constants/index.html b/constants/index.html new file mode 100644 index 00000000..dc374487 --- /dev/null +++ b/constants/index.html @@ -0,0 +1,1113 @@ + + + + + + + + + + + + + + Enumerations - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Enumerations

+

Blend Mode

+

Layer and shape blend mode

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
0Normal
1Multiply
2Screen
3Overlay
4Darken
5Lighten
6Color Dodge
7Color Burn
8Hard Light
9Soft Light
10Difference
11Exclusion
12Hue
13Saturation
14Color
15Luminosity
16Add
17Hard Mix
+

In the following example you can change the blend mode of the top layer

+
+ + + + + + + + + +
50
+
+
+
+
+ +
+

Composite

+

How to stack copies in a repeater

+ + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Above
2Below
+

Fill Rule

+

Rule used to handle multiple shapes rendered with the same fill object

+ + + + + + + + + + + + + + + + + + + + +
ValueNameDescriptionView Schema
1Non ZeroEverything is colored (You can think of this as an OR)
2Even OddColored based on intersections and path direction, can be used to create "holes"
+

Font Path Origin

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
0Local
1Css Url
2Script Url
3Font Url
+

Gradient Type

+

Type of a gradient

+ + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Linear
2Radial
+

Line Cap

+

Style at the end of a stoked line

+ + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Butt
2Round
3Square
+

Line Join

+

Style at a sharp corner of a stoked line

+ + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Miter
2Round
3Bevel
+

Mask Mode

+

How masks interact with each other. See https://helpx.adobe.com/after-effects/using/alpha-channels-masks-mattes.html

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
'n'None
'a'Add
's'Subtract
'i'Intersect
'l'Lighten
'd'Darken
'f'Difference
+

Matte Mode

+

How a layer should mask another layer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
0Normal
1Alpha
2Inverted Alpha
3Luma
4Inverted Luma
+
+ + + + + +
+
+
+
+
+ +
+

Merge Mode

+

Boolean operation on shapes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Normal
2Add
3Subtract
4Intersect
5Exclude Intersections
+

Shape Direction

+

Drawing direction of the shape curve, useful for trim path

+ + + + + + + + + + + + + + + + + + + + +
ValueNameDescriptionView Schema
1NormalUsually clockwise
3ReversedUsually counter clockwise
+

Star Type

+

Star or Polygon

+ + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Star
2Polygon
+

Stroke Dash Type

+

Type of a dash item in a stroked line

+ + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
'd'Dash
'g'Gap
'o'Offset
+

Text Based

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Characters
2Character Excluding Spaces
3Words
4Lines
+

Text Grouping

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Characters
2Word
3Line
4All
+

Text Justify

+

Text alignment / justification

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
0Left
1Right
2Center
3Justify with Last Line Left
4Justify with Last Line Right
5Justify with Last Line Center
6Justify with Last Line Full
+

Text Shape

+

Defines the function used to determine the interpolating factor on a text range selector.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Square
2Ramp Up
3Ramp Down
4Triangle
5Round
6Smooth
+

To better illustrate what the value mean, the graphics below shows an +example for each value, including the function itself, based on the +range start and end character.

+

Text Shapes

+

Trim Multiple Shapes

+

How to handle multiple shapes in trim path

+ + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Simultaneously
2Individually
+

Text Caps

+

+ + + + + + + + + + + + + + + + + + + + + +
ValueNameView Schema
0Regular
1All Caps
2Small Caps
+

Text Range Units

+

Unit type for a text selector

+ + + + + + + + + + + + + + + + + +
ValueNameView Schema
1Percent
2Index
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/css/base.css b/css/base.css new file mode 100644 index 00000000..2d684824 --- /dev/null +++ b/css/base.css @@ -0,0 +1,289 @@ +html { + scroll-padding-top: 70px; +} + +body { + padding-top: 70px; +} + +p > img { + max-width: 100%; + height: auto; +} + +ul.nav li.first-level { + font-weight: bold; +} + +ul.nav li.third-level { + padding-left: 12px; +} + +div.col-md-3 { + padding-left: 0; +} + +div.col-md-9 { + padding-bottom: 100px; +} + +div.source-links { + float: right; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +/* By default it's not affixed in mobile views, so undo that */ +.bs-sidebar.affix { + position: static; +} + +.bs-sidebar.well { + padding: 0; +} + +/* First level of nav */ +.bs-sidenav { + margin-top: 30px; + margin-bottom: 30px; + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; + z-index: 1; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > .active > a, +.bs-sidebar .nav > .active:hover > a, +.bs-sidebar .nav > .active:focus > a { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +/* Nav: second level (shown on .active) */ +.bs-sidebar .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + margin-bottom: 8px; +} +.bs-sidebar .nav .nav > li > a { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 30px; + font-size: 90%; +} + +/* Show and affix the side nav when space allows it */ +@media (min-width: 992px) { + .bs-sidebar .nav > .active > ul { + display: block; + } + /* Widen the fixed sidebar */ + .bs-sidebar.affix, + .bs-sidebar.affix-bottom { + width: 213px; + } + .bs-sidebar.affix { + position: fixed; /* Undo the static from mobile first approach */ + top: 80px; + max-height: calc(100% - 180px); + overflow-y: auto; + } + .bs-sidebar.affix-bottom { + position: absolute; /* Undo the static from mobile first approach */ + } + .bs-sidebar.affix-bottom .bs-sidenav, + .bs-sidebar.affix .bs-sidenav { + margin-top: 0; + margin-bottom: 0; + } +} +@media (min-width: 1200px) { + /* Widen the fixed sidebar again */ + .bs-sidebar.affix-bottom, + .bs-sidebar.affix { + width: 263px; + } +} + + +/* Added to support >2 level nav in drop down */ + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: 0px; + margin-left: 0px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #ccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #fff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 00px; +} +/* Start Bootstrap Callouts CSS Source by Chris Pratt (https://codepen.io/chrisdpratt/pen/IAymB) MIT License*/ +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; + background-color: #FCFDFF; +} +.bs-callout h4 { + font-style: normal; + font-weight: 400; + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} +.bs-callout+.bs-callout { + margin-top: -5px; +} +.bs-callout-default { + border-left-color: #FA023C; /*modified from upstream default by Christopher Simpkins*/ +} +.bs-callout-default h4 { + color: #FA023C; /*modified from upstream default by Christopher Simpkins*/ +} +.bs-callout-primary { + border-left-color: #428bca; +} +.bs-callout-primary h4 { + color: #428bca; +} +.bs-callout-success { + border-left-color: #5cb85c; +} +.bs-callout-success h4 { + color: #5cb85c; +} +.bs-callout-danger { + border-left-color: #d9534f; +} +.bs-callout-danger h4 { + color: #d9534f; +} +.bs-callout-warning { + border-left-color: #f0ad4e; +} +.bs-callout-warning h4 { + color: #f0ad4e; +} +.bs-callout-info { + border-left-color: #5bc0de; +} +.bs-callout-info h4 { + color: #5bc0de; +} +/* End Bootstrap Callouts CSS Source by Chris Pratt */ + +/* Headerlinks */ +.headerlink { + display: none; + padding-left: .5em; +} + +h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { + display: inline-block; +} + +/* Admonitions */ +.admonition { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; + background-color: #FCFDFF; +} + +.admonition p:last-child { + margin-bottom: 0; +} +.admonition code { + border-radius: 3px; +} +.admonition+.admonition { + margin-top: -5px; +} + +.admonition.note { /* csslint allow: adjoining-classes */ + border-left-color: #428bca; +} + +.admonition.warning { /* csslint allow: adjoining-classes */ + border-left-color: #f0ad4e; +} + +.admonition.danger { /* csslint allow: adjoining-classes */ + border-left-color: #d9534f; +} + +.admonition-title { + font-size: 19px; + font-style: normal; + font-weight: 400; + margin-top: 0; + margin-bottom: 5px; +} + +.admonition.note > .admonition-title { + color: #428bca; +} + +.admonition.warning > .admonition-title { + color: #f0ad4e; +} + +.admonition.danger > .admonition-title { + color: #d9534f; +} diff --git a/css/base.min.css b/css/base.min.css new file mode 100644 index 00000000..f7e580f2 --- /dev/null +++ b/css/base.min.css @@ -0,0 +1 @@ +html{scroll-padding-top:70px}body{padding-top:70px}p>img{max-width:100%;height:auto}ul.nav li.first-level{font-weight:bold}ul.nav li.third-level{padding-left:12px}div.col-md-3{padding-left:0}div.col-md-9{padding-bottom:100px}div.source-links{float:right}.bs-sidebar.affix{position:static}.bs-sidebar.well{padding:0}.bs-sidenav{margin-top:30px;margin-bottom:30px;padding-top:10px;padding-bottom:10px;border-radius:5px}.bs-sidebar .nav>li>a{display:block;padding:5px 20px;z-index:1}.bs-sidebar .nav>li>a:hover,.bs-sidebar .nav>li>a:focus{text-decoration:none;border-right:1px solid}.bs-sidebar .nav>.active>a,.bs-sidebar .nav>.active:hover>a,.bs-sidebar .nav>.active:focus>a{font-weight:bold;background-color:transparent;border-right:1px solid}.bs-sidebar .nav .nav{display:none;margin-bottom:8px}.bs-sidebar .nav .nav>li>a{padding-top:3px;padding-bottom:3px;padding-left:30px;font-size:90%}@media(min-width:992px){.bs-sidebar .nav>.active>ul{display:block}.bs-sidebar.affix,.bs-sidebar.affix-bottom{width:213px}.bs-sidebar.affix{position:fixed;top:80px;max-height:calc(100% - 180px);overflow-y:auto}.bs-sidebar.affix-bottom{position:absolute}.bs-sidebar.affix-bottom .bs-sidenav,.bs-sidebar.affix .bs-sidenav{margin-top:0;margin-bottom:0}}@media(min-width:1200px){.bs-sidebar.affix-bottom,.bs-sidebar.affix{width:263px}}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:0;margin-left:0}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:00px}.bs-callout{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px;background-color:#fcfdff}.bs-callout h4{font-style:normal;font-weight:400;margin-top:0;margin-bottom:5px}.bs-callout p:last-child{margin-bottom:0}.bs-callout code{border-radius:3px}.bs-callout+.bs-callout{margin-top:-5px}.bs-callout-default{border-left-color:#fa023c}.bs-callout-default h4{color:#fa023c}.bs-callout-primary{border-left-color:#428bca}.bs-callout-primary h4{color:#428bca}.bs-callout-success{border-left-color:#5cb85c}.bs-callout-success h4{color:#5cb85c}.bs-callout-danger{border-left-color:#d9534f}.bs-callout-danger h4{color:#d9534f}.bs-callout-warning{border-left-color:#f0ad4e}.bs-callout-warning h4{color:#f0ad4e}.bs-callout-info{border-left-color:#5bc0de}.bs-callout-info h4{color:#5bc0de}.headerlink{display:none;padding-left:.5em}h1:hover .headerlink,h2:hover .headerlink,h3:hover .headerlink,h4:hover .headerlink,h5:hover .headerlink,h6:hover .headerlink{display:inline-block}.admonition{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px;background-color:#fcfdff}.admonition p:last-child{margin-bottom:0}.admonition code{border-radius:3px}.admonition+.admonition{margin-top:-5px}.admonition.note{border-left-color:#428bca}.admonition.warning{border-left-color:#f0ad4e}.admonition.danger{border-left-color:#d9534f}.admonition-title{font-size:19px;font-style:normal;font-weight:400;margin-top:0;margin-bottom:5px}.admonition.note>.admonition-title{color:#428bca}.admonition.warning>.admonition-title{color:#f0ad4e}.admonition.danger>.admonition-title{color:#d9534f} diff --git a/css/bootstrap-custom.css b/css/bootstrap-custom.css new file mode 100644 index 00000000..631252d2 --- /dev/null +++ b/css/bootstrap-custom.css @@ -0,0 +1,5309 @@ +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} +audio, canvas, video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], template { + display: none; +} +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%} +body { + margin: 0; +} +a { + background: transparent; +} +a:focus { + outline: thin dotted; +} +a:active, a:hover { + outline: 0; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +mark { + color: #000; + background: #ff0; +} +code, kbd, pre, samp { + font-family: Hack, monospace, serif; + font-size: 1em; +} +pre { + white-space: pre-wrap; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"} +small { + font-size: 80%} +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +button, input, select, textarea { + margin: 0; + font-family: inherit; + font-size: 100%} +button, input { + line-height: normal; +} +button, select { + text-transform: none; +} +button, html input[type="button"], input[type="reset"], input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +button[disabled], html input[disabled] { + cursor: default; +} +input[type="checkbox"], input[type="radio"] { + padding: 0; + box-sizing: border-box; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +@media print { + * { + color: #000!important; + text-shadow: none!important; + background: transparent!important; + box-shadow: none!important; +} +a, a:visited { + text-decoration: underline; +} +a[href]:after { + content: " (" attr(href) ")"} +abbr[title]:after { + content: " (" attr(title) ")"} +a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""} +pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; +} +thead { + display: table-header-group; +} +tr, img { + page-break-inside: avoid; +} +img { + max-width: 100%!important; +} +@page { + margin: 2cm .5cm; +} +p, h2, h3 { + orphans: 3; + widows: 3; +} +h2, h3 { + page-break-after: avoid; +} +select { + background: #fff!important; +} +.navbar { + display: none; +} +.table td, .table th { + background-color: #fff!important; +} +.btn>.caret, .dropup>.btn>.caret { + border-top-color: #000!important; +} +.label { + border: 1px solid #000; +} +.table { + border-collapse: collapse!important; +} +.table-bordered th, .table-bordered td { + border: 1px solid #ddd!important; +} +}*, *:before, *:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: Merriweather, Georgia, serif; + font-size: 14px; + line-height: 1.428571429; + color: #222; + background-color: #fff; +} +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #008cba; + text-decoration: none; +} +a:hover, a:focus { + color: #00526e; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +img { + vertical-align: middle; +} +.img-responsive { + display: block; + height: auto; + max-width: 100%} +.img-rounded { + border-radius: 0; +} +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 0; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%} +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #ddd; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + line-height: 1.1; + color: inherit; +} +h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { + font-weight: normal; + line-height: 1; + color: #999; +} +h1, h2, h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} +h1 small, h2 small, h3 small, h1 .small, h2 .small, h3 .small { + font-size: 65%} +h4, h5, h6 { + margin-top: 10.5px; + margin-bottom: 10.5px; +} +h4 small, h5 small, h6 small, h4 .small, h5 .small, h6 .small { + font-size: 75%} +h1, .h1 { + font-size: 39px; +} +h2, .h2 { + font-size: 32px; +} +h3, .h3 { + font-size: 26px; +} +h4, .h4 { + font-size: 19px; +} +h5, .h5 { + font-size: 15px; +} +h6, .h6 { + font-size: 13px; +} +p { + margin: 0 0 10.5px; +} +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 200; + line-height: 1.4; +} +@media(min-width:768px) { + .lead { + font-size: 22.5px; +} +}small, .small { + font-size: 85%} +cite { + font-style: normal; +} +.text-muted { + color: #999; +} +.text-primary { + color: #008cba; +} +.text-primary:hover { + color: #006687; +} +.text-warning { + color: #e99002; +} +.text-warning:hover { + color: #b67102; +} +.text-danger { + color: #f04124; +} +.text-danger:hover { + color: #d32a0e; +} +.text-success { + color: #43ac6a; +} +.text-success:hover { + color: #358753; +} +.text-info { + color: #5bc0de; +} +.text-info:hover { + color: #31b0d5; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.page-header { + padding-bottom: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #ddd; +} +ul, ol { + margin-top: 0; + margin-bottom: 10.5px; +} +ul ul, ol ul, ul ol, ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; +} +.list-inline>li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +.list-inline>li:first-child { + padding-left: 0; +} +dl { + margin-top: 0; + margin-bottom: 21px; +} +dt, dd { + line-height: 1.428571429; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media(min-width:768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 180px; +} +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "} +.dl-horizontal dd:after { + clear: both; +} +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "} +.dl-horizontal dd:after { + clear: both; +} +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "} +.dl-horizontal dd:after { + clear: both; +} +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "} +.dl-horizontal dd:after { + clear: both; +} +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "} +.dl-horizontal dd:after { + clear: both; +} +}abbr[title], abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + border-left: 5px solid #ddd; +} +blockquote p { + font-size: 18.75px; + font-weight: 300; + line-height: 1.25; +} +blockquote p:last-child { + margin-bottom: 0; +} +blockquote small, blockquote .small { + display: block; + line-height: 1.428571429; + color: #6f6f6f; +} +blockquote small:before, blockquote .small:before { + content: '\2014 \00A0'} +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #ddd; + border-left: 0; +} +blockquote.pull-right p, blockquote.pull-right small, blockquote.pull-right .small { + text-align: right; +} +blockquote.pull-right small:before, blockquote.pull-right .small:before { + content: ''} +blockquote.pull-right small:after, blockquote.pull-right .small:after { + content: '\00A0 \2014'} +blockquote:before, blockquote:after { + content: ""} +address { + margin-bottom: 21px; + font-style: normal; + line-height: 1.428571429; +} +code, kbd, pre, samp { + font-family: Hack, Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 0; +} +pre { + display: block; + padding: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.428571429; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 0; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.container:before, .container:after { + display: table; + content: " "} +.container:after { + clear: both; +} +.container:before, .container:after { + display: table; + content: " "} +.container:after { + clear: both; +} +.container:before, .container:after { + display: table; + content: " "} +.container:after { + clear: both; +} +.container:before, .container:after { + display: table; + content: " "} +.container:after { + clear: both; +} +.container:before, .container:after { + display: table; + content: " "} +.container:after { + clear: both; +} +@media(min-width:768px) { + .container { + width: 750px; +} +}@media(min-width:992px) { + .container { + width: 970px; +} +}@media(min-width:1200px) { + .container { + width: 1170px; +} +}.row { + margin-right: -15px; + margin-left: -15px; +} +.row:before, .row:after { + display: table; + content: " "} +.row:after { + clear: both; +} +.row:before, .row:after { + display: table; + content: " "} +.row:after { + clear: both; +} +.row:before, .row:after { + display: table; + content: " "} +.row:after { + clear: both; +} +.row:before, .row:after { + display: table; + content: " "} +.row:after { + clear: both; +} +.row:before, .row:after { + display: table; + content: " "} +.row:after { + clear: both; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%} +.col-xs-11 { + width: 91.66666666666666%} +.col-xs-10 { + width: 83.33333333333334%} +.col-xs-9 { + width: 75%} +.col-xs-8 { + width: 66.66666666666666%} +.col-xs-7 { + width: 58.333333333333336%} +.col-xs-6 { + width: 50%} +.col-xs-5 { + width: 41.66666666666667%} +.col-xs-4 { + width: 33.33333333333333%} +.col-xs-3 { + width: 25%} +.col-xs-2 { + width: 16.666666666666664%} +.col-xs-1 { + width: 8.333333333333332%} +.col-xs-pull-12 { + right: 100%} +.col-xs-pull-11 { + right: 91.66666666666666%} +.col-xs-pull-10 { + right: 83.33333333333334%} +.col-xs-pull-9 { + right: 75%} +.col-xs-pull-8 { + right: 66.66666666666666%} +.col-xs-pull-7 { + right: 58.333333333333336%} +.col-xs-pull-6 { + right: 50%} +.col-xs-pull-5 { + right: 41.66666666666667%} +.col-xs-pull-4 { + right: 33.33333333333333%} +.col-xs-pull-3 { + right: 25%} +.col-xs-pull-2 { + right: 16.666666666666664%} +.col-xs-pull-1 { + right: 8.333333333333332%} +.col-xs-pull-0 { + right: 0; +} +.col-xs-push-12 { + left: 100%} +.col-xs-push-11 { + left: 91.66666666666666%} +.col-xs-push-10 { + left: 83.33333333333334%} +.col-xs-push-9 { + left: 75%} +.col-xs-push-8 { + left: 66.66666666666666%} +.col-xs-push-7 { + left: 58.333333333333336%} +.col-xs-push-6 { + left: 50%} +.col-xs-push-5 { + left: 41.66666666666667%} +.col-xs-push-4 { + left: 33.33333333333333%} +.col-xs-push-3 { + left: 25%} +.col-xs-push-2 { + left: 16.666666666666664%} +.col-xs-push-1 { + left: 8.333333333333332%} +.col-xs-push-0 { + left: 0; +} +.col-xs-offset-12 { + margin-left: 100%} +.col-xs-offset-11 { + margin-left: 91.66666666666666%} +.col-xs-offset-10 { + margin-left: 83.33333333333334%} +.col-xs-offset-9 { + margin-left: 75%} +.col-xs-offset-8 { + margin-left: 66.66666666666666%} +.col-xs-offset-7 { + margin-left: 58.333333333333336%} +.col-xs-offset-6 { + margin-left: 50%} +.col-xs-offset-5 { + margin-left: 41.66666666666667%} +.col-xs-offset-4 { + margin-left: 33.33333333333333%} +.col-xs-offset-3 { + margin-left: 25%} +.col-xs-offset-2 { + margin-left: 16.666666666666664%} +.col-xs-offset-1 { + margin-left: 8.333333333333332%} +.col-xs-offset-0 { + margin-left: 0; +} +@media(min-width:768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; +} +.col-sm-12 { + width: 100%} +.col-sm-11 { + width: 91.66666666666666%} +.col-sm-10 { + width: 83.33333333333334%} +.col-sm-9 { + width: 75%} +.col-sm-8 { + width: 66.66666666666666%} +.col-sm-7 { + width: 58.333333333333336%} +.col-sm-6 { + width: 50%} +.col-sm-5 { + width: 41.66666666666667%} +.col-sm-4 { + width: 33.33333333333333%} +.col-sm-3 { + width: 25%} +.col-sm-2 { + width: 16.666666666666664%} +.col-sm-1 { + width: 8.333333333333332%} +.col-sm-pull-12 { + right: 100%} +.col-sm-pull-11 { + right: 91.66666666666666%} +.col-sm-pull-10 { + right: 83.33333333333334%} +.col-sm-pull-9 { + right: 75%} +.col-sm-pull-8 { + right: 66.66666666666666%} +.col-sm-pull-7 { + right: 58.333333333333336%} +.col-sm-pull-6 { + right: 50%} +.col-sm-pull-5 { + right: 41.66666666666667%} +.col-sm-pull-4 { + right: 33.33333333333333%} +.col-sm-pull-3 { + right: 25%} +.col-sm-pull-2 { + right: 16.666666666666664%} +.col-sm-pull-1 { + right: 8.333333333333332%} +.col-sm-pull-0 { + right: 0; +} +.col-sm-push-12 { + left: 100%} +.col-sm-push-11 { + left: 91.66666666666666%} +.col-sm-push-10 { + left: 83.33333333333334%} +.col-sm-push-9 { + left: 75%} +.col-sm-push-8 { + left: 66.66666666666666%} +.col-sm-push-7 { + left: 58.333333333333336%} +.col-sm-push-6 { + left: 50%} +.col-sm-push-5 { + left: 41.66666666666667%} +.col-sm-push-4 { + left: 33.33333333333333%} +.col-sm-push-3 { + left: 25%} +.col-sm-push-2 { + left: 16.666666666666664%} +.col-sm-push-1 { + left: 8.333333333333332%} +.col-sm-push-0 { + left: 0; +} +.col-sm-offset-12 { + margin-left: 100%} +.col-sm-offset-11 { + margin-left: 91.66666666666666%} +.col-sm-offset-10 { + margin-left: 83.33333333333334%} +.col-sm-offset-9 { + margin-left: 75%} +.col-sm-offset-8 { + margin-left: 66.66666666666666%} +.col-sm-offset-7 { + margin-left: 58.333333333333336%} +.col-sm-offset-6 { + margin-left: 50%} +.col-sm-offset-5 { + margin-left: 41.66666666666667%} +.col-sm-offset-4 { + margin-left: 33.33333333333333%} +.col-sm-offset-3 { + margin-left: 25%} +.col-sm-offset-2 { + margin-left: 16.666666666666664%} +.col-sm-offset-1 { + margin-left: 8.333333333333332%} +.col-sm-offset-0 { + margin-left: 0; +} +}@media(min-width:992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; +} +.col-md-12 { + width: 100%} +.col-md-11 { + width: 91.66666666666666%} +.col-md-10 { + width: 83.33333333333334%} +.col-md-9 { + width: 75%} +.col-md-8 { + width: 66.66666666666666%} +.col-md-7 { + width: 58.333333333333336%} +.col-md-6 { + width: 50%} +.col-md-5 { + width: 41.66666666666667%} +.col-md-4 { + width: 33.33333333333333%} +.col-md-3 { + width: 25%} +.col-md-2 { + width: 16.666666666666664%} +.col-md-1 { + width: 8.333333333333332%} +.col-md-pull-12 { + right: 100%} +.col-md-pull-11 { + right: 91.66666666666666%} +.col-md-pull-10 { + right: 83.33333333333334%} +.col-md-pull-9 { + right: 75%} +.col-md-pull-8 { + right: 66.66666666666666%} +.col-md-pull-7 { + right: 58.333333333333336%} +.col-md-pull-6 { + right: 50%} +.col-md-pull-5 { + right: 41.66666666666667%} +.col-md-pull-4 { + right: 33.33333333333333%} +.col-md-pull-3 { + right: 25%} +.col-md-pull-2 { + right: 16.666666666666664%} +.col-md-pull-1 { + right: 8.333333333333332%} +.col-md-pull-0 { + right: 0; +} +.col-md-push-12 { + left: 100%} +.col-md-push-11 { + left: 91.66666666666666%} +.col-md-push-10 { + left: 83.33333333333334%} +.col-md-push-9 { + left: 75%} +.col-md-push-8 { + left: 66.66666666666666%} +.col-md-push-7 { + left: 58.333333333333336%} +.col-md-push-6 { + left: 50%} +.col-md-push-5 { + left: 41.66666666666667%} +.col-md-push-4 { + left: 33.33333333333333%} +.col-md-push-3 { + left: 25%} +.col-md-push-2 { + left: 16.666666666666664%} +.col-md-push-1 { + left: 8.333333333333332%} +.col-md-push-0 { + left: 0; +} +.col-md-offset-12 { + margin-left: 100%} +.col-md-offset-11 { + margin-left: 91.66666666666666%} +.col-md-offset-10 { + margin-left: 83.33333333333334%} +.col-md-offset-9 { + margin-left: 75%} +.col-md-offset-8 { + margin-left: 66.66666666666666%} +.col-md-offset-7 { + margin-left: 58.333333333333336%} +.col-md-offset-6 { + margin-left: 50%} +.col-md-offset-5 { + margin-left: 41.66666666666667%} +.col-md-offset-4 { + margin-left: 33.33333333333333%} +.col-md-offset-3 { + margin-left: 25%} +.col-md-offset-2 { + margin-left: 16.666666666666664%} +.col-md-offset-1 { + margin-left: 8.333333333333332%} +.col-md-offset-0 { + margin-left: 0; +} +}@media(min-width:1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; +} +.col-lg-12 { + width: 100%} +.col-lg-11 { + width: 91.66666666666666%} +.col-lg-10 { + width: 83.33333333333334%} +.col-lg-9 { + width: 75%} +.col-lg-8 { + width: 66.66666666666666%} +.col-lg-7 { + width: 58.333333333333336%} +.col-lg-6 { + width: 50%} +.col-lg-5 { + width: 41.66666666666667%} +.col-lg-4 { + width: 33.33333333333333%} +.col-lg-3 { + width: 25%} +.col-lg-2 { + width: 16.666666666666664%} +.col-lg-1 { + width: 8.333333333333332%} +.col-lg-pull-12 { + right: 100%} +.col-lg-pull-11 { + right: 91.66666666666666%} +.col-lg-pull-10 { + right: 83.33333333333334%} +.col-lg-pull-9 { + right: 75%} +.col-lg-pull-8 { + right: 66.66666666666666%} +.col-lg-pull-7 { + right: 58.333333333333336%} +.col-lg-pull-6 { + right: 50%} +.col-lg-pull-5 { + right: 41.66666666666667%} +.col-lg-pull-4 { + right: 33.33333333333333%} +.col-lg-pull-3 { + right: 25%} +.col-lg-pull-2 { + right: 16.666666666666664%} +.col-lg-pull-1 { + right: 8.333333333333332%} +.col-lg-pull-0 { + right: 0; +} +.col-lg-push-12 { + left: 100%} +.col-lg-push-11 { + left: 91.66666666666666%} +.col-lg-push-10 { + left: 83.33333333333334%} +.col-lg-push-9 { + left: 75%} +.col-lg-push-8 { + left: 66.66666666666666%} +.col-lg-push-7 { + left: 58.333333333333336%} +.col-lg-push-6 { + left: 50%} +.col-lg-push-5 { + left: 41.66666666666667%} +.col-lg-push-4 { + left: 33.33333333333333%} +.col-lg-push-3 { + left: 25%} +.col-lg-push-2 { + left: 16.666666666666664%} +.col-lg-push-1 { + left: 8.333333333333332%} +.col-lg-push-0 { + left: 0; +} +.col-lg-offset-12 { + margin-left: 100%} +.col-lg-offset-11 { + margin-left: 91.66666666666666%} +.col-lg-offset-10 { + margin-left: 83.33333333333334%} +.col-lg-offset-9 { + margin-left: 75%} +.col-lg-offset-8 { + margin-left: 66.66666666666666%} +.col-lg-offset-7 { + margin-left: 58.333333333333336%} +.col-lg-offset-6 { + margin-left: 50%} +.col-lg-offset-5 { + margin-left: 41.66666666666667%} +.col-lg-offset-4 { + margin-left: 33.33333333333333%} +.col-lg-offset-3 { + margin-left: 25%} +.col-lg-offset-2 { + margin-left: 16.666666666666664%} +.col-lg-offset-1 { + margin-left: 8.333333333333332%} +.col-lg-offset-0 { + margin-left: 0; +} +}table { + max-width: 100%; + background-color: transparent; +} +th { + text-align: left; +} +.table { + width: 100%; + margin-bottom: 21px; +} +.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table>thead>tr>th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table>caption+thead>tr:first-child>th, .table>colgroup+thead>tr:first-child>th, .table>thead:first-child>tr:first-child>th, .table>caption+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>td, .table>thead:first-child>tr:first-child>td { + border-top: 0; +} +.table>tbody+tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed>thead>tr>th, .table-condensed>tbody>tr>th, .table-condensed>tfoot>tr>th, .table-condensed>thead>tr>td, .table-condensed>tbody>tr>td, .table-condensed>tfoot>tr>td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered>thead>tr>th, .table-bordered>tbody>tr>th, .table-bordered>tfoot>tr>th, .table-bordered>thead>tr>td, .table-bordered>tbody>tr>td, .table-bordered>tfoot>tr>td { + border: 1px solid #ddd; +} +.table-bordered>thead>tr>th, .table-bordered>thead>tr>td { + border-bottom-width: 2px; +} +.table-striped>tbody>tr:nth-child(odd)>td, .table-striped>tbody>tr:nth-child(odd)>th { + background-color: #f9f9f9; +} +.table-hover>tbody>tr:hover>td, .table-hover>tbody>tr:hover>th { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], table th[class*="col-"] { + display: table-cell; + float: none; +} +.table>thead>tr>.active, .table>tbody>tr>.active, .table>tfoot>tr>.active, .table>thead>.active>td, .table>tbody>.active>td, .table>tfoot>.active>td, .table>thead>.active>th, .table>tbody>.active>th, .table>tfoot>.active>th { + background-color: #f5f5f5; +} +.table-hover>tbody>tr>.active:hover, .table-hover>tbody>.active:hover>td, .table-hover>tbody>.active:hover>th { + background-color: #e8e8e8; +} +.table>thead>tr>.success, .table>tbody>tr>.success, .table>tfoot>tr>.success, .table>thead>.success>td, .table>tbody>.success>td, .table>tfoot>.success>td, .table>thead>.success>th, .table>tbody>.success>th, .table>tfoot>.success>th { + background-color: #dff0d8; +} +.table-hover>tbody>tr>.success:hover, .table-hover>tbody>.success:hover>td, .table-hover>tbody>.success:hover>th { + background-color: #d0e9c6; +} +.table>thead>tr>.danger, .table>tbody>tr>.danger, .table>tfoot>tr>.danger, .table>thead>.danger>td, .table>tbody>.danger>td, .table>tfoot>.danger>td, .table>thead>.danger>th, .table>tbody>.danger>th, .table>tfoot>.danger>th { + background-color: #f2dede; +} +.table-hover>tbody>tr>.danger:hover, .table-hover>tbody>.danger:hover>td, .table-hover>tbody>.danger:hover>th { + background-color: #ebcccc; +} +.table>thead>tr>.warning, .table>tbody>tr>.warning, .table>tfoot>tr>.warning, .table>thead>.warning>td, .table>tbody>.warning>td, .table>tfoot>.warning>td, .table>thead>.warning>th, .table>tbody>.warning>th, .table>tfoot>.warning>th { + background-color: #fcf8e3; +} +.table-hover>tbody>tr>.warning:hover, .table-hover>tbody>.warning:hover>td, .table-hover>tbody>.warning:hover>th { + background-color: #faf2cc; +} +@media(max-width:767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #ddd; + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; +} +.table-responsive>.table { + margin-bottom: 0; +} +.table-responsive>.table>thead>tr>th, .table-responsive>.table>tbody>tr>th, .table-responsive>.table>tfoot>tr>th, .table-responsive>.table>thead>tr>td, .table-responsive>.table>tbody>tr>td, .table-responsive>.table>tfoot>tr>td { + white-space: nowrap; +} +.table-responsive>.table-bordered { + border: 0; +} +.table-responsive>.table-bordered>thead>tr>th:first-child, .table-responsive>.table-bordered>tbody>tr>th:first-child, .table-responsive>.table-bordered>tfoot>tr>th:first-child, .table-responsive>.table-bordered>thead>tr>td:first-child, .table-responsive>.table-bordered>tbody>tr>td:first-child, .table-responsive>.table-bordered>tfoot>tr>td:first-child { + border-left: 0; +} +.table-responsive>.table-bordered>thead>tr>th:last-child, .table-responsive>.table-bordered>tbody>tr>th:last-child, .table-responsive>.table-bordered>tfoot>tr>th:last-child, .table-responsive>.table-bordered>thead>tr>td:last-child, .table-responsive>.table-bordered>tbody>tr>td:last-child, .table-responsive>.table-bordered>tfoot>tr>td:last-child { + border-right: 0; +} +.table-responsive>.table-bordered>tbody>tr:last-child>th, .table-responsive>.table-bordered>tfoot>tr:last-child>th, .table-responsive>.table-bordered>tbody>tr:last-child>td, .table-responsive>.table-bordered>tfoot>tr:last-child>td { + border-bottom: 0; +} +}fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +select[multiple], select[size] { + height: auto; +} +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit; +} +input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { + height: auto; +} +output { + display: block; + padding-top: 7px; + font-size: 15px; + line-height: 1.428571429; + color: #6f6f6f; + vertical-align: middle; +} +.form-control { + display: block; + width: 100%; + height: 35px; + padding: 6px 12px; + font-size: 15px; + line-height: 1.428571429; + color: #6f6f6f; + vertical-align: middle; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control:-moz-placeholder { + color: #999; +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee; +} +textarea.form-control { + height: auto; +} +.form-group { + margin-bottom: 15px; +} +.radio, .checkbox { + display: block; + min-height: 21px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle; +} +.radio label, .checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.radio+.radio, .checkbox+.checkbox { + margin-top: -5px; +} +.radio-inline, .checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline+.radio-inline, .checkbox-inline+.checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm { + height: auto; +} +.input-lg { + height: 48px; + padding: 10px 16px; + font-size: 19px; + line-height: 1.33; + border-radius: 0; +} +select.input-lg { + height: 48px; + line-height: 48px; +} +textarea.input-lg { + height: auto; +} +.has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { + color: #e99002; +} +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; +} +.has-warning .input-group-addon { + color: #e99002; + background-color: #fcf8e3; + border-color: #e99002; +} +.has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { + color: #f04124; +} +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; +} +.has-error .input-group-addon { + color: #f04124; + background-color: #f2dede; + border-color: #f04124; +} +.has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { + color: #43ac6a; +} +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; +} +.has-success .input-group-addon { + color: #43ac6a; + background-color: #dff0d8; + border-color: #43ac6a; +} +.form-control-static { + margin-bottom: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} +@media(min-width:768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.form-inline .form-control { + display: inline-block; +} +.form-inline select.form-control { + width: auto; +} +.form-inline .radio, .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} +.form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; +} +}.form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, .form-horizontal .checkbox { + min-height: 28px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "} +.form-horizontal .form-group:after { + clear: both; +} +.form-horizontal .form-control-static { + padding-top: 7px; +} +@media(min-width:768px) { + .form-horizontal .control-label { + text-align: right; +} +}.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 15px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, .btn:focus { + color: #333; + text-decoration: none; +} +.btn:active, .btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: .65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333; + background-color: #e7e7e7; + border-color: #dadada; +} +.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { + color: #333; + background-color: #d3d3d3; + border-color: #bbb; +} +.btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { + background-color: #e7e7e7; + border-color: #dadada; +} +.btn-default .badge { + color: #e7e7e7; + background-color: #fff; +} +.btn-primary { + color: #fff; + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { + color: #fff; + background-color: #006d91; + border-color: #004b63; +} +.btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary .badge { + color: #008cba; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #e99002; + border-color: #d08002; +} +.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { + color: #fff; + background-color: #c17702; + border-color: #935b01; +} +.btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { + background-color: #e99002; + border-color: #d08002; +} +.btn-warning .badge { + color: #e99002; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { + color: #fff; + background-color: #dc2c0f; + border-color: #b1240c; +} +.btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger .badge { + color: #f04124; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { + color: #fff; + background-color: #388f58; + border-color: #2b6e44; +} +.btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success .badge { + color: #43ac6a; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { + color: #fff; + background-color: #39b3d7; + border-color: #269abc; +} +.btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #008cba; + cursor: pointer; + border-radius: 0; +} +.btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; +} +.btn-link:hover, .btn-link:focus { + color: #00526e; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { + color: #999; + text-decoration: none; +} +.btn-lg { + padding: 10px 16px; + font-size: 19px; + line-height: 1.33; + border-radius: 0; +} +.btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} +.btn-block+.btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { + width: 100%} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + transition: height .35s ease; +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon:empty { + width: 1em; +} +.glyphicon-asterisk:before { + content: "\2a"} +.glyphicon-plus:before { + content: "\2b"} +.glyphicon-euro:before { + content: "\20ac"} +.glyphicon-minus:before { + content: "\2212"} +.glyphicon-cloud:before { + content: "\2601"} +.glyphicon-envelope:before { + content: "\2709"} +.glyphicon-pencil:before { + content: "\270f"} +.glyphicon-glass:before { + content: "\e001"} +.glyphicon-music:before { + content: "\e002"} +.glyphicon-search:before { + content: "\e003"} +.glyphicon-heart:before { + content: "\e005"} +.glyphicon-star:before { + content: "\e006"} +.glyphicon-star-empty:before { + content: "\e007"} +.glyphicon-user:before { + content: "\e008"} +.glyphicon-film:before { + content: "\e009"} +.glyphicon-th-large:before { + content: "\e010"} +.glyphicon-th:before { + content: "\e011"} +.glyphicon-th-list:before { + content: "\e012"} +.glyphicon-ok:before { + content: "\e013"} +.glyphicon-remove:before { + content: "\e014"} +.glyphicon-zoom-in:before { + content: "\e015"} +.glyphicon-zoom-out:before { + content: "\e016"} +.glyphicon-off:before { + content: "\e017"} +.glyphicon-signal:before { + content: "\e018"} +.glyphicon-cog:before { + content: "\e019"} +.glyphicon-trash:before { + content: "\e020"} +.glyphicon-home:before { + content: "\e021"} +.glyphicon-file:before { + content: "\e022"} +.glyphicon-time:before { + content: "\e023"} +.glyphicon-road:before { + content: "\e024"} +.glyphicon-download-alt:before { + content: "\e025"} +.glyphicon-download:before { + content: "\e026"} +.glyphicon-upload:before { + content: "\e027"} +.glyphicon-inbox:before { + content: "\e028"} +.glyphicon-play-circle:before { + content: "\e029"} +.glyphicon-repeat:before { + content: "\e030"} +.glyphicon-refresh:before { + content: "\e031"} +.glyphicon-list-alt:before { + content: "\e032"} +.glyphicon-lock:before { + content: "\e033"} +.glyphicon-flag:before { + content: "\e034"} +.glyphicon-headphones:before { + content: "\e035"} +.glyphicon-volume-off:before { + content: "\e036"} +.glyphicon-volume-down:before { + content: "\e037"} +.glyphicon-volume-up:before { + content: "\e038"} +.glyphicon-qrcode:before { + content: "\e039"} +.glyphicon-barcode:before { + content: "\e040"} +.glyphicon-tag:before { + content: "\e041"} +.glyphicon-tags:before { + content: "\e042"} +.glyphicon-book:before { + content: "\e043"} +.glyphicon-bookmark:before { + content: "\e044"} +.glyphicon-print:before { + content: "\e045"} +.glyphicon-camera:before { + content: "\e046"} +.glyphicon-font:before { + content: "\e047"} +.glyphicon-bold:before { + content: "\e048"} +.glyphicon-italic:before { + content: "\e049"} +.glyphicon-text-height:before { + content: "\e050"} +.glyphicon-text-width:before { + content: "\e051"} +.glyphicon-align-left:before { + content: "\e052"} +.glyphicon-align-center:before { + content: "\e053"} +.glyphicon-align-right:before { + content: "\e054"} +.glyphicon-align-justify:before { + content: "\e055"} +.glyphicon-list:before { + content: "\e056"} +.glyphicon-indent-left:before { + content: "\e057"} +.glyphicon-indent-right:before { + content: "\e058"} +.glyphicon-facetime-video:before { + content: "\e059"} +.glyphicon-picture:before { + content: "\e060"} +.glyphicon-map-marker:before { + content: "\e062"} +.glyphicon-adjust:before { + content: "\e063"} +.glyphicon-tint:before { + content: "\e064"} +.glyphicon-edit:before { + content: "\e065"} +.glyphicon-share:before { + content: "\e066"} +.glyphicon-check:before { + content: "\e067"} +.glyphicon-move:before { + content: "\e068"} +.glyphicon-step-backward:before { + content: "\e069"} +.glyphicon-fast-backward:before { + content: "\e070"} +.glyphicon-backward:before { + content: "\e071"} +.glyphicon-play:before { + content: "\e072"} +.glyphicon-pause:before { + content: "\e073"} +.glyphicon-stop:before { + content: "\e074"} +.glyphicon-forward:before { + content: "\e075"} +.glyphicon-fast-forward:before { + content: "\e076"} +.glyphicon-step-forward:before { + content: "\e077"} +.glyphicon-eject:before { + content: "\e078"} +.glyphicon-chevron-left:before { + content: "\e079"} +.glyphicon-chevron-right:before { + content: "\e080"} +.glyphicon-plus-sign:before { + content: "\e081"} +.glyphicon-minus-sign:before { + content: "\e082"} +.glyphicon-remove-sign:before { + content: "\e083"} +.glyphicon-ok-sign:before { + content: "\e084"} +.glyphicon-question-sign:before { + content: "\e085"} +.glyphicon-info-sign:before { + content: "\e086"} +.glyphicon-screenshot:before { + content: "\e087"} +.glyphicon-remove-circle:before { + content: "\e088"} +.glyphicon-ok-circle:before { + content: "\e089"} +.glyphicon-ban-circle:before { + content: "\e090"} +.glyphicon-arrow-left:before { + content: "\e091"} +.glyphicon-arrow-right:before { + content: "\e092"} +.glyphicon-arrow-up:before { + content: "\e093"} +.glyphicon-arrow-down:before { + content: "\e094"} +.glyphicon-share-alt:before { + content: "\e095"} +.glyphicon-resize-full:before { + content: "\e096"} +.glyphicon-resize-small:before { + content: "\e097"} +.glyphicon-exclamation-sign:before { + content: "\e101"} +.glyphicon-gift:before { + content: "\e102"} +.glyphicon-leaf:before { + content: "\e103"} +.glyphicon-fire:before { + content: "\e104"} +.glyphicon-eye-open:before { + content: "\e105"} +.glyphicon-eye-close:before { + content: "\e106"} +.glyphicon-warning-sign:before { + content: "\e107"} +.glyphicon-plane:before { + content: "\e108"} +.glyphicon-calendar:before { + content: "\e109"} +.glyphicon-random:before { + content: "\e110"} +.glyphicon-comment:before { + content: "\e111"} +.glyphicon-magnet:before { + content: "\e112"} +.glyphicon-chevron-up:before { + content: "\e113"} +.glyphicon-chevron-down:before { + content: "\e114"} +.glyphicon-retweet:before { + content: "\e115"} +.glyphicon-shopping-cart:before { + content: "\e116"} +.glyphicon-folder-close:before { + content: "\e117"} +.glyphicon-folder-open:before { + content: "\e118"} +.glyphicon-resize-vertical:before { + content: "\e119"} +.glyphicon-resize-horizontal:before { + content: "\e120"} +.glyphicon-hdd:before { + content: "\e121"} +.glyphicon-bullhorn:before { + content: "\e122"} +.glyphicon-bell:before { + content: "\e123"} +.glyphicon-certificate:before { + content: "\e124"} +.glyphicon-thumbs-up:before { + content: "\e125"} +.glyphicon-thumbs-down:before { + content: "\e126"} +.glyphicon-hand-right:before { + content: "\e127"} +.glyphicon-hand-left:before { + content: "\e128"} +.glyphicon-hand-up:before { + content: "\e129"} +.glyphicon-hand-down:before { + content: "\e130"} +.glyphicon-circle-arrow-right:before { + content: "\e131"} +.glyphicon-circle-arrow-left:before { + content: "\e132"} +.glyphicon-circle-arrow-up:before { + content: "\e133"} +.glyphicon-circle-arrow-down:before { + content: "\e134"} +.glyphicon-globe:before { + content: "\e135"} +.glyphicon-wrench:before { + content: "\e136"} +.glyphicon-tasks:before { + content: "\e137"} +.glyphicon-filter:before { + content: "\e138"} +.glyphicon-briefcase:before { + content: "\e139"} +.glyphicon-fullscreen:before { + content: "\e140"} +.glyphicon-dashboard:before { + content: "\e141"} +.glyphicon-paperclip:before { + content: "\e142"} +.glyphicon-heart-empty:before { + content: "\e143"} +.glyphicon-link:before { + content: "\e144"} +.glyphicon-phone:before { + content: "\e145"} +.glyphicon-pushpin:before { + content: "\e146"} +.glyphicon-usd:before { + content: "\e148"} +.glyphicon-gbp:before { + content: "\e149"} +.glyphicon-sort:before { + content: "\e150"} +.glyphicon-sort-by-alphabet:before { + content: "\e151"} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"} +.glyphicon-sort-by-order:before { + content: "\e153"} +.glyphicon-sort-by-order-alt:before { + content: "\e154"} +.glyphicon-sort-by-attributes:before { + content: "\e155"} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"} +.glyphicon-unchecked:before { + content: "\e157"} +.glyphicon-expand:before { + content: "\e158"} +.glyphicon-collapse-down:before { + content: "\e159"} +.glyphicon-collapse-up:before { + content: "\e160"} +.glyphicon-log-in:before { + content: "\e161"} +.glyphicon-flash:before { + content: "\e162"} +.glyphicon-log-out:before { + content: "\e163"} +.glyphicon-new-window:before { + content: "\e164"} +.glyphicon-record:before { + content: "\e165"} +.glyphicon-save:before { + content: "\e166"} +.glyphicon-open:before { + content: "\e167"} +.glyphicon-saved:before { + content: "\e168"} +.glyphicon-import:before { + content: "\e169"} +.glyphicon-export:before { + content: "\e170"} +.glyphicon-send:before { + content: "\e171"} +.glyphicon-floppy-disk:before { + content: "\e172"} +.glyphicon-floppy-saved:before { + content: "\e173"} +.glyphicon-floppy-remove:before { + content: "\e174"} +.glyphicon-floppy-save:before { + content: "\e175"} +.glyphicon-floppy-open:before { + content: "\e176"} +.glyphicon-credit-card:before { + content: "\e177"} +.glyphicon-transfer:before { + content: "\e178"} +.glyphicon-cutlery:before { + content: "\e179"} +.glyphicon-header:before { + content: "\e180"} +.glyphicon-compressed:before { + content: "\e181"} +.glyphicon-earphone:before { + content: "\e182"} +.glyphicon-phone-alt:before { + content: "\e183"} +.glyphicon-tower:before { + content: "\e184"} +.glyphicon-stats:before { + content: "\e185"} +.glyphicon-sd-video:before { + content: "\e186"} +.glyphicon-hd-video:before { + content: "\e187"} +.glyphicon-subtitles:before { + content: "\e188"} +.glyphicon-sound-stereo:before { + content: "\e189"} +.glyphicon-sound-dolby:before { + content: "\e190"} +.glyphicon-sound-5-1:before { + content: "\e191"} +.glyphicon-sound-6-1:before { + content: "\e192"} +.glyphicon-sound-7-1:before { + content: "\e193"} +.glyphicon-copyright-mark:before { + content: "\e194"} +.glyphicon-registration-mark:before { + content: "\e195"} +.glyphicon-cloud-download:before { + content: "\e197"} +.glyphicon-cloud-upload:before { + content: "\e198"} +.glyphicon-tree-conifer:before { + content: "\e199"} +.glyphicon-tree-deciduous:before { + content: "\e200"} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 15px; + list-style: none; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.2); +} +.dropdown-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #555; + white-space: nowrap; +} +.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus { + color: #262626; + text-decoration: none; + background-color: #eee; +} +.dropdown-menu>.active>a, .dropdown-menu>.active>a:hover, .dropdown-menu>.active>a:focus { + color: #fff; + text-decoration: none; + background-color: #008cba; + outline: 0; +} +.dropdown-menu>.disabled>a, .dropdown-menu>.disabled>a:hover, .dropdown-menu>.disabled>a:focus { + color: #999; +} +.dropdown-menu>.disabled>a:hover, .dropdown-menu>.disabled>a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} +.open>.dropdown-menu { + display: block; +} +.open>a { + outline: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right>.dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""} +.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +@media(min-width:768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; +} +}.btn-group, .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group>.btn, .btn-group-vertical>.btn { + position: relative; + float: left; +} +.btn-group>.btn:hover, .btn-group-vertical>.btn:hover, .btn-group>.btn:focus, .btn-group-vertical>.btn:focus, .btn-group>.btn:active, .btn-group-vertical>.btn:active, .btn-group>.btn.active, .btn-group-vertical>.btn.active { + z-index: 2; +} +.btn-group>.btn:focus, .btn-group-vertical>.btn:focus { + outline: 0; +} +.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { + margin-left: -1px; +} +.btn-toolbar:before, .btn-toolbar:after { + display: table; + content: " "} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, .btn-toolbar:after { + display: table; + content: " "} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, .btn-toolbar:after { + display: table; + content: " "} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, .btn-toolbar:after { + display: table; + content: " "} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar:before, .btn-toolbar:after { + display: table; + content: " "} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn-group { + float: left; +} +.btn-toolbar>.btn+.btn, .btn-toolbar>.btn-group+.btn, .btn-toolbar>.btn+.btn-group, .btn-toolbar>.btn-group+.btn-group { + margin-left: 5px; +} +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group>.btn:first-child { + margin-left: 0; +} +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group>.btn:last-child:not(:first-child), .btn-group>.dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group>.btn-group { + float: left; +} +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0; +} +.btn-group>.btn-group:first-child>.btn:last-child, .btn-group>.btn-group:first-child>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group>.btn-group:last-child>.btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group-xs>.btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-group-sm>.btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-group-lg>.btn { + padding: 10px 16px; + font-size: 19px; + line-height: 1.33; + border-radius: 0; +} +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical>.btn, .btn-group-vertical>.btn-group, .btn-group-vertical>.btn-group>.btn { + display: block; + float: none; + width: 100%; + max-width: 100%} +.btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after { + display: table; + content: " "} +.btn-group-vertical>.btn-group:after { + clear: both; +} +.btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after { + display: table; + content: " "} +.btn-group-vertical>.btn-group:after { + clear: both; +} +.btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after { + display: table; + content: " "} +.btn-group-vertical>.btn-group:after { + clear: both; +} +.btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after { + display: table; + content: " "} +.btn-group-vertical>.btn-group:after { + clear: both; +} +.btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after { + display: table; + content: " "} +.btn-group-vertical>.btn-group:after { + clear: both; +} +.btn-group-vertical>.btn-group>.btn { + float: none; +} +.btn-group-vertical>.btn+.btn, .btn-group-vertical>.btn+.btn-group, .btn-group-vertical>.btn-group+.btn, .btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical>.btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0; +} +.btn-group-vertical>.btn-group:first-child>.btn:last-child, .btn-group-vertical>.btn-group:first-child>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical>.btn-group:last-child>.btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed; +} +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + display: table-cell; + float: none; + width: 1%} +.btn-group-justified>.btn-group .btn { + width: 100%} +[data-toggle="buttons"]>.btn>input[type="radio"], [data-toggle="buttons"]>.btn>input[type="checkbox"] { + display: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} +.input-group-lg>.form-control, .input-group-lg>.input-group-addon, .input-group-lg>.input-group-btn>.btn { + height: 48px; + padding: 10px 16px; + font-size: 19px; + line-height: 1.33; + border-radius: 0; +} +select.input-group-lg>.form-control, select.input-group-lg>.input-group-addon, select.input-group-lg>.input-group-btn>.btn { + height: 48px; + line-height: 48px; +} +textarea.input-group-lg>.form-control, textarea.input-group-lg>.input-group-addon, textarea.input-group-lg>.input-group-btn>.btn { + height: auto; +} +.input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-group-sm>.form-control, select.input-group-sm>.input-group-addon, select.input-group-sm>.input-group-btn>.btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm>.form-control, textarea.input-group-sm>.input-group-addon, textarea.input-group-sm>.input-group-btn>.btn { + height: auto; +} +.input-group-addon, .input-group-btn, .input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, .input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 0; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 0; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 19px; + border-radius: 0; +} +.input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child>.btn, .input-group-btn:last-child>.dropdown-toggle, .input-group-btn:first-child>.btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + white-space: nowrap; +} +.input-group-btn:first-child>.btn { + margin-right: -1px; +} +.input-group-btn:last-child>.btn { + margin-left: -1px; +} +.input-group-btn>.btn { + position: relative; +} +.input-group-btn>.btn+.btn { + margin-left: -4px; +} +.input-group-btn>.btn:hover, .input-group-btn>.btn:active { + z-index: 2; +} +.nav { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav:before, .nav:after { + display: table; + content: " "} +.nav:after { + clear: both; +} +.nav:before, .nav:after { + display: table; + content: " "} +.nav:after { + clear: both; +} +.nav:before, .nav:after { + display: table; + content: " "} +.nav:after { + clear: both; +} +.nav:before, .nav:after { + display: table; + content: " "} +.nav:after { + clear: both; +} +.nav:before, .nav:after { + display: table; + content: " "} +.nav:after { + clear: both; +} +.nav>li { + position: relative; + display: block; +} +.nav>li>a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav>li>a:hover, .nav>li>a:focus { + text-decoration: none; + background-color: #eee; +} +.nav>li.disabled>a { + color: #999; +} +.nav>li.disabled>a:hover, .nav>li.disabled>a:focus { + color: #999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open>a, .nav .open>a:hover, .nav .open>a:focus { + background-color: #eee; + border-color: #008cba; +} +.nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav>li>a>img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs>li { + float: left; + margin-bottom: -1px; +} +.nav-tabs>li>a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 0; +} +.nav-tabs>li>a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus { + color: #6f6f6f; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified>li { + float: none; +} +.nav-tabs.nav-justified>li>a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media(min-width:768px) { + .nav-tabs.nav-justified>li { + display: table-cell; + width: 1%} +.nav-tabs.nav-justified>li>a { + margin-bottom: 0; +} +}.nav-tabs.nav-justified>li>a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs.nav-justified>.active>a, .nav-tabs.nav-justified>.active>a:hover, .nav-tabs.nav-justified>.active>a:focus { + border: 1px solid #ddd; +} +@media(min-width:768px) { + .nav-tabs.nav-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 0; +} +.nav-tabs.nav-justified>.active>a, .nav-tabs.nav-justified>.active>a:hover, .nav-tabs.nav-justified>.active>a:focus { + border-bottom-color: #fff; +} +}.nav-pills>li { + float: left; +} +.nav-pills>li>a { + border-radius: 0; +} +.nav-pills>li+li { + margin-left: 2px; +} +.nav-pills>li.active>a, .nav-pills>li.active>a:hover, .nav-pills>li.active>a:focus { + color: #fff; + background-color: #008cba; +} +.nav-stacked>li { + float: none; +} +.nav-stacked>li+li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%} +.nav-justified>li { + float: none; +} +.nav-justified>li>a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media(min-width:768px) { + .nav-justified>li { + display: table-cell; + width: 1%} +.nav-justified>li>a { + margin-bottom: 0; +} +}.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified>li>a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs-justified>.active>a, .nav-tabs-justified>.active>a:hover, .nav-tabs-justified>.active>a:focus { + border: 1px solid #ddd; +} +@media(min-width:768px) { + .nav-tabs-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 0; +} +.nav-tabs-justified>.active>a, .nav-tabs-justified>.active>a:hover, .nav-tabs-justified>.active>a:focus { + border-bottom-color: #fff; +} +}.tab-content>.tab-pane { + display: none; +} +.tab-content>.active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} +.navbar:before, .navbar:after { + display: table; + content: " "} +.navbar:after { + clear: both; +} +.navbar:before, .navbar:after { + display: table; + content: " "} +.navbar:after { + clear: both; +} +.navbar:before, .navbar:after { + display: table; + content: " "} +.navbar:after { + clear: both; +} +.navbar:before, .navbar:after { + display: table; + content: " "} +.navbar:after { + clear: both; +} +.navbar:before, .navbar:after { + display: table; + content: " "} +.navbar:after { + clear: both; +} +@media(min-width:768px) { + .navbar { + border-radius: 0; +} +}.navbar-header:before, .navbar-header:after { + display: table; + content: " "} +.navbar-header:after { + clear: both; +} +.navbar-header:before, .navbar-header:after { + display: table; + content: " "} +.navbar-header:after { + clear: both; +} +.navbar-header:before, .navbar-header:after { + display: table; + content: " "} +.navbar-header:after { + clear: both; +} +.navbar-header:before, .navbar-header:after { + display: table; + content: " "} +.navbar-header:after { + clear: both; +} +.navbar-header:before, .navbar-header:after { + display: table; + content: " "} +.navbar-header:after { + clear: both; +} +@media(min-width:768px) { + .navbar-header { + float: left; +} +}.navbar-collapse { + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media(min-width:768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; +} +.navbar-collapse.collapse { + display: block!important; + height: auto!important; + padding-bottom: 0; + overflow: visible!important; +} +.navbar-collapse.in { + overflow-y: visible; +} +.navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; +} +}.container>.navbar-header, .container>.navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media(min-width:768px) { + .container>.navbar-header, .container>.navbar-collapse { + margin-right: 0; + margin-left: 0; +} +}.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media(min-width:768px) { + .navbar-static-top { + border-radius: 0; +} +}.navbar-fixed-top, .navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media(min-width:768px) { + .navbar-fixed-top, .navbar-fixed-bottom { + border-radius: 0; +} +}.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + float: left; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} +@media(min-width:768px) { + .navbar>.container .navbar-brand { + margin-left: -15px; +} +}.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 5.5px; + margin-right: 15px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar+.icon-bar { + margin-top: 4px; +} +@media(min-width:768px) { + .navbar-toggle { + display: none; +} +}.navbar-nav { + margin: 6px -15px; +} +.navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; +} +@media(max-width:767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; +} +.navbar-nav .open .dropdown-menu>li>a, .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; +} +.navbar-nav .open .dropdown-menu>li>a { + line-height: 21px; +} +.navbar-nav .open .dropdown-menu>li>a:hover, .navbar-nav .open .dropdown-menu>li>a:focus { + background-image: none; +} +}@media(min-width:768px) { + .navbar-nav { + float: left; + margin: 0; +} +.navbar-nav>li { + float: left; +} +.navbar-nav>li>a { + padding-top: 12px; + padding-bottom: 12px; +} +.navbar-nav.navbar-right:last-child { + margin-right: -15px; +} +}@media(min-width:768px) { + .navbar-left { + float: left!important; +} +.navbar-right { + float: right!important; +} +}.navbar-form { + padding: 10px 15px; + margin-top: 5px; + margin-right: -15px; + margin-bottom: 5px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} +@media(min-width:768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.navbar-form .form-control { + display: inline-block; +} +.navbar-form select.form-control { + width: auto; +} +.navbar-form .radio, .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} +.navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; +} +}@media(max-width:767px) { + .navbar-form .form-group { + margin-bottom: 5px; +} +}@media(min-width:768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.navbar-form.navbar-right:last-child { + margin-right: -15px; +} +}.navbar-nav>li>.dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-nav.pull-right>li>.dropdown-menu, .navbar-nav>li>.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.navbar-btn { + margin-top: 5px; + margin-bottom: 5px; +} +.navbar-btn.btn-sm { + margin-top: 7.5px; + margin-bottom: 7.5px; +} +.navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; +} +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} +@media(min-width:768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; +} +.navbar-text.navbar-right:last-child { + margin-right: 0; +} +}.navbar-default { + background-color: #333; + border-color: #222; +} +.navbar-default .navbar-brand { + color: #fff; +} +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #fff; +} +.navbar-default .navbar-nav>li>a { + color: #fff; +} +.navbar-default .navbar-nav>li>a:hover, .navbar-default .navbar-nav>li>a:focus { + color: #fff; + background-color: #272727; +} +.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:hover, .navbar-default .navbar-nav>.active>a:focus { + color: #fff; + background-color: #272727; +} +.navbar-default .navbar-nav>.disabled>a, .navbar-default .navbar-nav>.disabled>a:hover, .navbar-default .navbar-nav>.disabled>a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: transparent; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-default .navbar-collapse, .navbar-default .navbar-form { + border-color: #222; +} +.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:hover, .navbar-default .navbar-nav>.open>a:focus { + color: #fff; + background-color: #272727; +} +@media(max-width:767px) { + .navbar-default .navbar-nav .open .dropdown-menu>li>a { + color: #fff; +} +.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover, .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus { + color: #fff; + background-color: #272727; +} +.navbar-default .navbar-nav .open .dropdown-menu>.active>a, .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover, .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus { + color: #fff; + background-color: #272727; +} +.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a, .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover, .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus { + color: #ccc; + background-color: transparent; +} +}.navbar-default .navbar-link { + color: #fff; +} +.navbar-default .navbar-link:hover { + color: #fff; +} +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} +.navbar-inverse .navbar-brand { + color: #fff; +} +.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #fff; +} +.navbar-inverse .navbar-nav>li>a { + color: #fff; +} +.navbar-inverse .navbar-nav>li>a:hover, .navbar-inverse .navbar-nav>li>a:focus { + color: #fff; + background-color: #006687; +} +.navbar-inverse .navbar-nav>.active>a, .navbar-inverse .navbar-nav>.active>a:hover, .navbar-inverse .navbar-nav>.active>a:focus { + color: #fff; + background-color: #006687; +} +.navbar-inverse .navbar-nav>.disabled>a, .navbar-inverse .navbar-nav>.disabled>a:hover, .navbar-inverse .navbar-nav>.disabled>a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: transparent; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #007196; +} +.navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:hover, .navbar-inverse .navbar-nav>.open>a:focus { + color: #fff; + background-color: #006687; +} +@media(max-width:767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header { + border-color: #006687; +} +.navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; +} +.navbar-inverse .navbar-nav .open .dropdown-menu>li>a { + color: #fff; +} +.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus { + color: #fff; + background-color: #006687; +} +.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a, .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus { + color: #fff; + background-color: #006687; +} +.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a, .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus { + color: #444; + background-color: transparent; +} +}.navbar-inverse .navbar-link { + color: #fff; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} +.breadcrumb>li { + display: inline-block; +} +.breadcrumb>li+li:before { + padding: 0 5px; + color: #999; + content: "/\00a0"} +.breadcrumb>.active { + color: #333; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} +.pagination>li { + display: inline; +} +.pagination>li>a, .pagination>li>span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: transparent; + border: 1px solid transparent; +} +.pagination>li:first-child>a, .pagination>li:first-child>span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination>li:last-child>a, .pagination>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.pagination>li>a:hover, .pagination>li>span:hover, .pagination>li>a:focus, .pagination>li>span:focus { + background-color: #eee; +} +.pagination>.active>a, .pagination>.active>span, .pagination>.active>a:hover, .pagination>.active>span:hover, .pagination>.active>a:focus, .pagination>.active>span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #008cba; + border-color: #008cba; +} +.pagination>.disabled>span, .pagination>.disabled>span:hover, .pagination>.disabled>span:focus, .pagination>.disabled>a, .pagination>.disabled>a:hover, .pagination>.disabled>a:focus { + color: #999; + cursor: not-allowed; + background-color: transparent; + border-color: transparent; +} +.pagination-lg>li>a, .pagination-lg>li>span { + padding: 10px 16px; + font-size: 19px; +} +.pagination-lg>li:first-child>a, .pagination-lg>li:first-child>span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-lg>li:last-child>a, .pagination-lg>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.pagination-sm>li>a, .pagination-sm>li>span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm>li:first-child>a, .pagination-sm>li:first-child>span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-sm>li:last-child>a, .pagination-sm>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.pager { + padding-left: 0; + margin: 21px 0; + text-align: center; + list-style: none; +} +.pager:before, .pager:after { + display: table; + content: " "} +.pager:after { + clear: both; +} +.pager:before, .pager:after { + display: table; + content: " "} +.pager:after { + clear: both; +} +.pager:before, .pager:after { + display: table; + content: " "} +.pager:after { + clear: both; +} +.pager:before, .pager:after { + display: table; + content: " "} +.pager:after { + clear: both; +} +.pager:before, .pager:after { + display: table; + content: " "} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li>a, .pager li>span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; +} +.pager li>a:hover, .pager li>a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next>a, .pager .next>span { + float: right; +} +.pager .previous>a, .pager .previous>span { + float: left; +} +.pager .disabled>a, .pager .disabled>a:hover, .pager .disabled>a:focus, .pager .disabled>span { + color: #999; + cursor: not-allowed; + background-color: transparent; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label[href]:hover, .label[href]:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #999; +} +.label-default[href]:hover, .label-default[href]:focus { + background-color: #808080; +} +.label-primary { + background-color: #008cba; +} +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: #006687; +} +.label-success { + background-color: #43ac6a; +} +.label-success[href]:hover, .label-success[href]:focus { + background-color: #358753; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #e99002; +} +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: #b67102; +} +.label-danger { + background-color: #f04124; +} +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: #d32a0e; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #777; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #e7e7e7; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +a.list-group-item.active>.badge, .nav-pills>.active>a>.badge { + color: #008cba; + background-color: #fff; +} +.nav-pills>li>a>.badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 23px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #fafafa; +} +.jumbotron h1, .jumbotron .h1 { + line-height: 1; + color: inherit; +} +.jumbotron p { + line-height: 1.4; +} +.container .jumbotron { + border-radius: 0; +} +.jumbotron .container { + max-width: 100%} +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; +} +.container .jumbotron { + padding-right: 60px; + padding-left: 60px; +} +.jumbotron h1, .jumbotron .h1 { + font-size: 67.5px; +} +}.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 0; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.thumbnail>img, .thumbnail a>img { + display: block; + height: auto; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { + border-color: #008cba; +} +.thumbnail .caption { + padding: 9px; + color: #222; +} +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; + } + + .alert-heading { + color: inherit; + } + + .alert-link { + font-weight: 700; + } + + .alert-dismissible { + padding-right: 4rem; + } + + .alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; + } + + .alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; + } + + .alert-primary hr { + border-top-color: #9fcdff; + } + + .alert-primary .alert-link { + color: #002752; + } + + .alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; + } + + .alert-secondary hr { + border-top-color: #c8cbcf; + } + + .alert-secondary .alert-link { + color: #202326; + } + + .alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; + } + + .alert-success hr { + border-top-color: #b1dfbb; + } + + .alert-success .alert-link { + color: #0b2e13; + } + + .alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; + } + + .alert-info hr { + border-top-color: #abdde5; + } + + .alert-info .alert-link { + color: #062c33; + } + + .alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; + } + + .alert-warning hr { + border-top-color: #ffe8a1; + } + + .alert-warning .alert-link { + color: #533f03; + } + + .alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; + } + + .alert-danger hr { + border-top-color: #f1b0b7; + } + + .alert-danger .alert-link { + color: #491217; + } + + .alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; + } + + .alert-light hr { + border-top-color: #ececf6; + } + + .alert-light .alert-link { + color: #686868; + } + + .alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; + } + + .alert-dark hr { + border-top-color: #b9bbbe; + } + + .alert-dark .alert-link { + color: #040505; + } + + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; +} +to { + background-position: 0 0; +} +}@keyframes progress-bar-stripes { + from { + background-position: 40px 0; +} +to { + background-position: 0 0; +} +}.progress { + height: 21px; + margin-bottom: 21px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #fff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #43ac6a; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #e99002; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #f04124; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media, .media-body { + overflow: hidden; + zoom: 1; +} +.media, .media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media>.pull-left { + margin-right: 10px; +} +.media>.pull-right { + margin-left: 10px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.list-group-item>.badge { + float: right; +} +.list-group-item>.badge+.badge { + margin-right: 5px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} +a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #008cba; + border-color: #008cba; +} +a.list-group-item.active .list-group-item-heading, a.list-group-item.active:hover .list-group-item-heading, a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} +a.list-group-item.active .list-group-item-text, a.list-group-item.active:hover .list-group-item-text, a.list-group-item.active:focus .list-group-item-text { + color: #87e1ff; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 21px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-body:before, .panel-body:after { + display: table; + content: " "} +.panel-body:after { + clear: both; +} +.panel-body:before, .panel-body:after { + display: table; + content: " "} +.panel-body:after { + clear: both; +} +.panel-body:before, .panel-body:after { + display: table; + content: " "} +.panel-body:after { + clear: both; +} +.panel-body:before, .panel-body:after { + display: table; + content: " "} +.panel-body:after { + clear: both; +} +.panel-body:before, .panel-body:after { + display: table; + content: " "} +.panel-body:after { + clear: both; +} +.panel>.list-group { + margin-bottom: 0; +} +.panel>.list-group .list-group-item { + border-width: 1px 0; +} +.panel>.list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel>.list-group .list-group-item:last-child { + border-bottom: 0; +} +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0; +} +.panel>.table, .panel>.table-responsive>.table { + margin-bottom: 0; +} +.panel>.panel-body+.table, .panel>.panel-body+.table-responsive { + border-top: 1px solid #ddd; +} +.panel>.table>tbody:first-child th, .panel>.table>tbody:first-child td { + border-top: 0; +} +.panel>.table-bordered, .panel>.table-responsive>.table-bordered { + border: 0; +} +.panel>.table-bordered>thead>tr>th:first-child, .panel>.table-responsive>.table-bordered>thead>tr>th:first-child, .panel>.table-bordered>tbody>tr>th:first-child, .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child, .panel>.table-bordered>tfoot>tr>th:first-child, .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child, .panel>.table-bordered>thead>tr>td:first-child, .panel>.table-responsive>.table-bordered>thead>tr>td:first-child, .panel>.table-bordered>tbody>tr>td:first-child, .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child, .panel>.table-bordered>tfoot>tr>td:first-child, .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child { + border-left: 0; +} +.panel>.table-bordered>thead>tr>th:last-child, .panel>.table-responsive>.table-bordered>thead>tr>th:last-child, .panel>.table-bordered>tbody>tr>th:last-child, .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child, .panel>.table-bordered>tfoot>tr>th:last-child, .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child, .panel>.table-bordered>thead>tr>td:last-child, .panel>.table-responsive>.table-bordered>thead>tr>td:last-child, .panel>.table-bordered>tbody>tr>td:last-child, .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child, .panel>.table-bordered>tfoot>tr>td:last-child, .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child { + border-right: 0; +} +.panel>.table-bordered>thead>tr:last-child>th, .panel>.table-responsive>.table-bordered>thead>tr:last-child>th, .panel>.table-bordered>tbody>tr:last-child>th, .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th, .panel>.table-bordered>tfoot>tr:last-child>th, .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th, .panel>.table-bordered>thead>tr:last-child>td, .panel>.table-responsive>.table-bordered>thead>tr:last-child>td, .panel>.table-bordered>tbody>tr:last-child>td, .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td, .panel>.table-bordered>tfoot>tr:last-child>td, .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td { + border-bottom: 0; +} +.panel>.table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel-heading>.dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + color: inherit; +} +.panel-title>a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 0; +} +.panel-group .panel+.panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading+.panel-collapse .panel-body { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default>.panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default>.panel-heading+.panel-collapse .panel-body { + border-top-color: #ddd; +} +.panel-default>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #008cba; +} +.panel-primary>.panel-heading { + color: #fff; + background-color: #008cba; + border-color: #008cba; +} +.panel-primary>.panel-heading+.panel-collapse .panel-body { + border-top-color: #008cba; +} +.panel-primary>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #008cba; +} +.panel-success { + border-color: #3c9a5f; +} +.panel-success>.panel-heading { + color: #43ac6a; + background-color: #dff0d8; + border-color: #3c9a5f; +} +.panel-success>.panel-heading+.panel-collapse .panel-body { + border-top-color: #3c9a5f; +} +.panel-success>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #3c9a5f; +} +.panel-warning { + border-color: #d08002; +} +.panel-warning>.panel-heading { + color: #e99002; + background-color: #fcf8e3; + border-color: #d08002; +} +.panel-warning>.panel-heading+.panel-collapse .panel-body { + border-top-color: #d08002; +} +.panel-warning>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #d08002; +} +.panel-danger { + border-color: #ea2f10; +} +.panel-danger>.panel-heading { + color: #f04124; + background-color: #f2dede; + border-color: #ea2f10; +} +.panel-danger>.panel-heading+.panel-collapse .panel-body { + border-top-color: #ea2f10; +} +.panel-danger>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #ea2f10; +} +.panel-info { + border-color: #3db5d8; +} +.panel-info>.panel-heading { + color: #5bc0de; + background-color: #d9edf7; + border-color: #3db5d8; +} +.panel-info>.panel-heading+.panel-collapse .panel-body { + border-top-color: #3db5d8; +} +.panel-info>.panel-footer+.panel-collapse .panel-body { + border-bottom-color: #3db5d8; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 0; +} +.well-sm { + padding: 9px; + border-radius: 0; +} +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .2; + filter: alpha(opacity=20); +} +.close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: .5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform .3s ease-out; + -moz-transition: -moz-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-dialog { + position: relative; + z-index: 1050; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: .5; + filter: alpha(opacity=50); +} +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.428571429; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: " "} +.modal-footer:after { + clear: both; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: " "} +.modal-footer:after { + clear: both; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: " "} +.modal-footer:after { + clear: both; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: " "} +.modal-footer:after { + clear: both; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: " "} +.modal-footer:after { + clear: both; +} +.modal-footer .btn+.btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn+.btn { + margin-left: -1px; +} +.modal-footer .btn-block+.btn-block { + margin-left: 0; +} +@media screen and (min-width:768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; +} +.modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); +} +}.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} +.tooltip.in { + opacity: .9; + filter: alpha(opacity=90); +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #333; + border-radius: 0; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #333; + border-width: 5px 5px 0; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #333; + border-width: 5px 5px 0; +} +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #333; + border-width: 5px 5px 0; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #333; + border-width: 5px 5px 5px 0; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #333; + border-width: 5px 0 5px 5px; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #333; + border-width: 0 5px 5px; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #333; + border-width: 0 5px 5px; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #333; + border-width: 0 5px 5px; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #333; + border: 1px solid #333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 15px; + font-weight: normal; + line-height: 18px; + background-color: #333; + border-bottom: 1px solid #262626; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, .popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""} +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #333; + border-bottom-width: 0; + content: " "} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #333; + border-left-width: 0; + content: " "} +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #333; + border-top-width: 0; + content: " "} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #333; + border-right-width: 0; + content: " "} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner>.item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner>.item>img, .carousel-inner>.item>a>img { + display: block; + height: auto; + max-width: 100%; + line-height: 1; +} +.carousel-inner>.active, .carousel-inner>.next, .carousel-inner>.prev { + display: block; +} +.carousel-inner>.active { + left: 0; +} +.carousel-inner>.next, .carousel-inner>.prev { + position: absolute; + top: 0; + width: 100%} +.carousel-inner>.next { + left: 100%} +.carousel-inner>.prev { + left: -100%} +.carousel-inner>.next.left, .carousel-inner>.prev.right { + left: 0; +} +.carousel-inner>.active.left { + left: -100%} +.carousel-inner>.active.right { + left: 100%} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: .5; + filter: alpha(opacity=50); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, .carousel-control:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { + left: 50%} +.carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { + right: 50%} +.carousel-control .icon-prev, .carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'} +.carousel-control .icon-next:before { + content: '\203a'} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width:768px) { + .carousel-control .glyphicons-chevron-left, .carousel-control .glyphicons-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; +} +.carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; +} +.carousel-indicators { + bottom: 20px; +} +}.clearfix:before, .clearfix:after { + display: table; + content: " "} +.clearfix:after { + clear: both; +} +.clearfix:before, .clearfix:after { + display: table; + content: " "} +.clearfix:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right!important; +} +.pull-left { + float: left!important; +} +.hide { + display: none!important; +} +.show { + display: block!important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none!important; + visibility: hidden!important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, tr.visible-xs, th.visible-xs, td.visible-xs { + display: none!important; +} +@media(max-width:767px) { + .visible-xs { + display: block!important; +} +table.visible-xs { + display: table; +} +tr.visible-xs { + display: table-row!important; +} +th.visible-xs, td.visible-xs { + display: table-cell!important; +} +}@media(min-width:768px) and (max-width:991px) { + .visible-xs.visible-sm { + display: block!important; +} +table.visible-xs.visible-sm { + display: table; +} +tr.visible-xs.visible-sm { + display: table-row!important; +} +th.visible-xs.visible-sm, td.visible-xs.visible-sm { + display: table-cell!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .visible-xs.visible-md { + display: block!important; +} +table.visible-xs.visible-md { + display: table; +} +tr.visible-xs.visible-md { + display: table-row!important; +} +th.visible-xs.visible-md, td.visible-xs.visible-md { + display: table-cell!important; +} +}@media(min-width:1200px) { + .visible-xs.visible-lg { + display: block!important; +} +table.visible-xs.visible-lg { + display: table; +} +tr.visible-xs.visible-lg { + display: table-row!important; +} +th.visible-xs.visible-lg, td.visible-xs.visible-lg { + display: table-cell!important; +} +}.visible-sm, tr.visible-sm, th.visible-sm, td.visible-sm { + display: none!important; +} +@media(max-width:767px) { + .visible-sm.visible-xs { + display: block!important; +} +table.visible-sm.visible-xs { + display: table; +} +tr.visible-sm.visible-xs { + display: table-row!important; +} +th.visible-sm.visible-xs, td.visible-sm.visible-xs { + display: table-cell!important; +} +}@media(min-width:768px) and (max-width:991px) { + .visible-sm { + display: block!important; +} +table.visible-sm { + display: table; +} +tr.visible-sm { + display: table-row!important; +} +th.visible-sm, td.visible-sm { + display: table-cell!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .visible-sm.visible-md { + display: block!important; +} +table.visible-sm.visible-md { + display: table; +} +tr.visible-sm.visible-md { + display: table-row!important; +} +th.visible-sm.visible-md, td.visible-sm.visible-md { + display: table-cell!important; +} +}@media(min-width:1200px) { + .visible-sm.visible-lg { + display: block!important; +} +table.visible-sm.visible-lg { + display: table; +} +tr.visible-sm.visible-lg { + display: table-row!important; +} +th.visible-sm.visible-lg, td.visible-sm.visible-lg { + display: table-cell!important; +} +}.visible-md, tr.visible-md, th.visible-md, td.visible-md { + display: none!important; +} +@media(max-width:767px) { + .visible-md.visible-xs { + display: block!important; +} +table.visible-md.visible-xs { + display: table; +} +tr.visible-md.visible-xs { + display: table-row!important; +} +th.visible-md.visible-xs, td.visible-md.visible-xs { + display: table-cell!important; +} +}@media(min-width:768px) and (max-width:991px) { + .visible-md.visible-sm { + display: block!important; +} +table.visible-md.visible-sm { + display: table; +} +tr.visible-md.visible-sm { + display: table-row!important; +} +th.visible-md.visible-sm, td.visible-md.visible-sm { + display: table-cell!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .visible-md { + display: block!important; +} +table.visible-md { + display: table; +} +tr.visible-md { + display: table-row!important; +} +th.visible-md, td.visible-md { + display: table-cell!important; +} +}@media(min-width:1200px) { + .visible-md.visible-lg { + display: block!important; +} +table.visible-md.visible-lg { + display: table; +} +tr.visible-md.visible-lg { + display: table-row!important; +} +th.visible-md.visible-lg, td.visible-md.visible-lg { + display: table-cell!important; +} +}.visible-lg, tr.visible-lg, th.visible-lg, td.visible-lg { + display: none!important; +} +@media(max-width:767px) { + .visible-lg.visible-xs { + display: block!important; +} +table.visible-lg.visible-xs { + display: table; +} +tr.visible-lg.visible-xs { + display: table-row!important; +} +th.visible-lg.visible-xs, td.visible-lg.visible-xs { + display: table-cell!important; +} +}@media(min-width:768px) and (max-width:991px) { + .visible-lg.visible-sm { + display: block!important; +} +table.visible-lg.visible-sm { + display: table; +} +tr.visible-lg.visible-sm { + display: table-row!important; +} +th.visible-lg.visible-sm, td.visible-lg.visible-sm { + display: table-cell!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .visible-lg.visible-md { + display: block!important; +} +table.visible-lg.visible-md { + display: table; +} +tr.visible-lg.visible-md { + display: table-row!important; +} +th.visible-lg.visible-md, td.visible-lg.visible-md { + display: table-cell!important; +} +}@media(min-width:1200px) { + .visible-lg { + display: block!important; +} +table.visible-lg { + display: table; +} +tr.visible-lg { + display: table-row!important; +} +th.visible-lg, td.visible-lg { + display: table-cell!important; +} +}.hidden-xs { + display: block!important; +} +table.hidden-xs { + display: table; +} +tr.hidden-xs { + display: table-row!important; +} +th.hidden-xs, td.hidden-xs { + display: table-cell!important; +} +@media(max-width:767px) { + .hidden-xs, tr.hidden-xs, th.hidden-xs, td.hidden-xs { + display: none!important; +} +}@media(min-width:768px) and (max-width:991px) { + .hidden-xs.hidden-sm, tr.hidden-xs.hidden-sm, th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { + display: none!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .hidden-xs.hidden-md, tr.hidden-xs.hidden-md, th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { + display: none!important; +} +}@media(min-width:1200px) { + .hidden-xs.hidden-lg, tr.hidden-xs.hidden-lg, th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { + display: none!important; +} +}.hidden-sm { + display: block!important; +} +table.hidden-sm { + display: table; +} +tr.hidden-sm { + display: table-row!important; +} +th.hidden-sm, td.hidden-sm { + display: table-cell!important; +} +@media(max-width:767px) { + .hidden-sm.hidden-xs, tr.hidden-sm.hidden-xs, th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { + display: none!important; +} +}@media(min-width:768px) and (max-width:991px) { + .hidden-sm, tr.hidden-sm, th.hidden-sm, td.hidden-sm { + display: none!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .hidden-sm.hidden-md, tr.hidden-sm.hidden-md, th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { + display: none!important; +} +}@media(min-width:1200px) { + .hidden-sm.hidden-lg, tr.hidden-sm.hidden-lg, th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { + display: none!important; +} +}.hidden-md { + display: block!important; +} +table.hidden-md { + display: table; +} +tr.hidden-md { + display: table-row!important; +} +th.hidden-md, td.hidden-md { + display: table-cell!important; +} +@media(max-width:767px) { + .hidden-md.hidden-xs, tr.hidden-md.hidden-xs, th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { + display: none!important; +} +}@media(min-width:768px) and (max-width:991px) { + .hidden-md.hidden-sm, tr.hidden-md.hidden-sm, th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { + display: none!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .hidden-md, tr.hidden-md, th.hidden-md, td.hidden-md { + display: none!important; +} +}@media(min-width:1200px) { + .hidden-md.hidden-lg, tr.hidden-md.hidden-lg, th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { + display: none!important; +} +}.hidden-lg { + display: block!important; +} +table.hidden-lg { + display: table; +} +tr.hidden-lg { + display: table-row!important; +} +th.hidden-lg, td.hidden-lg { + display: table-cell!important; +} +@media(max-width:767px) { + .hidden-lg.hidden-xs, tr.hidden-lg.hidden-xs, th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { + display: none!important; +} +}@media(min-width:768px) and (max-width:991px) { + .hidden-lg.hidden-sm, tr.hidden-lg.hidden-sm, th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { + display: none!important; +} +}@media(min-width:992px) and (max-width:1199px) { + .hidden-lg.hidden-md, tr.hidden-lg.hidden-md, th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { + display: none!important; +} +}@media(min-width:1200px) { + .hidden-lg, tr.hidden-lg, th.hidden-lg, td.hidden-lg { + display: none!important; +} +}.visible-print, tr.visible-print, th.visible-print, td.visible-print { + display: none!important; +} +@media print { + .visible-print { + display: block!important; +} +table.visible-print { + display: table; +} +tr.visible-print { + display: table-row!important; +} +th.visible-print, td.visible-print { + display: table-cell!important; +} +.hidden-print, tr.hidden-print, th.hidden-print, td.hidden-print { + display: none!important; +} +}.navbar { + font-size: 13px; + font-weight: 300; + border: 0; +} +.navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; +} +.navbar-collapse { + border-top-color: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: none; + box-shadow: none; +} +.navbar .dropdown-menu { + border: 0; +} +.navbar .dropdown-menu>li>a, .navbar .dropdown-menu>li>a:focus { + font-size: 13px; + font-weight: 300; + background-color: transparent; +} +.navbar .dropdown-header { + color: rgba(255, 255, 255, 0.5); +} +.navbar-default .dropdown-menu { + background-color: #333; +} +.navbar-default .dropdown-menu>li>a, .navbar-default .dropdown-menu>li>a:focus { + color: #fff; +} +.navbar-default .dropdown-menu>li>a:hover, .navbar-default .dropdown-menu>.active>a, .navbar-default .dropdown-menu>.active>a:hover { + background-color: #272727; +} +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} +.navbar-inverse .dropdown-menu>li>a, .navbar-inverse .dropdown-menu>li>a:focus { + color: #fff; +} +.navbar-inverse .dropdown-menu>li>a:hover, .navbar-inverse .dropdown-menu>.active>a, .navbar-inverse .dropdown-menu>.active>a:hover { + background-color: #006687; +} +.btn { + padding: 14px 28px; +} +.btn-lg { + padding: 16px 32px; +} +.btn-sm { + padding: 8px 16px; +} +.btn-xs { + padding: 4px 8px; +} +.btn-group .btn~.dropdown-toggle { + padding-right: 16px; + padding-left: 16px; +} +.btn-group .dropdown-menu { + border-top-width: 0; +} +.btn-group.dropup .dropdown-menu { + margin-bottom: 0; + border-top-width: 1px; + border-bottom-width: 0; +} +.btn-group .dropdown-toggle.btn-default~.dropdown-menu { + background-color: #e7e7e7; + border-color: #dadada; +} +.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a { + color: #333; +} +.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a:hover { + background-color: #d3d3d3; +} +.btn-group .dropdown-toggle.btn-primary~.dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} +.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a { + color: #fff; +} +.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a:hover { + background-color: #006d91; +} +.btn-group .dropdown-toggle.btn-success~.dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a { + color: #fff; +} +.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a:hover { + background-color: #388f58; +} +.btn-group .dropdown-toggle.btn-info~.dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a { + color: #fff; +} +.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a:hover { + background-color: #39b3d7; +} +.btn-group .dropdown-toggle.btn-warning~.dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} +.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a { + color: #fff; +} +.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a:hover { + background-color: #c17702; +} +.btn-group .dropdown-toggle.btn-danger~.dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a { + color: #fff; +} +.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a:hover { + background-color: #dc2c0f; +} +.lead { + color: #6f6f6f; +} +cite { + font-style: italic; +} +blockquote { + color: #6f6f6f; + border-left-width: 1px; +} +blockquote.pull-right { + border-right-width: 1px; +} +blockquote small { + font-size: 12px; + font-weight: 300; +} +table { + font-size: 12px; +} +input, .form-control { + padding: 7px; + font-size: 12px; +} +label, .control-label, .help-block, .checkbox, .radio { + font-size: 12px; + font-weight: normal; +} +.form-group .btn, .input-group-addon, .input-group-btn .btn { + padding: 8px 14px; + font-size: 12px; +} +.nav .open>a, .nav .open>a:hover, .nav .open>a:focus { + border-color: transparent; +} +.nav-tabs>li>a { + color: #222; + background-color: #e7e7e7; +} +.nav-tabs .caret { + border-top-color: #222; + border-bottom-color: #222; +} +.nav-pills { + font-weight: 300; +} +.breadcrumb { + font-size: 10px; + font-weight: 300; + text-transform: uppercase; + border: 1px solid #ddd; + border-radius: 3px; +} +.pagination { + font-size: 12px; + font-weight: 300; + color: #999; +} +.pagination>li>a, .pagination>li>span { + margin-left: 4px; + color: #999; +} +.pagination>.active>a, .pagination>.active>span { + color: #fff; +} +.pagination>li>a, .pagination>li:first-child>a, .pagination>li:last-child>a, .pagination>li>span, .pagination>li:first-child>span, .pagination>li:last-child>span { + border-radius: 3px; +} +.pagination-lg>li>a { + padding-right: 22px; + padding-left: 22px; +} +.pagination-sm>li>a { + padding: 0 5px; +} +.pager { + font-size: 12px; + font-weight: 300; + color: #999; +} +.list-group { + font-size: 12px; + font-weight: 300; +} +.label { + padding-right: 1em; + padding-left: 1em; + font-weight: 300; + border-radius: 0; +} +.label-default { + color: #333; + background-color: #e7e7e7; +} +.badge { + font-weight: 300; +} +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} +.dropdown-menu>li>a { + padding: 12px 15px; +} +.dropdown-header { + padding-right: 15px; + padding-left: 15px; + font-size: 9px; + text-transform: uppercase; +} +.popover { + font-size: 12px; + font-weight: 300; + color: #fff; +} +.panel-heading, .panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.clearfix:before, .clearfix:after { + display: table; + content: " "} +.clearfix:after { + clear: both; +} +.clearfix:before, .clearfix:after { + display: table; + content: " "} +.clearfix:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right!important; +} +.pull-left { + float: left!important; +} +.hide { + display: none!important; +} +.show { + display: block!important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none!important; + visibility: hidden!important; +} +.affix { + position: fixed; +} diff --git a/css/bootstrap-custom.min.css b/css/bootstrap-custom.min.css new file mode 100644 index 00000000..25d43d46 --- /dev/null +++ b/css/bootstrap-custom.min.css @@ -0,0 +1 @@ +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:Hack,monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000 !important;text-shadow:none !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:Merriweather,Georgia,serif;font-size:14px;line-height:1.428571429;color:#222;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#008cba;text-decoration:none}a:hover,a:focus{color:#00526e;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:0}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #ddd}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:21px;margin-bottom:10.5px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#008cba}.text-primary:hover{color:#006687}.text-warning{color:#e99002}.text-warning:hover{color:#b67102}.text-danger{color:#f04124}.text-danger:hover{color:#d32a0e}.text-success{color:#43ac6a}.text-success:hover{color:#358753}.text-info{color:#5bc0de}.text-info:hover{color:#31b0d5}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #ddd}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;border-left:5px solid #ddd}blockquote p{font-size:18.75px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#6f6f6f}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #ddd;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:21px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Hack,Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:0}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:15px;line-height:1.428571429;color:#6f6f6f;vertical-align:middle}.form-control{display:block;width:100%;height:35px;padding:6px 12px;font-size:15px;line-height:1.428571429;color:#6f6f6f;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:21px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:48px;padding:10px 16px;font-size:19px;line-height:1.33;border-radius:0}select.input-lg{height:48px;line-height:48px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#e99002}.has-warning .form-control{border-color:#e99002;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#b67102;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53}.has-warning .input-group-addon{color:#e99002;background-color:#fcf8e3;border-color:#e99002}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#f04124}.has-error .form-control{border-color:#f04124;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d32a0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483}.has-error .input-group-addon{color:#f04124;background-color:#f2dede;border-color:#f04124}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#43ac6a}.has-success .form-control{border-color:#43ac6a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#358753;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1}.has-success .input-group-addon{color:#43ac6a;background-color:#dff0d8;border-color:#43ac6a}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#626262}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:28px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:15px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#e7e7e7;border-color:#dadada}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#d3d3d3;border-color:#bbb}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e7e7e7;border-color:#dadada}.btn-default .badge{color:#e7e7e7;background-color:#fff}.btn-primary{color:#fff;background-color:#008cba;border-color:#0079a1}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#006d91;border-color:#004b63}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#008cba;border-color:#0079a1}.btn-primary .badge{color:#008cba;background-color:#fff}.btn-warning{color:#fff;background-color:#e99002;border-color:#d08002}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#c17702;border-color:#935b01}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#e99002;border-color:#d08002}.btn-warning .badge{color:#e99002;background-color:#fff}.btn-danger{color:#fff;background-color:#f04124;border-color:#ea2f10}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#dc2c0f;border-color:#b1240c}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#f04124;border-color:#ea2f10}.btn-danger .badge{color:#f04124;background-color:#fff}.btn-success{color:#fff;background-color:#43ac6a;border-color:#3c9a5f}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#388f58;border-color:#2b6e44}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#43ac6a;border-color:#3c9a5f}.btn-success .badge{color:#43ac6a;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#008cba;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#00526e;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:19px;line-height:1.33;border-radius:0}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:15px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:rgba(0,0,0,0.2)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#555;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#eee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#008cba;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-group-lg>.btn{padding:10px 16px;font-size:19px;line-height:1.33;border-radius:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:48px;padding:10px 16px;font-size:19px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:48px;line-height:48px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:15px;font-weight:normal;line-height:1;color:#6f6f6f;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:10px 16px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#008cba}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#6f6f6f;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#008cba}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:45px;margin-bottom:21px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:0}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;float:left;padding:12px 15px;font-size:19px;line-height:21px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:5.5px;margin-right:15px;margin-bottom:5.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:6px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12px;padding-bottom:12px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{padding:10px 15px;margin-top:5px;margin-right:-15px;margin-bottom:5px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:5px;margin-bottom:5px}.navbar-btn.btn-sm{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-xs{margin-top:11.5px;margin-bottom:11.5px}.navbar-text{margin-top:12px;margin-bottom:12px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#333;border-color:#222}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-default .navbar-text{color:#fff}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#272727}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#272727}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#222}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#272727}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#fff}.navbar-inverse{background-color:#008cba;border-color:#006687}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#006687}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#006687}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#007196}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#006687}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#999;content:"/\00a0"}.breadcrumb>.active{color:#333}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:transparent;border:1px solid transparent}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#008cba;border-color:#008cba}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:transparent;border-color:transparent}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:19px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pager{padding-left:0;margin:21px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:transparent;border:1px solid transparent;border-radius:3px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:transparent}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#008cba}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#006687}.label-success{background-color:#43ac6a}.label-success[href]:hover,.label-success[href]:focus{background-color:#358753}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#e99002}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b67102}.label-danger{background-color:#f04124}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d32a0e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#777;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#e7e7e7;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#008cba;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:23px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:67.5px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#008cba}.thumbnail .caption{padding:9px;color:#222}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:21px;margin-bottom:21px;overflow:hidden;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:21px;color:#fff;text-align:center;background-color:#008cba;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#43ac6a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e99002}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#f04124}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#008cba;border-color:#008cba}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#87e1ff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#fff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#008cba}.panel-primary>.panel-heading{color:#fff;background-color:#008cba;border-color:#008cba}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#008cba}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#008cba}.panel-success{border-color:#3c9a5f}.panel-success>.panel-heading{color:#43ac6a;background-color:#dff0d8;border-color:#3c9a5f}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#3c9a5f}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#3c9a5f}.panel-warning{border-color:#d08002}.panel-warning>.panel-heading{color:#e99002;background-color:#fcf8e3;border-color:#d08002}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#d08002}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d08002}.panel-danger{border-color:#ea2f10}.panel-danger>.panel-heading{color:#f04124;background-color:#f2dede;border-color:#ea2f10}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ea2f10}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ea2f10}.panel-info{border-color:#3db5d8}.panel-info>.panel-heading{color:#5bc0de;background-color:#d9edf7;border-color:#3db5d8}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#3db5d8}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#3db5d8}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #e8e8e8;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:0;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#333;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#333;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#333;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#333;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#333;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#333;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#333;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#333;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#333;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#333;border:1px solid #333;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:15px;font-weight:normal;line-height:18px;background-color:#333;border-bottom:1px solid #262626;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#333;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#333;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#333;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#333;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none !important}@media(max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block !important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row !important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell !important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block !important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row !important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell !important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block !important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row !important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell !important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none !important}@media(max-width:767px){.visible-sm.visible-xs{display:block !important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row !important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell !important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block !important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row !important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell !important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block !important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row !important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell !important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none !important}@media(max-width:767px){.visible-md.visible-xs{display:block !important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row !important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell !important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block !important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row !important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell !important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media(min-width:1200px){.visible-md.visible-lg{display:block !important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row !important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell !important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none !important}@media(max-width:767px){.visible-lg.visible-xs{display:block !important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row !important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell !important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block !important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row !important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell !important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block !important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row !important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell !important}}@media(min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}.hidden-xs{display:block !important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row !important}th.hidden-xs,td.hidden-xs{display:table-cell !important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none !important}}.hidden-sm{display:block !important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row !important}th.hidden-sm,td.hidden-sm{display:table-cell !important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none !important}}.hidden-md{display:block !important}table.hidden-md{display:table}tr.hidden-md{display:table-row !important}th.hidden-md,td.hidden-md{display:table-cell !important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none !important}}.hidden-lg{display:block !important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row !important}th.hidden-lg,td.hidden-lg{display:table-cell !important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none !important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none !important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none !important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none !important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none !important}}.navbar{font-size:13px;font-weight:300;border:0}.navbar .navbar-toggle:hover .icon-bar{background-color:#b3b3b3}.navbar-collapse{border-top-color:rgba(0,0,0,0.2);-webkit-box-shadow:none;box-shadow:none}.navbar .dropdown-menu{border:0}.navbar .dropdown-menu>li>a,.navbar .dropdown-menu>li>a:focus{font-size:13px;font-weight:300;background-color:transparent}.navbar .dropdown-header{color:rgba(255,255,255,0.5)}.navbar-default .dropdown-menu{background-color:#333}.navbar-default .dropdown-menu>li>a,.navbar-default .dropdown-menu>li>a:focus{color:#fff}.navbar-default .dropdown-menu>li>a:hover,.navbar-default .dropdown-menu>.active>a,.navbar-default .dropdown-menu>.active>a:hover{background-color:#272727}.navbar-inverse .dropdown-menu{background-color:#008cba}.navbar-inverse .dropdown-menu>li>a,.navbar-inverse .dropdown-menu>li>a:focus{color:#fff}.navbar-inverse .dropdown-menu>li>a:hover,.navbar-inverse .dropdown-menu>.active>a,.navbar-inverse .dropdown-menu>.active>a:hover{background-color:#006687}.btn{padding:14px 28px}.btn-lg{padding:16px 32px}.btn-sm{padding:8px 16px}.btn-xs{padding:4px 8px}.btn-group .btn~.dropdown-toggle{padding-right:16px;padding-left:16px}.btn-group .dropdown-menu{border-top-width:0}.btn-group.dropup .dropdown-menu{margin-bottom:0;border-top-width:1px;border-bottom-width:0}.btn-group .dropdown-toggle.btn-default~.dropdown-menu{background-color:#e7e7e7;border-color:#dadada}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a{color:#333}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a:hover{background-color:#d3d3d3}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu{background-color:#008cba;border-color:#0079a1}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a{color:#fff}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a:hover{background-color:#006d91}.btn-group .dropdown-toggle.btn-success~.dropdown-menu{background-color:#43ac6a;border-color:#3c9a5f}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a{color:#fff}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a:hover{background-color:#388f58}.btn-group .dropdown-toggle.btn-info~.dropdown-menu{background-color:#5bc0de;border-color:#46b8da}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a{color:#fff}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a:hover{background-color:#39b3d7}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu{background-color:#e99002;border-color:#d08002}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a{color:#fff}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a:hover{background-color:#c17702}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu{background-color:#f04124;border-color:#ea2f10}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a{color:#fff}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a:hover{background-color:#dc2c0f}.lead{color:#6f6f6f}cite{font-style:italic}blockquote{color:#6f6f6f;border-left-width:1px}blockquote.pull-right{border-right-width:1px}blockquote small{font-size:12px;font-weight:300}table{font-size:12px}input,.form-control{padding:7px;font-size:12px}label,.control-label,.help-block,.checkbox,.radio{font-size:12px;font-weight:normal}.form-group .btn,.input-group-addon,.input-group-btn .btn{padding:8px 14px;font-size:12px}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{color:#222;background-color:#e7e7e7}.nav-tabs .caret{border-top-color:#222;border-bottom-color:#222}.nav-pills{font-weight:300}.breadcrumb{font-size:10px;font-weight:300;text-transform:uppercase;border:1px solid #ddd;border-radius:3px}.pagination{font-size:12px;font-weight:300;color:#999}.pagination>li>a,.pagination>li>span{margin-left:4px;color:#999}.pagination>.active>a,.pagination>.active>span{color:#fff}.pagination>li>a,.pagination>li:first-child>a,.pagination>li:last-child>a,.pagination>li>span,.pagination>li:first-child>span,.pagination>li:last-child>span{border-radius:3px}.pagination-lg>li>a{padding-right:22px;padding-left:22px}.pagination-sm>li>a{padding:0 5px}.pager{font-size:12px;font-weight:300;color:#999}.list-group{font-size:12px;font-weight:300}.label{padding-right:1em;padding-left:1em;font-weight:300;border-radius:0}.label-default{color:#333;background-color:#e7e7e7}.badge{font-weight:300}.progress{height:22px;padding:2px;background-color:#f6f6f6;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu{padding:0;margin-top:0;font-size:12px}.dropdown-menu>li>a{padding:12px 15px}.dropdown-header{padding-right:15px;padding-left:15px;font-size:9px;text-transform:uppercase}.popover{font-size:12px;font-weight:300;color:#fff}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed} diff --git a/css/cinder.css b/css/cinder.css new file mode 100644 index 00000000..48345605 --- /dev/null +++ b/css/cinder.css @@ -0,0 +1,88 @@ +/* + Cinder Theme for MkDocs | Copyright 2015 Christopher Simpkins | MIT License +*/ + +body { + font-family:"Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.7; + background-color: #FFF; + color: #343838; +} +h1, h2, h3, h4, h5, h6 { + font-family:'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; + color: #222; +} +h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { + color: #B1B7B9; +} + +h2 { + margin-top: 35px; +} + +h1, h2 { + font-weight: 700; +} +h4 { + font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + margin-top: 20px; + font-style: italic; +} +h5 { + font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + font-variant: small-caps; +} +pre, code { + background-color: #FCFDFF; +} +pre>code { + font-size: 13px; +} +pre { + margin-top: 25px; + margin-bottom: 25px; +} +.lead { + font-family:"Inter", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 400; + line-height: 1.4; + letter-spacing: 0.0312em; + color: #B1B7B9; +} +.navbar-default { + background-color: #343838; + border-bottom: 8px #EBF2F2 solid; +} +.bs-sidenav { + background-image: url("../img/grid11.png"); + background-repeat: repeat; + font-family: Inter,"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 13px; +} +.well { + background-color: #FCFDFF; +} +.btn-default { + background-color:#FCFDFF; +} +.table-striped > tbody > tr:nth-child(2n+1) > td, .table-striped > tbody > tr:nth-child(2n+1) > th { + background-color: #FCFDFF; +} +#mkdocs-search-query:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} +#mkdocs-search-query { + font-family:"Inter", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 20px; + font-weight: 700; + color: #343838; + height: 45px; +} +footer > hr { + width: 35%; +} diff --git a/css/cinder.min.css b/css/cinder.min.css new file mode 100644 index 00000000..fb7cc34f --- /dev/null +++ b/css/cinder.min.css @@ -0,0 +1 @@ +body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;line-height:1.7;background-color:#FFF;color:#343838}h1,h2,h3,h4,h5,h6{font-family:'Inter','Helvetica Neue',Helvetica,Arial,sans-serif;color:#222}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{color:#b1b7b9}h2{margin-top:35px}h1,h2{font-weight:700}h4{font-family:'Inter','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:300;margin-top:20px;font-style:italic}h5{font-family:'Inter','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:300;font-variant:small-caps}pre,code{background-color:#fcfdff}pre>code{font-size:13px}pre{margin-top:25px;margin-bottom:25px}.lead{font-family:"Inter","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.4;letter-spacing:.0312em;color:#b1b7b9}.navbar-default{background-color:#343838;border-bottom:8px #ebf2f2 solid}.bs-sidenav{background-image:url("../img/grid11.png");background-repeat:repeat;font-family:Inter,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px}.well{background-color:#fcfdff}.btn-default{background-color:#fcfdff}.table-striped>tbody>tr:nth-child(2n+1)>td,.table-striped>tbody>tr:nth-child(2n+1)>th{background-color:#fcfdff}#mkdocs-search-query:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}#mkdocs-search-query{font-family:"Inter","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:20px;font-weight:700;color:#343838;height:45px}footer>hr{width:35%} diff --git a/css/highlight.css b/css/highlight.css new file mode 100644 index 00000000..a2b9270e --- /dev/null +++ b/css/highlight.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #FCFDFF; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/css/highlight.min.css b/css/highlight.min.css new file mode 100644 index 00000000..1b6ab941 --- /dev/null +++ b/css/highlight.min.css @@ -0,0 +1 @@ +.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#fcfdff}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:bold}.hljs-number,.hljs-literal,.hljs-variable,.hljs-template-variable,.hljs-tag .hljs-attr{color:teal}.hljs-string,.hljs-doctag{color:#d14}.hljs-title,.hljs-section,.hljs-selector-id{color:#900;font-weight:bold}.hljs-subst{font-weight:normal}.hljs-type,.hljs-class .hljs-title{color:#458;font-weight:bold}.hljs-tag,.hljs-name,.hljs-attribute{color:navy;font-weight:normal}.hljs-regexp,.hljs-link{color:#009926}.hljs-symbol,.hljs-bullet{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} diff --git a/effects/index.html b/effects/index.html new file mode 100644 index 00000000..58008c1c --- /dev/null +++ b/effects/index.html @@ -0,0 +1,3210 @@ + + + + + + + + + + + + + + Layer Effects - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Layer Effects

+

Layers can have post-processing effects applied to them.

+

Effects

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name, as seen from editors and the like

+
mnstring +

Match name, used in expressions

+
efarray of Effect No Value or Effect Value Angle or Effect Value Checkbox or Effect Value Color or Effect Value Drop Down or Ignored Value or Effect Value Layer or Effect Value Point or Effect Value Slider +

Array of effect values. Each effect below shows a table with the values it expects.

+
npinteger +

Number of values in ef

+
ixinteger +

Effect Index

+
tyinteger +

Effect type

+
en0-1 integer +

Enabled

+
+
+

Many effects have unused values which are labeled with a number.

+

Effect types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tyEffect Type
5Misc Effect
20Tint
21Fill
22Stroke
23Tritone
24Pro Levels
25Drop Shadow
26Radial Wipe
27Displacement Map
28Matte3
29Gaussian Blur
30Twirl
31Mesh Warp
32Wavy
33Spherize
34Puppet
+

All the examples will use this as their base:

+

+

+
+
+
+
+ +
+

+

Fill Effect

+

Fill all opaque areas with a solid color

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 21 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
00Effect Value Point
01Effect Value Drop Down
colorEffect Value Color
03Effect Value Drop Down
04Effect Value Slider
05Effect Value Slider
opacityEffect Value Slider
+
+ + + + + + + + + + + + + + + + + + + + +
1
Color
1
0.9
0
+
+
+
+
+ + +
+

Stroke Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 22 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
00Effect Value Color
01Effect Value Checkbox
02Effect Value Checkbox
colorEffect Value Color
04Effect Value Slider
05Effect Value Slider
06Effect Value Slider
07Effect Value Slider
08Effect Value Slider
09Effect Value Drop Down
typeEffect Value Drop Down
+

Tritone Effect

+

Converts the layer to greyscale, then applies the gradient based on bright/mid/dark.

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 23 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + +
NameType
brightEffect Value Color
midEffect Value Color
darkEffect Value Color
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bright
1
1
1
Mid
0.3
0.8
0.3
Dark
0
0
0
+
+
+
+
+ + +
+

Pro Levels Effect

+

Color correction levels. +For more information refer to the After Effects Documentation.

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 24 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
00Effect Value Drop Down
01Effect No Value
02Effect No Value
comp_inblackEffect Value Slider
comp_inwhiteEffect Value Slider
comp_gammaEffect Value Slider
comp_outblackEffect Value Slider
comp_outwhiteEffect No Value
08Effect No Value
09Effect Value Slider
r_inblackEffect Value Slider
r_inwhiteEffect Value Slider
r_gammaEffect Value Slider
r_outblackEffect Value Slider
r_outwhiteEffect Value Slider
15Effect Value Slider
16Effect Value Slider
g_inblackEffect Value Slider
g_inwhiteEffect Value Slider
g_gammaEffect Value Slider
g_outblackEffect Value Slider
g_outwhiteEffect Value Slider
22Effect Value Slider
23Effect Value Slider
b_inblackEffect Value Slider
b_inwhiteEffect Value Slider
b_gammaEffect Value Slider
b_outblackEffect Value Slider
b_outwhiteEffect Value Slider
29Effect Value Slider
a_inblackEffect Value Slider
a_inwhiteEffect Value Slider
a_gammaEffect Value Slider
a_outblackEffect Value Slider
a_outwhiteEffect No Value
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Composite
0
1
1
0
1
Red
0
1
1
0
1
Green
0
1
1
0
1
Blue
0
1
1
0
1
+
+
+
+
+ + +
+

Tint Effect

+

The layer is converted to grayscale, then black to white is mapped to +the given color.

+

The result is merged back with the original based on the intensity.

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 20 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + +
NameType
Black ColorEffect Value Color
White ColorEffect Value Color
IntensityEffect Value Slider
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Black
0
0
0
White
0
1
0
Intensity
90
+
+
+
+
+ + +
+

Matte3 Effect

+

Uses a layer as a mask

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 28 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
LayerEffect Value Layer
ChannelEffect Value Drop Down
InvertEffect Value Drop Down
Stretch To FitEffect Value Drop Down
Show MaskEffect Value Drop Down
Premultiply MaskEffect Value Drop Down
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + +
+

Gaussian Blur Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 29 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + +
NameType
sigmaEffect Value Slider
directionEffect Value Slider
wrapEffect Value Checkbox
+
+ + + + + + + + + + + + + +
25
+
+
+
+
+ + +
+

Drop Shadow Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 25 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
colorEffect Value Color
opacityEffect Value Slider
angleEffect Value Angle
distanceEffect Value Slider
blurEffect Value Slider
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0
0
0
128
135
10
7
+
+
+
+
+ + +
+

Radial Wipe Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 26 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
CompletionEffect Value Slider
Start AngleEffect Value Angle
Wipe CenterEffect Value Point
WipeEffect Value Slider
FeatherEffect Value Slider
+

Displacement Map Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 27 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
Displacement Map LayerEffect Value Layer
Use For Horizontal DisplacementEffect Value Drop Down
Max Horizontal DisplacementEffect Value Slider
Use For Vertical DisplacementEffect Value Drop Down
Max Vertical DisplacementEffect Value Slider
Displacement Map BehaviorEffect Value Drop Down
Edge BehaviorEffect Value Drop Down
Expand OutputEffect Value Drop Down
+

Mesh Warp Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 31 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
RowsEffect Value Slider
ColumnsEffect Value Slider
QualityEffect Value Slider
03Effect No Value
+

Puppet Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 34 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
Puppet EngineEffect Value Drop Down
Mesh Rotation RefinementEffect Value Slider
On TransparentEffect Value Drop Down
03Effect No Value
+

Spherize Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 33 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + +
NameType
radiusEffect Value Slider
centerEffect Value Point
+

Wavy Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 32 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
RadiusEffect Value Slider
CenterEffect Value Point
Conversion typeEffect Value Drop Down
SpeedEffect Value Drop Down
WidthEffect Value Slider
HeightEffect Value Slider
PhaseEffect Value Slider
+

Twirl Effect

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 30 +

Type

+
efarray +

Effect values

+
+
+ + + + + + + + + + + + + + + + + + + + + +
NameType
AngleEffect Value Angle
RadiusEffect Value Slider
CenterEffect Value Point
+

Custom Effect

+

You might find various different effects all with ty = 5.

+

Sometimes these are used together with expressions.

+
+ + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 5 +

Type

+
+
+

Effect Values

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name

+
mnstring +

Match Name

+
ixinteger +

Effect Index

+
tyinteger +

Type

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tyControl Type
0Slider
1Angle
2Color
3Point
4Checkbox
6Ignored
7Dropdown
10Layer
+

No Value

+
+

Slider

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 0 +

Type

+
vAnimated number +

Value

+
+
+

Angle

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 1 +

Type

+
vAnimated number +

Value

+
+
+

Color

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 2 +

Type

+
vAnimated Color +

Value

+
+
+

Point

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 3 +

Type

+
vAnimated Vector +

Value

+
+
+

Checkbox

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 4 +

Type

+
vAnimated number +

Value

+
+
+

Ignored

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 6 +

Type

+
vnumber +

Value

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 7 +

Type

+
vAnimated number +

Value

+
+
+

Layer

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 10 +

Type

+
vAnimated number +

Value

+
+
+

Layer Style

+

A layer can also have a list of styles applied to it

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name, as seen from editors and the like

+
mnstring +

Match name, used in expressions

+
tyinteger +

Style Type

+
+
+

Style types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tyStyle Type
0Stroke
1Drop Shadow
2Inner Shadow
3Outer Glow
4Inner Glow
5Bevel / Emboss
6Satin
7Color Overlay
8Gradient Overlay
+

Stroke Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 0 +

Layer Type

+
sAnimated number +

Size

+
cAnimated Color +

Color

+
+
+

Drop Shadow Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 1 +

Layer Type

+
cAnimated Color +

Color

+
oAnimated number +

Opacity

+
aAnimated number +

Local light angle

+
sAnimated number +

Blur size

+
dAnimated number +

Distance

+
chAnimated number +

Choke Spread

+
bmAnimated number +

Blend Mode

+
noAnimated number +

Noise

+
lcAnimated number +

Layer knowck out drop shadow

+
+
+

Inner Shadow Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 2 +

Layer Type

+
cAnimated Color +

Color

+
oAnimated number +

Opacity

+
aAnimated number +

Local light angle

+
sAnimated number +

Blur size

+
dAnimated number +

Distance

+
chAnimated number +

Choke Spread

+
bmAnimated number +

Blend Mode

+
noAnimated number +

Noise

+
+
+

Outer Glow Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 3 +

Layer Type

+
cAnimated Color +

Color

+
oAnimated number +

Opacity

+
rAnimated number +

Range

+
chAnimated number +

Choke Spread

+
bmAnimated number +

Blend Mode

+
noAnimated number +

Noise

+
jAnimated number +

Jitter

+
+
+

Inner Glow Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 4 +

Layer Type

+
cAnimated Color +

Color

+
oAnimated number +

Opacity

+
rAnimated number +

Range

+
srAnimated number +

Source

+
chAnimated number +

Choke Spread

+
bmAnimated number +

Blend Mode

+
noAnimated number +

Noise

+
jAnimated number +

Jitter

+
+
+

Bevel / Emboss Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 5 +

Layer Type

+
bsAnimated number +

Bevel Style

+
btAnimated number +

Technique

+
srAnimated number +

Strength

+
sAnimated number +

Size

+
sfAnimated number +

Soften

+
gaAnimated number +

Use global light

+
aAnimated number +

Local lighting angle

+
llAnimated number +

Local lighting altitude

+
hmAnimated number +

Highlight Mode

+
hcAnimated Color +

Highlight Color

+
hoAnimated number +

Highlight Opacity

+
smAnimated number +

Shadow Mode

+
scAnimated Color +

Shadow Color

+
soAnimated number +

Shadow Opacity

+
+
+

Satin Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 6 +

Layer Type

+
bmAnimated number +

Blend Mode

+
cAnimated Color +

Color

+
oAnimated number +

Opacity

+
aAnimated number +

Angle

+
dAnimated number +

Distance

+
sAnimated number +

Size

+
inAnimated number +

Invert

+
+
+

Color Overlay Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 7 +

Layer Type

+
bmAnimated number +

Blend Mode

+
cAnimated Color +

Color

+
soAnimated number +

Opacity

+
+
+

Gradient Overlay Style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 8 +

Layer Type

+
bmAnimated number +

Blend Mode

+
oAnimated number +

Opacity

+
gfGradient Colors +

Gradient

+
gsAnimated number +

Smoothness

+
aAnimated number +

Angle

+
gtGradient Type +

Gradient Type

+
reAnimated number +

Reverse

+
alAnimated number +

Align with layer

+
sAnimated number +

Scale

+
ofAnimated number +

Offset

+
+
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/3d_layers.json b/examples/3d_layers.json new file mode 100644 index 00000000..d7a3c885 --- /dev/null +++ b/examples/3d_layers.json @@ -0,0 +1,194 @@ +{ + "v": "5.9.2", + "fr": 60, + "ip": 0, + "op": 120, + "w": 512, + "h": 512, + "nm": "3d layers", + "ddd": 1, + "layers": [ + { + "ddd": 1, + "ind": 2, + "ty": 4, + "nm": "Blue Circle", + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 0 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256, + 0 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "el", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.196, 0.314, 0.69] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ind": 2, + "ty": 4, + "nm": "Yellow Square", + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 30 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256, + 0 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 1, 0.3] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] +} diff --git a/examples/3d_layers_animation.json b/examples/3d_layers_animation.json new file mode 100644 index 00000000..f3b64405 --- /dev/null +++ b/examples/3d_layers_animation.json @@ -0,0 +1,273 @@ +{ + "v": "5.9.2", + "fr": 60, + "ip": 0, + "op": 120, + "w": 512, + "h": 512, + "nm": "3d layers", + "ddd": 1, + "layers": [ + { + "ddd": 1, + "ind": 2, + "ty": 4, + "nm": "Blue Circle", + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.302 + ], + "y": [ + 1.121 + ] + }, + "o": { + "x": [ + 0.411 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 75, + "s": [ + 180 + ] + } + ] + }, + "ry": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.288 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.685 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 60, + "s": [ + -180 + ] + } + ] + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.667, + "y": 1 + }, + "o": { + "x": 0.333, + "y": 0 + }, + "t": 0, + "s": [ + 120, + 256, + 0 + ] + }, + { + "t": 75, + "s": [ + 400, + 256, + 200 + ] + } + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "el", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.196, 0.314, 0.69] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ind": 2, + "ty": 4, + "nm": "Yellow Square", + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 30 + }, + "ry": { + "a": 0, + "k": 20 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256, + -1 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 1, 0.3] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] +} diff --git a/examples/3d_parenting.json b/examples/3d_parenting.json new file mode 100644 index 00000000..1302b078 --- /dev/null +++ b/examples/3d_parenting.json @@ -0,0 +1,909 @@ +{ + "v": "5.9.2", + "fr": 60, + "ip": 0, + "op": 120, + "w": 512, + "h": 512, + "nm": "3d layers", + "ddd": 1, + "layers": [ + { + "ddd": 1, + "ty": 13, + "nm": "Camera", + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 0 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0, + -10 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "pe": {"a": 0, "k": 256} + }, + { + "ddd": 1, + "ty": 4, + "ind": 1, + "nm": "Parent", + "ks": { + "o": { + "a": 0, + "k": 50 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 0 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 1, 1] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall Front", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 0 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0, + 200 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.5, 0.5, 1] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall FR", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 45 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 141, + 0, + 141 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 0.5, 1] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall FL", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": -45 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + -141, + 0, + 141 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0, 0.5, 1] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall Left", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": -90 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + -200, + 0, + 0 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0, 0.5, 0.5] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall Right", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 90 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 200, + 0, + 0 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 0.5, 0.5] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall BR", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": -45 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 141, + 0, + -141 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [1, 0.5, 0] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall BL", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 45 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + -141, + 0, + -141 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0, 0.5, 0] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ddd": 1, + "ty": 4, + "nm": "Wall Back", + "parent": 1, + "ks": { + "o": { + "a": 0, + "k": 100 + }, + "rx": { + "a": 0, + "k": 0 + }, + "ry": { + "a": 0, + "k": 0 + }, + "rz": { + "a": 0, + "k": 0 + }, + "or": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0, + -200 + ] + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + } + }, + "ip": 0, + "op": 120, + "st": 0, + "shapes": [ + { + "ty": "rc", + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.5, 0.5, 0] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] +} + diff --git a/examples/auto_orient.json b/examples/auto_orient.json new file mode 100644 index 00000000..ac4501e6 --- /dev/null +++ b/examples/auto_orient.json @@ -0,0 +1,390 @@ +{ +"v": "5.5.7", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{46da3bdd-424c-4d87-ab48-70568860494c}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ + { + "nm": "PolyStar", + "id": "{e2e65917-0097-48d1-a5ae-17873a1ebb3e}", + "layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "PolyStar", + "mn": "{2075ceec-ea0c-473d-9063-706380ba0a2c}", + "ks": { + "a": { + "a": 0, + "k": [ + 125.51641791044776, + 106.60298507462687 + ] + }, + "p": { + "a": 0, + "k": [ + 125.51641791044776, + 106.60298507462687 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 50 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "sr", + "nm": "PolyStar", + "mn": "{a3f805b0-34a3-4ccd-941e-5f84b407c0dd}", + "p": { + "a": 0, + "k": [ + 125.51641791044776, + 106.60298507462687 + ] + }, + "or": { + "a": 0, + "k": 73.93932342529297 + }, + "ir": { + "a": 0, + "k": 36.969661712646484 + }, + "r": { + "a": 0, + "k": 90 + }, + "pt": { + "a": 0, + "k": 3 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{c6d0521b-355c-4f8e-83e7-1c2814d3cfad}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.19607843137254902, + 0.3137254901960784, + 0.6901960784313725 + ] + }, + "r": 1 + } + ] + } + ] + } +], +"layers": [ + { + "ty": 0, + "ddd": 0, + "nm": "Layer", + "mn": "{89b88968-ac5c-4e11-be47-b9ce60f5073e}", + "ip": 0, + "op": 180, + "ind": 1, + "st": 0, + "sr": 1, + "ao": 1, + "ks": { + "a": { + "a": 0, + "k": [ + 125.50000000000003, + 105.70000000000003 + ] + }, + "p": { + "a": 1, + "k": [ + { + "t": 0, + "s": [ + 125.50000000000003, + 105.70000000000003 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 408.489552238806, + 110.89850746268658 + ] + }, + { + "t": 50, + "s": [ + 408.489552238806, + 110.89850746268658 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 107.85597014925375, + 410.49876865671655 + ] + }, + { + "t": 130, + "s": [ + 107.85597014925375, + 410.49876865671655 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 125.50000000000003, + 105.70000000000003 + ] + }, + { + "t": 180, + "s": [ + 125.50000000000003, + 105.70000000000003 + ] + } + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "refId": "{e2e65917-0097-48d1-a5ae-17873a1ebb3e}", + "w": 512, + "h": 512 + }, + { + "ty": 0, + "ddd": 0, + "nm": "Layer", + "mn": "{89b88968-ac5c-4e11-be47-b9ce60f5073e}", + "ip": 0, + "op": 180, + "ind": 2, + "st": 0, + "sr": 1, + "ks": { + "a": { + "a": 0, + "k": [ + 125.50000000000003, + 105.70000000000003 + ] + }, + "p": { + "a": 1, + "k": [ + { + "t": 0, + "s": [ + 125.50000000000003, + 105.70000000000003 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 408.489552238806, + 110.89850746268658 + ] + }, + { + "t": 50, + "s": [ + 408.489552238806, + 110.89850746268658 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 107.85597014925375, + 410.49876865671655 + ] + }, + { + "t": 130, + "s": [ + 107.85597014925375, + 410.49876865671655 + ], + "h": 0, + "o": { + "x": [ + 0 + ], + "y": [ + 0 + ] + }, + "i": { + "x": [ + 1 + ], + "y": [ + 1 + ] + }, + "e": [ + 125.50000000000003, + 105.70000000000003 + ] + }, + { + "t": 180, + "s": [ + 125.50000000000003, + 105.70000000000003 + ] + } + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 50 + } + }, + "refId": "{e2e65917-0097-48d1-a5ae-17873a1ebb3e}", + "w": 512, + "h": 512 + } +], +"meta": { + "g": "Glaxnimate 0.4.6-26-g7b05e75c" +} +} diff --git a/examples/bezier.json b/examples/bezier.json new file mode 100644 index 00000000..80a51b4e --- /dev/null +++ b/examples/bezier.json @@ -0,0 +1,135 @@ +{ +"v": "5.5.7", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{8f1618e3-6f83-4531-8f65-07dd4b68ee2e}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer", + "mn": "{85f37d8b-1792-4a4f-82d2-1b3b6d829c07}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "gr", + "nm": "Group", + "it": [ + { + "ty": "sh", + "nm": "Shape", + "ks": { + "a": 0, + "k": { + "c": true, + "v": [], + "i": [], + "o": [] + } + } + }, + { + "ty": "st", + "nm": "Stroke", + "mn": "{0930ce27-c8f9-4371-b0cf-111a859abfaf}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 249.3134328358209, + 254.47164179104476 + ] + }, + "p": { + "a": 0, + "k": [ + 249.3134328358209, + 254.47164179104476 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-26-g7b05e75c" +} +} diff --git a/examples/bezier_expression.json b/examples/bezier_expression.json new file mode 100644 index 00000000..91919d4d --- /dev/null +++ b/examples/bezier_expression.json @@ -0,0 +1,682 @@ +{ + "nm": "Animation", + "fr": 60, + "ip": 0, + "op": 280, + "w": 512, + "h": 512, + "ddd": 0, + "assets": [], + "chars": [], + "layers": [ + { + "nm": "Shapes", + "ddd": 0, + "hd": false, + "ks": {}, + "ao": 0, + "ip": 0, + "op": 280, + "st": 0, + "hasMask": false, + "masksProperties": [], + "ef": [ + { + "ef": [ + { + "ty": 0, + "nm": "Slider", + "v": { + "a": 1, + "k": [ + { + "t": 0, + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.333 + ], + "y": [ + 0 + ] + }, + "s": [ + 0 + ] + }, + { + "t": 120, + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.333 + ], + "y": [ + 0 + ] + }, + "s": [ + 1 + ] + }, + { + "t": 140, + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.333 + ], + "y": [ + 0 + ] + }, + "s": [ + 1 + ] + }, + { + "t": 260, + "s": [ + 0 + ] + } + ] + } + } + ], + "ty": 5, + "nm": "Slider" + } + ], + "mb": false, + "ty": 4, + "shapes": [ + { + "nm": "Bezier Point", + "hd": false, + "ty": "gr", + "it": [ + { + "nm": "p0", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 25, + 400 + ], + "x": "var group = thisLayer.content(\"Linear Points\");\nvar pt_index = 0;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "hd": false, + "ty": "fl", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.125, + 0 + ] + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Linear Points", + "hd": false, + "ty": "gr", + "it": [ + { + "nm": "p0", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 25, + 400 + ], + "x": "var group = thisLayer.content(\"Quadratic Points\");\nvar pt_index = 0;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p1", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 130, + 170 + ], + "x": "var group = thisLayer.content(\"Quadratic Points\");\nvar pt_index = 1;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "hd": false, + "ty": "fl", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.8, + 0 + ] + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Linear Lines", + "hd": false, + "ty": "gr", + "it": [ + { + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [], + "o": [], + "v": [] + }, + "x": "var group = thisLayer.content(\"Linear Points\");\nvar num_points = 2;\nvar points = [];\nvar ip = [];\nvar op = [];\nfor ( var i = 0; i < num_points; i++ )\n{\n var pos = group.content(\"p\" + i).position;\n points.push(pos);\n ip.push(pos);\n op.push(pos);\n}\nvar $bm_rt = {\n v: points,\n i: ip,\n o: op\n};\n" + } + }, + { + "hd": false, + "ty": "st", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.8, + 0 + ] + }, + "w": { + "a": 0, + "k": 10 + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Quadratic Points", + "hd": false, + "ty": "gr", + "it": [ + { + "nm": "p0", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 25, + 400 + ], + "x": "var group = thisLayer.content(\"Cubic Points\");\nvar pt_index = 0;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p1", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 130, + 170 + ], + "x": "var group = thisLayer.content(\"Cubic Points\");\nvar pt_index = 1;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p2", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 350, + 230 + ], + "x": "var group = thisLayer.content(\"Cubic Points\");\nvar pt_index = 2;\nvar pt_from = group.content(\"p\"+pt_index).position;\nvar pt_to = group.content(\"p\"+(pt_index+1)).position;\nvar t = thisLayer.effect(\"Slider\")(\"Slider\");\nvar $bm_rt = linear(t, pt_from, pt_to);\n" + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "hd": false, + "ty": "fl", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.2, + 0.2, + 1 + ] + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Quadratic Lines", + "hd": false, + "ty": "gr", + "it": [ + { + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [], + "o": [], + "v": [] + }, + "x": "var group = thisLayer.content(\"Quadratic Points\");\nvar num_points = 3;\nvar points = [];\nvar ip = [];\nvar op = [];\nfor ( var i = 0; i < num_points; i++ )\n{\n var pos = group.content(\"p\" + i).position;\n points.push(pos);\n ip.push(pos);\n op.push(pos);\n}\nvar $bm_rt = {\n v: points,\n i: ip,\n o: op\n};\n" + } + }, + { + "hd": false, + "ty": "st", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.2, + 0.2, + 1 + ] + }, + "w": { + "a": 0, + "k": 10 + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Cubic Points", + "hd": false, + "ty": "gr", + "it": [ + { + "nm": "p0", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 25, + 400 + ] + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p1", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 130, + 170 + ] + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p2", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 350, + 230 + ] + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "nm": "p3", + "hd": false, + "ty": "el", + "p": { + "a": 0, + "k": [ + 485, + 400 + ] + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "hd": false, + "ty": "fl", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Cubic Lines", + "hd": false, + "ty": "gr", + "it": [ + { + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [], + "o": [], + "v": [] + }, + "x": "var group = thisLayer.content(\"Cubic Points\");\nvar num_points = 4;\nvar points = [];\nvar ip = [];\nvar op = [];\nfor ( var i = 0; i < num_points; i++ )\n{\n var pos = group.content(\"p\" + i).position;\n points.push(pos);\n ip.push(pos);\n op.push(pos);\n}\nvar $bm_rt = {\n v: points,\n i: ip,\n o: op\n};\n" + } + }, + { + "hd": false, + "ty": "st", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "w": { + "a": 0, + "k": 10 + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "nm": "Bezier Result", + "hd": false, + "ty": "gr", + "it": [ + { + "ty": "sh", + "ks": { + "a": 0, + "k": { + "i": [], + "o": [], + "v": [] + }, + "x": "var group = thisLayer.content(\"Cubic Points\");\nvar $bm_rt = {\n v: [group.content(\"p0\").position, group.content(\"p3\").position],\n i: [[0, 0], group.content(\"p2\").position],\n o: [group.content(\"p1\").position, [0,0]]\n};\n" + } + }, + { + "hd": false, + "ty": "st", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0, + 0.8, + 0 + ] + }, + "w": { + "a": 0, + "k": 10 + } + }, + { + "hd": false, + "ty": "tr", + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + } + ] +} diff --git a/examples/blend_mode.json b/examples/blend_mode.json new file mode 100644 index 00000000..9d9a5a6a --- /dev/null +++ b/examples/blend_mode.json @@ -0,0 +1,533 @@ +{ +"v": "5.7.1", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{429ff333-f31c-4124-91c5-5e861412a004}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 1, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer", + "mn": "{625eab7e-4758-4d4b-b37c-d89115b1442b}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 50 + } + }, + "shapes": [ + { + "ty": "gr", + "nm": "Ellipse", + "mn": "{dd57d763-ff3b-420f-a94d-eb5503e7faa7}", + "it": [ + { + "ty": "el", + "nm": "Ellipse", + "mn": "{fa5c495c-00d1-4253-b30c-cc8cb1b855b2}", + "p": { + "a": 0, + "k": [ + 400.1910447761194, + 240.71641791044777 + ] + }, + "s": { + "a": 0, + "k": [ + 195.15223880597017, + 180.53731343283584 + ] + } + }, + { + "ty": "st", + "hd": true, + "nm": "Stroke", + "mn": "{89437b5f-dca9-42d4-aff9-c57ce08c8c1e}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{352559ca-ebe9-4b11-acdd-09e155612598}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.3411764705882353, + 0.01568627450980392 + ] + }, + "r": 1 + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 400.1910447761194, + 240.71641791044777 + ] + }, + "p": { + "a": 0, + "k": [ + 400.1910447761194, + 240.71641791044777 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ty": "gr", + "nm": "PolyStar", + "mn": "{b6000853-a4d3-4b13-acdd-2e4f1a192760}", + "it": [ + { + "ty": "sr", + "nm": "PolyStar", + "mn": "{d647a149-8105-4e08-b395-c8de40669fb0}", + "p": { + "a": 0, + "k": [ + 110.90149253731343, + 216.644776119403 + ] + }, + "or": { + "a": 0, + "k": 121.5619125366211 + }, + "ir": { + "a": 0, + "k": 60.78095626831055 + }, + "r": { + "a": 0, + "k": 143.04905700683594 + }, + "pt": { + "a": 0, + "k": 5 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "st", + "hd": true, + "nm": "Stroke", + "mn": "{67a87e2b-afff-4f55-9004-4cc274cefe07}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{39b8d13c-45cf-4ad7-972a-ef5169f1ffbf}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "r": 1 + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 110.90149253731343, + 216.644776119403 + ] + }, + "p": { + "a": 0, + "k": [ + 159.9044776119403, + 247.59402985074627 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + }, + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer 1", + "mn": "{d74c9dcc-e7af-45c3-9eab-554c7b93f6b6}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "gr", + "nm": "Rectangle 1", + "mn": "{b22ddad1-738b-471a-86eb-1f072fa45799}", + "it": [ + { + "ty": "rc", + "nm": "Rectangle 1", + "mn": "{0c09bd21-59ab-4f1e-bd3d-547613eb3e2a}", + "p": { + "a": 0, + "k": [ + 241.57611940298506, + 357.6358208955224 + ] + }, + "s": { + "a": 0, + "k": [ + 383.4268656716418, + 211.4865671641791 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "st", + "hd": true, + "nm": "Stroke", + "mn": "{8cd4fca9-3480-49fa-947f-04bc40ed74f5}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{050089d8-44c4-4312-8e23-3c89df7615aa}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.7686274509803922, + 0.8509803921568627, + 0.9607843137254902 + ] + }, + "r": 1 + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 241.57611940298506, + 357.6358208955224 + ] + }, + "p": { + "a": 0, + "k": [ + 226.1014925373134, + 131.53432835820894 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + }, + { + "ty": "gr", + "nm": "Rectangle", + "mn": "{700bfca8-0e45-42e9-8559-15ac0ebe93b2}", + "it": [ + { + "ty": "rc", + "nm": "Rectangle", + "mn": "{0e3ac2ac-22c8-4310-8208-f5d5ba9cd6d9}", + "p": { + "a": 0, + "k": [ + 277.68358208955226, + 148.2985074626866 + ] + }, + "s": { + "a": 0, + "k": [ + 335.2835820895522, + 162.48358208955224 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "st", + "hd": true, + "nm": "Stroke", + "mn": "{af0c691f-7815-414e-a988-ac2eb6e32128}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{059d8c4e-de02-4fa7-99fe-c069b73218be}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.19607843137254902, + 0.3137254901960784, + 0.6901960784313725 + ] + }, + "r": 1 + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 277.68358208955226, + 148.2985074626866 + ] + }, + "p": { + "a": 0, + "k": [ + 277.68358208955226, + 366.6626865671642 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-32-gb62899be" +} +} diff --git a/examples/blep.png b/examples/blep.png new file mode 100644 index 0000000000000000000000000000000000000000..23dbec74b77b7614245a4436efb3e6a427b36c0f GIT binary patch literal 53877 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 literal 0 HcmV?d00001 diff --git a/examples/star.json b/examples/star.json new file mode 100644 index 00000000..2bd26a13 --- /dev/null +++ b/examples/star.json @@ -0,0 +1,159 @@ +{ +"v": "5.7.1", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{8f1618e3-6f83-4531-8f65-07dd4b68ee2e}", +"fr": 60, +"w": 512, +"h": 512, + +"layers": [ + { + "ty": 4, + "ddd": 0, + "nm": "Layer", + "mn": "{85f37d8b-1792-4a4f-82d2-1b3b6d829c07}", + "ip": 0, + "op": 180, + "ind": 0, + "st": 0, + "sr": 1, + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "gr", + "nm": "PolyStar", + "mn": "{9199543e-3552-4e51-a802-623f2a4a2ca1}", + "it": [ + { + "ty": "sr", + "nm": "PolyStar", + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "or": { + "a": 0, + "k": 200 + }, + "ir": { + "a": 0, + "k": 100 + }, + "r": { + "a": 0, + "k": 0 + }, + "pt": { + "a": 0, + "k": 5 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "st", + "nm": "Stroke", + "mn": "{0930ce27-c8f9-4371-b0cf-111a859abfaf}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.979995422293431, + 0.28000305180437934 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 30 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-32-gb62899be" +} +} diff --git a/examples/stroke.json b/examples/stroke.json new file mode 100644 index 00000000..9846b482 --- /dev/null +++ b/examples/stroke.json @@ -0,0 +1,156 @@ + +{ +"v": "5.7.1", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{8f1618e3-6f83-4531-8f65-07dd4b68ee2e}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer", + "mn": "{85f37d8b-1792-4a4f-82d2-1b3b6d829c07}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "sr", + "nm": "PolyStar", + "mn": "{57cff206-c227-4a14-a679-195157be886b}", + "p": { + "a": 0, + "k": [ + 249.3134328358209, + 254.47164179104476 + ] + }, + "or": { + "a": 0, + "k": 200 + }, + "ir": { + "a": 0, + "k": 100 + }, + "r": { + "a": 0, + "k": 0 + }, + "pt": { + "a": 0, + "k": 5 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "tm", + "nm": "Trim Path", + "mn": "{dcd7570f-5105-485b-bd43-42ad990b01e8}", + "s": { + "a": 0, + "k": 0 + }, + "e": { + "a": 0, + "k": 100 + }, + "o": { + "a": 0, + "k": 0 + }, + "m": 1 + }, + { + "ty": "st", + "nm": "Stroke", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.98, + 0.28 + ] + }, + "lc": 2, + "lj": 2, + "ml": 3, + "w": { + "a": 0, + "k": 20 + }, + "d": [ + { + "n": "o", + "nm": "offset", + "v": {"a": 0, "k": 0} + }, + { + "n": "d", + "nm": "dash", + "v": {"a": 0, "k": 100} + }, + { + "n": "g", + "nm": "gap", + "v": {"a": 0, "k": 0} + } + ] + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-32-gb62899be" +} +} diff --git a/examples/text-document.json b/examples/text-document.json new file mode 100644 index 00000000..24dafbcd --- /dev/null +++ b/examples/text-document.json @@ -0,0 +1,75 @@ +{ + "v": "5.5.2", + "fr": 60, + "ip": 0, + "op": 120, + "w": 300, + "h": 100, + "ddd": 0, + "assets": [], + "fonts": { + "list": [ + { + "fPath": "https://fonts.gstatic.com/s/ubuntu/v15/4iCp6KVjbNBYlgoKejZftWyI.ttf", + "fFamily": "Ubuntu", + "fStyle": "Light Italic", + "fName": "Ubuntu Light Italic", + "origin": 3 + } + ] + }, + "layers": [ + { + "nm": "Text Layer", + "ty": 5, + "sr": 1, + "ks": { + "p": { + "k": [ + 5, + 80 + ], + "a": 0 + } + }, + "ip": 0, + "op": 120, + "st": 0, + "t": { + "a": [], + "d": { + "k": [ + { + "s": { + "f": "Ubuntu Light Italic", + "fc": [ + 0, + 0, + 0 + ], + "s": 100, + "t": "Hello", + "j": 0 + }, + "t": 0 + } + ] + }, + "m": { + "a": { + "k": [ + 0, + 0 + ], + "a": 0 + } + }, + "p": {} + } + } + ] +} + + + + diff --git a/examples/text-selector.json b/examples/text-selector.json new file mode 100644 index 00000000..d36ae1fc --- /dev/null +++ b/examples/text-selector.json @@ -0,0 +1,177 @@ +{ + "v": "5.9.6", + "fr": 60, + "ip": 0, + "op": 60, + "w": 512, + "h": 350, + "assets": [], + "fonts": { + "list": [ + { + "origin": 0, + "fPath": "", + "fClass": "", + "fFamily": "Sans", + "fWeight": "", + "fStyle": "Regular", + "fName": "Sans" + } + ] + }, + "layers": [ + { + "ty": 5, + "sr": 1, + "ip": 0, + "op": 60, + "st": 0, + "ks": { + "p": { + "a": 0, + "k": [ + 256, + 70, + 0 + ] + } + }, + "t": { + "d": { + "k": [ + { + "s": { + "s": 70, + "f": "Sans", + "t": "Hello World\rthe quick brown\rfox jumps over\rthe lazy dog", + "ls": 0, + "j": 2, + "fc": [ + 0, + 0, + 0 + ], + "sc": [ + 0, + 0, + 0 + ], + "sw": 0, + "of": true + }, + "t": 0 + } + ] + }, + "p": {}, + "m": { + "g": 1, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + } + }, + "a": [ + { + "nm": "Text Range", + "s": { + "t": 0, + "o": { + "a": 0, + "k": 0 + }, + "s": { + "a": 0, + "k": 60 + }, + "e": { + "a": 0, + "k": 75 + }, + "a": { + "a": 0, + "k": 100 + }, + "b": 1, + "rn": 0, + "sh": 1, + "xe": { + "a": 0, + "k": 0 + }, + "ne": { + "a": 0, + "k": 0 + }, + "sm": { + "a": 0, + "k": 100 + }, + "r": 1 + }, + "a": { + "p": { + "a": 0, + "k": [0, 0] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + }, + "fc": { + "a": 0, + "k": [0.196, 0.314, 0.69] + }, + "fh": { + "a": 0, + "k": 0 + }, + "fs": { + "a": 0, + "k": 0 + }, + "fb": { + "a": 0, + "k": 0 + }, + "sc": { + "a": 0, + "k": [ + 1, + 0, + 0 + ] + }, + "sw": { + "a": 0, + "k": 0 + }, + "t": { + "a": 0, + "k": 0 + } + } + } + ] + } + }, + { + "ty": 1, + "ip": 0, + "op": 60, + "st": 0, + "ks": {}, + "sc": "#ffffff", + "sw": 512, + "sh": 350 + } + ] +} diff --git a/examples/text.json b/examples/text.json new file mode 100644 index 00000000..34a029c2 --- /dev/null +++ b/examples/text.json @@ -0,0 +1,118 @@ +{ + "v": "5.5.2", + "fr": 60, + "ip": 0, + "op": 120, + "w": 512, + "h": 512, + "ddd": 0, + "assets": [], + "fonts": { + "list": [ + { + "fFamily": "sans", + "fName": "sans", + "fStyle": "Regular" + } + ] + }, + "layers": [ + { + "ddd": 0, + "ty": 5, + "sr": 1, + "ks": { + "a": { + "k": [ + 0, + 0 + ], + "a": 0 + }, + "p": { + "k": [ + 30, + 200 + ], + "a": 0 + }, + "s": { + "k": [ + 100, + 100 + ], + "a": 0 + }, + "r": { + "k": 0, + "a": 0 + }, + "o": { + "k": 100, + "a": 0 + }, + "sk": { + "k": 0, + "a": 0 + }, + "sa": { + "k": 0, + "a": 0 + } + }, + "ao": 0, + "ip": 0, + "op": 120, + "st": 0, + "bm": 0, + "ind": 0, + "t": { + "a": [], + "d": { + "k": [ + { + "s": { + "f": "sans", + "fc": [ + 1, + 0, + 0, + 1 + ], + "s": 200, + "t": "Text", + "j": 0 + }, + "t": 0 + }, + { + "s": { + "f": "sans", + "fc": [ + 0, + 1, + 0, + 1 + ], + "s": 200, + "t": "Here", + "j": 0 + }, + "t": 60 + } + ] + }, + "m": { + "a": { + "k": [ + 0, + 0 + ], + "a": 0 + } + }, + "p": {} + } + } + ] +} diff --git a/examples/text_shape.png b/examples/text_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b8efa1c4b06f956aa3cd2b284e8f392768769c GIT binary patch literal 88746 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 R%dG(V=xZBmm1#Ie{vQNZt118h literal 0 HcmV?d00001 diff --git a/examples/transform.json b/examples/transform.json new file mode 100644 index 00000000..32ffc7e2 --- /dev/null +++ b/examples/transform.json @@ -0,0 +1,273 @@ +{ +"v": "5.7.1", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{a3bb98c7-d0dd-4484-b6da-74a0e70eaf2f}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 2, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Anchor", + "mn": "{04f9b742-3603-49fa-9552-ea04de1a3f33}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "el", + "nm": "Ellipse", + "mn": "{4251e46a-bb13-464b-913c-e67c44a218da}", + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 32, + 32 + ] + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{7d3070ed-88a3-41aa-a62e-7db8df1bd312}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.9411764705882353, + 0.11372549019607843, + 0.0392156862745098 + ] + }, + "r": 1 + } + ] + }, + { + "ddd": 0, + "ty": 4, + "ind": 1, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Transformed", + "mn": "{d00298c4-66b4-4ae4-a730-22c1eb85c188}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + }, + "sk": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + } + }, + "shapes": [ + { + "ty": "rc", + "nm": "Rectangle 1", + "mn": "{bf8ad877-113b-4df8-a2e2-3bb4af32edf7}", + "p": { + "a": 0, + "k": [ + 252.75223880597017, + 250.60298507462684 + ] + }, + "s": { + "a": 0, + "k": [ + 319.8089552238806, + 330.98507462686564 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "nm": "Fill 1", + "mn": "{b9040dc8-0753-4a6e-b5f1-d508d17bbd4f}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.19607843137254902, + 0.3137254901960784, + 0.6901960784313725 + ] + }, + "r": 1 + } + ] + }, + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Reference", + "mn": "{8f351be7-8a51-4310-9dc3-59ed21594815}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "rc", + "nm": "Rectangle", + "mn": "{cb4f7b74-bed1-493b-a0e6-01b00566aedd}", + "p": { + "a": 0, + "k": [ + 252.75223880597017, + 250.60298507462684 + ] + }, + "s": { + "a": 0, + "k": [ + 319.8089552238806, + 330.98507462686564 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "fl", + "nm": "Fill", + "mn": "{05064670-7e14-4141-89c1-e0f0f3a1c57d}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 0.1607843137254902, + 0.1843137254901961, + 0.4588235294117647 + ] + }, + "r": 1 + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-32-gb62899be" +} +} diff --git a/examples/trim_path.json b/examples/trim_path.json new file mode 100644 index 00000000..05d077e9 --- /dev/null +++ b/examples/trim_path.json @@ -0,0 +1,211 @@ +{ +"v": "5.7.1", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{8f1618e3-6f83-4531-8f65-07dd4b68ee2e}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer", + "mn": "{85f37d8b-1792-4a4f-82d2-1b3b6d829c07}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "sr", + "nm": "PolyStar", + "mn": "{57cff206-c227-4a14-a679-195157be886b}", + "p": { + "a": 0, + "k": [ + 128, + 128 + ] + }, + "or": { + "a": 0, + "k": 100 + }, + "ir": { + "a": 0, + "k": 50 + }, + "r": { + "a": 0, + "k": 0 + }, + "pt": { + "a": 0, + "k": 5 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "el", + "nm": "Ellipse", + "mn": "{74587b40-1ef1-445d-b9ab-02b8a42a96aa}", + "p": { + "a": 0, + "k": [ + 384, + 128 + ] + }, + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + } + }, + { + "ty": "rc", + "nm": "Rect", + "mn": "{0776f2df-2619-415c-b10d-f648f2edfa0f}", + "d": 1, + "p": { + "a": 0, + "k": [ + 128, + 384 + ] + }, + "s": { + "a": 0, + "k": [ + 200, + 200 + ] + }, + "r": { + "a": 0, + "k": 0 + } + }, + { + "ty": "sr", + "nm": "Triangle", + "mn": "{db373594-d0ae-44ff-9295-30ff72616af2}", + "p": { + "a": 0, + "k": [ + 384, + 384 + ] + }, + "or": { + "a": 0, + "k": 100 + }, + "r": { + "a": 0, + "k": 0 + }, + "pt": { + "a": 0, + "k": 3 + }, + "sy": 2, + "os": { + "a": 0, + "k": 0 + } + }, + { + "ty": "tm", + "nm": "Trim Path", + "mn": "{dcd7570f-5105-485b-bd43-42ad990b01e8}", + "s": { + "a": 0, + "k": 0 + }, + "e": { + "a": 0, + "k": 50 + }, + "o": { + "a": 0, + "k": 0 + }, + "m": 1 + }, + { + "ty": "st", + "nm": "Stroke", + "mn": "{0930ce27-c8f9-4371-b0cf-111a859abfaf}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 20 + } + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-32-gb62899be" +} +} diff --git a/examples/zig-zag.json b/examples/zig-zag.json new file mode 100644 index 00000000..b87d81e6 --- /dev/null +++ b/examples/zig-zag.json @@ -0,0 +1,178 @@ +{ +"v": "5.5.7", +"ip": 0, +"op": 180, +"nm": "Animation", +"mn": "{8f1618e3-6f83-4531-8f65-07dd4b68ee2e}", +"fr": 60, +"w": 512, +"h": 512, +"assets": [ +], +"layers": [ + { + "ddd": 0, + "ty": 4, + "ind": 0, + "st": 0, + "ip": 0, + "op": 180, + "nm": "Layer", + "mn": "{85f37d8b-1792-4a4f-82d2-1b3b6d829c07}", + "ks": { + "a": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "shapes": [ + { + "ty": "gr", + "nm": "PolyStar", + "mn": "{9199543e-3552-4e51-a802-623f2a4a2ca1}", + "it": [ + { + "ty": "sr", + "nm": "PolyStar", + "mn": "{57cff206-c227-4a14-a679-195157be886b}", + "p": { + "a": 0, + "k": [ + 256, + 256 + ] + }, + "or": { + "a": 0, + "k": 222.72242736816406 + }, + "ir": { + "a": 0, + "k": 111.36121368408203 + }, + "r": { + "a": 0, + "k": 358.67291259765625 + }, + "pt": { + "a": 0, + "k": 5 + }, + "sy": 1, + "os": { + "a": 0, + "k": 0 + }, + "is": { + "a": 0, + "k": 0 + } + }, + { + "ty": "zz", + "nm": "Zig Zag", + "mn": "{b4af429a-546e-4728-a869-711a404c55ae}", + "r": { + "a": 0, + "k": 0 + }, + "s": { + "a": 0, + "k": 10 + }, + "pt": { + "a": 0, + "k": 2 + } + }, + { + "ty": "st", + "nm": "Stroke", + "mn": "{0930ce27-c8f9-4371-b0cf-111a859abfaf}", + "o": { + "a": 0, + "k": 100 + }, + "c": { + "a": 0, + "k": [ + 1, + 0.9803921568627451, + 0.2823529411764706 + ] + }, + "lc": 2, + "lj": 2, + "ml": 0, + "w": { + "a": 0, + "k": 3 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 249.3134328358209, + 254.47164179104476 + ] + }, + "p": { + "a": 0, + "k": [ + 249.3134328358209, + 254.47164179104476 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ] + } +], +"meta": { + "g": "Glaxnimate 0.4.6-26-g7b05e75c" +} +} + diff --git a/expressions/index.html b/expressions/index.html new file mode 100644 index 00000000..7730827e --- /dev/null +++ b/expressions/index.html @@ -0,0 +1,3481 @@ + + + + + + + + + + + + + + Expressions - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ + +
+ +
+
+
+ +

Expressions

+ + +

Properties can have expressions associated with them, +when this is the case the value of such properties can be modified by using the expression.

+

The expression language is based on JavaScript / ECMAScript.

+

For the most part it uses what is described in the After Effects expressions.

+

More resources on AE expressions:

+ +

Global objects

+

$bm_rt

+ + + + + + + + + + + + + + + + + +
Name$bm_rt
TypeDepends on the property
Description +

Output value for the expression

+
Notes +

Must be declared and be assigned a value in every expression

+
+

The special variable $bm_rt is used to determine the value of the expression.

+

This variable must be declared by the expression and must have a value compatible with the property;

+
var $bm_rt;
+$bm_rt = 60;
+
+
+ + + + + + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+

time

+ + + + + + + + + + + + + + + + + +
Nametime
Typenumber
Description +

The current time within the composition in seconds

+
Notes +

Read only

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

value

+ + + + + + + + + + + + + + + + + +
Namevalue
TypeDepends on the property
Description +

The value the property would have without expressions

+
Notes +

Read only

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

thisProperty

+ + + + + + + + + + + + + + + + + +
NamethisProperty
TypeProperty
Description +

Property the expression is operating on

+
Notes +

Read only

+
+

thisComp

+ + + + + + + + + + + + + + + + + +
NamethisComp
TypeComposition
Description +

Composition the property is in

+
Notes +

Read only

+
+

thisLayer

+ + + + + + + + + + + + + + + + + +
NamethisLayer
TypeLayer
Description +

Layer the property is in

+
Notes +

Read only

+
+

Animation Structure functions

+

comp()

+

Synopsis

+
comp (
+    name: string
+): Composition
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
namestring +

Composition name

+
+

Return

+ + + + + + + + + +
TypeComposition
Description +

Composition object matching the given name

+
+

Misc Functions

+

posterizeTime()

+

Synopsis

+
posterizeTime (
+    fps: number
+)
+
+

+

The rest of the expression will only be updated this many times per second

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
fpsnumber +

Frames per second

+
+

timeToFrames()

+

Synopsis

+
timeToFrames (
+    time: number = time + thisComp.displayStartTime
+    fps: number = 1.0 / thisComp.frameDuration
+): number
+
+

+

Converts a time in seconds to a number of frames

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
timenumbertime + thisComp.displayStartTime +

Time in seconds

+
fpsnumber1.0 / thisComp.frameDuration +

Frames per second

+
+

Return

+ + + + + + + + + +
Typenumber
Description +

Number of frames

+
+

framesToTime()

+

Synopsis

+
framesToTime (
+    frames: number
+    fps: number = 1.0 / thisComp.frameDuration
+): number
+
+

+

Converts a number of frames to a time in seconds

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
framesnumber +

Number of frames

+
fpsnumber1.0 / thisComp.frameDuration +

Frames per second

+
+

Return

+ + + + + + + + + +
Typenumber
Description +

Time in seconds

+
+

rgbToHsl()

+

Synopsis

+
rgbToHsl (
+    rgb: array[3]|array[4]
+): array[3]|array[4]
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
rgbarray[3]|array[4] +

RGB(A) color, with components in 0, 1

+
+

Return

+ + + + + + + + + +
Typearray[3]|array[4]
Description +

HSL(A) color, with components in 0, 1

+
+

hslToRgb()

+

Synopsis

+
hslToRgb (
+    hsl: array[3]|array[4]
+): array[3]|array[4]
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
hslarray[3]|array[4] +

HSL(A) color, with components in 0, 1

+
+

Return

+ + + + + + + + + +
Typearray[3]|array[4]
Description +

RGB(A) color, with components in 0, 1

+
+

createPath()

+

Synopsis

+
createPath (
+    points: array
+    in_tangents: array = []
+    out_tangents: array = []
+    is_closed: boolean = true
+): Path
+
+

+

Creates bezier path data

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointsarray +

Array of points (each point is a list with 2 numbers)

+
in_tangentsarray[] +

Array of in tangents correponding to the point with the same index

+
out_tangentsarray[] +

Array of out tangents correponding to the point with the same index

+
is_closedbooleantrue +

Whether the path is closed

+
+

Return

+ + + + + +
TypePath
+

Math functions

+

add()

+

Synopsis

+
add (
+    a: any
+    b: any
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aany
bany
+

Return

+ + + + + +
Typeany
+

If a and b are numbers, it will return their sum.

+

If they string, their concatenation.

+

If they are vectors, their element-wise sum.

+

If one is a vector and the other a number, it will return the sum of the number by the first element of the vector.

+

This function is also available as $bm_sum and sum.

+

sub()

+

Synopsis

+
sub (
+    a: any
+    b: any
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aany
bany
+

Return

+ + + + + +
Typeany
+

If a and b are numbers, or can be converted to numbers, it will return their difference.

+

If they are vectors, their element-wise difference.

+

This function is also avilable as $bm_sub.

+

mul()

+

Synopsis

+
mul (
+    a: any
+    b: any
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aany
bany
+

Return

+ + + + + +
Typeany
+

If a and b are numbers, or can be converted to numbers, it will return their product.

+

If one of them is a vector and the other a number, it will return a vector with each element multiplied by the number.

+

This function is also avilable as $bm_mul.

+

div()

+

Synopsis

+
div (
+    a: any
+    b: any
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aany
bany
+

Return

+ + + + + +
Typeany
+

If a and b are numbers, or can be converted to numbers, it will return their division.

+

If one of them is a vector and the other a number, it will return a vector with each element divided by the number.

+

This function is also avilable as $bm_div.

+

mod()

+

Synopsis

+
mod (
+    a: any
+    b: any
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aany
bany
+

Return

+ + + + + +
Typeany
+

clamp()

+

Synopsis

+
clamp (
+    value: number
+    minimum: number
+    maximum: number
+): number
+
+

+

Clamps a value inside a range

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
valuenumber +

The value to clamp

+
minimumnumber +

Minimum value

+
maximumnumber +

Maximum value

+
+

Return

+ + + + + +
Typenumber
+

normalize()

+

Synopsis

+
normalize (
+    vector: array
+): number
+
+

+

Divides a vector by its length

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
vectorarray
+

Return

+ + + + + + + + + +
Typenumber
Description +

same as div(vector, length(vector))

+
+

length()

+

Synopsis

+
length (
+    vector: array
+): number
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
vectorarray
+

Return

+ + + + + + + + + +
Typenumber
Description +

length of vector

+
+

Synopsis

+
length (
+    a: array
+    b: array
+): number
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
aarray
barray
+

Return

+ + + + + + + + + +
Typenumber
Description +

Distance between a and b.

+
+

looAt()

+

Synopsis

+
lookAt (
+    from_point: array[3]
+    to_point: array[3]
+): number
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
from_pointarray[3]
to_pointarray[3]
+

Return

+ + + + + + + + + +
Typenumber
Description +

length of vector

+
+

seedRandom()

+

Synopsis

+
seedRandom (
+    seed: number
+)
+
+

+

Sets the seed for random functions

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
seednumber
+

random()

+

Synopsis

+
random (): number
+
+

Return

+ + + + + + + + + +
Typenumber
Description +

Random number between 0 and 1

+
+

Synopsis

+
random (
+    max: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
maxnumber|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Random number between 0 and max, element wise if the argument is an array

+
+

Synopsis

+
random (
+    min: number|array
+    max: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
minnumber|array
maxnumber|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Random number between min and max, element wise if the arguments are arrays

+
+

linear()

+

Synopsis

+
linear (
+    t: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between 0 and 1

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Linear interpolation between value1 and value2

+
+

Synopsis

+
linear (
+    t: number
+    t_min: number
+    t_max: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between t_min and t_max

+
t_minnumber +

Lower bound for the t range

+
t_maxnumber +

Lower bound for the t range

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Linear interpolation between value1 and value2, t is first normalized inside t_min and t_max

+
+

ease()

+

Works the same as linear() but with a smooth cubic interpolation.

+

Synopsis

+
ease (
+    t: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between 0 and 1

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2

+
+

Synopsis

+
ease (
+    t: number
+    t_min: number
+    t_max: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between t_min and t_max

+
t_minnumber +

Lower bound for the t range

+
t_maxnumber +

Lower bound for the t range

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2, t is first normalized inside t_min and t_max

+
+

easeIn()

+

Interpolation, starts the same as ease() and ends the same as linear()

+

Synopsis

+
easeIn (
+    t: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between 0 and 1

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2

+
+

Synopsis

+
easeIn (
+    t: number
+    t_min: number
+    t_max: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between t_min and t_max

+
t_minnumber +

Lower bound for the t range

+
t_maxnumber +

Lower bound for the t range

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2, t is first normalized inside t_min and t_max

+
+

easeOut()

+

Interpolation, starts the same as linear() and ends the same as ease()

+

Synopsis

+
easeOut (
+    t: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between 0 and 1

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2

+
+

Synopsis

+
easeOut (
+    t: number
+    t_min: number
+    t_max: number
+    value1: number|array
+    value2: number|array
+): number|array
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Interpolation factor between t_min and t_max

+
t_minnumber +

Lower bound for the t range

+
t_maxnumber +

Lower bound for the t range

+
value1number|array
value2number|array
+

Return

+ + + + + + + + + +
Typenumber|array
Description +

Interpolation between value1 and value2, t is first normalized inside t_min and t_max

+
+

degreesToRadians()

+

Synopsis

+
degreesToRadians (
+    degrees: number
+): number
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
degreesnumber +

Angle in degrees

+
+

Return

+ + + + + + + + + +
Typenumber
Description +

Angle in radians

+
+

radiansToDegrees()

+

Synopsis

+
radiansToDegrees (
+    radians: number
+): number
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
radiansnumber +

Angle in radians

+
+

Return

+ + + + + + + + + +
Typenumber
Description +

Angle in degrees

+
+ + +

Property

+

Property.value

+ + + + + + + + + + + + + + + + + +
Namevalue
TypeDepends on the property
Description +

The current value the property

+
Notes +

Read only

+
+

Property.numKeys

+ + + + + + + + + + + + + + + + + +
NamenumKeys
Typenumber
Description +

Number of keyframes

+
Notes +

Read only

+
+

Property.propertyIndex

+ + + + + + + + + + + + + + + + + +
NamepropertyIndex
Typenumber
Description +

Value of ix in the JSON for this property

+
Notes +

Read only

+
+

Property.valueAtTime()

+

Synopsis

+
valueAtTime (
+    t: number
+): any
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Time in seconds

+
+

Return

+ + + + + + + + + +
TypeDepends on the property
Description +

The value of the property at the given time (without expressions)

+
+

Property.getVelocityAtTime()

+

Synopsis

+
getVelocityAtTime (
+    t: number
+): any
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Time in seconds

+
+

Return

+ + + + + + + + + +
TypeDepends on the property
Description +

The rate of change for the property, with the same dimensions as the value

+
+

Property.getSpeedAtTime()

+

Synopsis

+
getSpeedAtTime (
+    t: number
+): number
+
+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
tnumber +

Time in seconds

+
+

Return

+ + + + + + + + + +
Typenumber
Description +

The rate of change for the property as a scalar

+
+

Property.smooth()

+

Synopsis

+
smooth (
+    width: number
+    samples: number
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
widthnumber
samplesnumber
+

Return

+ + + + + +
TypeDepends on the property
+

Property.loopIn()

+

Synopsis

+
loopIn (
+    type: string
+    duration: number
+    wrap: boolean
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
typestring
durationnumber
wrapboolean
+

Return

+ + + + + +
TypeDepends on the property
+

Property.loopOut()

+

Synopsis

+
loopOut (
+    type: string
+    duration: number
+    wrap: boolean
+): any
+
+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
typestring
durationnumber
wrapboolean
+

Return

+ + + + + +
TypeDepends on the property
+

Composition

+

Composition object

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

As a function

+

As a function a composition object can give you access to the layers by name or index

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

Composition.numLayers

+ + + + + + + + + + + + + +
NamenumLayers
Typenumber
Description +

Number of layers in the composition

+
+

Composition.width

+ + + + + + + + + + + + + +
Namewidth
Typenumber
Description +

Width of the composition, same as w in the JSON

+
+

Composition.height

+ + + + + + + + + + + + + +
Nameheight
Typenumber
Description +

Height of the composition, same as h in the JSON

+
+

Composition.displayStartTime

+ + + + + + + + + + + + + +
NamedisplayStartTime
Typenumber
Description +

Start time of the composition, in seconds. Similar to ip in the JSON but converted into seconds

+
+

Composition.frameDuration

+ + + + + + + + + + + + + +
NameframeDuration
Typenumber
Description +

Duration of a frame in second, reciprocal of frames per second

+
+

Composition.pixelAspect

+ + + + + + + + + + + + + +
NamepixelAspect
Typenumber
Description +

Pixel aspect ratio, generally 1

+
+

Composition.layer()

+

Synopsis

+
layer (
+    layer: number|string
+): Layer
+
+

+

Returns the given layer

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
layernumber|string +

Layer name or index

+
+

Return

+ + + + + +
TypeLayer
+ + +

Layer

+

Layer object.

+

Note that it also has all the attributes from Transform.

+

Layer.index

+ + + + + + + + + + + + + +
Nameindex
Typenumber
Description +

Layer index, same as ind in the JSON

+
+

Layer.inPoint

+ + + + + + + + + + + + + +
NameinPoint
Typenumber
Description +

Same as ip in the JSON but in seconds

+
+

Layer.outPoint

+ + + + + + + + + + + + + +
NameoutPoint
Typenumber
Description +

Same as op in the JSON but in seconds

+
+

Layer.startTime

+ + + + + + + + + + + + + +
NamestartTime
Typenumber
Description +

Same as st in the JSON but in seconds

+
+

Layer.transform

+

Transform attributes can also be accessed from the layer object directly

+ + + + + + + + + + + + + +
Nametransofrm
TypeTransform
Description
+

Layer.source

+ + + + + + + + + + + + + +
Namesource
Typestring
Description +

For layers referencing an asset, the id of that asses. (Same as refId in the JSON)

+
+

Layer.width

+ + + + + + + + + + + + + +
Namewidth
Typenumber
Description +

Same as Layer.sourceRectAtTime().width

+
+

Layer.height

+ + + + + + + + + + + + + +
Nameheight
Typenumber
Description +

Same as Layer.sourceRectAtTime().height

+
+

Layer.hasParent

+ + + + + + + + + + + + + +
NamehasParent
Typeboolean
Description +

Whether the layer has a parent

+
+

Layer.parent

+ + + + + + + + + + + + + +
Nameparent
TypeLayer
Description +

Parent layer

+
+

Layer.sourceRectAtTime

+

Synopsis

+
sourceRectAtTime (): object
+
+

Return

+ + + + + + + + + +
Typeobject
Description +

Object with these attributes

+
+

Layer.effect

+

Synopsis

+
effect (
+    effect: number|string
+): Effect
+
+

+

Returns the given effect

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
effectnumber|string +

Name or index

+
+

Return

+ + + + + +
TypeEffect
+

Layer.contents

+

Synopsis

+
contents (
+    shape: number|string
+): Shape
+
+

+

For shape layers, returns the given shape

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
shapenumber|string +

Name or index

+
+

Return

+ + + + + +
TypeShape
+

Layer space transforms

+

These methods convert between coordinates systems within a layer.

+

Some of these functions have a Vec suffix, which means they should be used +for difference between points (the version without this suffix is for points).

+

Layer.toComp

+

Synopsis

+
toComp (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a point from Layer coordinates to composition coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Point

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.fromComp

+

Synopsis

+
toComp (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a point from composition coordinates to Layer coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Point

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.toCompVec

+

Synopsis

+
toComp (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a vector from Layer coordinates to composition coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Vector

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.fromCompVec

+

Synopsis

+
toComp (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a vector from composition coordinates to Layer coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Vector

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.toWorld

+

Synopsis

+
toWorld (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a point from Layer coordinates to world coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Point

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.fromWorld

+

Synopsis

+
toWorld (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a point from world coordinates to Layer coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Point

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.toWorldVec

+

Synopsis

+
toWorld (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a vector from Layer coordinates to world coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Vector

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+

Layer.fromWorldVec

+

Synopsis

+
toWorld (
+    point: Array
+    time: number = time
+): Array
+
+

+

Maps a vector from world coordinates to Layer coordinates

+

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
NameTypeDefaultDescription
pointArray +

Vector

+
timenumbertime +

Time

+
+

Return

+ + + + + +
TypeArray
+ + +

Transform

+ + + + + + + + + + + + + +
NameanchorPoint
Typearray[2]
Description +

Value of a

+
+ + + + + + + + + + + + + +
Nameposition
Typearray[2]
Description +

Value of p

+
+ + + + + + + + + + + + + +
Namescale
Typenumber
Description +

Value of s

+
+ + + + + + + + + + + + + +
Namerotation
Typenumber
Description +

Value of r

+
+ + + + + + + + + + + + + +
Nameopacity
Typenumber
Description +

Value of o

+
+ + + + + + + + + + + + + +
Nameskew
Typenumber
Description +

Value of sk

+
+ + + + + + + + + + + + + +
NameskewAxis
Typenumber
Description +

Value of sa

+
+

Effect

+ + + + + + + + + + + + + +
Nameactive
Typeboolean
Description +

Whether the effect is active

+
+

Effect()

+

Synopsis

+
 (
+    property: number|string
+): number|Array
+
+

+

Returns the value for the given property of the effect

+

+

Parameters

+ + + + + + + + + + + + + +
NameTypeDefaultDescription
propertynumber|string +

Name or index of the property

+
+

Return

+ + + + + +
Typenumber|Array
+
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/Karla-Bold.ttf b/fonts/Karla-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c805e5eed3d01e27052318563d5223d1e1e55288 GIT binary patch literal 38364 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 R2f^$~Mixdc8)G%H{2$-gw0r;n literal 0 HcmV?d00001 diff --git a/fonts/Karla-Italic-VariableFont_wght.ttf b/fonts/Karla-Italic-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e027584b84e49fc686bc1d74d87b00df2fa2c26a GIT binary patch literal 76376 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 QDJqRE!fJL8==l5p0((KNzW@LL literal 0 HcmV?d00001 diff --git a/fonts/Karla-VariableFont_wght.ttf b/fonts/Karla-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e5bf896943681c43911cb12f76a549d893c6b0ef GIT binary patch literal 78356 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 D*$Irq literal 0 HcmV?d00001 diff --git "a/fonts/Type-\303\230-Tones-Arboria-Black.otf" "b/fonts/Type-\303\230-Tones-Arboria-Black.otf" new file mode 100644 index 0000000000000000000000000000000000000000..67c1d6bc906e4c27db20e35e9064593a633785ab GIT binary patch literal 63444 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 literal 0 HcmV?d00001 diff --git "a/fonts/Type-\303\230-Tones-Arboria-Bold.otf" "b/fonts/Type-\303\230-Tones-Arboria-Bold.otf" new file mode 100644 index 0000000000000000000000000000000000000000..451829df30b70fbb00918bbb0d37d6406d2174d8 GIT binary patch literal 65620 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 F{RbP0M!*07 literal 0 HcmV?d00001 diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..7c79c6a6bc9a128a2a8eaffbe49a4338625fdbc2 GIT binary patch literal 38205 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 E0QL`y%>V!Z literal 0 HcmV?d00001 diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..45fdf338 --- /dev/null +++ b/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e89738de5eaf8fca33a2f2cdc5cb4929caa62b71 GIT binary patch literal 80652 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 qx{Kk=rVu5YQ9XR<GPS>b$X_& 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 z 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
V$fDV|Iw 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 + + + + + + + + + + + + + diff --git a/img/chevron-left.svg b/img/chevron-left.svg new file mode 100644 index 00000000..f7e40349 --- /dev/null +++ b/img/chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/chevron-right.svg b/img/chevron-right.svg new file mode 100644 index 00000000..97a15495 --- /dev/null +++ b/img/chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..acac5ddae9df8323aa778583d517c54f4740b0ac GIT binary patch literal 959 zcmV;w13>(VP)C0000gP)t-sM{rC4 z-LnAQvjE+*0Nt|y-LnAQvjE+*|NsBt{Ptz)&okq}y!Pvo@ZH7%EF1s;00(qZPE!Eo zAXR_7sNpYF{r~_2JxN4CRCt`lo7;k`APhwnFC9hx|96k*X{&*xk_3|HneOFIfL4;O z%ZGErI8S~55=Y-p^Efz%2<6pxaSiP&MTB@PKdXv=Am&F1Zk(#f9|+U<3&9QbCD z0Y~Vo0PNz+-z65DpzkWk-_?%@=wGV?tXrZUJwPo`2FT0ru{HtlAvOP34m1Hg_V|qe zQ2QIDU`6e3Q-q{`gJtMxeS9la0>Gbt`CB%$0Mr1o^}lRe2=OeU4kI0ajQ)NCk*A<8 zK(hbru0K*&0!RvgI)5twBncpkt^z=KzUHa`zyy@(D*%85;Co&rfEDDw^#7#*U<<|% zomv3*3S3I+Uj+adP*{Kp0KkB9eIdXKzWy^lLI!X*U}G2{0{{k;SD+N&z6Ws_Z^AMF@MBbHKsf;TDI(c} zcmUwXu&e?Z0N`ze*nmO+_%=qk1d9QZw?WbhECfhihszUC0^kGGS4hBf0H0n(v3?Bm z06e^hQ%k@PfaB^j#2d&&T}z(?h_2(W;dS&001w}QR?#N_XnlFnanpz)I*B zy$~GkwtU$#q%Q!u0B8#bxQmbXaQgCO56OQ1zPnJK zUIKCes5YK=8%`zh7?XV?lX)wbc{7`NJD+(&qj^iGeN(G>Td#Rzvwdr~d2_pcd%yXB zgZ+qy`H+kKn2*7rQ!?<@cr7NQUiQOo=Hq@1D-juZ?CeKA?T23N$9_BW!RONj)6wq} h!F2fjWN0=1{|`kSudaBjm^}ah002ovPDHLkV1jX_qQL+F literal 0 HcmV?d00001 diff --git a/img/grid1.png b/img/grid1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c493aba57b3dcf7f3092dd76e01774a36e1f70 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YjLblhj}pEoffQSSPlzj!27;yOJI@0t#*!ev zU^jKvj>D^vLFrV5@Av&@Hg>PSlePTq|IY&m Y?Bzen8XRii;RN}?)78&qol`;+0ET;rjj7P zUL+`;IEGZjy}jkQs>MKn<-(!KJ3e|8&h4E(JD5vIO`U`5??0t8=`H38 zCYh@yy}5bMitA;G)!*;W;wLShyEgX!;`C~}v&narLrbjY{_Bl2SAYNGYV9BEeX(CX zIOqB;ug|z9oBZiqGT-yk{*VhVOLj$uJ1xKbvh0SE)m*>nzH6=ng>sz!`7OU(>i6V* ziB;@#7YHXM2*f#3z5Mc7D{Gy(e%lY9QhNbX`@F?(`Rh45u3vmvGFSMg^<2N}mJ>a} zocBQcUeCD!R@UUV{Ipt$A5h1+&T84Ye&y>gTQ0o((n`H3!fNii;zxTggS6jf0c+<2 zIt*+UP$JHK`Q^K>p*m%z0gXvKYh^Vz@7hg}x#v1d8bFquxDRyqxz0ae8^O9Qfo`0B zcvfkN)!j9l4_|s&V!b8@=m<2WP<=jK*wn%te3JLU5ynUD+iP?{(dOyu=d#Wzp$P!R C0{065 literal 0 HcmV?d00001 diff --git a/img/grid11.png b/img/grid11.png new file mode 100644 index 0000000000000000000000000000000000000000..ef37b27e06d21940965e3662000f99bb9f714dde GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YjLblhj}pEoffQSSPl)S(FbJ*rngbMJED7=p zW^j0RBMrz|>gnPbQW5v|oS`6tf&jDQ5rvj-Z}(m*XHat5IdhBo=InA-`@;IgXYB_N Z{AbRVdS&*gHV@=222WQ%mvv4FO#pQROGE$w literal 0 HcmV?d00001 diff --git a/img/grid12.png b/img/grid12.png new file mode 100644 index 0000000000000000000000000000000000000000..3f100c41ab3dbd3e80aaeaef07057b689eb14208 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8Yj6eZ~$7>&{11YAGAirP+hO)_LEr7heo-U3d z6^w5$oD_915Ma1a>DL!^q3f2&8s;p8>OVQl&wNX^-B$enpU%W>QOA$Z-J)0b=f}s# i$NS~&2bz)gshZ)NdH@fLcq!033=E#GelF{r5}E)XvW0m7 literal 0 HcmV?d00001 diff --git a/img/grid13.png b/img/grid13.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0d83f3af56f947e5f8d4f0031a10c6d2766ce1 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YjLblhj}pEoffQSSPl)S(FbJ*rngbMJED7=p zW^j0RBMr#ehjcb>g%{ht>=jDMW jeEIWnInW;L%==8Y9-OUOnY2_M=z0cES3j3^P6&{11YAGAirP+hO)_LEr7h0o-U3d z6^w7M9AtEMU~oM+U*%vRr&r*tNu>_l3@3IROenAPoK-Vfuk@bhY_0W{?S7wa&VN3< zYOVQyoAdgge;xm9v%VfELI&e`#k}WV`=3|F{U^Y9uW|nKo`1dmChwe2di~D_dBxM! K&t;ucLK6V42YIOg literal 0 HcmV?d00001 diff --git a/img/grid15.png b/img/grid15.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0417a5d4d9713ed1ddcfe0cbdb91da24273143 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffQ$ePlzj!{tpJl6-$$W9Hx>W zzhH)j+1h>*K=pB+E{-7;jBjtYcW!VHal5!&)Q8h-sqBq8zO#}UpM8G5VK@7a2cHs@ zlw8gJ2d%01ni&6C{>%LrB~?3rhrRz76Z=uVZ29GvQR(GYbJvx^nRP$01tGVyi6<@yyH1)C-$kr&J>{dUJN!vL=mX(9mUAsBgZ#h^CSQ%C;;ZFN* zmI(B~yLAv}q8pko406u%bub4ac@*r{UAxc4!rg%6n|o?jToXKw%nv&!1`KxwPgg&e IbxsLQ00E-nuK)l5 literal 0 HcmV?d00001 diff --git a/img/grid16.png b/img/grid16.png new file mode 100644 index 0000000000000000000000000000000000000000..984454f49d69835c0f85405fb519b07b4a03d838 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffP@GPl)S(B=B`9UolXexg^Lh zn4#f7)WmtJKs`~OE{-7;ac^&Lpp>^m41Y z>q^Uj8ln))@ALQD?Y{i7qQ{f Vsk7s_5-`viJYD@<);T3K0RaA@>23f3 literal 0 HcmV?d00001 diff --git a/img/grid17.png b/img/grid17.png new file mode 100644 index 0000000000000000000000000000000000000000..fe48c9dd67a4d0104ef7451d9fcc5960361ffa35 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffP@GPlzj!{tp8d2dq~B`OGCj ze!&b4J*vMa&jad-@^oA7d*LUtinNQWuKvl%% zDYZlN&eb!Y=n1uL`s@V|YqzhT3}a58{bBuLi0Jg$8!f;xePoSb%z&zrdW5}KyY zn^5X^X_LzBA6GYp+05`*e);9~`SQEPUzS+y{l0m>{rUXrqs+VOU0#&zx^{D}-}3Ca zcVCvQwQh3|wb@`j*YA5=db!oyb){uMeNiChyZ<2eR=?LE4VkiY{mSE>@96{SyLJ(% zaWha)dH$hyC02KBy~|?-5^sX5yKDtCYR|b!paIvd)-Hw_ey;_j=eyPJ%Mi2H zl}5QQzkGLg0j5@<6|t}1_yOH=4rJS2PLQ7WrN%En;&8|1AKJ?aazDrzh@(Hl4F}o` v((_#nXiE0n??4wJtE(1%=X(L@irtKrRpG`xlUa`dW zzhDO6x_=);f$IG|T^vIy7~ftqWNc7ia6M=*6)@Fe$^sV6PR0i-H{Cl{zjCM1TaWoa zm)NRa=ChjnPrUY9tohG*%P+rdf3@q}v5PNv`CY&GvLtr->lY=v)?F?wv5LL^(#mS? zy4N`}bN#NDn)UfDe{Ci0zWj3O+}_2PU+x0)W5N7&AU?A8&4nQCH!V=KUoXX>C;c(V yO6urAIJ-m^;C-sIM9suOj3zE-%SxHR|WaY)78&qol`;+07Qp{vH$=8 literal 0 HcmV?d00001 diff --git a/img/grid20.png b/img/grid20.png new file mode 100644 index 0000000000000000000000000000000000000000..30e3faeaf7ea78d396cc74d350a0e456dc459560 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffQ$ePl)S(80hnQ`VT0`R1)MD z%-~!1?}I2%{X|a}$B>G+x3>(r4jYIt2TYuta&qFFo8J1@gUeR@jNL84{>Q3i8rwa! zoFyvheWCrmC029)#r^aw+PZsdxNTM6`|VX{s#C@1`YpFteqDFcx@b}V{Kxkr*XJy} z{PGKX>fO+XG5uW6E7!kSaQS6P zuCtv`&XN}(&X$GfYR_`c_1kV)xNh;~muBj}%B|++6)&2+2*kP61~(y~OJ7GZ%jE<(I#1*wp8@{Iu0y zYmmJc`G5|dEez%C2YP6>FxUz0OE15yiimVa^BbB{s6Nk&*wo%_f%xqw!-FG?k1|^V R?SWCn;OXk;vd$@?2>^Y2`>Fr{ literal 0 HcmV?d00001 diff --git a/img/grid3.png b/img/grid3.png new file mode 100644 index 0000000000000000000000000000000000000000..4617c9d981cbfd853a1f26f2fc23551f5db55343 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YjLblhj}pEoffQSSPlzj!27;yOJI@0t#*!ev zUf8IzarXUY zKQ4YQk6-`X|NQ;id*|8P*8h3&^YZ88{cz^;=lwv@s((K&f5yp_2P?P;Qh=4|e_kGF j!k0fEmjms=&b-fb>%rNol}StGL0bP0l+XkKyNQLl literal 0 HcmV?d00001 diff --git a/img/grid4.png b/img/grid4.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1f1801b129d2c80047823fa45dff8a7b40b08c GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YjLblhj}pEoffQSSPlzj!27;yOJI@0t#*!ev zUGm};{#E&`a^Car zS9SkC|Cv|u_i^RC>-O`WSK?#*KKj{aeZ9^3&%ch7$+-LBS2=@v&<=(M>)lU5j`wu+ Kb6Mw<&;$U~w|7eb literal 0 HcmV?d00001 diff --git a/img/grid5.png b/img/grid5.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d710e03008c0416911a07c095bc55eb6182b54 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffQ$ePlzj!hJfbemj{3>rjj7P zV1|a-+I|v1^>Lmqjv*C{Z*R7DZg3EBySQA`htq7S?2S3TvyvH~eSW@SH~WtVpAwXm zT+RLmt*Q5#82?%R%l#K6RXcx&z5f>z`%%7Z`Q?{U>E%{)*OkJVbwB!_oy!Mt-&yUx z{IX>2X6w0r*Wt`}xrc7E%=Ih3zVr2ql3mv_WkHf_7embf%DyYHx*LmRru*{C`xj=< zz5B9c*LF^;x$o8$U%v=6^|BSn)+nItRzHwQ+c`m&m4nq?yE)fyIamu=8CEOdPWx__ z2=u_abr5Hw8=5Z+a?bO0Fb5)e6ztYryU)eK-GJnqdumo(6FiR04?8CYiUChoKbLh* G2~7a9w%t(x literal 0 HcmV?d00001 diff --git a/img/grid6.png b/img/grid6.png new file mode 100644 index 0000000000000000000000000000000000000000..71b4148db2e42061888a8e7d9edc23bd093408a8 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffP@GPlzj!h6B@==F@;2=8_=4 zV1|YRQ4{B>0`=s0x;TbZFuuKgd}gx)PeWku-2*1i|3xogJmBuWZq}D4XJ5X3`QKnc z$BMvzdv>PRJQmY!pJ!Q8RT=X)+WnCEmUl%jN_Jh#l%4B$-D>UP%P*srmjd}$-`WOn z-oIdFHTT^Pzt@;5eif~?j(!#8zWlQ6byU4pv9GuE-Aj7$O>Ik`-*W49mw{%iD+Q_C z3NdJ_jMdz{d?%2hkKs0gbgi4~w>*39wTmxHs)aF3z7BWhcJqa$C02I}!7A5Y-c^Qb z{$5UyFZzIv0GbwidLhI|U|0Dqzdak~rCTpCd~J32UJJkisc@b)>BI84 z&xeDRq*j(#&GlP;`Q?{iLD4Rc=lwQ1qq1nC7f=8szJ71i`iJL5FB*J5F920mb~SE& zRJ(n+i}KB7Q$QL^tnSK|{VAE&;id&PsKn~;kIhDZSAY#ze);X|JNKc?r)p=QDq{1L z+97)9>X}dUgxWTJ_5z5t+t*KqF{jV|uzoQ_bo%TK%a_8K6J#N3^~@E`9U=Pj;?-eH zJ@dqOP=6H(f7=3K-c5X}_5#9us`doI#B|@TJ1uuuAWq$7y#~&_bA)qZsk_&CD_18_ O40yWwxvX0`+8ix;TbZ#J#<}aczr%i0i@Kx7aj}p0x>NRNYZ$mg?&EVM2o056*)u z;Z~d0yjM}4pYrp+@u#;xJ}AxgTmHWM-@mA?7EhFoUgQIgY{g$@^zbmFD(PA@_YRPs4PkU5gel28^sdC}?oOadFhk!-S^>3!#ba^kyliDP_ubu=yDv+270(5c*KPuxnhj#U zSKBjt!R41x%S%B9ZUNf1dwp@dJH)Y2EB4MtcCOXjb)`{21$$?I$ZLW-4s69fBxiw` scXx9FJs0&n24o(>TR_L|<^&mIUs)AyTslkbJSajuUHx3vIVCg!04|Q`CIA2c literal 0 HcmV?d00001 diff --git a/img/grid9.png b/img/grid9.png new file mode 100644 index 0000000000000000000000000000000000000000..627dda51304ff75b255426e84f012d6a41d0304c GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8YOw2%$Z9B{*ffP@GPlzj!h6B@==F@;2=8_=4 zUg;&O1RM#r3(c3xYjiSFDQaZ-y!-G8o+o8(;f zwQkwPmnBsze|l}I*>|$EI=phx<(HRVEPZymckyNQi*I+m{D=D7UwS1a>AzvZt>Z?Vo@cl{<%?cH^k zL2BdDL27sVtzQgMDGk){)#_~%NM)YPT)*qDw{U|DM^X|CRPxqpFW9g$S(uV_*LN0z z?7yrBGV}Sdi!aOO#(@pn4ODr%v2VD$`G d3GrUJ%YX0`-_up!f)0Y>!_(EzWt~$(69BQE>Hz=% literal 0 HcmV?d00001 diff --git a/img/icon-right-arrow.svg b/img/icon-right-arrow.svg new file mode 100644 index 00000000..47a656b9 --- /dev/null +++ b/img/icon-right-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/icon-search.svg b/img/icon-search.svg new file mode 100644 index 00000000..d3ec9cac --- /dev/null +++ b/img/icon-search.svg @@ -0,0 +1,3 @@ + + + diff --git a/img/lf-logo-mini.svg b/img/lf-logo-mini.svg new file mode 100644 index 00000000..1f9887ef --- /dev/null +++ b/img/lf-logo-mini.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/logo-lottie.svg b/img/logo-lottie.svg new file mode 100644 index 00000000..e567487a --- /dev/null +++ b/img/logo-lottie.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/img/logo-react.svg b/img/logo-react.svg new file mode 100644 index 00000000..2d7c3d5d --- /dev/null +++ b/img/logo-react.svg @@ -0,0 +1,4 @@ + + + + diff --git a/img/logo-svelte.svg b/img/logo-svelte.svg new file mode 100644 index 00000000..89b33e8f --- /dev/null +++ b/img/logo-svelte.svg @@ -0,0 +1,4 @@ + + + + diff --git a/img/vue-logo.svg b/img/vue-logo.svg new file mode 100644 index 00000000..952f52c3 --- /dev/null +++ b/img/vue-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..c0abc5f1 --- /dev/null +++ b/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + + Home - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+ + + +
+
+
+ + +

A human's guide to the Lottie format

+

Lottie is a vector animation format, using JSON to represent its data.

+

+ This guide aims to provide a human-readable description of the format and how everything works within it. +

+ +
+ +
+
+
+

Lottie Format

+

This page describes values and other objects used throughout the Lottie format.

+
+
+

Lottie from Scratch

+

In this example, we'll build a simple lottie animation from scratch.

+
+
+

Lottie Playground

+ +
+
+
+
+ +

Lottie-Player

+

Easily embed and play Lottie animations in websites.

+
+
+ +

Lottie-React

+

Easily add Lottie animations to your React projects.

+
+
+ +

Lottie-Svelte

+

Svelte provides a Lottie player using the lottie-web library.

+
+
+ +

Lottie-Vue

+

Vue component for the Lottie Web Player.

+
+
+ +
+
+ + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/base.js b/js/base.js new file mode 100644 index 00000000..03aad550 --- /dev/null +++ b/js/base.js @@ -0,0 +1,225 @@ +function getSearchTerm() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return sParameterName[1]; + } + } +} + +$(document).ready(function() { + /** + * ------------------------------------------------------------------------ + * Taken from themes/mkdocs/js/base.js + * ------------------------------------------------------------------------ + */ + var search_term = getSearchTerm(), + $search_modal = $('#mkdocs_search_modal'), + $keyboard_modal = $('#mkdocs_keyboard_modal'); + + if (search_term) { + $search_modal.modal(); + } + + // make sure search input gets autofocus everytime modal opens. + $search_modal.on('shown.bs.modal', function() { + $search_modal.find('#mkdocs-search-query').focus(); + }); + + // Close search modal when result is selected + // The links get added later so listen to parent + $('#mkdocs-search-results').click(function(e) { + if ($(e.target).is('a')) { + $search_modal.modal('hide'); + } + }); + + if (typeof shortcuts !== 'undefined') { + // Populate keyboard modal with proper Keys + $keyboard_modal.find('.help.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.help]; + $keyboard_modal.find('.prev.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.previous]; + $keyboard_modal.find('.next.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.next]; + $keyboard_modal.find('.search.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.search]; + + // Keyboard navigation + document.addEventListener("keydown", function(e) { + if ($(e.target).is(':input')) return true; + var key = e.which || e.key || window.event && window.event.key; + var page; + switch (key) { + case shortcuts.next: + page = $('.navbar a[rel="next"]:first').prop('href'); + break; + case shortcuts.previous: + page = $('.navbar a[rel="prev"]:first').prop('href'); + break; + case shortcuts.search: + e.preventDefault(); + $keyboard_modal.modal('hide'); + $search_modal.modal('show'); + $search_modal.find('#mkdocs-search-query').focus(); + break; + case shortcuts.help: + $search_modal.modal('hide'); + $keyboard_modal.modal('show'); + break; + default: + break; + } + if (page) { + $keyboard_modal.modal('hide'); + window.location.href = page; + } + }); + } + + $('table').addClass('table table-striped table-hover'); + + // Improve the scrollspy behaviour when users click on a TOC item. + $(".bs-sidenav a").on("click", function() { + var clicked = this; + setTimeout(function() { + var active = $('.nav li.active a'); + active = active[active.length - 1]; + if (clicked !== active) { + $(active).parent().removeClass("active"); + $(clicked).parent().addClass("active"); + } + }, 50); + }); +}); + + +/** + * ------------------------------------------------------------------------ + * Taken from themes/mkdocs/js/base.js + * ------------------------------------------------------------------------ + */ + +$('#content-container').scrollspy({ + target: '.bs-sidebar', + offset: 50 +}); + +/* Prevent disabled links from causing a page reload */ +$("li.disabled a").click(function() { + event.preventDefault(); +}); + +// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes +// We only list common keys below. Obscure keys are omited and their use is discouraged. +var keyCodes = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 19: 'pause/break', + 20: 'caps lock', + 27: 'escape', + 32: 'spacebar', + 33: 'page up', + 34: 'page down', + 35: 'end', + 36: 'home', + 37: '←', + 38: '↑', + 39: '→', + 40: '↓', + 45: 'insert', + 46: 'delete', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 91: 'Left Windows Key / Left ⌘', + 92: 'Right Windows Key', + 93: 'Windows Menu / Right ⌘', + 96: 'numpad 0', + 97: 'numpad 1', + 98: 'numpad 2', + 99: 'numpad 3', + 100: 'numpad 4', + 101: 'numpad 5', + 102: 'numpad 6', + 103: 'numpad 7', + 104: 'numpad 8', + 105: 'numpad 9', + 106: 'multiply', + 107: 'add', + 109: 'subtract', + 110: 'decimal point', + 111: 'divide', + 112: 'f1', + 113: 'f2', + 114: 'f3', + 115: 'f4', + 116: 'f5', + 117: 'f6', + 118: 'f7', + 119: 'f8', + 120: 'f9', + 121: 'f10', + 122: 'f11', + 123: 'f12', + 124: 'f13', + 125: 'f14', + 126: 'f15', + 127: 'f16', + 128: 'f17', + 129: 'f18', + 130: 'f19', + 131: 'f20', + 132: 'f21', + 133: 'f22', + 134: 'f23', + 135: 'f24', + 144: 'num lock', + 145: 'scroll lock', + 186: ';', + 187: '=', + 188: ',', + 189: '‐', + 190: '.', + 191: '?', + 192: '`', + 219: '[', + 220: '\', + 221: ']', + 222: ''', +}; diff --git a/js/bootstrap-3.0.3.min.js b/js/bootstrap-3.0.3.min.js new file mode 100644 index 00000000..1a6258ef --- /dev/null +++ b/js/bootstrap-3.0.3.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/js/highlight.pack.js b/js/highlight.pack.js new file mode 100644 index 00000000..763f9c55 --- /dev/null +++ b/js/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:_,l:i,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:i,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]},l={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,c]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:l.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,l]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("swift",function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},t={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:i,c:[]},a={cN:"string",c:[e.BE,r],v:[{b:/"""/,e:/"""/},{b:/"/,e:/"/}]},o={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0};return r.c=[o],{k:i,c:[a,e.CLCM,n,t,o,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:i,c:["self",o,a,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:i,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},o,r,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[o,r,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[t.BE]},{b:'(u8?|U|L)?R"\\(',e:'\\)"'},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e,{b:/\(/,e:/\)/,k:c,r:0,c:["self",t.CLCM,t.CBCM,r,s,e]}]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("rust",function(e){var t="([ui](8|16|32|64|128|size)|f(32|64))?",r="alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default",n="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{aliases:["rs"],k:{keyword:r,literal:"true false Some None Ok Err",built_in:n},l:e.IR+"!?",i:""}]}});hljs.registerLanguage("tex",function(c){var e={cN:"tag",b:/\\/,r:0,c:[{cN:"name",v:[{b:/[a-zA-Zа-яА-я]+[*]?/},{b:/[^a-zA-Zа-яА-я0-9]/}],starts:{eW:!0,r:0,c:[{cN:"string",v:[{b:/\[/,e:/\]/},{b:/\{/,e:/\}/}]},{b:/\s*=\s*/,eW:!0,r:0,c:[{cN:"number",b:/-?\d*\.?\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?/}]}]}}]};return{c:[e,{cN:"formula",c:[e],r:0,v:[{b:/\$\$/,e:/\$\$/},{b:/\$/,e:/\$/}]},c.C("%","$",{r:0})]}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}); \ No newline at end of file diff --git a/layers/index.html b/layers/index.html new file mode 100644 index 00000000..c6e16161 --- /dev/null +++ b/layers/index.html @@ -0,0 +1,1699 @@ + + + + + + + + + + + + + + Layers - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Layers

+

Layer

+

There are several layer types, which is specified by the ty attribute:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tyLayer TypeDescription
0PrecompositionRenders a Precomposition
1Solid ColorStatic rectangle filling the canvas with a single color
2ImageRenders an Image
3Null (Empty)No contents, only used for parenting
4ShapeHas an array of shapes
5TextRenders text
6AudioPlays some audio
7Video Placeholder
8Image Sequence
9Video
10Image Placeholder
11Guide
12Adjustment
13Camera3D Camera
14Light
15Data
+

Each layer type has its own properties but there are several common properties:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name, as seen from editors and the like

+
mnstring +

Match name, used in expressions

+
ddd0-1 integer +

Whether the layer is 3D. Lottie doesn't actually support 3D stuff so this should always be 0

+
hdboolean +

Whether the layer is hidden

+
tyinteger +

Layer type, must be one of the values seen above

+
indinteger +

Layer index for parenting

+
parentinteger +

Parent index for parenting

+
srnumber +

Time Stretch

+
ipnumber +

Frame when the layer becomes visible

+
opnumber +

Frame when the layer becomes invisible

+
stnumber +

Start Time

+
ttMatte Mode +

Matte mode (see mattes)

+
td0-1 integer +

Matte target (see mattes)

+
masksPropertiesarray of Mask +

Masks for the layer

+
efarray of Custom Effect or Drop Shadow Effect or Fill Effect or Gaussian Blur Effect or Set Matte Effect or Pro Levels Effect or Stroke Effect or Tint Effect or Tritone Effect or Radial Wipe or Wavy Effect or Puppet Effect or Spherize Effect or Mesh Warp Effect or Displacement Map Effect or Twirl Effect +

Effects for the layer

+
syarray of Layer Stroke or Drop Shadow or Inner Shadow or Outer Glow or Inner Glow or Bevel Emboss or Satin or Color Overlay or Gradient Overlay +

Layer styles

+
ksTransform +

Layer transform

+
ao0-1 integer +

If 1, The layer will rotate itself to match its animated position path

+
tpinteger +

Index of the layer used as matte, if omitted assume the layer above the current one

+
hasMaskboolean +

Whether the layer has masks applied

+
mbboolean +

Whether motion blur is enabled for the layer

+
bmBlend Mode +

Blend Mode

+
clstring +

CSS class used by the SVG renderer

+
lnstring +

id attribute used by the SVG renderer

+
tgstring +

tag name used by the SVG renderer

+
cpboolean +

This is deprecated in favour of ct

+
ct0-1 integer +

Marks that transforms should be applied before masks

+
+
+

Note that layers that don't have a visual component (Audio layers for example), +won't have a transform and similar.

+

The layer is only visible between its ip and op. +If they match the corresponding attributes in Animation, the layer +will be visible the whole time, otherwise it will become visible at the frame ip +and disappear at op.

+

Parenting

+

Within a list of layers, the ind attribute (if present) must be unique.

+

Layers having a parent attribute matching another layer will inherit their +parent's transform (except for opacity).

+

Basically you need multiply the transform matrix by the parent's transform matrix +to get a child layer's final transform.

+

The flat layer structure and flexible parenting allows more flexibility but it's +different from the more traditional approach of nesting child layers inside the +parent layer (like a folder structure).

+

One of the advantages of flexible parenting is you can have children of the same +layer be intermixed with unrelated layers.

+

In the following example, the star and the ellipse are in separate layers, +but both have the same parent, which moves left and right. +Between the two there's an additional layer with the rectangle.

+

+

+
+
+
+
+ +
+

+

Auto Orient

+

When true, if the transform position is animated, it rotates the layer along the +path the position follows.

+

In the following example there are two arrows animated along the same path, +with no rotation when the position moves towards the right.

+

The transparent one keeps its rotation the same (ao is 0), while the solid one +follows the path (ao is 1).

+

+

+
+
+
+
+ +
+

+

Mattes

+

A matte allows using a layer as a mask for another layer.

+

The way it works is the layer defining the mask has a tt attribute with the +appropriate value. +By defaults it affects the layer on top (the layer before it in the layer list, which has the td attribute), +otherwise check the tp attribute.

+

In this example there's a layer with a rectangle and a star being masked by an ellipse:

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

Masks

+

A layer can have an array of masks that clip the contents of the layer to a shape.

+

This is similar to mattes, but there are a few differences.

+

With mattes, you use a layer to define the clipping area, while with masks +you use an animated bezier curve.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name, as seen from editors and the like

+
mnstring +

Match name, used in expressions

+
invboolean +

Inverted

+
ptAnimated Bezier +

Shape

+
oAnimated number +

Opacity

+
modeMask Mode +

Mode

+
xAnimated number +

Expand

+
+
+
+ + + + + + + + + + + + + + + + + +
100
0
+
+
+
+
+ + +
+

Shape Layer

+

Renders vector data.

+

The only special property for this layer is shapes, an array of shapes.

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 4 +

Layer type

+
shapesShape List +

Shapes

+
+
+

Precomposition Layer

+

This layer renders a precomposition.

+

You can find more details in the Precompositions page.

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 0 +

Layer type

+
refIdstring +

ID of the precomp as specified in the assets

+
winteger +

Width of the clipping rect

+
hinteger +

Height of the clipping rect

+
tmAnimated number +

Time Remapping

+
+
+

Time remapping

+

The tm property maps the time in seconds of the precomposition to show.

+

Basically you get the value of tm at the current frame, then assume that's +a time in seconds since the start of the animation, and render the corresponding +frame of the precomposition.

+

Follows an example of this, here there are two layers showing the same +precomposition, the one at the top right keeps the original time while the bottom +one remaps time as follows:

+
    +
  • frame 0 (0s) maps to 0s (frame 0) in the precomp
  • +
  • frame 30 (0.5s) maps to 3s (frame 180) in the precomp
  • +
  • frame 60 (1s) maps to 1.5s (frame 90) in the precomp
  • +
  • frame 180 (3s) maps to 3s (frame 180) in the precomp
  • +
+

Basically it makes the precomp play in the first half second, then rewind +to half way for the next half second, and plays back to the end for the remaining +2 seconds.

+
+
+
+
+
+
+ + +
+

Null Layer

+

This layer doesn't have any special properties.

+

It's often used by animators as a parent to multiple other layers (see parenting).

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 3 +

Layer type

+
+
+

Text Layer

+

For text data, please refer to the section about text for details.

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 5 +

Layer type

+
tText Data +

Data

+
+
+

Image Layer

+

This layer renders a static image.

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 2 +

Layer type

+
refIdstring +

ID of the image as specified in the assets

+
+
+

Solid Color Layer

+

This layer represents a rectangle with a single color.

+

Anything you can do with solid layers, you can do better with a shape layer +and a rectangle shape since none of this layer's own properties can be animated.

+

Note that the color is represented as a string, unlike most other places.

+
+

Also has the attributes from Visual Layer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 1 +

Layer type

+
scstring +

Color of the layer, unlike most other places, the color is a #rrggbb hex string

+
shnumber +

Height

+
swnumber +

Width

+
+
+
+ + + + + + + + + + + + + +
512
512
+
+
+
+
+ + +
+

Audio Layer

+

This layer plays a sound.

+
+

Also has the attributes from Layer.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 6 +

Layer type

+
auAudio Settings +

Audio Settings

+
refIdstring +

ID of the sound as specified in the assets

+
+
+

Audio Settings

+
+ + + + + + + + + + + + + + + +
AttributeTypeDescription
lvAnimated Vector +

Level

+
+
+

3D Layers

+

Layers can have 3D transforms as well:

+

+

+
+
+
+
+ +
+

+

3D layers need to have the ddd set to 1 (and so does the top-level object).

+

Their transform will habe a and p specified as 3D components.

+

Rotation will be split into 3 properties: rx, ry, rz, and +you have and additional orientation property or.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Anchor
0
0
0
Position
256
256
0
Rotation
0
30
0
Orientation
0
0
0
Scale
100
100
100
+
+
+
+
+ + +
+

Camera Layer

+

Camera for 3D layers.

+
+

Also has the attributes from Layer.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 13 +

Layer type

+
ksTransform +

Layer transform

+
peAnimated number +

Distance from the Z=0 plane. +Small values yield a higher perspective effect.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
256
Position
0
0
-10
Rotation
0
0
0
Orientation
0
0
0
+
+
+
+
+ + +
+

3D Parenting

+

As with 2D layers, you can parent 3D layers.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Position
0
0
-10
Rotation
0
0
0
Orientation
0
0
0
+
+
+
+
+ + +
+

Data Layer

+

This layer links to a data source.

+
+

Also has the attributes from Layer.

+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
tyinteger = 15 +

Layer type

+
refIdstring +

ID of the data source in assets

+
+
+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/playground/builder/index.html b/playground/builder/index.html new file mode 100644 index 00000000..898b2b66 --- /dev/null +++ b/playground/builder/index.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + Builder - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + +
+
+
+
    +
  • +
  • +
  • +
  • +
  • +
+
+
+ + +
+
+
+ +
+ + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/playground/explain/index.html b/playground/explain/index.html new file mode 100644 index 00000000..d59b306b --- /dev/null +++ b/playground/explain/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/playground/json_editor/index.html b/playground/json_editor/index.html new file mode 100644 index 00000000..d2acefed --- /dev/null +++ b/playground/json_editor/index.html @@ -0,0 +1,1007 @@ + + + + + + + + + + + + + + JSON Editor - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + +

+ + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/rendering/index.html b/rendering/index.html new file mode 100644 index 00000000..7c9e0216 --- /dev/null +++ b/rendering/index.html @@ -0,0 +1,4872 @@ + + + + + + + + + + + + + + Tips for rendering - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +

Tips for rendering

+ + + + +

Introduction

+

This page will give tips and example code on how to render certain objects within lottie.

+

Lottie has several implementations and some things might vary from player to player, +this guide tries to follow the behaviour of lottie web +which is the reference implementation.

+

For shapes, it ensures the stroke order is the same as in lottie web, which is crucial +for Trim Path to work correctly.

+

All shapes have the d attribute that if has the value 3 the path should be reversed.

+

Code

+

The code examples take some shortcuts for readablility: +all animated properties are shown as static, of course you'd need to get the +correct values to render shapes at a given frame.

+

When adding points to a bezier, there are calls to bezier.add_vertex(). +Assume the in/out tangents are [0, 0] if not specified. +When they are specified they show as set_out_tangent immediately following +the corresponding add_vertex.

+

Bezier tangents are assumed to be relative to their vertex since that's how lottie works +but it might be useful to keep them as absolute points when rendering.

+

All the examples show the original on the left and the bezier on the right.

+

Explanation for bezier operations is outside the scope of this guide, +the code below use a simple bezier library for some operations, +you can check its sources +for some context on what the various functions do.

+

Rectangle

+

See Rectangle.

+

Note that unlike other shapes, on lottie web when the d attribute is missing, +the rectangle defaults as being reversed.

+

Rectangle without rounded corners:

+
+ + + + + + + + + + + + + + + + + +
256
256
256
256
+
+
+
+
+
+ +
function rect(position, size)
+{
+    let left = position[0] - size[0] / 2;
+    let right = position[0] + size[0] / 2;
+    let top = position[1] - size[1] / 2;
+    let bottom = position[1] + size[1] / 2;
+
+    let bezier = new Bezier();
+
+    bezier.add_vertex(right, top);
+    bezier.add_vertex(right, bottom);
+    bezier.add_vertex(left, bottom);
+    bezier.add_vertex(left, top);
+
+    return bezier;
+}
+
+// Example invocation
+rect(shape.p.k, shape.s.k);
+
+ +
+

+

With rounded corners:

+
+ + + + + + + + + + + + + + + + + + + + + +
256
256
256
256
50
+
+
+
+
+
+ +
function rounded_rect(position, size, roundness)
+{
+    let left = position[0] - size[0] / 2;
+    let right = position[0] + size[0] / 2;
+    let top = position[1] - size[1] / 2;
+    let bottom = position[1] + size[1] / 2;
+
+    let rounded = Math.min(size[0] / 2, size[1] / 2, roundness);
+
+    let bezier = new Bezier();
+
+    // top right, going down
+    bezier.add_vertex(right, top + rounded)
+        .set_in_tangent(0, -rounded/2);
+
+    // bottom right
+    bezier.add_vertex(right, bottom - rounded)
+        .set_out_tangent(0, rounded/2);
+
+    bezier.add_vertex(right - rounded, bottom)
+        .set_in_tangent(rounded/2, 0);
+
+    // bottom left
+    bezier.add_vertex(left + rounded, bottom)
+        .set_out_tangent(-rounded/2, 0);
+
+    bezier.add_vertex(left, bottom - rounded)
+        .set_in_tangent(0, rounded/2);
+
+    // top left
+    bezier.add_vertex(left, top + rounded)
+        .set_out_tangent(0, -rounded/2);
+
+    bezier.add_vertex(left + rounded, top)
+        .set_in_tangent(-rounded/2, 0);
+
+
+    // back to top right
+    bezier.add_vertex(right - rounded, top)
+        .set_out_tangent(rounded/2, 0);
+
+    return bezier;
+}
+
+// Example invocation
+rounded_rect(shape.p.k, shape.s.k, shape.r.k);
+
+ +
+

+

Ellipse

+

See Ellipse.

+

The stroke direction should start at the top. +If you think of the ellipse as a clock, start at 12 go clockwise.

+

The magic number 0.5519 is what lottie uses for this, based on this article.

+
+ + + + + + + + + + + + + + + + + +
256
256
256
256
+
+
+
+
+
+ +
function ellipse(position, size)
+{
+    const ellipse_constant = 0.5519;
+
+    let x = position[0];
+    let y = position[1];
+    let radius_x = size[0] / 2;
+    let radius_y = size[1] / 2;
+    let tangent_x = radius_x * ellipse_constant;
+    let tangent_y = radius_y * ellipse_constant;
+
+    let bezier = new Bezier();
+
+    bezier.add_vertex(x, y - radius_y)
+        .set_in_tangent(-tangent_x, 0)
+        .set_out_tangent(tangent_x, 0);
+
+    bezier.add_vertex(x + radius_x, y)
+        .set_in_tangent(0, -tangent_y)
+        .set_out_tangent(0, tangent_y);
+
+    bezier.add_vertex(x, y + radius_y)
+        .set_in_tangent(tangent_x, 0)
+        .set_out_tangent(-tangent_x, 0);
+
+    bezier.add_vertex(x - radius_x, y)
+        .set_in_tangent(0, tangent_y)
+        .set_out_tangent(0, -tangent_y);
+
+    return bezier;
+}
+
+// Example invocation
+ellipse(shape.p.k, shape.s.k);
+
+ +
+

+

PolyStar

+

Pseudocode for rendering a PolyStar.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
5
0
200
100
0
0
+
+
+
+
+
+ +
function polystar(
+    position,
+    type,
+    points,
+    rotation,
+    outer_radius,
+    outer_roundness,
+    inner_radius,
+    inner_roundness
+)
+{
+    let result = new Bezier();
+
+    let half_angle = Math.PI / points;
+    let angle_radians = rotation / 180 * Math.PI
+
+    // Tangents for rounded courners
+    let tangent_len_outer = outer_roundness * outer_radius * 2 * Math.PI / (points * 4 * 100);
+    let tangent_len_inner = inner_roundness * inner_radius * 2 * Math.PI / (points * 4 * 100);
+
+    for ( let i = 0; i < points; i++ )
+    {
+        let main_angle = -Math.PI / 2 + angle_radians + i * half_angle * 2;
+
+        let outer_vertex = new Point(
+            outer_radius * Math.cos(main_angle),
+            outer_radius * Math.sin(main_angle)
+        );
+
+        let outer_tangent = new Point(0, 0);
+        if ( outer_radius != 0 )
+            outer_tangent = new Point(
+                outer_vertex.y / outer_radius * tangent_len_outer,
+                -outer_vertex.x / outer_radius * tangent_len_outer
+            );
+
+        result.add_vertex(position.add(outer_vertex))
+            .set_in_tangent(outer_tangent)
+            .set_out_tangent(outer_tangent.neg());
+
+        // Star inner radius
+        if ( type == 1 )
+        {
+            let inner_vertex = new Point(
+                inner_radius * Math.cos(main_angle + half_angle),
+                inner_radius * Math.sin(main_angle + half_angle)
+            );
+
+            let inner_tangent = new Point(0, 0);
+            if ( inner_radius != 0 )
+                inner_tangent = new Point(
+                    inner_vertex.y / inner_radius * tangent_len_inner,
+                    -inner_vertex.x / inner_radius * tangent_len_inner
+                );
+
+            result.add_vertex(position.add(inner_vertex))
+                .set_in_tangent(inner_tangent)
+                .set_out_tangent(inner_tangent.neg());
+        }
+    }
+
+    return result;
+}
+
+// Example invocation
+polystar(new Point(shape.p.k), shape.sy, shape.pt.k, shape.r.k, shape.or.k, shape.os.k, shape.ir?.k, shape.is?.k);
+
+ +
+

+

Pucker Bloat

+

See Pucker / Bloat.

+
+ + + + + +
50
+
+
+
+
+
+ +
function pucker_bloat(
+    // Beziers as collected from the other shapes
+    collected_shapes,
+    // "a" property from the Pucker/Bloat modifier
+    amount
+)
+{
+    // Normalize to [0, 1]
+    amount /= 100;
+
+    // Find the mean of the bezier vertices
+    let center = new Point(0, 0);
+    let number_of_vertices = 0;
+    for ( let input_bezier of collected_shapes )
+    {
+        for ( let point of input_bezier.points )
+        {
+            center.x += point.pos.x;
+            center.y += point.pos.y;
+            number_of_vertices += 1;
+        }
+    }
+
+    center.x /= number_of_vertices;
+    center.y /= number_of_vertices;
+
+    let result = [];
+
+    for ( let input_bezier of collected_shapes )
+    {
+        let output_bezier = new Bezier();
+        for ( let point of input_bezier.points )
+        {
+            // Here we convert tangents to global coordinates
+            let vertex = lerp(point.pos, center, amount);
+            let in_tangent = lerp(point.in_tangent.add(point.pos), center, -amount).sub(vertex);
+
+            let out_tangent = lerp(point.out_tangent.add(point.pos), center, -amount).sub(vertex);
+            output_bezier.add_vertex(vertex)
+                .set_in_tangent(in_tangent)
+                .set_out_tangent(out_tangent);
+        }
+
+        output_bezier.closed = input_bezier.closed;
+
+        result.push(output_bezier);
+    }
+
+    return result;
+}
+
+// Example invocation
+pucker_bloat([convert_shape(star)], modifier.a.k);
+
+ +
+

+

Rounded Corners

+

See Rounded Corners.

+

It approximates rounding using circular arcs.

+

The magic number 0.5519 is what lottie uses for this, based on this article.

+
+ + + + + +
50
+
+
+
+
+
+ +
// Helper function to perform rounding on a single vertex
+function get_vertex_tangent(
+    // Bezier to round
+    bezier,
+    // Vertex in the bezier we are rounding
+    current_vertex,
+    // Index of the next point along the curve
+    closest_index,
+    // Rounding radius
+    round_distance
+)
+{
+    const tangent_length = 0.5519;
+
+    // closest_index module bezier.length
+    closest_index = closest_index % bezier.points.length;
+    if ( closest_index < 0 )
+        closest_index += bezier.points.length;
+
+
+    let closest_vertex = bezier.points[closest_index].pos;
+    let distance = current_vertex.distance(closest_vertex);
+    let new_pos_perc = distance != 0 ? Math.min(distance/2, round_distance) / distance : 0;
+    let vertex = closest_vertex.sub(current_vertex).mul(new_pos_perc).add(current_vertex);
+    let tangent = vertex.sub(current_vertex).neg().mul(tangent_length);
+    return [vertex, tangent];
+}
+
+// Rounding for a single continuos curve
+function round_bezier_corners(
+    // Bezier to round
+    original,
+    // Rounding radius
+    round_distance
+)
+{
+    let result = new Bezier()
+    result.closed = original.closed;
+
+    for ( let i = 0; i < original.points.length; i++ )
+    {
+        let point = original.points[i];
+
+        // Start and end of a non-closed path don't get rounded
+        if ( !original.closed && (i == 0 || i == original.points.length - 1) )
+        {
+            result.add_vertex(point.pos)
+                .set_in_tangent(point.in_tangent)
+                .set_out_tangent(point.out_tangent);
+        }
+        else
+        {
+            let [vert1, out_t] = get_vertex_tangent(original, point.pos, i - 1, round_distance);
+            result.add_vertex(vert1)
+                .set_out_tangent(out_t);
+
+            let [vert2, in_t] = get_vertex_tangent(original, point.pos, i + 1, round_distance);
+            result.add_vertex(vert2)
+                .set_in_tangent(in_t);
+        }
+    }
+
+    return result;
+}
+
+// Rounding on multiple bezier
+function round_corners(
+    // Beziers as collected from the other shapes
+    collected_shapes,
+    // "r" property from lottie
+    r
+)
+{
+    let result = []
+
+    for ( let input_bezier of collected_shapes )
+        result.push(round_bezier_corners(input_bezier, r));
+
+    return result;
+}
+
+// Example invocation
+round_corners([convert_shape(star)], modifier.r.k);
+
+ +
+

+

Zig Zag

+

See Zig Zag.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Zig Zag
10
10
Star
0
0
5
3
+
+
+
+
+
+ +

+function angle_mean(a, b)
+{
+    if ( Math.abs(a-b) > Math.PI )
+        return (a + b) / 2 + Math.PI;
+
+    return (a + b) / 2;
+}
+
+function zig_zag_corner(output_bezier, segment_before, segment_after, amplitude, direction, tangent_length)
+{
+    let point;
+    let angle;
+    let tan_angle;
+
+    // We use 0.01 and 0.99 instead of 0 and 1 because they yield better results
+    if ( !segment_before )
+    {
+        point = segment_after.points[0];
+        angle = segment_after.normal_angle(0.01);
+        tan_angle = segment_after.tangent_angle(0.01);
+    }
+    else if ( !segment_after )
+    {
+        point = segment_before.points[3];
+        angle = segment_before.normal_angle(0.99);
+        tan_angle = segment_before.tangent_angle(0.99);
+    }
+    else
+    {
+        point = segment_after.points[0];
+        angle = angle_mean(segment_after.normal_angle(0.01), segment_before.normal_angle(0.99));
+        tan_angle = angle_mean(segment_after.tangent_angle(0.01), segment_before.tangent_angle(0.99));
+    }
+
+    let vertex = output_bezier.add_vertex(point.add_polar(angle, direction * amplitude));
+    if ( tangent_length !== 0 )
+    {
+        vertex.set_in_tangent(Point.polar(tan_angle, -tangent_length));
+        vertex.set_out_tangent(Point.polar(tan_angle, tangent_length));
+    }
+}
+
+function zig_zag_segment(output_bezier, segment, amplitude, frequency, direction, tangent_length)
+{
+    for ( let i = 0; i < frequency; i++ )
+    {
+        let f = (i + 1) / (frequency + 1);
+        let t = segment.t_at_length_percent(f);
+        let angle = segment.normal_angle(t);
+        let point = segment.point(t);
+
+        let vertex = output_bezier.add_vertex(point.add_polar(angle, direction * amplitude));
+        if ( tangent_length !== 0 )
+        {
+            let tan_angle = segment.tangent_angle(t);
+            vertex.set_in_tangent(Point.polar(tan_angle, -tangent_length));
+            vertex.set_out_tangent(Point.polar(tan_angle, tangent_length));
+        }
+
+        direction = -direction;
+    }
+
+    return direction;
+}
+
+function zig_zag_bezier(input_bezier, amplitude, frequency, smooth)
+{
+    let output_bezier = new Bezier();
+
+    output_bezier.closed = input_bezier.closed;
+    let count = input_bezier.segment_count();
+
+    if ( count == 0 )
+        return output_bezier;
+
+    let direction = -1;
+    let segment = input_bezier.closed ? input_bezier.segment(count - 1) : null;
+    let next_segment = input_bezier.segment(0);
+
+    next_segment.calculate_length_data();
+    let tangent_length = smooth ? next_segment.length / (frequency + 1) / 2 : 0;
+
+    zig_zag_corner(output_bezier, segment, next_segment, amplitude, -1, tangent_length);
+
+    for ( let i = 0; i < count; i++ )
+    {
+        segment = next_segment;
+
+        direction = zig_zag_segment(output_bezier, segment, amplitude, frequency, -direction, tangent_length);
+
+        if ( i == count - 1 && !input_bezier.closed )
+            next_segment = null;
+        else
+            next_segment = input_bezier.segment((i + 1) % count);
+
+        zig_zag_corner(output_bezier, segment, next_segment, amplitude, direction, tangent_length);
+    }
+
+    return output_bezier;
+}
+
+function zig_zag(
+    // Beziers as collected from the other shapes
+    collected_shapes,
+    amplitude,
+    frequency,
+    point_type
+)
+{
+    // Ensure we have an integer number of segments
+    frequency = Math.max(0, Math.round(frequency));
+
+    let result = [];
+
+    for ( let input_bezier of collected_shapes )
+        result.push(zig_zag_bezier(input_bezier, amplitude, frequency, point_type === 2));
+
+    return result;
+}
+
+// Example invocation
+zig_zag([convert_shape(star)], modifier.s.k, modifier.r.k, modifier.pt.k);
+
+ +
+

+

Offset Path

+

See Offset Path.

+
+ + + + + + + + + + + + + + + + + + + + + + + +
Offset Path
10
100
Star
0
+
+
+
+
+
+ +
/*
+    Simple offset of a linear segment
+*/
+function linear_offset(p1, p2, amount)
+{
+    let angle = Math.atan2(p2.x - p1.x, p2.y - p1.y);
+    return [
+        p1.add_polar(angle, amount),
+        p2.add_polar(angle, amount)
+    ];
+}
+
+/*
+    Offset a bezier segment
+    only works well if the segment is flat enough
+*/
+function offset_segment(segment, amount)
+{
+    let [p0, p1a] = linear_offset(segment.points[0], segment.points[1], amount);
+    let [p1b, p2b] = linear_offset(segment.points[1], segment.points[2], amount);
+    let [p2a, p3] = linear_offset(segment.points[2], segment.points[3], amount);
+    let p1 = line_intersection(p0, p1a, p1b, p2b) ?? p1a;
+    let p2 = line_intersection(p2a, p3, p1b, p2b) ?? p2a;
+
+    return new BezierSegment(p0, p1, p2, p3);
+}
+
+/*
+    Join two segments
+*/
+function join_lines(output_bezier, seg1, seg2, line_join, miter_limit)
+{
+    let p0 = seg1.points[3];
+    let p1 = seg2.points[0];
+
+    // Bevel
+    if ( line_join == 3 )
+        return p0;
+
+
+    // Connected, they don't need a joint
+    if ( p0.is_equal(p1) )
+        return p0;
+
+    let last_point = output_bezier.points[output_bezier.points.length - 1];
+
+    // Round
+    if ( line_join == 2 )
+    {
+        const ellipse_constant = 0.5519;
+        let angle_out = seg1.tangent_angle(1);
+        let angle_in = seg2.tangent_angle(0) + Math.PI;
+        let center = line_intersection(
+            p0, p0.add_polar(angle_out + Math.PI / 2, 100),
+            p1, p1.add_polar(angle_out + Math.PI / 2, 100)
+        );
+        let radius = center ? center.distance(p0) : p0.distance(p1) / 2;
+        last_point.set_out_tangent(Point.polar(angle_out, 2 * radius * ellipse_constant));
+
+        output_bezier.add_vertex(p1)
+            .set_in_tangent(Point.polar(angle_in, 2 * radius * ellipse_constant));
+
+        return p1;
+    }
+
+    // Miter
+    let t0 = p0.is_equal(seg1.points[2]) ? seg1.points[0] : seg1.points[2];
+    let t1 = p1.is_equal(seg2.points[1]) ? seg2.points[3] : seg2.points[1];
+    let intersection = line_intersection(t0, p0, p1, t1);
+    if ( intersection && intersection.distance(p0) < miter_limit )
+    {
+        output_bezier.add_vertex(intersection);
+        return intersection;
+    }
+
+    return p0;
+}
+
+
+function get_intersection(a, b)
+{
+    let intersect = a.intersections(b);
+
+    if ( intersect.length && fuzzy_compare(intersect[0], 1) )
+        intersect.shift();
+
+    if ( intersect.length )
+        return intersect[0];
+
+    return null;
+}
+
+function prune_segment_intersection(a, b)
+{
+    let out_a = [...a];
+    let out_b = [...b];
+
+    let intersect = get_intersection(a[a.length-1], b[0]);
+
+    if ( intersect )
+    {
+        out_a[a.length-1] = a[a.length-1].split(intersect[0])[0];
+        out_b[0] = b[0].split(intersect[1])[1];
+    }
+
+    if ( a.length > 1 && b.length > 1 )
+    {
+        intersect = get_intersection(a[0], b[b.length - 1]);
+
+        if ( intersect )
+        {
+            return [
+                [a[0].split(intersect[0])[0]],
+                [b[b.length-1].split(intersect[1])[1]],
+            ];
+        }
+    }
+
+    return [out_a, out_b];
+}
+
+function prune_intersections(segments)
+{
+    for ( let i = 1; i < segments.length; i++ )
+    {
+        [segments[i-1], segments[i]] = prune_segment_intersection(segments[i - 1], segments[i]);
+    }
+
+    if ( segments.length > 1 )
+        [segments[segments.length - 1], segments[0]] = prune_segment_intersection(segments[segments.length - 1], segments[0]);
+
+    return segments;
+}
+
+function offset_segment_split(segment, amount)
+{
+    /*
+        We split each bezier segment into smaller pieces based
+        on inflection points, this ensures the control point
+        polygon is convex.
+
+        (A cubic bezier can have none, one, or two inflection points)
+    */
+    let flex = segment.inflection_points();
+
+    if ( flex.length == 0 )
+    {
+        return [offset_segment(segment, amount)];
+    }
+    else if ( flex.length == 1 || flex[1] == 1 )
+    {
+        let [left, right] = segment.split(flex[0]);
+
+        return [
+            offset_segment(left, amount),
+            offset_segment(right, amount)
+        ];
+    }
+    else
+    {
+        let [left, mid_right] = segment.split(flex[0]);
+        let t = (flex[1] - flex[0]) / (1 - flex[0]);
+        let [mid, right] = mid_right.split(t);
+
+        return [
+            offset_segment(left, amount),
+            offset_segment(mid, amount),
+            offset_segment(right, amount)
+        ];
+    }
+
+}
+
+function offset_path(
+    // Beziers as collected from the other shapes
+    collected_shapes,
+    amount,
+    line_join,
+    miter_limit,
+)
+{
+    let result = [];
+
+    for ( let input_bezier of collected_shapes )
+    {
+        let output_bezier = new Bezier();
+
+        output_bezier.closed = input_bezier.closed;
+        let count = input_bezier.segment_count();
+
+        let multi_segments = [];
+
+        for ( let i = 0; i < count; i++ )
+            multi_segments.push(offset_segment_split(input_bezier.segment(i), amount));
+
+        // Open paths are stroked rather than being simply offset
+        if ( !input_bezier.closed )
+        {
+            for ( let i = count - 1; i >= 0; i-- )
+                multi_segments.push(offset_segment_split(input_bezier.inverted_segment(i), amount));
+        }
+
+        multi_segments = prune_intersections(multi_segments);
+
+        // Add bezier segments to the output and apply line joints
+        let last_point = null;
+        let last_seg = null;
+
+        for ( let multi_segment of multi_segments )
+        {
+            if ( last_seg )
+                last_point = join_lines(output_bezier, last_seg, multi_segment[0], line_join, miter_limit);
+
+            last_seg = multi_segment[multi_segment.length - 1];
+
+            for ( let segment of multi_segment )
+            {
+                if ( segment.points[0].is_equal(last_point) )
+                {
+                    output_bezier.points[output_bezier.points.length - 1]
+                        .set_out_tangent(segment.points[1].sub(segment.points[0]));
+                }
+                else
+                {
+                    output_bezier.add_vertex(segment.points[0])
+                        .set_out_tangent(segment.points[1].sub(segment.points[0]));
+                }
+
+
+                output_bezier.add_vertex(segment.points[3])
+                    .set_in_tangent(segment.points[2].sub(segment.points[3]));
+
+                last_point = segment.points[3];
+            }
+        }
+
+        if ( multi_segments.length )
+            join_lines(output_bezier, last_seg, multi_segments[0][0], line_join, miter_limit);
+
+        result.push(output_bezier);
+    }
+
+    return result;
+}
+
+// Example invocation
+offset_path([convert_shape(star)], modifier.a.k, modifier.lj, modifier.ml.k);
+
+ +
+

+

Trim Path

+
+ + + + + + + + + + + + + + + + + +
0
50
0
+
+
+
+
+
+ +

+function trim_path_gather_chunks(collected_shapes, multiple)
+{
+    let chunks = [];
+
+    // Shapes are handled as a single unit
+    if ( multiple === 2 )
+        chunks.push({segments: [], length: 0});
+
+    for ( let input_bezier of collected_shapes )
+    {
+        // Shapes are all affected separately
+        if ( multiple === 1 )
+            chunks.push({segments: [], length: 0});
+
+        let chunk = chunks[chunks.length-1];
+
+        for ( let i = 0; i < input_bezier.segment_count(); i++ )
+        {
+            let segment = input_bezier.segment(i);
+            let length = segment.get_length();
+            chunk.segments.push(segment);
+            chunk.length += length;
+        }
+
+        // Use null as a marker to start a new bezier
+        if ( multiple == 2 )
+            chunk.segments.push(null);
+    }
+
+    return chunks;
+}
+
+function trim_path_chunk(chunk, start, end, output_shapes)
+{
+    // Note: start and end have been normalized and have the offset applied
+    // The offset itself was normalized into [0, 1] so this is always true:
+    // 0 <= start < end <= 2
+
+    // Some offsets require us to handle different "splits"
+    // We want each split to be a pair [s, e] such that
+    // 0 <= s < e <= 1
+    var splits = [];
+
+    if ( end <= 1 )
+    {
+        // Simplest case, the segment is in [0, 1]
+        splits.push([start, end]);
+    }
+    else if ( start > 1 )
+    {
+        // The whole segment is outside [0, 1]
+        splits.push([start-1, end-1]);
+    }
+    else
+    {
+        // The segment goes over the end point, so we need two splits
+        splits.push([start, 1]);
+        splits.push([0, end-1]);
+    }
+
+    // Each split is a separate bezier, all left to do is finding the
+    // bezier segment to add to the output
+    for ( let [s, e] of splits )
+    {
+        let start_length = s * chunk.length;
+        let start_t;
+        let end_length = e * chunk.length;
+        let prev_length = 0;
+
+        let output_bezier = new Bezier(false);
+        output_shapes.push(output_bezier);
+
+        for ( let i = 0; i < chunk.segments.length; i++ )
+        {
+            let segment = chunk.segments[i];
+
+            // New bezier marker found
+            if ( segment === null )
+            {
+                output_bezier = new Bezier(false);
+                output_shapes.push(output_bezier);
+                continue;
+            }
+
+            if ( segment.length >= end_length )
+            {
+                let end_t = segment.t_at_length(end_length);
+
+                if ( segment.length >= start_length )
+                {
+                    start_t = segment.t_at_length(start_length);
+                    segment = segment.split(start_t)[1];
+                    end_t = (end_t - start_t) / (1 - start_t);
+                }
+
+                output_bezier.add_segment(segment.split(end_t)[0], false);
+                break;
+            }
+
+            if ( start_t === undefined )
+            {
+                if ( segment.length >= start_length )
+                {
+                    start_t = segment.t_at_length(start_length);
+                    output_bezier.add_segment(segment.split(start_t)[1], false);
+                }
+            }
+            else
+            {
+                output_bezier.add_segment(segment, true);
+            }
+
+            start_length -= segment.length;
+            end_length -= segment.length;
+        }
+    }
+}
+
+function trim_path(
+    collected_shapes,
+    start,
+    end,
+    offset,
+    multiple
+)
+{
+    // Normalize Inputs
+    offset = offset / 360 % 1;
+    if ( offset < 0 )
+        offset += 1;
+
+    start = Math.min(1, Math.max(0, start / 100));
+    end = Math.min(1, Math.max(0, end / 100));
+
+    if ( end < start )
+        [start, end] = [end, start];
+
+    // Apply offset
+    start += offset;
+    end += offset;
+
+    // Handle the degenerate cases
+    if ( fuzzy_compare(start, end) )
+        return [new Bezier(false)];
+
+    if ( fuzzy_zero(start) && fuzzy_compare(end, 1) )
+        return collected_shapes;
+
+    // Gather up the segments to trim
+    let chunks = trim_path_gather_chunks(collected_shapes, multiple);
+
+    let output_shapes = [];
+
+    for ( let chunk of chunks )
+        trim_path_chunk(chunk, start, end, output_shapes);
+
+    return output_shapes;
+
+}
+
+// Example invocation
+trim_path(shapes, modifier.s.k, modifier.e.k, modifier.o.k, modifier.m);
+
+ +
+

+

Transform

+ + +

This is how to convert a transform object into a matrix.

+

Assuming the matrix

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ac00
bd00
0010
txty01
+

The names a, b, etc are the ones commonly used for CSS transforms.

+

4D matrix to allow for 3D transforms, even though currently lottie only supports 2D graphics.

+

Multiplications are right multiplications (Next = Previous * StepOperation).

+

If your transform is transposed (tx, ty are on the last column), perform left multiplication instead.

+

Perform the following operations on a matrix starting from the identity matrix (or the parent object's transform matrix):

+

Translate by -a:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
1000
0100
0010
-a[0]-a[1]01
+

Scale by s/100:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
s[0]/100000
0s[1]/10000
0010
0001
+

Rotate by -sa (can be skipped if not skewing)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(-sa)sin(-sa)00
-sin(-sa)cos(-sa)00
0010
0001
+

Skew by sk (can be skipped if not skewing)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
1tan(-sk)00
0100
0010
0001
+

Rotate by sa (can be skipped if not skewing)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(sa)sin(sa)00
-sin(sa)cos(sa)00
0010
0001
+

Rotate by -r

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(-r)sin(-r)00
-sin(-r)cos(-r)00
0010
0001
+

If you are handling an auto orient layer, +evaluate and apply auto-orient rotation.

+

Translate by p

+ + + + + + + + + + + + + + + + + + + + + + + + + +
1000
0100
0010
p[0]p[1]01
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
256
256
256
256
100
100
0
0
0
100
+
+
+
+
+ + +
+

3D Transform

+

If you have a 3D transform, the process is similar, with a, p, s, +using their 3D matrices, note that for p and a the Z axis is inverted.

+

The rotation step is a bit more complicated, with the 2D rotation being +equivalent to a Z rotation.

+

The rotation step above is replaced with the following set of steps:

+

Rotate by -rz

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(-r)sin(-r)00
-sin(-r)cos(-r)00
0010
0001
+

Rotate by ry

+ + + + + + + + + + + + + + + + + + + + + + + + +
cos(r)0sin(r)0
0100
-sin(r)0cos(-r)0
001
+

Rotate by rx

+ + + + + + + + + + + + + + + + + + + + + + + + + +
1000
0cos(r)-sin(r)0
0-sin(r)cos(-r)0
0001
+

Then repeat the steps for or:

+

Rotate by -or[2] (Z axis)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(-r)sin(-r)00
-sin(-r)cos(-r)00
0010
0001
+

Rotate by or[1] (Y axis)

+ + + + + + + + + + + + + + + + + + + + + + + + +
cos(r)0sin(r)0
0100
-sin(r)0cos(-r)0
001
+

Rotate by or[0] (X axis)

+ + + + + + + + + + + + + + + + + + + + + + + + + +
1000
0cos(r)-sin(r)0
0-sin(r)cos(-r)0
0001
+

Auto Orient

+

Auto-orient is only relevant for layers that have ao set to 1 an animated position.

+

You get the derivative of the position property at the current time as a +pair (dx, dy), and find the angle with atan2(dy, dx), then rotate +by that angle clockwise:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
cos(-r)sin(-r)00
-sin(-r)cos(-r)00
0010
0001
+

Animated Properties

+

Assuming a 1D property, a keyframe looks something like this:

+
{
+    "t": start_time,
+    "s": [
+        start_value
+    ],
+    "o": {
+        "x": [
+            ox
+        ],
+        "y": [
+            oy
+        ]
+    },
+    "i": {
+        "x": [
+            ix
+        ],
+        "y": [
+            iy
+        ]
+    }
+}
+
+

Where:

+
    +
  • t is the time at the start of the keyframe (in frames),
  • +
  • s is the value at that time
  • +
  • i and o are the in/out bezier tangents
  • +
+

The transition between keyframes is defined by two keyframes, +for simplicity we'll refer to the named values above plus end_time and +end_value corresponding to t and s on the keyframe after the one listed.

+

The transition is given as a cubic bezier curve whose x axis is time and +the y axis is the interpolating factor between start_value and end_value.

+

The four points of this bezier curve are: (0, 0), (ox, oy), (iy, iy), (1, 1).

+

x is given by x = (current_time - start_time) / (end_time - start_time).

+

If the bezier is defined as

+

a t3 + b t2 + c t + d = 0

+

then you need to find the cubic roots of

+

a t3 + b t2 + c t + d - x = 0

+

to find the t corresponding to that x, (You only need to consider real roots in [0, 1]).

+

Then you can find the y by evaluating the bezier at t.

+

The final value is as follows: lerp(y, start_value, end_value).

+
+
+ + +
+

Effects

+ + + +

Fill Effect

+
+ + + + + + + + + + + + + + + + + + + + +
1
Color
1
0.9
0
+
+
+ +
+
+ +
#version 100
+
+uniform highp vec4 color;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+void main()
+{
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+    highp vec4 pixel = texture2D(texture_sampler, uv);
+
+    gl_FragColor = color;
+    gl_FragColor.a = 1.0;
+    gl_FragColor *= pixel.a * color.a;
+}
+
+ +
+

+

Tritone Effect

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bright
1
1
1
Mid
0.3
0.8
0.3
Dark
0
0
0
+
+
+ +
+
+ +
#version 100
+
+uniform highp vec4 bright;
+uniform highp vec4 mid;
+uniform highp vec4 dark;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+void main()
+{
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+    highp vec4 pixel = texture2D(texture_sampler, uv);
+
+    highp float lightness = sqrt(pixel.r * pixel.r * 0.299 + pixel.g * pixel.g * 0.587 + pixel.b * pixel.b * 0.114);
+    // If you want results more similar to lottie-web use the lightness below
+    // (this shader has a more accurate lightness calculation)
+    // lightness = sqrt((pixel.r * pixel.r + pixel.g * pixel.g + pixel.b * pixel.b) / 3.0);
+
+    if ( lightness < 0.5 )
+    {
+        lightness *= 2.0;
+        gl_FragColor = dark * (1.0 - lightness) + mid * lightness;
+    }
+    else
+    {
+        lightness = (lightness - 0.5) * 2.0;
+        gl_FragColor = mid * (1.0 - lightness) + bright * lightness;
+    }
+
+    gl_FragColor *= pixel.a;
+}
+
+ +
+

+

Gaussian Blur

+

This is a two-pass shader, the uniform pass is has value 0 +on the first pass and value 1 on the second pass.

+
+ + + + + + + + + + + + + +
25
+
+
+ +
+
+ +
#version 300 es
+
+#define PI 3.1415926538
+precision highp float;
+
+uniform float sigma;
+uniform int direction;
+uniform int kernel_size;
+uniform bool wrap;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+uniform int pass;
+
+out vec4 FragColor;
+
+
+vec4 texture_value(vec2 uv)
+{
+    if ( wrap )
+    {
+        if ( uv.x < 0. ) uv.x = 1. - uv.x;
+        if ( uv.x > 1. ) uv.x = uv.x - 1.;
+        if ( uv.y < 0. ) uv.y = 1. - uv.y;
+        if ( uv.y > 1. ) uv.y = uv.y - 1.;
+    }
+    else if ( uv.x < 0. || uv.x > 1. || uv.y < 0. || uv.y > 1. )
+    {
+        return vec4(0.0);
+    }
+
+    return texture(texture_sampler, uv);
+}
+
+
+vec4 blur_pass(float sigma, int kernel_size, vec2 uv, bool horizontal)
+{
+    float side = float(kernel_size / 2);
+
+    vec2 direction_vector = horizontal ?
+        vec2(1.0, 0.0) / canvas_size.x :
+        vec2(0.0, 1.0) / canvas_size.y;
+
+    vec3 delta_gauss;
+    delta_gauss.x = 1.0 / (sqrt(2.0 * PI) * sigma);
+    delta_gauss.y = exp(-0.5 / (sigma * sigma));
+    delta_gauss.z = delta_gauss.y * delta_gauss.y;
+
+    vec4 avg = vec4(0.0, 0.0, 0.0, 0.0);
+    float sum = 0.0;
+
+    vec4 pixel = texture_value(uv);
+    avg += pixel * delta_gauss.x;
+    sum += delta_gauss.x;
+    delta_gauss.xy *= delta_gauss.yz;
+
+    for ( float i = 1.0; i <= side; i++)
+    {
+        for ( float s = -1.0; s <= 1.0; s += 2.0 )
+        {
+            vec2 pos = uv + s * i * direction_vector;
+            pixel = texture_value(pos);
+            avg += pixel * delta_gauss.x;
+        }
+        sum += 2.0 * delta_gauss.x;
+        delta_gauss.xy *= delta_gauss.yz;
+    }
+
+    avg /= sum;
+
+    return avg;
+}
+
+
+void main()
+{
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+
+    int actual_kernel_size = kernel_size == 0 ? int(0.5 + 6.0 * sigma) : kernel_size;
+
+    const float multiplier = 0.25;
+
+    if ( sigma == 0.0 )
+    {
+        FragColor = texture(texture_sampler, uv);
+    }
+    else if ( pass == 0 )
+    {
+        if ( direction != 3 )
+            FragColor = blur_pass(sigma * multiplier, actual_kernel_size, uv, true);
+        else
+            FragColor = texture(texture_sampler, uv);
+    }
+    else if ( pass == 1 )
+    {
+        if ( direction != 2 )
+            FragColor = blur_pass(sigma * multiplier, actual_kernel_size, uv, false);
+        else
+            FragColor = texture(texture_sampler, uv);
+    }
+}
+
+ +
+

+

Drop Shadow Effect

+

The effect below is split into multiple shaders:

+
    +
  • First it generates the shadow
  • +
  • Then it has a 2 pass gaussian blur (simplified from the example above)
  • +
  • Finally, it composites the original image on top of the blurred shadow
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0
0
0
128
135
10
7
+
+
+ +
+
+ +
#version 300 es
+#define PI 3.1415926538
+
+uniform highp vec4 color;
+uniform mediump float angle;
+uniform mediump float distance;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+out highp vec4 FragColor;
+
+void main()
+{
+    // Base pixel value
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+    highp vec4 pixel = texture(texture_sampler, uv);
+
+    // Pixel value at the given offset
+    mediump float radians = -angle * PI / 180.0 + PI / 2.0;
+    highp vec2 shadow_uv = vec2(
+        (gl_FragCoord.x - distance * cos(radians)) / canvas_size.x,
+        1.0 - (gl_FragCoord.y - distance * sin(radians)) / canvas_size.y
+    );
+    highp vec4 shadow_pixel = texture(texture_sampler, shadow_uv);
+
+    // Colorize shadow
+    highp vec4 shadow_color;
+
+    if ( shadow_uv.x >= 0.0 && shadow_uv.x <= 1.0 && shadow_uv.y >= 0.0 && shadow_uv.y <= 1.0 )
+    {
+        shadow_color = color;
+        shadow_color.a = 1.0;
+        shadow_color *= shadow_pixel.a * color.a / 255.0;
+    }
+
+    // Apply shadow below the base pixel
+    FragColor = shadow_color; //pixel * pixel.a + shadow_color * (1.0 - pixel.a);
+}
+
+
#version 300 es
+
+#define PI 3.1415926538
+precision highp float;
+
+uniform float sigma;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+uniform int pass;
+
+out vec4 FragColor;
+
+vec4 blur_pass(float sigma, int kernel_size, vec2 uv, bool horizontal)
+{
+    float side = float(kernel_size / 2);
+
+    vec2 direction_vector = horizontal ?
+        vec2(1.0, 0.0) / canvas_size.x :
+        vec2(0.0, 1.0) / canvas_size.y;
+
+    vec3 delta_gauss;
+    delta_gauss.x = 1.0 / (sqrt(2.0 * PI) * sigma);
+    delta_gauss.y = exp(-0.5 / (sigma * sigma));
+    delta_gauss.z = delta_gauss.y * delta_gauss.y;
+
+    vec4 avg = vec4(0.0, 0.0, 0.0, 0.0);
+    float sum = 0.0;
+
+    vec4 pixel = texture(texture_sampler, uv);
+    avg += pixel * delta_gauss.x;
+    sum += delta_gauss.x;
+    delta_gauss.xy *= delta_gauss.yz;
+
+    for ( float i = 1.0; i <= side; i++)
+    {
+        for ( float s = -1.0; s <= 1.0; s += 2.0 )
+        {
+            vec2 pos = uv + s * i * direction_vector;
+            pixel = texture(texture_sampler, pos);
+            avg += pixel * delta_gauss.x;
+        }
+        sum += 2.0 * delta_gauss.x;
+        delta_gauss.xy *= delta_gauss.yz;
+    }
+
+    avg /= sum;
+
+    return avg;
+}
+
+
+void main()
+{
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+
+    int kernel_size = int(0.5 + 6.0 * sigma);
+
+    const float multiplier = 0.25;
+
+    if ( sigma == 0.0 )
+        FragColor = texture(texture_sampler, uv);
+    else if ( pass == 1 )
+        FragColor = blur_pass(sigma * multiplier, kernel_size, uv, true);
+    else if ( pass == 2 )
+        FragColor = blur_pass(sigma * multiplier, kernel_size, uv, false);
+}
+
+
#version 300 es
+
+precision highp float;
+
+uniform sampler2D original;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+out vec4 FragColor;
+
+vec4 alpha_blend(vec4 top, vec4 bottom)
+{
+    float comp_alpha = bottom.a * (1.0 - top.a);
+    vec4 result;
+    result.a = top.a + comp_alpha;
+    result.rgb = (top.rgb * top.a + bottom.rgb * comp_alpha) / result.a;
+    return result;
+}
+
+void main()
+{
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+
+    FragColor = alpha_blend(
+        texture(original, uv),
+        texture(texture_sampler, vec2(uv.x, 1.0 - uv.y))
+    );
+}
+
+ +
+

+

+

+

Pro Levels Effect

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Composite
0
1
1
0
1
Red
0
1
1
0
1
Green
0
1
1
0
1
Blue
0
1
1
0
1
+
+
+ +
+
+ +
#version 100
+precision highp float;
+
+uniform highp float composite_in_black;
+uniform highp float composite_in_white;
+uniform highp float composite_gamma;
+uniform highp float composite_out_black;
+uniform highp float composite_out_white;
+
+uniform highp float red_in_black;
+uniform highp float red_in_white;
+uniform highp float red_gamma;
+uniform highp float red_out_black;
+uniform highp float red_out_white;
+
+uniform highp float green_in_black;
+uniform highp float green_in_white;
+uniform highp float green_gamma;
+uniform highp float green_out_black;
+uniform highp float green_out_white;
+
+uniform highp float blue_in_black;
+uniform highp float blue_in_white;
+uniform highp float blue_gamma;
+uniform highp float blue_out_black;
+uniform highp float blue_out_white;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+
+float adjust_channel(float value, float in_black, float in_white, float gamma, float out_black, float out_white)
+{
+    float in_delta = in_white - in_black;
+    float out_delta = out_white - out_black;
+    if ( in_delta == 0.0 )
+        return out_black;
+
+    // Clamp to input range
+    if ( value <= in_black && value <= in_white )
+        return out_black;
+
+    if ( value >= in_black && value >= in_white )
+        return out_white;
+
+    // Apply adjustment
+    return out_black + out_delta * pow((value - in_black) / in_delta, 1.0 / gamma);
+}
+
+
+void main()
+{
+    // Base pixel value
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+    highp vec4 pixel = texture2D(texture_sampler, uv);
+
+    // First Pass: composite
+    pixel.rgb = vec3(
+        adjust_channel(pixel.r, composite_in_black, composite_in_white, composite_gamma, composite_out_black, composite_out_white),
+        adjust_channel(pixel.g, composite_in_black, composite_in_white, composite_gamma, composite_out_black, composite_out_white),
+        adjust_channel(pixel.b, composite_in_black, composite_in_white, composite_gamma, composite_out_black, composite_out_white)
+    );
+
+    // Second Pass: individual Channels
+    pixel.rgb = vec3(
+        adjust_channel(pixel.r, red_in_black, red_in_white, red_gamma, red_out_black, red_out_white),
+        adjust_channel(pixel.g, green_in_black, green_in_white, green_gamma, green_out_black, green_out_white),
+        adjust_channel(pixel.b, blue_in_black, blue_in_white, blue_gamma, blue_out_black, blue_out_white)
+    );
+
+    gl_FragColor.rgb = pixel.rgb * pixel.a;
+    gl_FragColor.a = pixel.a;
+}
+
+ +
+

+

Matte3

+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
#version 100
+precision highp float;
+
+uniform int channel;
+uniform int invert;
+uniform int premultiply_mask;
+uniform int show_mask;
+uniform sampler2D mask_layer;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+highp vec3 hsl(vec4 c)
+{
+    float maxc = max(c.r, max(c.g, c.b));
+    float minc = min(c.r, min(c.g, c.b));
+    float h = 0.0;
+    float s = 0.0;
+    float l = (maxc + minc) / 2.0;
+
+    if ( maxc != minc)
+    {
+        float d = maxc - minc;
+        s = l > 0.5 ? d / (2.0 - d) : d / (maxc + minc);
+        if ( maxc == c.r )
+            h = (c.g - c.b) / d + (c.g < c.b ? 6.0 : 0.0);
+        else if ( maxc == c.g )
+            h = (c.b - c.r) / d + 2.0;
+        else if ( maxc == c.b )
+            h = (c.r - c.g) / d + 4.0;
+
+        h /= 6.0;
+    }
+
+    return vec3(h, s, l);
+}
+
+highp float opacity(vec4 pixel, int channel, int invert, int premultiply)
+{
+    if ( premultiply == 1 )
+        pixel *= pixel.a;
+
+    highp float opacity;
+
+    if ( channel == 1 )
+        opacity = pixel.r;
+    else if ( channel == 2 )
+        opacity = pixel.g;
+    else if ( channel == 3 )
+        opacity = pixel.b;
+    else if ( channel == 4 )
+        opacity = pixel.a;
+    else if ( channel == 5 )
+        opacity = sqrt(pixel.r * pixel.r * 0.299 + pixel.g * pixel.g * 0.587 + pixel.b * pixel.b * 0.114);
+    else if ( channel == 6 )
+        opacity = hsl(pixel).x;
+    else if ( channel == 7 )
+        opacity = hsl(pixel).z;
+    else if ( channel == 8 )
+        opacity = hsl(pixel).y;
+    else if ( channel == 9 )
+        opacity = 1.0;
+    else if ( channel == 10 )
+        opacity = 0.0;
+
+
+    return invert == 1 ? 1.0 - opacity : opacity;
+}
+
+vec4 alpha_blend(vec4 top, vec4 bottom)
+{
+    float comp_alpha = bottom.a * (1.0 - top.a);
+    vec4 result;
+    result.a = top.a + comp_alpha;
+    result.rgb = (top.rgb * top.a + bottom.rgb * comp_alpha) / result.a;
+    return result;
+}
+
+void main()
+{
+    // Base pixel value
+    highp vec2 uv = vec2(gl_FragCoord.x / canvas_size.x, gl_FragCoord.y / canvas_size.y);
+    highp vec4 pixel = texture2D(texture_sampler, uv);
+
+    highp vec4 mask = texture2D(mask_layer, uv);
+
+
+    gl_FragColor.a = pixel.a * opacity(mask, channel, invert, premultiply_mask);
+    gl_FragColor.rgb = pixel.rgb * gl_FragColor.a;
+
+    if ( show_mask == 1 )
+        gl_FragColor = alpha_blend(gl_FragColor, mask);
+}
+
+ +
+

+

Bulge

+
+ + + + + + + + + + + + + + + + + + + + + +
286
277
197
179
1.9
+
+
+ +
+
+ +
#version 100
+
+precision highp float;
+
+uniform vec2 center;
+uniform vec2 radius;
+uniform float height;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+vec2 normalize_uv(vec2 coord)
+{
+    return vec2(coord.x / canvas_size.x, coord.y / canvas_size.y);
+}
+
+vec2 exponential_displacement(vec2 uv, float magnitude)
+{
+    return uv * pow(dot(uv, uv), magnitude) - uv;
+}
+
+
+vec2 spherical_displacement(vec2 uv, float magnitude)
+{
+    float radius = (1.0 + magnitude) / (2.0 * sqrt(magnitude));
+
+
+    float arc_ratio = asin(length(uv) / radius) / asin(1.0 / radius);
+    return normalize(uv) * arc_ratio - uv;
+}
+
+vec2 displace(vec2 owo)
+{
+    float t = dot(owo, owo);
+    if (t >= 1.0)
+        return owo;
+
+    float magnitude = abs(height);
+    // We modify the magniture to more closely match AE
+    magnitude = (2.0/(1.0+exp(-3.0*magnitude))-1.0) * (0.23 * magnitude + 0.14);
+    // If the above is too expensive, you can use this instead:
+    // magnitude = magnitude * 0.275;
+    // Both of the above were derived by interpolating sample points
+
+    float sign = height > 0.0 ? 1.0 : -1.0;
+    vec2 displacement =
+        exponential_displacement(owo, magnitude) +
+        spherical_displacement(owo, magnitude)
+    ;
+    return owo + displacement * magnitude * sign;
+
+}
+
+void main()
+{
+    highp vec2 uv = normalize_uv(gl_FragCoord.xy);
+    vec2 norm_center = normalize_uv(center);
+    vec2 norm_radius = normalize_uv(radius);
+
+    // forward transform
+    uv = (uv - norm_center) / norm_radius;
+    //displace
+    uv = displace(uv);
+    // backward transform
+    uv = uv * norm_radius + norm_center;
+
+    gl_FragColor = texture2D(texture_sampler, uv);
+}
+
+ +
+

+

Wave Warp

+

This effect is animated by default, so it has a "time" slider (in seconds).

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10
40
90
0
1
0
+
+
+ +
+
+ +
#version 100
+
+#define PI 3.1415926538
+#define TAU 6.283185307
+
+precision highp float;
+
+uniform int shape;
+uniform float amplitude;
+uniform float wavelength;
+uniform float angle;
+uniform float speed;
+uniform float phase;
+uniform float time;
+
+uniform mediump vec2 canvas_size;
+uniform sampler2D texture_sampler;
+
+
+vec2 normalize_uv(vec2 coord)
+{
+    return vec2(coord.x / canvas_size.x, coord.y / canvas_size.y);
+}
+
+float clamp_angle(float angle)
+{
+    return mod(angle, TAU);
+}
+
+vec2 project(vec2 a , vec2 b)
+{
+    return dot(a, b) / dot(b, b) * b;
+}
+
+float semicircle(float x)
+{
+    return sqrt(1.0 - pow(clamp_angle(x) / PI - 1.0, 2.0));
+}
+
+// Adapted from http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
+highp float noise(float x)
+{
+    highp float a = 12.9898;
+    highp float b = 78.233;
+    highp float c = 43758.5453;
+    highp float dt = x * a;
+    highp float sn = mod(dt, PI);
+    return fract(sin(sn) * c) * 2.0 - 1.0;
+}
+
+// Interpolate between two random points
+float smooth_noise(float x)
+{
+    float x_fract = fract(x);
+    float x_int = x - x_fract;
+    float n1 = noise(x_int);
+    float n2 = noise(x_int + 1.0);
+    return (n1 * (1.0 - x_fract) + n2 * x_fract);
+}
+
+vec2 displace(vec2 uv)
+{
+    float rad = angle / 180.0 * PI;
+    vec2 normal = vec2(cos(rad), sin(rad));
+    rad -= PI /2.0;
+    vec2 direction = vec2(cos(rad), sin(rad));
+    float x = length(project(uv, direction));
+
+    x = x / wavelength * PI - time * speed * TAU + phase / 180.0 * PI;
+
+
+    float y;
+
+    if ( shape == 1 ) // sine
+        y = sin(x);
+    else if ( shape == 2 ) // square
+        y = clamp_angle(x) < PI ? 1.0 : -1.0;
+    else if ( shape == 3 ) // triangle
+        y = 1.0 - abs(clamp_angle(x) - PI) / PI * 2.0;
+    else if ( shape == 4 ) // sawtooth
+        y = 1.0 - clamp_angle(x) / PI;
+    else if ( shape == 5 ) // circle
+        y = sign(clamp_angle(x) -  PI) * semicircle(2.0 * x);
+    else if ( shape == 6 ) // semi circle
+        y = 2.0 * semicircle(x) - 1.0;
+    else if ( shape == 7 ) // uncircle
+        y = sign(clamp_angle(-x) -  PI) * (semicircle(2.0 * x) - 1.0);
+    else if ( shape == 8 ) // noise
+        y = noise(x);
+    else if ( shape == 9 ) // smooth noise
+        y = smooth_noise(x * 4.0) ;
+
+    return uv + y * normal * amplitude;
+
+}
+
+void main()
+{
+    vec2 uv = displace(gl_FragCoord.xy);
+    gl_FragColor = texture2D(texture_sampler, normalize_uv(uv));
+}
+
+ +
+

+
+
+ + +
+ + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/schema/animated-properties/animated-property.json b/schema/animated-properties/animated-property.json new file mode 100644 index 00000000..8653452d --- /dev/null +++ b/schema/animated-properties/animated-property.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Animated Property", + "description": "An animatable property that holds an array of numbers", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + } + }, + { + "if": { + "properties": { + "a": { "const": 1 } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/keyframe" + } + } + } + } + } + ], + "required": ["k"] +} diff --git a/schema/animated-properties/color-value.json b/schema/animated-properties/color-value.json new file mode 100644 index 00000000..acf919a6 --- /dev/null +++ b/schema/animated-properties/color-value.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Color Value", + "description": "An animatable property that holds a Color", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { "const": 0 } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "$ref": "#/$defs/helpers/color" + } + } + } + } + ] +} diff --git a/schema/animated-properties/gradient-colors.json b/schema/animated-properties/gradient-colors.json new file mode 100644 index 00000000..cb5659e9 --- /dev/null +++ b/schema/animated-properties/gradient-colors.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gradient Colors", + "description": "Represents colors and offsets in a gradient\n\nColors are represented as a flat list interleaving offsets and color components in weird ways\nThere are two possible layouts:\n\nWithout alpha, the colors are a sequence of offset, r, g, b\n\nWith alpha, same as above but at the end of the list there is a sequence of offset, alpha", + + "properties": { + "k": { + "title": "Colors", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "p": { + "title": "Count", + "description": "Number of colors in `k`", + "type": "integer", + "default": 0 + } + }, + "required": ["p", "k"] +} diff --git a/schema/animated-properties/keyframe-base.json b/schema/animated-properties/keyframe-base.json new file mode 100644 index 00000000..83172beb --- /dev/null +++ b/schema/animated-properties/keyframe-base.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Base Keyframe", + "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.", + "allOf": [ + { + "properties": { + "t": { + "title": "Time", + "type": "number", + "default": 0 + }, + "h": { + "title": "Hold", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + } + }, + { + "if": { + "oneOf": [ + { + "properties": { + "h": { "const": 0 } + } + }, + { + "not": {"required": ["h"]} + } + ] + }, + "then": { + "properties": { + "i": { + "title": "In Tangent", + "description": "Easing tangent going into the next keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + }, + "o": { + "title": "Out Tangent", + "description": "Easing tangent leaving the current keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + } + } + } + } + ], + "required": ["t", "s"] +} + diff --git a/schema/animated-properties/keyframe-bezier-handle.json b/schema/animated-properties/keyframe-bezier-handle.json new file mode 100644 index 00000000..b04fb055 --- /dev/null +++ b/schema/animated-properties/keyframe-bezier-handle.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Keyframe Bezier Handle", + "description": "Bezier handle for keyframe interpolation", + "properties": { + "x": { + "title": "X", + "description": "Time component:\n0 means start time of the keyframe,\n1 means time of the next keyframe.", + "oneOf":[ + { + "type": "array", + "items": { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "minItems": 1 + }, + { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + } + ] + }, + "y": { + "title": "Y", + "description": "Value interpolation component:\n0 means start value of the keyframe,\n1 means value at the next keyframe.", + "oneOf": [ + { + "type": "array", + "items": { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "minItems": 1 + }, + { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + } + ] + } + }, + "required": ["x", "y"] +} diff --git a/schema/animated-properties/keyframe.json b/schema/animated-properties/keyframe.json new file mode 100644 index 00000000..c7bf1e7a --- /dev/null +++ b/schema/animated-properties/keyframe.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Keyframe", + "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe-base" + }, + { + "properties": { + "s": { + "title": "Value", + "description": "Value at this keyframe. Note the if the property is a scalar, keyframe values are still represented as arrays", + "type": "array", + "items": { + "type": "number" + } + }, + "e": { + "title": "End value", + "description": "Value at the end of the keyframe, note that this is deprecated and you should use `s` from the next keyframe to get this value", + "deprecated": true, + "type": "array", + "items": { + "type": "number" + } + } + } + }, + { + "if": { + "oneOf": [ + { + "properties": { + "h": { "const": 0 } + } + }, + { + "not": {"required": ["h"]} + } + ] + }, + "then": { + "properties": { + "i": { + "title": "In Tangent", + "description": "Easing tangent going into the next keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + }, + "o": { + "title": "Out Tangent", + "description": "Easing tangent leaving the current keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + } + } + } + } + ], + "required": ["t", "s"] +} diff --git a/schema/animated-properties/multi-dimensional.json b/schema/animated-properties/multi-dimensional.json new file mode 100644 index 00000000..3c3b2985 --- /dev/null +++ b/schema/animated-properties/multi-dimensional.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Multi Dimensional", + "description": "An animatable property that holds an array of numbers", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { "const": 0 } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "properties": { + "l": { + "title": "Length", + "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.", + "type": "integer" + } + } + } + ] +} diff --git a/schema/animated-properties/position-keyframe.json b/schema/animated-properties/position-keyframe.json new file mode 100644 index 00000000..34ae9860 --- /dev/null +++ b/schema/animated-properties/position-keyframe.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Position Keyframe", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe" + }, + { + "properties": { + "ti": { + "title": "Value In Tangent", + "description": "Tangent for values (eg: moving position around a curved path)", + "type": "array", + "items": { + "type": "number" + } + }, + "to": { + "title": "Value Out Tangent", + "description": "Tangent for values (eg: moving position around a curved path)", + "type": "array", + "items": { + "type": "number" + } + } + } + } + ] +} diff --git a/schema/animated-properties/position.json b/schema/animated-properties/position.json new file mode 100644 index 00000000..61887058 --- /dev/null +++ b/schema/animated-properties/position.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Position Property", + "description": "An animatable property to represent a position in space", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + }, + "l": { + "title": "Length", + "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.", + "type": "integer" + } + } + }, + { + "if": { + "properties": { + "a": { "const": 1 } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/position-keyframe" + } + } + } + }, + "else": { + "properties": { + "k": { + "title": "Static Value", + "type": "array", + "items": { + "type": "number" + } + } + } + } + } + ], + "required": ["k"] +} + diff --git a/schema/animated-properties/shape-keyframe.json b/schema/animated-properties/shape-keyframe.json new file mode 100644 index 00000000..211921ba --- /dev/null +++ b/schema/animated-properties/shape-keyframe.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Shape Keyframe", + "description": "Keyframe holding Bezier objects", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe-base" + }, + { + "type": "object", + "properties": { + "s": { + "title": "Start", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/bezier" + } + } + } + } + ] +} diff --git a/schema/animated-properties/shape-property.json b/schema/animated-properties/shape-property.json new file mode 100644 index 00000000..4e80726b --- /dev/null +++ b/schema/animated-properties/shape-property.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Shape Property", + "description": "An animatable property that holds a Bezier", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + } + } + }, + { + "if": { + "properties": { + "a": { "const": 1 } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/shape-keyframe" + } + } + } + }, + "else": { + "properties": { + "k": { + "$ref": "#/$defs/helpers/bezier", + "title": "Static Value" + } + } + } + } + ], + "required": ["k"] +} diff --git a/schema/animated-properties/split-vector.json b/schema/animated-properties/split-vector.json new file mode 100644 index 00000000..7b376bff --- /dev/null +++ b/schema/animated-properties/split-vector.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Split Vector", + "description": "An animatable property that is split into individually anaimated components", + "properties": { + "s": { + "title": "Split", + "type": "boolean", + "const": true + }, + "x": { + "title": "X", + "$ref": "#/$defs/animated-properties/value" + }, + "y": { + "title": "Y", + "$ref": "#/$defs/animated-properties/value" + }, + "z": { + "title": "Z", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["s", "x", "y"] +} + + diff --git a/schema/animated-properties/value.json b/schema/animated-properties/value.json new file mode 100644 index 00000000..56281e99 --- /dev/null +++ b/schema/animated-properties/value.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Value", + "description": "An animatable property that holds a float", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { "const": 0 } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "type": "number" + } + } + } + } + ] +} diff --git a/schema/animation/animation.json b/schema/animation/animation.json new file mode 100644 index 00000000..d561c154 --- /dev/null +++ b/schema/animation/animation.json @@ -0,0 +1,158 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Animation", + "description": "Top level object, describing the animation", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "v": { + "title": "Version", + "type": "string", + "default": "5.5.2" + }, + "fr": { + "title": "Framerate", + "description": "Framerate in frames per second", + "type": "number", + "default": 60 + }, + "ip": { + "title": "In Point", + "description": "\"In Point\", which frame the animation starts at (usually 0)", + "type": "number", + "default": 0 + }, + "op": { + "title": "Out Point", + "description": "\"Out Point\", which frame the animation stops/loops at, which makes this the duration in frames when `ip` is 0", + "type": "number", + "default": 60 + }, + "w": { + "title": "Width", + "description": "Width of the animation", + "type": "integer", + "default": 512 + }, + "h": { + "title": "Height", + "description": "Height of the animation", + "type": "integer", + "default": 512 + }, + "ddd": { + "title": "Threedimensional", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0, + "description": "Whether the animation has 3D layers" + }, + "assets": { + "title": "Assets", + "type": "array", + "description": "List of assets that can be referenced by layers", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/assets/image" + }, + { + "$ref": "#/$defs/assets/precomposition" + }, + { + "$ref": "#/$defs/assets/sound" + }, + { + "$ref": "#/$defs/assets/data-source" + } + ] + } + }, + "comps": { + "title": "Extra Compositions", + "type": "array", + "description": "List of Extra compositions not referenced by anything", + "items": { + "$ref": "#/$defs/assets/precomposition" + } + }, + "fonts": { + "title": "Fonts", + "$ref": "#/$defs/text/font-list" + }, + "chars": { + "title": "Characters", + "description": "Data defining text characters as lottie shapes. If present a player might only render characters defined here and nothing else.", + "type": "array", + "items": { + "$ref": "#/$defs/text/character-data" + } + }, + "meta": { + "title": "Metadata", + "description": "Document metadata", + "$ref": "#/$defs/animation/metadata" + }, + "metadata": { + "title": "User Metadata", + "$ref": "#/$defs/animation/user-metadata" + }, + "markers": { + "title": "Markers", + "description": "Markers defining named sections of the composition.", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/marker" + } + }, + "mb": { + "title": "Motion Blur", + "$ref": "#/$defs/animation/motion-blur" + }, + "slots": { + "title": "Slots", + "description": "Available property overrides", + "type": "object", + "patternProperties": { + ".*": { + "p": { + "anyOf": [ + { + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + { + "$ref": "#/$defs/animated-properties/color-value" + }, + { + "$ref": "#/$defs/animated-properties/position" + }, + { + "$ref": "#/$defs/animated-properties/shape-property" + }, + { + "$ref": "#/$defs/animated-properties/value" + }, + { + "$ref": "#/$defs/assets/image" + }, + { + "$ref": "#/$defs/text/animated-text-document" + } + ] + }, + "required": ["p"] + } + } + } + }, + "required": ["w", "h", "fr", "layers", "op", "ip"] + }, + { + "$ref": "#/$defs/animation/composition" + } + ] +} diff --git a/schema/animation/composition.json b/schema/animation/composition.json new file mode 100644 index 00000000..544f8cb7 --- /dev/null +++ b/schema/animation/composition.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Composition", + "description": "Base class for layer holders", + "properties": { + "layers": { + "title": "Layers", + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/$defs/layers/precomposition-layer"}, + {"$ref": "#/$defs/layers/solid-color-layer"}, + {"$ref": "#/$defs/layers/image-layer"}, + {"$ref": "#/$defs/layers/null-layer"}, + {"$ref": "#/$defs/layers/shape-layer"}, + {"$ref": "#/$defs/layers/text-layer"}, + {"$ref": "#/$defs/layers/audio-layer"}, + {"$ref": "#/$defs/layers/camera-layer"}, + {"$ref": "#/$defs/layers/data-layer"} + ] + } + } + }, + "required": ["layers"] +} diff --git a/schema/animation/metadata.json b/schema/animation/metadata.json new file mode 100644 index 00000000..d2498193 --- /dev/null +++ b/schema/animation/metadata.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Metadata", + "description": "Document metadata", + "properties": { + "a": { + "title": "Author", + "type": "string" + }, + "d": { + "title": "Description", + "type": "string" + }, + "tc": { + "title": "Theme Color", + "type": "string" + }, + "g": { + "title": "Generator", + "description": "Software used to generate the file", + "type": "string" + } + }, + "anyOf": [ + { + "properties": { + "k": { + "title": "Keywords", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + { + "properties": { + "k": { + "title": "Keywords", + "type": "string" + } + } + } + ] +} diff --git a/schema/animation/motion-blur.json b/schema/animation/motion-blur.json new file mode 100644 index 00000000..48b6bf50 --- /dev/null +++ b/schema/animation/motion-blur.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Motion Blur", + "description": "Motion blur settings", + "properties": { + "sa": { + "title": "Shutter Angle", + "description": "Angle in degrees", + "type": "number" + }, + "sp": { + "title": "Shutter Phase", + "description": "Angle in degrees", + "type": "number" + }, + "spf": { + "title": "Samples per Frame", + "type": "number" + }, + "asl": { + "title": "Adaptive Sample Limit", + "type": "number" + } + } +} + diff --git a/schema/animation/user-metadata.json b/schema/animation/user-metadata.json new file mode 100644 index 00000000..50ef11a9 --- /dev/null +++ b/schema/animation/user-metadata.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "User Metadata", + "description": "User-defined metadata", + "properties": { + "filename": { + "title": "Filename", + "type": "string" + }, + "customProps": { + "title": "Custom Properties", + "type": "object" + } + } +} + diff --git a/schema/assets/asset.json b/schema/assets/asset.json new file mode 100644 index 00000000..eb87d45d --- /dev/null +++ b/schema/assets/asset.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Asset", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "title": "ID", + "description": "Unique identifier used by layers when referencing this asset", + "type": "string", + "default": "" + }, + "nm": { + "title": "Name", + "description": "Human readable name", + "type": "string" + } + }, + "required": ["id"] + } + ] +} diff --git a/schema/assets/data-source.json b/schema/assets/data-source.json new file mode 100644 index 00000000..3ff66dc3 --- /dev/null +++ b/schema/assets/data-source.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Data source", + "description": "External data source, usually a JSON file", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + }, + { + "type": "object", + "properties": { + "t": { + "title": "Type", + "type": "integer", + "const": 3 + } + }, + "required": ["t"] + } + ] +} + diff --git a/schema/assets/file-asset.json b/schema/assets/file-asset.json new file mode 100644 index 00000000..545aecf2 --- /dev/null +++ b/schema/assets/file-asset.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "File Asset", + "description": "Asset referencing a file", + "allOf": [ + { + "$ref": "#/$defs/assets/asset" + }, + { + "type": "object", + "properties": { + "u": { + "title": "Path", + "description": "Path to the directory containing a file", + "type": "string", + "default": "" + }, + "p": { + "title": "File name", + "description": "Filename or data url", + "type": "string", + "default": "" + }, + "e": { + "title": "Embedded", + "description": "Whether the file is embedded", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + }, + "required": ["p"] + } + ] +} + + diff --git a/schema/assets/image.json b/schema/assets/image.json new file mode 100644 index 00000000..4302b642 --- /dev/null +++ b/schema/assets/image.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Image", + "description": "External image", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + }, + { + "type": "object", + "properties": { + "w": { + "title": "Width", + "description": "Width of the image", + "type": "number", + "default": 0 + }, + "h": { + "title": "Height", + "description": "Height of the image", + "type": "number", + "default": 0 + }, + "t": { + "title": "Type", + "description": "Marks as part of an image sequence if present", + "type": "string", + "const": "seq" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + }, + "required": ["p"] + } + ] +} diff --git a/schema/assets/precomposition.json b/schema/assets/precomposition.json new file mode 100644 index 00000000..b6e4cfa3 --- /dev/null +++ b/schema/assets/precomposition.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Precomposition", + "description": "Asset containing an animation that can be referenced by layers.", + "allOf": [ + { + "$ref": "#/$defs/assets/asset" + }, + { + "$ref": "#/$defs/animation/composition" + }, + { + "type": "object", + "properties": { + "fr": { + "title": "Framerate", + "description": "Framerate in frames per second", + "type": "number" + }, + "xt": { + "title": "Extra", + "description": "Extra composition", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + } + } + ] +} diff --git a/schema/assets/sound.json b/schema/assets/sound.json new file mode 100644 index 00000000..683e90c8 --- /dev/null +++ b/schema/assets/sound.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Sound", + "description": "External sound", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + } + ] +} diff --git a/schema/constants/blend-mode.json b/schema/constants/blend-mode.json new file mode 100644 index 00000000..1407446e --- /dev/null +++ b/schema/constants/blend-mode.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Blend Mode", + "description": "Layer and shape blend mode", + "caniuse": "blend-mode", + "oneOf": [ + { + "title": "Normal", + "const": 0 + }, + { + "title": "Multiply", + "const": 1 + }, + { + "title": "Screen", + "const": 2 + }, + { + "title": "Overlay", + "const": 3 + }, + { + "title": "Darken", + "const": 4 + }, + { + "title": "Lighten", + "const": 5 + }, + { + "title": "Color Dodge", + "const": 6 + }, + { + "title": "Color Burn", + "const": 7 + }, + { + "title": "Hard Light", + "const": 8 + }, + { + "title": "Soft Light", + "const": 9 + }, + { + "title": "Difference", + "const": 10 + }, + { + "title": "Exclusion", + "const": 11 + }, + { + "title": "Hue", + "const": 12 + }, + { + "title": "Saturation", + "const": 13 + }, + { + "title": "Color", + "const": 14 + }, + { + "title": "Luminosity", + "const": 15 + }, + { + "title": "Add", + "const": 16 + }, + { + "title": "Hard Mix", + "const": 17 + } + ] +} diff --git a/schema/constants/composite.json b/schema/constants/composite.json new file mode 100644 index 00000000..3ebb5d2e --- /dev/null +++ b/schema/constants/composite.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Composite", + "description": "How to stack copies in a repeater", + "oneOf": [ + { + "title": "Above", + "const": 1 + }, + { + "title": "Below", + "const": 2 + } + ] +} diff --git a/schema/constants/fill-rule.json b/schema/constants/fill-rule.json new file mode 100644 index 00000000..166da4b0 --- /dev/null +++ b/schema/constants/fill-rule.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Fill Rule", + "description": "Rule used to handle multiple shapes rendered with the same fill object", + "oneOf": [ + { + "title": "Non Zero", + "description": "Everything is colored (You can think of this as an OR)", + "const": 1 + }, + { + "title": "Even Odd", + "description": "Colored based on intersections and path direction, can be used to create \"holes\"", + "const": 2 + } + ] +} diff --git a/schema/constants/font-path-origin.json b/schema/constants/font-path-origin.json new file mode 100644 index 00000000..48fd15e3 --- /dev/null +++ b/schema/constants/font-path-origin.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Font Path Origin", + "description": "", + "oneOf": [ + { + "title": "Local", + "const": 0 + }, + { + "title": "Css Url", + "const": 1 + }, + { + "title": "Script Url", + "const": 2 + }, + { + "title": "Font Url", + "const": 3 + } + ] +} diff --git a/schema/constants/gradient-type.json b/schema/constants/gradient-type.json new file mode 100644 index 00000000..af3a54f9 --- /dev/null +++ b/schema/constants/gradient-type.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Gradient Type", + "description": "Type of a gradient", + "oneOf": [ + { + "title": "Linear", + "type": "integer", + "const": 1 + }, + { + "title": "Radial", + "type": "integer", + "const": 2 + } + ] +} diff --git a/schema/constants/line-cap.json b/schema/constants/line-cap.json new file mode 100644 index 00000000..cefd7042 --- /dev/null +++ b/schema/constants/line-cap.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Line Cap", + "description": "Style at the end of a stoked line", + "oneOf": [ + { + "title": "Butt", + "const": 1 + }, + { + "title": "Round", + "const": 2 + }, + { + "title": "Square", + "const": 3 + } + ] +} diff --git a/schema/constants/line-join.json b/schema/constants/line-join.json new file mode 100644 index 00000000..327e7d2f --- /dev/null +++ b/schema/constants/line-join.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Line Join", + "description": "Style at a sharp corner of a stoked line", + "oneOf": [ + { + "title": "Miter", + "const": 1 + }, + { + "title": "Round", + "const": 2 + }, + { + "title": "Bevel", + "const": 3 + } + ] +} diff --git a/schema/constants/mask-mode.json b/schema/constants/mask-mode.json new file mode 100644 index 00000000..2a8c8e2a --- /dev/null +++ b/schema/constants/mask-mode.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "title": "Mask Mode", + "description": "How masks interact with each other. See https://helpx.adobe.com/after-effects/using/alpha-channels-masks-mattes.html", + "oneOf": [ + { + "title": "None", + "const": "n" + }, + { + "title": "Add", + "const": "a" + }, + { + "title": "Subtract", + "const": "s" + }, + { + "title": "Intersect", + "const": "i" + }, + { + "title": "Lighten", + "const": "l" + }, + { + "title": "Darken", + "const": "d" + }, + { + "title": "Difference", + "const": "f" + } + ] +} diff --git a/schema/constants/matte-mode.json b/schema/constants/matte-mode.json new file mode 100644 index 00000000..d56f6ba4 --- /dev/null +++ b/schema/constants/matte-mode.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Matte Mode", + "description": "How a layer should mask another layer", + "oneOf": [ + { + "title": "Normal", + "const": 0 + }, + { + "title": "Alpha", + "const": 1 + }, + { + "title": "Inverted Alpha", + "const": 2 + }, + { + "title": "Luma", + "const": 3 + }, + { + "title": "Inverted Luma", + "const": 4 + } + ] +} diff --git a/schema/constants/merge-mode.json b/schema/constants/merge-mode.json new file mode 100644 index 00000000..efa5ffd0 --- /dev/null +++ b/schema/constants/merge-mode.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Merge Mode", + "description": "Boolean operation on shapes", + "oneOf": [ + { + "title": "Normal", + "const": 1 + }, + { + "title": "Add", + "const": 2 + }, + { + "title": "Subtract", + "const": 3 + }, + { + "title": "Intersect", + "const": 4 + }, + { + "title": "Exclude Intersections", + "const": 5 + } + ] +} + diff --git a/schema/constants/shape-direction.json b/schema/constants/shape-direction.json new file mode 100644 index 00000000..ec943aff --- /dev/null +++ b/schema/constants/shape-direction.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Shape Direction", + "description": "Drawing direction of the shape curve, useful for trim path", + "oneOf": [ + { + "title": "Normal", + "description": "Usually clockwise", + "const": 1 + }, + { + "title": "Reversed", + "description": "Usually counter clockwise", + "const": 3 + } + ] +} diff --git a/schema/constants/star-type.json b/schema/constants/star-type.json new file mode 100644 index 00000000..3d54fb94 --- /dev/null +++ b/schema/constants/star-type.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Star Type", + "description": "Star or Polygon", + "oneOf": [ + { + "title": "Star", + "const": 1 + }, + { + "title": "Polygon", + "const": 2 + } + ] +} diff --git a/schema/constants/stroke-dash-type.json b/schema/constants/stroke-dash-type.json new file mode 100644 index 00000000..9a3a37d9 --- /dev/null +++ b/schema/constants/stroke-dash-type.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "title": "Stroke Dash Type", + "description": "Type of a dash item in a stroked line", + "oneOf": [ + { + "title": "Dash", + "const": "d" + }, + { + "title": "Gap", + "const": "g" + }, + { + "title": "Offset", + "const": "o" + } + ] +} diff --git a/schema/constants/text-based.json b/schema/constants/text-based.json new file mode 100644 index 00000000..84366b5f --- /dev/null +++ b/schema/constants/text-based.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Based", + "description": "", + "oneOf": [ + { + "title": "Characters", + "const": 1 + }, + { + "title": "Character Excluding Spaces", + "const": 2 + }, + { + "title": "Words", + "const": 3 + }, + { + "title": "Lines", + "const": 4 + } + ] +} diff --git a/schema/constants/text-caps.json b/schema/constants/text-caps.json new file mode 100644 index 00000000..d5288c33 --- /dev/null +++ b/schema/constants/text-caps.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Caps", + "oneOf": [ + { + "title": "Regular", + "const": 0 + }, + { + "title": "All Caps", + "const": 1 + }, + { + "title": "Small Caps", + "const": 2 + } + ], + "default": 0 +} diff --git a/schema/constants/text-grouping.json b/schema/constants/text-grouping.json new file mode 100644 index 00000000..01f8a865 --- /dev/null +++ b/schema/constants/text-grouping.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Grouping", + "description": "", + "oneOf": [ + { + "title": "Characters", + "const": 1 + }, + { + "title": "Word", + "const": 2 + }, + { + "title": "Line", + "const": 3 + }, + { + "title": "All", + "const": 4 + } + ] +} diff --git a/schema/constants/text-justify.json b/schema/constants/text-justify.json new file mode 100644 index 00000000..47e1921e --- /dev/null +++ b/schema/constants/text-justify.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Justify", + "description": "Text alignment / justification", + "oneOf": [ + { + "title": "Left", + "const": 0 + }, + { + "title": "Right", + "const": 1 + }, + { + "title": "Center", + "const": 2 + }, + { + "title": "Justify with Last Line Left", + "const": 3 + }, + { + "title": "Justify with Last Line Right", + "const": 4 + }, + { + "title": "Justify with Last Line Center", + "const": 5 + }, + { + "title": "Justify with Last Line Full", + "const": 6 + } + ] +} diff --git a/schema/constants/text-range-units.json b/schema/constants/text-range-units.json new file mode 100644 index 00000000..5bef5301 --- /dev/null +++ b/schema/constants/text-range-units.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Range Units", + "description": "Unit type for a text selector", + "oneOf": [ + { + "title": "Percent", + "const": 1 + }, + { + "title": "Index", + "const": 2 + } + ] +} + diff --git a/schema/constants/text-shape.json b/schema/constants/text-shape.json new file mode 100644 index 00000000..585f8f68 --- /dev/null +++ b/schema/constants/text-shape.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Text Shape", + "description": "Defines the function used to determine the interpolating factor on a text range selector.", + "oneOf": [ + { + "title": "Square", + "const": 1 + }, + { + "title": "Ramp Up", + "const": 2 + }, + { + "title": "Ramp Down", + "const": 3 + }, + { + "title": "Triangle", + "const": 4 + }, + { + "title": "Round", + "const": 5 + }, + { + "title": "Smooth", + "const": 6 + } + ] +} diff --git a/schema/constants/trim-multiple-shapes.json b/schema/constants/trim-multiple-shapes.json new file mode 100644 index 00000000..304e615a --- /dev/null +++ b/schema/constants/trim-multiple-shapes.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Trim Multiple Shapes", + "description": "How to handle multiple shapes in trim path", + "oneOf": [ + { + "title": "Simultaneously", + "const": 1 + }, + { + "title": "Individually", + "const": 2 + } + ] +} diff --git a/schema/docs_mapping.json b/schema/docs_mapping.json new file mode 100644 index 00000000..ef33d756 --- /dev/null +++ b/schema/docs_mapping.json @@ -0,0 +1,139 @@ +{ + "animated-properties": { + "_defaults": { + "page": "concepts", + "anchor": "animated-property" + }, + "value": { + "name_prefix": "Animated ", + "name": "number" + }, + "multi-dimensional": { + "name_prefix": "Animated ", + "name": "Vector" + }, + "color-value": { + "name_prefix": "", + "name": "Animated", + "extra": { + "page": "concepts", + "anchor": "colors", + "name": "Color" + } + }, + "shape-property": { + "name_prefix": "", + "name": "Animated", + "extra": { + "page": "concepts", + "anchor": "bezier", + "name": "Bezier" + } + }, + "position": { + "name_prefix": "Animated ", + "anchor": "animated-position", + "name": "Position" + }, + "gradient-colors": { + "anchor": "gradients" + } + }, + "shapes": { + "gradient": { + "anchor": "gradients" + }, + "gradient-fill": { + "anchor": "gradients" + }, + "gradient-stroke": { + "anchor": "gradients" + }, + "shape-element": { + "anchor": "shape-elements" + }, + "base-stroke": { + "anchor": "stroke" + }, + "trim": { + "anchor": "trim-path" + }, + "shape-list": { + "page": "concepts", + "anchor": "lists-of-layers-and-shapes" + }, + "transform": { + "anchor": "transform-shape" + }, + "modifier": { + "anchor": "modifiers" + }, + "stroke-dash": { + "anchor": "stroke-dashes" + } + }, + "helpers": { + "_defaults": { + "page": "concepts" + }, + "mask": { + "page": "layers", + "anchor": "masks" + }, + "color": { + "anchor": "colors" + }, + "int-boolean": { + "anchor": "booleans", + "name": "0-1 Integer" + }, + "visual-object": { + "page": null + }, + "marker": { + "page": "animation" + } + }, + "effect-values": { + "_defaults": { + "page": "effects" + }, + "effect-value": { + "anchor": "effect-values" + } + }, + "styles": { + "_defaults": { + "page": "effects" + } + }, + "text": { + "font": { + "anchor": "font-list" + } + }, + "effects": { + "effect":{ + "anchor": "effects" + } + }, + "assets": { + "asset":{ + "anchor": "assets" + }, + "file-asset": { + "anchor": "data-source" + } + }, + "animation": { + "composition":{ + "page": "concepts", + "anchor": "lists-of-layers-and-shapes" + } + }, + "layers": { + "visual-layer":{ + "anchor": "layer" + } + } +} diff --git a/schema/effect-values/angle.json b/schema/effect-values/angle.json new file mode 100644 index 00000000..b0893dc4 --- /dev/null +++ b/schema/effect-values/angle.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Angle", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 1 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/checkbox.json b/schema/effect-values/checkbox.json new file mode 100644 index 00000000..04242d16 --- /dev/null +++ b/schema/effect-values/checkbox.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Checkbox", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 4 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/color.json b/schema/effect-values/color.json new file mode 100644 index 00000000..3df28a06 --- /dev/null +++ b/schema/effect-values/color.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Color", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 2 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/drop-down.json b/schema/effect-values/drop-down.json new file mode 100644 index 00000000..861e681e --- /dev/null +++ b/schema/effect-values/drop-down.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Drop Down", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 7 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/effect-value.json b/schema/effect-values/effect-value.json new file mode 100644 index 00000000..25fe0ac2 --- /dev/null +++ b/schema/effect-values/effect-value.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value", + "description": "Value for an effect", + "caniuse": "effects", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ix": { + "title": "Effect Index", + "type": "integer" + }, + "mn": { + "title": "Match Name", + "type": "string" + }, + "nm": { + "title": "Name", + "type": "string" + }, + "ty": { + "title": "Type", + "type": "integer" + } + }, + "required": [] + } + ] +} diff --git a/schema/effect-values/ignored.json b/schema/effect-values/ignored.json new file mode 100644 index 00000000..823c0575 --- /dev/null +++ b/schema/effect-values/ignored.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Ignored Value", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 6 + }, + "v": { + "title": "Value", + "type": "number", + "default": 0 + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/layer.json b/schema/effect-values/layer.json new file mode 100644 index 00000000..d93bff7c --- /dev/null +++ b/schema/effect-values/layer.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Layer", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 10 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/no-value.json b/schema/effect-values/no-value.json new file mode 100644 index 00000000..e869ed93 --- /dev/null +++ b/schema/effect-values/no-value.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect No Value", + "description": "" +} diff --git a/schema/effect-values/point.json b/schema/effect-values/point.json new file mode 100644 index 00000000..a22daebf --- /dev/null +++ b/schema/effect-values/point.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Point", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 3 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effect-values/slider.json b/schema/effect-values/slider.json new file mode 100644 index 00000000..a729c2cb --- /dev/null +++ b/schema/effect-values/slider.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect Value Slider", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 0 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effects/custom-effect.json b/schema/effects/custom-effect.json new file mode 100644 index 00000000..83cb8406 --- /dev/null +++ b/schema/effects/custom-effect.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Custom Effect", + "description": "Some lottie files use `ty` = 5 for many different effects", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 5 + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/displacement-map-effect.json b/schema/effects/displacement-map-effect.json new file mode 100644 index 00000000..1c5e690d --- /dev/null +++ b/schema/effects/displacement-map-effect.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Displacement Map Effect", + "description": "", + "caniuse": "effect-displacement-map", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 27 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Displacement Map Layer", + "$ref": "#/$defs/effect-values/layer" + }, + { + "title": "Use For Horizontal Displacement", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Max Horizontal Displacement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Use For Vertical Displacement", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Max Vertical Displacement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Displacement Map Behavior", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Edge Behavior", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Expand Output", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] +} diff --git a/schema/effects/drop-shadow-effect.json b/schema/effects/drop-shadow-effect.json new file mode 100644 index 00000000..3cd72711 --- /dev/null +++ b/schema/effects/drop-shadow-effect.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Drop Shadow Effect", + "description": "Adds a shadow to the layer", + "caniuse": "effect-drop-shadow", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 25 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "opacity", + "description": "Opacity between 0 and 255", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "distance", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "blur", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/effect.json b/schema/effects/effect.json new file mode 100644 index 00000000..6bdf28b8 --- /dev/null +++ b/schema/effects/effect.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Effect", + "description": "Layer effect", + "caniuse": "effects", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ef": { + "title": "Effect Values", + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/$defs/effect-values/no-value"}, + {"$ref": "#/$defs/effect-values/angle"}, + {"$ref": "#/$defs/effect-values/checkbox"}, + {"$ref": "#/$defs/effect-values/color"}, + {"$ref": "#/$defs/effect-values/drop-down"}, + {"$ref": "#/$defs/effect-values/ignored"}, + {"$ref": "#/$defs/effect-values/layer"}, + {"$ref": "#/$defs/effect-values/point"}, + {"$ref": "#/$defs/effect-values/slider"} + ] + } + }, + "np": { + "title": "Property Count", + "description": "Number of values in `ef`", + "type": "integer" + }, + "ix": { + "title": "Effect Index", + "type": "integer" + }, + "ty": { + "title": "Type", + "description": "Effect type", + "type": "integer" + }, + "en": { + "title": "Enabled", + "$ref": "#/$defs/helpers/int-boolean", + "default": 1 + } + }, + "required": ["ty", "ef"] + } + ] +} diff --git a/schema/effects/fill-effect.json b/schema/effects/fill-effect.json new file mode 100644 index 00000000..c3699620 --- /dev/null +++ b/schema/effects/fill-effect.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Fill Effect", + "description": "Replaces the whole layer with the given color", + "caniuse": "effect-fill", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 21 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "04", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "05", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "opacity", + "description": "Opacity in [0, 1]", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/gaussian-blur-effect.json b/schema/effects/gaussian-blur-effect.json new file mode 100644 index 00000000..b5725daf --- /dev/null +++ b/schema/effects/gaussian-blur-effect.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gaussian Blur Effect", + "description": "Gaussian blur", + "caniuse": "effect-gaussian-blur", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 29 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "sigma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "direction", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "wrap", + "$ref": "#/$defs/effect-values/checkbox" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/matte3-effect.json b/schema/effects/matte3-effect.json new file mode 100644 index 00000000..af8d3164 --- /dev/null +++ b/schema/effects/matte3-effect.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Set Matte Effect", + "description": "Uses a layer as a mask", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 28 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Layer", + "description": "Use this layer as a mask", + "$ref": "#/$defs/effect-values/layer" + }, + { + "title": "Channel", + "description": "Channel to use as a mask:\n1 - Red\n2 - Green\n3 - Blue\n4 - Alpha\n5 - Luminance\n6 - Hue\n7 - Lightness\n8 - Saturation\n9 - Full\n10 - Off", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Invert", + "description": "Use 0 as opaque value when true", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Stretch To Fit", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Show Mask", + "description": "If false, the mask layer won't be shown", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Premultiply Mask", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/mesh-warp-effect.json b/schema/effects/mesh-warp-effect.json new file mode 100644 index 00000000..f559fdc0 --- /dev/null +++ b/schema/effects/mesh-warp-effect.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Mesh Warp Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 31 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Rows", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Columns", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Quality", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] +} \ No newline at end of file diff --git a/schema/effects/pro-levels-effect.json b/schema/effects/pro-levels-effect.json new file mode 100644 index 00000000..b9411b5f --- /dev/null +++ b/schema/effects/pro-levels-effect.json @@ -0,0 +1,171 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Pro Levels Effect", + "description": "", + "caniuse": "effect-color-levels-individual-controls", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 24 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "02", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "comp_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_outwhite", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "08", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "09", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "15", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "16", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "22", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "23", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "29", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_outwhite", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/puppet-effect.json b/schema/effects/puppet-effect.json new file mode 100644 index 00000000..a74d5d91 --- /dev/null +++ b/schema/effects/puppet-effect.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Puppet Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 34 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Puppet Engine", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Mesh Rotation Refinement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "On Transparent", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] +} diff --git a/schema/effects/radial-wipe-effect.json b/schema/effects/radial-wipe-effect.json new file mode 100644 index 00000000..7f37c245 --- /dev/null +++ b/schema/effects/radial-wipe-effect.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Radial Wipe", + "caniuse": "effect-radial-wipe", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 26 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Completion", + "description": "Between 0 and 100", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Start Angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "Wipe Center", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "Wipe", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Feather", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} + diff --git a/schema/effects/spherize-effect.json b/schema/effects/spherize-effect.json new file mode 100644 index 00000000..dd985665 --- /dev/null +++ b/schema/effects/spherize-effect.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Spherize Effect", + "description": "", + "caniuse": "effect-cc-sphere", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 33 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "center", + "$ref": "#/$defs/effect-values/point" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} + diff --git a/schema/effects/stroke-effect.json b/schema/effects/stroke-effect.json new file mode 100644 index 00000000..84800783 --- /dev/null +++ b/schema/effects/stroke-effect.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Stroke Effect", + "description": "", + "caniuse": "effect-stroke", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 22 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/checkbox" + }, + { + "title": "02", + "$ref": "#/$defs/effect-values/checkbox" + }, + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "04", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "05", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "06", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "07", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "08", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "09", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "type", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/tint-effect.json b/schema/effects/tint-effect.json new file mode 100644 index 00000000..cb922d47 --- /dev/null +++ b/schema/effects/tint-effect.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Tint Effect", + "description": "Colorizes the layer", + "caniuse": "effect-tint", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 20 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Black Color", + "description": "Tint of the darker parts of the layer", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "White Color", + "description": "Tint of the lighter parts of the layer", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "Intensity", + "description": "Intensity of the effect, 0 means the layer is unchanged. 100 means full effect", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/tritone-effect.json b/schema/effects/tritone-effect.json new file mode 100644 index 00000000..b9dc04d8 --- /dev/null +++ b/schema/effects/tritone-effect.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Tritone Effect", + "description": "Maps layers colors based on bright/mid/dark colors", + "caniuse": "effect-tritone", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 23 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "bright", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "mid", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "dark", + "$ref": "#/$defs/effect-values/color" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/effects/twirl-effect.json b/schema/effects/twirl-effect.json new file mode 100644 index 00000000..6123ebf0 --- /dev/null +++ b/schema/effects/twirl-effect.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Twirl Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 30 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "Radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Center", + "$ref": "#/$defs/effect-values/point" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] +} + diff --git a/schema/effects/wavy-effect.json b/schema/effects/wavy-effect.json new file mode 100644 index 00000000..0885e9c9 --- /dev/null +++ b/schema/effects/wavy-effect.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Wavy Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 32 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Center", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "Conversion type", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Speed", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Width", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Height", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Phase", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] +} diff --git a/schema/expressions.json b/schema/expressions.json new file mode 100644 index 00000000..44eaebbb --- /dev/null +++ b/schema/expressions.json @@ -0,0 +1,630 @@ +{ + "variables": { + "$bm_rt": { + "type": "Depends on the property", + "description": "Output value for the expression", + "notes": "Must be declared and be assigned a value in every expression" + }, + "time": { + "type": "number", + "description": "The current time within the composition in seconds", + "notes": "Read only" + }, + "value": { + "type": "Depends on the property", + "description": "The value the property would have without expressions", + "notes": "Read only" + }, + "thisProperty": { + "type": "Property", + "description": "Property the expression is operating on", + "notes": "Read only" + }, + "thisComp": { + "type": "Composition", + "description": "Composition the property is in", + "notes": "Read only" + }, + "thisLayer": { + "type": "Layer", + "description": "Layer the property is in", + "notes": "Read only" + } + }, + "functions": { + "comp": { + "params": [ + { + "name": "name", + "type": "string", + "description": "Composition name" + } + ], + "return": { + "type": "Composition", + "description": "Composition object matching the given name" + } + }, + "posterizeTime": { + "params": [ + { + "name": "fps", + "type": "number", + "description": "Frames per second" + } + ], + "description": "The rest of the expression will only be updated this many times per second" + }, + "timeToFrames": { + "description": "Converts a time in seconds to a number of frames", + "params": [ + { + "name": "time", + "type": "number", + "description": "Time in seconds", + "default": "time + thisComp.displayStartTime" + }, + { + "name": "fps", + "type": "number", + "description": "Frames per second", + "default": "1.0 / thisComp.frameDuration" + } + ], + "return": { + "type": "number", + "description": "Number of frames" + } + }, + "framesToTime": { + "description": "Converts a number of frames to a time in seconds", + "params": [ + { + "name": "frames", + "type": "number", + "description": "Number of frames" + }, + { + "name": "fps", + "type": "number", + "description": "Frames per second", + "default": "1.0 / thisComp.frameDuration" + } + ], + "return": { + "type": "number", + "description": "Time in seconds" + } + }, + "rgbToHsl": { + "params": [ + { + "name": "rgb", + "type": "array[3]|array[4]", + "description": "RGB(A) color, with components in 0, 1" + } + ], + "return": { + "type": "array[3]|array[4]", + "description": "HSL(A) color, with components in 0, 1" + } + }, + "hslToRgb": { + "params": [ + { + "name": "hsl", + "type": "array[3]|array[4]", + "description": "HSL(A) color, with components in 0, 1" + } + ], + "return": { + "type": "array[3]|array[4]", + "description": "RGB(A) color, with components in 0, 1" + } + }, + "createPath": { + "description": "Creates bezier path data", + "params": [ + { + "name": "points", + "type": "array", + "description": "Array of points (each point is a list with 2 numbers)" + }, + { + "name": "in_tangents", + "type": "array", + "description": "Array of in tangents correponding to the point with the same index", + "default": "[]" + }, + { + "name": "out_tangents", + "type": "array", + "description": "Array of out tangents correponding to the point with the same index", + "default": "[]" + }, + { + "name": "is_closed", + "type": "boolean", + "default": "true", + "description": "Whether the path is closed" + } + ], + "return": { + "type": "Path" + } + }, + "add": { + "params": [ + { + "name": "a", + "type": "any", + "description": "" + }, + { + "name": "b", + "type": "any", + "description": "" + } + ], + "return": { + "type": "any", + "description": "" + } + }, + "sub": { + "params": [ + { + "name": "a", + "type": "any", + "description": "" + }, + { + "name": "b", + "type": "any", + "description": "" + } + ], + "return": { + "type": "any", + "description": "" + } + }, + "mul": { + "params": [ + { + "name": "a", + "type": "any", + "description": "" + }, + { + "name": "b", + "type": "any", + "description": "" + } + ], + "return": { + "type": "any", + "description": "" + } + }, + "div": { + "params": [ + { + "name": "a", + "type": "any", + "description": "" + }, + { + "name": "b", + "type": "any", + "description": "" + } + ], + "return": { + "type": "any", + "description": "" + } + }, + "mod": { + "params": [ + { + "name": "a", + "type": "any", + "description": "" + }, + { + "name": "b", + "type": "any", + "description": "" + } + ], + "return": { + "type": "any", + "description": "" + } + }, + "clamp": { + "description": "Clamps a value inside a range", + "params": [ + { + "name": "value", + "type": "number", + "description": "The value to clamp" + }, + { + "name": "minimum", + "type": "number", + "description": "Minimum value" + }, + { + "name": "maximum", + "type": "number", + "description": "Maximum value" + } + ], + "return": { + "type": "number", + "description": "" + } + }, + "normalize": { + "description": "Divides a vector by its length", + "params": [ + { + "name": "vector", + "type": "array" + } + ], + "return": { + "type": "number", + "description": "same as `div(vector, length(vector))`" + } + }, + "length": [ + { + "params": [ + { + "name": "vector", + "type": "array" + } + ], + "return": { + "type": "number", + "description": "length of `vector`" + } + }, + { + "params": [ + { + "name": "a", + "type": "array" + }, + { + "name": "b", + "type": "array" + } + ], + "return": { + "type": "number", + "description": "Distance between `a` and `b`." + } + } + ], + "lookAt": { + "params": [ + { + "name": "from_point", + "type": "array[3]" + }, + { + "name": "to_point", + "type": "array[3]" + } + ], + "return": { + "type": "number", + "description": "length of `vector`" + } + }, + "seedRandom": { + "description": "Sets the seed for random functions", + "params": [ + { + "name": "seed", + "type": "number" + } + ] + }, + "random": [ + { + "return": { + "type": "number", + "description": "Random number between 0 and 1" + } + }, + { + "params": [ + { + "name": "max", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Random number between 0 and `max`, element wise if the argument is an array" + } + }, + { + "params": [ + { + "name": "min", + "type": "number|array" + }, + { + "name": "max", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Random number between `min` and `max`, element wise if the arguments are arrays" + } + } + ], + "linear": [ + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between 0 and 1" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Linear interpolation between `value1` and `value2`" + } + }, + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between `t_min` and `t_max`" + }, + { + "name": "t_min", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "t_max", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Linear interpolation between `value1` and `value2`, `t` is first normalized inside `t_min` and `t_max`" + } + } + ], + "ease": [ + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between 0 and 1" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`" + } + }, + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between `t_min` and `t_max`" + }, + { + "name": "t_min", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "t_max", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`, `t` is first normalized inside `t_min` and `t_max`" + } + } + ], + "easeIn": [ + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between 0 and 1" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`" + } + }, + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between `t_min` and `t_max`" + }, + { + "name": "t_min", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "t_max", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`, `t` is first normalized inside `t_min` and `t_max`" + } + } + ], + "easeOut": [ + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between 0 and 1" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`" + } + }, + { + "params": [ + { + "name": "t", + "type": "number", + "description": "Interpolation factor between `t_min` and `t_max`" + }, + { + "name": "t_min", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "t_max", + "type": "number", + "description": "Lower bound for the `t` range" + }, + { + "name": "value1", + "type": "number|array" + }, + { + "name": "value2", + "type": "number|array" + } + ], + "return": { + "type": "number|array", + "description": "Interpolation between `value1` and `value2`, `t` is first normalized inside `t_min` and `t_max`" + } + } + ], + "degreesToRadians": { + "params": [ + { + "name": "degrees", + "type": "number", + "description": "Angle in degrees" + } + ], + "return": { + "type": "number", + "description": "Angle in radians" + } + }, + "radiansToDegrees": { + "params": [ + { + "name": "radians", + "type": "number", + "description": "Angle in radians" + } + ], + "return": { + "type": "number", + "description": "Angle in degrees" + } + }, + "footage": {}, + "colorDepth": {}, + "dot": {}, + "cross": {}, + "gaussRandom": {}, + "noise": {} + }, + "aliases": { + "sum": "add", + "$bm_sum": "add", + "$bm_sub": "sub", + "$bm_mul": "mul", + "$bm_div": "div" + } +} diff --git a/schema/expressions.schema.json b/schema/expressions.schema.json new file mode 100644 index 00000000..61fc0c47 --- /dev/null +++ b/schema/expressions.schema.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://lottiefiles.github.io/lottie-docs/schema/expressions.schema.json", + "type": "object", + "$defs": { + "variable": { + "type": "object", + "properties": { + "description": {"type": "string"}, + "type": {"$ref": "#/$defs/type"}, + "default": {}, + "notes": {"type": "string"} + }, + "required": ["description", "type"] + }, + "parameter": { + "allOf": [ + { + "$ref": "#/$defs/variable" + }, + { + "type": "object", + "properties": { + "name": {"type": "string"} + }, + "required": ["name"] + } + ] + }, + "function_definition": { + "type": "object", + "properties": { + "return": {"$ref": "#/$defs/variable"}, + "description": {"type": "string"}, + "params": { + "type": "array", + "items": {"$ref": "#/$defs/parameter"} + } + } + }, + "function": { + "oneOf": [ + {"$ref": "#/$defs/function_definition"}, + { + "type": "array", + "items": {"$ref": "#/$defs/function_definition"} + }, + { + "type": "object", + "properties": { + "alias_of": {"type": "string"} + } + } + ] + }, + "type": { + "type": "string", + "bnf": { + "TYPE": "DESCRIPTION | SPECIFIC | OPTIONS", + "OPTIONS": "SPECIFIC | OPTIONS \| SPECIFIC", + "SPECIFIC": "any | number | boolean | string | object | ARRAY", + "ARRAY": "array | array [ NUMBER ]", + "NUMBER": "/[0-9]+/", + "DESCRIPTION": "/.+ .+/" + } + } + }, + "properties": { + "variables": { + "type": "object", + "patternProperties": { + ".+": {"$ref": "#/$defs/variable"} + } + }, + "functions": { + "type": "object", + "patternProperties": { + ".+": {"$ref": "#/$defs/function"} + } + }, + "aliases": { + "type": "object", + "description": "Map alias name to actual function" + } + } +} diff --git a/schema/helpers/bezier.json b/schema/helpers/bezier.json new file mode 100644 index 00000000..a5f43e7c --- /dev/null +++ b/schema/helpers/bezier.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Bezier", + "description": "Single bezier curve", + "properties": { + "c": { + "title": "Closed", + "type": "boolean", + "default": false + }, + "i": { + "title": "In Tangents", + "type": "array", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the `in` tangents relative to the corresponding `v`.", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + }, + "o": { + "title": "Out Tangents", + "type": "array", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the `out` tangents relative to the corresponding `v`.", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + }, + "v": { + "title": "Vertices", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the bezier path", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + } + }, + "required": ["i", "v", "o"] +} diff --git a/schema/helpers/color.json b/schema/helpers/color.json new file mode 100644 index 00000000..2e57784b --- /dev/null +++ b/schema/helpers/color.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "array", + "title": "Color", + "description": "Color as a [r, g, b] array with values in [0, 1]", + "items": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "minItems": 3, + "maxItems": 4 +} diff --git a/schema/helpers/int-boolean.json b/schema/helpers/int-boolean.json new file mode 100644 index 00000000..0f1d0eab --- /dev/null +++ b/schema/helpers/int-boolean.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "integer", + "title": "Integer Boolean", + "description": "Represents boolean values as an integer. 0 is false, 1 is true.", + "default": 0, + "examples": [0], + "enum": [0, 1], + "oneOf": [ + { + "title": "True", + "const": 1 + }, + { + "title": "False", + "const": 0 + } + ] +} diff --git a/schema/helpers/marker.json b/schema/helpers/marker.json new file mode 100644 index 00000000..e9b1fa62 --- /dev/null +++ b/schema/helpers/marker.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Marker", + "description": "Defines named portions of the composition.", + "properties": { + "cm": { + "title": "Comment", + "type": "string" + }, + "tm": { + "title": "Time", + "type": "number" + }, + "dr": { + "title": "Duration", + "type": "number" + } + } +} diff --git a/schema/helpers/mask.json b/schema/helpers/mask.json new file mode 100644 index 00000000..01004a8e --- /dev/null +++ b/schema/helpers/mask.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Mask", + "caniuse": "mask", + "description": "Bezier shape used to mask/clip a layer", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "inv": { + "title": "Inverted", + "caniuse": "mask-inverted", + "type": "boolean", + "default": false + }, + "pt": { + "title": "Shape", + "$ref": "#/$defs/animated-properties/shape-property" + }, + "o": { + "title": "Opacity", + "caniuse": "mask-opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "mode": { + "title": "Mode", + "caniuse": "mask-modes", + "$ref": "#/$defs/constants/mask-mode", + "default": "i" + }, + "x": { + "title": "Expand", + "caniuse": "mask-expansion", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] +} diff --git a/schema/helpers/transform.json b/schema/helpers/transform.json new file mode 100644 index 00000000..e4edc90d --- /dev/null +++ b/schema/helpers/transform.json @@ -0,0 +1,105 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Transform", + "description": "Layer transform", + "allOf": [ + { + "properties": { + "a": { + "title": "Anchor Point", + "caniuse": "transform-anchor-point", + "description": "Anchor point: a position (relative to its parent) around which transformations are applied (ie: center for rotation / scale)", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Scale", + "caniuse": "transform-scale", + "description": "Scale factor, `[100, 100]` for no scaling", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "o": { + "title": "Opacity", + "caniuse": "transform-opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "sk": { + "title": "Skew", + "caniuse": "transform-skew", + "description": "Skew amount as an angle in degrees", + "$ref": "#/$defs/animated-properties/value" + }, + "sa": { + "title": "Skew Axis", + "caniuse": "transform-skew", + "description": "Direction along which skew is applied, in degrees (`0` skews along the X axis, `90` along the Y axis)", + "$ref": "#/$defs/animated-properties/value" + } + } + }, + { + "anyOf": [ + { + "oneOf": [ + { + "properties": { + "p": { + "title": "Position", + "caniuse": "transform-position", + "description": "Position / Translation", + "$ref": "#/$defs/animated-properties/position" + } + } + }, + { + "properties": { + "p": { + "title": "Position", + "description": "Position / Translation with split components", + "$ref": "#/$defs/animated-properties/split-vector" + } + } + } + ] + }, + { + "oneOf": [ + { + "properties": { + "r": { + "title": "Rotation", + "caniuse": "transform-rotation", + "description": "Rotation in degrees, clockwise", + "$ref": "#/$defs/animated-properties/value" + } + } + }, + { + "properties": { + "rx": { + "title": "X Rotation", + "description": "Split rotation component", + "$ref": "#/$defs/animated-properties/value" + }, + "ry": { + "title": "Y Rotation", + "description": "Split rotation component", + "$ref": "#/$defs/animated-properties/value" + }, + "rz": { + "title": "Z Rotation", + "description": "Split rotation component, equivalent to `r` when not split", + "$ref": "#/$defs/animated-properties/value" + }, + "or": { + "title": "Orientation", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + } + } + ] + } + ] + } + ] +} diff --git a/schema/helpers/visual-object.json b/schema/helpers/visual-object.json new file mode 100644 index 00000000..50361764 --- /dev/null +++ b/schema/helpers/visual-object.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Visual Object", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "nm": { + "title": "Name", + "description": "Name, as seen from editors and the like", + "type": "string" + }, + "mn": { + "title": "Match Name", + "description": "Match name, used in expressions", + "type": "string" + } + }, + "required": [] + } + ] +} diff --git a/schema/index.html b/schema/index.html new file mode 100644 index 00000000..305db5b1 --- /dev/null +++ b/schema/index.html @@ -0,0 +1,6290 @@ + + + + + + + + + + + + + + JSON Schema - Lottie Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +

JSON Schema

+

This page shows a formatted version of the JSON schema, you can click on highlighted +objects to get a link to that section of the schema. You can also click on $ref +values to jump to the relevant section.

+

If you want you can also view the raw schema file.

+

+

{
+    "$schema": "https://json-schema.org/draft/2020-12/schema",
+    "$id": "https://lottiefiles.github.io/lottie-docs/schema/lottie.schema.json",
+    "type": "object",
+    "allOf": [
+        {
+            "$ref": "#/$defs/animation/animation"
+        }
+    ],
+    "$defs": {
+        "animated-properties": {
+            "value"  : {
+                "type": "object",
+                "title": "Value",
+                "description": "An animatable property that holds a float",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/animated-property"
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 0
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "title": "Static value",
+                                    "type": "number"
+                                }
+                            }
+                        }
+                    }
+                ]
+            },
+            "keyframe-bezier-handle"  : {
+                "type": "object",
+                "title": "Keyframe Bezier Handle",
+                "description": "Bezier handle for keyframe interpolation",
+                "properties": {
+                    "x": {
+                        "title": "X",
+                        "description": "Time component:\n0 means start time of the keyframe,\n1 means time of the next keyframe.",
+                        "oneOf": [
+                            {
+                                "type": "array",
+                                "items": {
+                                    "type": "number",
+                                    "default": 0,
+                                    "minimum": 0,
+                                    "maximum": 1
+                                },
+                                "minItems": 1
+                            },
+                            {
+                                "type": "number",
+                                "default": 0,
+                                "minimum": 0,
+                                "maximum": 1
+                            }
+                        ]
+                    },
+                    "y": {
+                        "title": "Y",
+                        "description": "Value interpolation component:\n0 means start value of the keyframe,\n1 means value at the next keyframe.",
+                        "oneOf": [
+                            {
+                                "type": "array",
+                                "items": {
+                                    "type": "number",
+                                    "default": 0,
+                                    "minimum": 0,
+                                    "maximum": 1
+                                },
+                                "minItems": 1
+                            },
+                            {
+                                "type": "number",
+                                "default": 0,
+                                "minimum": 0,
+                                "maximum": 1
+                            }
+                        ]
+                    }
+                },
+                "required": [
+                    "x",
+                    "y"
+                ]
+            },
+            "position"  : {
+                "type": "object",
+                "title": "Position Property",
+                "description": "An animatable property to represent a position in space",
+                "allOf": [
+                    {
+                        "properties": {
+                            "ix": {
+                                "title": "Property Index",
+                                "type": "integer"
+                            },
+                            "a": {
+                                "title": "Animated",
+                                "description": "Whether the property is animated",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            },
+                            "x": {
+                                "title": "Expression",
+                                "type": "string"
+                            },
+                            "l": {
+                                "title": "Length",
+                                "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.",
+                                "type": "integer"
+                            }
+                        }
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 1
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "type": "array",
+                                    "title": "Animated Value",
+                                    "description": "Array of keyframes",
+                                    "items": {
+                                        "$ref": "#/$defs/animated-properties/position-keyframe"
+                                    }
+                                }
+                            }
+                        },
+                        "else": {
+                            "properties": {
+                                "k": {
+                                    "title": "Static Value",
+                                    "type": "array",
+                                    "items": {
+                                        "type": "number"
+                                    }
+                                }
+                            }
+                        }
+                    }
+                ],
+                "required": [
+                    "k"
+                ]
+            },
+            "animated-property"  : {
+                "type": "object",
+                "title": "Animated Property",
+                "description": "An animatable property that holds an array of numbers",
+                "allOf": [
+                    {
+                        "properties": {
+                            "ix": {
+                                "title": "Property Index",
+                                "type": "integer"
+                            },
+                            "a": {
+                                "title": "Animated",
+                                "description": "Whether the property is animated",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            },
+                            "x": {
+                                "title": "Expression",
+                                "type": "string"
+                            },
+                            "sid": {
+                                "title": "Slot ID",
+                                "description": "One of the ID in the file's slots",
+                                "type": "string"
+                            }
+                        }
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 1
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "type": "array",
+                                    "title": "Animated Value",
+                                    "description": "Array of keyframes",
+                                    "items": {
+                                        "$ref": "#/$defs/animated-properties/keyframe"
+                                    }
+                                }
+                            }
+                        }
+                    }
+                ],
+                "required": [
+                    "k"
+                ]
+            },
+            "shape-keyframe"  : {
+                "type": "object",
+                "title": "Shape Keyframe",
+                "description": "Keyframe holding Bezier objects",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/keyframe-base"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "s": {
+                                "title": "Start",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/helpers/bezier"
+                                }
+                            }
+                        }
+                    }
+                ]
+            },
+            "position-keyframe"  : {
+                "type": "object",
+                "title": "Position Keyframe",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/keyframe"
+                    },
+                    {
+                        "properties": {
+                            "ti": {
+                                "title": "Value In Tangent",
+                                "description": "Tangent for values (eg: moving position around a curved path)",
+                                "type": "array",
+                                "items": {
+                                    "type": "number"
+                                }
+                            },
+                            "to": {
+                                "title": "Value Out Tangent",
+                                "description": "Tangent for values (eg: moving position around a curved path)",
+                                "type": "array",
+                                "items": {
+                                    "type": "number"
+                                }
+                            }
+                        }
+                    }
+                ]
+            },
+            "multi-dimensional"  : {
+                "type": "object",
+                "title": "Multi Dimensional",
+                "description": "An animatable property that holds an array of numbers",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/animated-property"
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 0
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "title": "Static value",
+                                    "type": "array",
+                                    "items": {
+                                        "type": "number"
+                                    }
+                                }
+                            }
+                        },
+                        "properties": {
+                            "l": {
+                                "title": "Length",
+                                "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.",
+                                "type": "integer"
+                            }
+                        }
+                    }
+                ]
+            },
+            "keyframe-base"  : {
+                "type": "object",
+                "title": "Base Keyframe",
+                "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.",
+                "allOf": [
+                    {
+                        "properties": {
+                            "t": {
+                                "title": "Time",
+                                "type": "number",
+                                "default": 0
+                            },
+                            "h": {
+                                "title": "Hold",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            }
+                        }
+                    },
+                    {
+                        "if": {
+                            "oneOf": [
+                                {
+                                    "properties": {
+                                        "h": {
+                                            "const": 0
+                                        }
+                                    }
+                                },
+                                {
+                                    "not": {
+                                        "required": [
+                                            "h"
+                                        ]
+                                    }
+                                }
+                            ]
+                        },
+                        "then": {
+                            "properties": {
+                                "i": {
+                                    "title": "In Tangent",
+                                    "description": "Easing tangent going into the next keyframe",
+                                    "$ref": "#/$defs/animated-properties/keyframe-bezier-handle"
+                                },
+                                "o": {
+                                    "title": "Out Tangent",
+                                    "description": "Easing tangent leaving the current keyframe",
+                                    "$ref": "#/$defs/animated-properties/keyframe-bezier-handle"
+                                }
+                            }
+                        }
+                    }
+                ],
+                "required": [
+                    "t",
+                    "s"
+                ]
+            },
+            "shape-property"    : {
+                "type": "object",
+                "title": "Shape Property",
+                "description": "An animatable property that holds a Bezier",
+                "allOf": [
+                    {
+                        "properties": {
+                            "ix": {
+                                "title": "Property Index",
+                                "type": "integer"
+                            },
+                            "a": {
+                                "title": "Animated",
+                                "description": "Whether the property is animated",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            },
+                            "x": {
+                                "title": "Expression",
+                                "type": "string"
+                            }
+                        }
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 1
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "type": "array",
+                                    "title": "Animated Value",
+                                    "description": "Array of keyframes",
+                                    "items": {
+                                        "$ref": "#/$defs/animated-properties/shape-keyframe"
+                                    }
+                                }
+                            }
+                        },
+                        "else": {
+                            "properties": {
+                                "k": {
+                                    "$ref": "#/$defs/helpers/bezier",
+                                    "title": "Static Value"
+                                }
+                            }
+                        }
+                    }
+                ],
+                "required": [
+                    "k"
+                ]
+            },
+            "gradient-colors"  : {
+                "type": "object",
+                "title": "Gradient Colors",
+                "description": "Represents colors and offsets in a gradient\n\nColors are represented as a flat list interleaving offsets and color components in weird ways\nThere are two possible layouts:\n\nWithout alpha, the colors are a sequence of offset, r, g, b\n\nWith alpha, same as above but at the end of the list there is a sequence of offset, alpha",
+                "properties": {
+                    "k": {
+                        "title": "Colors",
+                        "$ref": "#/$defs/animated-properties/multi-dimensional"
+                    },
+                    "p": {
+                        "title": "Count",
+                        "description": "Number of colors in k",
+                        "type": "integer",
+                        "default": 0
+                    }
+                },
+                "required": [
+                    "p",
+                    "k"
+                ]
+            },
+            "keyframe"  : {
+                "type": "object",
+                "title": "Keyframe",
+                "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/keyframe-base"
+                    },
+                    {
+                        "properties": {
+                            "s": {
+                                "title": "Value",
+                                "description": "Value at this keyframe. Note the if the property is a scalar, keyframe values are still represented as arrays",
+                                "type": "array",
+                                "items": {
+                                    "type": "number"
+                                }
+                            },
+                            "e": {
+                                "title": "End value",
+                                "description": "Value at the end of the keyframe, note that this is deprecated and you should use s from the next keyframe to get this value",
+                                "deprecated": true,
+                                "type": "array",
+                                "items": {
+                                    "type": "number"
+                                }
+                            }
+                        }
+                    },
+                    {
+                        "if": {
+                            "oneOf": [
+                                {
+                                    "properties": {
+                                        "h": {
+                                            "const": 0
+                                        }
+                                    }
+                                },
+                                {
+                                    "not": {
+                                        "required": [
+                                            "h"
+                                        ]
+                                    }
+                                }
+                            ]
+                        },
+                        "then": {
+                            "properties": {
+                                "i": {
+                                    "title": "In Tangent",
+                                    "description": "Easing tangent going into the next keyframe",
+                                    "$ref": "#/$defs/animated-properties/keyframe-bezier-handle"
+                                },
+                                "o": {
+                                    "title": "Out Tangent",
+                                    "description": "Easing tangent leaving the current keyframe",
+                                    "$ref": "#/$defs/animated-properties/keyframe-bezier-handle"
+                                }
+                            }
+                        }
+                    }
+                ],
+                "required": [
+                    "t",
+                    "s"
+                ]
+            },
+            "split-vector"  : {
+                "type": "object",
+                "title": "Split Vector",
+                "description": "An animatable property that is split into individually anaimated components",
+                "properties": {
+                    "s": {
+                        "title": "Split",
+                        "type": "boolean",
+                        "const": true
+                    },
+                    "x": {
+                        "title": "X",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "y": {
+                        "title": "Y",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "z": {
+                        "title": "Z",
+                        "$ref": "#/$defs/animated-properties/value"
+                    }
+                },
+                "required": [
+                    "s",
+                    "x",
+                    "y"
+                ]
+            },
+            "color-value"    : {
+                "type": "object",
+                "title": "Color Value",
+                "description": "An animatable property that holds a Color",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/animated-properties/animated-property"
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "a": {
+                                    "const": 0
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "k": {
+                                    "title": "Static value",
+                                    "$ref": "#/$defs/helpers/color"
+                                }
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        "animation": {
+            "composition"  : {
+                "type": "object",
+                "title": "Composition",
+                "description": "Base class for layer holders",
+                "properties": {
+                    "layers": {
+                        "title": "Layers",
+                        "type": "array",
+                        "items": {
+                            "oneOf": [
+                                {
+                                    "$ref": "#/$defs/layers/precomposition-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/solid-color-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/image-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/null-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/shape-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/text-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/audio-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/camera-layer"
+                                },
+                                {
+                                    "$ref": "#/$defs/layers/data-layer"
+                                }
+                            ]
+                        }
+                    }
+                },
+                "required": [
+                    "layers"
+                ]
+            },
+            "animation"  : {
+                "type": "object",
+                "title": "Animation",
+                "description": "Top level object, describing the animation",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "v": {
+                                "title": "Version",
+                                "type": "string",
+                                "default": "5.5.2"
+                            },
+                            "fr": {
+                                "title": "Framerate",
+                                "description": "Framerate in frames per second",
+                                "type": "number",
+                                "default": 60
+                            },
+                            "ip": {
+                                "title": "In Point",
+                                "description": "\"In Point\", which frame the animation starts at (usually 0)",
+                                "type": "number",
+                                "default": 0
+                            },
+                            "op": {
+                                "title": "Out Point",
+                                "description": "\"Out Point\", which frame the animation stops/loops at, which makes this the duration in frames when ip is 0",
+                                "type": "number",
+                                "default": 60
+                            },
+                            "w": {
+                                "title": "Width",
+                                "description": "Width of the animation",
+                                "type": "integer",
+                                "default": 512
+                            },
+                            "h": {
+                                "title": "Height",
+                                "description": "Height of the animation",
+                                "type": "integer",
+                                "default": 512
+                            },
+                            "ddd": {
+                                "title": "Threedimensional",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0,
+                                "description": "Whether the animation has 3D layers"
+                            },
+                            "assets": {
+                                "title": "Assets",
+                                "type": "array",
+                                "description": "List of assets that can be referenced by layers",
+                                "items": {
+                                    "oneOf": [
+                                        {
+                                            "$ref": "#/$defs/assets/image"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/assets/precomposition"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/assets/sound"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/assets/data-source"
+                                        }
+                                    ]
+                                }
+                            },
+                            "comps": {
+                                "title": "Extra Compositions",
+                                "type": "array",
+                                "description": "List of Extra compositions not referenced by anything",
+                                "items": {
+                                    "$ref": "#/$defs/assets/precomposition"
+                                }
+                            },
+                            "fonts": {
+                                "title": "Fonts",
+                                "$ref": "#/$defs/text/font-list"
+                            },
+                            "chars": {
+                                "title": "Characters",
+                                "description": "Data defining text characters as lottie shapes. If present a player might only render characters defined here and nothing else.",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/text/character-data"
+                                }
+                            },
+                            "meta": {
+                                "title": "Metadata",
+                                "description": "Document metadata",
+                                "$ref": "#/$defs/animation/metadata"
+                            },
+                            "metadata": {
+                                "title": "User Metadata",
+                                "$ref": "#/$defs/animation/user-metadata"
+                            },
+                            "markers": {
+                                "title": "Markers",
+                                "description": "Markers defining named sections of the composition.",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/helpers/marker"
+                                }
+                            },
+                            "mb": {
+                                "title": "Motion Blur",
+                                "$ref": "#/$defs/animation/motion-blur"
+                            },
+                            "slots": {
+                                "title": "Slots",
+                                "description": "Available property overrides",
+                                "type": "object",
+                                "patternProperties": {
+                                    ".*": {
+                                        "p": {
+                                            "anyOf": [
+                                                {
+                                                    "$ref": "#/$defs/animated-properties/multi-dimensional"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/animated-properties/color-value"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/animated-properties/position"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/animated-properties/shape-property"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/animated-properties/value"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/assets/image"
+                                                },
+                                                {
+                                                    "$ref": "#/$defs/text/animated-text-document"
+                                                }
+                                            ]
+                                        },
+                                        "required": [
+                                            "p"
+                                        ]
+                                    }
+                                }
+                            }
+                        },
+                        "required": [
+                            "w",
+                            "h",
+                            "fr",
+                            "layers",
+                            "op",
+                            "ip"
+                        ]
+                    },
+                    {
+                        "$ref": "#/$defs/animation/composition"
+                    }
+                ]
+            },
+            "motion-blur"  : {
+                "type": "object",
+                "title": "Motion Blur",
+                "description": "Motion blur settings",
+                "properties": {
+                    "sa": {
+                        "title": "Shutter Angle",
+                        "description": "Angle in degrees",
+                        "type": "number"
+                    },
+                    "sp": {
+                        "title": "Shutter Phase",
+                        "description": "Angle in degrees",
+                        "type": "number"
+                    },
+                    "spf": {
+                        "title": "Samples per Frame",
+                        "type": "number"
+                    },
+                    "asl": {
+                        "title": "Adaptive Sample Limit",
+                        "type": "number"
+                    }
+                }
+            },
+            "metadata"  : {
+                "type": "object",
+                "title": "Metadata",
+                "description": "Document metadata",
+                "properties": {
+                    "a": {
+                        "title": "Author",
+                        "type": "string"
+                    },
+                    "d": {
+                        "title": "Description",
+                        "type": "string"
+                    },
+                    "tc": {
+                        "title": "Theme Color",
+                        "type": "string"
+                    },
+                    "g": {
+                        "title": "Generator",
+                        "description": "Software used to generate the file",
+                        "type": "string"
+                    }
+                },
+                "anyOf": [
+                    {
+                        "properties": {
+                            "k": {
+                                "title": "Keywords",
+                                "type": "array",
+                                "items": {
+                                    "type": "string"
+                                }
+                            }
+                        }
+                    },
+                    {
+                        "properties": {
+                            "k": {
+                                "title": "Keywords",
+                                "type": "string"
+                            }
+                        }
+                    }
+                ]
+            },
+            "user-metadata"  : {
+                "type": "object",
+                "title": "User Metadata",
+                "description": "User-defined metadata",
+                "properties": {
+                    "filename": {
+                        "title": "Filename",
+                        "type": "string"
+                    },
+                    "customProps": {
+                        "title": "Custom Properties",
+                        "type": "object"
+                    }
+                }
+            }
+        },
+        "assets": {
+            "image"  : {
+                "type": "object",
+                "title": "Image",
+                "description": "External image",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/assets/file-asset"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "w": {
+                                "title": "Width",
+                                "description": "Width of the image",
+                                "type": "number",
+                                "default": 0
+                            },
+                            "h": {
+                                "title": "Height",
+                                "description": "Height of the image",
+                                "type": "number",
+                                "default": 0
+                            },
+                            "t": {
+                                "title": "Type",
+                                "description": "Marks as part of an image sequence if present",
+                                "type": "string",
+                                "const": "seq"
+                            },
+                            "sid": {
+                                "title": "Slot ID",
+                                "description": "One of the ID in the file's slots",
+                                "type": "string"
+                            }
+                        },
+                        "required": [
+                            "p"
+                        ]
+                    }
+                ]
+            },
+            "data-source"  : {
+                "type": "object",
+                "title": "Data source",
+                "description": "External data source, usually a JSON file",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/assets/file-asset"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "t": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 3
+                            }
+                        },
+                        "required": [
+                            "t"
+                        ]
+                    }
+                ]
+            },
+            "asset"  : {
+                "type": "object",
+                "title": "Asset",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "id": {
+                                "title": "ID",
+                                "description": "Unique identifier used by layers when referencing this asset",
+                                "type": "string",
+                                "default": ""
+                            },
+                            "nm": {
+                                "title": "Name",
+                                "description": "Human readable name",
+                                "type": "string"
+                            }
+                        },
+                        "required": [
+                            "id"
+                        ]
+                    }
+                ]
+            },
+            "file-asset"  : {
+                "type": "object",
+                "title": "File Asset",
+                "description": "Asset referencing a file",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/assets/asset"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "u": {
+                                "title": "Path",
+                                "description": "Path to the directory containing a file",
+                                "type": "string",
+                                "default": ""
+                            },
+                            "p": {
+                                "title": "File name",
+                                "description": "Filename or data url",
+                                "type": "string",
+                                "default": ""
+                            },
+                            "e": {
+                                "title": "Embedded",
+                                "description": "Whether the file is embedded",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            }
+                        },
+                        "required": [
+                            "p"
+                        ]
+                    }
+                ]
+            },
+            "precomposition"  : {
+                "type": "object",
+                "title": "Precomposition",
+                "description": "Asset containing an animation that can be referenced by layers.",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/assets/asset"
+                    },
+                    {
+                        "$ref": "#/$defs/animation/composition"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "fr": {
+                                "title": "Framerate",
+                                "description": "Framerate in frames per second",
+                                "type": "number"
+                            },
+                            "xt": {
+                                "title": "Extra",
+                                "description": "Extra composition",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            }
+                        }
+                    }
+                ]
+            },
+            "sound"  : {
+                "type": "object",
+                "title": "Sound",
+                "description": "External sound",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/assets/file-asset"
+                    }
+                ]
+            }
+        },
+        "constants": {
+            "fill-rule"  : {
+                "type": "integer",
+                "title": "Fill Rule",
+                "description": "Rule used to handle multiple shapes rendered with the same fill object",
+                "oneOf": [
+                    {
+                        "title": "Non Zero",
+                        "description": "Everything is colored (You can think of this as an OR)",
+                        "const": 1
+                    },
+                    {
+                        "title": "Even Odd",
+                        "description": "Colored based on intersections and path direction, can be used to create \"holes\"",
+                        "const": 2
+                    }
+                ]
+            },
+            "blend-mode"  : {
+                "type": "integer",
+                "title": "Blend Mode",
+                "description": "Layer and shape blend mode",
+                "caniuse": "blend-mode",
+                "oneOf": [
+                    {
+                        "title": "Normal",
+                        "const": 0
+                    },
+                    {
+                        "title": "Multiply",
+                        "const": 1
+                    },
+                    {
+                        "title": "Screen",
+                        "const": 2
+                    },
+                    {
+                        "title": "Overlay",
+                        "const": 3
+                    },
+                    {
+                        "title": "Darken",
+                        "const": 4
+                    },
+                    {
+                        "title": "Lighten",
+                        "const": 5
+                    },
+                    {
+                        "title": "Color Dodge",
+                        "const": 6
+                    },
+                    {
+                        "title": "Color Burn",
+                        "const": 7
+                    },
+                    {
+                        "title": "Hard Light",
+                        "const": 8
+                    },
+                    {
+                        "title": "Soft Light",
+                        "const": 9
+                    },
+                    {
+                        "title": "Difference",
+                        "const": 10
+                    },
+                    {
+                        "title": "Exclusion",
+                        "const": 11
+                    },
+                    {
+                        "title": "Hue",
+                        "const": 12
+                    },
+                    {
+                        "title": "Saturation",
+                        "const": 13
+                    },
+                    {
+                        "title": "Color",
+                        "const": 14
+                    },
+                    {
+                        "title": "Luminosity",
+                        "const": 15
+                    },
+                    {
+                        "title": "Add",
+                        "const": 16
+                    },
+                    {
+                        "title": "Hard Mix",
+                        "const": 17
+                    }
+                ]
+            },
+            "text-grouping"  : {
+                "type": "integer",
+                "title": "Text Grouping",
+                "description": "",
+                "oneOf": [
+                    {
+                        "title": "Characters",
+                        "const": 1
+                    },
+                    {
+                        "title": "Word",
+                        "const": 2
+                    },
+                    {
+                        "title": "Line",
+                        "const": 3
+                    },
+                    {
+                        "title": "All",
+                        "const": 4
+                    }
+                ]
+            },
+            "trim-multiple-shapes"  : {
+                "type": "integer",
+                "title": "Trim Multiple Shapes",
+                "description": "How to handle multiple shapes in trim path",
+                "oneOf": [
+                    {
+                        "title": "Simultaneously",
+                        "const": 1
+                    },
+                    {
+                        "title": "Individually",
+                        "const": 2
+                    }
+                ]
+            },
+            "composite"  : {
+                "type": "integer",
+                "title": "Composite",
+                "description": "How to stack copies in a repeater",
+                "oneOf": [
+                    {
+                        "title": "Above",
+                        "const": 1
+                    },
+                    {
+                        "title": "Below",
+                        "const": 2
+                    }
+                ]
+            },
+            "stroke-dash-type"  : {
+                "type": "string",
+                "title": "Stroke Dash Type",
+                "description": "Type of a dash item in a stroked line",
+                "oneOf": [
+                    {
+                        "title": "Dash",
+                        "const": "d"
+                    },
+                    {
+                        "title": "Gap",
+                        "const": "g"
+                    },
+                    {
+                        "title": "Offset",
+                        "const": "o"
+                    }
+                ]
+            },
+            "text-range-units"  : {
+                "type": "integer",
+                "title": "Text Range Units",
+                "description": "Unit type for a text selector",
+                "oneOf": [
+                    {
+                        "title": "Percent",
+                        "const": 1
+                    },
+                    {
+                        "title": "Index",
+                        "const": 2
+                    }
+                ]
+            },
+            "line-cap"  : {
+                "type": "integer",
+                "title": "Line Cap",
+                "description": "Style at the end of a stoked line",
+                "oneOf": [
+                    {
+                        "title": "Butt",
+                        "const": 1
+                    },
+                    {
+                        "title": "Round",
+                        "const": 2
+                    },
+                    {
+                        "title": "Square",
+                        "const": 3
+                    }
+                ]
+            },
+            "mask-mode"  : {
+                "type": "string",
+                "title": "Mask Mode",
+                "description": "How masks interact with each other. See https://helpx.adobe.com/after-effects/using/alpha-channels-masks-mattes.html",
+                "oneOf": [
+                    {
+                        "title": "None",
+                        "const": "n"
+                    },
+                    {
+                        "title": "Add",
+                        "const": "a"
+                    },
+                    {
+                        "title": "Subtract",
+                        "const": "s"
+                    },
+                    {
+                        "title": "Intersect",
+                        "const": "i"
+                    },
+                    {
+                        "title": "Lighten",
+                        "const": "l"
+                    },
+                    {
+                        "title": "Darken",
+                        "const": "d"
+                    },
+                    {
+                        "title": "Difference",
+                        "const": "f"
+                    }
+                ]
+            },
+            "gradient-type"  : {
+                "type": "integer",
+                "title": "Gradient Type",
+                "description": "Type of a gradient",
+                "oneOf": [
+                    {
+                        "title": "Linear",
+                        "type": "integer",
+                        "const": 1
+                    },
+                    {
+                        "title": "Radial",
+                        "type": "integer",
+                        "const": 2
+                    }
+                ]
+            },
+            "text-caps"  : {
+                "type": "integer",
+                "title": "Text Caps",
+                "oneOf": [
+                    {
+                        "title": "Regular",
+                        "const": 0
+                    },
+                    {
+                        "title": "All Caps",
+                        "const": 1
+                    },
+                    {
+                        "title": "Small Caps",
+                        "const": 2
+                    }
+                ],
+                "default": 0
+            },
+            "text-justify"  : {
+                "type": "integer",
+                "title": "Text Justify",
+                "description": "Text alignment / justification",
+                "oneOf": [
+                    {
+                        "title": "Left",
+                        "const": 0
+                    },
+                    {
+                        "title": "Right",
+                        "const": 1
+                    },
+                    {
+                        "title": "Center",
+                        "const": 2
+                    },
+                    {
+                        "title": "Justify with Last Line Left",
+                        "const": 3
+                    },
+                    {
+                        "title": "Justify with Last Line Right",
+                        "const": 4
+                    },
+                    {
+                        "title": "Justify with Last Line Center",
+                        "const": 5
+                    },
+                    {
+                        "title": "Justify with Last Line Full",
+                        "const": 6
+                    }
+                ]
+            },
+            "shape-direction"  : {
+                "type": "integer",
+                "title": "Shape Direction",
+                "description": "Drawing direction of the shape curve, useful for trim path",
+                "oneOf": [
+                    {
+                        "title": "Normal",
+                        "description": "Usually clockwise",
+                        "const": 1
+                    },
+                    {
+                        "title": "Reversed",
+                        "description": "Usually counter clockwise",
+                        "const": 3
+                    }
+                ]
+            },
+            "line-join"  : {
+                "type": "integer",
+                "title": "Line Join",
+                "description": "Style at a sharp corner of a stoked line",
+                "oneOf": [
+                    {
+                        "title": "Miter",
+                        "const": 1
+                    },
+                    {
+                        "title": "Round",
+                        "const": 2
+                    },
+                    {
+                        "title": "Bevel",
+                        "const": 3
+                    }
+                ]
+            },
+            "matte-mode"  : {
+                "type": "integer",
+                "title": "Matte Mode",
+                "description": "How a layer should mask another layer",
+                "oneOf": [
+                    {
+                        "title": "Normal",
+                        "const": 0
+                    },
+                    {
+                        "title": "Alpha",
+                        "const": 1
+                    },
+                    {
+                        "title": "Inverted Alpha",
+                        "const": 2
+                    },
+                    {
+                        "title": "Luma",
+                        "const": 3
+                    },
+                    {
+                        "title": "Inverted Luma",
+                        "const": 4
+                    }
+                ]
+            },
+            "text-based"  : {
+                "type": "integer",
+                "title": "Text Based",
+                "description": "",
+                "oneOf": [
+                    {
+                        "title": "Characters",
+                        "const": 1
+                    },
+                    {
+                        "title": "Character Excluding Spaces",
+                        "const": 2
+                    },
+                    {
+                        "title": "Words",
+                        "const": 3
+                    },
+                    {
+                        "title": "Lines",
+                        "const": 4
+                    }
+                ]
+            },
+            "font-path-origin"  : {
+                "type": "integer",
+                "title": "Font Path Origin",
+                "description": "",
+                "oneOf": [
+                    {
+                        "title": "Local",
+                        "const": 0
+                    },
+                    {
+                        "title": "Css Url",
+                        "const": 1
+                    },
+                    {
+                        "title": "Script Url",
+                        "const": 2
+                    },
+                    {
+                        "title": "Font Url",
+                        "const": 3
+                    }
+                ]
+            },
+            "text-shape"  : {
+                "type": "integer",
+                "title": "Text Shape",
+                "description": "Defines the function used to determine the interpolating factor on a text range selector.",
+                "oneOf": [
+                    {
+                        "title": "Square",
+                        "const": 1
+                    },
+                    {
+                        "title": "Ramp Up",
+                        "const": 2
+                    },
+                    {
+                        "title": "Ramp Down",
+                        "const": 3
+                    },
+                    {
+                        "title": "Triangle",
+                        "const": 4
+                    },
+                    {
+                        "title": "Round",
+                        "const": 5
+                    },
+                    {
+                        "title": "Smooth",
+                        "const": 6
+                    }
+                ]
+            },
+            "merge-mode"  : {
+                "type": "integer",
+                "title": "Merge Mode",
+                "description": "Boolean operation on shapes",
+                "oneOf": [
+                    {
+                        "title": "Normal",
+                        "const": 1
+                    },
+                    {
+                        "title": "Add",
+                        "const": 2
+                    },
+                    {
+                        "title": "Subtract",
+                        "const": 3
+                    },
+                    {
+                        "title": "Intersect",
+                        "const": 4
+                    },
+                    {
+                        "title": "Exclude Intersections",
+                        "const": 5
+                    }
+                ]
+            },
+            "star-type"  : {
+                "type": "integer",
+                "title": "Star Type",
+                "description": "Star or Polygon",
+                "oneOf": [
+                    {
+                        "title": "Star",
+                        "const": 1
+                    },
+                    {
+                        "title": "Polygon",
+                        "const": 2
+                    }
+                ]
+            }
+        },
+        "effect-values": {
+            "angle"  : {
+                "type": "object",
+                "title": "Effect Value Angle",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 1
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "ignored"  : {
+                "type": "object",
+                "title": "Ignored Value",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 6
+                            },
+                            "v": {
+                                "title": "Value",
+                                "type": "number",
+                                "default": 0
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "drop-down"  : {
+                "type": "object",
+                "title": "Effect Value Drop Down",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 7
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "checkbox"  : {
+                "type": "object",
+                "title": "Effect Value Checkbox",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 4
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "no-value"  : {
+                "type": "object",
+                "title": "Effect No Value",
+                "description": ""
+            },
+            "slider"  : {
+                "type": "object",
+                "title": "Effect Value Slider",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 0
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "effect-value"  : {
+                "type": "object",
+                "title": "Effect Value",
+                "description": "Value for an effect",
+                "caniuse": "effects",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ix": {
+                                "title": "Effect Index",
+                                "type": "integer"
+                            },
+                            "mn": {
+                                "title": "Match Name",
+                                "type": "string"
+                            },
+                            "nm": {
+                                "title": "Name",
+                                "type": "string"
+                            },
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "point"  : {
+                "type": "object",
+                "title": "Effect Value Point",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 3
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "color"  : {
+                "type": "object",
+                "title": "Effect Value Color",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 2
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "layer"  : {
+                "type": "object",
+                "title": "Effect Value Layer",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effect-values/effect-value"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 10
+                            },
+                            "v": {
+                                "title": "Value",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            }
+        },
+        "effects": {
+            "radial-wipe-effect"  : {
+                "type": "object",
+                "title": "Radial Wipe",
+                "caniuse": "effect-radial-wipe",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 26
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Completion",
+                                        "description": "Between 0 and 100",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Start Angle",
+                                        "$ref": "#/$defs/effect-values/angle"
+                                    },
+                                    {
+                                        "title": "Wipe Center",
+                                        "$ref": "#/$defs/effect-values/point"
+                                    },
+                                    {
+                                        "title": "Wipe",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Feather",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "puppet-effect"  : {
+                "type": "object",
+                "title": "Puppet Effect",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 34
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Puppet Engine",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Mesh Rotation Refinement",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "On Transparent",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "03",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "fill-effect"  : {
+                "type": "object",
+                "title": "Fill Effect",
+                "description": "Replaces the whole layer with the given color",
+                "caniuse": "effect-fill",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 21
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "00",
+                                        "$ref": "#/$defs/effect-values/point"
+                                    },
+                                    {
+                                        "title": "01",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "color",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "03",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "04",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "05",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "opacity",
+                                        "description": "Opacity in [0, 1]",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "effect"  : {
+                "type": "object",
+                "title": "Effect",
+                "description": "Layer effect",
+                "caniuse": "effects",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ef": {
+                                "title": "Effect Values",
+                                "type": "array",
+                                "items": {
+                                    "oneOf": [
+                                        {
+                                            "$ref": "#/$defs/effect-values/no-value"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/angle"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/checkbox"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/color"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/drop-down"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/ignored"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/layer"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/point"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effect-values/slider"
+                                        }
+                                    ]
+                                }
+                            },
+                            "np": {
+                                "title": "Property Count",
+                                "description": "Number of values in ef",
+                                "type": "integer"
+                            },
+                            "ix": {
+                                "title": "Effect Index",
+                                "type": "integer"
+                            },
+                            "ty": {
+                                "title": "Type",
+                                "description": "Effect type",
+                                "type": "integer"
+                            },
+                            "en": {
+                                "title": "Enabled",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 1
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "pro-levels-effect"  : {
+                "type": "object",
+                "title": "Pro Levels Effect",
+                "description": "",
+                "caniuse": "effect-color-levels-individual-controls",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 24
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "00",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "01",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    },
+                                    {
+                                        "title": "02",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    },
+                                    {
+                                        "title": "comp_inblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "comp_inwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "comp_gamma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "comp_outblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "comp_outwhite",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    },
+                                    {
+                                        "title": "08",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    },
+                                    {
+                                        "title": "09",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "r_inblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "r_inwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "r_gamma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "r_outblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "r_outwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "15",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "16",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "g_inblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "g_inwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "g_gamma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "g_outblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "g_outwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "22",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "23",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "b_inblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "b_inwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "b_gamma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "b_outblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "b_outwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "29",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "a_inblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "a_inwhite",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "a_gamma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "a_outblack",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "a_outwhite",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "tritone-effect"  : {
+                "type": "object",
+                "title": "Tritone Effect",
+                "description": "Maps layers colors based on bright/mid/dark colors",
+                "caniuse": "effect-tritone",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 23
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "bright",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "mid",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "dark",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "stroke-effect"  : {
+                "type": "object",
+                "title": "Stroke Effect",
+                "description": "",
+                "caniuse": "effect-stroke",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 22
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "00",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "01",
+                                        "$ref": "#/$defs/effect-values/checkbox"
+                                    },
+                                    {
+                                        "title": "02",
+                                        "$ref": "#/$defs/effect-values/checkbox"
+                                    },
+                                    {
+                                        "title": "color",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "04",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "05",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "06",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "07",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "08",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "09",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "type",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "custom-effect"  : {
+                "type": "object",
+                "title": "Custom Effect",
+                "description": "Some lottie files use ty = 5 for many different effects",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 5
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "mesh-warp-effect"  : {
+                "type": "object",
+                "title": "Mesh Warp Effect",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 31
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Rows",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Columns",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Quality",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "03",
+                                        "$ref": "#/$defs/effect-values/no-value"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "spherize-effect"  : {
+                "type": "object",
+                "title": "Spherize Effect",
+                "description": "",
+                "caniuse": "effect-cc-sphere",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 33
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "radius",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "center",
+                                        "$ref": "#/$defs/effect-values/point"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "drop-shadow-effect"  : {
+                "type": "object",
+                "title": "Drop Shadow Effect",
+                "description": "Adds a shadow to the layer",
+                "caniuse": "effect-drop-shadow",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 25
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "color",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "opacity",
+                                        "description": "Opacity between 0 and 255",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "angle",
+                                        "$ref": "#/$defs/effect-values/angle"
+                                    },
+                                    {
+                                        "title": "distance",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "blur",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "tint-effect"  : {
+                "type": "object",
+                "title": "Tint Effect",
+                "description": "Colorizes the layer",
+                "caniuse": "effect-tint",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 20
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Black Color",
+                                        "description": "Tint of the darker parts of the layer",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "White Color",
+                                        "description": "Tint of the lighter parts of the layer",
+                                        "$ref": "#/$defs/effect-values/color"
+                                    },
+                                    {
+                                        "title": "Intensity",
+                                        "description": "Intensity of the effect, 0 means the layer is unchanged. 100 means full effect",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "displacement-map-effect"  : {
+                "type": "object",
+                "title": "Displacement Map Effect",
+                "description": "",
+                "caniuse": "effect-displacement-map",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 27
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Displacement Map Layer",
+                                        "$ref": "#/$defs/effect-values/layer"
+                                    },
+                                    {
+                                        "title": "Use For Horizontal Displacement",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Max Horizontal Displacement",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Use For Vertical Displacement",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Max Vertical Displacement",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Displacement Map Behavior",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Edge Behavior",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Expand Output",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "matte3-effect"  : {
+                "type": "object",
+                "title": "Set Matte Effect",
+                "description": "Uses a layer as a mask",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 28
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Layer",
+                                        "description": "Use this layer as a mask",
+                                        "$ref": "#/$defs/effect-values/layer"
+                                    },
+                                    {
+                                        "title": "Channel",
+                                        "description": "Channel to use as a mask:\n1 - Red\n2 - Green\n3 - Blue\n4 - Alpha\n5 - Luminance\n6 - Hue\n7 - Lightness\n8 - Saturation\n9 - Full\n10 - Off",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Invert",
+                                        "description": "Use 0 as opaque value when true",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Stretch To Fit",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Show Mask",
+                                        "description": "If false, the mask layer won't be shown",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Premultiply Mask",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "wavy-effect"  : {
+                "type": "object",
+                "title": "Wavy Effect",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 32
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Radius",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Center",
+                                        "$ref": "#/$defs/effect-values/point"
+                                    },
+                                    {
+                                        "title": "Conversion type",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Speed",
+                                        "$ref": "#/$defs/effect-values/drop-down"
+                                    },
+                                    {
+                                        "title": "Width",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Height",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Phase",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "twirl-effect"  : {
+                "type": "object",
+                "title": "Twirl Effect",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 30
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "Angle",
+                                        "$ref": "#/$defs/effect-values/angle"
+                                    },
+                                    {
+                                        "title": "Radius",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "Center",
+                                        "$ref": "#/$defs/effect-values/point"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ef"
+                        ]
+                    }
+                ]
+            },
+            "gaussian-blur-effect"  : {
+                "type": "object",
+                "title": "Gaussian Blur Effect",
+                "description": "Gaussian blur",
+                "caniuse": "effect-gaussian-blur",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/effects/effect"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "type": "integer",
+                                "const": 29
+                            },
+                            "ef": {
+                                "title": "Effect values",
+                                "type": "array",
+                                "prefixItems": [
+                                    {
+                                        "title": "sigma",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "direction",
+                                        "$ref": "#/$defs/effect-values/slider"
+                                    },
+                                    {
+                                        "title": "wrap",
+                                        "$ref": "#/$defs/effect-values/checkbox"
+                                    }
+                                ]
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            }
+        },
+        "helpers": {
+            "mask"  : {
+                "type": "object",
+                "title": "Mask",
+                "caniuse": "mask",
+                "description": "Bezier shape used to mask/clip a layer",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "inv": {
+                                "title": "Inverted",
+                                "caniuse": "mask-inverted",
+                                "type": "boolean",
+                                "default": false
+                            },
+                            "pt": {
+                                "title": "Shape",
+                                "$ref": "#/$defs/animated-properties/shape-property"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "caniuse": "mask-opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "mode": {
+                                "title": "Mode",
+                                "caniuse": "mask-modes",
+                                "$ref": "#/$defs/constants/mask-mode",
+                                "default": "i"
+                            },
+                            "x": {
+                                "title": "Expand",
+                                "caniuse": "mask-expansion",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "marker"  : {
+                "type": "object",
+                "title": "Marker",
+                "description": "Defines named portions of the composition.",
+                "properties": {
+                    "cm": {
+                        "title": "Comment",
+                        "type": "string"
+                    },
+                    "tm": {
+                        "title": "Time",
+                        "type": "number"
+                    },
+                    "dr": {
+                        "title": "Duration",
+                        "type": "number"
+                    }
+                }
+            },
+            "bezier"  : {
+                "type": "object",
+                "title": "Bezier",
+                "description": "Single bezier curve",
+                "properties": {
+                    "c": {
+                        "title": "Closed",
+                        "type": "boolean",
+                        "default": false
+                    },
+                    "i": {
+                        "title": "In Tangents",
+                        "type": "array",
+                        "description": "Array of points, each point is an array of coordinates.\nThese points are along the in tangents relative to the corresponding v.",
+                        "items": {
+                            "type": "array",
+                            "items": {
+                                "type": "number",
+                                "default": []
+                            }
+                        }
+                    },
+                    "o": {
+                        "title": "Out Tangents",
+                        "type": "array",
+                        "description": "Array of points, each point is an array of coordinates.\nThese points are along the out tangents relative to the corresponding v.",
+                        "items": {
+                            "type": "array",
+                            "items": {
+                                "type": "number",
+                                "default": []
+                            }
+                        }
+                    },
+                    "v": {
+                        "title": "Vertices",
+                        "description": "Array of points, each point is an array of coordinates.\nThese points are along the bezier path",
+                        "type": "array",
+                        "items": {
+                            "type": "array",
+                            "items": {
+                                "type": "number",
+                                "default": []
+                            }
+                        }
+                    }
+                },
+                "required": [
+                    "i",
+                    "v",
+                    "o"
+                ]
+            },
+            "visual-object": {
+                "type": "object",
+                "title": "Visual Object",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "nm": {
+                                "title": "Name",
+                                "description": "Name, as seen from editors and the like",
+                                "type": "string"
+                            },
+                            "mn": {
+                                "title": "Match Name",
+                                "description": "Match name, used in expressions",
+                                "type": "string"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "transform"  : {
+                "type": "object",
+                "title": "Transform",
+                "description": "Layer transform",
+                "allOf": [
+                    {
+                        "properties": {
+                            "a": {
+                                "title": "Anchor Point",
+                                "caniuse": "transform-anchor-point",
+                                "description": "Anchor point: a position (relative to its parent) around which transformations are applied (ie: center for rotation / scale)",
+                                "$ref": "#/$defs/animated-properties/position"
+                            },
+                            "s": {
+                                "title": "Scale",
+                                "caniuse": "transform-scale",
+                                "description": "Scale factor, [100, 100] for no scaling",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "caniuse": "transform-opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sk": {
+                                "title": "Skew",
+                                "caniuse": "transform-skew",
+                                "description": "Skew amount as an angle in degrees",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sa": {
+                                "title": "Skew Axis",
+                                "caniuse": "transform-skew",
+                                "description": "Direction along which skew is applied, in degrees (0 skews along the X axis, 90 along the Y axis)",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        }
+                    },
+                    {
+                        "anyOf": [
+                            {
+                                "oneOf": [
+                                    {
+                                        "properties": {
+                                            "p": {
+                                                "title": "Position",
+                                                "caniuse": "transform-position",
+                                                "description": "Position / Translation",
+                                                "$ref": "#/$defs/animated-properties/position"
+                                            }
+                                        }
+                                    },
+                                    {
+                                        "properties": {
+                                            "p": {
+                                                "title": "Position",
+                                                "description": "Position / Translation with split components",
+                                                "$ref": "#/$defs/animated-properties/split-vector"
+                                            }
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "oneOf": [
+                                    {
+                                        "properties": {
+                                            "r": {
+                                                "title": "Rotation",
+                                                "caniuse": "transform-rotation",
+                                                "description": "Rotation in degrees, clockwise",
+                                                "$ref": "#/$defs/animated-properties/value"
+                                            }
+                                        }
+                                    },
+                                    {
+                                        "properties": {
+                                            "rx": {
+                                                "title": "X Rotation",
+                                                "description": "Split rotation component",
+                                                "$ref": "#/$defs/animated-properties/value"
+                                            },
+                                            "ry": {
+                                                "title": "Y Rotation",
+                                                "description": "Split rotation component",
+                                                "$ref": "#/$defs/animated-properties/value"
+                                            },
+                                            "rz": {
+                                                "title": "Z Rotation",
+                                                "description": "Split rotation component, equivalent to r when not split",
+                                                "$ref": "#/$defs/animated-properties/value"
+                                            },
+                                            "or": {
+                                                "title": "Orientation",
+                                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                                            }
+                                        }
+                                    }
+                                ]
+                            }
+                        ]
+                    }
+                ]
+            },
+            "int-boolean"  : {
+                "type": "integer",
+                "title": "Integer Boolean",
+                "description": "Represents boolean values as an integer. 0 is false, 1 is true.",
+                "default": 0,
+                "examples": [
+                    0
+                ],
+                "enum": [
+                    0,
+                    1
+                ],
+                "oneOf": [
+                    {
+                        "title": "True",
+                        "const": 1
+                    },
+                    {
+                        "title": "False",
+                        "const": 0
+                    }
+                ]
+            },
+            "color"  : {
+                "type": "array",
+                "title": "Color",
+                "description": "Color as a [r, g, b] array with values in [0, 1]",
+                "items": {
+                    "type": "number",
+                    "minimum": 0,
+                    "maximum": 1
+                },
+                "minItems": 3,
+                "maxItems": 4
+            }
+        },
+        "layers": {
+            "precomposition-layer"  : {
+                "type": "object",
+                "title": "Precomposition Layer",
+                "description": "Layer that renders a Precomposition asset",
+                "caniuse": "layer-precomp",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 0
+                            },
+                            "refId": {
+                                "title": "Reference Id",
+                                "description": "ID of the precomp as specified in the assets",
+                                "type": "string"
+                            },
+                            "w": {
+                                "title": "Width",
+                                "description": "Width of the clipping rect",
+                                "type": "integer"
+                            },
+                            "h": {
+                                "title": "Height",
+                                "description": "Height of the clipping rect",
+                                "type": "integer"
+                            },
+                            "tm": {
+                                "title": "Time Remapping",
+                                "caniuse": "property-timeremap",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "refId",
+                            "w",
+                            "h"
+                        ]
+                    }
+                ]
+            },
+            "null-layer"  : {
+                "type": "object",
+                "title": "Null Layer",
+                "description": "Layer with no data, useful to group layers together",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 3
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "visual-layer"  : {
+                "type": "object",
+                "title": "Visual Layer",
+                "description": "Layer used to affect visual elements",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ks": {
+                                "title": "Transform",
+                                "caniuse": "transform",
+                                "description": "Layer transform",
+                                "$ref": "#/$defs/helpers/transform"
+                            },
+                            "ao": {
+                                "title": "Auto Orient",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0,
+                                "description": "If 1, The layer will rotate itself to match its animated position path"
+                            },
+                            "tt": {
+                                "title": "Matte Mode",
+                                "caniuse": "property-matte-mask",
+                                "$ref": "#/$defs/constants/matte-mode",
+                                "description": "Defines the track matte mode for the layer"
+                            },
+                            "tp": {
+                                "title": "Matte Parent",
+                                "type": "integer",
+                                "description": "Index of the layer used as matte, if omitted assume the layer above the current one"
+                            },
+                            "td": {
+                                "title": "Matte Target",
+                                "caniuse": "property-matte-mask",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "description": "If set to 1, it means a layer is using this layer as a track matte"
+                            },
+                            "hasMask": {
+                                "title": "Has Masks",
+                                "caniuse": "mask",
+                                "description": "Whether the layer has masks applied",
+                                "type": "boolean"
+                            },
+                            "masksProperties": {
+                                "title": "Masks",
+                                "caniuse": "mask",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/helpers/mask"
+                                }
+                            },
+                            "ef": {
+                                "title": "Effects",
+                                "description": "List of layer effects",
+                                "caniuse": "effects",
+                                "type": "array",
+                                "items": {
+                                    "oneOf": [
+                                        {
+                                            "$ref": "#/$defs/effects/custom-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/drop-shadow-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/fill-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/gaussian-blur-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/matte3-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/pro-levels-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/stroke-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/tint-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/tritone-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/radial-wipe-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/wavy-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/puppet-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/spherize-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/mesh-warp-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/displacement-map-effect"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/effects/twirl-effect"
+                                        }
+                                    ]
+                                }
+                            },
+                            "mb": {
+                                "title": "Motion Blur",
+                                "description": "Whether motion blur is enabled for the layer",
+                                "type": "boolean"
+                            },
+                            "sy": {
+                                "title": "Layer style",
+                                "caniuse": "styles",
+                                "description": "Styling effects for this layer",
+                                "type": "array",
+                                "items": {
+                                    "oneOf": [
+                                        {
+                                            "$ref": "#/$defs/styles/stroke-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/drop-shadow-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/inner-shadow-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/outer-glow-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/inner-glow-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/bevel-emboss-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/satin-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/color-overlay-style"
+                                        },
+                                        {
+                                            "$ref": "#/$defs/styles/gradient-overlay-style"
+                                        }
+                                    ]
+                                }
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/constants/blend-mode",
+                                "default": 0
+                            },
+                            "cl": {
+                                "title": "CSS Class",
+                                "description": "CSS class used by the SVG renderer",
+                                "type": "string"
+                            },
+                            "ln": {
+                                "title": "Layer XML ID",
+                                "description": "id attribute used by the SVG renderer",
+                                "type": "string"
+                            },
+                            "tg": {
+                                "title": "Layer XML tag name",
+                                "description": "tag name used by the SVG renderer",
+                                "type": "string"
+                            },
+                            "cp": {
+                                "deprecated": true,
+                                "title": "Collapse Transform",
+                                "description": "This is deprecated in favour of ct",
+                                "type": "boolean"
+                            },
+                            "ct": {
+                                "title": "Collapse Transform",
+                                "description": "Marks that transforms should be applied before masks",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            }
+                        },
+                        "required": [
+                            "ks"
+                        ]
+                    }
+                ]
+            },
+            "camera-layer"  : {
+                "type": "object",
+                "title": "Camera Layer",
+                "description": "3D Camera",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 13
+                            },
+                            "ks": {
+                                "title": "Transform",
+                                "description": "Layer transform",
+                                "$ref": "#/$defs/helpers/transform"
+                            },
+                            "pe": {
+                                "title": "Perspective",
+                                "description": "Distance from the Z=0 plane.\nSmall values yield a higher perspective effect.",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ks",
+                            "pe"
+                        ]
+                    }
+                ]
+            },
+            "solid-color-layer"  : {
+                "type": "object",
+                "title": "Solid Color Layer",
+                "description": "Layer with a solid color rectangle",
+                "caniuse": "layer-solid",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 1
+                            },
+                            "sc": {
+                                "title": "Color",
+                                "description": "Color of the layer, unlike most other places, the color is a #rrggbb hex string",
+                                "type": "string",
+                                "default": ""
+                            },
+                            "sh": {
+                                "title": "Height",
+                                "type": "number"
+                            },
+                            "sw": {
+                                "title": "Width",
+                                "type": "number"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "sc",
+                            "sw",
+                            "sh"
+                        ]
+                    }
+                ]
+            },
+            "audio-layer"  : {
+                "type": "object",
+                "title": "Audio Layer",
+                "description": "A layer playing sounds",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 6
+                            },
+                            "au": {
+                                "title": "Audio Settings",
+                                "$ref": "#/$defs/layers/audio-settings"
+                            },
+                            "refId": {
+                                "title": "Sound Id",
+                                "description": "ID of the sound as specified in the assets",
+                                "type": "string"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "au"
+                        ]
+                    }
+                ]
+            },
+            "data-layer"  : {
+                "type": "object",
+                "title": "Data Layer",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 15
+                            },
+                            "refId": {
+                                "title": "Data source Id",
+                                "description": "ID of the data source in assets",
+                                "type": "string"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "audio-settings"  : {
+                "type": "object",
+                "title": "Audio Settings",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "lv": {
+                                "title": "Level",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            }
+                        },
+                        "required": [
+                            "lv"
+                        ]
+                    }
+                ]
+            },
+            "shape-layer"  : {
+                "type": "object",
+                "title": "Shape Layer",
+                "description": "Layer containing Shapes",
+                "caniuse": "layer-shape",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 4
+                            },
+                            "shapes": {
+                                "title": "Shapes",
+                                "$ref": "#/$defs/shapes/shape-list"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "shapes"
+                        ]
+                    }
+                ]
+            },
+            "image-layer"  : {
+                "type": "object",
+                "title": "Image Layer",
+                "description": "Layer that shows an image asset",
+                "caniuse": "layer-image",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 2
+                            },
+                            "refId": {
+                                "title": "Image Id",
+                                "description": "ID of the image as specified in the assets",
+                                "type": "string",
+                                "default": ""
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "refId"
+                        ]
+                    }
+                ]
+            },
+            "layer"  : {
+                "type": "object",
+                "title": "Layer",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ddd": {
+                                "title": "Threedimensional",
+                                "description": "Whether the layer is threedimensional",
+                                "$ref": "#/$defs/helpers/int-boolean",
+                                "default": 0
+                            },
+                            "hd": {
+                                "title": "Hidden",
+                                "description": "Whether the layer is hidden",
+                                "type": "boolean"
+                            },
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "oneOf": [
+                                    {
+                                        "const": 0,
+                                        "title": "Precomposition layer"
+                                    },
+                                    {
+                                        "const": 1,
+                                        "title": "Solid color layer"
+                                    },
+                                    {
+                                        "const": 2,
+                                        "title": "Image layer"
+                                    },
+                                    {
+                                        "const": 3,
+                                        "title": "Null layer"
+                                    },
+                                    {
+                                        "const": 4,
+                                        "title": "Shape layer"
+                                    },
+                                    {
+                                        "const": 5,
+                                        "title": "Text layer"
+                                    },
+                                    {
+                                        "const": 6,
+                                        "title": "Audio layer"
+                                    },
+                                    {
+                                        "const": 7,
+                                        "title": "Video placeholder"
+                                    },
+                                    {
+                                        "const": 8,
+                                        "title": "Image sequence"
+                                    },
+                                    {
+                                        "const": 9,
+                                        "title": "Video layer"
+                                    },
+                                    {
+                                        "const": 10,
+                                        "title": "Image placeholder"
+                                    },
+                                    {
+                                        "const": 11,
+                                        "title": "Guide layer"
+                                    },
+                                    {
+                                        "const": 12,
+                                        "title": "Adjustment layer"
+                                    },
+                                    {
+                                        "const": 13,
+                                        "title": "Camera"
+                                    },
+                                    {
+                                        "const": 14,
+                                        "title": "Light layer"
+                                    },
+                                    {
+                                        "const": 15,
+                                        "title": "Data layer"
+                                    }
+                                ]
+                            },
+                            "ind": {
+                                "title": "Index",
+                                "type": "integer",
+                                "description": "Index that can be used for parenting and referenced in expressions"
+                            },
+                            "parent": {
+                                "title": "Parent Index",
+                                "description": "Must be the ind property of another layer",
+                                "type": "integer"
+                            },
+                            "sr": {
+                                "title": "Time Stretch",
+                                "caniuse": "property-time-stretch",
+                                "type": "number",
+                                "default": 1
+                            },
+                            "ip": {
+                                "title": "In Point",
+                                "description": "Frame when the layer becomes visible",
+                                "type": "number"
+                            },
+                            "op": {
+                                "title": "Out Point",
+                                "description": "Frame when the layer becomes invisible",
+                                "type": "number"
+                            },
+                            "st": {
+                                "title": "Start Time",
+                                "type": "number",
+                                "default": 0
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "st",
+                            "ip",
+                            "op"
+                        ]
+                    }
+                ]
+            },
+            "text-layer"  : {
+                "type": "object",
+                "title": "Text Layer",
+                "description": "Layer with some text",
+                "caniuse": "layer-text",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/layers/visual-layer"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer type",
+                                "type": "integer",
+                                "const": 5
+                            },
+                            "t": {
+                                "title": "Data",
+                                "$ref": "#/$defs/text/text-data"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "t"
+                        ]
+                    }
+                ]
+            }
+        },
+        "shapes": {
+            "modifier"  : {
+                "type": "object",
+                "title": "Modifier",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    }
+                ]
+            },
+            "ellipse"  : {
+                "type": "object",
+                "title": "Ellipse",
+                "description": "Ellipse shape",
+                "caniuse": "shape-ellipse",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "el"
+                            },
+                            "p": {
+                                "title": "Position",
+                                "$ref": "#/$defs/animated-properties/position"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "s",
+                            "p"
+                        ]
+                    }
+                ]
+            },
+            "shape-list"  : {
+                "title": "Shape List",
+                "description": "List of valid shapes",
+                "type": "array",
+                "items": {
+                    "oneOf": [
+                        {
+                            "$ref": "#/$defs/shapes/ellipse"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/fill"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/gradient-fill"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/gradient-stroke"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/group"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/path"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/polystar"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/pucker-bloat"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/rectangle"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/repeater"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/rounded-corners"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/stroke"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/transform"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/trim"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/twist"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/merge"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/offset-path"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/zig-zag"
+                        },
+                        {
+                            "$ref": "#/$defs/shapes/no-style"
+                        }
+                    ]
+                }
+            },
+            "stroke-dash"  : {
+                "type": "object",
+                "title": "Stroke Dash",
+                "description": "An item used to described the dashe pattern in a stroked path",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "n": {
+                                "title": "Dash Type",
+                                "$ref": "#/$defs/constants/stroke-dash-type",
+                                "default": "d"
+                            },
+                            "v": {
+                                "title": "Length",
+                                "description": "Length of the dash",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "repeater-transform"  : {
+                "type": "object",
+                "title": "Repeater Transform",
+                "description": "Transform used by a repeater, the transform is applied to each subsequent repeated object.",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/transform"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "so": {
+                                "title": "Start Opacity",
+                                "description": "Opacity of the first repeated object.",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "eo": {
+                                "title": "End Opacity",
+                                "description": "Opacity of the last repeated object.",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "twist"  : {
+                "type": "object",
+                "title": "Twist",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "tw"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "c": {
+                                "title": "Center",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "offset-path"  : {
+                "type": "object",
+                "title": "Offset Path",
+                "caniuse": "shape-offset-path",
+                "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "op"
+                            },
+                            "a": {
+                                "title": "Amount",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "lj": {
+                                "title": "Line Join",
+                                "$ref": "#/$defs/constants/line-join",
+                                "default": 2
+                            },
+                            "ml": {
+                                "title": "Miter Limit",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "gradient"  : {
+                "type": "object",
+                "title": "Gradient",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "s": {
+                                "title": "Start Point",
+                                "description": "Starting point for the gradient",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            },
+                            "e": {
+                                "title": "End Point",
+                                "description": "End point for the gradient",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            },
+                            "t": {
+                                "title": "Gradient Type",
+                                "description": "Type of the gradient",
+                                "$ref": "#/$defs/constants/gradient-type",
+                                "default": 1
+                            },
+                            "h": {
+                                "title": "Highlight Length",
+                                "description": "Highlight Length, as a percentage between s and e",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Highlight Angle",
+                                "description": "Highlight Angle, relative to the direction from s to e",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "g": {
+                                "title": "Colors",
+                                "description": "Gradient colors",
+                                "$ref": "#/$defs/animated-properties/gradient-colors"
+                            }
+                        },
+                        "required": [
+                            "s",
+                            "e",
+                            "g"
+                        ]
+                    }
+                ]
+            },
+            "gradient-stroke"  : {
+                "type": "object",
+                "title": "Gradient Stroke",
+                "description": "Gradient stroke",
+                "caniuse": "shape-stroke-gradient",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "$ref": "#/$defs/shapes/base-stroke"
+                    },
+                    {
+                        "$ref": "#/$defs/shapes/gradient"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "gs"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "polystar"  : {
+                "type": "object",
+                "title": "PolyStar",
+                "description": "Star or regular polygon",
+                "caniuse": "shape-polystar",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "sr"
+                            },
+                            "p": {
+                                "title": "Position",
+                                "$ref": "#/$defs/animated-properties/position"
+                            },
+                            "or": {
+                                "title": "Outer Radius",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "os": {
+                                "title": "Outer Roundness",
+                                "description": "Outer Roundness as a percentage",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "r": {
+                                "title": "Rotation",
+                                "description": "Rotation, clockwise in degrees",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "pt": {
+                                "title": "Points",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sy": {
+                                "title": "Star Type",
+                                "description": "Star type, 1 for Star, 2 for Polygon",
+                                "$ref": "#/$defs/constants/star-type",
+                                "default": 1
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "or",
+                            "os",
+                            "pt",
+                            "p",
+                            "r"
+                        ]
+                    },
+                    {
+                        "if": {
+                            "properties": {
+                                "sy": {
+                                    "const": 1
+                                }
+                            }
+                        },
+                        "then": {
+                            "properties": {
+                                "ir": {
+                                    "title": "Inner Radius",
+                                    "$ref": "#/$defs/animated-properties/value"
+                                },
+                                "is": {
+                                    "title": "Inner Roundness",
+                                    "description": "Inner Roundness as a percentage",
+                                    "$ref": "#/$defs/animated-properties/value"
+                                }
+                            },
+                            "required": [
+                                "ir",
+                                "is"
+                            ]
+                        }
+                    }
+                ]
+            },
+            "shape-element"  : {
+                "type": "object",
+                "title": "Shape Element",
+                "description": "Base class for all elements of ShapeLayer and Group",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "hd": {
+                                "title": "Hidden",
+                                "description": "Whether the shape is hidden",
+                                "type": "boolean"
+                            },
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "oneOf": [
+                                    {
+                                        "const": "rc",
+                                        "title": "Rectangle"
+                                    },
+                                    {
+                                        "const": "el",
+                                        "title": "Ellipse"
+                                    },
+                                    {
+                                        "const": "sr",
+                                        "title": "Polygon / Star"
+                                    },
+                                    {
+                                        "const": "sh",
+                                        "title": "Path"
+                                    },
+                                    {
+                                        "const": "fl",
+                                        "title": "Fill"
+                                    },
+                                    {
+                                        "const": "st",
+                                        "title": "Stroke"
+                                    },
+                                    {
+                                        "const": "gf",
+                                        "title": "Gradient fill"
+                                    },
+                                    {
+                                        "const": "gs",
+                                        "title": "Gradient stroke"
+                                    },
+                                    {
+                                        "const": "no",
+                                        "title": "No Style"
+                                    },
+                                    {
+                                        "const": "gr",
+                                        "title": "Group"
+                                    },
+                                    {
+                                        "const": "tr",
+                                        "title": "Transform"
+                                    },
+                                    {
+                                        "const": "rd",
+                                        "title": "Rounded corners"
+                                    },
+                                    {
+                                        "const": "pb",
+                                        "title": "Pucker / bloat"
+                                    },
+                                    {
+                                        "const": "mm",
+                                        "title": "Merge"
+                                    },
+                                    {
+                                        "const": "tw",
+                                        "title": "Twist"
+                                    },
+                                    {
+                                        "const": "op",
+                                        "title": "Offset path"
+                                    },
+                                    {
+                                        "const": "zz",
+                                        "title": "Zig zag"
+                                    },
+                                    {
+                                        "const": "rp",
+                                        "title": "Repeater"
+                                    },
+                                    {
+                                        "const": "tm",
+                                        "title": "Trim"
+                                    }
+                                ]
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/constants/blend-mode"
+                            },
+                            "ix": {
+                                "title": "Property index",
+                                "description": "Index used in expressions",
+                                "type": "integer"
+                            },
+                            "cl": {
+                                "title": "CSS Class",
+                                "description": "CSS class used by the SVG renderer",
+                                "type": "string"
+                            },
+                            "ln": {
+                                "title": "Layer XML ID",
+                                "description": "id attribute used by the SVG renderer",
+                                "type": "string"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "group"  : {
+                "type": "object",
+                "title": "Group",
+                "description": "Shape Element that can contain other shapes",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "gr"
+                            },
+                            "np": {
+                                "title": "Number Of Properties",
+                                "type": "number"
+                            },
+                            "it": {
+                                "title": "Shapes",
+                                "$ref": "#/$defs/shapes/shape-list"
+                            },
+                            "cix": {
+                                "title": "Property index",
+                                "description": "Index used in expressions",
+                                "type": "integer"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "fill"  : {
+                "type": "object",
+                "title": "Fill",
+                "description": "Solid fill color",
+                "caniuse": "shape-fill",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "fl"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "description": "Opacity, 100 means fully opaque",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "r": {
+                                "title": "Fill Rule",
+                                "$ref": "#/$defs/constants/fill-rule"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "c",
+                            "o"
+                        ]
+                    }
+                ]
+            },
+            "gradient-fill"  : {
+                "type": "object",
+                "title": "Gradient Fill",
+                "description": "Gradient fill",
+                "caniuse": "shape-fill-gradient",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "$ref": "#/$defs/shapes/gradient"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "gf"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "r": {
+                                "title": "Fill Rule",
+                                "$ref": "#/$defs/constants/fill-rule"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "o"
+                        ]
+                    }
+                ]
+            },
+            "path"  : {
+                "type": "object",
+                "title": "Path",
+                "description": "Animatable Bezier curve",
+                "caniuse": "shape-path",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "sh"
+                            },
+                            "ks": {
+                                "title": "Shape",
+                                "description": "Bezier path",
+                                "$ref": "#/$defs/animated-properties/shape-property"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "ks"
+                        ]
+                    }
+                ]
+            },
+            "merge"  : {
+                "type": "object",
+                "title": "Merge",
+                "caniuse": "shape-merge-path",
+                "description": "Boolean operator on shapes",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "mm"
+                            },
+                            "mm": {
+                                "title": "Merge Mode",
+                                "$ref": "#/$defs/constants/merge-mode",
+                                "default": 1
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "repeater"  : {
+                "type": "object",
+                "title": "Repeater",
+                "description": "Duplicates previous shapes in a group",
+                "caniuse": "shape-repeater",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/modifier"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "rp"
+                            },
+                            "c": {
+                                "title": "Copies",
+                                "description": "Number of copies",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "o": {
+                                "title": "Offset",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "m": {
+                                "title": "Composite",
+                                "description": "Stacking order",
+                                "$ref": "#/$defs/constants/composite",
+                                "default": 1
+                            },
+                            "tr": {
+                                "title": "Transform",
+                                "description": "Transform applied to each copy",
+                                "$ref": "#/$defs/shapes/repeater-transform"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "c",
+                            "tr"
+                        ]
+                    }
+                ]
+            },
+            "shape"  : {
+                "type": "object",
+                "title": "Shape",
+                "description": "Drawable shape",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "d": {
+                                "title": "Direction",
+                                "description": "Direction the shape is drawn as, mostly relevant when using trim path",
+                                "$ref": "#/$defs/constants/shape-direction"
+                            }
+                        }
+                    }
+                ]
+            },
+            "pucker-bloat"  : {
+                "type": "object",
+                "title": "Pucker Bloat",
+                "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction",
+                "caniuse": "shape-pucker-and-bloat",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "pb"
+                            },
+                            "a": {
+                                "title": "Amount",
+                                "description": "Amount as a percentage",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "rounded-corners"  : {
+                "type": "object",
+                "title": "Rounded Corners",
+                "description": "Rounds corners of other shapes",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/modifier"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "rd"
+                            },
+                            "r": {
+                                "title": "Radius",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "r"
+                        ]
+                    }
+                ]
+            },
+            "zig-zag"  : {
+                "type": "object",
+                "title": "Zig Zag",
+                "description": "Changes the edges of affected shapes into a series of peaks and valleys of uniform size",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "zz"
+                            },
+                            "r": {
+                                "title": "Frequency",
+                                "description": "Number of ridges per segment",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Amplitude",
+                                "description": "Distance between peaks and troughs",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "pt": {
+                                "title": "Point Type",
+                                "description": "Point type (1 = corner, 2 = smooth)",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "transform"  : {
+                "type": "object",
+                "title": "Transform Shape",
+                "description": "Group transform",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "$ref": "#/$defs/helpers/transform"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "tr"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "no-style"  : {
+                "type": "object",
+                "title": "No Style",
+                "description": "Represents a style for shapes without fill or stroke",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "no"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "stroke"  : {
+                "type": "object",
+                "title": "Stroke",
+                "description": "Solid stroke",
+                "caniuse": "shape-stroke",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape-element"
+                    },
+                    {
+                        "$ref": "#/$defs/shapes/base-stroke"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "st"
+                            },
+                            "c": {
+                                "title": "Color",
+                                "description": "Stroke color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "c"
+                        ]
+                    }
+                ]
+            },
+            "trim"  : {
+                "type": "object",
+                "title": "Trim",
+                "description": "Trims shapes into a segment",
+                "caniuse": "shape-trim-path",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/modifier"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "tm"
+                            },
+                            "s": {
+                                "title": "Start",
+                                "description": "Segment start",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "e": {
+                                "title": "End",
+                                "description": "Segment end",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "o": {
+                                "title": "Offset",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "m": {
+                                "title": "Multiple",
+                                "description": "How to treat multiple copies",
+                                "$ref": "#/$defs/constants/trim-multiple-shapes"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "o",
+                            "s",
+                            "e"
+                        ]
+                    }
+                ]
+            },
+            "rectangle"  : {
+                "type": "object",
+                "title": "Rectangle",
+                "description": "A simple rectangle shape",
+                "caniuse": "shape-rectangle",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/shapes/shape"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Shape Type",
+                                "type": "string",
+                                "const": "rc"
+                            },
+                            "p": {
+                                "title": "Position",
+                                "description": "Center of the rectangle",
+                                "$ref": "#/$defs/animated-properties/position"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            },
+                            "r": {
+                                "title": "Rounded",
+                                "description": "Rounded corners radius",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty",
+                            "s",
+                            "p",
+                            "r"
+                        ]
+                    }
+                ]
+            },
+            "base-stroke"  : {
+                "type": "object",
+                "title": "Base Stroke",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "lc": {
+                                "title": "Line Cap",
+                                "$ref": "#/$defs/constants/line-cap",
+                                "default": 2
+                            },
+                            "lj": {
+                                "title": "Line Join",
+                                "$ref": "#/$defs/constants/line-join",
+                                "default": 2
+                            },
+                            "ml": {
+                                "title": "Miter Limit",
+                                "type": "number",
+                                "default": 0
+                            },
+                            "ml2": {
+                                "title": "Miter Limit",
+                                "description": "Animatable alternative to ml",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "description": "Opacity, 100 means fully opaque",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "w": {
+                                "title": "Width",
+                                "description": "Stroke width",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "d": {
+                                "title": "Dashes",
+                                "description": "Dashed line definition",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/shapes/stroke-dash"
+                                }
+                            }
+                        },
+                        "required": [
+                            "o",
+                            "w"
+                        ]
+                    }
+                ]
+            }
+        },
+        "styles": {
+            "drop-shadow-style"  : {
+                "type": "object",
+                "title": "Drop Shadow",
+                "caniuse": "style-drop-shadow",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 1
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "description": "Local light angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "description": "Blur size",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "d": {
+                                "title": "Distance",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ch": {
+                                "title": "Choke Spread",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "no": {
+                                "title": "Noise",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "lc": {
+                                "title": "Layer Conceal",
+                                "description": "Layer knowck out drop shadow",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "inner-shadow-style"  : {
+                "type": "object",
+                "title": "Inner Shadow",
+                "caniuse": "style-inner-shadow",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 2
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "description": "Local light angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "description": "Blur size",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "d": {
+                                "title": "Distance",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ch": {
+                                "title": "Choke Spread",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "no": {
+                                "title": "Noise",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "layer-style"  : {
+                "type": "object",
+                "title": "Layer Style",
+                "description": "Style applied to a layer",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/visual-object"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Style Type",
+                                "type": "integer"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "bevel-emboss-style"  : {
+                "type": "object",
+                "title": "Bevel Emboss",
+                "caniuse": "style-bevel-and-emboss",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 5
+                            },
+                            "bs": {
+                                "title": "Bevel Style",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bt": {
+                                "title": "Technique",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sr": {
+                                "title": "Strength",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sf": {
+                                "title": "Soften",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ga": {
+                                "title": "Global Angle",
+                                "description": "Use global light",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "description": "Local lighting angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ll": {
+                                "title": "Altitude",
+                                "description": "Local lighting altitude",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "hm": {
+                                "title": "Highlight Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "hc": {
+                                "title": "Highlight Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "ho": {
+                                "title": "Highlight Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sm": {
+                                "title": "Shadow Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sc": {
+                                "title": "Shadow Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "so": {
+                                "title": "Shadow Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "outer-glow-style"  : {
+                "type": "object",
+                "title": "Outer Glow",
+                "caniuse": "style-outer-glow",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 3
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "r": {
+                                "title": "Range",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ch": {
+                                "title": "Choke Spread",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "no": {
+                                "title": "Noise",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "j": {
+                                "title": "Jitter",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "gradient-overlay-style"  : {
+                "type": "object",
+                "title": "Gradient Overlay",
+                "caniuse": "style-gradient-overlay",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 8
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "gf": {
+                                "title": "Gradient",
+                                "$ref": "#/$defs/animated-properties/gradient-colors"
+                            },
+                            "gs": {
+                                "title": "Smoothness",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "gt": {
+                                "title": "Gradient Type",
+                                "$ref": "#/$defs/constants/gradient-type"
+                            },
+                            "re": {
+                                "title": "Reverse",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "al": {
+                                "title": "Align",
+                                "description": "Align with layer",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Scale",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "of": {
+                                "title": "Offset",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "satin-style"  : {
+                "type": "object",
+                "title": "Satin",
+                "caniuse": "style-satin",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 6
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Angle",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "d": {
+                                "title": "Distance",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "s": {
+                                "title": "Size",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "in": {
+                                "title": "Invert",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "stroke-style"  : {
+                "type": "object",
+                "title": "Layer Stroke",
+                "caniuse": "style-stroke",
+                "description": "Stroke / frame",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 0
+                            },
+                            "s": {
+                                "title": "Size",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "color-overlay-style"  : {
+                "type": "object",
+                "title": "Color Overlay",
+                "caniuse": "style-color-overlay",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 7
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "so": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            },
+            "inner-glow-style"  : {
+                "type": "object",
+                "title": "Inner Glow",
+                "caniuse": "style-inner-glow",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/styles/layer-style"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ty": {
+                                "title": "Type",
+                                "description": "Layer Type",
+                                "type": "integer",
+                                "const": 4
+                            },
+                            "c": {
+                                "title": "Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "o": {
+                                "title": "Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "r": {
+                                "title": "Range",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sr": {
+                                "title": "Source",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ch": {
+                                "title": "Choke Spread",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bm": {
+                                "title": "Blend Mode",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "no": {
+                                "title": "Noise",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "j": {
+                                "title": "Jitter",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": [
+                            "ty"
+                        ]
+                    }
+                ]
+            }
+        },
+        "text": {
+            "text-data"  : {
+                "type": "object",
+                "title": "Text Data",
+                "description": "Contains all the text data and animation",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "a": {
+                                "title": "Ranges",
+                                "caniuse": "text-animators",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/text/text-range"
+                                }
+                            },
+                            "d": {
+                                "title": "Document",
+                                "$ref": "#/$defs/text/animated-text-document"
+                            },
+                            "m": {
+                                "title": "Alignment",
+                                "$ref": "#/$defs/text/text-alignment-options"
+                            },
+                            "p": {
+                                "title": "Follow Path",
+                                "$ref": "#/$defs/text/text-follow-path"
+                            }
+                        },
+                        "required": [
+                            "a",
+                            "d",
+                            "m",
+                            "p"
+                        ]
+                    }
+                ]
+            },
+            "text-follow-path"  : {
+                "type": "object",
+                "title": "Text Follow Path",
+                "caniuse": "text-path",
+                "description": "Uses the path described by a layer mask to put the text on said path.",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "m": {
+                                "title": "Mask",
+                                "type": "integer",
+                                "description": "Index of the mask to use"
+                            },
+                            "f": {
+                                "title": "First Margin",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "l": {
+                                "title": "Last Margin",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "r": {
+                                "title": "Reverse Path",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "a": {
+                                "title": "Force Alignment",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "p": {
+                                "title": "Perpendicular To Path",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "text-document"  : {
+                "type": "object",
+                "title": "Text Document",
+                "description": "",
+                "properties": {
+                    "f": {
+                        "title": "Font Family",
+                        "type": "string",
+                        "default": ""
+                    },
+                    "fc": {
+                        "title": "Fill Color",
+                        "$ref": "#/$defs/helpers/color",
+                        "default": [
+                            0,
+                            0,
+                            0
+                        ]
+                    },
+                    "sc": {
+                        "title": "Stroke Color",
+                        "$ref": "#/$defs/helpers/color"
+                    },
+                    "sw": {
+                        "title": "Stroke Width",
+                        "type": "number",
+                        "default": 0
+                    },
+                    "of": {
+                        "title": "Stroke Over Fill",
+                        "description": "Render stroke above the fill",
+                        "type": "boolean"
+                    },
+                    "s": {
+                        "title": "Font Size",
+                        "type": "number",
+                        "default": 10
+                    },
+                    "lh": {
+                        "title": "Line Height",
+                        "description": "Distance between lines on multiline or wrapped text",
+                        "type": "number"
+                    },
+                    "sz": {
+                        "title": "Wrap Size",
+                        "description": "Size of the box containing the text",
+                        "type": "array",
+                        "minItems": 2,
+                        "maxItems": 2,
+                        "items": {
+                            "type": "number"
+                        }
+                    },
+                    "ps": {
+                        "title": "Wrap Position",
+                        "description": "Position of the box containing the text",
+                        "type": "array",
+                        "minItems": 2,
+                        "maxItems": 2,
+                        "items": {
+                            "type": "number"
+                        }
+                    },
+                    "t": {
+                        "title": "Text",
+                        "type": "string",
+                        "description": "Text, note that newlines are encoded with \r",
+                        "default": ""
+                    },
+                    "j": {
+                        "title": "Justify",
+                        "$ref": "#/$defs/constants/text-justify",
+                        "default": 0
+                    },
+                    "ca": {
+                        "title": "Text Caps",
+                        "$ref": "#/$defs/constants/text-caps"
+                    },
+                    "tr": {
+                        "title": "Tracking",
+                        "description": "Text Tracking",
+                        "type": "number"
+                    },
+                    "ls": {
+                        "title": "Baseline Shift",
+                        "type": "number"
+                    }
+                },
+                "required": [
+                    "f",
+                    "fc",
+                    "s",
+                    "t"
+                ]
+            },
+            "character-precomp"  : {
+                "type": "object",
+                "title": "Character Precomp",
+                "description": "Defines a character as a precomp layer",
+                "properties": {
+                    "refId": {
+                        "title": "Reference Id",
+                        "description": "ID of the precomp as specified in the assets",
+                        "type": "string"
+                    },
+                    "ks": {
+                        "title": "Transform",
+                        "description": "Layer transform",
+                        "$ref": "#/$defs/helpers/transform"
+                    },
+                    "ip": {
+                        "title": "In Point",
+                        "description": "Frame when the layer becomes visible",
+                        "type": "number",
+                        "default": 0
+                    },
+                    "op": {
+                        "title": "Out Point",
+                        "description": "Frame when the layer becomes invisible",
+                        "type": "number",
+                        "default": 99999
+                    },
+                    "sr": {
+                        "title": "Time Stretch",
+                        "type": "number",
+                        "default": 1
+                    },
+                    "st": {
+                        "title": "Start Time",
+                        "type": "number",
+                        "default": 0
+                    }
+                },
+                "required": [
+                    "refId"
+                ]
+            },
+            "text-range-selector"  : {
+                "type": "object",
+                "title": "Text Range Selector",
+                "caniuse": "animators-range-selectors",
+                "properties": {
+                    "t": {
+                        "title": "Expressible",
+                        "$ref": "#/$defs/helpers/int-boolean"
+                    },
+                    "xe": {
+                        "title": "Max Ease",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "ne": {
+                        "title": "Min Ease",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "a": {
+                        "title": "Max Amount",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "b": {
+                        "title": "Based On",
+                        "$ref": "#/$defs/constants/text-based"
+                    },
+                    "rn": {
+                        "title": "Randomize",
+                        "$ref": "#/$defs/helpers/int-boolean"
+                    },
+                    "sh": {
+                        "title": "Shape",
+                        "$ref": "#/$defs/constants/text-shape"
+                    },
+                    "o": {
+                        "title": "Offset",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "r": {
+                        "title": "Range Units",
+                        "caniuse": "range-selectors-units",
+                        "$ref": "#/$defs/constants/text-range-units"
+                    },
+                    "sm": {
+                        "title": "Selector Smoothness",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "s": {
+                        "title": "Start",
+                        "$ref": "#/$defs/animated-properties/value"
+                    },
+                    "e": {
+                        "title": "End",
+                        "$ref": "#/$defs/animated-properties/value"
+                    }
+                },
+                "required": [
+                    "t",
+                    "a",
+                    "b",
+                    "sh"
+                ]
+            },
+            "font-list"  : {
+                "type": "object",
+                "title": "Font List",
+                "description": "List of fonts",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "list": {
+                                "title": "List",
+                                "type": "array",
+                                "items": {
+                                    "$ref": "#/$defs/text/font"
+                                }
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "character-shapes"  : {
+                "type": "object",
+                "title": "Character Shape",
+                "description": "Defines a character as shapes",
+                "properties": {
+                    "shapes": {
+                        "title": "Shapes",
+                        "description": "Shapes forming the character",
+                        "$ref": "#/$defs/shapes/shape-list"
+                    }
+                },
+                "required": [
+                    "shapes"
+                ]
+            },
+            "animated-text-document"  : {
+                "type": "object",
+                "title": "Animated Text Document",
+                "description": "Animated property representing the text contents",
+                "properties": {
+                    "k": {
+                        "title": "Keyframes",
+                        "type": "array",
+                        "items": {
+                            "$ref": "#/$defs/text/text-document-keyframe"
+                        }
+                    },
+                    "x": {
+                        "title": "Expression",
+                        "type": "string"
+                    },
+                    "sid": {
+                        "title": "Slot ID",
+                        "description": "One of the ID in the file's slots",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "k"
+                ]
+            },
+            "text-range"  : {
+                "type": "object",
+                "title": "Text Range",
+                "description": "Range of text with custom animations and style",
+                "caniuse": "animators-range-selectors",
+                "properties": {
+                    "nm": {
+                        "title": "Name",
+                        "type": "string"
+                    },
+                    "s": {
+                        "title": "Selector",
+                        "$ref": "#/$defs/text/text-range-selector"
+                    },
+                    "a": {
+                        "title": "Style",
+                        "$ref": "#/$defs/text/text-style"
+                    }
+                }
+            },
+            "text-style"  : {
+                "type": "object",
+                "title": "Text Style",
+                "description": "",
+                "allOf": [
+                    {
+                        "$ref": "#/$defs/helpers/transform"
+                    },
+                    {
+                        "type": "object",
+                        "properties": {
+                            "sw": {
+                                "title": "Stroke Width",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sc": {
+                                "title": "Stroke Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "sh": {
+                                "title": "Stroke Hue",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ss": {
+                                "title": "Stroke Saturation",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "sb": {
+                                "title": "Stroke Brightness",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "so": {
+                                "title": "Stroke Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "fc": {
+                                "title": "Fill Color",
+                                "$ref": "#/$defs/animated-properties/color-value"
+                            },
+                            "fh": {
+                                "title": "Fill Hue",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "fs": {
+                                "title": "Fill Saturation",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "fb": {
+                                "title": "Fill Brightness",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "fo": {
+                                "title": "Fill Opacity",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "t": {
+                                "title": "Letter Spacing",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "bl": {
+                                "title": "Blur",
+                                "caniuse": "text-animators-blur",
+                                "$ref": "#/$defs/animated-properties/value"
+                            },
+                            "ls": {
+                                "title": "Line Spacing",
+                                "$ref": "#/$defs/animated-properties/value"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "character-data"  : {
+                "type": "object",
+                "title": "Character Data",
+                "description": "Defines character shapes",
+                "properties": {
+                    "ch": {
+                        "title": "Character",
+                        "type": "string",
+                        "default": ""
+                    },
+                    "fFamily": {
+                        "title": "Font Family",
+                        "type": "string",
+                        "default": ""
+                    },
+                    "size": {
+                        "title": "Font Size",
+                        "type": "number",
+                        "default": 0
+                    },
+                    "style": {
+                        "title": "Font Style",
+                        "type": "string",
+                        "default": ""
+                    },
+                    "w": {
+                        "title": "Width",
+                        "type": "number",
+                        "default": 0
+                    },
+                    "data": {
+                        "title": "Data",
+                        "oneOf": [
+                            {
+                                "$ref": "#/$defs/text/character-shapes"
+                            },
+                            {
+                                "$ref": "#/$defs/text/character-precomp"
+                            }
+                        ]
+                    }
+                },
+                "required": [
+                    "data",
+                    "ch",
+                    "fFamily",
+                    "size",
+                    "style",
+                    "w"
+                ]
+            },
+            "text-alignment-options"  : {
+                "type": "object",
+                "title": "Text Alignment Options",
+                "description": "",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "a": {
+                                "title": "Alignment",
+                                "description": "Group alignment",
+                                "caniuse": "animators-grouping-alignment",
+                                "$ref": "#/$defs/animated-properties/multi-dimensional"
+                            },
+                            "g": {
+                                "title": "Grouping",
+                                "description": "Anchor point grouping",
+                                "caniuse": "animators-anchor-point-grouping",
+                                "$ref": "#/$defs/constants/text-grouping"
+                            }
+                        },
+                        "required": []
+                    }
+                ]
+            },
+            "text-document-keyframe"  : {
+                "type": "object",
+                "title": "Text Document Keyframe",
+                "description": "A keyframe containing a text document",
+                "properties": {
+                    "s": {
+                        "title": "Start",
+                        "$ref": "#/$defs/text/text-document"
+                    },
+                    "t": {
+                        "title": "Time",
+                        "type": "number",
+                        "default": 0
+                    }
+                },
+                "required": [
+                    "s",
+                    "t"
+                ]
+            },
+            "font"  : {
+                "type": "object",
+                "title": "Font",
+                "description": "Describes how a font with given settings should be loaded",
+                "allOf": [
+                    {
+                        "type": "object",
+                        "properties": {
+                            "ascent": {
+                                "title": "Ascent",
+                                "type": "number",
+                                "description": "Text will be moved down based on this value"
+                            },
+                            "fFamily": {
+                                "title": "Font Family",
+                                "type": "string",
+                                "default": "sans"
+                            },
+                            "fName": {
+                                "title": "Name",
+                                "description": "Name used by text documents to reference this font, usually it's fFamily followed by fStyle",
+                                "type": "string",
+                                "default": "sans-Regular"
+                            },
+                            "fStyle": {
+                                "title": "Font Style",
+                                "examples": [
+                                    "Regular",
+                                    "Bold",
+                                    "Bold Italic"
+                                ],
+                                "type": "string",
+                                "default": "Regular"
+                            },
+                            "fPath": {
+                                "title": "Path",
+                                "type": "string"
+                            },
+                            "fWeight": {
+                                "title": "Weight",
+                                "type": "string"
+                            },
+                            "origin": {
+                                "title": "Origin",
+                                "$ref": "#/$defs/constants/font-path-origin"
+                            },
+                            "fClass": {
+                                "type": "string",
+                                "title": "CSS Class",
+                                "description": "CSS Class applied to text objects using this font"
+                            }
+                        },
+                        "required": [
+                            "fFamily",
+                            "fName",
+                            "fStyle"
+                        ]
+                    }
+                ]
+            }
+        }
+    }
+}
+

+
+ + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/schema/layers/audio-layer.json b/schema/layers/audio-layer.json new file mode 100644 index 00000000..5ba31be6 --- /dev/null +++ b/schema/layers/audio-layer.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Audio Layer", + "description": "A layer playing sounds", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 6 + }, + "au": { + "title": "Audio Settings", + "$ref": "#/$defs/layers/audio-settings" + }, + "refId": { + "title": "Sound Id", + "description": "ID of the sound as specified in the assets", + "type": "string" + } + }, + "required": [ + "ty", "au" + ] + } + ] +} + diff --git a/schema/layers/audio-settings.json b/schema/layers/audio-settings.json new file mode 100644 index 00000000..e123c94e --- /dev/null +++ b/schema/layers/audio-settings.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Audio Settings", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "lv": { + "title": "Level", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "lv" + ] + } + ] +} + + diff --git a/schema/layers/camera-layer.json b/schema/layers/camera-layer.json new file mode 100644 index 00000000..695baa82 --- /dev/null +++ b/schema/layers/camera-layer.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Camera Layer", + "description": "3D Camera", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 13 + }, + "ks": { + "title": "Transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "pe": { + "title": "Perspective", + "description": "Distance from the Z=0 plane.\nSmall values yield a higher perspective effect.", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", "ks", "pe" + ] + } + ] +} + + diff --git a/schema/layers/data-layer.json b/schema/layers/data-layer.json new file mode 100644 index 00000000..19661b53 --- /dev/null +++ b/schema/layers/data-layer.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Data Layer", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 15 + }, + "refId": { + "title": "Data source Id", + "description": "ID of the data source in assets", + "type": "string" + } + }, + "required": [ + "ty" + ] + } + ] +} + diff --git a/schema/layers/image-layer.json b/schema/layers/image-layer.json new file mode 100644 index 00000000..da297928 --- /dev/null +++ b/schema/layers/image-layer.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Image Layer", + "description": "Layer that shows an image asset", + "caniuse": "layer-image", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 2 + }, + "refId": { + "title": "Image Id", + "description": "ID of the image as specified in the assets", + "type": "string", + "default": "" + } + }, + "required": [ + "ty", "refId" + ] + } + ] +} diff --git a/schema/layers/layer.json b/schema/layers/layer.json new file mode 100644 index 00000000..ec7dc12f --- /dev/null +++ b/schema/layers/layer.json @@ -0,0 +1,130 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Layer", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ddd": { + "title": "Threedimensional", + "description": "Whether the layer is threedimensional", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "hd": { + "title": "Hidden", + "description": "Whether the layer is hidden", + "type": "boolean" + }, + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "oneOf": [ + { + "const": 0, + "title": "Precomposition layer" + }, + { + "const": 1, + "title": "Solid color layer" + }, + { + "const": 2, + "title": "Image layer" + }, + { + "const": 3, + "title": "Null layer" + }, + { + "const": 4, + "title": "Shape layer" + }, + { + "const": 5, + "title": "Text layer" + }, + { + "const": 6, + "title": "Audio layer" + }, + { + "const": 7, + "title": "Video placeholder" + }, + { + "const": 8, + "title": "Image sequence" + }, + { + "const": 9, + "title": "Video layer" + }, + { + "const": 10, + "title": "Image placeholder" + }, + { + "const": 11, + "title": "Guide layer" + }, + { + "const": 12, + "title": "Adjustment layer" + }, + { + "const": 13, + "title": "Camera" + }, + { + "const": 14, + "title": "Light layer" + }, + { + "const": 15, + "title": "Data layer" + } + ] + }, + "ind": { + "title": "Index", + "type": "integer", + "description": "Index that can be used for parenting and referenced in expressions" + }, + "parent": { + "title": "Parent Index", + "description": "Must be the `ind` property of another layer", + "type": "integer" + }, + "sr": { + "title": "Time Stretch", + "caniuse": "property-time-stretch", + "type": "number", + "default": 1 + }, + "ip": { + "title": "In Point", + "description": "Frame when the layer becomes visible", + "type": "number" + }, + "op": { + "title": "Out Point", + "description": "Frame when the layer becomes invisible", + "type": "number" + }, + "st": { + "title": "Start Time", + "type": "number", + "default": 0 + } + }, + "required": ["ty", "st", "ip", "op"] + } + ] +} diff --git a/schema/layers/null-layer.json b/schema/layers/null-layer.json new file mode 100644 index 00000000..9ebceb2f --- /dev/null +++ b/schema/layers/null-layer.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Null Layer", + "description": "Layer with no data, useful to group layers together", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 3 + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/layers/precomposition-layer.json b/schema/layers/precomposition-layer.json new file mode 100644 index 00000000..454c430e --- /dev/null +++ b/schema/layers/precomposition-layer.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Precomposition Layer", + "description": "Layer that renders a Precomposition asset", + "caniuse": "layer-precomp", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 0 + }, + "refId": { + "title": "Reference Id", + "description": "ID of the precomp as specified in the assets", + "type": "string" + }, + "w": { + "title": "Width", + "description": "Width of the clipping rect", + "type": "integer" + }, + "h": { + "title": "Height", + "description": "Height of the clipping rect", + "type": "integer" + }, + "tm": { + "title": "Time Remapping", + "caniuse": "property-timeremap", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", "refId", "w", "h" + ] + } + ] +} diff --git a/schema/layers/shape-layer.json b/schema/layers/shape-layer.json new file mode 100644 index 00000000..bcb57603 --- /dev/null +++ b/schema/layers/shape-layer.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Shape Layer", + "description": "Layer containing Shapes", + "caniuse": "layer-shape", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 4 + }, + "shapes": { + "title": "Shapes", + "$ref": "#/$defs/shapes/shape-list" + } + }, + "required": [ + "ty", "shapes" + ] + } + ] +} diff --git a/schema/layers/solid-color-layer.json b/schema/layers/solid-color-layer.json new file mode 100644 index 00000000..bbe36449 --- /dev/null +++ b/schema/layers/solid-color-layer.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Solid Color Layer", + "description": "Layer with a solid color rectangle", + "caniuse": "layer-solid", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 1 + }, + "sc": { + "title": "Color", + "description": "Color of the layer, unlike most other places, the color is a `#rrggbb` hex string", + "type": "string", + "default": "" + }, + "sh": { + "title": "Height", + "type": "number" + }, + "sw": { + "title": "Width", + "type": "number" + } + }, + "required": [ + "ty", "sc", "sw", "sh" + ] + } + ] +} diff --git a/schema/layers/text-layer.json b/schema/layers/text-layer.json new file mode 100644 index 00000000..a53d0232 --- /dev/null +++ b/schema/layers/text-layer.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Layer", + "description": "Layer with some text", + "caniuse": "layer-text", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 5 + }, + "t": { + "title": "Data", + "$ref": "#/$defs/text/text-data" + } + }, + "required": [ + "ty", "t" + ] + } + ] +} diff --git a/schema/layers/visual-layer.json b/schema/layers/visual-layer.json new file mode 100644 index 00000000..c2f80a70 --- /dev/null +++ b/schema/layers/visual-layer.json @@ -0,0 +1,145 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Visual Layer", + "description": "Layer used to affect visual elements", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ks": { + "title": "Transform", + "caniuse": "transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "ao": { + "title": "Auto Orient", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0, + "description": "If 1, The layer will rotate itself to match its animated position path" + }, + "tt": { + "title": "Matte Mode", + "caniuse": "property-matte-mask", + "$ref": "#/$defs/constants/matte-mode", + "description": "Defines the track matte mode for the layer" + }, + "tp": { + "title": "Matte Parent", + "type": "integer", + "description": "Index of the layer used as matte, if omitted assume the layer above the current one" + }, + "td": { + "title": "Matte Target", + "caniuse": "property-matte-mask", + "$ref": "#/$defs/helpers/int-boolean", + "description": "If set to 1, it means a layer is using this layer as a track matte" + }, + "hasMask": { + "title": "Has Masks", + "caniuse": "mask", + "description": "Whether the layer has masks applied", + "type": "boolean" + }, + "masksProperties": { + "title": "Masks", + "caniuse": "mask", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/mask" + } + }, + "ef": { + "title": "Effects", + "description": "List of layer effects", + "caniuse": "effects", + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/$defs/effects/custom-effect"}, + {"$ref": "#/$defs/effects/drop-shadow-effect"}, + {"$ref": "#/$defs/effects/fill-effect"}, + {"$ref": "#/$defs/effects/gaussian-blur-effect"}, + {"$ref": "#/$defs/effects/matte3-effect"}, + {"$ref": "#/$defs/effects/pro-levels-effect"}, + {"$ref": "#/$defs/effects/stroke-effect"}, + {"$ref": "#/$defs/effects/tint-effect"}, + {"$ref": "#/$defs/effects/tritone-effect"}, + {"$ref": "#/$defs/effects/radial-wipe-effect"}, + {"$ref": "#/$defs/effects/wavy-effect"}, + {"$ref": "#/$defs/effects/puppet-effect"}, + {"$ref": "#/$defs/effects/spherize-effect"}, + {"$ref": "#/$defs/effects/mesh-warp-effect"}, + {"$ref": "#/$defs/effects/displacement-map-effect"}, + {"$ref": "#/$defs/effects/twirl-effect"} + ] + } + }, + "mb": { + "title": "Motion Blur", + "description": "Whether motion blur is enabled for the layer", + "type": "boolean" + }, + "sy": { + "title": "Layer style", + "caniuse": "styles", + "description": "Styling effects for this layer", + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/$defs/styles/stroke-style"}, + {"$ref": "#/$defs/styles/drop-shadow-style"}, + {"$ref": "#/$defs/styles/inner-shadow-style"}, + {"$ref": "#/$defs/styles/outer-glow-style"}, + {"$ref": "#/$defs/styles/inner-glow-style"}, + {"$ref": "#/$defs/styles/bevel-emboss-style"}, + {"$ref": "#/$defs/styles/satin-style"}, + {"$ref": "#/$defs/styles/color-overlay-style"}, + {"$ref": "#/$defs/styles/gradient-overlay-style"} + ] + } + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/constants/blend-mode", + "default": 0 + }, + "cl": { + "title": "CSS Class", + "description": "CSS class used by the SVG renderer", + "type": "string" + }, + "ln": { + "title": "Layer XML ID", + "description": "`id` attribute used by the SVG renderer", + "type": "string" + }, + "tg": { + "title": "Layer XML tag name", + "description": "tag name used by the SVG renderer", + "type": "string" + }, + "cp": { + "deprecated": true, + "title": "Collapse Transform", + "description": "This is deprecated in favour of `ct`", + "type": "boolean" + }, + "ct": { + "title": "Collapse Transform", + "description": "Marks that transforms should be applied before masks", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + }, + "required": [ + "ks" + ] + } + ] +} + diff --git a/schema/lottie.schema.json b/schema/lottie.schema.json new file mode 100644 index 00000000..077bc992 --- /dev/null +++ b/schema/lottie.schema.json @@ -0,0 +1,5875 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://lottiefiles.github.io/lottie-docs/schema/lottie.schema.json", + "type": "object", + "allOf": [ + { + "$ref": "#/$defs/animation/animation" + } + ], + "$defs": { + "animated-properties": { + "value": { + "type": "object", + "title": "Value", + "description": "An animatable property that holds a float", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { + "const": 0 + } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "type": "number" + } + } + } + } + ] + }, + "keyframe-bezier-handle": { + "type": "object", + "title": "Keyframe Bezier Handle", + "description": "Bezier handle for keyframe interpolation", + "properties": { + "x": { + "title": "X", + "description": "Time component:\n0 means start time of the keyframe,\n1 means time of the next keyframe.", + "oneOf": [ + { + "type": "array", + "items": { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "minItems": 1 + }, + { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + } + ] + }, + "y": { + "title": "Y", + "description": "Value interpolation component:\n0 means start value of the keyframe,\n1 means value at the next keyframe.", + "oneOf": [ + { + "type": "array", + "items": { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + }, + "minItems": 1 + }, + { + "type": "number", + "default": 0, + "minimum": 0, + "maximum": 1 + } + ] + } + }, + "required": [ + "x", + "y" + ] + }, + "position": { + "type": "object", + "title": "Position Property", + "description": "An animatable property to represent a position in space", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + }, + "l": { + "title": "Length", + "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.", + "type": "integer" + } + } + }, + { + "if": { + "properties": { + "a": { + "const": 1 + } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/position-keyframe" + } + } + } + }, + "else": { + "properties": { + "k": { + "title": "Static Value", + "type": "array", + "items": { + "type": "number" + } + } + } + } + } + ], + "required": [ + "k" + ] + }, + "animated-property": { + "type": "object", + "title": "Animated Property", + "description": "An animatable property that holds an array of numbers", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + } + }, + { + "if": { + "properties": { + "a": { + "const": 1 + } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/keyframe" + } + } + } + } + } + ], + "required": [ + "k" + ] + }, + "shape-keyframe": { + "type": "object", + "title": "Shape Keyframe", + "description": "Keyframe holding Bezier objects", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe-base" + }, + { + "type": "object", + "properties": { + "s": { + "title": "Start", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/bezier" + } + } + } + } + ] + }, + "position-keyframe": { + "type": "object", + "title": "Position Keyframe", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe" + }, + { + "properties": { + "ti": { + "title": "Value In Tangent", + "description": "Tangent for values (eg: moving position around a curved path)", + "type": "array", + "items": { + "type": "number" + } + }, + "to": { + "title": "Value Out Tangent", + "description": "Tangent for values (eg: moving position around a curved path)", + "type": "array", + "items": { + "type": "number" + } + } + } + } + ] + }, + "multi-dimensional": { + "type": "object", + "title": "Multi Dimensional", + "description": "An animatable property that holds an array of numbers", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { + "const": 0 + } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "type": "array", + "items": { + "type": "number" + } + } + } + }, + "properties": { + "l": { + "title": "Length", + "description": "Number of components in the value arrays.\nIf present values will be truncated or expanded to match this length when accessed from expressions.", + "type": "integer" + } + } + } + ] + }, + "keyframe-base": { + "type": "object", + "title": "Base Keyframe", + "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.", + "allOf": [ + { + "properties": { + "t": { + "title": "Time", + "type": "number", + "default": 0 + }, + "h": { + "title": "Hold", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + } + }, + { + "if": { + "oneOf": [ + { + "properties": { + "h": { + "const": 0 + } + } + }, + { + "not": { + "required": [ + "h" + ] + } + } + ] + }, + "then": { + "properties": { + "i": { + "title": "In Tangent", + "description": "Easing tangent going into the next keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + }, + "o": { + "title": "Out Tangent", + "description": "Easing tangent leaving the current keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + } + } + } + } + ], + "required": [ + "t", + "s" + ] + }, + "shape-property": { + "type": "object", + "title": "Shape Property", + "description": "An animatable property that holds a Bezier", + "allOf": [ + { + "properties": { + "ix": { + "title": "Property Index", + "type": "integer" + }, + "a": { + "title": "Animated", + "description": "Whether the property is animated", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "x": { + "title": "Expression", + "type": "string" + } + } + }, + { + "if": { + "properties": { + "a": { + "const": 1 + } + } + }, + "then": { + "properties": { + "k": { + "type": "array", + "title": "Animated Value", + "description": "Array of keyframes", + "items": { + "$ref": "#/$defs/animated-properties/shape-keyframe" + } + } + } + }, + "else": { + "properties": { + "k": { + "$ref": "#/$defs/helpers/bezier", + "title": "Static Value" + } + } + } + } + ], + "required": [ + "k" + ] + }, + "gradient-colors": { + "type": "object", + "title": "Gradient Colors", + "description": "Represents colors and offsets in a gradient\n\nColors are represented as a flat list interleaving offsets and color components in weird ways\nThere are two possible layouts:\n\nWithout alpha, the colors are a sequence of offset, r, g, b\n\nWith alpha, same as above but at the end of the list there is a sequence of offset, alpha", + "properties": { + "k": { + "title": "Colors", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "p": { + "title": "Count", + "description": "Number of colors in `k`", + "type": "integer", + "default": 0 + } + }, + "required": [ + "p", + "k" + ] + }, + "keyframe": { + "type": "object", + "title": "Keyframe", + "description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/keyframe-base" + }, + { + "properties": { + "s": { + "title": "Value", + "description": "Value at this keyframe. Note the if the property is a scalar, keyframe values are still represented as arrays", + "type": "array", + "items": { + "type": "number" + } + }, + "e": { + "title": "End value", + "description": "Value at the end of the keyframe, note that this is deprecated and you should use `s` from the next keyframe to get this value", + "deprecated": true, + "type": "array", + "items": { + "type": "number" + } + } + } + }, + { + "if": { + "oneOf": [ + { + "properties": { + "h": { + "const": 0 + } + } + }, + { + "not": { + "required": [ + "h" + ] + } + } + ] + }, + "then": { + "properties": { + "i": { + "title": "In Tangent", + "description": "Easing tangent going into the next keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + }, + "o": { + "title": "Out Tangent", + "description": "Easing tangent leaving the current keyframe", + "$ref": "#/$defs/animated-properties/keyframe-bezier-handle" + } + } + } + } + ], + "required": [ + "t", + "s" + ] + }, + "split-vector": { + "type": "object", + "title": "Split Vector", + "description": "An animatable property that is split into individually anaimated components", + "properties": { + "s": { + "title": "Split", + "type": "boolean", + "const": true + }, + "x": { + "title": "X", + "$ref": "#/$defs/animated-properties/value" + }, + "y": { + "title": "Y", + "$ref": "#/$defs/animated-properties/value" + }, + "z": { + "title": "Z", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "s", + "x", + "y" + ] + }, + "color-value": { + "type": "object", + "title": "Color Value", + "description": "An animatable property that holds a Color", + "allOf": [ + { + "$ref": "#/$defs/animated-properties/animated-property" + }, + { + "if": { + "properties": { + "a": { + "const": 0 + } + } + }, + "then": { + "properties": { + "k": { + "title": "Static value", + "$ref": "#/$defs/helpers/color" + } + } + } + } + ] + } + }, + "animation": { + "composition": { + "type": "object", + "title": "Composition", + "description": "Base class for layer holders", + "properties": { + "layers": { + "title": "Layers", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/layers/precomposition-layer" + }, + { + "$ref": "#/$defs/layers/solid-color-layer" + }, + { + "$ref": "#/$defs/layers/image-layer" + }, + { + "$ref": "#/$defs/layers/null-layer" + }, + { + "$ref": "#/$defs/layers/shape-layer" + }, + { + "$ref": "#/$defs/layers/text-layer" + }, + { + "$ref": "#/$defs/layers/audio-layer" + }, + { + "$ref": "#/$defs/layers/camera-layer" + }, + { + "$ref": "#/$defs/layers/data-layer" + } + ] + } + } + }, + "required": [ + "layers" + ] + }, + "animation": { + "type": "object", + "title": "Animation", + "description": "Top level object, describing the animation", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "v": { + "title": "Version", + "type": "string", + "default": "5.5.2" + }, + "fr": { + "title": "Framerate", + "description": "Framerate in frames per second", + "type": "number", + "default": 60 + }, + "ip": { + "title": "In Point", + "description": "\"In Point\", which frame the animation starts at (usually 0)", + "type": "number", + "default": 0 + }, + "op": { + "title": "Out Point", + "description": "\"Out Point\", which frame the animation stops/loops at, which makes this the duration in frames when `ip` is 0", + "type": "number", + "default": 60 + }, + "w": { + "title": "Width", + "description": "Width of the animation", + "type": "integer", + "default": 512 + }, + "h": { + "title": "Height", + "description": "Height of the animation", + "type": "integer", + "default": 512 + }, + "ddd": { + "title": "Threedimensional", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0, + "description": "Whether the animation has 3D layers" + }, + "assets": { + "title": "Assets", + "type": "array", + "description": "List of assets that can be referenced by layers", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/assets/image" + }, + { + "$ref": "#/$defs/assets/precomposition" + }, + { + "$ref": "#/$defs/assets/sound" + }, + { + "$ref": "#/$defs/assets/data-source" + } + ] + } + }, + "comps": { + "title": "Extra Compositions", + "type": "array", + "description": "List of Extra compositions not referenced by anything", + "items": { + "$ref": "#/$defs/assets/precomposition" + } + }, + "fonts": { + "title": "Fonts", + "$ref": "#/$defs/text/font-list" + }, + "chars": { + "title": "Characters", + "description": "Data defining text characters as lottie shapes. If present a player might only render characters defined here and nothing else.", + "type": "array", + "items": { + "$ref": "#/$defs/text/character-data" + } + }, + "meta": { + "title": "Metadata", + "description": "Document metadata", + "$ref": "#/$defs/animation/metadata" + }, + "metadata": { + "title": "User Metadata", + "$ref": "#/$defs/animation/user-metadata" + }, + "markers": { + "title": "Markers", + "description": "Markers defining named sections of the composition.", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/marker" + } + }, + "mb": { + "title": "Motion Blur", + "$ref": "#/$defs/animation/motion-blur" + }, + "slots": { + "title": "Slots", + "description": "Available property overrides", + "type": "object", + "patternProperties": { + ".*": { + "p": { + "anyOf": [ + { + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + { + "$ref": "#/$defs/animated-properties/color-value" + }, + { + "$ref": "#/$defs/animated-properties/position" + }, + { + "$ref": "#/$defs/animated-properties/shape-property" + }, + { + "$ref": "#/$defs/animated-properties/value" + }, + { + "$ref": "#/$defs/assets/image" + }, + { + "$ref": "#/$defs/text/animated-text-document" + } + ] + }, + "required": [ + "p" + ] + } + } + } + }, + "required": [ + "w", + "h", + "fr", + "layers", + "op", + "ip" + ] + }, + { + "$ref": "#/$defs/animation/composition" + } + ] + }, + "motion-blur": { + "type": "object", + "title": "Motion Blur", + "description": "Motion blur settings", + "properties": { + "sa": { + "title": "Shutter Angle", + "description": "Angle in degrees", + "type": "number" + }, + "sp": { + "title": "Shutter Phase", + "description": "Angle in degrees", + "type": "number" + }, + "spf": { + "title": "Samples per Frame", + "type": "number" + }, + "asl": { + "title": "Adaptive Sample Limit", + "type": "number" + } + } + }, + "metadata": { + "type": "object", + "title": "Metadata", + "description": "Document metadata", + "properties": { + "a": { + "title": "Author", + "type": "string" + }, + "d": { + "title": "Description", + "type": "string" + }, + "tc": { + "title": "Theme Color", + "type": "string" + }, + "g": { + "title": "Generator", + "description": "Software used to generate the file", + "type": "string" + } + }, + "anyOf": [ + { + "properties": { + "k": { + "title": "Keywords", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + { + "properties": { + "k": { + "title": "Keywords", + "type": "string" + } + } + } + ] + }, + "user-metadata": { + "type": "object", + "title": "User Metadata", + "description": "User-defined metadata", + "properties": { + "filename": { + "title": "Filename", + "type": "string" + }, + "customProps": { + "title": "Custom Properties", + "type": "object" + } + } + } + }, + "assets": { + "image": { + "type": "object", + "title": "Image", + "description": "External image", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + }, + { + "type": "object", + "properties": { + "w": { + "title": "Width", + "description": "Width of the image", + "type": "number", + "default": 0 + }, + "h": { + "title": "Height", + "description": "Height of the image", + "type": "number", + "default": 0 + }, + "t": { + "title": "Type", + "description": "Marks as part of an image sequence if present", + "type": "string", + "const": "seq" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + }, + "required": [ + "p" + ] + } + ] + }, + "data-source": { + "type": "object", + "title": "Data source", + "description": "External data source, usually a JSON file", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + }, + { + "type": "object", + "properties": { + "t": { + "title": "Type", + "type": "integer", + "const": 3 + } + }, + "required": [ + "t" + ] + } + ] + }, + "asset": { + "type": "object", + "title": "Asset", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "title": "ID", + "description": "Unique identifier used by layers when referencing this asset", + "type": "string", + "default": "" + }, + "nm": { + "title": "Name", + "description": "Human readable name", + "type": "string" + } + }, + "required": [ + "id" + ] + } + ] + }, + "file-asset": { + "type": "object", + "title": "File Asset", + "description": "Asset referencing a file", + "allOf": [ + { + "$ref": "#/$defs/assets/asset" + }, + { + "type": "object", + "properties": { + "u": { + "title": "Path", + "description": "Path to the directory containing a file", + "type": "string", + "default": "" + }, + "p": { + "title": "File name", + "description": "Filename or data url", + "type": "string", + "default": "" + }, + "e": { + "title": "Embedded", + "description": "Whether the file is embedded", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + }, + "required": [ + "p" + ] + } + ] + }, + "precomposition": { + "type": "object", + "title": "Precomposition", + "description": "Asset containing an animation that can be referenced by layers.", + "allOf": [ + { + "$ref": "#/$defs/assets/asset" + }, + { + "$ref": "#/$defs/animation/composition" + }, + { + "type": "object", + "properties": { + "fr": { + "title": "Framerate", + "description": "Framerate in frames per second", + "type": "number" + }, + "xt": { + "title": "Extra", + "description": "Extra composition", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + } + } + ] + }, + "sound": { + "type": "object", + "title": "Sound", + "description": "External sound", + "allOf": [ + { + "$ref": "#/$defs/assets/file-asset" + } + ] + } + }, + "constants": { + "fill-rule": { + "type": "integer", + "title": "Fill Rule", + "description": "Rule used to handle multiple shapes rendered with the same fill object", + "oneOf": [ + { + "title": "Non Zero", + "description": "Everything is colored (You can think of this as an OR)", + "const": 1 + }, + { + "title": "Even Odd", + "description": "Colored based on intersections and path direction, can be used to create \"holes\"", + "const": 2 + } + ] + }, + "blend-mode": { + "type": "integer", + "title": "Blend Mode", + "description": "Layer and shape blend mode", + "caniuse": "blend-mode", + "oneOf": [ + { + "title": "Normal", + "const": 0 + }, + { + "title": "Multiply", + "const": 1 + }, + { + "title": "Screen", + "const": 2 + }, + { + "title": "Overlay", + "const": 3 + }, + { + "title": "Darken", + "const": 4 + }, + { + "title": "Lighten", + "const": 5 + }, + { + "title": "Color Dodge", + "const": 6 + }, + { + "title": "Color Burn", + "const": 7 + }, + { + "title": "Hard Light", + "const": 8 + }, + { + "title": "Soft Light", + "const": 9 + }, + { + "title": "Difference", + "const": 10 + }, + { + "title": "Exclusion", + "const": 11 + }, + { + "title": "Hue", + "const": 12 + }, + { + "title": "Saturation", + "const": 13 + }, + { + "title": "Color", + "const": 14 + }, + { + "title": "Luminosity", + "const": 15 + }, + { + "title": "Add", + "const": 16 + }, + { + "title": "Hard Mix", + "const": 17 + } + ] + }, + "text-grouping": { + "type": "integer", + "title": "Text Grouping", + "description": "", + "oneOf": [ + { + "title": "Characters", + "const": 1 + }, + { + "title": "Word", + "const": 2 + }, + { + "title": "Line", + "const": 3 + }, + { + "title": "All", + "const": 4 + } + ] + }, + "trim-multiple-shapes": { + "type": "integer", + "title": "Trim Multiple Shapes", + "description": "How to handle multiple shapes in trim path", + "oneOf": [ + { + "title": "Simultaneously", + "const": 1 + }, + { + "title": "Individually", + "const": 2 + } + ] + }, + "composite": { + "type": "integer", + "title": "Composite", + "description": "How to stack copies in a repeater", + "oneOf": [ + { + "title": "Above", + "const": 1 + }, + { + "title": "Below", + "const": 2 + } + ] + }, + "stroke-dash-type": { + "type": "string", + "title": "Stroke Dash Type", + "description": "Type of a dash item in a stroked line", + "oneOf": [ + { + "title": "Dash", + "const": "d" + }, + { + "title": "Gap", + "const": "g" + }, + { + "title": "Offset", + "const": "o" + } + ] + }, + "text-range-units": { + "type": "integer", + "title": "Text Range Units", + "description": "Unit type for a text selector", + "oneOf": [ + { + "title": "Percent", + "const": 1 + }, + { + "title": "Index", + "const": 2 + } + ] + }, + "line-cap": { + "type": "integer", + "title": "Line Cap", + "description": "Style at the end of a stoked line", + "oneOf": [ + { + "title": "Butt", + "const": 1 + }, + { + "title": "Round", + "const": 2 + }, + { + "title": "Square", + "const": 3 + } + ] + }, + "mask-mode": { + "type": "string", + "title": "Mask Mode", + "description": "How masks interact with each other. See https://helpx.adobe.com/after-effects/using/alpha-channels-masks-mattes.html", + "oneOf": [ + { + "title": "None", + "const": "n" + }, + { + "title": "Add", + "const": "a" + }, + { + "title": "Subtract", + "const": "s" + }, + { + "title": "Intersect", + "const": "i" + }, + { + "title": "Lighten", + "const": "l" + }, + { + "title": "Darken", + "const": "d" + }, + { + "title": "Difference", + "const": "f" + } + ] + }, + "gradient-type": { + "type": "integer", + "title": "Gradient Type", + "description": "Type of a gradient", + "oneOf": [ + { + "title": "Linear", + "type": "integer", + "const": 1 + }, + { + "title": "Radial", + "type": "integer", + "const": 2 + } + ] + }, + "text-caps": { + "type": "integer", + "title": "Text Caps", + "oneOf": [ + { + "title": "Regular", + "const": 0 + }, + { + "title": "All Caps", + "const": 1 + }, + { + "title": "Small Caps", + "const": 2 + } + ], + "default": 0 + }, + "text-justify": { + "type": "integer", + "title": "Text Justify", + "description": "Text alignment / justification", + "oneOf": [ + { + "title": "Left", + "const": 0 + }, + { + "title": "Right", + "const": 1 + }, + { + "title": "Center", + "const": 2 + }, + { + "title": "Justify with Last Line Left", + "const": 3 + }, + { + "title": "Justify with Last Line Right", + "const": 4 + }, + { + "title": "Justify with Last Line Center", + "const": 5 + }, + { + "title": "Justify with Last Line Full", + "const": 6 + } + ] + }, + "shape-direction": { + "type": "integer", + "title": "Shape Direction", + "description": "Drawing direction of the shape curve, useful for trim path", + "oneOf": [ + { + "title": "Normal", + "description": "Usually clockwise", + "const": 1 + }, + { + "title": "Reversed", + "description": "Usually counter clockwise", + "const": 3 + } + ] + }, + "line-join": { + "type": "integer", + "title": "Line Join", + "description": "Style at a sharp corner of a stoked line", + "oneOf": [ + { + "title": "Miter", + "const": 1 + }, + { + "title": "Round", + "const": 2 + }, + { + "title": "Bevel", + "const": 3 + } + ] + }, + "matte-mode": { + "type": "integer", + "title": "Matte Mode", + "description": "How a layer should mask another layer", + "oneOf": [ + { + "title": "Normal", + "const": 0 + }, + { + "title": "Alpha", + "const": 1 + }, + { + "title": "Inverted Alpha", + "const": 2 + }, + { + "title": "Luma", + "const": 3 + }, + { + "title": "Inverted Luma", + "const": 4 + } + ] + }, + "text-based": { + "type": "integer", + "title": "Text Based", + "description": "", + "oneOf": [ + { + "title": "Characters", + "const": 1 + }, + { + "title": "Character Excluding Spaces", + "const": 2 + }, + { + "title": "Words", + "const": 3 + }, + { + "title": "Lines", + "const": 4 + } + ] + }, + "font-path-origin": { + "type": "integer", + "title": "Font Path Origin", + "description": "", + "oneOf": [ + { + "title": "Local", + "const": 0 + }, + { + "title": "Css Url", + "const": 1 + }, + { + "title": "Script Url", + "const": 2 + }, + { + "title": "Font Url", + "const": 3 + } + ] + }, + "text-shape": { + "type": "integer", + "title": "Text Shape", + "description": "Defines the function used to determine the interpolating factor on a text range selector.", + "oneOf": [ + { + "title": "Square", + "const": 1 + }, + { + "title": "Ramp Up", + "const": 2 + }, + { + "title": "Ramp Down", + "const": 3 + }, + { + "title": "Triangle", + "const": 4 + }, + { + "title": "Round", + "const": 5 + }, + { + "title": "Smooth", + "const": 6 + } + ] + }, + "merge-mode": { + "type": "integer", + "title": "Merge Mode", + "description": "Boolean operation on shapes", + "oneOf": [ + { + "title": "Normal", + "const": 1 + }, + { + "title": "Add", + "const": 2 + }, + { + "title": "Subtract", + "const": 3 + }, + { + "title": "Intersect", + "const": 4 + }, + { + "title": "Exclude Intersections", + "const": 5 + } + ] + }, + "star-type": { + "type": "integer", + "title": "Star Type", + "description": "Star or Polygon", + "oneOf": [ + { + "title": "Star", + "const": 1 + }, + { + "title": "Polygon", + "const": 2 + } + ] + } + }, + "effect-values": { + "angle": { + "type": "object", + "title": "Effect Value Angle", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 1 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "ignored": { + "type": "object", + "title": "Ignored Value", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 6 + }, + "v": { + "title": "Value", + "type": "number", + "default": 0 + } + }, + "required": [ + "ty" + ] + } + ] + }, + "drop-down": { + "type": "object", + "title": "Effect Value Drop Down", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 7 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "checkbox": { + "type": "object", + "title": "Effect Value Checkbox", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 4 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "no-value": { + "type": "object", + "title": "Effect No Value", + "description": "" + }, + "slider": { + "type": "object", + "title": "Effect Value Slider", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 0 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "effect-value": { + "type": "object", + "title": "Effect Value", + "description": "Value for an effect", + "caniuse": "effects", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ix": { + "title": "Effect Index", + "type": "integer" + }, + "mn": { + "title": "Match Name", + "type": "string" + }, + "nm": { + "title": "Name", + "type": "string" + }, + "ty": { + "title": "Type", + "type": "integer" + } + }, + "required": [] + } + ] + }, + "point": { + "type": "object", + "title": "Effect Value Point", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 3 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "color": { + "type": "object", + "title": "Effect Value Color", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 2 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "layer": { + "type": "object", + "title": "Effect Value Layer", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effect-values/effect-value" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 10 + }, + "v": { + "title": "Value", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + } + }, + "effects": { + "radial-wipe-effect": { + "type": "object", + "title": "Radial Wipe", + "caniuse": "effect-radial-wipe", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 26 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Completion", + "description": "Between 0 and 100", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Start Angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "Wipe Center", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "Wipe", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Feather", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "puppet-effect": { + "type": "object", + "title": "Puppet Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 34 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Puppet Engine", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Mesh Rotation Refinement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "On Transparent", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "fill-effect": { + "type": "object", + "title": "Fill Effect", + "description": "Replaces the whole layer with the given color", + "caniuse": "effect-fill", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 21 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "04", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "05", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "opacity", + "description": "Opacity in [0, 1]", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "effect": { + "type": "object", + "title": "Effect", + "description": "Layer effect", + "caniuse": "effects", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ef": { + "title": "Effect Values", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/effect-values/no-value" + }, + { + "$ref": "#/$defs/effect-values/angle" + }, + { + "$ref": "#/$defs/effect-values/checkbox" + }, + { + "$ref": "#/$defs/effect-values/color" + }, + { + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "$ref": "#/$defs/effect-values/ignored" + }, + { + "$ref": "#/$defs/effect-values/layer" + }, + { + "$ref": "#/$defs/effect-values/point" + }, + { + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "np": { + "title": "Property Count", + "description": "Number of values in `ef`", + "type": "integer" + }, + "ix": { + "title": "Effect Index", + "type": "integer" + }, + "ty": { + "title": "Type", + "description": "Effect type", + "type": "integer" + }, + "en": { + "title": "Enabled", + "$ref": "#/$defs/helpers/int-boolean", + "default": 1 + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "pro-levels-effect": { + "type": "object", + "title": "Pro Levels Effect", + "description": "", + "caniuse": "effect-color-levels-individual-controls", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 24 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "02", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "comp_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "comp_outwhite", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "08", + "$ref": "#/$defs/effect-values/no-value" + }, + { + "title": "09", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "r_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "15", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "16", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "g_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "22", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "23", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "b_outwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "29", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_inblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_inwhite", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_gamma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_outblack", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "a_outwhite", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "tritone-effect": { + "type": "object", + "title": "Tritone Effect", + "description": "Maps layers colors based on bright/mid/dark colors", + "caniuse": "effect-tritone", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 23 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "bright", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "mid", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "dark", + "$ref": "#/$defs/effect-values/color" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "stroke-effect": { + "type": "object", + "title": "Stroke Effect", + "description": "", + "caniuse": "effect-stroke", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 22 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "00", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "01", + "$ref": "#/$defs/effect-values/checkbox" + }, + { + "title": "02", + "$ref": "#/$defs/effect-values/checkbox" + }, + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "04", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "05", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "06", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "07", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "08", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "09", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "type", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "custom-effect": { + "type": "object", + "title": "Custom Effect", + "description": "Some lottie files use `ty` = 5 for many different effects", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 5 + } + }, + "required": [ + "ty" + ] + } + ] + }, + "mesh-warp-effect": { + "type": "object", + "title": "Mesh Warp Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 31 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Rows", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Columns", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Quality", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "03", + "$ref": "#/$defs/effect-values/no-value" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "spherize-effect": { + "type": "object", + "title": "Spherize Effect", + "description": "", + "caniuse": "effect-cc-sphere", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 33 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "center", + "$ref": "#/$defs/effect-values/point" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "drop-shadow-effect": { + "type": "object", + "title": "Drop Shadow Effect", + "description": "Adds a shadow to the layer", + "caniuse": "effect-drop-shadow", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 25 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "color", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "opacity", + "description": "Opacity between 0 and 255", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "distance", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "blur", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "tint-effect": { + "type": "object", + "title": "Tint Effect", + "description": "Colorizes the layer", + "caniuse": "effect-tint", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 20 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Black Color", + "description": "Tint of the darker parts of the layer", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "White Color", + "description": "Tint of the lighter parts of the layer", + "$ref": "#/$defs/effect-values/color" + }, + { + "title": "Intensity", + "description": "Intensity of the effect, 0 means the layer is unchanged. 100 means full effect", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "displacement-map-effect": { + "type": "object", + "title": "Displacement Map Effect", + "description": "", + "caniuse": "effect-displacement-map", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 27 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Displacement Map Layer", + "$ref": "#/$defs/effect-values/layer" + }, + { + "title": "Use For Horizontal Displacement", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Max Horizontal Displacement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Use For Vertical Displacement", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Max Vertical Displacement", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Displacement Map Behavior", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Edge Behavior", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Expand Output", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "matte3-effect": { + "type": "object", + "title": "Set Matte Effect", + "description": "Uses a layer as a mask", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 28 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Layer", + "description": "Use this layer as a mask", + "$ref": "#/$defs/effect-values/layer" + }, + { + "title": "Channel", + "description": "Channel to use as a mask:\n1 - Red\n2 - Green\n3 - Blue\n4 - Alpha\n5 - Luminance\n6 - Hue\n7 - Lightness\n8 - Saturation\n9 - Full\n10 - Off", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Invert", + "description": "Use 0 as opaque value when true", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Stretch To Fit", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Show Mask", + "description": "If false, the mask layer won't be shown", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Premultiply Mask", + "$ref": "#/$defs/effect-values/drop-down" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + }, + "wavy-effect": { + "type": "object", + "title": "Wavy Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 32 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Center", + "$ref": "#/$defs/effect-values/point" + }, + { + "title": "Conversion type", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Speed", + "$ref": "#/$defs/effect-values/drop-down" + }, + { + "title": "Width", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Height", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Phase", + "$ref": "#/$defs/effect-values/slider" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "twirl-effect": { + "type": "object", + "title": "Twirl Effect", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 30 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "Angle", + "$ref": "#/$defs/effect-values/angle" + }, + { + "title": "Radius", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "Center", + "$ref": "#/$defs/effect-values/point" + } + ] + } + }, + "required": [ + "ty", + "ef" + ] + } + ] + }, + "gaussian-blur-effect": { + "type": "object", + "title": "Gaussian Blur Effect", + "description": "Gaussian blur", + "caniuse": "effect-gaussian-blur", + "allOf": [ + { + "$ref": "#/$defs/effects/effect" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "type": "integer", + "const": 29 + }, + "ef": { + "title": "Effect values", + "type": "array", + "prefixItems": [ + { + "title": "sigma", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "direction", + "$ref": "#/$defs/effect-values/slider" + }, + { + "title": "wrap", + "$ref": "#/$defs/effect-values/checkbox" + } + ] + } + }, + "required": [ + "ty" + ] + } + ] + } + }, + "helpers": { + "mask": { + "type": "object", + "title": "Mask", + "caniuse": "mask", + "description": "Bezier shape used to mask/clip a layer", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "inv": { + "title": "Inverted", + "caniuse": "mask-inverted", + "type": "boolean", + "default": false + }, + "pt": { + "title": "Shape", + "$ref": "#/$defs/animated-properties/shape-property" + }, + "o": { + "title": "Opacity", + "caniuse": "mask-opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "mode": { + "title": "Mode", + "caniuse": "mask-modes", + "$ref": "#/$defs/constants/mask-mode", + "default": "i" + }, + "x": { + "title": "Expand", + "caniuse": "mask-expansion", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] + }, + "marker": { + "type": "object", + "title": "Marker", + "description": "Defines named portions of the composition.", + "properties": { + "cm": { + "title": "Comment", + "type": "string" + }, + "tm": { + "title": "Time", + "type": "number" + }, + "dr": { + "title": "Duration", + "type": "number" + } + } + }, + "bezier": { + "type": "object", + "title": "Bezier", + "description": "Single bezier curve", + "properties": { + "c": { + "title": "Closed", + "type": "boolean", + "default": false + }, + "i": { + "title": "In Tangents", + "type": "array", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the `in` tangents relative to the corresponding `v`.", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + }, + "o": { + "title": "Out Tangents", + "type": "array", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the `out` tangents relative to the corresponding `v`.", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + }, + "v": { + "title": "Vertices", + "description": "Array of points, each point is an array of coordinates.\nThese points are along the bezier path", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number", + "default": [] + } + } + } + }, + "required": [ + "i", + "v", + "o" + ] + }, + "visual-object": { + "type": "object", + "title": "Visual Object", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "nm": { + "title": "Name", + "description": "Name, as seen from editors and the like", + "type": "string" + }, + "mn": { + "title": "Match Name", + "description": "Match name, used in expressions", + "type": "string" + } + }, + "required": [] + } + ] + }, + "transform": { + "type": "object", + "title": "Transform", + "description": "Layer transform", + "allOf": [ + { + "properties": { + "a": { + "title": "Anchor Point", + "caniuse": "transform-anchor-point", + "description": "Anchor point: a position (relative to its parent) around which transformations are applied (ie: center for rotation / scale)", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Scale", + "caniuse": "transform-scale", + "description": "Scale factor, `[100, 100]` for no scaling", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "o": { + "title": "Opacity", + "caniuse": "transform-opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "sk": { + "title": "Skew", + "caniuse": "transform-skew", + "description": "Skew amount as an angle in degrees", + "$ref": "#/$defs/animated-properties/value" + }, + "sa": { + "title": "Skew Axis", + "caniuse": "transform-skew", + "description": "Direction along which skew is applied, in degrees (`0` skews along the X axis, `90` along the Y axis)", + "$ref": "#/$defs/animated-properties/value" + } + } + }, + { + "anyOf": [ + { + "oneOf": [ + { + "properties": { + "p": { + "title": "Position", + "caniuse": "transform-position", + "description": "Position / Translation", + "$ref": "#/$defs/animated-properties/position" + } + } + }, + { + "properties": { + "p": { + "title": "Position", + "description": "Position / Translation with split components", + "$ref": "#/$defs/animated-properties/split-vector" + } + } + } + ] + }, + { + "oneOf": [ + { + "properties": { + "r": { + "title": "Rotation", + "caniuse": "transform-rotation", + "description": "Rotation in degrees, clockwise", + "$ref": "#/$defs/animated-properties/value" + } + } + }, + { + "properties": { + "rx": { + "title": "X Rotation", + "description": "Split rotation component", + "$ref": "#/$defs/animated-properties/value" + }, + "ry": { + "title": "Y Rotation", + "description": "Split rotation component", + "$ref": "#/$defs/animated-properties/value" + }, + "rz": { + "title": "Z Rotation", + "description": "Split rotation component, equivalent to `r` when not split", + "$ref": "#/$defs/animated-properties/value" + }, + "or": { + "title": "Orientation", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + } + } + ] + } + ] + } + ] + }, + "int-boolean": { + "type": "integer", + "title": "Integer Boolean", + "description": "Represents boolean values as an integer. 0 is false, 1 is true.", + "default": 0, + "examples": [ + 0 + ], + "enum": [ + 0, + 1 + ], + "oneOf": [ + { + "title": "True", + "const": 1 + }, + { + "title": "False", + "const": 0 + } + ] + }, + "color": { + "type": "array", + "title": "Color", + "description": "Color as a [r, g, b] array with values in [0, 1]", + "items": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "minItems": 3, + "maxItems": 4 + } + }, + "layers": { + "precomposition-layer": { + "type": "object", + "title": "Precomposition Layer", + "description": "Layer that renders a Precomposition asset", + "caniuse": "layer-precomp", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 0 + }, + "refId": { + "title": "Reference Id", + "description": "ID of the precomp as specified in the assets", + "type": "string" + }, + "w": { + "title": "Width", + "description": "Width of the clipping rect", + "type": "integer" + }, + "h": { + "title": "Height", + "description": "Height of the clipping rect", + "type": "integer" + }, + "tm": { + "title": "Time Remapping", + "caniuse": "property-timeremap", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", + "refId", + "w", + "h" + ] + } + ] + }, + "null-layer": { + "type": "object", + "title": "Null Layer", + "description": "Layer with no data, useful to group layers together", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 3 + } + }, + "required": [ + "ty" + ] + } + ] + }, + "visual-layer": { + "type": "object", + "title": "Visual Layer", + "description": "Layer used to affect visual elements", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ks": { + "title": "Transform", + "caniuse": "transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "ao": { + "title": "Auto Orient", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0, + "description": "If 1, The layer will rotate itself to match its animated position path" + }, + "tt": { + "title": "Matte Mode", + "caniuse": "property-matte-mask", + "$ref": "#/$defs/constants/matte-mode", + "description": "Defines the track matte mode for the layer" + }, + "tp": { + "title": "Matte Parent", + "type": "integer", + "description": "Index of the layer used as matte, if omitted assume the layer above the current one" + }, + "td": { + "title": "Matte Target", + "caniuse": "property-matte-mask", + "$ref": "#/$defs/helpers/int-boolean", + "description": "If set to 1, it means a layer is using this layer as a track matte" + }, + "hasMask": { + "title": "Has Masks", + "caniuse": "mask", + "description": "Whether the layer has masks applied", + "type": "boolean" + }, + "masksProperties": { + "title": "Masks", + "caniuse": "mask", + "type": "array", + "items": { + "$ref": "#/$defs/helpers/mask" + } + }, + "ef": { + "title": "Effects", + "description": "List of layer effects", + "caniuse": "effects", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/effects/custom-effect" + }, + { + "$ref": "#/$defs/effects/drop-shadow-effect" + }, + { + "$ref": "#/$defs/effects/fill-effect" + }, + { + "$ref": "#/$defs/effects/gaussian-blur-effect" + }, + { + "$ref": "#/$defs/effects/matte3-effect" + }, + { + "$ref": "#/$defs/effects/pro-levels-effect" + }, + { + "$ref": "#/$defs/effects/stroke-effect" + }, + { + "$ref": "#/$defs/effects/tint-effect" + }, + { + "$ref": "#/$defs/effects/tritone-effect" + }, + { + "$ref": "#/$defs/effects/radial-wipe-effect" + }, + { + "$ref": "#/$defs/effects/wavy-effect" + }, + { + "$ref": "#/$defs/effects/puppet-effect" + }, + { + "$ref": "#/$defs/effects/spherize-effect" + }, + { + "$ref": "#/$defs/effects/mesh-warp-effect" + }, + { + "$ref": "#/$defs/effects/displacement-map-effect" + }, + { + "$ref": "#/$defs/effects/twirl-effect" + } + ] + } + }, + "mb": { + "title": "Motion Blur", + "description": "Whether motion blur is enabled for the layer", + "type": "boolean" + }, + "sy": { + "title": "Layer style", + "caniuse": "styles", + "description": "Styling effects for this layer", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/styles/stroke-style" + }, + { + "$ref": "#/$defs/styles/drop-shadow-style" + }, + { + "$ref": "#/$defs/styles/inner-shadow-style" + }, + { + "$ref": "#/$defs/styles/outer-glow-style" + }, + { + "$ref": "#/$defs/styles/inner-glow-style" + }, + { + "$ref": "#/$defs/styles/bevel-emboss-style" + }, + { + "$ref": "#/$defs/styles/satin-style" + }, + { + "$ref": "#/$defs/styles/color-overlay-style" + }, + { + "$ref": "#/$defs/styles/gradient-overlay-style" + } + ] + } + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/constants/blend-mode", + "default": 0 + }, + "cl": { + "title": "CSS Class", + "description": "CSS class used by the SVG renderer", + "type": "string" + }, + "ln": { + "title": "Layer XML ID", + "description": "`id` attribute used by the SVG renderer", + "type": "string" + }, + "tg": { + "title": "Layer XML tag name", + "description": "tag name used by the SVG renderer", + "type": "string" + }, + "cp": { + "deprecated": true, + "title": "Collapse Transform", + "description": "This is deprecated in favour of `ct`", + "type": "boolean" + }, + "ct": { + "title": "Collapse Transform", + "description": "Marks that transforms should be applied before masks", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + } + }, + "required": [ + "ks" + ] + } + ] + }, + "camera-layer": { + "type": "object", + "title": "Camera Layer", + "description": "3D Camera", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 13 + }, + "ks": { + "title": "Transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "pe": { + "title": "Perspective", + "description": "Distance from the Z=0 plane.\nSmall values yield a higher perspective effect.", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", + "ks", + "pe" + ] + } + ] + }, + "solid-color-layer": { + "type": "object", + "title": "Solid Color Layer", + "description": "Layer with a solid color rectangle", + "caniuse": "layer-solid", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 1 + }, + "sc": { + "title": "Color", + "description": "Color of the layer, unlike most other places, the color is a `#rrggbb` hex string", + "type": "string", + "default": "" + }, + "sh": { + "title": "Height", + "type": "number" + }, + "sw": { + "title": "Width", + "type": "number" + } + }, + "required": [ + "ty", + "sc", + "sw", + "sh" + ] + } + ] + }, + "audio-layer": { + "type": "object", + "title": "Audio Layer", + "description": "A layer playing sounds", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 6 + }, + "au": { + "title": "Audio Settings", + "$ref": "#/$defs/layers/audio-settings" + }, + "refId": { + "title": "Sound Id", + "description": "ID of the sound as specified in the assets", + "type": "string" + } + }, + "required": [ + "ty", + "au" + ] + } + ] + }, + "data-layer": { + "type": "object", + "title": "Data Layer", + "allOf": [ + { + "$ref": "#/$defs/layers/layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 15 + }, + "refId": { + "title": "Data source Id", + "description": "ID of the data source in assets", + "type": "string" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "audio-settings": { + "type": "object", + "title": "Audio Settings", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "lv": { + "title": "Level", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "lv" + ] + } + ] + }, + "shape-layer": { + "type": "object", + "title": "Shape Layer", + "description": "Layer containing Shapes", + "caniuse": "layer-shape", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 4 + }, + "shapes": { + "title": "Shapes", + "$ref": "#/$defs/shapes/shape-list" + } + }, + "required": [ + "ty", + "shapes" + ] + } + ] + }, + "image-layer": { + "type": "object", + "title": "Image Layer", + "description": "Layer that shows an image asset", + "caniuse": "layer-image", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 2 + }, + "refId": { + "title": "Image Id", + "description": "ID of the image as specified in the assets", + "type": "string", + "default": "" + } + }, + "required": [ + "ty", + "refId" + ] + } + ] + }, + "layer": { + "type": "object", + "title": "Layer", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ddd": { + "title": "Threedimensional", + "description": "Whether the layer is threedimensional", + "$ref": "#/$defs/helpers/int-boolean", + "default": 0 + }, + "hd": { + "title": "Hidden", + "description": "Whether the layer is hidden", + "type": "boolean" + }, + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "oneOf": [ + { + "const": 0, + "title": "Precomposition layer" + }, + { + "const": 1, + "title": "Solid color layer" + }, + { + "const": 2, + "title": "Image layer" + }, + { + "const": 3, + "title": "Null layer" + }, + { + "const": 4, + "title": "Shape layer" + }, + { + "const": 5, + "title": "Text layer" + }, + { + "const": 6, + "title": "Audio layer" + }, + { + "const": 7, + "title": "Video placeholder" + }, + { + "const": 8, + "title": "Image sequence" + }, + { + "const": 9, + "title": "Video layer" + }, + { + "const": 10, + "title": "Image placeholder" + }, + { + "const": 11, + "title": "Guide layer" + }, + { + "const": 12, + "title": "Adjustment layer" + }, + { + "const": 13, + "title": "Camera" + }, + { + "const": 14, + "title": "Light layer" + }, + { + "const": 15, + "title": "Data layer" + } + ] + }, + "ind": { + "title": "Index", + "type": "integer", + "description": "Index that can be used for parenting and referenced in expressions" + }, + "parent": { + "title": "Parent Index", + "description": "Must be the `ind` property of another layer", + "type": "integer" + }, + "sr": { + "title": "Time Stretch", + "caniuse": "property-time-stretch", + "type": "number", + "default": 1 + }, + "ip": { + "title": "In Point", + "description": "Frame when the layer becomes visible", + "type": "number" + }, + "op": { + "title": "Out Point", + "description": "Frame when the layer becomes invisible", + "type": "number" + }, + "st": { + "title": "Start Time", + "type": "number", + "default": 0 + } + }, + "required": [ + "ty", + "st", + "ip", + "op" + ] + } + ] + }, + "text-layer": { + "type": "object", + "title": "Text Layer", + "description": "Layer with some text", + "caniuse": "layer-text", + "allOf": [ + { + "$ref": "#/$defs/layers/visual-layer" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer type", + "type": "integer", + "const": 5 + }, + "t": { + "title": "Data", + "$ref": "#/$defs/text/text-data" + } + }, + "required": [ + "ty", + "t" + ] + } + ] + } + }, + "shapes": { + "modifier": { + "type": "object", + "title": "Modifier", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + } + ] + }, + "ellipse": { + "type": "object", + "title": "Ellipse", + "description": "Ellipse shape", + "caniuse": "shape-ellipse", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "el" + }, + "p": { + "title": "Position", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty", + "s", + "p" + ] + } + ] + }, + "shape-list": { + "title": "Shape List", + "description": "List of valid shapes", + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/$defs/shapes/ellipse" + }, + { + "$ref": "#/$defs/shapes/fill" + }, + { + "$ref": "#/$defs/shapes/gradient-fill" + }, + { + "$ref": "#/$defs/shapes/gradient-stroke" + }, + { + "$ref": "#/$defs/shapes/group" + }, + { + "$ref": "#/$defs/shapes/path" + }, + { + "$ref": "#/$defs/shapes/polystar" + }, + { + "$ref": "#/$defs/shapes/pucker-bloat" + }, + { + "$ref": "#/$defs/shapes/rectangle" + }, + { + "$ref": "#/$defs/shapes/repeater" + }, + { + "$ref": "#/$defs/shapes/rounded-corners" + }, + { + "$ref": "#/$defs/shapes/stroke" + }, + { + "$ref": "#/$defs/shapes/transform" + }, + { + "$ref": "#/$defs/shapes/trim" + }, + { + "$ref": "#/$defs/shapes/twist" + }, + { + "$ref": "#/$defs/shapes/merge" + }, + { + "$ref": "#/$defs/shapes/offset-path" + }, + { + "$ref": "#/$defs/shapes/zig-zag" + }, + { + "$ref": "#/$defs/shapes/no-style" + } + ] + } + }, + "stroke-dash": { + "type": "object", + "title": "Stroke Dash", + "description": "An item used to described the dashe pattern in a stroked path", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "n": { + "title": "Dash Type", + "$ref": "#/$defs/constants/stroke-dash-type", + "default": "d" + }, + "v": { + "title": "Length", + "description": "Length of the dash", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] + }, + "repeater-transform": { + "type": "object", + "title": "Repeater Transform", + "description": "Transform used by a repeater, the transform is applied to each subsequent repeated object.", + "allOf": [ + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "so": { + "title": "Start Opacity", + "description": "Opacity of the first repeated object.", + "$ref": "#/$defs/animated-properties/value" + }, + "eo": { + "title": "End Opacity", + "description": "Opacity of the last repeated object.", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] + }, + "twist": { + "type": "object", + "title": "Twist", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tw" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Center", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "offset-path": { + "type": "object", + "title": "Offset Path", + "caniuse": "shape-offset-path", + "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "op" + }, + "a": { + "title": "Amount", + "$ref": "#/$defs/animated-properties/value" + }, + "lj": { + "title": "Line Join", + "$ref": "#/$defs/constants/line-join", + "default": 2 + }, + "ml": { + "title": "Miter Limit", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "gradient": { + "type": "object", + "title": "Gradient", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "s": { + "title": "Start Point", + "description": "Starting point for the gradient", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "e": { + "title": "End Point", + "description": "End point for the gradient", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "t": { + "title": "Gradient Type", + "description": "Type of the gradient", + "$ref": "#/$defs/constants/gradient-type", + "default": 1 + }, + "h": { + "title": "Highlight Length", + "description": "Highlight Length, as a percentage between `s` and `e`", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Highlight Angle", + "description": "Highlight Angle, relative to the direction from `s` to `e`", + "$ref": "#/$defs/animated-properties/value" + }, + "g": { + "title": "Colors", + "description": "Gradient colors", + "$ref": "#/$defs/animated-properties/gradient-colors" + } + }, + "required": [ + "s", + "e", + "g" + ] + } + ] + }, + "gradient-stroke": { + "type": "object", + "title": "Gradient Stroke", + "description": "Gradient stroke", + "caniuse": "shape-stroke-gradient", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/base-stroke" + }, + { + "$ref": "#/$defs/shapes/gradient" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gs" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "polystar": { + "type": "object", + "title": "PolyStar", + "description": "Star or regular polygon", + "caniuse": "shape-polystar", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "sr" + }, + "p": { + "title": "Position", + "$ref": "#/$defs/animated-properties/position" + }, + "or": { + "title": "Outer Radius", + "$ref": "#/$defs/animated-properties/value" + }, + "os": { + "title": "Outer Roundness", + "description": "Outer Roundness as a percentage", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Rotation", + "description": "Rotation, clockwise in degrees", + "$ref": "#/$defs/animated-properties/value" + }, + "pt": { + "title": "Points", + "$ref": "#/$defs/animated-properties/value" + }, + "sy": { + "title": "Star Type", + "description": "Star type, `1` for Star, `2` for Polygon", + "$ref": "#/$defs/constants/star-type", + "default": 1 + } + }, + "required": [ + "ty", + "or", + "os", + "pt", + "p", + "r" + ] + }, + { + "if": { + "properties": { + "sy": { + "const": 1 + } + } + }, + "then": { + "properties": { + "ir": { + "title": "Inner Radius", + "$ref": "#/$defs/animated-properties/value" + }, + "is": { + "title": "Inner Roundness", + "description": "Inner Roundness as a percentage", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ir", + "is" + ] + } + } + ] + }, + "shape-element": { + "type": "object", + "title": "Shape Element", + "description": "Base class for all elements of ShapeLayer and Group", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "hd": { + "title": "Hidden", + "description": "Whether the shape is hidden", + "type": "boolean" + }, + "ty": { + "title": "Shape Type", + "type": "string", + "oneOf": [ + { + "const": "rc", + "title": "Rectangle" + }, + { + "const": "el", + "title": "Ellipse" + }, + { + "const": "sr", + "title": "Polygon / Star" + }, + { + "const": "sh", + "title": "Path" + }, + { + "const": "fl", + "title": "Fill" + }, + { + "const": "st", + "title": "Stroke" + }, + { + "const": "gf", + "title": "Gradient fill" + }, + { + "const": "gs", + "title": "Gradient stroke" + }, + { + "const": "no", + "title": "No Style" + }, + { + "const": "gr", + "title": "Group" + }, + { + "const": "tr", + "title": "Transform" + }, + { + "const": "rd", + "title": "Rounded corners" + }, + { + "const": "pb", + "title": "Pucker / bloat" + }, + { + "const": "mm", + "title": "Merge" + }, + { + "const": "tw", + "title": "Twist" + }, + { + "const": "op", + "title": "Offset path" + }, + { + "const": "zz", + "title": "Zig zag" + }, + { + "const": "rp", + "title": "Repeater" + }, + { + "const": "tm", + "title": "Trim" + } + ] + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/constants/blend-mode" + }, + "ix": { + "title": "Property index", + "description": "Index used in expressions", + "type": "integer" + }, + "cl": { + "title": "CSS Class", + "description": "CSS class used by the SVG renderer", + "type": "string" + }, + "ln": { + "title": "Layer XML ID", + "description": "`id` attribute used by the SVG renderer", + "type": "string" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "group": { + "type": "object", + "title": "Group", + "description": "Shape Element that can contain other shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gr" + }, + "np": { + "title": "Number Of Properties", + "type": "number" + }, + "it": { + "title": "Shapes", + "$ref": "#/$defs/shapes/shape-list" + }, + "cix": { + "title": "Property index", + "description": "Index used in expressions", + "type": "integer" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "fill": { + "type": "object", + "title": "Fill", + "description": "Solid fill color", + "caniuse": "shape-fill", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "fl" + }, + "o": { + "title": "Opacity", + "description": "Opacity, 100 means fully opaque", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "r": { + "title": "Fill Rule", + "$ref": "#/$defs/constants/fill-rule" + } + }, + "required": [ + "ty", + "c", + "o" + ] + } + ] + }, + "gradient-fill": { + "type": "object", + "title": "Gradient Fill", + "description": "Gradient fill", + "caniuse": "shape-fill-gradient", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/gradient" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gf" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Fill Rule", + "$ref": "#/$defs/constants/fill-rule" + } + }, + "required": [ + "ty", + "o" + ] + } + ] + }, + "path": { + "type": "object", + "title": "Path", + "description": "Animatable Bezier curve", + "caniuse": "shape-path", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "sh" + }, + "ks": { + "title": "Shape", + "description": "Bezier path", + "$ref": "#/$defs/animated-properties/shape-property" + } + }, + "required": [ + "ty", + "ks" + ] + } + ] + }, + "merge": { + "type": "object", + "title": "Merge", + "caniuse": "shape-merge-path", + "description": "Boolean operator on shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "mm" + }, + "mm": { + "title": "Merge Mode", + "$ref": "#/$defs/constants/merge-mode", + "default": 1 + } + }, + "required": [ + "ty" + ] + } + ] + }, + "repeater": { + "type": "object", + "title": "Repeater", + "description": "Duplicates previous shapes in a group", + "caniuse": "shape-repeater", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rp" + }, + "c": { + "title": "Copies", + "description": "Number of copies", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "m": { + "title": "Composite", + "description": "Stacking order", + "$ref": "#/$defs/constants/composite", + "default": 1 + }, + "tr": { + "title": "Transform", + "description": "Transform applied to each copy", + "$ref": "#/$defs/shapes/repeater-transform" + } + }, + "required": [ + "ty", + "c", + "tr" + ] + } + ] + }, + "shape": { + "type": "object", + "title": "Shape", + "description": "Drawable shape", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "d": { + "title": "Direction", + "description": "Direction the shape is drawn as, mostly relevant when using trim path", + "$ref": "#/$defs/constants/shape-direction" + } + } + } + ] + }, + "pucker-bloat": { + "type": "object", + "title": "Pucker Bloat", + "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction", + "caniuse": "shape-pucker-and-bloat", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "pb" + }, + "a": { + "title": "Amount", + "description": "Amount as a percentage", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "rounded-corners": { + "type": "object", + "title": "Rounded Corners", + "description": "Rounds corners of other shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rd" + }, + "r": { + "title": "Radius", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", + "r" + ] + } + ] + }, + "zig-zag": { + "type": "object", + "title": "Zig Zag", + "description": "Changes the edges of affected shapes into a series of peaks and valleys of uniform size", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "zz" + }, + "r": { + "title": "Frequency", + "description": "Number of ridges per segment", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Amplitude", + "description": "Distance between peaks and troughs", + "$ref": "#/$defs/animated-properties/value" + }, + "pt": { + "title": "Point Type", + "description": "Point type (1 = corner, 2 = smooth)", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "transform": { + "type": "object", + "title": "Transform Shape", + "description": "Group transform", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tr" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "no-style": { + "type": "object", + "title": "No Style", + "description": "Represents a style for shapes without fill or stroke", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "no" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "stroke": { + "type": "object", + "title": "Stroke", + "description": "Solid stroke", + "caniuse": "shape-stroke", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/base-stroke" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "st" + }, + "c": { + "title": "Color", + "description": "Stroke color", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": [ + "ty", + "c" + ] + } + ] + }, + "trim": { + "type": "object", + "title": "Trim", + "description": "Trims shapes into a segment", + "caniuse": "shape-trim-path", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tm" + }, + "s": { + "title": "Start", + "description": "Segment start", + "$ref": "#/$defs/animated-properties/value" + }, + "e": { + "title": "End", + "description": "Segment end", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "m": { + "title": "Multiple", + "description": "How to treat multiple copies", + "$ref": "#/$defs/constants/trim-multiple-shapes" + } + }, + "required": [ + "ty", + "o", + "s", + "e" + ] + } + ] + }, + "rectangle": { + "type": "object", + "title": "Rectangle", + "description": "A simple rectangle shape", + "caniuse": "shape-rectangle", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rc" + }, + "p": { + "title": "Position", + "description": "Center of the rectangle", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "r": { + "title": "Rounded", + "description": "Rounded corners radius", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", + "s", + "p", + "r" + ] + } + ] + }, + "base-stroke": { + "type": "object", + "title": "Base Stroke", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "lc": { + "title": "Line Cap", + "$ref": "#/$defs/constants/line-cap", + "default": 2 + }, + "lj": { + "title": "Line Join", + "$ref": "#/$defs/constants/line-join", + "default": 2 + }, + "ml": { + "title": "Miter Limit", + "type": "number", + "default": 0 + }, + "ml2": { + "title": "Miter Limit", + "description": "Animatable alternative to ml", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Opacity", + "description": "Opacity, 100 means fully opaque", + "$ref": "#/$defs/animated-properties/value" + }, + "w": { + "title": "Width", + "description": "Stroke width", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Dashes", + "description": "Dashed line definition", + "type": "array", + "items": { + "$ref": "#/$defs/shapes/stroke-dash" + } + } + }, + "required": [ + "o", + "w" + ] + } + ] + } + }, + "styles": { + "drop-shadow-style": { + "type": "object", + "title": "Drop Shadow", + "caniuse": "style-drop-shadow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 1 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local light angle", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "description": "Blur size", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "lc": { + "title": "Layer Conceal", + "description": "Layer knowck out drop shadow", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "inner-shadow-style": { + "type": "object", + "title": "Inner Shadow", + "caniuse": "style-inner-shadow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 2 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local light angle", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "description": "Blur size", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "layer-style": { + "type": "object", + "title": "Layer Style", + "description": "Style applied to a layer", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Style Type", + "type": "integer" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "bevel-emboss-style": { + "type": "object", + "title": "Bevel Emboss", + "caniuse": "style-bevel-and-emboss", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 5 + }, + "bs": { + "title": "Bevel Style", + "$ref": "#/$defs/animated-properties/value" + }, + "bt": { + "title": "Technique", + "$ref": "#/$defs/animated-properties/value" + }, + "sr": { + "title": "Strength", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "sf": { + "title": "Soften", + "$ref": "#/$defs/animated-properties/value" + }, + "ga": { + "title": "Global Angle", + "description": "Use global light", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local lighting angle", + "$ref": "#/$defs/animated-properties/value" + }, + "ll": { + "title": "Altitude", + "description": "Local lighting altitude", + "$ref": "#/$defs/animated-properties/value" + }, + "hm": { + "title": "Highlight Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "hc": { + "title": "Highlight Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "ho": { + "title": "Highlight Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "sm": { + "title": "Shadow Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "sc": { + "title": "Shadow Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "so": { + "title": "Shadow Opacity", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "outer-glow-style": { + "type": "object", + "title": "Outer Glow", + "caniuse": "style-outer-glow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 3 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "j": { + "title": "Jitter", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "gradient-overlay-style": { + "type": "object", + "title": "Gradient Overlay", + "caniuse": "style-gradient-overlay", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 8 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "gf": { + "title": "Gradient", + "$ref": "#/$defs/animated-properties/gradient-colors" + }, + "gs": { + "title": "Smoothness", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "gt": { + "title": "Gradient Type", + "$ref": "#/$defs/constants/gradient-type" + }, + "re": { + "title": "Reverse", + "$ref": "#/$defs/animated-properties/value" + }, + "al": { + "title": "Align", + "description": "Align with layer", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Scale", + "$ref": "#/$defs/animated-properties/value" + }, + "of": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "satin-style": { + "type": "object", + "title": "Satin", + "caniuse": "style-satin", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 6 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "in": { + "title": "Invert", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "stroke-style": { + "type": "object", + "title": "Layer Stroke", + "caniuse": "style-stroke", + "description": "Stroke / frame", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 0 + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "color-overlay-style": { + "type": "object", + "title": "Color Overlay", + "caniuse": "style-color-overlay", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 7 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "so": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + }, + "inner-glow-style": { + "type": "object", + "title": "Inner Glow", + "caniuse": "style-inner-glow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 4 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range", + "$ref": "#/$defs/animated-properties/value" + }, + "sr": { + "title": "Source", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "j": { + "title": "Jitter", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] + } + }, + "text": { + "text-data": { + "type": "object", + "title": "Text Data", + "description": "Contains all the text data and animation", + "allOf": [ + { + "type": "object", + "properties": { + "a": { + "title": "Ranges", + "caniuse": "text-animators", + "type": "array", + "items": { + "$ref": "#/$defs/text/text-range" + } + }, + "d": { + "title": "Document", + "$ref": "#/$defs/text/animated-text-document" + }, + "m": { + "title": "Alignment", + "$ref": "#/$defs/text/text-alignment-options" + }, + "p": { + "title": "Follow Path", + "$ref": "#/$defs/text/text-follow-path" + } + }, + "required": [ + "a", + "d", + "m", + "p" + ] + } + ] + }, + "text-follow-path": { + "type": "object", + "title": "Text Follow Path", + "caniuse": "text-path", + "description": "Uses the path described by a layer mask to put the text on said path.", + "allOf": [ + { + "type": "object", + "properties": { + "m": { + "title": "Mask", + "type": "integer", + "description": "Index of the mask to use" + }, + "f": { + "title": "First Margin", + "$ref": "#/$defs/animated-properties/value" + }, + "l": { + "title": "Last Margin", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Reverse Path", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Force Alignment", + "$ref": "#/$defs/animated-properties/value" + }, + "p": { + "title": "Perpendicular To Path", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] + }, + "text-document": { + "type": "object", + "title": "Text Document", + "description": "", + "properties": { + "f": { + "title": "Font Family", + "type": "string", + "default": "" + }, + "fc": { + "title": "Fill Color", + "$ref": "#/$defs/helpers/color", + "default": [ + 0, + 0, + 0 + ] + }, + "sc": { + "title": "Stroke Color", + "$ref": "#/$defs/helpers/color" + }, + "sw": { + "title": "Stroke Width", + "type": "number", + "default": 0 + }, + "of": { + "title": "Stroke Over Fill", + "description": "Render stroke above the fill", + "type": "boolean" + }, + "s": { + "title": "Font Size", + "type": "number", + "default": 10 + }, + "lh": { + "title": "Line Height", + "description": "Distance between lines on multiline or wrapped text", + "type": "number" + }, + "sz": { + "title": "Wrap Size", + "description": "Size of the box containing the text", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + }, + "ps": { + "title": "Wrap Position", + "description": "Position of the box containing the text", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + }, + "t": { + "title": "Text", + "type": "string", + "description": "Text, note that newlines are encoded with \\r", + "default": "" + }, + "j": { + "title": "Justify", + "$ref": "#/$defs/constants/text-justify", + "default": 0 + }, + "ca": { + "title": "Text Caps", + "$ref": "#/$defs/constants/text-caps" + }, + "tr": { + "title": "Tracking", + "description": "Text Tracking", + "type": "number" + }, + "ls": { + "title": "Baseline Shift", + "type": "number" + } + }, + "required": [ + "f", + "fc", + "s", + "t" + ] + }, + "character-precomp": { + "type": "object", + "title": "Character Precomp", + "description": "Defines a character as a precomp layer", + "properties": { + "refId": { + "title": "Reference Id", + "description": "ID of the precomp as specified in the assets", + "type": "string" + }, + "ks": { + "title": "Transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "ip": { + "title": "In Point", + "description": "Frame when the layer becomes visible", + "type": "number", + "default": 0 + }, + "op": { + "title": "Out Point", + "description": "Frame when the layer becomes invisible", + "type": "number", + "default": 99999 + }, + "sr": { + "title": "Time Stretch", + "type": "number", + "default": 1 + }, + "st": { + "title": "Start Time", + "type": "number", + "default": 0 + } + }, + "required": [ + "refId" + ] + }, + "text-range-selector": { + "type": "object", + "title": "Text Range Selector", + "caniuse": "animators-range-selectors", + "properties": { + "t": { + "title": "Expressible", + "$ref": "#/$defs/helpers/int-boolean" + }, + "xe": { + "title": "Max Ease", + "$ref": "#/$defs/animated-properties/value" + }, + "ne": { + "title": "Min Ease", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Max Amount", + "$ref": "#/$defs/animated-properties/value" + }, + "b": { + "title": "Based On", + "$ref": "#/$defs/constants/text-based" + }, + "rn": { + "title": "Randomize", + "$ref": "#/$defs/helpers/int-boolean" + }, + "sh": { + "title": "Shape", + "$ref": "#/$defs/constants/text-shape" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range Units", + "caniuse": "range-selectors-units", + "$ref": "#/$defs/constants/text-range-units" + }, + "sm": { + "title": "Selector Smoothness", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Start", + "$ref": "#/$defs/animated-properties/value" + }, + "e": { + "title": "End", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "t", + "a", + "b", + "sh" + ] + }, + "font-list": { + "type": "object", + "title": "Font List", + "description": "List of fonts", + "allOf": [ + { + "type": "object", + "properties": { + "list": { + "title": "List", + "type": "array", + "items": { + "$ref": "#/$defs/text/font" + } + } + }, + "required": [] + } + ] + }, + "character-shapes": { + "type": "object", + "title": "Character Shape", + "description": "Defines a character as shapes", + "properties": { + "shapes": { + "title": "Shapes", + "description": "Shapes forming the character", + "$ref": "#/$defs/shapes/shape-list" + } + }, + "required": [ + "shapes" + ] + }, + "animated-text-document": { + "type": "object", + "title": "Animated Text Document", + "description": "Animated property representing the text contents", + "properties": { + "k": { + "title": "Keyframes", + "type": "array", + "items": { + "$ref": "#/$defs/text/text-document-keyframe" + } + }, + "x": { + "title": "Expression", + "type": "string" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + }, + "required": [ + "k" + ] + }, + "text-range": { + "type": "object", + "title": "Text Range", + "description": "Range of text with custom animations and style", + "caniuse": "animators-range-selectors", + "properties": { + "nm": { + "title": "Name", + "type": "string" + }, + "s": { + "title": "Selector", + "$ref": "#/$defs/text/text-range-selector" + }, + "a": { + "title": "Style", + "$ref": "#/$defs/text/text-style" + } + } + }, + "text-style": { + "type": "object", + "title": "Text Style", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "sw": { + "title": "Stroke Width", + "$ref": "#/$defs/animated-properties/value" + }, + "sc": { + "title": "Stroke Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "sh": { + "title": "Stroke Hue", + "$ref": "#/$defs/animated-properties/value" + }, + "ss": { + "title": "Stroke Saturation", + "$ref": "#/$defs/animated-properties/value" + }, + "sb": { + "title": "Stroke Brightness", + "$ref": "#/$defs/animated-properties/value" + }, + "so": { + "title": "Stroke Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "fc": { + "title": "Fill Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "fh": { + "title": "Fill Hue", + "$ref": "#/$defs/animated-properties/value" + }, + "fs": { + "title": "Fill Saturation", + "$ref": "#/$defs/animated-properties/value" + }, + "fb": { + "title": "Fill Brightness", + "$ref": "#/$defs/animated-properties/value" + }, + "fo": { + "title": "Fill Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "t": { + "title": "Letter Spacing", + "$ref": "#/$defs/animated-properties/value" + }, + "bl": { + "title": "Blur", + "caniuse": "text-animators-blur", + "$ref": "#/$defs/animated-properties/value" + }, + "ls": { + "title": "Line Spacing", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] + }, + "character-data": { + "type": "object", + "title": "Character Data", + "description": "Defines character shapes", + "properties": { + "ch": { + "title": "Character", + "type": "string", + "default": "" + }, + "fFamily": { + "title": "Font Family", + "type": "string", + "default": "" + }, + "size": { + "title": "Font Size", + "type": "number", + "default": 0 + }, + "style": { + "title": "Font Style", + "type": "string", + "default": "" + }, + "w": { + "title": "Width", + "type": "number", + "default": 0 + }, + "data": { + "title": "Data", + "oneOf": [ + { + "$ref": "#/$defs/text/character-shapes" + }, + { + "$ref": "#/$defs/text/character-precomp" + } + ] + } + }, + "required": [ + "data", + "ch", + "fFamily", + "size", + "style", + "w" + ] + }, + "text-alignment-options": { + "type": "object", + "title": "Text Alignment Options", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "a": { + "title": "Alignment", + "description": "Group alignment", + "caniuse": "animators-grouping-alignment", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "g": { + "title": "Grouping", + "description": "Anchor point grouping", + "caniuse": "animators-anchor-point-grouping", + "$ref": "#/$defs/constants/text-grouping" + } + }, + "required": [] + } + ] + }, + "text-document-keyframe": { + "type": "object", + "title": "Text Document Keyframe", + "description": "A keyframe containing a text document", + "properties": { + "s": { + "title": "Start", + "$ref": "#/$defs/text/text-document" + }, + "t": { + "title": "Time", + "type": "number", + "default": 0 + } + }, + "required": [ + "s", + "t" + ] + }, + "font": { + "type": "object", + "title": "Font", + "description": "Describes how a font with given settings should be loaded", + "allOf": [ + { + "type": "object", + "properties": { + "ascent": { + "title": "Ascent", + "type": "number", + "description": "Text will be moved down based on this value" + }, + "fFamily": { + "title": "Font Family", + "type": "string", + "default": "sans" + }, + "fName": { + "title": "Name", + "description": "Name used by text documents to reference this font, usually it's `fFamily` followed by `fStyle`", + "type": "string", + "default": "sans-Regular" + }, + "fStyle": { + "title": "Font Style", + "examples": [ + "Regular", + "Bold", + "Bold Italic" + ], + "type": "string", + "default": "Regular" + }, + "fPath": { + "title": "Path", + "type": "string" + }, + "fWeight": { + "title": "Weight", + "type": "string" + }, + "origin": { + "title": "Origin", + "$ref": "#/$defs/constants/font-path-origin" + }, + "fClass": { + "type": "string", + "title": "CSS Class", + "description": "CSS Class applied to text objects using this font" + } + }, + "required": [ + "fFamily", + "fName", + "fStyle" + ] + } + ] + } + } + } +} \ No newline at end of file diff --git a/schema/shapes/base-stroke.json b/schema/shapes/base-stroke.json new file mode 100644 index 00000000..0f1c229a --- /dev/null +++ b/schema/shapes/base-stroke.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Base Stroke", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "lc": { + "title": "Line Cap", + "$ref": "#/$defs/constants/line-cap", + "default": 2 + }, + "lj": { + "title": "Line Join", + "$ref": "#/$defs/constants/line-join", + "default": 2 + }, + "ml": { + "title": "Miter Limit", + "type": "number", + "default": 0 + }, + "ml2": { + "title": "Miter Limit", + "description": "Animatable alternative to ml", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Opacity", + "description": "Opacity, 100 means fully opaque", + "$ref": "#/$defs/animated-properties/value" + }, + "w": { + "title": "Width", + "description": "Stroke width", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Dashes", + "description": "Dashed line definition", + "type": "array", + "items": { + "$ref": "#/$defs/shapes/stroke-dash" + } + } + }, + "required": ["o", "w"] + } + ] +} diff --git a/schema/shapes/ellipse.json b/schema/shapes/ellipse.json new file mode 100644 index 00000000..007ec952 --- /dev/null +++ b/schema/shapes/ellipse.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Ellipse", + "description": "Ellipse shape", + "caniuse": "shape-ellipse", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "el" + }, + "p": { + "title": "Position", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty", "s", "p" + ] + } + ] +} diff --git a/schema/shapes/fill.json b/schema/shapes/fill.json new file mode 100644 index 00000000..31fc0396 --- /dev/null +++ b/schema/shapes/fill.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Fill", + "description": "Solid fill color", + "caniuse": "shape-fill", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "fl" + }, + "o": { + "title": "Opacity", + "description": "Opacity, 100 means fully opaque", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "r": { + "title": "Fill Rule", + "$ref": "#/$defs/constants/fill-rule" + } + }, + "required": [ + "ty", "c", "o" + ] + } + ] +} diff --git a/schema/shapes/gradient-fill.json b/schema/shapes/gradient-fill.json new file mode 100644 index 00000000..59c7fd4e --- /dev/null +++ b/schema/shapes/gradient-fill.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gradient Fill", + "description": "Gradient fill", + "caniuse": "shape-fill-gradient", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/gradient" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gf" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Fill Rule", + "$ref": "#/$defs/constants/fill-rule" + } + }, + "required": [ + "ty", "o" + ] + } + ] +} diff --git a/schema/shapes/gradient-stroke.json b/schema/shapes/gradient-stroke.json new file mode 100644 index 00000000..13897d00 --- /dev/null +++ b/schema/shapes/gradient-stroke.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gradient Stroke", + "description": "Gradient stroke", + "caniuse": "shape-stroke-gradient", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/base-stroke" + }, + { + "$ref": "#/$defs/shapes/gradient" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gs" + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/shapes/gradient.json b/schema/shapes/gradient.json new file mode 100644 index 00000000..a21b21dc --- /dev/null +++ b/schema/shapes/gradient.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gradient", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "s": { + "title": "Start Point", + "description": "Starting point for the gradient", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "e": { + "title": "End Point", + "description": "End point for the gradient", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "t": { + "title": "Gradient Type", + "description": "Type of the gradient", + "$ref": "#/$defs/constants/gradient-type", + "default": 1 + }, + "h": { + "title": "Highlight Length", + "description": "Highlight Length, as a percentage between `s` and `e`", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Highlight Angle", + "description": "Highlight Angle, relative to the direction from `s` to `e`", + "$ref": "#/$defs/animated-properties/value" + }, + "g": { + "title": "Colors", + "description": "Gradient colors", + "$ref": "#/$defs/animated-properties/gradient-colors" + } + }, + "required": [ + "s", "e", "g" + ] + } + ] +} diff --git a/schema/shapes/group.json b/schema/shapes/group.json new file mode 100644 index 00000000..dbf98d41 --- /dev/null +++ b/schema/shapes/group.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Group", + "description": "Shape Element that can contain other shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "gr" + }, + "np": { + "title": "Number Of Properties", + "type": "number" + }, + "it": { + "title": "Shapes", + "$ref": "#/$defs/shapes/shape-list" + }, + "cix": { + "title": "Property index", + "description": "Index used in expressions", + "type": "integer" + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/shapes/merge.json b/schema/shapes/merge.json new file mode 100644 index 00000000..aa8b54e5 --- /dev/null +++ b/schema/shapes/merge.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Merge", + "caniuse": "shape-merge-path", + "description": "Boolean operator on shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "mm" + }, + "mm": { + "title": "Merge Mode", + "$ref": "#/$defs/constants/merge-mode", + "default": 1 + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/shapes/modifier.json b/schema/shapes/modifier.json new file mode 100644 index 00000000..9f7953b7 --- /dev/null +++ b/schema/shapes/modifier.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Modifier", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + } + ] +} diff --git a/schema/shapes/no-style.json b/schema/shapes/no-style.json new file mode 100644 index 00000000..01320503 --- /dev/null +++ b/schema/shapes/no-style.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "No Style", + "description": "Represents a style for shapes without fill or stroke", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "no" + } + }, + "required": [ + "ty" + ] + } + ] +} + diff --git a/schema/shapes/offset-path.json b/schema/shapes/offset-path.json new file mode 100644 index 00000000..90883df8 --- /dev/null +++ b/schema/shapes/offset-path.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Offset Path", + "caniuse": "shape-offset-path", + "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "op" + }, + "a": { + "title": "Amount", + "$ref": "#/$defs/animated-properties/value" + }, + "lj": { + "title": "Line Join", + "$ref": "#/$defs/constants/line-join", + "default": 2 + }, + "ml": { + "title": "Miter Limit", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/shapes/path.json b/schema/shapes/path.json new file mode 100644 index 00000000..b93349c9 --- /dev/null +++ b/schema/shapes/path.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Path", + "description": "Animatable Bezier curve", + "caniuse": "shape-path", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "sh" + }, + "ks": { + "title": "Shape", + "description": "Bezier path", + "$ref": "#/$defs/animated-properties/shape-property" + } + }, + "required": [ + "ty", "ks" + ] + } + ] +} diff --git a/schema/shapes/polystar.json b/schema/shapes/polystar.json new file mode 100644 index 00000000..f1416b78 --- /dev/null +++ b/schema/shapes/polystar.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "PolyStar", + "description": "Star or regular polygon", + "caniuse": "shape-polystar", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "sr" + }, + "p": { + "title": "Position", + "$ref": "#/$defs/animated-properties/position" + }, + "or": { + "title": "Outer Radius", + "$ref": "#/$defs/animated-properties/value" + }, + "os": { + "title": "Outer Roundness", + "description": "Outer Roundness as a percentage", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Rotation", + "description": "Rotation, clockwise in degrees", + "$ref": "#/$defs/animated-properties/value" + }, + "pt": { + "title": "Points", + "$ref": "#/$defs/animated-properties/value" + }, + "sy": { + "title": "Star Type", + "description": "Star type, `1` for Star, `2` for Polygon", + "$ref": "#/$defs/constants/star-type", + "default": 1 + } + }, + "required": [ + "ty", "or", "os", "pt", "p", "r" + ] + }, + { + "if": { + "properties": { + "sy": { + "const": 1 + } + } + }, + "then": { + "properties": { + "ir": { + "title": "Inner Radius", + "$ref": "#/$defs/animated-properties/value" + }, + "is": { + "title": "Inner Roundness", + "description": "Inner Roundness as a percentage", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ir", "is"] + } + } + ] +} diff --git a/schema/shapes/pucker-bloat.json b/schema/shapes/pucker-bloat.json new file mode 100644 index 00000000..6b98d70e --- /dev/null +++ b/schema/shapes/pucker-bloat.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Pucker Bloat", + "description": "Interpolates the shape with its center point and bezier tangents with the opposite direction", + "caniuse": "shape-pucker-and-bloat", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "pb" + }, + "a": { + "title": "Amount", + "description": "Amount as a percentage", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} diff --git a/schema/shapes/rectangle.json b/schema/shapes/rectangle.json new file mode 100644 index 00000000..0f1b26bb --- /dev/null +++ b/schema/shapes/rectangle.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Rectangle", + "description": "A simple rectangle shape", + "caniuse": "shape-rectangle", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rc" + }, + "p": { + "title": "Position", + "description": "Center of the rectangle", + "$ref": "#/$defs/animated-properties/position" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "r": { + "title": "Rounded", + "description": "Rounded corners radius", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", "s", "p", "r" + ] + } + ] +} diff --git a/schema/shapes/repeater-transform.json b/schema/shapes/repeater-transform.json new file mode 100644 index 00000000..e8935ad3 --- /dev/null +++ b/schema/shapes/repeater-transform.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Repeater Transform", + "description": "Transform used by a repeater, the transform is applied to each subsequent repeated object.", + "allOf": [ + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "so": { + "title": "Start Opacity", + "description": "Opacity of the first repeated object.", + "$ref": "#/$defs/animated-properties/value" + }, + "eo": { + "title": "End Opacity", + "description": "Opacity of the last repeated object.", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] +} diff --git a/schema/shapes/repeater.json b/schema/shapes/repeater.json new file mode 100644 index 00000000..97cff870 --- /dev/null +++ b/schema/shapes/repeater.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Repeater", + "description": "Duplicates previous shapes in a group", + "caniuse": "shape-repeater", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rp" + }, + "c": { + "title": "Copies", + "description": "Number of copies", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "m": { + "title": "Composite", + "description": "Stacking order", + "$ref": "#/$defs/constants/composite", + "default": 1 + }, + "tr": { + "title": "Transform", + "description": "Transform applied to each copy", + "$ref": "#/$defs/shapes/repeater-transform" + } + }, + "required": [ + "ty", "c", "tr" + ] + } + ] +} diff --git a/schema/shapes/rounded-corners.json b/schema/shapes/rounded-corners.json new file mode 100644 index 00000000..fdc0cdb2 --- /dev/null +++ b/schema/shapes/rounded-corners.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Rounded Corners", + "description": "Rounds corners of other shapes", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "rd" + }, + "r": { + "title": "Radius", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty", "r" + ] + } + ] +} diff --git a/schema/shapes/shape-element.json b/schema/shapes/shape-element.json new file mode 100644 index 00000000..7d37f357 --- /dev/null +++ b/schema/shapes/shape-element.json @@ -0,0 +1,123 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Shape Element", + "description": "Base class for all elements of ShapeLayer and Group", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "hd": { + "title": "Hidden", + "description": "Whether the shape is hidden", + "type": "boolean" + }, + "ty": { + "title": "Shape Type", + "type": "string", + "oneOf": [ + { + "const": "rc", + "title": "Rectangle" + }, + { + "const": "el", + "title": "Ellipse" + }, + { + "const": "sr", + "title": "Polygon / Star" + }, + { + "const": "sh", + "title": "Path" + }, + { + "const": "fl", + "title": "Fill" + }, + { + "const": "st", + "title": "Stroke" + }, + { + "const": "gf", + "title": "Gradient fill" + }, + { + "const": "gs", + "title": "Gradient stroke" + }, + { + "const": "no", + "title": "No Style" + }, + { + "const": "gr", + "title": "Group" + }, + { + "const": "tr", + "title": "Transform" + }, + { + "const": "rd", + "title": "Rounded corners" + }, + { + "const": "pb", + "title": "Pucker / bloat" + }, + { + "const": "mm", + "title": "Merge" + }, + { + "const": "tw", + "title": "Twist" + }, + { + "const": "op", + "title": "Offset path" + }, + { + "const": "zz", + "title": "Zig zag" + }, + { + "const": "rp", + "title": "Repeater" + }, + { + "const": "tm", + "title": "Trim" + } + ] + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/constants/blend-mode" + }, + "ix": { + "title": "Property index", + "description": "Index used in expressions", + "type": "integer" + }, + "cl": { + "title": "CSS Class", + "description": "CSS class used by the SVG renderer", + "type": "string" + }, + "ln": { + "title": "Layer XML ID", + "description": "`id` attribute used by the SVG renderer", + "type": "string" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/shapes/shape-list.json b/schema/shapes/shape-list.json new file mode 100644 index 00000000..7308b1e9 --- /dev/null +++ b/schema/shapes/shape-list.json @@ -0,0 +1,28 @@ +{ + "title": "Shape List", + "description": "List of valid shapes", + "type": "array", + "items": { + "oneOf": [ + {"$ref": "#/$defs/shapes/ellipse"}, + {"$ref": "#/$defs/shapes/fill"}, + {"$ref": "#/$defs/shapes/gradient-fill"}, + {"$ref": "#/$defs/shapes/gradient-stroke"}, + {"$ref": "#/$defs/shapes/group"}, + {"$ref": "#/$defs/shapes/path"}, + {"$ref": "#/$defs/shapes/polystar"}, + {"$ref": "#/$defs/shapes/pucker-bloat"}, + {"$ref": "#/$defs/shapes/rectangle"}, + {"$ref": "#/$defs/shapes/repeater"}, + {"$ref": "#/$defs/shapes/rounded-corners"}, + {"$ref": "#/$defs/shapes/stroke"}, + {"$ref": "#/$defs/shapes/transform"}, + {"$ref": "#/$defs/shapes/trim"}, + {"$ref": "#/$defs/shapes/twist"}, + {"$ref": "#/$defs/shapes/merge"}, + {"$ref": "#/$defs/shapes/offset-path"}, + {"$ref": "#/$defs/shapes/zig-zag"}, + {"$ref": "#/$defs/shapes/no-style"} + ] + } +} diff --git a/schema/shapes/shape.json b/schema/shapes/shape.json new file mode 100644 index 00000000..13661cd0 --- /dev/null +++ b/schema/shapes/shape.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Shape", + "description": "Drawable shape", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "d": { + "title": "Direction", + "description": "Direction the shape is drawn as, mostly relevant when using trim path", + "$ref": "#/$defs/constants/shape-direction" + } + } + } + ] +} diff --git a/schema/shapes/stroke-dash.json b/schema/shapes/stroke-dash.json new file mode 100644 index 00000000..f6769d1a --- /dev/null +++ b/schema/shapes/stroke-dash.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Stroke Dash", + "description": "An item used to described the dashe pattern in a stroked path", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "n": { + "title": "Dash Type", + "$ref": "#/$defs/constants/stroke-dash-type", + "default": "d" + }, + "v": { + "title": "Length", + "description": "Length of the dash", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] +} diff --git a/schema/shapes/stroke.json b/schema/shapes/stroke.json new file mode 100644 index 00000000..cc6aeb78 --- /dev/null +++ b/schema/shapes/stroke.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Stroke", + "description": "Solid stroke", + "caniuse": "shape-stroke", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/shapes/base-stroke" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "st" + }, + "c": { + "title": "Color", + "description": "Stroke color", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": [ + "ty", "c" + ] + } + ] +} diff --git a/schema/shapes/transform.json b/schema/shapes/transform.json new file mode 100644 index 00000000..2423ae9f --- /dev/null +++ b/schema/shapes/transform.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Transform Shape", + "description": "Group transform", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tr" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/shapes/trim.json b/schema/shapes/trim.json new file mode 100644 index 00000000..52e5ebc2 --- /dev/null +++ b/schema/shapes/trim.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Trim", + "description": "Trims shapes into a segment", + "caniuse": "shape-trim-path", + "allOf": [ + { + "$ref": "#/$defs/shapes/modifier" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tm" + }, + "s": { + "title": "Start", + "description": "Segment start", + "$ref": "#/$defs/animated-properties/value" + }, + "e": { + "title": "End", + "description": "Segment end", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "m": { + "title": "Multiple", + "description": "How to treat multiple copies", + "$ref": "#/$defs/constants/trim-multiple-shapes" + } + }, + "required": [ + "ty", "o", "s", "e" + ] + } + ] +} diff --git a/schema/shapes/twist.json b/schema/shapes/twist.json new file mode 100644 index 00000000..336e0016 --- /dev/null +++ b/schema/shapes/twist.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Twist", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "tw" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Center", + "$ref": "#/$defs/animated-properties/multi-dimensional" + } + }, + "required": [ + "ty" + ] + } + ] +} \ No newline at end of file diff --git a/schema/shapes/zig-zag.json b/schema/shapes/zig-zag.json new file mode 100644 index 00000000..4f1b9aa0 --- /dev/null +++ b/schema/shapes/zig-zag.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Zig Zag", + "description": "Changes the edges of affected shapes into a series of peaks and valleys of uniform size", + "allOf": [ + { + "$ref": "#/$defs/shapes/shape-element" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Shape Type", + "type": "string", + "const": "zz" + }, + "r": { + "title": "Frequency", + "description": "Number of ridges per segment", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Amplitude", + "description": "Distance between peaks and troughs", + "$ref": "#/$defs/animated-properties/value" + }, + "pt": { + "title": "Point Type", + "description": "Point type (1 = corner, 2 = smooth)", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [ + "ty" + ] + } + ] +} + diff --git a/schema/styles/bevel-emboss-style.json b/schema/styles/bevel-emboss-style.json new file mode 100644 index 00000000..c26bef76 --- /dev/null +++ b/schema/styles/bevel-emboss-style.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Bevel Emboss", + "caniuse": "style-bevel-and-emboss", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 5 + }, + "bs": { + "title": "Bevel Style", + "$ref": "#/$defs/animated-properties/value" + }, + "bt": { + "title": "Technique", + "$ref": "#/$defs/animated-properties/value" + }, + "sr": { + "title": "Strength", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "sf": { + "title": "Soften", + "$ref": "#/$defs/animated-properties/value" + }, + "ga": { + "title": "Global Angle", + "description": "Use global light", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local lighting angle", + "$ref": "#/$defs/animated-properties/value" + }, + "ll": { + "title": "Altitude", + "description": "Local lighting altitude", + "$ref": "#/$defs/animated-properties/value" + }, + "hm": { + "title": "Highlight Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "hc": { + "title": "Highlight Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "ho": { + "title": "Highlight Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "sm": { + "title": "Shadow Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "sc": { + "title": "Shadow Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "so": { + "title": "Shadow Opacity", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/color-overlay-style.json b/schema/styles/color-overlay-style.json new file mode 100644 index 00000000..afa90ed1 --- /dev/null +++ b/schema/styles/color-overlay-style.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Color Overlay", + "caniuse": "style-color-overlay", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 7 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "so": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/drop-shadow-style.json b/schema/styles/drop-shadow-style.json new file mode 100644 index 00000000..f4473446 --- /dev/null +++ b/schema/styles/drop-shadow-style.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Drop Shadow", + "caniuse": "style-drop-shadow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 1 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local light angle", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "description": "Blur size", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "lc": { + "title": "Layer Conceal", + "description": "Layer knowck out drop shadow", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/gradient-overlay-style.json b/schema/styles/gradient-overlay-style.json new file mode 100644 index 00000000..e7c40899 --- /dev/null +++ b/schema/styles/gradient-overlay-style.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Gradient Overlay", + "caniuse": "style-gradient-overlay", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 8 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "gf": { + "title": "Gradient", + "$ref": "#/$defs/animated-properties/gradient-colors" + }, + "gs": { + "title": "Smoothness", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "gt": { + "title": "Gradient Type", + "$ref": "#/$defs/constants/gradient-type" + }, + "re": { + "title": "Reverse", + "$ref": "#/$defs/animated-properties/value" + }, + "al": { + "title": "Align", + "description": "Align with layer", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Scale", + "$ref": "#/$defs/animated-properties/value" + }, + "of": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/inner-glow-style.json b/schema/styles/inner-glow-style.json new file mode 100644 index 00000000..e2b1c82b --- /dev/null +++ b/schema/styles/inner-glow-style.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Inner Glow", + "caniuse": "style-inner-glow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 4 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range", + "$ref": "#/$defs/animated-properties/value" + }, + "sr": { + "title": "Source", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "j": { + "title": "Jitter", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} + + + diff --git a/schema/styles/inner-shadow-style.json b/schema/styles/inner-shadow-style.json new file mode 100644 index 00000000..5475d97d --- /dev/null +++ b/schema/styles/inner-shadow-style.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Inner Shadow", + "caniuse": "style-inner-shadow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 2 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "description": "Local light angle", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "description": "Blur size", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/layer-style.json b/schema/styles/layer-style.json new file mode 100644 index 00000000..2c4af9d5 --- /dev/null +++ b/schema/styles/layer-style.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Layer Style", + "description": "Style applied to a layer", + "allOf": [ + { + "$ref": "#/$defs/helpers/visual-object" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Style Type", + "type": "integer" + } + }, + "required": ["ty"] + } + ] +} + diff --git a/schema/styles/outer-glow-style.json b/schema/styles/outer-glow-style.json new file mode 100644 index 00000000..125f49e4 --- /dev/null +++ b/schema/styles/outer-glow-style.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Outer Glow", + "caniuse": "style-outer-glow", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 3 + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range", + "$ref": "#/$defs/animated-properties/value" + }, + "ch": { + "title": "Choke Spread", + "$ref": "#/$defs/animated-properties/value" + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "no": { + "title": "Noise", + "$ref": "#/$defs/animated-properties/value" + }, + "j": { + "title": "Jitter", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/satin-style.json b/schema/styles/satin-style.json new file mode 100644 index 00000000..ab03a8b2 --- /dev/null +++ b/schema/styles/satin-style.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Satin", + "caniuse": "style-satin", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 6 + }, + "bm": { + "title": "Blend Mode", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "o": { + "title": "Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Angle", + "$ref": "#/$defs/animated-properties/value" + }, + "d": { + "title": "Distance", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "in": { + "title": "Invert", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/styles/stroke-style.json b/schema/styles/stroke-style.json new file mode 100644 index 00000000..c7381739 --- /dev/null +++ b/schema/styles/stroke-style.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Layer Stroke", + "caniuse": "style-stroke", + "description": "Stroke / frame", + "allOf": [ + { + "$ref": "#/$defs/styles/layer-style" + }, + { + "type": "object", + "properties": { + "ty": { + "title": "Type", + "description": "Layer Type", + "type": "integer", + "const": 0 + }, + "s": { + "title": "Size", + "$ref": "#/$defs/animated-properties/value" + }, + "c": { + "title": "Color", + "$ref": "#/$defs/animated-properties/color-value" + } + }, + "required": ["ty"] + } + ] +} diff --git a/schema/text/animated-text-document.json b/schema/text/animated-text-document.json new file mode 100644 index 00000000..319a12c7 --- /dev/null +++ b/schema/text/animated-text-document.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Animated Text Document", + "description": "Animated property representing the text contents", + "properties": { + "k": { + "title": "Keyframes", + "type": "array", + "items": { + "$ref": "#/$defs/text/text-document-keyframe" + } + }, + "x": { + "title": "Expression", + "type": "string" + }, + "sid": { + "title": "Slot ID", + "description": "One of the ID in the file's slots", + "type": "string" + } + }, + "required": ["k"] +} diff --git a/schema/text/character-data.json b/schema/text/character-data.json new file mode 100644 index 00000000..519e7615 --- /dev/null +++ b/schema/text/character-data.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Character Data", + "description": "Defines character shapes", + "properties": { + "ch": { + "title": "Character", + "type": "string", + "default": "" + }, + "fFamily": { + "title": "Font Family", + "type": "string", + "default": "" + }, + "size": { + "title": "Font Size", + "type": "number", + "default": 0 + }, + "style": { + "title": "Font Style", + "type": "string", + "default": "" + }, + "w": { + "title": "Width", + "type": "number", + "default": 0 + }, + "data": { + "title": "Data", + "oneOf": [ + {"$ref": "#/$defs/text/character-shapes"}, + {"$ref": "#/$defs/text/character-precomp"} + ] + } + }, + "required": ["data", "ch", "fFamily", "size", "style", "w"] +} diff --git a/schema/text/character-precomp.json b/schema/text/character-precomp.json new file mode 100644 index 00000000..7fad6a8d --- /dev/null +++ b/schema/text/character-precomp.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Character Precomp", + "description": "Defines a character as a precomp layer", + "properties": { + "refId": { + "title": "Reference Id", + "description": "ID of the precomp as specified in the assets", + "type": "string" + }, + "ks": { + "title": "Transform", + "description": "Layer transform", + "$ref": "#/$defs/helpers/transform" + }, + "ip": { + "title": "In Point", + "description": "Frame when the layer becomes visible", + "type": "number", + "default": 0 + }, + "op": { + "title": "Out Point", + "description": "Frame when the layer becomes invisible", + "type": "number", + "default": 99999 + }, + "sr": { + "title": "Time Stretch", + "type": "number", + "default": 1 + }, + "st": { + "title": "Start Time", + "type": "number", + "default": 0 + } + }, + "required": ["refId"] +} diff --git a/schema/text/character-shapes.json b/schema/text/character-shapes.json new file mode 100644 index 00000000..0e58a25b --- /dev/null +++ b/schema/text/character-shapes.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Character Shape", + "description": "Defines a character as shapes", + "properties": { + "shapes": { + "title": "Shapes", + "description": "Shapes forming the character", + "$ref": "#/$defs/shapes/shape-list" + } + }, + "required": ["shapes"] +} diff --git a/schema/text/font-list.json b/schema/text/font-list.json new file mode 100644 index 00000000..7c657340 --- /dev/null +++ b/schema/text/font-list.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Font List", + "description": "List of fonts", + "allOf": [ + { + "type": "object", + "properties": { + "list": { + "title": "List", + "type": "array", + "items": { + "$ref": "#/$defs/text/font" + } + } + }, + "required": [] + } + ] +} diff --git a/schema/text/font.json b/schema/text/font.json new file mode 100644 index 00000000..ba2dd553 --- /dev/null +++ b/schema/text/font.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Font", + "description": "Describes how a font with given settings should be loaded", + "allOf": [ + { + "type": "object", + "properties": { + "ascent": { + "title": "Ascent", + "type": "number", + "description": "Text will be moved down based on this value" + }, + "fFamily": { + "title": "Font Family", + "type": "string", + "default": "sans" + }, + "fName": { + "title": "Name", + "description": "Name used by text documents to reference this font, usually it's `fFamily` followed by `fStyle`", + "type": "string", + "default": "sans-Regular" + }, + "fStyle": { + "title": "Font Style", + "examples": ["Regular", "Bold", "Bold Italic"], + "type": "string", + "default": "Regular" + }, + "fPath": { + "title": "Path", + "type": "string" + }, + "fWeight": { + "title": "Weight", + "type": "string" + }, + "origin": { + "title": "Origin", + "$ref": "#/$defs/constants/font-path-origin" + }, + "fClass": { + "type": "string", + "title": "CSS Class", + "description": "CSS Class applied to text objects using this font" + } + }, + "required": [ + "fFamily", "fName", "fStyle" + ] + } + ] +} diff --git a/schema/text/text-alignment-options.json b/schema/text/text-alignment-options.json new file mode 100644 index 00000000..ccd2d4c5 --- /dev/null +++ b/schema/text/text-alignment-options.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Alignment Options", + "description": "", + "allOf": [ + { + "type": "object", + "properties": { + "a": { + "title": "Alignment", + "description": "Group alignment", + "caniuse": "animators-grouping-alignment", + "$ref": "#/$defs/animated-properties/multi-dimensional" + }, + "g": { + "title": "Grouping", + "description": "Anchor point grouping", + "caniuse": "animators-anchor-point-grouping", + "$ref": "#/$defs/constants/text-grouping" + } + }, + "required": [] + } + ] +} diff --git a/schema/text/text-data.json b/schema/text/text-data.json new file mode 100644 index 00000000..e587194b --- /dev/null +++ b/schema/text/text-data.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Data", + "description": "Contains all the text data and animation", + "allOf": [ + { + "type": "object", + "properties": { + "a": { + "title": "Ranges", + "caniuse": "text-animators", + "type": "array", + "items": { + "$ref": "#/$defs/text/text-range" + } + }, + "d": { + "title": "Document", + "$ref": "#/$defs/text/animated-text-document" + }, + "m": { + "title": "Alignment", + "$ref": "#/$defs/text/text-alignment-options" + }, + "p": { + "title": "Follow Path", + "$ref": "#/$defs/text/text-follow-path" + } + }, + "required": ["a", "d", "m", "p"] + } + ] +} diff --git a/schema/text/text-document-keyframe.json b/schema/text/text-document-keyframe.json new file mode 100644 index 00000000..581cbeed --- /dev/null +++ b/schema/text/text-document-keyframe.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Document Keyframe", + "description": "A keyframe containing a text document", + "properties": { + "s": { + "title": "Start", + "$ref": "#/$defs/text/text-document" + }, + "t": { + "title": "Time", + "type": "number", + "default": 0 + } + }, + "required": ["s", "t"] +} diff --git a/schema/text/text-document.json b/schema/text/text-document.json new file mode 100644 index 00000000..cd26818f --- /dev/null +++ b/schema/text/text-document.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Document", + "description": "", + "properties": { + "f": { + "title": "Font Family", + "type": "string", + "default": "" + }, + "fc": { + "title": "Fill Color", + "$ref": "#/$defs/helpers/color", + "default": [ + 0, + 0, + 0 + ] + }, + "sc": { + "title": "Stroke Color", + "$ref": "#/$defs/helpers/color" + }, + "sw": { + "title": "Stroke Width", + "type": "number", + "default": 0 + }, + "of": { + "title": "Stroke Over Fill", + "description": "Render stroke above the fill", + "type": "boolean" + }, + "s": { + "title": "Font Size", + "type": "number", + "default": 10 + }, + "lh": { + "title": "Line Height", + "description": "Distance between lines on multiline or wrapped text", + "type": "number" + }, + "sz": { + "title": "Wrap Size", + "description": "Size of the box containing the text", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + }, + "ps": { + "title": "Wrap Position", + "description": "Position of the box containing the text", + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + }, + "t": { + "title": "Text", + "type": "string", + "description": "Text, note that newlines are encoded with \\r", + "default": "" + }, + "j": { + "title": "Justify", + "$ref": "#/$defs/constants/text-justify", + "default": 0 + }, + "ca": { + "title": "Text Caps", + "$ref": "#/$defs/constants/text-caps" + }, + "tr": { + "title": "Tracking", + "description": "Text Tracking", + "type": "number" + }, + "ls": { + "title": "Baseline Shift", + "type": "number" + } + }, + "required": ["f", "fc", "s", "t"] +} diff --git a/schema/text/text-follow-path.json b/schema/text/text-follow-path.json new file mode 100644 index 00000000..59dd9dd6 --- /dev/null +++ b/schema/text/text-follow-path.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Follow Path", + "caniuse": "text-path", + "description": "Uses the path described by a layer mask to put the text on said path.", + "allOf": [ + { + "type": "object", + "properties": { + "m": { + "title": "Mask", + "type": "integer", + "description": "Index of the mask to use" + }, + "f": { + "title": "First Margin", + "$ref": "#/$defs/animated-properties/value" + }, + "l": { + "title": "Last Margin", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Reverse Path", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Force Alignment", + "$ref": "#/$defs/animated-properties/value" + }, + "p": { + "title": "Perpendicular To Path", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] +} diff --git a/schema/text/text-range-selector.json b/schema/text/text-range-selector.json new file mode 100644 index 00000000..efd212d4 --- /dev/null +++ b/schema/text/text-range-selector.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Range Selector", + "caniuse": "animators-range-selectors", + "properties": { + "t": { + "title": "Expressible", + "$ref": "#/$defs/helpers/int-boolean" + }, + "xe": { + "title": "Max Ease", + "$ref": "#/$defs/animated-properties/value" + }, + "ne": { + "title": "Min Ease", + "$ref": "#/$defs/animated-properties/value" + }, + "a": { + "title": "Max Amount", + "$ref": "#/$defs/animated-properties/value" + }, + "b": { + "title": "Based On", + "$ref": "#/$defs/constants/text-based" + }, + "rn": { + "title": "Randomize", + "$ref": "#/$defs/helpers/int-boolean" + }, + "sh": { + "title": "Shape", + "$ref": "#/$defs/constants/text-shape" + }, + "o": { + "title": "Offset", + "$ref": "#/$defs/animated-properties/value" + }, + "r": { + "title": "Range Units", + "caniuse": "range-selectors-units", + "$ref": "#/$defs/constants/text-range-units" + }, + "sm": { + "title": "Selector Smoothness", + "$ref": "#/$defs/animated-properties/value" + }, + "s": { + "title": "Start", + "$ref": "#/$defs/animated-properties/value" + }, + "e": { + "title": "End", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": ["t", "a", "b", "sh"] +} diff --git a/schema/text/text-range.json b/schema/text/text-range.json new file mode 100644 index 00000000..5b5a12a7 --- /dev/null +++ b/schema/text/text-range.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Range", + "description": "Range of text with custom animations and style", + "caniuse": "animators-range-selectors", + "properties": { + "nm": { + "title": "Name", + "type": "string" + }, + "s": { + "title": "Selector", + "$ref": "#/$defs/text/text-range-selector" + }, + "a": { + "title": "Style", + "$ref": "#/$defs/text/text-style" + } + } +} diff --git a/schema/text/text-style.json b/schema/text/text-style.json new file mode 100644 index 00000000..c8f43a53 --- /dev/null +++ b/schema/text/text-style.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "title": "Text Style", + "description": "", + "allOf": [ + { + "$ref": "#/$defs/helpers/transform" + }, + { + "type": "object", + "properties": { + "sw": { + "title": "Stroke Width", + "$ref": "#/$defs/animated-properties/value" + }, + "sc": { + "title": "Stroke Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "sh": { + "title": "Stroke Hue", + "$ref": "#/$defs/animated-properties/value" + }, + "ss": { + "title": "Stroke Saturation", + "$ref": "#/$defs/animated-properties/value" + }, + "sb": { + "title": "Stroke Brightness", + "$ref": "#/$defs/animated-properties/value" + }, + "so": { + "title": "Stroke Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "fc": { + "title": "Fill Color", + "$ref": "#/$defs/animated-properties/color-value" + }, + "fh": { + "title": "Fill Hue", + "$ref": "#/$defs/animated-properties/value" + }, + "fs": { + "title": "Fill Saturation", + "$ref": "#/$defs/animated-properties/value" + }, + "fb": { + "title": "Fill Brightness", + "$ref": "#/$defs/animated-properties/value" + }, + "fo": { + "title": "Fill Opacity", + "$ref": "#/$defs/animated-properties/value" + }, + "t": { + "title": "Letter Spacing", + "$ref": "#/$defs/animated-properties/value" + }, + "bl": { + "title": "Blur", + "caniuse": "text-animators-blur", + "$ref": "#/$defs/animated-properties/value" + }, + "ls": { + "title": "Line Spacing", + "$ref": "#/$defs/animated-properties/value" + } + }, + "required": [] + } + ] +} diff --git a/scripts/blockly_generated.js b/scripts/blockly_generated.js new file mode 100644 index 00000000..f3720fd9 --- /dev/null +++ b/scripts/blockly_generated.js @@ -0,0 +1,10398 @@ +Blockly.defineBlocksWithJsonArray([ +{ + "type": "lottie_animation", + "message0": " Animation %1 Name %2 Match Name %3 Version %4 Framerate %5 %6 In Point %7 %8 Out Point %9 %10 Width %11 %12 Height %13 %14 Threedimensional %15 %16 Assets %17 Extra Compositions %18 Fonts %19 Characters %20 Metadata %21 User Metadata %22 Markers %23 Motion Blur %24 Slots %25 Layers %26", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "v", + "check": "value" + }, + { + "type": "field_number", + "name": "fr", + "value": 60 + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "ip", + "value": 0 + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "op", + "value": 60 + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "w", + "value": 512 + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "h", + "value": 512 + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ddd", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "assets", + "check": "assets" + }, + { + "type": "input_statement", + "name": "comps", + "check": "lottie_precomposition" + }, + { + "type": "input_value", + "name": "fonts", + "check": "lottie_font_list" + }, + { + "type": "input_statement", + "name": "chars", + "check": "lottie_character_data" + }, + { + "type": "input_value", + "name": "meta", + "check": "lottie_metadata" + }, + { + "type": "input_value", + "name": "metadata", + "check": "lottie_user_metadata" + }, + { + "type": "input_statement", + "name": "markers" + }, + { + "type": "input_value", + "name": "mb", + "check": "lottie_motion_blur" + }, + { + "type": "input_value", + "name": "slots" + }, + { + "type": "input_statement", + "name": "layers", + "check": "layers" + } + ], + "colour": 260, + "helpUrl": "/lottie-docs/animation/#animation", + "tooltip": "Animation", + "inputsInline": false +}, +{ + "type": "lottie_metadata", + "message0": " Metadata %1 Author %2 Description %3 Theme Color %4 Generator %5", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "a", + "check": "value" + }, + { + "type": "input_value", + "name": "d", + "check": "value" + }, + { + "type": "input_value", + "name": "tc", + "check": "value" + }, + { + "type": "input_value", + "name": "g", + "check": "value" + } + ], + "colour": 260, + "helpUrl": "/lottie-docs/animation/#metadata", + "tooltip": "Metadata", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_motion_blur", + "message0": " Motion Blur %1 Shutter Angle %2 Shutter Phase %3 Samples per Frame %4 Adaptive Sample Limit %5", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "sa", + "check": "value" + }, + { + "type": "input_value", + "name": "sp", + "check": "value" + }, + { + "type": "input_value", + "name": "spf", + "check": "value" + }, + { + "type": "input_value", + "name": "asl", + "check": "value" + } + ], + "colour": 260, + "helpUrl": "/lottie-docs/animation/#motion-blur", + "tooltip": "Motion Blur", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_user_metadata", + "message0": " User Metadata %1 Filename %2 Custom Properties %3", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "filename", + "check": "value" + }, + { + "type": "input_value", + "name": "customProps" + } + ], + "colour": 260, + "helpUrl": "/lottie-docs/animation/#user-metadata", + "tooltip": "User Metadata", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_layer_common", + "message0": " Layer Properties %1 Name %2 Match Name %3 Threedimensional %4 %5 Hidden %6 %7 Index %8 Parent Index %9 Time Stretch %10 In Point %11 %12 Out Point %13 %14 Start Time %15 %16", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "ddd", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ind", + "check": "value" + }, + { + "type": "input_value", + "name": "parent", + "check": "value" + }, + { + "type": "input_value", + "name": "sr", + "check": "value" + }, + { + "type": "field_number", + "name": "ip" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "op" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "st", + "value": 0 + }, + { + "type": "input_dummy" + } + ], + "colour": 0, + "helpUrl": "/lottie-docs/layers/#layer", + "tooltip": "Layer Properties", + "inputsInline": false, + "output": "lottie_layer_common" +}, +{ + "type": "lottie_audio_layer", + "message0": " Audio Layer %1 Layer Properties %2 Type %3 %4 Audio Settings %5 Sound Id %6", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "6" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "au", + "check": "lottie_audio_settings" + }, + { + "type": "input_value", + "name": "refId", + "check": "value" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#audio-layer", + "tooltip": "Audio Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_audio_settings", + "message0": " Audio Settings %1 Level %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lv", + "check": "property" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#audio-settings", + "tooltip": "Audio Settings", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_camera_layer", + "message0": " Camera Layer %1 Layer Properties %2 Type %3 %4 Transform %5 Perspective %6", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "13" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "input_value", + "name": "pe", + "check": "property" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#camera-layer", + "tooltip": "Camera Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_data_layer", + "message0": " Data Layer %1 Layer Properties %2 Type %3 %4 Data source Id %5", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "15" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "refId", + "check": "value" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#data-layer", + "tooltip": "Data Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_image_layer", + "message0": " Image Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28 Image Id %29 %30", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "2" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "refId", + "text": "" + }, + { + "type": "input_dummy" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#image-layer", + "tooltip": "Image Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_layer", + "message0": " Layer %1 Layer Properties %2 Type %3 %4 Custom Attributes %5 %6", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "field_number", + "name": "ty" + }, + { + "type": "input_dummy" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "custom_attributes", + "check": "object_member" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#layer", + "tooltip": "Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_null_layer", + "message0": " Null Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "3" + }, + { + "type": "input_dummy" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#null-layer", + "tooltip": "Null Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_precomposition_layer", + "message0": " Precomposition Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28 Reference Id %29 %30 Width %31 %32 Height %33 %34 Time Remapping %35", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "0" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "refId" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "w" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "h" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tm", + "check": "property" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#precomposition-layer", + "tooltip": "Precomposition Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_shape_layer", + "message0": " Shape Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28 Shapes %29", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "4" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "shapes", + "check": "shapes" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#shape-layer", + "tooltip": "Shape Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_solid_color_layer", + "message0": " Solid Color Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28 Color %29 %30 Height %31 %32 Width %33 %34", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "1" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "sc", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "sh" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "sw" + }, + { + "type": "input_dummy" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#solid-color-layer", + "tooltip": "Solid Color Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_text_layer", + "message0": " Text Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26 Type %27 %28 Data %29", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "5" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "t", + "check": "lottie_text_data" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#text-layer", + "tooltip": "Text Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_visual_layer", + "message0": " Visual Layer %1 Layer Properties %2 Transform %3 Auto Orient %4 %5 Matte Mode %6 %7 Matte Parent %8 Matte Target %9 %10 Has Masks %11 %12 Masks %13 Effects %14 Motion Blur %15 %16 Layer style %17 Blend Mode %18 %19 CSS Class %20 Layer XML ID %21 Layer XML tag name %22 Collapse Transform %23 %24 Collapse Transform %25 %26", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lottie_layer_common", + "check": "lottie_layer_common" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "field_checkbox", + "name": "ao", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "tt", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Alpha", + "1" + ], + [ + "Inverted Alpha", + "2" + ], + [ + "Luma", + "3" + ], + [ + "Inverted Luma", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tp", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "td" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "hasMask" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "masksProperties" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effects" + }, + { + "type": "field_checkbox", + "name": "mb" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "sy", + "check": "styles" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "tg", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "cp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "ct", + "checked": false + }, + { + "type": "input_dummy" + } + ], + "colour": 60, + "helpUrl": "/lottie-docs/layers/#layer", + "tooltip": "Visual Layer", + "inputsInline": false, + "previousStatement": "layers", + "nextStatement": "layers" +}, +{ + "type": "lottie_ellipse", + "message0": " Ellipse %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Direction %14 %15 Position %16 Size %17", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/circle.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "el" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "d", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "1" + ], + [ + "Reversed", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "p", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#ellipse", + "tooltip": "Ellipse", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_fill", + "message0": " Fill %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Opacity %14 Color %15 Fill Rule %16 %17", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/solid/fill-drip.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "fl" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "c", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "r", + "options": [ + [ + "--", + "" + ], + [ + "Non Zero", + "1" + ], + [ + "Even Odd", + "2" + ] + ] + }, + { + "type": "input_dummy" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#fill", + "tooltip": "Fill", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_gradient_fill", + "message0": " Gradient Fill %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Start Point %13 End Point %14 Gradient Type %15 %16 Highlight Length %17 Highlight Angle %18 Colors %19 Opacity %20 Fill Rule %21 %22", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "gf" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "e", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "t", + "options": [ + [ + "--", + "" + ], + [ + "Linear", + "1" + ], + [ + "Radial", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "h", + "check": "property" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "g", + "check": "lottie_gradient_colors" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "r", + "options": [ + [ + "--", + "" + ], + [ + "Non Zero", + "1" + ], + [ + "Even Odd", + "2" + ] + ] + }, + { + "type": "input_dummy" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#gradients", + "tooltip": "Gradient Fill", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_gradient_stroke", + "message0": " Gradient Stroke %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Line Cap %13 %14 Line Join %15 %16 Miter Limit %17 Miter Limit %18 Opacity %19 Width %20 Dashes %21 Start Point %22 End Point %23 Gradient Type %24 %25 Highlight Length %26 Highlight Angle %27 Colors %28", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "gs" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "lc", + "options": [ + [ + "--", + "" + ], + [ + "Butt", + "1" + ], + [ + "Round", + "2" + ], + [ + "Square", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "lj", + "options": [ + [ + "--", + "" + ], + [ + "Miter", + "1" + ], + [ + "Round", + "2" + ], + [ + "Bevel", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ml", + "check": "value" + }, + { + "type": "input_value", + "name": "ml2", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "w", + "check": "property" + }, + { + "type": "input_statement", + "name": "d", + "check": "lottie_stroke_dash" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "e", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "t", + "options": [ + [ + "--", + "" + ], + [ + "Linear", + "1" + ], + [ + "Radial", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "h", + "check": "property" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "g", + "check": "lottie_gradient_colors" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#gradients", + "tooltip": "Gradient Stroke", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_group", + "message0": " Group %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Number Of Properties %14 Shapes %15 Property index %16", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/object-group.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "gr" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_statement", + "name": "it", + "check": "shapes" + }, + { + "type": "input_value", + "name": "cix", + "check": "value" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#group", + "tooltip": "Group", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_no_style", + "message0": " No Style %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "no" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#no-style", + "tooltip": "No Style", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_path", + "message0": " Path %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Direction %14 %15 Shape %16", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/solid/bezier-curve.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "sh" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "d", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "1" + ], + [ + "Reversed", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ks", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#path", + "tooltip": "Path", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_polystar", + "message0": " PolyStar %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Direction %14 %15 Position %16 Outer Radius %17 Outer Roundness %18 Rotation %19 Points %20 Star Type %21 %22 Inner Radius %23 Inner Roundness %24", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/star.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "sr" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "d", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "1" + ], + [ + "Reversed", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "p", + "check": "property" + }, + { + "type": "input_value", + "name": "or", + "check": "property" + }, + { + "type": "input_value", + "name": "os", + "check": "property" + }, + { + "type": "input_value", + "name": "r", + "check": "property" + }, + { + "type": "input_value", + "name": "pt", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "sy", + "options": [ + [ + "--", + "" + ], + [ + "Star", + "1" + ], + [ + "Polygon", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ir", + "check": "property" + }, + { + "type": "input_value", + "name": "is", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#polystar", + "tooltip": "PolyStar", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_pucker_bloat", + "message0": " Pucker Bloat %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Amount %13", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "pb" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#pucker-bloat", + "tooltip": "Pucker Bloat", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_rectangle", + "message0": " Rectangle %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Direction %14 %15 Position %16 Size %17 Rounded %18", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/square.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "rc" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "d", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "1" + ], + [ + "Reversed", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "p", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "r", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#rectangle", + "tooltip": "Rectangle", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_repeater", + "message0": " Repeater %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Copies %14 Offset %15 Composite %16 %17 Transform %18", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/clone.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "rp" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "c", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "m", + "options": [ + [ + "--", + "" + ], + [ + "Above", + "1" + ], + [ + "Below", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tr", + "check": "lottie_repeater_transform" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#repeater", + "tooltip": "Repeater", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_repeater_transform", + "message0": " Repeater Transform %1 Anchor Point %2 Scale %3 Opacity %4 Skew %5 Skew Axis %6 Start Opacity %7 End Opacity %8", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "sk", + "check": "property" + }, + { + "type": "input_value", + "name": "sa", + "check": "property" + }, + { + "type": "input_value", + "name": "so", + "check": "property" + }, + { + "type": "input_value", + "name": "eo", + "check": "property" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/shapes/#repeater-transform", + "tooltip": "Repeater Transform", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_rounded_corners", + "message0": " Rounded Corners %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Radius %13", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "rd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "r", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#rounded-corners", + "tooltip": "Rounded Corners", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_shape_element", + "message0": " Shape Element %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Custom Attributes %13 %14", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "ty" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "custom_attributes", + "check": "object_member" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#shape-elements", + "tooltip": "Shape Element", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_stroke", + "message0": " Stroke %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Line Cap %14 %15 Line Join %16 %17 Miter Limit %18 Miter Limit %19 Opacity %20 Width %21 Dashes %22 Color %23", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/solid/border-style.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "st" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "lc", + "options": [ + [ + "--", + "" + ], + [ + "Butt", + "1" + ], + [ + "Round", + "2" + ], + [ + "Square", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "lj", + "options": [ + [ + "--", + "" + ], + [ + "Miter", + "1" + ], + [ + "Round", + "2" + ], + [ + "Bevel", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ml", + "check": "value" + }, + { + "type": "input_value", + "name": "ml2", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "w", + "check": "property" + }, + { + "type": "input_statement", + "name": "d", + "check": "lottie_stroke_dash" + }, + { + "type": "input_value", + "name": "c", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#stroke", + "tooltip": "Stroke", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_stroke_dash", + "message0": " Stroke Dash %1 Name %2 Match Name %3 Dash Type %4 %5 Length %6", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "n", + "options": [ + [ + "--", + "" + ], + [ + "Dash", + "d" + ], + [ + "Gap", + "g" + ], + [ + "Offset", + "o" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 0, + "helpUrl": "/lottie-docs/shapes/#stroke-dashes", + "tooltip": "Stroke Dash", + "inputsInline": false, + "previousStatement": "lottie_stroke_dash", + "nextStatement": "lottie_stroke_dash" +}, +{ + "type": "lottie_transform_shape", + "message0": " Transform Shape %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Anchor Point %14 Position %15 Scale %16 Opacity %17 Skew %18 Skew Axis %19", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/solid/arrows-alt.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "tr" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "p", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "sk", + "check": "property" + }, + { + "type": "input_value", + "name": "sa", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#transform-shape", + "tooltip": "Transform Shape", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_trim", + "message0": " Trim %1 %2 Name %3 Match Name %4 Hidden %5 %6 Shape Type %7 %8 Blend Mode %9 %10 Property index %11 CSS Class %12 Layer XML ID %13 Start %14 End %15 Offset %16 Multiple %17 %18", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/star-half.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "tm" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "e", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "m", + "options": [ + [ + "--", + "" + ], + [ + "Simultaneously", + "1" + ], + [ + "Individually", + "2" + ] + ] + }, + { + "type": "input_dummy" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#trim-path", + "tooltip": "Trim", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_zig_zag", + "message0": " Zig Zag %1 Name %2 Match Name %3 Hidden %4 %5 Shape Type %6 %7 Blend Mode %8 %9 Property index %10 CSS Class %11 Layer XML ID %12 Frequency %13 Amplitude %14 Point Type %15", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "hd" + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "zz" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "bm", + "options": [ + [ + "--", + "" + ], + [ + "Normal", + "0" + ], + [ + "Multiply", + "1" + ], + [ + "Screen", + "2" + ], + [ + "Overlay", + "3" + ], + [ + "Darken", + "4" + ], + [ + "Lighten", + "5" + ], + [ + "Color Dodge", + "6" + ], + [ + "Color Burn", + "7" + ], + [ + "Hard Light", + "8" + ], + [ + "Soft Light", + "9" + ], + [ + "Difference", + "10" + ], + [ + "Exclusion", + "11" + ], + [ + "Hue", + "12" + ], + [ + "Saturation", + "13" + ], + [ + "Color", + "14" + ], + [ + "Luminosity", + "15" + ], + [ + "Add", + "16" + ], + [ + "Hard Mix", + "17" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "cl", + "check": "value" + }, + { + "type": "input_value", + "name": "ln", + "check": "value" + }, + { + "type": "input_value", + "name": "r", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "pt", + "check": "property" + } + ], + "colour": 120, + "helpUrl": "/lottie-docs/shapes/#zig-zag", + "tooltip": "Zig Zag", + "inputsInline": false, + "previousStatement": "shapes", + "nextStatement": "shapes" +}, +{ + "type": "lottie_asset", + "message0": " Asset %1 ID %2 %3 Name %4", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#assets", + "tooltip": "Asset", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_data_source", + "message0": " Data source %1 ID %2 %3 Name %4 Path %5 File name %6 %7 Embedded %8 %9 Type %10 %11", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "u", + "check": "value" + }, + { + "type": "field_input", + "name": "p", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "e", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "field_label_serializable", + "name": "t", + "text": "3" + }, + { + "type": "input_dummy" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#data-source", + "tooltip": "Data source", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_file_asset", + "message0": " File Asset %1 ID %2 %3 Name %4 Path %5 File name %6 %7 Embedded %8 %9", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "u", + "check": "value" + }, + { + "type": "field_input", + "name": "p", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "e", + "checked": false + }, + { + "type": "input_dummy" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#data-source", + "tooltip": "File Asset", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_image", + "message0": " Image %1 %2 ID %3 %4 Name %5 Path %6 File name %7 %8 Embedded %9 %10 Width %11 Height %12 Type %13 %14 Slot ID %15", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/image.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "u", + "check": "value" + }, + { + "type": "field_input", + "name": "p", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "e", + "checked": false + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "w", + "check": "value" + }, + { + "type": "input_value", + "name": "h", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "t", + "text": "seq" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "sid", + "check": "value" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#image", + "tooltip": "Image", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_precomposition", + "message0": " Precomposition %1 %2 ID %3 %4 Name %5 Layers %6 Framerate %7 Extra %8 %9", + "args0": [ + { + "type": "field_image", + "src": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/folder-open.svg", + "width": 16, + "height": 16 + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_statement", + "name": "layers", + "check": "layers" + }, + { + "type": "input_value", + "name": "fr", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "xt", + "checked": false + }, + { + "type": "input_dummy" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#precomposition", + "tooltip": "Precomposition", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_sound", + "message0": " Sound %1 ID %2 %3 Name %4 Path %5 File name %6 %7 Embedded %8 %9", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "id", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "u", + "check": "value" + }, + { + "type": "field_input", + "name": "p", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "e", + "checked": false + }, + { + "type": "input_dummy" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/assets/#sound", + "tooltip": "Sound", + "inputsInline": false, + "previousStatement": "assets", + "nextStatement": "assets" +}, +{ + "type": "lottie_displacement_map_effect", + "message0": " Displacement Map Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "27" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#displacement-map-effect", + "tooltip": "Displacement Map Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_drop_shadow_effect", + "message0": " Drop Shadow Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "25" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#drop-shadow-effect", + "tooltip": "Drop Shadow Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_effect", + "message0": " Effect %1 Name %2 Match Name %3 Effect Values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10 Custom Attributes %11 %12", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef", + "check": "effect_values" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_number", + "name": "ty" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "custom_attributes", + "check": "object_member" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#effects", + "tooltip": "Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_fill_effect", + "message0": " Fill Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "21" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#fill-effect", + "tooltip": "Fill Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_gaussian_blur_effect", + "message0": " Gaussian Blur Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "29" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#gaussian-blur-effect", + "tooltip": "Gaussian Blur Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_matte3_effect", + "message0": " Set Matte Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "28" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#matte3-effect", + "tooltip": "Set Matte Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_mesh_warp_effect", + "message0": " Mesh Warp Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "31" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#mesh-warp-effect", + "tooltip": "Mesh Warp Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_pro_levels_effect", + "message0": " Pro Levels Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "24" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#pro-levels-effect", + "tooltip": "Pro Levels Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_puppet_effect", + "message0": " Puppet Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "34" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#puppet-effect", + "tooltip": "Puppet Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_radial_wipe_effect", + "message0": " Radial Wipe %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "26" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#radial-wipe-effect", + "tooltip": "Radial Wipe", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_spherize_effect", + "message0": " Spherize Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "33" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#spherize-effect", + "tooltip": "Spherize Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_stroke_effect", + "message0": " Stroke Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "22" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#stroke-effect", + "tooltip": "Stroke Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_tint_effect", + "message0": " Tint Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "20" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#tint-effect", + "tooltip": "Tint Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_tritone_effect", + "message0": " Tritone Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "23" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#tritone-effect", + "tooltip": "Tritone Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_twirl_effect", + "message0": " Twirl Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "30" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#twirl-effect", + "tooltip": "Twirl Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_wavy_effect", + "message0": " Wavy Effect %1 Name %2 Match Name %3 Effect values %4 Property Count %5 Effect Index %6 Type %7 %8 Enabled %9 %10", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_statement", + "name": "ef" + }, + { + "type": "input_value", + "name": "np", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "32" + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "en", + "checked": true + }, + { + "type": "input_dummy" + } + ], + "colour": 330, + "helpUrl": "/lottie-docs/effects/#wavy-effect", + "tooltip": "Wavy Effect", + "inputsInline": false, + "previousStatement": "effects", + "nextStatement": "effects" +}, +{ + "type": "lottie_effect_value_angle", + "message0": " Effect Value Angle %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "1" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#angle", + "tooltip": "Effect Value Angle", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_checkbox", + "message0": " Effect Value Checkbox %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "4" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#checkbox", + "tooltip": "Effect Value Checkbox", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_color", + "message0": " Effect Value Color %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "2" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#color", + "tooltip": "Effect Value Color", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_drop_down", + "message0": " Effect Value Drop Down %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "7" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#drop-down", + "tooltip": "Effect Value Drop Down", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_effect_value", + "message0": " Effect Value %1 Name %2 Match Name %3 Effect Index %4 Type %5", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "input_value", + "name": "ty", + "check": "value" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#effect-values", + "tooltip": "Effect Value", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_ignored", + "message0": " Ignored Value %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "6" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "value" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#ignored", + "tooltip": "Ignored Value", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_layer", + "message0": " Effect Value Layer %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "10" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#layer", + "tooltip": "Effect Value Layer", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_no_value", + "message0": " Effect No Value %1", + "args0": [ + { + "type": "input_dummy" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#no-value", + "tooltip": "Effect No Value", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_point", + "message0": " Effect Value Point %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "3" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#point", + "tooltip": "Effect Value Point", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_effect_value_slider", + "message0": " Effect Value Slider %1 Name %2 Match Name %3 Effect Index %4 Type %5 %6 Value %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "mn", + "check": "value" + }, + { + "type": "input_value", + "name": "ix", + "check": "value" + }, + { + "type": "field_label_serializable", + "name": "ty", + "text": "0" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "v", + "check": "property" + } + ], + "colour": 300, + "helpUrl": "/lottie-docs/effects/#slider", + "tooltip": "Effect Value Slider", + "inputsInline": false, + "previousStatement": "effect-values", + "nextStatement": "effect-values" +}, +{ + "type": "lottie_animated_text_document", + "message0": " Animated Text Document %1 Keyframes %2 Expression %3 Slot ID %4", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "k", + "check": "lottie_text_document_keyframe" + }, + { + "type": "input_value", + "name": "x", + "check": "value" + }, + { + "type": "input_value", + "name": "sid", + "check": "value" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#animated-text-document", + "tooltip": "Animated Text Document", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_character_data", + "message0": " Character Data %1 Character %2 %3 Font Family %4 %5 Font Size %6 %7 Font Style %8 %9 Width %10 %11", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "ch", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "fFamily", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "size", + "value": 0 + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "style", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "w", + "value": 0 + }, + { + "type": "input_dummy" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#character-data", + "tooltip": "Character Data", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_character_precomp", + "message0": " Character Precomp %1 Reference Id %2 %3 Transform %4 In Point %5 Out Point %6 Time Stretch %7 Start Time %8", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "refId" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ks", + "check": "lottie_transform" + }, + { + "type": "input_value", + "name": "ip", + "check": "value" + }, + { + "type": "input_value", + "name": "op", + "check": "value" + }, + { + "type": "input_value", + "name": "sr", + "check": "value" + }, + { + "type": "input_value", + "name": "st", + "check": "value" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#character-precomp", + "tooltip": "Character Precomp", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_character_shapes", + "message0": " Character Shape %1 Shapes %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "shapes", + "check": "shapes" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#character-shapes", + "tooltip": "Character Shape", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_font", + "message0": " Font %1 Ascent %2 Font Family %3 %4 Name %5 %6 Font Style %7 %8 Path %9 Weight %10 Origin %11 %12 CSS Class %13", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "ascent", + "check": "value" + }, + { + "type": "field_input", + "name": "fFamily", + "text": "sans" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "fName", + "text": "sans-Regular" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "fStyle", + "text": "Regular" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "fPath", + "check": "value" + }, + { + "type": "input_value", + "name": "fWeight", + "check": "value" + }, + { + "type": "field_dropdown", + "name": "origin", + "options": [ + [ + "--", + "" + ], + [ + "Local", + "0" + ], + [ + "Css Url", + "1" + ], + [ + "Script Url", + "2" + ], + [ + "Font Url", + "3" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "fClass", + "check": "value" + } + ], + "colour": 30, + "helpUrl": "/lottie-docs/text/#font-list", + "tooltip": "Font", + "inputsInline": false, + "previousStatement": "lottie_font", + "nextStatement": "lottie_font" +}, +{ + "type": "lottie_font_list", + "message0": " Font List %1 List %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "list", + "check": "lottie_font" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#font-list", + "tooltip": "Font List", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_alignment_options", + "message0": " Text Alignment Options %1 Alignment %2 Grouping %3 %4", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "g", + "options": [ + [ + "--", + "" + ], + [ + "Characters", + "1" + ], + [ + "Word", + "2" + ], + [ + "Line", + "3" + ], + [ + "All", + "4" + ] + ] + }, + { + "type": "input_dummy" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-alignment-options", + "tooltip": "Text Alignment Options", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_data", + "message0": " Text Data %1 Ranges %2 Document %3 Alignment %4 Follow Path %5", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "a", + "check": "lottie_text_range" + }, + { + "type": "input_value", + "name": "d", + "check": "lottie_animated_text_document" + }, + { + "type": "input_value", + "name": "m", + "check": "lottie_text_alignment_options" + }, + { + "type": "input_value", + "name": "p", + "check": "lottie_text_follow_path" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-data", + "tooltip": "Text Data", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_document", + "message0": " Text Document %1 Font Family %2 %3 Fill Color %4 Stroke Color %5 Stroke Width %6 Stroke Over Fill %7 %8 Font Size %9 %10 Line Height %11 Wrap Size %12 Wrap Position %13 Text %14 %15 Justify %16 %17 Text Caps %18 %19 Tracking %20 Baseline Shift %21", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "f", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "fc", + "check": "value" + }, + { + "type": "input_value", + "name": "sc", + "check": "value" + }, + { + "type": "input_value", + "name": "sw", + "check": "value" + }, + { + "type": "field_checkbox", + "name": "of" + }, + { + "type": "input_dummy" + }, + { + "type": "field_number", + "name": "s", + "value": 10 + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "lh", + "check": "value" + }, + { + "type": "input_value", + "name": "sz", + "check": "color" + }, + { + "type": "input_value", + "name": "ps", + "check": "color" + }, + { + "type": "field_input", + "name": "t", + "text": "" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "j", + "options": [ + [ + "--", + "" + ], + [ + "Left", + "0" + ], + [ + "Right", + "1" + ], + [ + "Center", + "2" + ], + [ + "Justify with Last Line Left", + "3" + ], + [ + "Justify with Last Line Right", + "4" + ], + [ + "Justify with Last Line Center", + "5" + ], + [ + "Justify with Last Line Full", + "6" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "ca", + "options": [ + [ + "--", + "" + ], + [ + "Regular", + "0" + ], + [ + "All Caps", + "1" + ], + [ + "Small Caps", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "tr", + "check": "value" + }, + { + "type": "input_value", + "name": "ls", + "check": "value" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-document", + "tooltip": "Text Document", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_document_keyframe", + "message0": " Text Document Keyframe %1 Start %2 Time %3 %4", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "s", + "check": "lottie_text_document" + }, + { + "type": "field_number", + "name": "t", + "value": 0 + }, + { + "type": "input_dummy" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-document-keyframe", + "tooltip": "Text Document Keyframe", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_follow_path", + "message0": " Text Follow Path %1 Mask %2 First Margin %3 Last Margin %4 Reverse Path %5 Force Alignment %6 Perpendicular To Path %7", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "m", + "check": "value" + }, + { + "type": "input_value", + "name": "f", + "check": "property" + }, + { + "type": "input_value", + "name": "l", + "check": "property" + }, + { + "type": "input_value", + "name": "r", + "check": "property" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "p", + "check": "property" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-follow-path", + "tooltip": "Text Follow Path", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_range", + "message0": " Text Range %1 Name %2 Selector %3 Style %4", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "nm", + "check": "value" + }, + { + "type": "input_value", + "name": "s", + "check": "lottie_text_range_selector" + }, + { + "type": "input_value", + "name": "a", + "check": "lottie_text_style" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-range", + "tooltip": "Text Range", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_range_selector", + "message0": " Text Range Selector %1 Expressible %2 %3 Max Ease %4 Min Ease %5 Max Amount %6 Based On %7 %8 Randomize %9 %10 Shape %11 %12 Offset %13 Range Units %14 %15 Selector Smoothness %16 Start %17 End %18", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "t" + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "xe", + "check": "property" + }, + { + "type": "input_value", + "name": "ne", + "check": "property" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "b", + "options": [ + [ + "--", + "" + ], + [ + "Characters", + "1" + ], + [ + "Character Excluding Spaces", + "2" + ], + [ + "Words", + "3" + ], + [ + "Lines", + "4" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "field_checkbox", + "name": "rn" + }, + { + "type": "input_dummy" + }, + { + "type": "field_dropdown", + "name": "sh", + "options": [ + [ + "--", + "" + ], + [ + "Square", + "1" + ], + [ + "Ramp Up", + "2" + ], + [ + "Ramp Down", + "3" + ], + [ + "Triangle", + "4" + ], + [ + "Round", + "5" + ], + [ + "Smooth", + "6" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "field_dropdown", + "name": "r", + "options": [ + [ + "--", + "" + ], + [ + "Percent", + "1" + ], + [ + "Index", + "2" + ] + ] + }, + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "sm", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "e", + "check": "property" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-range-selector", + "tooltip": "Text Range Selector", + "inputsInline": false, + "output": null +}, +{ + "type": "lottie_text_style", + "message0": " Text Style %1 Anchor Point %2 Scale %3 Opacity %4 Skew %5 Skew Axis %6 Stroke Width %7 Stroke Color %8 Stroke Hue %9 Stroke Saturation %10 Stroke Brightness %11 Stroke Opacity %12 Fill Color %13 Fill Hue %14 Fill Saturation %15 Fill Brightness %16 Fill Opacity %17 Letter Spacing %18 Blur %19 Line Spacing %20", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "a", + "check": "property" + }, + { + "type": "input_value", + "name": "s", + "check": "property" + }, + { + "type": "input_value", + "name": "o", + "check": "property" + }, + { + "type": "input_value", + "name": "sk", + "check": "property" + }, + { + "type": "input_value", + "name": "sa", + "check": "property" + }, + { + "type": "input_value", + "name": "sw", + "check": "property" + }, + { + "type": "input_value", + "name": "sc", + "check": "property" + }, + { + "type": "input_value", + "name": "sh", + "check": "property" + }, + { + "type": "input_value", + "name": "ss", + "check": "property" + }, + { + "type": "input_value", + "name": "sb", + "check": "property" + }, + { + "type": "input_value", + "name": "so", + "check": "property" + }, + { + "type": "input_value", + "name": "fc", + "check": "property" + }, + { + "type": "input_value", + "name": "fh", + "check": "property" + }, + { + "type": "input_value", + "name": "fs", + "check": "property" + }, + { + "type": "input_value", + "name": "fb", + "check": "property" + }, + { + "type": "input_value", + "name": "fo", + "check": "property" + }, + { + "type": "input_value", + "name": "t", + "check": "property" + }, + { + "type": "input_value", + "name": "bl", + "check": "property" + }, + { + "type": "input_value", + "name": "ls", + "check": "property" + } + ], + "colour": 200, + "helpUrl": "/lottie-docs/text/#text-style", + "tooltip": "Text Style", + "inputsInline": false, + "output": null +}, +]); + +const generated_toolbox = { + "kind": "categoryToolbox", + "contents": [ + { + "kind": "category", + "name": "Animation", + "colour": 260, + "contents": [ + { + "kind": "block", + "type": "lottie_animation", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_metadata" + }, + { + "kind": "block", + "type": "lottie_motion_blur" + }, + { + "kind": "block", + "type": "lottie_user_metadata" + } + ] + }, + { + "kind": "category", + "name": "Layers", + "colour": 60, + "contents": [ + { + "kind": "block", + "type": "lottie_layer_common", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_audio_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_audio_settings" + }, + { + "kind": "block", + "type": "lottie_camera_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_data_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_image_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_null_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_precomposition_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_shape_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_solid_color_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_text_layer", + "blockxml": "60" + }, + { + "kind": "block", + "type": "lottie_visual_layer", + "blockxml": "60" + } + ] + }, + { + "kind": "category", + "name": "Shapes", + "colour": 120, + "contents": [ + { + "kind": "block", + "type": "lottie_ellipse", + "blockxml": "00100100" + }, + { + "kind": "block", + "type": "lottie_fill", + "blockxml": "000100" + }, + { + "kind": "block", + "type": "lottie_gradient_fill", + "blockxml": "" + }, + { + "kind": "block", + "type": "lottie_gradient_stroke", + "blockxml": "" + }, + { + "kind": "block", + "type": "lottie_group" + }, + { + "kind": "block", + "type": "lottie_no_style" + }, + { + "kind": "block", + "type": "lottie_path" + }, + { + "kind": "block", + "type": "lottie_polystar", + "blockxml": "00510000" + }, + { + "kind": "block", + "type": "lottie_pucker_bloat" + }, + { + "kind": "block", + "type": "lottie_rectangle", + "blockxml": "001001000" + }, + { + "kind": "block", + "type": "lottie_repeater", + "blockxml": "" + }, + { + "kind": "block", + "type": "lottie_repeater_transform" + }, + { + "kind": "block", + "type": "lottie_rounded_corners" + }, + { + "kind": "block", + "type": "lottie_shape_element" + }, + { + "kind": "block", + "type": "lottie_stroke", + "blockxml": "0001001" + }, + { + "kind": "block", + "type": "lottie_stroke_dash" + }, + { + "kind": "block", + "type": "lottie_transform_shape", + "blockxml": "100100100" + }, + { + "kind": "block", + "type": "lottie_trim" + }, + { + "kind": "block", + "type": "lottie_zig_zag" + } + ] + }, + { + "kind": "category", + "name": "Assets", + "colour": 30, + "contents": [ + { + "kind": "block", + "type": "lottie_asset" + }, + { + "kind": "block", + "type": "lottie_data_source" + }, + { + "kind": "block", + "type": "lottie_file_asset" + }, + { + "kind": "block", + "type": "lottie_image" + }, + { + "kind": "block", + "type": "lottie_precomposition" + }, + { + "kind": "block", + "type": "lottie_sound" + } + ] + }, + { + "kind": "category", + "name": "Effects", + "colour": 330, + "contents": [ + { + "kind": "block", + "type": "lottie_displacement_map_effect" + }, + { + "kind": "block", + "type": "lottie_drop_shadow_effect" + }, + { + "kind": "block", + "type": "lottie_effect" + }, + { + "kind": "block", + "type": "lottie_fill_effect" + }, + { + "kind": "block", + "type": "lottie_gaussian_blur_effect" + }, + { + "kind": "block", + "type": "lottie_matte3_effect" + }, + { + "kind": "block", + "type": "lottie_mesh_warp_effect" + }, + { + "kind": "block", + "type": "lottie_pro_levels_effect" + }, + { + "kind": "block", + "type": "lottie_puppet_effect" + }, + { + "kind": "block", + "type": "lottie_radial_wipe_effect" + }, + { + "kind": "block", + "type": "lottie_spherize_effect" + }, + { + "kind": "block", + "type": "lottie_stroke_effect" + }, + { + "kind": "block", + "type": "lottie_tint_effect" + }, + { + "kind": "block", + "type": "lottie_tritone_effect" + }, + { + "kind": "block", + "type": "lottie_twirl_effect" + }, + { + "kind": "block", + "type": "lottie_wavy_effect" + } + ] + }, + { + "kind": "category", + "name": "Effect Values", + "colour": 300, + "contents": [ + { + "kind": "block", + "type": "lottie_effect_value_angle" + }, + { + "kind": "block", + "type": "lottie_effect_value_checkbox" + }, + { + "kind": "block", + "type": "lottie_effect_value_color" + }, + { + "kind": "block", + "type": "lottie_effect_value_drop_down" + }, + { + "kind": "block", + "type": "lottie_effect_value_effect_value" + }, + { + "kind": "block", + "type": "lottie_effect_value_ignored" + }, + { + "kind": "block", + "type": "lottie_effect_value_layer" + }, + { + "kind": "block", + "type": "lottie_effect_value_no_value" + }, + { + "kind": "block", + "type": "lottie_effect_value_point" + }, + { + "kind": "block", + "type": "lottie_effect_value_slider" + } + ] + }, + { + "kind": "category", + "name": "Text", + "colour": 200, + "contents": [ + { + "kind": "block", + "type": "lottie_animated_text_document" + }, + { + "kind": "block", + "type": "lottie_character_data" + }, + { + "kind": "block", + "type": "lottie_character_precomp" + }, + { + "kind": "block", + "type": "lottie_character_shapes" + }, + { + "kind": "block", + "type": "lottie_font" + }, + { + "kind": "block", + "type": "lottie_font_list" + }, + { + "kind": "block", + "type": "lottie_text_alignment_options" + }, + { + "kind": "block", + "type": "lottie_text_data", + "blockxml": "" + }, + { + "kind": "block", + "type": "lottie_text_document" + }, + { + "kind": "block", + "type": "lottie_text_document_keyframe", + "blockxml": "" + }, + { + "kind": "block", + "type": "lottie_text_follow_path" + }, + { + "kind": "block", + "type": "lottie_text_range" + }, + { + "kind": "block", + "type": "lottie_text_range_selector" + }, + { + "kind": "block", + "type": "lottie_text_style" + } + ] + } + ] +}; + +class GeneratedGenerator { +lottie_animation(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'v': this.input_to_json(block, 'v'), + 'fr': Number(block.getFieldValue('fr')), + 'ip': Number(block.getFieldValue('ip')), + 'op': Number(block.getFieldValue('op')), + 'w': Number(block.getFieldValue('w')), + 'h': Number(block.getFieldValue('h')), + 'ddd': 'TRUE' == block.getFieldValue('ddd') ? 1 : 0, + 'assets': this.statements_to_json(block, 'assets', false), + 'comps': this.statements_to_json(block, 'comps', false), + 'fonts': this.input_to_json(block, 'fonts'), + 'chars': this.statements_to_json(block, 'chars', true), + 'meta': this.input_to_json(block, 'meta'), + 'metadata': this.input_to_json(block, 'metadata'), + 'markers': this.statements_to_json(block, 'markers', false), + 'mb': this.input_to_json(block, 'mb'), + 'slots': this.input_to_json(block, 'slots'), + 'layers': this.statements_to_json(block, 'layers', false) + }; +} +lottie_metadata(block) +{ + return { + 'a': this.input_to_json(block, 'a'), + 'd': this.input_to_json(block, 'd'), + 'tc': this.input_to_json(block, 'tc'), + 'g': this.input_to_json(block, 'g') + }; +} +lottie_motion_blur(block) +{ + return { + 'sa': this.input_to_json(block, 'sa'), + 'sp': this.input_to_json(block, 'sp'), + 'spf': this.input_to_json(block, 'spf'), + 'asl': this.input_to_json(block, 'asl') + }; +} +lottie_user_metadata(block) +{ + return { + 'filename': this.input_to_json(block, 'filename'), + 'customProps': this.input_to_json(block, 'customProps') + }; +} +lottie_layer_common(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ddd': 'TRUE' == block.getFieldValue('ddd') ? 1 : 0, + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ind': this.input_to_json(block, 'ind'), + 'parent': this.input_to_json(block, 'parent'), + 'sr': this.input_to_json(block, 'sr'), + 'ip': Number(block.getFieldValue('ip')), + 'op': Number(block.getFieldValue('op')), + 'st': Number(block.getFieldValue('st')) + }; +} +lottie_audio_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ty': Number(block.getFieldValue('ty')), + 'au': this.input_to_json(block, 'au'), + 'refId': this.input_to_json(block, 'refId') + }; +} +lottie_audio_settings(block) +{ + return { + 'lv': this.input_to_json(block, 'lv') + }; +} +lottie_camera_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ty': Number(block.getFieldValue('ty')), + 'ks': this.input_to_json(block, 'ks'), + 'pe': this.input_to_json(block, 'pe') + }; +} +lottie_data_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ty': Number(block.getFieldValue('ty')), + 'refId': this.input_to_json(block, 'refId') + }; +} +lottie_image_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')), + 'refId': block.getFieldValue('refId') + }; +} +lottie_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ty': Number(block.getFieldValue('ty')), + ...this.object_members_to_json(block, 'custom_attributes') + }; +} +lottie_null_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')) + }; +} +lottie_precomposition_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')), + 'refId': block.getFieldValue('refId'), + 'w': Number(block.getFieldValue('w')), + 'h': Number(block.getFieldValue('h')), + 'tm': this.input_to_json(block, 'tm') + }; +} +lottie_shape_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')), + 'shapes': this.statements_to_json(block, 'shapes', false) + }; +} +lottie_solid_color_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')), + 'sc': block.getFieldValue('sc'), + 'sh': Number(block.getFieldValue('sh')), + 'sw': Number(block.getFieldValue('sw')) + }; +} +lottie_text_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0, + 'ty': Number(block.getFieldValue('ty')), + 't': this.input_to_json(block, 't') + }; +} +lottie_visual_layer(block) +{ + return { + ...this.input_to_json(block, 'lottie_layer_common'), + 'ks': this.input_to_json(block, 'ks'), + 'ao': 'TRUE' == block.getFieldValue('ao') ? 1 : 0, + 'tt': block.getFieldValue('tt') === '' ? undefined : Number(block.getFieldValue('tt')), + 'tp': this.input_to_json(block, 'tp'), + 'td': 'TRUE' == block.getFieldValue('td') ? 1 : 0, + 'hasMask': 'TRUE' == block.getFieldValue('hasMask'), + 'masksProperties': this.statements_to_json(block, 'masksProperties', false), + 'ef': this.statements_to_json(block, 'ef', false), + 'mb': 'TRUE' == block.getFieldValue('mb'), + 'sy': this.statements_to_json(block, 'sy', false), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'tg': this.input_to_json(block, 'tg'), + 'cp': 'TRUE' == block.getFieldValue('cp'), + 'ct': 'TRUE' == block.getFieldValue('ct') ? 1 : 0 + }; +} +lottie_ellipse(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'd': block.getFieldValue('d') === '' ? undefined : Number(block.getFieldValue('d')), + 'p': this.input_to_json(block, 'p'), + 's': this.input_to_json(block, 's') + }; +} +lottie_fill(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'o': this.input_to_json(block, 'o'), + 'c': this.input_to_json(block, 'c'), + 'r': block.getFieldValue('r') === '' ? undefined : Number(block.getFieldValue('r')) + }; +} +lottie_gradient_fill(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 's': this.input_to_json(block, 's'), + 'e': this.input_to_json(block, 'e'), + 't': block.getFieldValue('t') === '' ? undefined : Number(block.getFieldValue('t')), + 'h': this.input_to_json(block, 'h'), + 'a': this.input_to_json(block, 'a'), + 'g': this.input_to_json(block, 'g'), + 'o': this.input_to_json(block, 'o'), + 'r': block.getFieldValue('r') === '' ? undefined : Number(block.getFieldValue('r')) + }; +} +lottie_gradient_stroke(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'lc': block.getFieldValue('lc') === '' ? undefined : Number(block.getFieldValue('lc')), + 'lj': block.getFieldValue('lj') === '' ? undefined : Number(block.getFieldValue('lj')), + 'ml': this.input_to_json(block, 'ml'), + 'ml2': this.input_to_json(block, 'ml2'), + 'o': this.input_to_json(block, 'o'), + 'w': this.input_to_json(block, 'w'), + 'd': this.statements_to_json(block, 'd', false), + 's': this.input_to_json(block, 's'), + 'e': this.input_to_json(block, 'e'), + 't': block.getFieldValue('t') === '' ? undefined : Number(block.getFieldValue('t')), + 'h': this.input_to_json(block, 'h'), + 'a': this.input_to_json(block, 'a'), + 'g': this.input_to_json(block, 'g') + }; +} +lottie_group(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'np': this.input_to_json(block, 'np'), + 'it': this.statements_to_json(block, 'it', false), + 'cix': this.input_to_json(block, 'cix') + }; +} +lottie_no_style(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln') + }; +} +lottie_path(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'd': block.getFieldValue('d') === '' ? undefined : Number(block.getFieldValue('d')), + 'ks': this.input_to_json(block, 'ks') + }; +} +lottie_polystar(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'd': block.getFieldValue('d') === '' ? undefined : Number(block.getFieldValue('d')), + 'p': this.input_to_json(block, 'p'), + 'or': this.input_to_json(block, 'or'), + 'os': this.input_to_json(block, 'os'), + 'r': this.input_to_json(block, 'r'), + 'pt': this.input_to_json(block, 'pt'), + 'sy': block.getFieldValue('sy') === '' ? undefined : Number(block.getFieldValue('sy')), + 'ir': this.input_to_json(block, 'ir'), + 'is': this.input_to_json(block, 'is') + }; +} +lottie_pucker_bloat(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'a': this.input_to_json(block, 'a') + }; +} +lottie_rectangle(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'd': block.getFieldValue('d') === '' ? undefined : Number(block.getFieldValue('d')), + 'p': this.input_to_json(block, 'p'), + 's': this.input_to_json(block, 's'), + 'r': this.input_to_json(block, 'r') + }; +} +lottie_repeater(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'c': this.input_to_json(block, 'c'), + 'o': this.input_to_json(block, 'o'), + 'm': block.getFieldValue('m') === '' ? undefined : Number(block.getFieldValue('m')), + 'tr': this.input_to_json(block, 'tr') + }; +} +lottie_repeater_transform(block) +{ + return { + 'a': this.input_to_json(block, 'a'), + 's': this.input_to_json(block, 's'), + 'o': this.input_to_json(block, 'o'), + 'sk': this.input_to_json(block, 'sk'), + 'sa': this.input_to_json(block, 'sa'), + 'so': this.input_to_json(block, 'so'), + 'eo': this.input_to_json(block, 'eo') + }; +} +lottie_rounded_corners(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'r': this.input_to_json(block, 'r') + }; +} +lottie_shape_element(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + ...this.object_members_to_json(block, 'custom_attributes') + }; +} +lottie_stroke(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'lc': block.getFieldValue('lc') === '' ? undefined : Number(block.getFieldValue('lc')), + 'lj': block.getFieldValue('lj') === '' ? undefined : Number(block.getFieldValue('lj')), + 'ml': this.input_to_json(block, 'ml'), + 'ml2': this.input_to_json(block, 'ml2'), + 'o': this.input_to_json(block, 'o'), + 'w': this.input_to_json(block, 'w'), + 'd': this.statements_to_json(block, 'd', false), + 'c': this.input_to_json(block, 'c') + }; +} +lottie_stroke_dash(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'n': block.getFieldValue('n') === '' ? undefined : block.getFieldValue('n'), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_transform_shape(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'a': this.input_to_json(block, 'a'), + 'p': this.input_to_json(block, 'p'), + 's': this.input_to_json(block, 's'), + 'o': this.input_to_json(block, 'o'), + 'sk': this.input_to_json(block, 'sk'), + 'sa': this.input_to_json(block, 'sa') + }; +} +lottie_trim(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 's': this.input_to_json(block, 's'), + 'e': this.input_to_json(block, 'e'), + 'o': this.input_to_json(block, 'o'), + 'm': block.getFieldValue('m') === '' ? undefined : Number(block.getFieldValue('m')) + }; +} +lottie_zig_zag(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'hd': 'TRUE' == block.getFieldValue('hd'), + 'ty': block.getFieldValue('ty'), + 'bm': block.getFieldValue('bm') === '' ? undefined : Number(block.getFieldValue('bm')), + 'ix': this.input_to_json(block, 'ix'), + 'cl': this.input_to_json(block, 'cl'), + 'ln': this.input_to_json(block, 'ln'), + 'r': this.input_to_json(block, 'r'), + 's': this.input_to_json(block, 's'), + 'pt': this.input_to_json(block, 'pt') + }; +} +lottie_asset(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm') + }; +} +lottie_data_source(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm'), + 'u': this.input_to_json(block, 'u'), + 'p': block.getFieldValue('p'), + 'e': 'TRUE' == block.getFieldValue('e') ? 1 : 0, + 't': Number(block.getFieldValue('t')) + }; +} +lottie_file_asset(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm'), + 'u': this.input_to_json(block, 'u'), + 'p': block.getFieldValue('p'), + 'e': 'TRUE' == block.getFieldValue('e') ? 1 : 0 + }; +} +lottie_image(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm'), + 'u': this.input_to_json(block, 'u'), + 'p': block.getFieldValue('p'), + 'e': 'TRUE' == block.getFieldValue('e') ? 1 : 0, + 'w': this.input_to_json(block, 'w'), + 'h': this.input_to_json(block, 'h'), + 't': block.getFieldValue('t'), + 'sid': this.input_to_json(block, 'sid') + }; +} +lottie_precomposition(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm'), + 'layers': this.statements_to_json(block, 'layers', false), + 'fr': this.input_to_json(block, 'fr'), + 'xt': 'TRUE' == block.getFieldValue('xt') ? 1 : 0 + }; +} +lottie_sound(block) +{ + return { + 'id': block.getFieldValue('id'), + 'nm': this.input_to_json(block, 'nm'), + 'u': this.input_to_json(block, 'u'), + 'p': block.getFieldValue('p'), + 'e': 'TRUE' == block.getFieldValue('e') ? 1 : 0 + }; +} +lottie_displacement_map_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_drop_shadow_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0, + ...this.object_members_to_json(block, 'custom_attributes') + }; +} +lottie_fill_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_gaussian_blur_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_matte3_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_mesh_warp_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_pro_levels_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_puppet_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_radial_wipe_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_spherize_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_stroke_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_tint_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_tritone_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_twirl_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_wavy_effect(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ef': this.statements_to_json(block, 'ef', false), + 'np': this.input_to_json(block, 'np'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'en': 'TRUE' == block.getFieldValue('en') ? 1 : 0 + }; +} +lottie_effect_value_angle(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_checkbox(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_color(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_drop_down(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_effect_value(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': this.input_to_json(block, 'ty') + }; +} +lottie_effect_value_ignored(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_layer(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_no_value(block) +{ + return { + + }; +} +lottie_effect_value_point(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_effect_value_slider(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 'mn': this.input_to_json(block, 'mn'), + 'ix': this.input_to_json(block, 'ix'), + 'ty': Number(block.getFieldValue('ty')), + 'v': this.input_to_json(block, 'v') + }; +} +lottie_animated_text_document(block) +{ + return { + 'k': this.statements_to_json(block, 'k', false), + 'x': this.input_to_json(block, 'x'), + 'sid': this.input_to_json(block, 'sid') + }; +} +lottie_character_data(block) +{ + return { + 'ch': block.getFieldValue('ch'), + 'fFamily': block.getFieldValue('fFamily'), + 'size': Number(block.getFieldValue('size')), + 'style': block.getFieldValue('style'), + 'w': Number(block.getFieldValue('w')) + }; +} +lottie_character_precomp(block) +{ + return { + 'refId': block.getFieldValue('refId'), + 'ks': this.input_to_json(block, 'ks'), + 'ip': this.input_to_json(block, 'ip'), + 'op': this.input_to_json(block, 'op'), + 'sr': this.input_to_json(block, 'sr'), + 'st': this.input_to_json(block, 'st') + }; +} +lottie_character_shapes(block) +{ + return { + 'shapes': this.statements_to_json(block, 'shapes', false) + }; +} +lottie_font(block) +{ + return { + 'ascent': this.input_to_json(block, 'ascent'), + 'fFamily': block.getFieldValue('fFamily'), + 'fName': block.getFieldValue('fName'), + 'fStyle': block.getFieldValue('fStyle'), + 'fPath': this.input_to_json(block, 'fPath'), + 'fWeight': this.input_to_json(block, 'fWeight'), + 'origin': block.getFieldValue('origin') === '' ? undefined : Number(block.getFieldValue('origin')), + 'fClass': this.input_to_json(block, 'fClass') + }; +} +lottie_font_list(block) +{ + return { + 'list': this.statements_to_json(block, 'list', false) + }; +} +lottie_text_alignment_options(block) +{ + return { + 'a': this.input_to_json(block, 'a'), + 'g': block.getFieldValue('g') === '' ? undefined : Number(block.getFieldValue('g')) + }; +} +lottie_text_data(block) +{ + return { + 'a': this.statements_to_json(block, 'a', false), + 'd': this.input_to_json(block, 'd'), + 'm': this.input_to_json(block, 'm'), + 'p': this.input_to_json(block, 'p') + }; +} +lottie_text_document(block) +{ + return { + 'f': block.getFieldValue('f'), + 'fc': this.input_to_json(block, 'fc'), + 'sc': this.input_to_json(block, 'sc'), + 'sw': this.input_to_json(block, 'sw'), + 'of': 'TRUE' == block.getFieldValue('of'), + 's': Number(block.getFieldValue('s')), + 'lh': this.input_to_json(block, 'lh'), + 'sz': this.input_to_json(block, 'sz'), + 'ps': this.input_to_json(block, 'ps'), + 't': block.getFieldValue('t'), + 'j': block.getFieldValue('j') === '' ? undefined : Number(block.getFieldValue('j')), + 'ca': block.getFieldValue('ca') === '' ? undefined : Number(block.getFieldValue('ca')), + 'tr': this.input_to_json(block, 'tr'), + 'ls': this.input_to_json(block, 'ls') + }; +} +lottie_text_document_keyframe(block) +{ + return { + 's': this.input_to_json(block, 's'), + 't': Number(block.getFieldValue('t')) + }; +} +lottie_text_follow_path(block) +{ + return { + 'm': this.input_to_json(block, 'm'), + 'f': this.input_to_json(block, 'f'), + 'l': this.input_to_json(block, 'l'), + 'r': this.input_to_json(block, 'r'), + 'a': this.input_to_json(block, 'a'), + 'p': this.input_to_json(block, 'p') + }; +} +lottie_text_range(block) +{ + return { + 'nm': this.input_to_json(block, 'nm'), + 's': this.input_to_json(block, 's'), + 'a': this.input_to_json(block, 'a') + }; +} +lottie_text_range_selector(block) +{ + return { + 't': 'TRUE' == block.getFieldValue('t') ? 1 : 0, + 'xe': this.input_to_json(block, 'xe'), + 'ne': this.input_to_json(block, 'ne'), + 'a': this.input_to_json(block, 'a'), + 'b': block.getFieldValue('b') === '' ? undefined : Number(block.getFieldValue('b')), + 'rn': 'TRUE' == block.getFieldValue('rn') ? 1 : 0, + 'sh': block.getFieldValue('sh') === '' ? undefined : Number(block.getFieldValue('sh')), + 'o': this.input_to_json(block, 'o'), + 'r': block.getFieldValue('r') === '' ? undefined : Number(block.getFieldValue('r')), + 'sm': this.input_to_json(block, 'sm'), + 's': this.input_to_json(block, 's'), + 'e': this.input_to_json(block, 'e') + }; +} +lottie_text_style(block) +{ + return { + 'a': this.input_to_json(block, 'a'), + 's': this.input_to_json(block, 's'), + 'o': this.input_to_json(block, 'o'), + 'sk': this.input_to_json(block, 'sk'), + 'sa': this.input_to_json(block, 'sa'), + 'sw': this.input_to_json(block, 'sw'), + 'sc': this.input_to_json(block, 'sc'), + 'sh': this.input_to_json(block, 'sh'), + 'ss': this.input_to_json(block, 'ss'), + 'sb': this.input_to_json(block, 'sb'), + 'so': this.input_to_json(block, 'so'), + 'fc': this.input_to_json(block, 'fc'), + 'fh': this.input_to_json(block, 'fh'), + 'fs': this.input_to_json(block, 'fs'), + 'fb': this.input_to_json(block, 'fb'), + 'fo': this.input_to_json(block, 'fo'), + 't': this.input_to_json(block, 't'), + 'bl': this.input_to_json(block, 'bl'), + 'ls': this.input_to_json(block, 'ls') + }; +} +} +class GeneratedParser { +lottie_animation(parent, json) +{ + var block = this.create_block(parent, 'lottie_animation'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.v !== undefined ) this.create_value_block(this.value(block, "v"), json.v, ""); + if ( json.fr !== undefined ) this.set_field(block, "fr", json.fr.toString()); + if ( json.ip !== undefined ) this.set_field(block, "ip", json.ip.toString()); + if ( json.op !== undefined ) this.set_field(block, "op", json.op.toString()); + if ( json.w !== undefined ) this.set_field(block, "w", json.w.toString()); + if ( json.h !== undefined ) this.set_field(block, "h", json.h.toString()); + if ( json.ddd !== undefined ) this.set_field(block, "ddd", json.ddd ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.assets) ) this.statements_from_json(block, 'assets', json.assets, 'assets'); + if ( Array.isArray(json.comps) ) this.statements_from_json(block, 'comps', json.comps, 'lottie_precomposition'); + if ( json.fonts !== undefined ) this.lottie_font_list(this.value(block, "fonts"), json.fonts); + if ( Array.isArray(json.chars) ) this.statements_from_json(block, 'chars', json.chars, 'lottie_character_data'); + if ( json.meta !== undefined ) this.lottie_metadata(this.value(block, "meta"), json.meta); + if ( json.metadata !== undefined ) this.lottie_user_metadata(this.value(block, "metadata"), json.metadata); + if ( Array.isArray(json.markers) ) this.statements_from_json(block, 'markers', json.markers, ''); + if ( json.mb !== undefined ) this.lottie_motion_blur(this.value(block, "mb"), json.mb); + if ( json.slots !== undefined ) this.create_value_block(this.value(block, "slots"), json.slots, ""); + if ( Array.isArray(json.layers) ) this.statements_from_json(block, 'layers', json.layers, 'layers') + return block; +} +lottie_metadata(parent, json) +{ + var block = this.create_block(parent, 'lottie_metadata'); + if ( json.a !== undefined ) this.create_value_block(this.value(block, "a"), json.a, ""); + if ( json.d !== undefined ) this.create_value_block(this.value(block, "d"), json.d, ""); + if ( json.tc !== undefined ) this.create_value_block(this.value(block, "tc"), json.tc, ""); + if ( json.g !== undefined ) this.create_value_block(this.value(block, "g"), json.g, "") + return block; +} +lottie_motion_blur(parent, json) +{ + var block = this.create_block(parent, 'lottie_motion_blur'); + if ( json.sa !== undefined ) this.create_value_block(this.value(block, "sa"), json.sa, ""); + if ( json.sp !== undefined ) this.create_value_block(this.value(block, "sp"), json.sp, ""); + if ( json.spf !== undefined ) this.create_value_block(this.value(block, "spf"), json.spf, ""); + if ( json.asl !== undefined ) this.create_value_block(this.value(block, "asl"), json.asl, "") + return block; +} +lottie_user_metadata(parent, json) +{ + var block = this.create_block(parent, 'lottie_user_metadata'); + if ( json.filename !== undefined ) this.create_value_block(this.value(block, "filename"), json.filename, ""); + if ( json.customProps !== undefined ) this.create_value_block(this.value(block, "customProps"), json.customProps, "") + return block; +} +lottie_layer_common(parent, json) +{ + var block = this.create_block(parent, 'lottie_layer_common'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ddd !== undefined ) this.set_field(block, "ddd", json.ddd ? 'TRUE' : 'FALSE'); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ind !== undefined ) this.create_value_block(this.value(block, "ind"), json.ind, ""); + if ( json.parent !== undefined ) this.create_value_block(this.value(block, "parent"), json.parent, ""); + if ( json.sr !== undefined ) this.create_value_block(this.value(block, "sr"), json.sr, ""); + if ( json.ip !== undefined ) this.set_field(block, "ip", json.ip.toString()); + if ( json.op !== undefined ) this.set_field(block, "op", json.op.toString()); + if ( json.st !== undefined ) this.set_field(block, "st", json.st.toString()) + return block; +} +lottie_audio_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_audio_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.au !== undefined ) this.lottie_audio_settings(this.value(block, "au"), json.au); + if ( json.refId !== undefined ) this.create_value_block(this.value(block, "refId"), json.refId, "") + return block; +} +lottie_audio_settings(parent, json) +{ + var block = this.create_block(parent, 'lottie_audio_settings'); + this.create_property_block(block, json, "lv", "vector") + return block; +} +lottie_camera_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_camera_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + this.create_property_block(block, json, "pe", "") + return block; +} +lottie_data_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_data_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.refId !== undefined ) this.create_value_block(this.value(block, "refId"), json.refId, "") + return block; +} +lottie_image_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_image_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.refId !== undefined ) this.set_field(block, "refId", json.refId) + return block; +} +lottie_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.object_members_from_json(block, json, "custom_attributes") + return block; +} +lottie_null_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_null_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()) + return block; +} +lottie_precomposition_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_precomposition_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.refId !== undefined ) this.set_field(block, "refId", json.refId); + if ( json.w !== undefined ) this.set_field(block, "w", json.w.toString()); + if ( json.h !== undefined ) this.set_field(block, "h", json.h.toString()); + this.create_property_block(block, json, "tm", "") + return block; +} +lottie_shape_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_shape_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( Array.isArray(json.shapes) ) this.statements_from_json(block, 'shapes', json.shapes, 'shapes') + return block; +} +lottie_solid_color_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_solid_color_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.sc !== undefined ) this.set_field(block, "sc", json.sc); + if ( json.sh !== undefined ) this.set_field(block, "sh", json.sh.toString()); + if ( json.sw !== undefined ) this.set_field(block, "sw", json.sw.toString()) + return block; +} +lottie_text_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.t !== undefined ) this.lottie_text_data(this.value(block, "t"), json.t) + return block; +} +lottie_visual_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_visual_layer'); + this.json_to_block(this.value(block, 'lottie_layer_common'), json, 'lottie_layer_common', BlocklyJsonParser.Output); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ao !== undefined ) this.set_field(block, "ao", json.ao ? 'TRUE' : 'FALSE'); + if ( json.tt !== undefined ) this.set_field(block, "tt", json.tt.toString()); + if ( json.tp !== undefined ) this.create_value_block(this.value(block, "tp"), json.tp, ""); + if ( json.td !== undefined ) this.set_field(block, "td", json.td ? 'TRUE' : 'FALSE'); + if ( json.hasMask !== undefined ) this.set_field(block, "hasMask", json.hasMask ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.masksProperties) ) this.statements_from_json(block, 'masksProperties', json.masksProperties, ''); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effects'); + if ( json.mb !== undefined ) this.set_field(block, "mb", json.mb ? 'TRUE' : 'FALSE'); + if ( Array.isArray(json.sy) ) this.statements_from_json(block, 'sy', json.sy, 'styles'); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.tg !== undefined ) this.create_value_block(this.value(block, "tg"), json.tg, ""); + if ( json.cp !== undefined ) this.set_field(block, "cp", json.cp ? 'TRUE' : 'FALSE'); + if ( json.ct !== undefined ) this.set_field(block, "ct", json.ct ? 'TRUE' : 'FALSE') + return block; +} +lottie_ellipse(parent, json) +{ + var block = this.create_block(parent, 'lottie_ellipse'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.d !== undefined ) this.set_field(block, "d", json.d.toString()); + this.maybe_split_property(block, json, "p"); + this.create_property_block(block, json, "s", "vector") + return block; +} +lottie_fill(parent, json) +{ + var block = this.create_block(parent, 'lottie_fill'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "c", "color"); + if ( json.r !== undefined ) this.set_field(block, "r", json.r.toString()) + return block; +} +lottie_gradient_fill(parent, json) +{ + var block = this.create_block(parent, 'lottie_gradient_fill'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "e", "vector"); + if ( json.t !== undefined ) this.set_field(block, "t", json.t.toString()); + this.create_property_block(block, json, "h", ""); + this.create_property_block(block, json, "a", ""); + if ( json.g !== undefined ) this.lottie_gradient_colors(this.value(block, "g"), json.g); + this.create_property_block(block, json, "o", ""); + if ( json.r !== undefined ) this.set_field(block, "r", json.r.toString()) + return block; +} +lottie_gradient_stroke(parent, json) +{ + var block = this.create_block(parent, 'lottie_gradient_stroke'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.lc !== undefined ) this.set_field(block, "lc", json.lc.toString()); + if ( json.lj !== undefined ) this.set_field(block, "lj", json.lj.toString()); + if ( json.ml !== undefined ) this.create_value_block(this.value(block, "ml"), json.ml, ""); + this.create_property_block(block, json, "ml2", ""); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "w", ""); + if ( Array.isArray(json.d) ) this.statements_from_json(block, 'd', json.d, 'lottie_stroke_dash'); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "e", "vector"); + if ( json.t !== undefined ) this.set_field(block, "t", json.t.toString()); + this.create_property_block(block, json, "h", ""); + this.create_property_block(block, json, "a", ""); + if ( json.g !== undefined ) this.lottie_gradient_colors(this.value(block, "g"), json.g) + return block; +} +lottie_group(parent, json) +{ + var block = this.create_block(parent, 'lottie_group'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( Array.isArray(json.it) ) this.statements_from_json(block, 'it', json.it, 'shapes'); + if ( json.cix !== undefined ) this.create_value_block(this.value(block, "cix"), json.cix, "") + return block; +} +lottie_no_style(parent, json) +{ + var block = this.create_block(parent, 'lottie_no_style'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, "") + return block; +} +lottie_path(parent, json) +{ + var block = this.create_block(parent, 'lottie_path'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.d !== undefined ) this.set_field(block, "d", json.d.toString()); + this.create_property_block(block, json, "ks", "") + return block; +} +lottie_polystar(parent, json) +{ + var block = this.create_block(parent, 'lottie_polystar'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.d !== undefined ) this.set_field(block, "d", json.d.toString()); + this.maybe_split_property(block, json, "p"); + this.create_property_block(block, json, "or", ""); + this.create_property_block(block, json, "os", ""); + this.create_property_block(block, json, "r", "angle"); + this.create_property_block(block, json, "pt", ""); + if ( json.sy !== undefined ) this.set_field(block, "sy", json.sy.toString()); + this.create_property_block(block, json, "ir", ""); + this.create_property_block(block, json, "is", "") + return block; +} +lottie_pucker_bloat(parent, json) +{ + var block = this.create_block(parent, 'lottie_pucker_bloat'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "a", "") + return block; +} +lottie_rectangle(parent, json) +{ + var block = this.create_block(parent, 'lottie_rectangle'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.d !== undefined ) this.set_field(block, "d", json.d.toString()); + this.maybe_split_property(block, json, "p"); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "r", "") + return block; +} +lottie_repeater(parent, json) +{ + var block = this.create_block(parent, 'lottie_repeater'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "c", ""); + this.create_property_block(block, json, "o", ""); + if ( json.m !== undefined ) this.set_field(block, "m", json.m.toString()); + if ( json.tr !== undefined ) this.lottie_repeater_transform(this.value(block, "tr"), json.tr) + return block; +} +lottie_repeater_transform(parent, json) +{ + var block = this.create_block(parent, 'lottie_repeater_transform'); + this.create_property_block(block, json, "a", "vector"); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "sk", ""); + this.create_property_block(block, json, "sa", ""); + this.create_property_block(block, json, "so", ""); + this.create_property_block(block, json, "eo", "") + return block; +} +lottie_rounded_corners(parent, json) +{ + var block = this.create_block(parent, 'lottie_rounded_corners'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "r", "") + return block; +} +lottie_shape_element(parent, json) +{ + var block = this.create_block(parent, 'lottie_shape_element'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.object_members_from_json(block, json, "custom_attributes") + return block; +} +lottie_stroke(parent, json) +{ + var block = this.create_block(parent, 'lottie_stroke'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + if ( json.lc !== undefined ) this.set_field(block, "lc", json.lc.toString()); + if ( json.lj !== undefined ) this.set_field(block, "lj", json.lj.toString()); + if ( json.ml !== undefined ) this.create_value_block(this.value(block, "ml"), json.ml, ""); + this.create_property_block(block, json, "ml2", ""); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "w", ""); + if ( Array.isArray(json.d) ) this.statements_from_json(block, 'd', json.d, 'lottie_stroke_dash'); + this.create_property_block(block, json, "c", "color") + return block; +} +lottie_stroke_dash(parent, json) +{ + var block = this.create_block(parent, 'lottie_stroke_dash'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.n !== undefined ) this.set_field(block, "n", json.n); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_transform_shape(parent, json) +{ + var block = this.create_block(parent, 'lottie_transform_shape'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "a", "vector"); + this.maybe_split_property(block, json, "p"); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "sk", ""); + this.create_property_block(block, json, "sa", "") + return block; +} +lottie_trim(parent, json) +{ + var block = this.create_block(parent, 'lottie_trim'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "s", ""); + this.create_property_block(block, json, "e", ""); + this.create_property_block(block, json, "o", ""); + if ( json.m !== undefined ) this.set_field(block, "m", json.m.toString()) + return block; +} +lottie_zig_zag(parent, json) +{ + var block = this.create_block(parent, 'lottie_zig_zag'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.hd !== undefined ) this.set_field(block, "hd", json.hd ? 'TRUE' : 'FALSE'); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty); + if ( json.bm !== undefined ) this.set_field(block, "bm", json.bm.toString()); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.cl !== undefined ) this.create_value_block(this.value(block, "cl"), json.cl, ""); + if ( json.ln !== undefined ) this.create_value_block(this.value(block, "ln"), json.ln, ""); + this.create_property_block(block, json, "r", ""); + this.create_property_block(block, json, "s", ""); + this.create_property_block(block, json, "pt", "") + return block; +} +lottie_asset(parent, json) +{ + var block = this.create_block(parent, 'lottie_asset'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, "") + return block; +} +lottie_data_source(parent, json) +{ + var block = this.create_block(parent, 'lottie_data_source'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.u !== undefined ) this.create_value_block(this.value(block, "u"), json.u, ""); + if ( json.p !== undefined ) this.set_field(block, "p", json.p); + if ( json.e !== undefined ) this.set_field(block, "e", json.e ? 'TRUE' : 'FALSE'); + if ( json.t !== undefined ) this.set_field(block, "t", json.t.toString()) + return block; +} +lottie_file_asset(parent, json) +{ + var block = this.create_block(parent, 'lottie_file_asset'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.u !== undefined ) this.create_value_block(this.value(block, "u"), json.u, ""); + if ( json.p !== undefined ) this.set_field(block, "p", json.p); + if ( json.e !== undefined ) this.set_field(block, "e", json.e ? 'TRUE' : 'FALSE') + return block; +} +lottie_image(parent, json) +{ + var block = this.create_block(parent, 'lottie_image'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.u !== undefined ) this.create_value_block(this.value(block, "u"), json.u, ""); + if ( json.p !== undefined ) this.set_field(block, "p", json.p); + if ( json.e !== undefined ) this.set_field(block, "e", json.e ? 'TRUE' : 'FALSE'); + if ( json.w !== undefined ) this.create_value_block(this.value(block, "w"), json.w, ""); + if ( json.h !== undefined ) this.create_value_block(this.value(block, "h"), json.h, ""); + if ( json.t !== undefined ) this.set_field(block, "t", json.t); + if ( json.sid !== undefined ) this.create_value_block(this.value(block, "sid"), json.sid, "") + return block; +} +lottie_precomposition(parent, json) +{ + var block = this.create_block(parent, 'lottie_precomposition'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( Array.isArray(json.layers) ) this.statements_from_json(block, 'layers', json.layers, 'layers'); + if ( json.fr !== undefined ) this.create_value_block(this.value(block, "fr"), json.fr, ""); + if ( json.xt !== undefined ) this.set_field(block, "xt", json.xt ? 'TRUE' : 'FALSE') + return block; +} +lottie_sound(parent, json) +{ + var block = this.create_block(parent, 'lottie_sound'); + if ( json.id !== undefined ) this.set_field(block, "id", json.id); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.u !== undefined ) this.create_value_block(this.value(block, "u"), json.u, ""); + if ( json.p !== undefined ) this.set_field(block, "p", json.p); + if ( json.e !== undefined ) this.set_field(block, "e", json.e ? 'TRUE' : 'FALSE') + return block; +} +lottie_displacement_map_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_displacement_map_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_drop_shadow_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_drop_shadow_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, 'effect_values'); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE'); + this.object_members_from_json(block, json, "custom_attributes") + return block; +} +lottie_fill_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_fill_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_gaussian_blur_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_gaussian_blur_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_matte3_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_matte3_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_mesh_warp_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_mesh_warp_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_pro_levels_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_pro_levels_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_puppet_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_puppet_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_radial_wipe_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_radial_wipe_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_spherize_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_spherize_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_stroke_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_stroke_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_tint_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_tint_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_tritone_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_tritone_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_twirl_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_twirl_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_wavy_effect(parent, json) +{ + var block = this.create_block(parent, 'lottie_wavy_effect'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( Array.isArray(json.ef) ) this.statements_from_json(block, 'ef', json.ef, ''); + if ( json.np !== undefined ) this.create_value_block(this.value(block, "np"), json.np, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.en !== undefined ) this.set_field(block, "en", json.en ? 'TRUE' : 'FALSE') + return block; +} +lottie_effect_value_angle(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_angle'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_effect_value_checkbox(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_checkbox'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_effect_value_color(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_color'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "color") + return block; +} +lottie_effect_value_drop_down(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_drop_down'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_effect_value_effect_value(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_effect_value'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.create_value_block(this.value(block, "ty"), json.ty, "") + return block; +} +lottie_effect_value_ignored(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_ignored'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + if ( json.v !== undefined ) this.create_value_block(this.value(block, "v"), json.v, "") + return block; +} +lottie_effect_value_layer(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_layer'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_effect_value_no_value(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_no_value'); + + return block; +} +lottie_effect_value_point(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_point'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "vector") + return block; +} +lottie_effect_value_slider(parent, json) +{ + var block = this.create_block(parent, 'lottie_effect_value_slider'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.mn !== undefined ) this.create_value_block(this.value(block, "mn"), json.mn, ""); + if ( json.ix !== undefined ) this.create_value_block(this.value(block, "ix"), json.ix, ""); + if ( json.ty !== undefined ) this.set_field(block, "ty", json.ty.toString()); + this.create_property_block(block, json, "v", "") + return block; +} +lottie_animated_text_document(parent, json) +{ + var block = this.create_block(parent, 'lottie_animated_text_document'); + if ( Array.isArray(json.k) ) this.statements_from_json(block, 'k', json.k, 'lottie_text_document_keyframe'); + if ( json.x !== undefined ) this.create_value_block(this.value(block, "x"), json.x, ""); + if ( json.sid !== undefined ) this.create_value_block(this.value(block, "sid"), json.sid, "") + return block; +} +lottie_character_data(parent, json) +{ + var block = this.create_block(parent, 'lottie_character_data'); + if ( json.ch !== undefined ) this.set_field(block, "ch", json.ch); + if ( json.fFamily !== undefined ) this.set_field(block, "fFamily", json.fFamily); + if ( json.size !== undefined ) this.set_field(block, "size", json.size.toString()); + if ( json.style !== undefined ) this.set_field(block, "style", json.style); + if ( json.w !== undefined ) this.set_field(block, "w", json.w.toString()) + return block; +} +lottie_character_precomp(parent, json) +{ + var block = this.create_block(parent, 'lottie_character_precomp'); + if ( json.refId !== undefined ) this.set_field(block, "refId", json.refId); + if ( json.ks !== undefined ) this.lottie_transform(this.value(block, "ks"), json.ks); + if ( json.ip !== undefined ) this.create_value_block(this.value(block, "ip"), json.ip, ""); + if ( json.op !== undefined ) this.create_value_block(this.value(block, "op"), json.op, ""); + if ( json.sr !== undefined ) this.create_value_block(this.value(block, "sr"), json.sr, ""); + if ( json.st !== undefined ) this.create_value_block(this.value(block, "st"), json.st, "") + return block; +} +lottie_character_shapes(parent, json) +{ + var block = this.create_block(parent, 'lottie_character_shapes'); + if ( Array.isArray(json.shapes) ) this.statements_from_json(block, 'shapes', json.shapes, 'shapes') + return block; +} +lottie_font(parent, json) +{ + var block = this.create_block(parent, 'lottie_font'); + if ( json.ascent !== undefined ) this.create_value_block(this.value(block, "ascent"), json.ascent, ""); + if ( json.fFamily !== undefined ) this.set_field(block, "fFamily", json.fFamily); + if ( json.fName !== undefined ) this.set_field(block, "fName", json.fName); + if ( json.fStyle !== undefined ) this.set_field(block, "fStyle", json.fStyle); + if ( json.fPath !== undefined ) this.create_value_block(this.value(block, "fPath"), json.fPath, ""); + if ( json.fWeight !== undefined ) this.create_value_block(this.value(block, "fWeight"), json.fWeight, ""); + if ( json.origin !== undefined ) this.set_field(block, "origin", json.origin.toString()); + if ( json.fClass !== undefined ) this.create_value_block(this.value(block, "fClass"), json.fClass, "") + return block; +} +lottie_font_list(parent, json) +{ + var block = this.create_block(parent, 'lottie_font_list'); + if ( Array.isArray(json.list) ) this.statements_from_json(block, 'list', json.list, 'lottie_font') + return block; +} +lottie_text_alignment_options(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_alignment_options'); + this.create_property_block(block, json, "a", "vector"); + if ( json.g !== undefined ) this.set_field(block, "g", json.g.toString()) + return block; +} +lottie_text_data(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_data'); + if ( Array.isArray(json.a) ) this.statements_from_json(block, 'a', json.a, 'lottie_text_range'); + if ( json.d !== undefined ) this.lottie_animated_text_document(this.value(block, "d"), json.d); + if ( json.m !== undefined ) this.lottie_text_alignment_options(this.value(block, "m"), json.m); + this.maybe_split_property(block, json, "p") + return block; +} +lottie_text_document(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_document'); + if ( json.f !== undefined ) this.set_field(block, "f", json.f); + if ( json.fc !== undefined ) this.create_value_block(this.value(block, "fc"), json.fc, ""); + if ( json.sc !== undefined ) this.create_value_block(this.value(block, "sc"), json.sc, ""); + if ( json.sw !== undefined ) this.create_value_block(this.value(block, "sw"), json.sw, ""); + if ( json.of !== undefined ) this.set_field(block, "of", json.of ? 'TRUE' : 'FALSE'); + if ( json.s !== undefined ) this.set_field(block, "s", json.s.toString()); + if ( json.lh !== undefined ) this.create_value_block(this.value(block, "lh"), json.lh, ""); + if ( json.sz !== undefined ) this.create_value_block(this.value(block, "sz"), json.sz, ""); + if ( json.ps !== undefined ) this.create_value_block(this.value(block, "ps"), json.ps, ""); + if ( json.t !== undefined ) this.set_field(block, "t", json.t); + if ( json.j !== undefined ) this.set_field(block, "j", json.j.toString()); + if ( json.ca !== undefined ) this.set_field(block, "ca", json.ca.toString()); + if ( json.tr !== undefined ) this.create_value_block(this.value(block, "tr"), json.tr, ""); + if ( json.ls !== undefined ) this.create_value_block(this.value(block, "ls"), json.ls, "") + return block; +} +lottie_text_document_keyframe(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_document_keyframe'); + if ( json.s !== undefined ) this.lottie_text_document(this.value(block, "s"), json.s); + if ( json.t !== undefined ) this.set_field(block, "t", json.t.toString()) + return block; +} +lottie_text_follow_path(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_follow_path'); + if ( json.m !== undefined ) this.create_value_block(this.value(block, "m"), json.m, ""); + this.create_property_block(block, json, "f", ""); + this.create_property_block(block, json, "l", ""); + this.create_property_block(block, json, "r", ""); + this.create_property_block(block, json, "a", ""); + this.maybe_split_property(block, json, "p") + return block; +} +lottie_text_range(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_range'); + if ( json.nm !== undefined ) this.create_value_block(this.value(block, "nm"), json.nm, ""); + if ( json.s !== undefined ) this.lottie_text_range_selector(this.value(block, "s"), json.s); + if ( json.a !== undefined ) this.lottie_text_style(this.value(block, "a"), json.a) + return block; +} +lottie_text_range_selector(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_range_selector'); + if ( json.t !== undefined ) this.set_field(block, "t", json.t ? 'TRUE' : 'FALSE'); + this.create_property_block(block, json, "xe", ""); + this.create_property_block(block, json, "ne", ""); + this.create_property_block(block, json, "a", ""); + if ( json.b !== undefined ) this.set_field(block, "b", json.b.toString()); + if ( json.rn !== undefined ) this.set_field(block, "rn", json.rn ? 'TRUE' : 'FALSE'); + if ( json.sh !== undefined ) this.set_field(block, "sh", json.sh.toString()); + this.create_property_block(block, json, "o", ""); + if ( json.r !== undefined ) this.set_field(block, "r", json.r.toString()); + this.create_property_block(block, json, "sm", ""); + this.create_property_block(block, json, "s", ""); + this.create_property_block(block, json, "e", "") + return block; +} +lottie_text_style(parent, json) +{ + var block = this.create_block(parent, 'lottie_text_style'); + this.create_property_block(block, json, "a", "vector"); + this.create_property_block(block, json, "s", "vector"); + this.create_property_block(block, json, "o", ""); + this.create_property_block(block, json, "sk", ""); + this.create_property_block(block, json, "sa", ""); + this.create_property_block(block, json, "sw", ""); + this.create_property_block(block, json, "sc", "color"); + this.create_property_block(block, json, "sh", ""); + this.create_property_block(block, json, "ss", ""); + this.create_property_block(block, json, "sb", ""); + this.create_property_block(block, json, "so", ""); + this.create_property_block(block, json, "fc", "color"); + this.create_property_block(block, json, "fh", ""); + this.create_property_block(block, json, "fs", ""); + this.create_property_block(block, json, "fb", ""); + this.create_property_block(block, json, "fo", ""); + this.create_property_block(block, json, "t", ""); + this.create_property_block(block, json, "bl", ""); + this.create_property_block(block, json, "ls", "") + return block; +} +get_type_for_layers(json){ + switch ( json.ty ) { + case 0: return 'lottie_precomposition_layer'; + case 1: return 'lottie_solid_color_layer'; + case 2: return 'lottie_image_layer'; + case 3: return 'lottie_null_layer'; + case 4: return 'lottie_shape_layer'; + case 5: return 'lottie_text_layer'; + case 6: return 'lottie_audio_layer'; + case 13: return 'lottie_camera_layer'; + case 15: return 'lottie_data_layer'; + default: return ''; + } +} +get_type_for_shapes(json){ + switch ( json.ty ) { + case 'el': return 'lottie_ellipse'; + case 'fl': return 'lottie_fill'; + case 'gf': return 'lottie_gradient_fill'; + case 'gr': return 'lottie_group'; + case 'gs': return 'lottie_gradient_stroke'; + case 'no': return 'lottie_no_style'; + case 'pb': return 'lottie_pucker_bloat'; + case 'rc': return 'lottie_rectangle'; + case 'rd': return 'lottie_rounded_corners'; + case 'rp': return 'lottie_repeater'; + case 'sh': return 'lottie_path'; + case 'sr': return 'lottie_polystar'; + case 'st': return 'lottie_stroke'; + case 'tm': return 'lottie_trim'; + case 'tr': return 'lottie_transform_shape'; + case 'zz': return 'lottie_zig_zag'; + default: return ''; + } +} +get_type_for_effects(json){ + switch ( json.ty ) { + case 20: return 'lottie_tint_effect'; + case 21: return 'lottie_fill_effect'; + case 22: return 'lottie_stroke_effect'; + case 23: return 'lottie_tritone_effect'; + case 24: return 'lottie_pro_levels_effect'; + case 25: return 'lottie_drop_shadow_effect'; + case 26: return 'lottie_radial_wipe_effect'; + case 27: return 'lottie_displacement_map_effect'; + case 28: return 'lottie_matte3_effect'; + case 29: return 'lottie_gaussian_blur_effect'; + case 30: return 'lottie_twirl_effect'; + case 31: return 'lottie_mesh_warp_effect'; + case 32: return 'lottie_wavy_effect'; + case 33: return 'lottie_spherize_effect'; + case 34: return 'lottie_puppet_effect'; + default: return ''; + } +} +get_type_for_effect_values(json){ + switch ( json.ty ) { + case 0: return 'lottie_effect_value_slider'; + case 1: return 'lottie_effect_value_angle'; + case 2: return 'lottie_effect_value_color'; + case 3: return 'lottie_effect_value_point'; + case 4: return 'lottie_effect_value_checkbox'; + case 6: return 'lottie_effect_value_ignored'; + case 7: return 'lottie_effect_value_drop_down'; + case 10: return 'lottie_effect_value_layer'; + default: return ''; + } +} +} diff --git a/scripts/editor.bundle.js b/scripts/editor.bundle.js new file mode 100644 index 00000000..627e0dea --- /dev/null +++ b/scripts/editor.bundle.js @@ -0,0 +1,23827 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CodeMirrorWrapper = {})); +})(this, (function (exports) { 'use strict'; + + /** + The data structure for documents. @nonabstract + */ + class Text { + /** + @internal + */ + constructor() { } + /** + Get the line description around the given position. + */ + lineAt(pos) { + if (pos < 0 || pos > this.length) + throw new RangeError(`Invalid position ${pos} in document of length ${this.length}`); + return this.lineInner(pos, false, 1, 0); + } + /** + Get the description for the given (1-based) line number. + */ + line(n) { + if (n < 1 || n > this.lines) + throw new RangeError(`Invalid line number ${n} in ${this.lines}-line document`); + return this.lineInner(n, true, 1, 0); + } + /** + Replace a range of the text with the given content. + */ + replace(from, to, text) { + let parts = []; + this.decompose(0, from, parts, 2 /* To */); + if (text.length) + text.decompose(0, text.length, parts, 1 /* From */ | 2 /* To */); + this.decompose(to, this.length, parts, 1 /* From */); + return TextNode.from(parts, this.length - (to - from) + text.length); + } + /** + Append another document to this one. + */ + append(other) { + return this.replace(this.length, this.length, other); + } + /** + Retrieve the text between the given points. + */ + slice(from, to = this.length) { + let parts = []; + this.decompose(from, to, parts, 0); + return TextNode.from(parts, to - from); + } + /** + Test whether this text is equal to another instance. + */ + eq(other) { + if (other == this) + return true; + if (other.length != this.length || other.lines != this.lines) + return false; + let start = this.scanIdentical(other, 1), end = this.length - this.scanIdentical(other, -1); + let a = new RawTextCursor(this), b = new RawTextCursor(other); + for (let skip = start, pos = start;;) { + a.next(skip); + b.next(skip); + skip = 0; + if (a.lineBreak != b.lineBreak || a.done != b.done || a.value != b.value) + return false; + pos += a.value.length; + if (a.done || pos >= end) + return true; + } + } + /** + Iterate over the text. When `dir` is `-1`, iteration happens + from end to start. This will return lines and the breaks between + them as separate strings. + */ + iter(dir = 1) { return new RawTextCursor(this, dir); } + /** + Iterate over a range of the text. When `from` > `to`, the + iterator will run in reverse. + */ + iterRange(from, to = this.length) { return new PartialTextCursor(this, from, to); } + /** + Return a cursor that iterates over the given range of lines, + _without_ returning the line breaks between, and yielding empty + strings for empty lines. + + When `from` and `to` are given, they should be 1-based line numbers. + */ + iterLines(from, to) { + let inner; + if (from == null) { + inner = this.iter(); + } + else { + if (to == null) + to = this.lines + 1; + let start = this.line(from).from; + inner = this.iterRange(start, Math.max(start, to == this.lines + 1 ? this.length : to <= 1 ? 0 : this.line(to - 1).to)); + } + return new LineCursor(inner); + } + /** + @internal + */ + toString() { return this.sliceString(0); } + /** + Convert the document to an array of lines (which can be + deserialized again via [`Text.of`](https://codemirror.net/6/docs/ref/#state.Text^of)). + */ + toJSON() { + let lines = []; + this.flatten(lines); + return lines; + } + /** + Create a `Text` instance for the given array of lines. + */ + static of(text) { + if (text.length == 0) + throw new RangeError("A document must have at least one line"); + if (text.length == 1 && !text[0]) + return Text.empty; + return text.length <= 32 /* Branch */ ? new TextLeaf(text) : TextNode.from(TextLeaf.split(text, [])); + } + } + // Leaves store an array of line strings. There are always line breaks + // between these strings. Leaves are limited in size and have to be + // contained in TextNode instances for bigger documents. + class TextLeaf extends Text { + constructor(text, length = textLength(text)) { + super(); + this.text = text; + this.length = length; + } + get lines() { return this.text.length; } + get children() { return null; } + lineInner(target, isLine, line, offset) { + for (let i = 0;; i++) { + let string = this.text[i], end = offset + string.length; + if ((isLine ? line : end) >= target) + return new Line(offset, end, line, string); + offset = end + 1; + line++; + } + } + decompose(from, to, target, open) { + let text = from <= 0 && to >= this.length ? this + : new TextLeaf(sliceText(this.text, from, to), Math.min(to, this.length) - Math.max(0, from)); + if (open & 1 /* From */) { + let prev = target.pop(); + let joined = appendText(text.text, prev.text.slice(), 0, text.length); + if (joined.length <= 32 /* Branch */) { + target.push(new TextLeaf(joined, prev.length + text.length)); + } + else { + let mid = joined.length >> 1; + target.push(new TextLeaf(joined.slice(0, mid)), new TextLeaf(joined.slice(mid))); + } + } + else { + target.push(text); + } + } + replace(from, to, text) { + if (!(text instanceof TextLeaf)) + return super.replace(from, to, text); + let lines = appendText(this.text, appendText(text.text, sliceText(this.text, 0, from)), to); + let newLen = this.length + text.length - (to - from); + if (lines.length <= 32 /* Branch */) + return new TextLeaf(lines, newLen); + return TextNode.from(TextLeaf.split(lines, []), newLen); + } + sliceString(from, to = this.length, lineSep = "\n") { + let result = ""; + for (let pos = 0, i = 0; pos <= to && i < this.text.length; i++) { + let line = this.text[i], end = pos + line.length; + if (pos > from && i) + result += lineSep; + if (from < end && to > pos) + result += line.slice(Math.max(0, from - pos), to - pos); + pos = end + 1; + } + return result; + } + flatten(target) { + for (let line of this.text) + target.push(line); + } + scanIdentical() { return 0; } + static split(text, target) { + let part = [], len = -1; + for (let line of text) { + part.push(line); + len += line.length + 1; + if (part.length == 32 /* Branch */) { + target.push(new TextLeaf(part, len)); + part = []; + len = -1; + } + } + if (len > -1) + target.push(new TextLeaf(part, len)); + return target; + } + } + // Nodes provide the tree structure of the `Text` type. They store a + // number of other nodes or leaves, taking care to balance themselves + // on changes. There are implied line breaks _between_ the children of + // a node (but not before the first or after the last child). + class TextNode extends Text { + constructor(children, length) { + super(); + this.children = children; + this.length = length; + this.lines = 0; + for (let child of children) + this.lines += child.lines; + } + lineInner(target, isLine, line, offset) { + for (let i = 0;; i++) { + let child = this.children[i], end = offset + child.length, endLine = line + child.lines - 1; + if ((isLine ? endLine : end) >= target) + return child.lineInner(target, isLine, line, offset); + offset = end + 1; + line = endLine + 1; + } + } + decompose(from, to, target, open) { + for (let i = 0, pos = 0; pos <= to && i < this.children.length; i++) { + let child = this.children[i], end = pos + child.length; + if (from <= end && to >= pos) { + let childOpen = open & ((pos <= from ? 1 /* From */ : 0) | (end >= to ? 2 /* To */ : 0)); + if (pos >= from && end <= to && !childOpen) + target.push(child); + else + child.decompose(from - pos, to - pos, target, childOpen); + } + pos = end + 1; + } + } + replace(from, to, text) { + if (text.lines < this.lines) + for (let i = 0, pos = 0; i < this.children.length; i++) { + let child = this.children[i], end = pos + child.length; + // Fast path: if the change only affects one child and the + // child's size remains in the acceptable range, only update + // that child + if (from >= pos && to <= end) { + let updated = child.replace(from - pos, to - pos, text); + let totalLines = this.lines - child.lines + updated.lines; + if (updated.lines < (totalLines >> (5 /* BranchShift */ - 1)) && + updated.lines > (totalLines >> (5 /* BranchShift */ + 1))) { + let copy = this.children.slice(); + copy[i] = updated; + return new TextNode(copy, this.length - (to - from) + text.length); + } + return super.replace(pos, end, updated); + } + pos = end + 1; + } + return super.replace(from, to, text); + } + sliceString(from, to = this.length, lineSep = "\n") { + let result = ""; + for (let i = 0, pos = 0; i < this.children.length && pos <= to; i++) { + let child = this.children[i], end = pos + child.length; + if (pos > from && i) + result += lineSep; + if (from < end && to > pos) + result += child.sliceString(from - pos, to - pos, lineSep); + pos = end + 1; + } + return result; + } + flatten(target) { + for (let child of this.children) + child.flatten(target); + } + scanIdentical(other, dir) { + if (!(other instanceof TextNode)) + return 0; + let length = 0; + let [iA, iB, eA, eB] = dir > 0 ? [0, 0, this.children.length, other.children.length] + : [this.children.length - 1, other.children.length - 1, -1, -1]; + for (;; iA += dir, iB += dir) { + if (iA == eA || iB == eB) + return length; + let chA = this.children[iA], chB = other.children[iB]; + if (chA != chB) + return length + chA.scanIdentical(chB, dir); + length += chA.length + 1; + } + } + static from(children, length = children.reduce((l, ch) => l + ch.length + 1, -1)) { + let lines = 0; + for (let ch of children) + lines += ch.lines; + if (lines < 32 /* Branch */) { + let flat = []; + for (let ch of children) + ch.flatten(flat); + return new TextLeaf(flat, length); + } + let chunk = Math.max(32 /* Branch */, lines >> 5 /* BranchShift */), maxChunk = chunk << 1, minChunk = chunk >> 1; + let chunked = [], currentLines = 0, currentLen = -1, currentChunk = []; + function add(child) { + let last; + if (child.lines > maxChunk && child instanceof TextNode) { + for (let node of child.children) + add(node); + } + else if (child.lines > minChunk && (currentLines > minChunk || !currentLines)) { + flush(); + chunked.push(child); + } + else if (child instanceof TextLeaf && currentLines && + (last = currentChunk[currentChunk.length - 1]) instanceof TextLeaf && + child.lines + last.lines <= 32 /* Branch */) { + currentLines += child.lines; + currentLen += child.length + 1; + currentChunk[currentChunk.length - 1] = new TextLeaf(last.text.concat(child.text), last.length + 1 + child.length); + } + else { + if (currentLines + child.lines > chunk) + flush(); + currentLines += child.lines; + currentLen += child.length + 1; + currentChunk.push(child); + } + } + function flush() { + if (currentLines == 0) + return; + chunked.push(currentChunk.length == 1 ? currentChunk[0] : TextNode.from(currentChunk, currentLen)); + currentLen = -1; + currentLines = currentChunk.length = 0; + } + for (let child of children) + add(child); + flush(); + return chunked.length == 1 ? chunked[0] : new TextNode(chunked, length); + } + } + Text.empty = /*@__PURE__*/new TextLeaf([""], 0); + function textLength(text) { + let length = -1; + for (let line of text) + length += line.length + 1; + return length; + } + function appendText(text, target, from = 0, to = 1e9) { + for (let pos = 0, i = 0, first = true; i < text.length && pos <= to; i++) { + let line = text[i], end = pos + line.length; + if (end >= from) { + if (end > to) + line = line.slice(0, to - pos); + if (pos < from) + line = line.slice(from - pos); + if (first) { + target[target.length - 1] += line; + first = false; + } + else + target.push(line); + } + pos = end + 1; + } + return target; + } + function sliceText(text, from, to) { + return appendText(text, [""], from, to); + } + class RawTextCursor { + constructor(text, dir = 1) { + this.dir = dir; + this.done = false; + this.lineBreak = false; + this.value = ""; + this.nodes = [text]; + this.offsets = [dir > 0 ? 1 : (text instanceof TextLeaf ? text.text.length : text.children.length) << 1]; + } + nextInner(skip, dir) { + this.done = this.lineBreak = false; + for (;;) { + let last = this.nodes.length - 1; + let top = this.nodes[last], offsetValue = this.offsets[last], offset = offsetValue >> 1; + let size = top instanceof TextLeaf ? top.text.length : top.children.length; + if (offset == (dir > 0 ? size : 0)) { + if (last == 0) { + this.done = true; + this.value = ""; + return this; + } + if (dir > 0) + this.offsets[last - 1]++; + this.nodes.pop(); + this.offsets.pop(); + } + else if ((offsetValue & 1) == (dir > 0 ? 0 : 1)) { + this.offsets[last] += dir; + if (skip == 0) { + this.lineBreak = true; + this.value = "\n"; + return this; + } + skip--; + } + else if (top instanceof TextLeaf) { + // Move to the next string + let next = top.text[offset + (dir < 0 ? -1 : 0)]; + this.offsets[last] += dir; + if (next.length > Math.max(0, skip)) { + this.value = skip == 0 ? next : dir > 0 ? next.slice(skip) : next.slice(0, next.length - skip); + return this; + } + skip -= next.length; + } + else { + let next = top.children[offset + (dir < 0 ? -1 : 0)]; + if (skip > next.length) { + skip -= next.length; + this.offsets[last] += dir; + } + else { + if (dir < 0) + this.offsets[last]--; + this.nodes.push(next); + this.offsets.push(dir > 0 ? 1 : (next instanceof TextLeaf ? next.text.length : next.children.length) << 1); + } + } + } + } + next(skip = 0) { + if (skip < 0) { + this.nextInner(-skip, (-this.dir)); + skip = this.value.length; + } + return this.nextInner(skip, this.dir); + } + } + class PartialTextCursor { + constructor(text, start, end) { + this.value = ""; + this.done = false; + this.cursor = new RawTextCursor(text, start > end ? -1 : 1); + this.pos = start > end ? text.length : 0; + this.from = Math.min(start, end); + this.to = Math.max(start, end); + } + nextInner(skip, dir) { + if (dir < 0 ? this.pos <= this.from : this.pos >= this.to) { + this.value = ""; + this.done = true; + return this; + } + skip += Math.max(0, dir < 0 ? this.pos - this.to : this.from - this.pos); + let limit = dir < 0 ? this.pos - this.from : this.to - this.pos; + if (skip > limit) + skip = limit; + limit -= skip; + let { value } = this.cursor.next(skip); + this.pos += (value.length + skip) * dir; + this.value = value.length <= limit ? value : dir < 0 ? value.slice(value.length - limit) : value.slice(0, limit); + this.done = !this.value; + return this; + } + next(skip = 0) { + if (skip < 0) + skip = Math.max(skip, this.from - this.pos); + else if (skip > 0) + skip = Math.min(skip, this.to - this.pos); + return this.nextInner(skip, this.cursor.dir); + } + get lineBreak() { return this.cursor.lineBreak && this.value != ""; } + } + class LineCursor { + constructor(inner) { + this.inner = inner; + this.afterBreak = true; + this.value = ""; + this.done = false; + } + next(skip = 0) { + let { done, lineBreak, value } = this.inner.next(skip); + if (done) { + this.done = true; + this.value = ""; + } + else if (lineBreak) { + if (this.afterBreak) { + this.value = ""; + } + else { + this.afterBreak = true; + this.next(); + } + } + else { + this.value = value; + this.afterBreak = false; + } + return this; + } + get lineBreak() { return false; } + } + if (typeof Symbol != "undefined") { + Text.prototype[Symbol.iterator] = function () { return this.iter(); }; + RawTextCursor.prototype[Symbol.iterator] = PartialTextCursor.prototype[Symbol.iterator] = + LineCursor.prototype[Symbol.iterator] = function () { return this; }; + } + /** + This type describes a line in the document. It is created + on-demand when lines are [queried](https://codemirror.net/6/docs/ref/#state.Text.lineAt). + */ + class Line { + /** + @internal + */ + constructor( + /** + The position of the start of the line. + */ + from, + /** + The position at the end of the line (_before_ the line break, + or at the end of document for the last line). + */ + to, + /** + This line's line number (1-based). + */ + number, + /** + The line's content. + */ + text) { + this.from = from; + this.to = to; + this.number = number; + this.text = text; + } + /** + The length of the line (not including any line break after it). + */ + get length() { return this.to - this.from; } + } + + // Compressed representation of the Grapheme_Cluster_Break=Extend + // information from + // http://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakProperty.txt. + // Each pair of elements represents a range, as an offet from the + // previous range and a length. Numbers are in base-36, with the empty + // string being a shorthand for 1. + let extend = /*@__PURE__*/"lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(s => s ? parseInt(s, 36) : 1); + // Convert offsets into absolute values + for (let i = 1; i < extend.length; i++) + extend[i] += extend[i - 1]; + function isExtendingChar(code) { + for (let i = 1; i < extend.length; i += 2) + if (extend[i] > code) + return extend[i - 1] <= code; + return false; + } + function isRegionalIndicator(code) { + return code >= 0x1F1E6 && code <= 0x1F1FF; + } + const ZWJ = 0x200d; + /** + Returns a next grapheme cluster break _after_ (not equal to) + `pos`, if `forward` is true, or before otherwise. Returns `pos` + itself if no further cluster break is available in the string. + Moves across surrogate pairs, extending characters (when + `includeExtending` is true), characters joined with zero-width + joiners, and flag emoji. + */ + function findClusterBreak(str, pos, forward = true, includeExtending = true) { + return (forward ? nextClusterBreak : prevClusterBreak)(str, pos, includeExtending); + } + function nextClusterBreak(str, pos, includeExtending) { + if (pos == str.length) + return pos; + // If pos is in the middle of a surrogate pair, move to its start + if (pos && surrogateLow(str.charCodeAt(pos)) && surrogateHigh(str.charCodeAt(pos - 1))) + pos--; + let prev = codePointAt(str, pos); + pos += codePointSize(prev); + while (pos < str.length) { + let next = codePointAt(str, pos); + if (prev == ZWJ || next == ZWJ || includeExtending && isExtendingChar(next)) { + pos += codePointSize(next); + prev = next; + } + else if (isRegionalIndicator(next)) { + let countBefore = 0, i = pos - 2; + while (i >= 0 && isRegionalIndicator(codePointAt(str, i))) { + countBefore++; + i -= 2; + } + if (countBefore % 2 == 0) + break; + else + pos += 2; + } + else { + break; + } + } + return pos; + } + function prevClusterBreak(str, pos, includeExtending) { + while (pos > 0) { + let found = nextClusterBreak(str, pos - 2, includeExtending); + if (found < pos) + return found; + pos--; + } + return 0; + } + function surrogateLow(ch) { return ch >= 0xDC00 && ch < 0xE000; } + function surrogateHigh(ch) { return ch >= 0xD800 && ch < 0xDC00; } + /** + Find the code point at the given position in a string (like the + [`codePointAt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) + string method). + */ + function codePointAt(str, pos) { + let code0 = str.charCodeAt(pos); + if (!surrogateHigh(code0) || pos + 1 == str.length) + return code0; + let code1 = str.charCodeAt(pos + 1); + if (!surrogateLow(code1)) + return code0; + return ((code0 - 0xd800) << 10) + (code1 - 0xdc00) + 0x10000; + } + /** + Given a Unicode codepoint, return the JavaScript string that + respresents it (like + [`String.fromCodePoint`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)). + */ + function fromCodePoint(code) { + if (code <= 0xffff) + return String.fromCharCode(code); + code -= 0x10000; + return String.fromCharCode((code >> 10) + 0xd800, (code & 1023) + 0xdc00); + } + /** + The amount of positions a character takes up a JavaScript string. + */ + function codePointSize(code) { return code < 0x10000 ? 1 : 2; } + + const DefaultSplit = /\r\n?|\n/; + /** + Distinguishes different ways in which positions can be mapped. + */ + var MapMode = /*@__PURE__*/(function (MapMode) { + /** + Map a position to a valid new position, even when its context + was deleted. + */ + MapMode[MapMode["Simple"] = 0] = "Simple"; + /** + Return null if deletion happens across the position. + */ + MapMode[MapMode["TrackDel"] = 1] = "TrackDel"; + /** + Return null if the character _before_ the position is deleted. + */ + MapMode[MapMode["TrackBefore"] = 2] = "TrackBefore"; + /** + Return null if the character _after_ the position is deleted. + */ + MapMode[MapMode["TrackAfter"] = 3] = "TrackAfter"; + return MapMode})(MapMode || (MapMode = {})); + /** + A change description is a variant of [change set](https://codemirror.net/6/docs/ref/#state.ChangeSet) + that doesn't store the inserted text. As such, it can't be + applied, but is cheaper to store and manipulate. + */ + class ChangeDesc { + // Sections are encoded as pairs of integers. The first is the + // length in the current document, and the second is -1 for + // unaffected sections, and the length of the replacement content + // otherwise. So an insertion would be (0, n>0), a deletion (n>0, + // 0), and a replacement two positive numbers. + /** + @internal + */ + constructor( + /** + @internal + */ + sections) { + this.sections = sections; + } + /** + The length of the document before the change. + */ + get length() { + let result = 0; + for (let i = 0; i < this.sections.length; i += 2) + result += this.sections[i]; + return result; + } + /** + The length of the document after the change. + */ + get newLength() { + let result = 0; + for (let i = 0; i < this.sections.length; i += 2) { + let ins = this.sections[i + 1]; + result += ins < 0 ? this.sections[i] : ins; + } + return result; + } + /** + False when there are actual changes in this set. + */ + get empty() { return this.sections.length == 0 || this.sections.length == 2 && this.sections[1] < 0; } + /** + Iterate over the unchanged parts left by these changes. `posA` + provides the position of the range in the old document, `posB` + the new position in the changed document. + */ + iterGaps(f) { + for (let i = 0, posA = 0, posB = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + if (ins < 0) { + f(posA, posB, len); + posB += len; + } + else { + posB += ins; + } + posA += len; + } + } + /** + Iterate over the ranges changed by these changes. (See + [`ChangeSet.iterChanges`](https://codemirror.net/6/docs/ref/#state.ChangeSet.iterChanges) for a + variant that also provides you with the inserted text.) + `fromA`/`toA` provides the extent of the change in the starting + document, `fromB`/`toB` the extent of the replacement in the + changed document. + + When `individual` is true, adjacent changes (which are kept + separate for [position mapping](https://codemirror.net/6/docs/ref/#state.ChangeDesc.mapPos)) are + reported separately. + */ + iterChangedRanges(f, individual = false) { + iterChanges(this, f, individual); + } + /** + Get a description of the inverted form of these changes. + */ + get invertedDesc() { + let sections = []; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + if (ins < 0) + sections.push(len, ins); + else + sections.push(ins, len); + } + return new ChangeDesc(sections); + } + /** + Compute the combined effect of applying another set of changes + after this one. The length of the document after this set should + match the length before `other`. + */ + composeDesc(other) { return this.empty ? other : other.empty ? this : composeSets(this, other); } + /** + Map this description, which should start with the same document + as `other`, over another set of changes, so that it can be + applied after it. When `before` is true, map as if the changes + in `other` happened before the ones in `this`. + */ + mapDesc(other, before = false) { return other.empty ? this : mapSet(this, other, before); } + mapPos(pos, assoc = -1, mode = MapMode.Simple) { + let posA = 0, posB = 0; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++], endA = posA + len; + if (ins < 0) { + if (endA > pos) + return posB + (pos - posA); + posB += len; + } + else { + if (mode != MapMode.Simple && endA >= pos && + (mode == MapMode.TrackDel && posA < pos && endA > pos || + mode == MapMode.TrackBefore && posA < pos || + mode == MapMode.TrackAfter && endA > pos)) + return null; + if (endA > pos || endA == pos && assoc < 0 && !len) + return pos == posA || assoc < 0 ? posB : posB + ins; + posB += ins; + } + posA = endA; + } + if (pos > posA) + throw new RangeError(`Position ${pos} is out of range for changeset of length ${posA}`); + return posB; + } + /** + Check whether these changes touch a given range. When one of the + changes entirely covers the range, the string `"cover"` is + returned. + */ + touchesRange(from, to = from) { + for (let i = 0, pos = 0; i < this.sections.length && pos <= to;) { + let len = this.sections[i++], ins = this.sections[i++], end = pos + len; + if (ins >= 0 && pos <= to && end >= from) + return pos < from && end > to ? "cover" : true; + pos = end; + } + return false; + } + /** + @internal + */ + toString() { + let result = ""; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + result += (result ? " " : "") + len + (ins >= 0 ? ":" + ins : ""); + } + return result; + } + /** + Serialize this change desc to a JSON-representable value. + */ + toJSON() { return this.sections; } + /** + Create a change desc from its JSON representation (as produced + by [`toJSON`](https://codemirror.net/6/docs/ref/#state.ChangeDesc.toJSON). + */ + static fromJSON(json) { + if (!Array.isArray(json) || json.length % 2 || json.some(a => typeof a != "number")) + throw new RangeError("Invalid JSON representation of ChangeDesc"); + return new ChangeDesc(json); + } + /** + @internal + */ + static create(sections) { return new ChangeDesc(sections); } + } + /** + A change set represents a group of modifications to a document. It + stores the document length, and can only be applied to documents + with exactly that length. + */ + class ChangeSet extends ChangeDesc { + constructor(sections, + /** + @internal + */ + inserted) { + super(sections); + this.inserted = inserted; + } + /** + Apply the changes to a document, returning the modified + document. + */ + apply(doc) { + if (this.length != doc.length) + throw new RangeError("Applying change set to a document with the wrong length"); + iterChanges(this, (fromA, toA, fromB, _toB, text) => doc = doc.replace(fromB, fromB + (toA - fromA), text), false); + return doc; + } + mapDesc(other, before = false) { return mapSet(this, other, before, true); } + /** + Given the document as it existed _before_ the changes, return a + change set that represents the inverse of this set, which could + be used to go from the document created by the changes back to + the document as it existed before the changes. + */ + invert(doc) { + let sections = this.sections.slice(), inserted = []; + for (let i = 0, pos = 0; i < sections.length; i += 2) { + let len = sections[i], ins = sections[i + 1]; + if (ins >= 0) { + sections[i] = ins; + sections[i + 1] = len; + let index = i >> 1; + while (inserted.length < index) + inserted.push(Text.empty); + inserted.push(len ? doc.slice(pos, pos + len) : Text.empty); + } + pos += len; + } + return new ChangeSet(sections, inserted); + } + /** + Combine two subsequent change sets into a single set. `other` + must start in the document produced by `this`. If `this` goes + `docA` → `docB` and `other` represents `docB` → `docC`, the + returned value will represent the change `docA` → `docC`. + */ + compose(other) { return this.empty ? other : other.empty ? this : composeSets(this, other, true); } + /** + Given another change set starting in the same document, maps this + change set over the other, producing a new change set that can be + applied to the document produced by applying `other`. When + `before` is `true`, order changes as if `this` comes before + `other`, otherwise (the default) treat `other` as coming first. + + Given two changes `A` and `B`, `A.compose(B.map(A))` and + `B.compose(A.map(B, true))` will produce the same document. This + provides a basic form of [operational + transformation](https://en.wikipedia.org/wiki/Operational_transformation), + and can be used for collaborative editing. + */ + map(other, before = false) { return other.empty ? this : mapSet(this, other, before, true); } + /** + Iterate over the changed ranges in the document, calling `f` for + each, with the range in the original document (`fromA`-`toA`) + and the range that replaces it in the new document + (`fromB`-`toB`). + + When `individual` is true, adjacent changes are reported + separately. + */ + iterChanges(f, individual = false) { + iterChanges(this, f, individual); + } + /** + Get a [change description](https://codemirror.net/6/docs/ref/#state.ChangeDesc) for this change + set. + */ + get desc() { return ChangeDesc.create(this.sections); } + /** + @internal + */ + filter(ranges) { + let resultSections = [], resultInserted = [], filteredSections = []; + let iter = new SectionIter(this); + done: for (let i = 0, pos = 0;;) { + let next = i == ranges.length ? 1e9 : ranges[i++]; + while (pos < next || pos == next && iter.len == 0) { + if (iter.done) + break done; + let len = Math.min(iter.len, next - pos); + addSection(filteredSections, len, -1); + let ins = iter.ins == -1 ? -1 : iter.off == 0 ? iter.ins : 0; + addSection(resultSections, len, ins); + if (ins > 0) + addInsert(resultInserted, resultSections, iter.text); + iter.forward(len); + pos += len; + } + let end = ranges[i++]; + while (pos < end) { + if (iter.done) + break done; + let len = Math.min(iter.len, end - pos); + addSection(resultSections, len, -1); + addSection(filteredSections, len, iter.ins == -1 ? -1 : iter.off == 0 ? iter.ins : 0); + iter.forward(len); + pos += len; + } + } + return { changes: new ChangeSet(resultSections, resultInserted), + filtered: ChangeDesc.create(filteredSections) }; + } + /** + Serialize this change set to a JSON-representable value. + */ + toJSON() { + let parts = []; + for (let i = 0; i < this.sections.length; i += 2) { + let len = this.sections[i], ins = this.sections[i + 1]; + if (ins < 0) + parts.push(len); + else if (ins == 0) + parts.push([len]); + else + parts.push([len].concat(this.inserted[i >> 1].toJSON())); + } + return parts; + } + /** + Create a change set for the given changes, for a document of the + given length, using `lineSep` as line separator. + */ + static of(changes, length, lineSep) { + let sections = [], inserted = [], pos = 0; + let total = null; + function flush(force = false) { + if (!force && !sections.length) + return; + if (pos < length) + addSection(sections, length - pos, -1); + let set = new ChangeSet(sections, inserted); + total = total ? total.compose(set.map(total)) : set; + sections = []; + inserted = []; + pos = 0; + } + function process(spec) { + if (Array.isArray(spec)) { + for (let sub of spec) + process(sub); + } + else if (spec instanceof ChangeSet) { + if (spec.length != length) + throw new RangeError(`Mismatched change set length (got ${spec.length}, expected ${length})`); + flush(); + total = total ? total.compose(spec.map(total)) : spec; + } + else { + let { from, to = from, insert } = spec; + if (from > to || from < 0 || to > length) + throw new RangeError(`Invalid change range ${from} to ${to} (in doc of length ${length})`); + let insText = !insert ? Text.empty : typeof insert == "string" ? Text.of(insert.split(lineSep || DefaultSplit)) : insert; + let insLen = insText.length; + if (from == to && insLen == 0) + return; + if (from < pos) + flush(); + if (from > pos) + addSection(sections, from - pos, -1); + addSection(sections, to - from, insLen); + addInsert(inserted, sections, insText); + pos = to; + } + } + process(changes); + flush(!total); + return total; + } + /** + Create an empty changeset of the given length. + */ + static empty(length) { + return new ChangeSet(length ? [length, -1] : [], []); + } + /** + Create a changeset from its JSON representation (as produced by + [`toJSON`](https://codemirror.net/6/docs/ref/#state.ChangeSet.toJSON). + */ + static fromJSON(json) { + if (!Array.isArray(json)) + throw new RangeError("Invalid JSON representation of ChangeSet"); + let sections = [], inserted = []; + for (let i = 0; i < json.length; i++) { + let part = json[i]; + if (typeof part == "number") { + sections.push(part, -1); + } + else if (!Array.isArray(part) || typeof part[0] != "number" || part.some((e, i) => i && typeof e != "string")) { + throw new RangeError("Invalid JSON representation of ChangeSet"); + } + else if (part.length == 1) { + sections.push(part[0], 0); + } + else { + while (inserted.length < i) + inserted.push(Text.empty); + inserted[i] = Text.of(part.slice(1)); + sections.push(part[0], inserted[i].length); + } + } + return new ChangeSet(sections, inserted); + } + /** + @internal + */ + static createSet(sections, inserted) { + return new ChangeSet(sections, inserted); + } + } + function addSection(sections, len, ins, forceJoin = false) { + if (len == 0 && ins <= 0) + return; + let last = sections.length - 2; + if (last >= 0 && ins <= 0 && ins == sections[last + 1]) + sections[last] += len; + else if (len == 0 && sections[last] == 0) + sections[last + 1] += ins; + else if (forceJoin) { + sections[last] += len; + sections[last + 1] += ins; + } + else + sections.push(len, ins); + } + function addInsert(values, sections, value) { + if (value.length == 0) + return; + let index = (sections.length - 2) >> 1; + if (index < values.length) { + values[values.length - 1] = values[values.length - 1].append(value); + } + else { + while (values.length < index) + values.push(Text.empty); + values.push(value); + } + } + function iterChanges(desc, f, individual) { + let inserted = desc.inserted; + for (let posA = 0, posB = 0, i = 0; i < desc.sections.length;) { + let len = desc.sections[i++], ins = desc.sections[i++]; + if (ins < 0) { + posA += len; + posB += len; + } + else { + let endA = posA, endB = posB, text = Text.empty; + for (;;) { + endA += len; + endB += ins; + if (ins && inserted) + text = text.append(inserted[(i - 2) >> 1]); + if (individual || i == desc.sections.length || desc.sections[i + 1] < 0) + break; + len = desc.sections[i++]; + ins = desc.sections[i++]; + } + f(posA, endA, posB, endB, text); + posA = endA; + posB = endB; + } + } + } + function mapSet(setA, setB, before, mkSet = false) { + let sections = [], insert = mkSet ? [] : null; + let a = new SectionIter(setA), b = new SectionIter(setB); + for (let posA = 0, posB = 0;;) { + if (a.ins == -1) { + posA += a.len; + a.next(); + } + else if (b.ins == -1 && posB < posA) { + let skip = Math.min(b.len, posA - posB); + b.forward(skip); + addSection(sections, skip, -1); + posB += skip; + } + else if (b.ins >= 0 && (a.done || posB < posA || posB == posA && (b.len < a.len || b.len == a.len && !before))) { + addSection(sections, b.ins, -1); + while (posA > posB && !a.done && posA + a.len < posB + b.len) { + posA += a.len; + a.next(); + } + posB += b.len; + b.next(); + } + else if (a.ins >= 0) { + let len = 0, end = posA + a.len; + for (;;) { + if (b.ins >= 0 && posB > posA && posB + b.len < end) { + len += b.ins; + posB += b.len; + b.next(); + } + else if (b.ins == -1 && posB < end) { + let skip = Math.min(b.len, end - posB); + len += skip; + b.forward(skip); + posB += skip; + } + else { + break; + } + } + addSection(sections, len, a.ins); + if (insert) + addInsert(insert, sections, a.text); + posA = end; + a.next(); + } + else if (a.done && b.done) { + return insert ? ChangeSet.createSet(sections, insert) : ChangeDesc.create(sections); + } + else { + throw new Error("Mismatched change set lengths"); + } + } + } + function composeSets(setA, setB, mkSet = false) { + let sections = []; + let insert = mkSet ? [] : null; + let a = new SectionIter(setA), b = new SectionIter(setB); + for (let open = false;;) { + if (a.done && b.done) { + return insert ? ChangeSet.createSet(sections, insert) : ChangeDesc.create(sections); + } + else if (a.ins == 0) { // Deletion in A + addSection(sections, a.len, 0, open); + a.next(); + } + else if (b.len == 0 && !b.done) { // Insertion in B + addSection(sections, 0, b.ins, open); + if (insert) + addInsert(insert, sections, b.text); + b.next(); + } + else if (a.done || b.done) { + throw new Error("Mismatched change set lengths"); + } + else { + let len = Math.min(a.len2, b.len), sectionLen = sections.length; + if (a.ins == -1) { + let insB = b.ins == -1 ? -1 : b.off ? 0 : b.ins; + addSection(sections, len, insB, open); + if (insert && insB) + addInsert(insert, sections, b.text); + } + else if (b.ins == -1) { + addSection(sections, a.off ? 0 : a.len, len, open); + if (insert) + addInsert(insert, sections, a.textBit(len)); + } + else { + addSection(sections, a.off ? 0 : a.len, b.off ? 0 : b.ins, open); + if (insert && !b.off) + addInsert(insert, sections, b.text); + } + open = (a.ins > len || b.ins >= 0 && b.len > len) && (open || sections.length > sectionLen); + a.forward2(len); + b.forward(len); + } + } + } + class SectionIter { + constructor(set) { + this.set = set; + this.i = 0; + this.next(); + } + next() { + let { sections } = this.set; + if (this.i < sections.length) { + this.len = sections[this.i++]; + this.ins = sections[this.i++]; + } + else { + this.len = 0; + this.ins = -2; + } + this.off = 0; + } + get done() { return this.ins == -2; } + get len2() { return this.ins < 0 ? this.len : this.ins; } + get text() { + let { inserted } = this.set, index = (this.i - 2) >> 1; + return index >= inserted.length ? Text.empty : inserted[index]; + } + textBit(len) { + let { inserted } = this.set, index = (this.i - 2) >> 1; + return index >= inserted.length && !len ? Text.empty + : inserted[index].slice(this.off, len == null ? undefined : this.off + len); + } + forward(len) { + if (len == this.len) + this.next(); + else { + this.len -= len; + this.off += len; + } + } + forward2(len) { + if (this.ins == -1) + this.forward(len); + else if (len == this.ins) + this.next(); + else { + this.ins -= len; + this.off += len; + } + } + } + + /** + A single selection range. When + [`allowMultipleSelections`](https://codemirror.net/6/docs/ref/#state.EditorState^allowMultipleSelections) + is enabled, a [selection](https://codemirror.net/6/docs/ref/#state.EditorSelection) may hold + multiple ranges. By default, selections hold exactly one range. + */ + class SelectionRange { + constructor( + /** + The lower boundary of the range. + */ + from, + /** + The upper boundary of the range. + */ + to, flags) { + this.from = from; + this.to = to; + this.flags = flags; + } + /** + The anchor of the range—the side that doesn't move when you + extend it. + */ + get anchor() { return this.flags & 16 /* Inverted */ ? this.to : this.from; } + /** + The head of the range, which is moved when the range is + [extended](https://codemirror.net/6/docs/ref/#state.SelectionRange.extend). + */ + get head() { return this.flags & 16 /* Inverted */ ? this.from : this.to; } + /** + True when `anchor` and `head` are at the same position. + */ + get empty() { return this.from == this.to; } + /** + If this is a cursor that is explicitly associated with the + character on one of its sides, this returns the side. -1 means + the character before its position, 1 the character after, and 0 + means no association. + */ + get assoc() { return this.flags & 4 /* AssocBefore */ ? -1 : this.flags & 8 /* AssocAfter */ ? 1 : 0; } + /** + The bidirectional text level associated with this cursor, if + any. + */ + get bidiLevel() { + let level = this.flags & 3 /* BidiLevelMask */; + return level == 3 ? null : level; + } + /** + The goal column (stored vertical offset) associated with a + cursor. This is used to preserve the vertical position when + [moving](https://codemirror.net/6/docs/ref/#view.EditorView.moveVertically) across + lines of different length. + */ + get goalColumn() { + let value = this.flags >> 5 /* GoalColumnOffset */; + return value == 33554431 /* NoGoalColumn */ ? undefined : value; + } + /** + Map this range through a change, producing a valid range in the + updated document. + */ + map(change, assoc = -1) { + let from, to; + if (this.empty) { + from = to = change.mapPos(this.from, assoc); + } + else { + from = change.mapPos(this.from, 1); + to = change.mapPos(this.to, -1); + } + return from == this.from && to == this.to ? this : new SelectionRange(from, to, this.flags); + } + /** + Extend this range to cover at least `from` to `to`. + */ + extend(from, to = from) { + if (from <= this.anchor && to >= this.anchor) + return EditorSelection.range(from, to); + let head = Math.abs(from - this.anchor) > Math.abs(to - this.anchor) ? from : to; + return EditorSelection.range(this.anchor, head); + } + /** + Compare this range to another range. + */ + eq(other) { + return this.anchor == other.anchor && this.head == other.head; + } + /** + Return a JSON-serializable object representing the range. + */ + toJSON() { return { anchor: this.anchor, head: this.head }; } + /** + Convert a JSON representation of a range to a `SelectionRange` + instance. + */ + static fromJSON(json) { + if (!json || typeof json.anchor != "number" || typeof json.head != "number") + throw new RangeError("Invalid JSON representation for SelectionRange"); + return EditorSelection.range(json.anchor, json.head); + } + /** + @internal + */ + static create(from, to, flags) { + return new SelectionRange(from, to, flags); + } + } + /** + An editor selection holds one or more selection ranges. + */ + class EditorSelection { + constructor( + /** + The ranges in the selection, sorted by position. Ranges cannot + overlap (but they may touch, if they aren't empty). + */ + ranges, + /** + The index of the _main_ range in the selection (which is + usually the range that was added last). + */ + mainIndex) { + this.ranges = ranges; + this.mainIndex = mainIndex; + } + /** + Map a selection through a change. Used to adjust the selection + position for changes. + */ + map(change, assoc = -1) { + if (change.empty) + return this; + return EditorSelection.create(this.ranges.map(r => r.map(change, assoc)), this.mainIndex); + } + /** + Compare this selection to another selection. + */ + eq(other) { + if (this.ranges.length != other.ranges.length || + this.mainIndex != other.mainIndex) + return false; + for (let i = 0; i < this.ranges.length; i++) + if (!this.ranges[i].eq(other.ranges[i])) + return false; + return true; + } + /** + Get the primary selection range. Usually, you should make sure + your code applies to _all_ ranges, by using methods like + [`changeByRange`](https://codemirror.net/6/docs/ref/#state.EditorState.changeByRange). + */ + get main() { return this.ranges[this.mainIndex]; } + /** + Make sure the selection only has one range. Returns a selection + holding only the main range from this selection. + */ + asSingle() { + return this.ranges.length == 1 ? this : new EditorSelection([this.main], 0); + } + /** + Extend this selection with an extra range. + */ + addRange(range, main = true) { + return EditorSelection.create([range].concat(this.ranges), main ? 0 : this.mainIndex + 1); + } + /** + Replace a given range with another range, and then normalize the + selection to merge and sort ranges if necessary. + */ + replaceRange(range, which = this.mainIndex) { + let ranges = this.ranges.slice(); + ranges[which] = range; + return EditorSelection.create(ranges, this.mainIndex); + } + /** + Convert this selection to an object that can be serialized to + JSON. + */ + toJSON() { + return { ranges: this.ranges.map(r => r.toJSON()), main: this.mainIndex }; + } + /** + Create a selection from a JSON representation. + */ + static fromJSON(json) { + if (!json || !Array.isArray(json.ranges) || typeof json.main != "number" || json.main >= json.ranges.length) + throw new RangeError("Invalid JSON representation for EditorSelection"); + return new EditorSelection(json.ranges.map((r) => SelectionRange.fromJSON(r)), json.main); + } + /** + Create a selection holding a single range. + */ + static single(anchor, head = anchor) { + return new EditorSelection([EditorSelection.range(anchor, head)], 0); + } + /** + Sort and merge the given set of ranges, creating a valid + selection. + */ + static create(ranges, mainIndex = 0) { + if (ranges.length == 0) + throw new RangeError("A selection needs at least one range"); + for (let pos = 0, i = 0; i < ranges.length; i++) { + let range = ranges[i]; + if (range.empty ? range.from <= pos : range.from < pos) + return EditorSelection.normalized(ranges.slice(), mainIndex); + pos = range.to; + } + return new EditorSelection(ranges, mainIndex); + } + /** + Create a cursor selection range at the given position. You can + safely ignore the optional arguments in most situations. + */ + static cursor(pos, assoc = 0, bidiLevel, goalColumn) { + return SelectionRange.create(pos, pos, (assoc == 0 ? 0 : assoc < 0 ? 4 /* AssocBefore */ : 8 /* AssocAfter */) | + (bidiLevel == null ? 3 : Math.min(2, bidiLevel)) | + ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* NoGoalColumn */) << 5 /* GoalColumnOffset */)); + } + /** + Create a selection range. + */ + static range(anchor, head, goalColumn) { + let goal = (goalColumn !== null && goalColumn !== void 0 ? goalColumn : 33554431 /* NoGoalColumn */) << 5 /* GoalColumnOffset */; + return head < anchor ? SelectionRange.create(head, anchor, 16 /* Inverted */ | goal | 8 /* AssocAfter */) + : SelectionRange.create(anchor, head, goal | (head > anchor ? 4 /* AssocBefore */ : 0)); + } + /** + @internal + */ + static normalized(ranges, mainIndex = 0) { + let main = ranges[mainIndex]; + ranges.sort((a, b) => a.from - b.from); + mainIndex = ranges.indexOf(main); + for (let i = 1; i < ranges.length; i++) { + let range = ranges[i], prev = ranges[i - 1]; + if (range.empty ? range.from <= prev.to : range.from < prev.to) { + let from = prev.from, to = Math.max(range.to, prev.to); + if (i <= mainIndex) + mainIndex--; + ranges.splice(--i, 2, range.anchor > range.head ? EditorSelection.range(to, from) : EditorSelection.range(from, to)); + } + } + return new EditorSelection(ranges, mainIndex); + } + } + function checkSelection(selection, docLength) { + for (let range of selection.ranges) + if (range.to > docLength) + throw new RangeError("Selection points outside of document"); + } + + let nextID = 0; + /** + A facet is a labeled value that is associated with an editor + state. It takes inputs from any number of extensions, and combines + those into a single output value. + + Examples of uses of facets are the [tab + size](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize), [editor + attributes](https://codemirror.net/6/docs/ref/#view.EditorView^editorAttributes), and [update + listeners](https://codemirror.net/6/docs/ref/#view.EditorView^updateListener). + */ + class Facet { + constructor( + /** + @internal + */ + combine, + /** + @internal + */ + compareInput, + /** + @internal + */ + compare, isStatic, + /** + @internal + */ + extensions) { + this.combine = combine; + this.compareInput = compareInput; + this.compare = compare; + this.isStatic = isStatic; + this.extensions = extensions; + /** + @internal + */ + this.id = nextID++; + this.default = combine([]); + } + /** + Define a new facet. + */ + static define(config = {}) { + return new Facet(config.combine || ((a) => a), config.compareInput || ((a, b) => a === b), config.compare || (!config.combine ? sameArray$1 : (a, b) => a === b), !!config.static, config.enables); + } + /** + Returns an extension that adds the given value to this facet. + */ + of(value) { + return new FacetProvider([], this, 0 /* Static */, value); + } + /** + Create an extension that computes a value for the facet from a + state. You must take care to declare the parts of the state that + this value depends on, since your function is only called again + for a new state when one of those parts changed. + + In cases where your value depends only on a single field, you'll + want to use the [`from`](https://codemirror.net/6/docs/ref/#state.Facet.from) method instead. + */ + compute(deps, get) { + if (this.isStatic) + throw new Error("Can't compute a static facet"); + return new FacetProvider(deps, this, 1 /* Single */, get); + } + /** + Create an extension that computes zero or more values for this + facet from a state. + */ + computeN(deps, get) { + if (this.isStatic) + throw new Error("Can't compute a static facet"); + return new FacetProvider(deps, this, 2 /* Multi */, get); + } + from(field, get) { + if (!get) + get = x => x; + return this.compute([field], state => get(state.field(field))); + } + } + function sameArray$1(a, b) { + return a == b || a.length == b.length && a.every((e, i) => e === b[i]); + } + class FacetProvider { + constructor(dependencies, facet, type, value) { + this.dependencies = dependencies; + this.facet = facet; + this.type = type; + this.value = value; + this.id = nextID++; + } + dynamicSlot(addresses) { + var _a; + let getter = this.value; + let compare = this.facet.compareInput; + let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Multi */; + let depDoc = false, depSel = false, depAddrs = []; + for (let dep of this.dependencies) { + if (dep == "doc") + depDoc = true; + else if (dep == "selection") + depSel = true; + else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0) + depAddrs.push(addresses[dep.id]); + } + return { + create(state) { + state.values[idx] = getter(state); + return 1 /* Changed */; + }, + update(state, tr) { + if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) || ensureAll(state, depAddrs)) { + let newVal = getter(state); + if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) { + state.values[idx] = newVal; + return 1 /* Changed */; + } + } + return 0; + }, + reconfigure: (state, oldState) => { + let newVal = getter(state); + let oldAddr = oldState.config.address[id]; + if (oldAddr != null) { + let oldVal = getAddr(oldState, oldAddr); + if (this.dependencies.every(dep => { + return dep instanceof Facet ? oldState.facet(dep) === state.facet(dep) : + dep instanceof StateField ? oldState.field(dep, false) == state.field(dep, false) : true; + }) || (multi ? compareArray(newVal, oldVal, compare) : compare(newVal, oldVal))) { + state.values[idx] = oldVal; + return 0; + } + } + state.values[idx] = newVal; + return 1 /* Changed */; + } + }; + } + } + function compareArray(a, b, compare) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (!compare(a[i], b[i])) + return false; + return true; + } + function ensureAll(state, addrs) { + let changed = false; + for (let addr of addrs) + if (ensureAddr(state, addr) & 1 /* Changed */) + changed = true; + return changed; + } + function dynamicFacetSlot(addresses, facet, providers) { + let providerAddrs = providers.map(p => addresses[p.id]); + let providerTypes = providers.map(p => p.type); + let dynamic = providerAddrs.filter(p => !(p & 1)); + let idx = addresses[facet.id] >> 1; + function get(state) { + let values = []; + for (let i = 0; i < providerAddrs.length; i++) { + let value = getAddr(state, providerAddrs[i]); + if (providerTypes[i] == 2 /* Multi */) + for (let val of value) + values.push(val); + else + values.push(value); + } + return facet.combine(values); + } + return { + create(state) { + for (let addr of providerAddrs) + ensureAddr(state, addr); + state.values[idx] = get(state); + return 1 /* Changed */; + }, + update(state, tr) { + if (!ensureAll(state, dynamic)) + return 0; + let value = get(state); + if (facet.compare(value, state.values[idx])) + return 0; + state.values[idx] = value; + return 1 /* Changed */; + }, + reconfigure(state, oldState) { + let depChanged = ensureAll(state, providerAddrs); + let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet); + if (oldProviders && !depChanged && sameArray$1(providers, oldProviders)) { + state.values[idx] = oldValue; + return 0; + } + let value = get(state); + if (facet.compare(value, oldValue)) { + state.values[idx] = oldValue; + return 0; + } + state.values[idx] = value; + return 1 /* Changed */; + } + }; + } + const initField = /*@__PURE__*/Facet.define({ static: true }); + /** + Fields can store additional information in an editor state, and + keep it in sync with the rest of the state. + */ + class StateField { + constructor( + /** + @internal + */ + id, createF, updateF, compareF, + /** + @internal + */ + spec) { + this.id = id; + this.createF = createF; + this.updateF = updateF; + this.compareF = compareF; + this.spec = spec; + /** + @internal + */ + this.provides = undefined; + } + /** + Define a state field. + */ + static define(config) { + let field = new StateField(nextID++, config.create, config.update, config.compare || ((a, b) => a === b), config); + if (config.provide) + field.provides = config.provide(field); + return field; + } + create(state) { + let init = state.facet(initField).find(i => i.field == this); + return ((init === null || init === void 0 ? void 0 : init.create) || this.createF)(state); + } + /** + @internal + */ + slot(addresses) { + let idx = addresses[this.id] >> 1; + return { + create: (state) => { + state.values[idx] = this.create(state); + return 1 /* Changed */; + }, + update: (state, tr) => { + let oldVal = state.values[idx]; + let value = this.updateF(oldVal, tr); + if (this.compareF(oldVal, value)) + return 0; + state.values[idx] = value; + return 1 /* Changed */; + }, + reconfigure: (state, oldState) => { + if (oldState.config.address[this.id] != null) { + state.values[idx] = oldState.field(this); + return 0; + } + state.values[idx] = this.create(state); + return 1 /* Changed */; + } + }; + } + /** + Returns an extension that enables this field and overrides the + way it is initialized. Can be useful when you need to provide a + non-default starting value for the field. + */ + init(create) { + return [this, initField.of({ field: this, create })]; + } + /** + State field instances can be used as + [`Extension`](https://codemirror.net/6/docs/ref/#state.Extension) values to enable the field in a + given state. + */ + get extension() { return this; } + } + const Prec_ = { lowest: 4, low: 3, default: 2, high: 1, highest: 0 }; + function prec(value) { + return (ext) => new PrecExtension(ext, value); + } + /** + By default extensions are registered in the order they are found + in the flattened form of nested array that was provided. + Individual extension values can be assigned a precedence to + override this. Extensions that do not have a precedence set get + the precedence of the nearest parent with a precedence, or + [`default`](https://codemirror.net/6/docs/ref/#state.Prec.default) if there is no such parent. The + final ordering of extensions is determined by first sorting by + precedence and then by order within each precedence. + */ + const Prec = { + /** + The highest precedence level, for extensions that should end up + near the start of the precedence ordering. + */ + highest: /*@__PURE__*/prec(Prec_.highest), + /** + A higher-than-default precedence, for extensions that should + come before those with default precedence. + */ + high: /*@__PURE__*/prec(Prec_.high), + /** + The default precedence, which is also used for extensions + without an explicit precedence. + */ + default: /*@__PURE__*/prec(Prec_.default), + /** + A lower-than-default precedence. + */ + low: /*@__PURE__*/prec(Prec_.low), + /** + The lowest precedence level. Meant for things that should end up + near the end of the extension order. + */ + lowest: /*@__PURE__*/prec(Prec_.lowest) + }; + class PrecExtension { + constructor(inner, prec) { + this.inner = inner; + this.prec = prec; + } + } + /** + Extension compartments can be used to make a configuration + dynamic. By [wrapping](https://codemirror.net/6/docs/ref/#state.Compartment.of) part of your + configuration in a compartment, you can later + [replace](https://codemirror.net/6/docs/ref/#state.Compartment.reconfigure) that part through a + transaction. + */ + class Compartment { + /** + Create an instance of this compartment to add to your [state + configuration](https://codemirror.net/6/docs/ref/#state.EditorStateConfig.extensions). + */ + of(ext) { return new CompartmentInstance(this, ext); } + /** + Create an [effect](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) that + reconfigures this compartment. + */ + reconfigure(content) { + return Compartment.reconfigure.of({ compartment: this, extension: content }); + } + /** + Get the current content of the compartment in the state, or + `undefined` if it isn't present. + */ + get(state) { + return state.config.compartments.get(this); + } + } + class CompartmentInstance { + constructor(compartment, inner) { + this.compartment = compartment; + this.inner = inner; + } + } + class Configuration { + constructor(base, compartments, dynamicSlots, address, staticValues, facets) { + this.base = base; + this.compartments = compartments; + this.dynamicSlots = dynamicSlots; + this.address = address; + this.staticValues = staticValues; + this.facets = facets; + this.statusTemplate = []; + while (this.statusTemplate.length < dynamicSlots.length) + this.statusTemplate.push(0 /* Unresolved */); + } + staticFacet(facet) { + let addr = this.address[facet.id]; + return addr == null ? facet.default : this.staticValues[addr >> 1]; + } + static resolve(base, compartments, oldState) { + let fields = []; + let facets = Object.create(null); + let newCompartments = new Map(); + for (let ext of flatten(base, compartments, newCompartments)) { + if (ext instanceof StateField) + fields.push(ext); + else + (facets[ext.facet.id] || (facets[ext.facet.id] = [])).push(ext); + } + let address = Object.create(null); + let staticValues = []; + let dynamicSlots = []; + for (let field of fields) { + address[field.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => field.slot(a)); + } + let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets; + for (let id in facets) { + let providers = facets[id], facet = providers[0].facet; + let oldProviders = oldFacets && oldFacets[id] || []; + if (providers.every(p => p.type == 0 /* Static */)) { + address[facet.id] = (staticValues.length << 1) | 1; + if (sameArray$1(oldProviders, providers)) { + staticValues.push(oldState.facet(facet)); + } + else { + let value = facet.combine(providers.map(p => p.value)); + staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value); + } + } + else { + for (let p of providers) { + if (p.type == 0 /* Static */) { + address[p.id] = (staticValues.length << 1) | 1; + staticValues.push(p.value); + } + else { + address[p.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => p.dynamicSlot(a)); + } + } + address[facet.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers)); + } + } + let dynamic = dynamicSlots.map(f => f(address)); + return new Configuration(base, newCompartments, dynamic, address, staticValues, facets); + } + } + function flatten(extension, compartments, newCompartments) { + let result = [[], [], [], [], []]; + let seen = new Map(); + function inner(ext, prec) { + let known = seen.get(ext); + if (known != null) { + if (known <= prec) + return; + let found = result[known].indexOf(ext); + if (found > -1) + result[known].splice(found, 1); + if (ext instanceof CompartmentInstance) + newCompartments.delete(ext.compartment); + } + seen.set(ext, prec); + if (Array.isArray(ext)) { + for (let e of ext) + inner(e, prec); + } + else if (ext instanceof CompartmentInstance) { + if (newCompartments.has(ext.compartment)) + throw new RangeError(`Duplicate use of compartment in extensions`); + let content = compartments.get(ext.compartment) || ext.inner; + newCompartments.set(ext.compartment, content); + inner(content, prec); + } + else if (ext instanceof PrecExtension) { + inner(ext.inner, ext.prec); + } + else if (ext instanceof StateField) { + result[prec].push(ext); + if (ext.provides) + inner(ext.provides, prec); + } + else if (ext instanceof FacetProvider) { + result[prec].push(ext); + if (ext.facet.extensions) + inner(ext.facet.extensions, prec); + } + else { + let content = ext.extension; + if (!content) + throw new Error(`Unrecognized extension value in extension set (${ext}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`); + inner(content, prec); + } + } + inner(extension, Prec_.default); + return result.reduce((a, b) => a.concat(b)); + } + function ensureAddr(state, addr) { + if (addr & 1) + return 2 /* Computed */; + let idx = addr >> 1; + let status = state.status[idx]; + if (status == 4 /* Computing */) + throw new Error("Cyclic dependency between fields and/or facets"); + if (status & 2 /* Computed */) + return status; + state.status[idx] = 4 /* Computing */; + let changed = state.computeSlot(state, state.config.dynamicSlots[idx]); + return state.status[idx] = 2 /* Computed */ | changed; + } + function getAddr(state, addr) { + return addr & 1 ? state.config.staticValues[addr >> 1] : state.values[addr >> 1]; + } + + const languageData = /*@__PURE__*/Facet.define(); + const allowMultipleSelections = /*@__PURE__*/Facet.define({ + combine: values => values.some(v => v), + static: true + }); + const lineSeparator = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : undefined, + static: true + }); + const changeFilter = /*@__PURE__*/Facet.define(); + const transactionFilter = /*@__PURE__*/Facet.define(); + const transactionExtender = /*@__PURE__*/Facet.define(); + const readOnly = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : false + }); + + /** + Annotations are tagged values that are used to add metadata to + transactions in an extensible way. They should be used to model + things that effect the entire transaction (such as its [time + stamp](https://codemirror.net/6/docs/ref/#state.Transaction^time) or information about its + [origin](https://codemirror.net/6/docs/ref/#state.Transaction^userEvent)). For effects that happen + _alongside_ the other changes made by the transaction, [state + effects](https://codemirror.net/6/docs/ref/#state.StateEffect) are more appropriate. + */ + class Annotation { + /** + @internal + */ + constructor( + /** + The annotation type. + */ + type, + /** + The value of this annotation. + */ + value) { + this.type = type; + this.value = value; + } + /** + Define a new type of annotation. + */ + static define() { return new AnnotationType(); } + } + /** + Marker that identifies a type of [annotation](https://codemirror.net/6/docs/ref/#state.Annotation). + */ + class AnnotationType { + /** + Create an instance of this annotation. + */ + of(value) { return new Annotation(this, value); } + } + /** + Representation of a type of state effect. Defined with + [`StateEffect.define`](https://codemirror.net/6/docs/ref/#state.StateEffect^define). + */ + class StateEffectType { + /** + @internal + */ + constructor( + // The `any` types in these function types are there to work + // around TypeScript issue #37631, where the type guard on + // `StateEffect.is` mysteriously stops working when these properly + // have type `Value`. + /** + @internal + */ + map) { + this.map = map; + } + /** + Create a [state effect](https://codemirror.net/6/docs/ref/#state.StateEffect) instance of this + type. + */ + of(value) { return new StateEffect(this, value); } + } + /** + State effects can be used to represent additional effects + associated with a [transaction](https://codemirror.net/6/docs/ref/#state.Transaction.effects). They + are often useful to model changes to custom [state + fields](https://codemirror.net/6/docs/ref/#state.StateField), when those changes aren't implicit in + document or selection changes. + */ + class StateEffect { + /** + @internal + */ + constructor( + /** + @internal + */ + type, + /** + The value of this effect. + */ + value) { + this.type = type; + this.value = value; + } + /** + Map this effect through a position mapping. Will return + `undefined` when that ends up deleting the effect. + */ + map(mapping) { + let mapped = this.type.map(this.value, mapping); + return mapped === undefined ? undefined : mapped == this.value ? this : new StateEffect(this.type, mapped); + } + /** + Tells you whether this effect object is of a given + [type](https://codemirror.net/6/docs/ref/#state.StateEffectType). + */ + is(type) { return this.type == type; } + /** + Define a new effect type. The type parameter indicates the type + of values that his effect holds. + */ + static define(spec = {}) { + return new StateEffectType(spec.map || (v => v)); + } + /** + Map an array of effects through a change set. + */ + static mapEffects(effects, mapping) { + if (!effects.length) + return effects; + let result = []; + for (let effect of effects) { + let mapped = effect.map(mapping); + if (mapped) + result.push(mapped); + } + return result; + } + } + /** + This effect can be used to reconfigure the root extensions of + the editor. Doing this will discard any extensions + [appended](https://codemirror.net/6/docs/ref/#state.StateEffect^appendConfig), but does not reset + the content of [reconfigured](https://codemirror.net/6/docs/ref/#state.Compartment.reconfigure) + compartments. + */ + StateEffect.reconfigure = /*@__PURE__*/StateEffect.define(); + /** + Append extensions to the top-level configuration of the editor. + */ + StateEffect.appendConfig = /*@__PURE__*/StateEffect.define(); + /** + Changes to the editor state are grouped into transactions. + Typically, a user action creates a single transaction, which may + contain any number of document changes, may change the selection, + or have other effects. Create a transaction by calling + [`EditorState.update`](https://codemirror.net/6/docs/ref/#state.EditorState.update), or immediately + dispatch one by calling + [`EditorView.dispatch`](https://codemirror.net/6/docs/ref/#view.EditorView.dispatch). + */ + class Transaction { + constructor( + /** + The state from which the transaction starts. + */ + startState, + /** + The document changes made by this transaction. + */ + changes, + /** + The selection set by this transaction, or undefined if it + doesn't explicitly set a selection. + */ + selection, + /** + The effects added to the transaction. + */ + effects, + /** + @internal + */ + annotations, + /** + Whether the selection should be scrolled into view after this + transaction is dispatched. + */ + scrollIntoView) { + this.startState = startState; + this.changes = changes; + this.selection = selection; + this.effects = effects; + this.annotations = annotations; + this.scrollIntoView = scrollIntoView; + /** + @internal + */ + this._doc = null; + /** + @internal + */ + this._state = null; + if (selection) + checkSelection(selection, changes.newLength); + if (!annotations.some((a) => a.type == Transaction.time)) + this.annotations = annotations.concat(Transaction.time.of(Date.now())); + } + /** + @internal + */ + static create(startState, changes, selection, effects, annotations, scrollIntoView) { + return new Transaction(startState, changes, selection, effects, annotations, scrollIntoView); + } + /** + The new document produced by the transaction. Contrary to + [`.state`](https://codemirror.net/6/docs/ref/#state.Transaction.state)`.doc`, accessing this won't + force the entire new state to be computed right away, so it is + recommended that [transaction + filters](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter) use this getter + when they need to look at the new document. + */ + get newDoc() { + return this._doc || (this._doc = this.changes.apply(this.startState.doc)); + } + /** + The new selection produced by the transaction. If + [`this.selection`](https://codemirror.net/6/docs/ref/#state.Transaction.selection) is undefined, + this will [map](https://codemirror.net/6/docs/ref/#state.EditorSelection.map) the start state's + current selection through the changes made by the transaction. + */ + get newSelection() { + return this.selection || this.startState.selection.map(this.changes); + } + /** + The new state created by the transaction. Computed on demand + (but retained for subsequent access), so it is recommended not to + access it in [transaction + filters](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter) when possible. + */ + get state() { + if (!this._state) + this.startState.applyTransaction(this); + return this._state; + } + /** + Get the value of the given annotation type, if any. + */ + annotation(type) { + for (let ann of this.annotations) + if (ann.type == type) + return ann.value; + return undefined; + } + /** + Indicates whether the transaction changed the document. + */ + get docChanged() { return !this.changes.empty; } + /** + Indicates whether this transaction reconfigures the state + (through a [configuration compartment](https://codemirror.net/6/docs/ref/#state.Compartment) or + with a top-level configuration + [effect](https://codemirror.net/6/docs/ref/#state.StateEffect^reconfigure). + */ + get reconfigured() { return this.startState.config != this.state.config; } + /** + Returns true if the transaction has a [user + event](https://codemirror.net/6/docs/ref/#state.Transaction^userEvent) annotation that is equal to + or more specific than `event`. For example, if the transaction + has `"select.pointer"` as user event, `"select"` and + `"select.pointer"` will match it. + */ + isUserEvent(event) { + let e = this.annotation(Transaction.userEvent); + return !!(e && (e == event || e.length > event.length && e.slice(0, event.length) == event && e[event.length] == ".")); + } + } + /** + Annotation used to store transaction timestamps. Automatically + added to every transaction, holding `Date.now()`. + */ + Transaction.time = /*@__PURE__*/Annotation.define(); + /** + Annotation used to associate a transaction with a user interface + event. Holds a string identifying the event, using a + dot-separated format to support attaching more specific + information. The events used by the core libraries are: + + - `"input"` when content is entered + - `"input.type"` for typed input + - `"input.type.compose"` for composition + - `"input.paste"` for pasted input + - `"input.drop"` when adding content with drag-and-drop + - `"input.complete"` when autocompleting + - `"delete"` when the user deletes content + - `"delete.selection"` when deleting the selection + - `"delete.forward"` when deleting forward from the selection + - `"delete.backward"` when deleting backward from the selection + - `"delete.cut"` when cutting to the clipboard + - `"move"` when content is moved + - `"move.drop"` when content is moved within the editor through drag-and-drop + - `"select"` when explicitly changing the selection + - `"select.pointer"` when selecting with a mouse or other pointing device + - `"undo"` and `"redo"` for history actions + + Use [`isUserEvent`](https://codemirror.net/6/docs/ref/#state.Transaction.isUserEvent) to check + whether the annotation matches a given event. + */ + Transaction.userEvent = /*@__PURE__*/Annotation.define(); + /** + Annotation indicating whether a transaction should be added to + the undo history or not. + */ + Transaction.addToHistory = /*@__PURE__*/Annotation.define(); + /** + Annotation indicating (when present and true) that a transaction + represents a change made by some other actor, not the user. This + is used, for example, to tag other people's changes in + collaborative editing. + */ + Transaction.remote = /*@__PURE__*/Annotation.define(); + function joinRanges(a, b) { + let result = []; + for (let iA = 0, iB = 0;;) { + let from, to; + if (iA < a.length && (iB == b.length || b[iB] >= a[iA])) { + from = a[iA++]; + to = a[iA++]; + } + else if (iB < b.length) { + from = b[iB++]; + to = b[iB++]; + } + else + return result; + if (!result.length || result[result.length - 1] < from) + result.push(from, to); + else if (result[result.length - 1] < to) + result[result.length - 1] = to; + } + } + function mergeTransaction(a, b, sequential) { + var _a; + let mapForA, mapForB, changes; + if (sequential) { + mapForA = b.changes; + mapForB = ChangeSet.empty(b.changes.length); + changes = a.changes.compose(b.changes); + } + else { + mapForA = b.changes.map(a.changes); + mapForB = a.changes.mapDesc(b.changes, true); + changes = a.changes.compose(mapForA); + } + return { + changes, + selection: b.selection ? b.selection.map(mapForB) : (_a = a.selection) === null || _a === void 0 ? void 0 : _a.map(mapForA), + effects: StateEffect.mapEffects(a.effects, mapForA).concat(StateEffect.mapEffects(b.effects, mapForB)), + annotations: a.annotations.length ? a.annotations.concat(b.annotations) : b.annotations, + scrollIntoView: a.scrollIntoView || b.scrollIntoView + }; + } + function resolveTransactionInner(state, spec, docSize) { + let sel = spec.selection, annotations = asArray$1(spec.annotations); + if (spec.userEvent) + annotations = annotations.concat(Transaction.userEvent.of(spec.userEvent)); + return { + changes: spec.changes instanceof ChangeSet ? spec.changes + : ChangeSet.of(spec.changes || [], docSize, state.facet(lineSeparator)), + selection: sel && (sel instanceof EditorSelection ? sel : EditorSelection.single(sel.anchor, sel.head)), + effects: asArray$1(spec.effects), + annotations, + scrollIntoView: !!spec.scrollIntoView + }; + } + function resolveTransaction(state, specs, filter) { + let s = resolveTransactionInner(state, specs.length ? specs[0] : {}, state.doc.length); + if (specs.length && specs[0].filter === false) + filter = false; + for (let i = 1; i < specs.length; i++) { + if (specs[i].filter === false) + filter = false; + let seq = !!specs[i].sequential; + s = mergeTransaction(s, resolveTransactionInner(state, specs[i], seq ? s.changes.newLength : state.doc.length), seq); + } + let tr = Transaction.create(state, s.changes, s.selection, s.effects, s.annotations, s.scrollIntoView); + return extendTransaction(filter ? filterTransaction(tr) : tr); + } + // Finish a transaction by applying filters if necessary. + function filterTransaction(tr) { + let state = tr.startState; + // Change filters + let result = true; + for (let filter of state.facet(changeFilter)) { + let value = filter(tr); + if (value === false) { + result = false; + break; + } + if (Array.isArray(value)) + result = result === true ? value : joinRanges(result, value); + } + if (result !== true) { + let changes, back; + if (result === false) { + back = tr.changes.invertedDesc; + changes = ChangeSet.empty(state.doc.length); + } + else { + let filtered = tr.changes.filter(result); + changes = filtered.changes; + back = filtered.filtered.mapDesc(filtered.changes).invertedDesc; + } + tr = Transaction.create(state, changes, tr.selection && tr.selection.map(back), StateEffect.mapEffects(tr.effects, back), tr.annotations, tr.scrollIntoView); + } + // Transaction filters + let filters = state.facet(transactionFilter); + for (let i = filters.length - 1; i >= 0; i--) { + let filtered = filters[i](tr); + if (filtered instanceof Transaction) + tr = filtered; + else if (Array.isArray(filtered) && filtered.length == 1 && filtered[0] instanceof Transaction) + tr = filtered[0]; + else + tr = resolveTransaction(state, asArray$1(filtered), false); + } + return tr; + } + function extendTransaction(tr) { + let state = tr.startState, extenders = state.facet(transactionExtender), spec = tr; + for (let i = extenders.length - 1; i >= 0; i--) { + let extension = extenders[i](tr); + if (extension && Object.keys(extension).length) + spec = mergeTransaction(tr, resolveTransactionInner(state, extension, tr.changes.newLength), true); + } + return spec == tr ? tr : Transaction.create(state, tr.changes, tr.selection, spec.effects, spec.annotations, spec.scrollIntoView); + } + const none$2 = []; + function asArray$1(value) { + return value == null ? none$2 : Array.isArray(value) ? value : [value]; + } + + /** + The categories produced by a [character + categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer). These are used + do things like selecting by word. + */ + var CharCategory = /*@__PURE__*/(function (CharCategory) { + /** + Word characters. + */ + CharCategory[CharCategory["Word"] = 0] = "Word"; + /** + Whitespace. + */ + CharCategory[CharCategory["Space"] = 1] = "Space"; + /** + Anything else. + */ + CharCategory[CharCategory["Other"] = 2] = "Other"; + return CharCategory})(CharCategory || (CharCategory = {})); + const nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + let wordChar; + try { + wordChar = /*@__PURE__*/new RegExp("[\\p{Alphabetic}\\p{Number}_]", "u"); + } + catch (_) { } + function hasWordChar(str) { + if (wordChar) + return wordChar.test(str); + for (let i = 0; i < str.length; i++) { + let ch = str[i]; + if (/\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))) + return true; + } + return false; + } + function makeCategorizer(wordChars) { + return (char) => { + if (!/\S/.test(char)) + return CharCategory.Space; + if (hasWordChar(char)) + return CharCategory.Word; + for (let i = 0; i < wordChars.length; i++) + if (char.indexOf(wordChars[i]) > -1) + return CharCategory.Word; + return CharCategory.Other; + }; + } + + /** + The editor state class is a persistent (immutable) data structure. + To update a state, you [create](https://codemirror.net/6/docs/ref/#state.EditorState.update) a + [transaction](https://codemirror.net/6/docs/ref/#state.Transaction), which produces a _new_ state + instance, without modifying the original object. + + As such, _never_ mutate properties of a state directly. That'll + just break things. + */ + class EditorState { + constructor( + /** + @internal + */ + config, + /** + The current document. + */ + doc, + /** + The current selection. + */ + selection, + /** + @internal + */ + values, computeSlot, tr) { + this.config = config; + this.doc = doc; + this.selection = selection; + this.values = values; + this.status = config.statusTemplate.slice(); + this.computeSlot = computeSlot; + // Fill in the computed state immediately, so that further queries + // for it made during the update return this state + if (tr) + tr._state = this; + for (let i = 0; i < this.config.dynamicSlots.length; i++) + ensureAddr(this, i << 1); + this.computeSlot = null; + } + field(field, require = true) { + let addr = this.config.address[field.id]; + if (addr == null) { + if (require) + throw new RangeError("Field is not present in this state"); + return undefined; + } + ensureAddr(this, addr); + return getAddr(this, addr); + } + /** + Create a [transaction](https://codemirror.net/6/docs/ref/#state.Transaction) that updates this + state. Any number of [transaction specs](https://codemirror.net/6/docs/ref/#state.TransactionSpec) + can be passed. Unless + [`sequential`](https://codemirror.net/6/docs/ref/#state.TransactionSpec.sequential) is set, the + [changes](https://codemirror.net/6/docs/ref/#state.TransactionSpec.changes) (if any) of each spec + are assumed to start in the _current_ document (not the document + produced by previous specs), and its + [selection](https://codemirror.net/6/docs/ref/#state.TransactionSpec.selection) and + [effects](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) are assumed to refer + to the document created by its _own_ changes. The resulting + transaction contains the combined effect of all the different + specs. For [selection](https://codemirror.net/6/docs/ref/#state.TransactionSpec.selection), later + specs take precedence over earlier ones. + */ + update(...specs) { + return resolveTransaction(this, specs, true); + } + /** + @internal + */ + applyTransaction(tr) { + let conf = this.config, { base, compartments } = conf; + for (let effect of tr.effects) { + if (effect.is(Compartment.reconfigure)) { + if (conf) { + compartments = new Map; + conf.compartments.forEach((val, key) => compartments.set(key, val)); + conf = null; + } + compartments.set(effect.value.compartment, effect.value.extension); + } + else if (effect.is(StateEffect.reconfigure)) { + conf = null; + base = effect.value; + } + else if (effect.is(StateEffect.appendConfig)) { + conf = null; + base = asArray$1(base).concat(effect.value); + } + } + let startValues; + if (!conf) { + conf = Configuration.resolve(base, compartments, this); + let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null); + startValues = intermediateState.values; + } + else { + startValues = tr.startState.values.slice(); + } + new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr); + } + /** + Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that + replaces every selection range with the given content. + */ + replaceSelection(text) { + if (typeof text == "string") + text = this.toText(text); + return this.changeByRange(range => ({ changes: { from: range.from, to: range.to, insert: text }, + range: EditorSelection.cursor(range.from + text.length) })); + } + /** + Create a set of changes and a new selection by running the given + function for each range in the active selection. The function + can return an optional set of changes (in the coordinate space + of the start document), plus an updated range (in the coordinate + space of the document produced by the call's own changes). This + method will merge all the changes and ranges into a single + changeset and selection, and return it as a [transaction + spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec), which can be passed to + [`update`](https://codemirror.net/6/docs/ref/#state.EditorState.update). + */ + changeByRange(f) { + let sel = this.selection; + let result1 = f(sel.ranges[0]); + let changes = this.changes(result1.changes), ranges = [result1.range]; + let effects = asArray$1(result1.effects); + for (let i = 1; i < sel.ranges.length; i++) { + let result = f(sel.ranges[i]); + let newChanges = this.changes(result.changes), newMapped = newChanges.map(changes); + for (let j = 0; j < i; j++) + ranges[j] = ranges[j].map(newMapped); + let mapBy = changes.mapDesc(newChanges, true); + ranges.push(result.range.map(mapBy)); + changes = changes.compose(newMapped); + effects = StateEffect.mapEffects(effects, newMapped).concat(StateEffect.mapEffects(asArray$1(result.effects), mapBy)); + } + return { + changes, + selection: EditorSelection.create(ranges, sel.mainIndex), + effects + }; + } + /** + Create a [change set](https://codemirror.net/6/docs/ref/#state.ChangeSet) from the given change + description, taking the state's document length and line + separator into account. + */ + changes(spec = []) { + if (spec instanceof ChangeSet) + return spec; + return ChangeSet.of(spec, this.doc.length, this.facet(EditorState.lineSeparator)); + } + /** + Using the state's [line + separator](https://codemirror.net/6/docs/ref/#state.EditorState^lineSeparator), create a + [`Text`](https://codemirror.net/6/docs/ref/#state.Text) instance from the given string. + */ + toText(string) { + return Text.of(string.split(this.facet(EditorState.lineSeparator) || DefaultSplit)); + } + /** + Return the given range of the document as a string. + */ + sliceDoc(from = 0, to = this.doc.length) { + return this.doc.sliceString(from, to, this.lineBreak); + } + /** + Get the value of a state [facet](https://codemirror.net/6/docs/ref/#state.Facet). + */ + facet(facet) { + let addr = this.config.address[facet.id]; + if (addr == null) + return facet.default; + ensureAddr(this, addr); + return getAddr(this, addr); + } + /** + Convert this state to a JSON-serializable object. When custom + fields should be serialized, you can pass them in as an object + mapping property names (in the resulting object, which should + not use `doc` or `selection`) to fields. + */ + toJSON(fields) { + let result = { + doc: this.sliceDoc(), + selection: this.selection.toJSON() + }; + if (fields) + for (let prop in fields) { + let value = fields[prop]; + if (value instanceof StateField) + result[prop] = value.spec.toJSON(this.field(fields[prop]), this); + } + return result; + } + /** + Deserialize a state from its JSON representation. When custom + fields should be deserialized, pass the same object you passed + to [`toJSON`](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) when serializing as + third argument. + */ + static fromJSON(json, config = {}, fields) { + if (!json || typeof json.doc != "string") + throw new RangeError("Invalid JSON representation for EditorState"); + let fieldInit = []; + if (fields) + for (let prop in fields) { + let field = fields[prop], value = json[prop]; + fieldInit.push(field.init(state => field.spec.fromJSON(value, state))); + } + return EditorState.create({ + doc: json.doc, + selection: EditorSelection.fromJSON(json.selection), + extensions: config.extensions ? fieldInit.concat([config.extensions]) : fieldInit + }); + } + /** + Create a new state. You'll usually only need this when + initializing an editor—updated states are created by applying + transactions. + */ + static create(config = {}) { + let configuration = Configuration.resolve(config.extensions || [], new Map); + let doc = config.doc instanceof Text ? config.doc + : Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit)); + let selection = !config.selection ? EditorSelection.single(0) + : config.selection instanceof EditorSelection ? config.selection + : EditorSelection.single(config.selection.anchor, config.selection.head); + checkSelection(selection, doc.length); + if (!configuration.staticFacet(allowMultipleSelections)) + selection = selection.asSingle(); + return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null); + } + /** + The size (in columns) of a tab in the document, determined by + the [`tabSize`](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize) facet. + */ + get tabSize() { return this.facet(EditorState.tabSize); } + /** + Get the proper [line-break](https://codemirror.net/6/docs/ref/#state.EditorState^lineSeparator) + string for this state. + */ + get lineBreak() { return this.facet(EditorState.lineSeparator) || "\n"; } + /** + Returns true when the editor is + [configured](https://codemirror.net/6/docs/ref/#state.EditorState^readOnly) to be read-only. + */ + get readOnly() { return this.facet(readOnly); } + /** + Look up a translation for the given phrase (via the + [`phrases`](https://codemirror.net/6/docs/ref/#state.EditorState^phrases) facet), or return the + original string if no translation is found. + + If additional arguments are passed, they will be inserted in + place of markers like `$1` (for the first value) and `$2`, etc. + A single `$` is equivalent to `$1`, and `$$` will produce a + literal dollar sign. + */ + phrase(phrase, ...insert) { + for (let map of this.facet(EditorState.phrases)) + if (Object.prototype.hasOwnProperty.call(map, phrase)) { + phrase = map[phrase]; + break; + } + if (insert.length) + phrase = phrase.replace(/\$(\$|\d*)/g, (m, i) => { + if (i == "$") + return "$"; + let n = +(i || 1); + return !n || n > insert.length ? m : insert[n - 1]; + }); + return phrase; + } + /** + Find the values for a given language data field, provided by the + the [`languageData`](https://codemirror.net/6/docs/ref/#state.EditorState^languageData) facet. + */ + languageDataAt(name, pos, side = -1) { + let values = []; + for (let provider of this.facet(languageData)) { + for (let result of provider(this, pos, side)) { + if (Object.prototype.hasOwnProperty.call(result, name)) + values.push(result[name]); + } + } + return values; + } + /** + Return a function that can categorize strings (expected to + represent a single [grapheme cluster](https://codemirror.net/6/docs/ref/#state.findClusterBreak)) + into one of: + + - Word (contains an alphanumeric character or a character + explicitly listed in the local language's `"wordChars"` + language data, which should be a string) + - Space (contains only whitespace) + - Other (anything else) + */ + charCategorizer(at) { + return makeCategorizer(this.languageDataAt("wordChars", at).join("")); + } + /** + Find the word at the given position, meaning the range + containing all [word](https://codemirror.net/6/docs/ref/#state.CharCategory.Word) characters + around it. If no word characters are adjacent to the position, + this returns null. + */ + wordAt(pos) { + let { text, from, length } = this.doc.lineAt(pos); + let cat = this.charCategorizer(pos); + let start = pos - from, end = pos - from; + while (start > 0) { + let prev = findClusterBreak(text, start, false); + if (cat(text.slice(prev, start)) != CharCategory.Word) + break; + start = prev; + } + while (end < length) { + let next = findClusterBreak(text, end); + if (cat(text.slice(end, next)) != CharCategory.Word) + break; + end = next; + } + return start == end ? null : EditorSelection.range(start + from, end + from); + } + } + /** + A facet that, when enabled, causes the editor to allow multiple + ranges to be selected. Be careful though, because by default the + editor relies on the native DOM selection, which cannot handle + multiple selections. An extension like + [`drawSelection`](https://codemirror.net/6/docs/ref/#view.drawSelection) can be used to make + secondary selections visible to the user. + */ + EditorState.allowMultipleSelections = allowMultipleSelections; + /** + Configures the tab size to use in this state. The first + (highest-precedence) value of the facet is used. If no value is + given, this defaults to 4. + */ + EditorState.tabSize = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : 4 + }); + /** + The line separator to use. By default, any of `"\n"`, `"\r\n"` + and `"\r"` is treated as a separator when splitting lines, and + lines are joined with `"\n"`. + + When you configure a value here, only that precise separator + will be used, allowing you to round-trip documents through the + editor without normalizing line separators. + */ + EditorState.lineSeparator = lineSeparator; + /** + This facet controls the value of the + [`readOnly`](https://codemirror.net/6/docs/ref/#state.EditorState.readOnly) getter, which is + consulted by commands and extensions that implement editing + functionality to determine whether they should apply. It + defaults to false, but when its highest-precedence value is + `true`, such functionality disables itself. + + Not to be confused with + [`EditorView.editable`](https://codemirror.net/6/docs/ref/#view.EditorView^editable), which + controls whether the editor's DOM is set to be editable (and + thus focusable). + */ + EditorState.readOnly = readOnly; + /** + Registers translation phrases. The + [`phrase`](https://codemirror.net/6/docs/ref/#state.EditorState.phrase) method will look through + all objects registered with this facet to find translations for + its argument. + */ + EditorState.phrases = /*@__PURE__*/Facet.define({ + compare(a, b) { + let kA = Object.keys(a), kB = Object.keys(b); + return kA.length == kB.length && kA.every(k => a[k] == b[k]); + } + }); + /** + A facet used to register [language + data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt) providers. + */ + EditorState.languageData = languageData; + /** + Facet used to register change filters, which are called for each + transaction (unless explicitly + [disabled](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter)), and can suppress + part of the transaction's changes. + + Such a function can return `true` to indicate that it doesn't + want to do anything, `false` to completely stop the changes in + the transaction, or a set of ranges in which changes should be + suppressed. Such ranges are represented as an array of numbers, + with each pair of two numbers indicating the start and end of a + range. So for example `[10, 20, 100, 110]` suppresses changes + between 10 and 20, and between 100 and 110. + */ + EditorState.changeFilter = changeFilter; + /** + Facet used to register a hook that gets a chance to update or + replace transaction specs before they are applied. This will + only be applied for transactions that don't have + [`filter`](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter) set to `false`. You + can either return a single transaction spec (possibly the input + transaction), or an array of specs (which will be combined in + the same way as the arguments to + [`EditorState.update`](https://codemirror.net/6/docs/ref/#state.EditorState.update)). + + When possible, it is recommended to avoid accessing + [`Transaction.state`](https://codemirror.net/6/docs/ref/#state.Transaction.state) in a filter, + since it will force creation of a state that will then be + discarded again, if the transaction is actually filtered. + + (This functionality should be used with care. Indiscriminately + modifying transaction is likely to break something or degrade + the user experience.) + */ + EditorState.transactionFilter = transactionFilter; + /** + This is a more limited form of + [`transactionFilter`](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter), + which can only add + [annotations](https://codemirror.net/6/docs/ref/#state.TransactionSpec.annotations) and + [effects](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects). _But_, this type + of filter runs even if the transaction has disabled regular + [filtering](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter), making it suitable + for effects that don't need to touch the changes or selection, + but do want to process every transaction. + + Extenders run _after_ filters, when both are present. + */ + EditorState.transactionExtender = transactionExtender; + Compartment.reconfigure = /*@__PURE__*/StateEffect.define(); + + /** + Utility function for combining behaviors to fill in a config + object from an array of provided configs. `defaults` should hold + default values for all optional fields in `Config`. + + The function will, by default, error + when a field gets two values that aren't `===`-equal, but you can + provide combine functions per field to do something else. + */ + function combineConfig(configs, defaults, // Should hold only the optional properties of Config, but I haven't managed to express that + combine = {}) { + let result = {}; + for (let config of configs) + for (let key of Object.keys(config)) { + let value = config[key], current = result[key]; + if (current === undefined) + result[key] = value; + else if (current === value || value === undefined) ; // No conflict + else if (Object.hasOwnProperty.call(combine, key)) + result[key] = combine[key](current, value); + else + throw new Error("Config merge conflict for field " + key); + } + for (let key in defaults) + if (result[key] === undefined) + result[key] = defaults[key]; + return result; + } + + /** + Each range is associated with a value, which must inherit from + this class. + */ + class RangeValue { + /** + Compare this value with another value. Used when comparing + rangesets. The default implementation compares by identity. + Unless you are only creating a fixed number of unique instances + of your value type, it is a good idea to implement this + properly. + */ + eq(other) { return this == other; } + /** + Create a [range](https://codemirror.net/6/docs/ref/#state.Range) with this value. + */ + range(from, to = from) { return Range$1.create(from, to, this); } + } + RangeValue.prototype.startSide = RangeValue.prototype.endSide = 0; + RangeValue.prototype.point = false; + RangeValue.prototype.mapMode = MapMode.TrackDel; + /** + A range associates a value with a range of positions. + */ + class Range$1 { + constructor( + /** + The range's start position. + */ + from, + /** + Its end position. + */ + to, + /** + The value associated with this range. + */ + value) { + this.from = from; + this.to = to; + this.value = value; + } + /** + @internal + */ + static create(from, to, value) { + return new Range$1(from, to, value); + } + } + function cmpRange(a, b) { + return a.from - b.from || a.value.startSide - b.value.startSide; + } + class Chunk { + constructor(from, to, value, + // Chunks are marked with the largest point that occurs + // in them (or -1 for no points), so that scans that are + // only interested in points (such as the + // heightmap-related logic) can skip range-only chunks. + maxPoint) { + this.from = from; + this.to = to; + this.value = value; + this.maxPoint = maxPoint; + } + get length() { return this.to[this.to.length - 1]; } + // Find the index of the given position and side. Use the ranges' + // `from` pos when `end == false`, `to` when `end == true`. + findIndex(pos, side, end, startAt = 0) { + let arr = end ? this.to : this.from; + for (let lo = startAt, hi = arr.length;;) { + if (lo == hi) + return lo; + let mid = (lo + hi) >> 1; + let diff = arr[mid] - pos || (end ? this.value[mid].endSide : this.value[mid].startSide) - side; + if (mid == lo) + return diff >= 0 ? lo : hi; + if (diff >= 0) + hi = mid; + else + lo = mid + 1; + } + } + between(offset, from, to, f) { + for (let i = this.findIndex(from, -1000000000 /* Far */, true), e = this.findIndex(to, 1000000000 /* Far */, false, i); i < e; i++) + if (f(this.from[i] + offset, this.to[i] + offset, this.value[i]) === false) + return false; + } + map(offset, changes) { + let value = [], from = [], to = [], newPos = -1, maxPoint = -1; + for (let i = 0; i < this.value.length; i++) { + let val = this.value[i], curFrom = this.from[i] + offset, curTo = this.to[i] + offset, newFrom, newTo; + if (curFrom == curTo) { + let mapped = changes.mapPos(curFrom, val.startSide, val.mapMode); + if (mapped == null) + continue; + newFrom = newTo = mapped; + if (val.startSide != val.endSide) { + newTo = changes.mapPos(curFrom, val.endSide); + if (newTo < newFrom) + continue; + } + } + else { + newFrom = changes.mapPos(curFrom, val.startSide); + newTo = changes.mapPos(curTo, val.endSide); + if (newFrom > newTo || newFrom == newTo && val.startSide > 0 && val.endSide <= 0) + continue; + } + if ((newTo - newFrom || val.endSide - val.startSide) < 0) + continue; + if (newPos < 0) + newPos = newFrom; + if (val.point) + maxPoint = Math.max(maxPoint, newTo - newFrom); + value.push(val); + from.push(newFrom - newPos); + to.push(newTo - newPos); + } + return { mapped: value.length ? new Chunk(from, to, value, maxPoint) : null, pos: newPos }; + } + } + /** + A range set stores a collection of [ranges](https://codemirror.net/6/docs/ref/#state.Range) in a + way that makes them efficient to [map](https://codemirror.net/6/docs/ref/#state.RangeSet.map) and + [update](https://codemirror.net/6/docs/ref/#state.RangeSet.update). This is an immutable data + structure. + */ + class RangeSet { + constructor( + /** + @internal + */ + chunkPos, + /** + @internal + */ + chunk, + /** + @internal + */ + nextLayer, + /** + @internal + */ + maxPoint) { + this.chunkPos = chunkPos; + this.chunk = chunk; + this.nextLayer = nextLayer; + this.maxPoint = maxPoint; + } + /** + @internal + */ + static create(chunkPos, chunk, nextLayer, maxPoint) { + return new RangeSet(chunkPos, chunk, nextLayer, maxPoint); + } + /** + @internal + */ + get length() { + let last = this.chunk.length - 1; + return last < 0 ? 0 : Math.max(this.chunkEnd(last), this.nextLayer.length); + } + /** + The number of ranges in the set. + */ + get size() { + if (this.isEmpty) + return 0; + let size = this.nextLayer.size; + for (let chunk of this.chunk) + size += chunk.value.length; + return size; + } + /** + @internal + */ + chunkEnd(index) { + return this.chunkPos[index] + this.chunk[index].length; + } + /** + Update the range set, optionally adding new ranges or filtering + out existing ones. + + (Note: The type parameter is just there as a kludge to work + around TypeScript variance issues that prevented `RangeSet` + from being a subtype of `RangeSet` when `X` is a subtype of + `Y`.) + */ + update(updateSpec) { + let { add = [], sort = false, filterFrom = 0, filterTo = this.length } = updateSpec; + let filter = updateSpec.filter; + if (add.length == 0 && !filter) + return this; + if (sort) + add = add.slice().sort(cmpRange); + if (this.isEmpty) + return add.length ? RangeSet.of(add) : this; + let cur = new LayerCursor(this, null, -1).goto(0), i = 0, spill = []; + let builder = new RangeSetBuilder(); + while (cur.value || i < add.length) { + if (i < add.length && (cur.from - add[i].from || cur.startSide - add[i].value.startSide) >= 0) { + let range = add[i++]; + if (!builder.addInner(range.from, range.to, range.value)) + spill.push(range); + } + else if (cur.rangeIndex == 1 && cur.chunkIndex < this.chunk.length && + (i == add.length || this.chunkEnd(cur.chunkIndex) < add[i].from) && + (!filter || filterFrom > this.chunkEnd(cur.chunkIndex) || filterTo < this.chunkPos[cur.chunkIndex]) && + builder.addChunk(this.chunkPos[cur.chunkIndex], this.chunk[cur.chunkIndex])) { + cur.nextChunk(); + } + else { + if (!filter || filterFrom > cur.to || filterTo < cur.from || filter(cur.from, cur.to, cur.value)) { + if (!builder.addInner(cur.from, cur.to, cur.value)) + spill.push(Range$1.create(cur.from, cur.to, cur.value)); + } + cur.next(); + } + } + return builder.finishInner(this.nextLayer.isEmpty && !spill.length ? RangeSet.empty + : this.nextLayer.update({ add: spill, filter, filterFrom, filterTo })); + } + /** + Map this range set through a set of changes, return the new set. + */ + map(changes) { + if (changes.empty || this.isEmpty) + return this; + let chunks = [], chunkPos = [], maxPoint = -1; + for (let i = 0; i < this.chunk.length; i++) { + let start = this.chunkPos[i], chunk = this.chunk[i]; + let touch = changes.touchesRange(start, start + chunk.length); + if (touch === false) { + maxPoint = Math.max(maxPoint, chunk.maxPoint); + chunks.push(chunk); + chunkPos.push(changes.mapPos(start)); + } + else if (touch === true) { + let { mapped, pos } = chunk.map(start, changes); + if (mapped) { + maxPoint = Math.max(maxPoint, mapped.maxPoint); + chunks.push(mapped); + chunkPos.push(pos); + } + } + } + let next = this.nextLayer.map(changes); + return chunks.length == 0 ? next : new RangeSet(chunkPos, chunks, next || RangeSet.empty, maxPoint); + } + /** + Iterate over the ranges that touch the region `from` to `to`, + calling `f` for each. There is no guarantee that the ranges will + be reported in any specific order. When the callback returns + `false`, iteration stops. + */ + between(from, to, f) { + if (this.isEmpty) + return; + for (let i = 0; i < this.chunk.length; i++) { + let start = this.chunkPos[i], chunk = this.chunk[i]; + if (to >= start && from <= start + chunk.length && + chunk.between(start, from - start, to - start, f) === false) + return; + } + this.nextLayer.between(from, to, f); + } + /** + Iterate over the ranges in this set, in order, including all + ranges that end at or after `from`. + */ + iter(from = 0) { + return HeapCursor.from([this]).goto(from); + } + /** + @internal + */ + get isEmpty() { return this.nextLayer == this; } + /** + Iterate over the ranges in a collection of sets, in order, + starting from `from`. + */ + static iter(sets, from = 0) { + return HeapCursor.from(sets).goto(from); + } + /** + Iterate over two groups of sets, calling methods on `comparator` + to notify it of possible differences. + */ + static compare(oldSets, newSets, + /** + This indicates how the underlying data changed between these + ranges, and is needed to synchronize the iteration. `from` and + `to` are coordinates in the _new_ space, after these changes. + */ + textDiff, comparator, + /** + Can be used to ignore all non-point ranges, and points below + the given size. When -1, all ranges are compared. + */ + minPointSize = -1) { + let a = oldSets.filter(set => set.maxPoint > 0 || !set.isEmpty && set.maxPoint >= minPointSize); + let b = newSets.filter(set => set.maxPoint > 0 || !set.isEmpty && set.maxPoint >= minPointSize); + let sharedChunks = findSharedChunks(a, b, textDiff); + let sideA = new SpanCursor(a, sharedChunks, minPointSize); + let sideB = new SpanCursor(b, sharedChunks, minPointSize); + textDiff.iterGaps((fromA, fromB, length) => compare(sideA, fromA, sideB, fromB, length, comparator)); + if (textDiff.empty && textDiff.length == 0) + compare(sideA, 0, sideB, 0, 0, comparator); + } + /** + Compare the contents of two groups of range sets, returning true + if they are equivalent in the given range. + */ + static eq(oldSets, newSets, from = 0, to) { + if (to == null) + to = 1000000000 /* Far */; + let a = oldSets.filter(set => !set.isEmpty && newSets.indexOf(set) < 0); + let b = newSets.filter(set => !set.isEmpty && oldSets.indexOf(set) < 0); + if (a.length != b.length) + return false; + if (!a.length) + return true; + let sharedChunks = findSharedChunks(a, b); + let sideA = new SpanCursor(a, sharedChunks, 0).goto(from), sideB = new SpanCursor(b, sharedChunks, 0).goto(from); + for (;;) { + if (sideA.to != sideB.to || + !sameValues(sideA.active, sideB.active) || + sideA.point && (!sideB.point || !sideA.point.eq(sideB.point))) + return false; + if (sideA.to > to) + return true; + sideA.next(); + sideB.next(); + } + } + /** + Iterate over a group of range sets at the same time, notifying + the iterator about the ranges covering every given piece of + content. Returns the open count (see + [`SpanIterator.span`](https://codemirror.net/6/docs/ref/#state.SpanIterator.span)) at the end + of the iteration. + */ + static spans(sets, from, to, iterator, + /** + When given and greater than -1, only points of at least this + size are taken into account. + */ + minPointSize = -1) { + let cursor = new SpanCursor(sets, null, minPointSize).goto(from), pos = from; + let open = cursor.openStart; + for (;;) { + let curTo = Math.min(cursor.to, to); + if (cursor.point) { + iterator.point(pos, curTo, cursor.point, cursor.activeForPoint(cursor.to), open, cursor.pointRank); + open = cursor.openEnd(curTo) + (cursor.to > curTo ? 1 : 0); + } + else if (curTo > pos) { + iterator.span(pos, curTo, cursor.active, open); + open = cursor.openEnd(curTo); + } + if (cursor.to > to) + break; + pos = cursor.to; + cursor.next(); + } + return open; + } + /** + Create a range set for the given range or array of ranges. By + default, this expects the ranges to be _sorted_ (by start + position and, if two start at the same position, + `value.startSide`). You can pass `true` as second argument to + cause the method to sort them. + */ + static of(ranges, sort = false) { + let build = new RangeSetBuilder(); + for (let range of ranges instanceof Range$1 ? [ranges] : sort ? lazySort(ranges) : ranges) + build.add(range.from, range.to, range.value); + return build.finish(); + } + } + /** + The empty set of ranges. + */ + RangeSet.empty = /*@__PURE__*/new RangeSet([], [], null, -1); + function lazySort(ranges) { + if (ranges.length > 1) + for (let prev = ranges[0], i = 1; i < ranges.length; i++) { + let cur = ranges[i]; + if (cmpRange(prev, cur) > 0) + return ranges.slice().sort(cmpRange); + prev = cur; + } + return ranges; + } + RangeSet.empty.nextLayer = RangeSet.empty; + /** + A range set builder is a data structure that helps build up a + [range set](https://codemirror.net/6/docs/ref/#state.RangeSet) directly, without first allocating + an array of [`Range`](https://codemirror.net/6/docs/ref/#state.Range) objects. + */ + class RangeSetBuilder { + /** + Create an empty builder. + */ + constructor() { + this.chunks = []; + this.chunkPos = []; + this.chunkStart = -1; + this.last = null; + this.lastFrom = -1000000000 /* Far */; + this.lastTo = -1000000000 /* Far */; + this.from = []; + this.to = []; + this.value = []; + this.maxPoint = -1; + this.setMaxPoint = -1; + this.nextLayer = null; + } + finishChunk(newArrays) { + this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint)); + this.chunkPos.push(this.chunkStart); + this.chunkStart = -1; + this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint); + this.maxPoint = -1; + if (newArrays) { + this.from = []; + this.to = []; + this.value = []; + } + } + /** + Add a range. Ranges should be added in sorted (by `from` and + `value.startSide`) order. + */ + add(from, to, value) { + if (!this.addInner(from, to, value)) + (this.nextLayer || (this.nextLayer = new RangeSetBuilder)).add(from, to, value); + } + /** + @internal + */ + addInner(from, to, value) { + let diff = from - this.lastTo || value.startSide - this.last.endSide; + if (diff <= 0 && (from - this.lastFrom || value.startSide - this.last.startSide) < 0) + throw new Error("Ranges must be added sorted by `from` position and `startSide`"); + if (diff < 0) + return false; + if (this.from.length == 250 /* ChunkSize */) + this.finishChunk(true); + if (this.chunkStart < 0) + this.chunkStart = from; + this.from.push(from - this.chunkStart); + this.to.push(to - this.chunkStart); + this.last = value; + this.lastFrom = from; + this.lastTo = to; + this.value.push(value); + if (value.point) + this.maxPoint = Math.max(this.maxPoint, to - from); + return true; + } + /** + @internal + */ + addChunk(from, chunk) { + if ((from - this.lastTo || chunk.value[0].startSide - this.last.endSide) < 0) + return false; + if (this.from.length) + this.finishChunk(true); + this.setMaxPoint = Math.max(this.setMaxPoint, chunk.maxPoint); + this.chunks.push(chunk); + this.chunkPos.push(from); + let last = chunk.value.length - 1; + this.last = chunk.value[last]; + this.lastFrom = chunk.from[last] + from; + this.lastTo = chunk.to[last] + from; + return true; + } + /** + Finish the range set. Returns the new set. The builder can't be + used anymore after this has been called. + */ + finish() { return this.finishInner(RangeSet.empty); } + /** + @internal + */ + finishInner(next) { + if (this.from.length) + this.finishChunk(false); + if (this.chunks.length == 0) + return next; + let result = RangeSet.create(this.chunkPos, this.chunks, this.nextLayer ? this.nextLayer.finishInner(next) : next, this.setMaxPoint); + this.from = null; // Make sure further `add` calls produce errors + return result; + } + } + function findSharedChunks(a, b, textDiff) { + let inA = new Map(); + for (let set of a) + for (let i = 0; i < set.chunk.length; i++) + if (set.chunk[i].maxPoint <= 0) + inA.set(set.chunk[i], set.chunkPos[i]); + let shared = new Set(); + for (let set of b) + for (let i = 0; i < set.chunk.length; i++) { + let known = inA.get(set.chunk[i]); + if (known != null && (textDiff ? textDiff.mapPos(known) : known) == set.chunkPos[i] && + !(textDiff === null || textDiff === void 0 ? void 0 : textDiff.touchesRange(known, known + set.chunk[i].length))) + shared.add(set.chunk[i]); + } + return shared; + } + class LayerCursor { + constructor(layer, skip, minPoint, rank = 0) { + this.layer = layer; + this.skip = skip; + this.minPoint = minPoint; + this.rank = rank; + } + get startSide() { return this.value ? this.value.startSide : 0; } + get endSide() { return this.value ? this.value.endSide : 0; } + goto(pos, side = -1000000000 /* Far */) { + this.chunkIndex = this.rangeIndex = 0; + this.gotoInner(pos, side, false); + return this; + } + gotoInner(pos, side, forward) { + while (this.chunkIndex < this.layer.chunk.length) { + let next = this.layer.chunk[this.chunkIndex]; + if (!(this.skip && this.skip.has(next) || + this.layer.chunkEnd(this.chunkIndex) < pos || + next.maxPoint < this.minPoint)) + break; + this.chunkIndex++; + forward = false; + } + if (this.chunkIndex < this.layer.chunk.length) { + let rangeIndex = this.layer.chunk[this.chunkIndex].findIndex(pos - this.layer.chunkPos[this.chunkIndex], side, true); + if (!forward || this.rangeIndex < rangeIndex) + this.setRangeIndex(rangeIndex); + } + this.next(); + } + forward(pos, side) { + if ((this.to - pos || this.endSide - side) < 0) + this.gotoInner(pos, side, true); + } + next() { + for (;;) { + if (this.chunkIndex == this.layer.chunk.length) { + this.from = this.to = 1000000000 /* Far */; + this.value = null; + break; + } + else { + let chunkPos = this.layer.chunkPos[this.chunkIndex], chunk = this.layer.chunk[this.chunkIndex]; + let from = chunkPos + chunk.from[this.rangeIndex]; + this.from = from; + this.to = chunkPos + chunk.to[this.rangeIndex]; + this.value = chunk.value[this.rangeIndex]; + this.setRangeIndex(this.rangeIndex + 1); + if (this.minPoint < 0 || this.value.point && this.to - this.from >= this.minPoint) + break; + } + } + } + setRangeIndex(index) { + if (index == this.layer.chunk[this.chunkIndex].value.length) { + this.chunkIndex++; + if (this.skip) { + while (this.chunkIndex < this.layer.chunk.length && this.skip.has(this.layer.chunk[this.chunkIndex])) + this.chunkIndex++; + } + this.rangeIndex = 0; + } + else { + this.rangeIndex = index; + } + } + nextChunk() { + this.chunkIndex++; + this.rangeIndex = 0; + this.next(); + } + compare(other) { + return this.from - other.from || this.startSide - other.startSide || this.rank - other.rank || + this.to - other.to || this.endSide - other.endSide; + } + } + class HeapCursor { + constructor(heap) { + this.heap = heap; + } + static from(sets, skip = null, minPoint = -1) { + let heap = []; + for (let i = 0; i < sets.length; i++) { + for (let cur = sets[i]; !cur.isEmpty; cur = cur.nextLayer) { + if (cur.maxPoint >= minPoint) + heap.push(new LayerCursor(cur, skip, minPoint, i)); + } + } + return heap.length == 1 ? heap[0] : new HeapCursor(heap); + } + get startSide() { return this.value ? this.value.startSide : 0; } + goto(pos, side = -1000000000 /* Far */) { + for (let cur of this.heap) + cur.goto(pos, side); + for (let i = this.heap.length >> 1; i >= 0; i--) + heapBubble(this.heap, i); + this.next(); + return this; + } + forward(pos, side) { + for (let cur of this.heap) + cur.forward(pos, side); + for (let i = this.heap.length >> 1; i >= 0; i--) + heapBubble(this.heap, i); + if ((this.to - pos || this.value.endSide - side) < 0) + this.next(); + } + next() { + if (this.heap.length == 0) { + this.from = this.to = 1000000000 /* Far */; + this.value = null; + this.rank = -1; + } + else { + let top = this.heap[0]; + this.from = top.from; + this.to = top.to; + this.value = top.value; + this.rank = top.rank; + if (top.value) + top.next(); + heapBubble(this.heap, 0); + } + } + } + function heapBubble(heap, index) { + for (let cur = heap[index];;) { + let childIndex = (index << 1) + 1; + if (childIndex >= heap.length) + break; + let child = heap[childIndex]; + if (childIndex + 1 < heap.length && child.compare(heap[childIndex + 1]) >= 0) { + child = heap[childIndex + 1]; + childIndex++; + } + if (cur.compare(child) < 0) + break; + heap[childIndex] = cur; + heap[index] = child; + index = childIndex; + } + } + class SpanCursor { + constructor(sets, skip, minPoint) { + this.minPoint = minPoint; + this.active = []; + this.activeTo = []; + this.activeRank = []; + this.minActive = -1; + // A currently active point range, if any + this.point = null; + this.pointFrom = 0; + this.pointRank = 0; + this.to = -1000000000 /* Far */; + this.endSide = 0; + this.openStart = -1; + this.cursor = HeapCursor.from(sets, skip, minPoint); + } + goto(pos, side = -1000000000 /* Far */) { + this.cursor.goto(pos, side); + this.active.length = this.activeTo.length = this.activeRank.length = 0; + this.minActive = -1; + this.to = pos; + this.endSide = side; + this.openStart = -1; + this.next(); + return this; + } + forward(pos, side) { + while (this.minActive > -1 && (this.activeTo[this.minActive] - pos || this.active[this.minActive].endSide - side) < 0) + this.removeActive(this.minActive); + this.cursor.forward(pos, side); + } + removeActive(index) { + remove(this.active, index); + remove(this.activeTo, index); + remove(this.activeRank, index); + this.minActive = findMinIndex(this.active, this.activeTo); + } + addActive(trackOpen) { + let i = 0, { value, to, rank } = this.cursor; + while (i < this.activeRank.length && this.activeRank[i] <= rank) + i++; + insert(this.active, i, value); + insert(this.activeTo, i, to); + insert(this.activeRank, i, rank); + if (trackOpen) + insert(trackOpen, i, this.cursor.from); + this.minActive = findMinIndex(this.active, this.activeTo); + } + // After calling this, if `this.point` != null, the next range is a + // point. Otherwise, it's a regular range, covered by `this.active`. + next() { + let from = this.to, wasPoint = this.point; + this.point = null; + let trackOpen = this.openStart < 0 ? [] : null, trackExtra = 0; + for (;;) { + let a = this.minActive; + if (a > -1 && (this.activeTo[a] - this.cursor.from || this.active[a].endSide - this.cursor.startSide) < 0) { + if (this.activeTo[a] > from) { + this.to = this.activeTo[a]; + this.endSide = this.active[a].endSide; + break; + } + this.removeActive(a); + if (trackOpen) + remove(trackOpen, a); + } + else if (!this.cursor.value) { + this.to = this.endSide = 1000000000 /* Far */; + break; + } + else if (this.cursor.from > from) { + this.to = this.cursor.from; + this.endSide = this.cursor.startSide; + break; + } + else { + let nextVal = this.cursor.value; + if (!nextVal.point) { // Opening a range + this.addActive(trackOpen); + this.cursor.next(); + } + else if (wasPoint && this.cursor.to == this.to && this.cursor.from < this.cursor.to) { + // Ignore any non-empty points that end precisely at the end of the prev point + this.cursor.next(); + } + else { // New point + this.point = nextVal; + this.pointFrom = this.cursor.from; + this.pointRank = this.cursor.rank; + this.to = this.cursor.to; + this.endSide = nextVal.endSide; + if (this.cursor.from < from) + trackExtra = 1; + this.cursor.next(); + this.forward(this.to, this.endSide); + break; + } + } + } + if (trackOpen) { + let openStart = 0; + while (openStart < trackOpen.length && trackOpen[openStart] < from) + openStart++; + this.openStart = openStart + trackExtra; + } + } + activeForPoint(to) { + if (!this.active.length) + return this.active; + let active = []; + for (let i = this.active.length - 1; i >= 0; i--) { + if (this.activeRank[i] < this.pointRank) + break; + if (this.activeTo[i] > to || this.activeTo[i] == to && this.active[i].endSide >= this.point.endSide) + active.push(this.active[i]); + } + return active.reverse(); + } + openEnd(to) { + let open = 0; + for (let i = this.activeTo.length - 1; i >= 0 && this.activeTo[i] > to; i--) + open++; + return open; + } + } + function compare(a, startA, b, startB, length, comparator) { + a.goto(startA); + b.goto(startB); + let endB = startB + length; + let pos = startB, dPos = startB - startA; + for (;;) { + let diff = (a.to + dPos) - b.to || a.endSide - b.endSide; + let end = diff < 0 ? a.to + dPos : b.to, clipEnd = Math.min(end, endB); + if (a.point || b.point) { + if (!(a.point && b.point && (a.point == b.point || a.point.eq(b.point)) && + sameValues(a.activeForPoint(a.to + dPos), b.activeForPoint(b.to)))) + comparator.comparePoint(pos, clipEnd, a.point, b.point); + } + else { + if (clipEnd > pos && !sameValues(a.active, b.active)) + comparator.compareRange(pos, clipEnd, a.active, b.active); + } + if (end > endB) + break; + pos = end; + if (diff <= 0) + a.next(); + if (diff >= 0) + b.next(); + } + } + function sameValues(a, b) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (a[i] != b[i] && !a[i].eq(b[i])) + return false; + return true; + } + function remove(array, index) { + for (let i = index, e = array.length - 1; i < e; i++) + array[i] = array[i + 1]; + array.pop(); + } + function insert(array, index, value) { + for (let i = array.length - 1; i >= index; i--) + array[i + 1] = array[i]; + array[index] = value; + } + function findMinIndex(value, array) { + let found = -1, foundPos = 1000000000 /* Far */; + for (let i = 0; i < array.length; i++) + if ((array[i] - foundPos || value[i].endSide - value[found].endSide) < 0) { + found = i; + foundPos = array[i]; + } + return found; + } + + /** + Count the column position at the given offset into the string, + taking extending characters and tab size into account. + */ + function countColumn(string, tabSize, to = string.length) { + let n = 0; + for (let i = 0; i < to;) { + if (string.charCodeAt(i) == 9) { + n += tabSize - (n % tabSize); + i++; + } + else { + n++; + i = findClusterBreak(string, i); + } + } + return n; + } + /** + Find the offset that corresponds to the given column position in a + string, taking extending characters and tab size into account. By + default, the string length is returned when it is too short to + reach the column. Pass `strict` true to make it return -1 in that + situation. + */ + function findColumn(string, col, tabSize, strict) { + for (let i = 0, n = 0;;) { + if (n >= col) + return i; + if (i == string.length) + break; + n += string.charCodeAt(i) == 9 ? tabSize - (n % tabSize) : 1; + i = findClusterBreak(string, i); + } + return strict === true ? -1 : string.length; + } + + const C = "\u037c"; + const COUNT = typeof Symbol == "undefined" ? "__" + C : Symbol.for(C); + const SET = typeof Symbol == "undefined" ? "__styleSet" + Math.floor(Math.random() * 1e8) : Symbol("styleSet"); + const top = typeof globalThis != "undefined" ? globalThis : typeof window != "undefined" ? window : {}; + + // :: - Style modules encapsulate a set of CSS rules defined from + // JavaScript. Their definitions are only available in a given DOM + // root after it has been _mounted_ there with `StyleModule.mount`. + // + // Style modules should be created once and stored somewhere, as + // opposed to re-creating them every time you need them. The amount of + // CSS rules generated for a given DOM root is bounded by the amount + // of style modules that were used. So to avoid leaking rules, don't + // create these dynamically, but treat them as one-time allocations. + class StyleModule { + // :: (Object + +

Using a system font

+

Here we use origin 0 (and we can omit it).

+

fFamily needs to be an available font family.

+ + + + + + + +
JSONLottie Output
+
{
+    "fFamily": "monospace",
+    "fName": "MyFont",
+    "fStyle": "Regular"
+}
+
+

+

+

+
+
+
+
+ +
+

+
CSSOutput
+ + +
{
+    font-family: monospace;
+}
+
+ + +
+
Hello
+
+

Font from CSS URL

+

Here we use origin 1.

+ + + + + + + +
JSONLottie Output
+
{
+    "fPath": "https://fonts.googleapis.com/css2?family=Montserrat:wght@800&display=swap",
+    "fFamily": "Poppins",
+    "fStyle": "Bold",
+    "fName": "Poppins Bold",
+    "origin": 1
+}
+
+

+

+

+
+
+
+
+ +
+

+
CSSOutput
+ + +
 @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@700&display=swap');
+
+ + +or + + +
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@700&amp;display=swap" rel="stylesheet">
+
+ + +
+
Hello
+
+

Font from URL

+

Here we use origin 3.

+ + + + + + + +
JSONLottie Output
+
{
+    "fPath": "https://fonts.gstatic.com/s/ubuntu/v15/4iCp6KVjbNBYlgoKejZftWyI.ttf",
+    "fFamily": "Ubuntu",
+    "fStyle": "Light Italic",
+    "fName": "Ubuntu Light Italic",
+    "origin": 3
+}
+
+

+

+

+
+
+
+
+ +
+

+
CSSOutput
+ + +
@font-face {
+  font-family: 'Ubuntu';
+  font-style: italic;
+  font-weight: 300;
+  font-display: swap;
+  src: url(https://fonts.gstatic.com/s/ubuntu/v15/4iCp6KVjbNBYlgoKejZftWyI.ttf) format('truetype');
+}
+
+ + +
+
Hello
+
+

Character Data

+

You can also have font data directly into the lottie, this is done by having an +array of character data objects in the chars attribute of the animation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
dataCharacter Shape or Character Precomp +

Defines how the character is defined

+
chstring +

Character

+
fFamilystring +

Font Family

+
sizenumber +

Font Size

+
stylestring +

Font Style

+
wnumber +

Width

+
+
+

Character Shapes

+

Defines a character as shapes

+
+ + + + + + + + + + + + + + + +
AttributeTypeDescription
shapesShape List +

Shapes forming the character

+
+
+

Character Precomp

+

Defines a character as a precomp layer

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
refIdstring +

ID of the precomp as specified in the assets

+
ksTransform +

Layer transform

+
ipnumber +

Frame when the layer becomes visible

+
opnumber +

Frame when the layer becomes invisible

+
srnumber +

Time Stretch

+
stnumber +

Start Time

+
+
+

Text Layer

+

The text layer has an attribute called t containing a Text Animator Data object.

+

Text Data

+

Contains all the text data and animation

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
aarray of Text Range +

Ranges

+
dAnimated Text Document +

Document

+
mText Alignment Options +

Alignment

+
pText Follow Path +

Follow Path

+
+
+

Animated Text Document

+

This object is similar to an animated property for text.

+

The main difference is that it's always treated as animated (ie: you must use keyframes).

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
karray of Text Document Keyframe +

Array of keyframes

+
xstring +

Expression

+
sidstring +

One of the ID in the file's slots

+
+
+

Text Document Keyframe

+

This is similar to the keyframe object used by animated properties, +but it doesn't have any attribute specifying interpolation as text is always animated in discrete steps.

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
sText Document +

Start

+
tnumber +

Time

+
+
+

Text Document

+

This is where the actual text data is stored.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
fstring +

Font Family

+
fcColor +

Fill Color

+
scColor +

Stroke Color

+
swnumber +

Stroke Width

+
ofboolean +

Render stroke above the fill

+
snumber +

Font Size

+
lhnumber +

Distance between lines on multiline or wrapped text

+
szarray of number +

Size of the box containing the text

+
psarray of number +

Position of the box containing the text

+
tstring +

Text, note that newlines are encoded with \r

+
jText Justify +

Justify

+
caText Caps +

Text Caps

+
trnumber +

Text Tracking

+
lsnumber +

Baseline Shift

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0
0
0
0
0
0
0
5
80
100
+
+
+
+
+ + +
+

Text Alignment Options

+

Used to change the origin point for transformations, such as Rotation, that may be applied to the text string. The origin point for each character, word, or line can be changed.

+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
aAnimated Vector +

Group alignment

+
gText Grouping +

Anchor point grouping

+
+
+

Text Follow Path

+

Uses the path described by a layer mask to put the text on said path.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
minteger +

Index of the mask to use

+
fAnimated number +

First Margin

+
lAnimated number +

Last Margin

+
rAnimated number +

Reverse Path

+
aAnimated number +

Force Alignment

+
pAnimated number +

Perpendicular To Path

+
+
+

Text Range

+

Range of text with custom animations and style

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
nmstring +

Name

+
sText Range Selector +

Selector

+
aText Style +

Style

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
Selector
60
75
0
0
0
Transform
0
0
0
100
Style
0
0
0
0
0
+
+
+
+
+ + +
+

Text Range Selector

+

Defines the range of characters to apply a property value only to +a specific subset of the text document.

+

r Defines whether the values are defined as a percentage or indices.

+

The range is defined by s, e, and o.

+

ne and xe define what happes to text that is only partly inside the selected range.

+

b changes whether selection is done on per character basis, per word, etc. +It also changes the meaning of an index when r is set to Indices.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
t0-1 integer +

Expressible

+
xeAnimated number +

Max Ease

+
neAnimated number +

Min Ease

+
aAnimated number +

Max Amount

+
bText Based +

Based On

+
rn0-1 integer +

Randomize

+
shText Shape +

Shape

+
oAnimated number +

Offset

+
rText Range Units +

Range Units

+
smAnimated number +

Selector Smoothness

+
sAnimated number +

Start

+
eAnimated number +

End

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
60
75
0
0
0
+
+
+
+
+ + +
+

Text Style

+

Has the properties of a transform and the style options of a text document.

+

It applies such transform and style to the part of the text defined +by the text selector property

+
+

Also has the attributes from Transform.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
swAnimated number +

Stroke Width

+
scAnimated Color +

Stroke Color

+
shAnimated number +

Stroke Hue

+
ssAnimated number +

Stroke Saturation

+
sbAnimated number +

Stroke Brightness

+
soAnimated number +

Stroke Opacity

+
fcAnimated Color +

Fill Color

+
fhAnimated number +

Fill Hue

+
fsAnimated number +

Fill Saturation

+
fbAnimated number +

Fill Brightness

+
foAnimated number +

Fill Opacity

+
tAnimated number +

Letter Spacing

+
blAnimated number +

Blur

+
lsAnimated number +

Line Spacing

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Transform
0
0
0
100
Style
0
0
0
0
0
+
+
+
+
+ + +
+ + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + +